]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Update to iD v2.4.2
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2 var version = "4.11.0";
3
4 var d3_ascending = function(a, b) {
5   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6 };
7
8 var d3_bisector = function(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 d3_ascending(f(d), x);
37   };
38 }
39
40 var ascendingBisect = d3_bisector(d3_ascending);
41 var bisectRight = ascendingBisect.right;
42 var bisectLeft = ascendingBisect.left;
43
44 var pairs = function(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 var cross = function(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 var d3_descending = function(a, b) {
76   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
77 };
78
79 var number = function(x) {
80   return x === null ? NaN : +x;
81 };
82
83 var variance = function(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 var deviation = function(array, f) {
116   var v = variance(array, f);
117   return v ? Math.sqrt(v) : v;
118 };
119
120 var extent = function(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 var constant = function(x) {
164   return function() {
165     return x;
166   };
167 };
168
169 var identity = function(x) {
170   return x;
171 };
172
173 var d3_range = function(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 var e5 = Math.sqrt(10);
189 var e2 = Math.sqrt(2);
190
191 var ticks = function(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 var sturges = function(values) {
240   return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
241 };
242
243 var histogram = function() {
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 = d3_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 var threshold = function(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 var freedmanDiaconis = function(values, min, max) {
324   values = map.call(values, number).sort(d3_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 var scott = function(values, min, max) {
329   return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
330 };
331
332 var max = function(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 var mean = function(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 var d3_median = function(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(d3_ascending), 0.5);
414 };
415
416 var merge = function(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 var min = function(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 var permute = function(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 var scan = function(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 = d3_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 var shuffle = function(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 var sum = function(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 var transpose = function(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 var zip = function() {
549   return transpose(arguments);
550 };
551
552 var slice$1 = Array.prototype.slice;
553
554 var identity$1 = function(x) {
555   return x;
556 };
557
558 var top = 1;
559 var right = 2;
560 var bottom = 3;
561 var left = 4;
562 var 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 var namespace = function(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 var creator = function(name) {
846   var fullname = namespace(name);
847   return (fullname.local
848       ? creatorFixed
849       : creatorInherit)(fullname);
850 };
851
852 var nextId = 0;
853
854 function local$1() {
855   return new Local;
856 }
857
858 function Local() {
859   this._ = "@" + (++nextId).toString(36);
860 }
861
862 Local.prototype = local$1.prototype = {
863   constructor: Local,
864   get: function(node) {
865     var id = this._;
866     while (!(id in node)) if (!(node = node.parentNode)) return;
867     return node[id];
868   },
869   set: function(node, value) {
870     return node[this._] = value;
871   },
872   remove: function(node) {
873     return this._ in node && delete node[this._];
874   },
875   toString: function() {
876     return this._;
877   }
878 };
879
880 var matcher = function(selector) {
881   return function() {
882     return this.matches(selector);
883   };
884 };
885
886 if (typeof document !== "undefined") {
887   var element = document.documentElement;
888   if (!element.matches) {
889     var vendorMatches = element.webkitMatchesSelector
890         || element.msMatchesSelector
891         || element.mozMatchesSelector
892         || element.oMatchesSelector;
893     matcher = function(selector) {
894       return function() {
895         return vendorMatches.call(this, selector);
896       };
897     };
898   }
899 }
900
901 var matcher$1 = matcher;
902
903 var filterEvents = {};
904
905 var event = null;
906
907 if (typeof document !== "undefined") {
908   var element$1 = document.documentElement;
909   if (!("onmouseenter" in element$1)) {
910     filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
911   }
912 }
913
914 function filterContextListener(listener, index, group) {
915   listener = contextListener(listener, index, group);
916   return function(event) {
917     var related = event.relatedTarget;
918     if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
919       listener.call(this, event);
920     }
921   };
922 }
923
924 function contextListener(listener, index, group) {
925   return function(event1) {
926     var event0 = event; // Events can be reentrant (e.g., focus).
927     event = event1;
928     try {
929       listener.call(this, this.__data__, index, group);
930     } finally {
931       event = event0;
932     }
933   };
934 }
935
936 function parseTypenames$1(typenames) {
937   return typenames.trim().split(/^|\s+/).map(function(t) {
938     var name = "", i = t.indexOf(".");
939     if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
940     return {type: t, name: name};
941   });
942 }
943
944 function onRemove(typename) {
945   return function() {
946     var on = this.__on;
947     if (!on) return;
948     for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
949       if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
950         this.removeEventListener(o.type, o.listener, o.capture);
951       } else {
952         on[++i] = o;
953       }
954     }
955     if (++i) on.length = i;
956     else delete this.__on;
957   };
958 }
959
960 function onAdd(typename, value, capture) {
961   var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
962   return function(d, i, group) {
963     var on = this.__on, o, listener = wrap(value, i, group);
964     if (on) for (var j = 0, m = on.length; j < m; ++j) {
965       if ((o = on[j]).type === typename.type && o.name === typename.name) {
966         this.removeEventListener(o.type, o.listener, o.capture);
967         this.addEventListener(o.type, o.listener = listener, o.capture = capture);
968         o.value = value;
969         return;
970       }
971     }
972     this.addEventListener(typename.type, listener, capture);
973     o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
974     if (!on) this.__on = [o];
975     else on.push(o);
976   };
977 }
978
979 var selection_on = function(typename, value, capture) {
980   var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
981
982   if (arguments.length < 2) {
983     var on = this.node().__on;
984     if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
985       for (i = 0, o = on[j]; i < n; ++i) {
986         if ((t = typenames[i]).type === o.type && t.name === o.name) {
987           return o.value;
988         }
989       }
990     }
991     return;
992   }
993
994   on = value ? onAdd : onRemove;
995   if (capture == null) capture = false;
996   for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
997   return this;
998 };
999
1000 function customEvent(event1, listener, that, args) {
1001   var event0 = event;
1002   event1.sourceEvent = event;
1003   event = event1;
1004   try {
1005     return listener.apply(that, args);
1006   } finally {
1007     event = event0;
1008   }
1009 }
1010
1011 var sourceEvent = function() {
1012   var current = event, source;
1013   while (source = current.sourceEvent) current = source;
1014   return current;
1015 };
1016
1017 var point = function(node, event) {
1018   var svg = node.ownerSVGElement || node;
1019
1020   if (svg.createSVGPoint) {
1021     var point = svg.createSVGPoint();
1022     point.x = event.clientX, point.y = event.clientY;
1023     point = point.matrixTransform(node.getScreenCTM().inverse());
1024     return [point.x, point.y];
1025   }
1026
1027   var rect = node.getBoundingClientRect();
1028   return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1029 };
1030
1031 var d3_mouse = function(node) {
1032   var event = sourceEvent();
1033   if (event.changedTouches) event = event.changedTouches[0];
1034   return point(node, event);
1035 };
1036
1037 function none() {}
1038
1039 var selector = function(selector) {
1040   return selector == null ? none : function() {
1041     return this.querySelector(selector);
1042   };
1043 };
1044
1045 var selection_select = function(select) {
1046   if (typeof select !== "function") select = selector(select);
1047
1048   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
1049     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
1050       if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
1051         if ("__data__" in node) subnode.__data__ = node.__data__;
1052         subgroup[i] = subnode;
1053       }
1054     }
1055   }
1056
1057   return new Selection(subgroups, this._parents);
1058 };
1059
1060 function empty$1() {
1061   return [];
1062 }
1063
1064 var selectorAll = function(selector) {
1065   return selector == null ? empty$1 : function() {
1066     return this.querySelectorAll(selector);
1067   };
1068 };
1069
1070 var selection_selectAll = function(select) {
1071   if (typeof select !== "function") select = selectorAll(select);
1072
1073   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
1074     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
1075       if (node = group[i]) {
1076         subgroups.push(select.call(node, node.__data__, i, group));
1077         parents.push(node);
1078       }
1079     }
1080   }
1081
1082   return new Selection(subgroups, parents);
1083 };
1084
1085 var selection_filter = function(match) {
1086   if (typeof match !== "function") match = matcher$1(match);
1087
1088   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
1089     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
1090       if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
1091         subgroup.push(node);
1092       }
1093     }
1094   }
1095
1096   return new Selection(subgroups, this._parents);
1097 };
1098
1099 var sparse = function(update) {
1100   return new Array(update.length);
1101 };
1102
1103 var selection_enter = function() {
1104   return new Selection(this._enter || this._groups.map(sparse), this._parents);
1105 };
1106
1107 function EnterNode(parent, datum) {
1108   this.ownerDocument = parent.ownerDocument;
1109   this.namespaceURI = parent.namespaceURI;
1110   this._next = null;
1111   this._parent = parent;
1112   this.__data__ = datum;
1113 }
1114
1115 EnterNode.prototype = {
1116   constructor: EnterNode,
1117   appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
1118   insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
1119   querySelector: function(selector) { return this._parent.querySelector(selector); },
1120   querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
1121 };
1122
1123 var constant$1 = function(x) {
1124   return function() {
1125     return x;
1126   };
1127 };
1128
1129 var keyPrefix = "$"; // Protect against keys like “__proto__”.
1130
1131 function bindIndex(parent, group, enter, update, exit, data) {
1132   var i = 0,
1133       node,
1134       groupLength = group.length,
1135       dataLength = data.length;
1136
1137   // Put any non-null nodes that fit into update.
1138   // Put any null nodes into enter.
1139   // Put any remaining data into enter.
1140   for (; i < dataLength; ++i) {
1141     if (node = group[i]) {
1142       node.__data__ = data[i];
1143       update[i] = node;
1144     } else {
1145       enter[i] = new EnterNode(parent, data[i]);
1146     }
1147   }
1148
1149   // Put any non-null nodes that don’t fit into exit.
1150   for (; i < groupLength; ++i) {
1151     if (node = group[i]) {
1152       exit[i] = node;
1153     }
1154   }
1155 }
1156
1157 function bindKey(parent, group, enter, update, exit, data, key) {
1158   var i,
1159       node,
1160       nodeByKeyValue = {},
1161       groupLength = group.length,
1162       dataLength = data.length,
1163       keyValues = new Array(groupLength),
1164       keyValue;
1165
1166   // Compute the key for each node.
1167   // If multiple nodes have the same key, the duplicates are added to exit.
1168   for (i = 0; i < groupLength; ++i) {
1169     if (node = group[i]) {
1170       keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1171       if (keyValue in nodeByKeyValue) {
1172         exit[i] = node;
1173       } else {
1174         nodeByKeyValue[keyValue] = node;
1175       }
1176     }
1177   }
1178
1179   // Compute the key for each datum.
1180   // If there a node associated with this key, join and add it to update.
1181   // If there is not (or the key is a duplicate), add it to enter.
1182   for (i = 0; i < dataLength; ++i) {
1183     keyValue = keyPrefix + key.call(parent, data[i], i, data);
1184     if (node = nodeByKeyValue[keyValue]) {
1185       update[i] = node;
1186       node.__data__ = data[i];
1187       nodeByKeyValue[keyValue] = null;
1188     } else {
1189       enter[i] = new EnterNode(parent, data[i]);
1190     }
1191   }
1192
1193   // Add any remaining nodes that were not bound to data to exit.
1194   for (i = 0; i < groupLength; ++i) {
1195     if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1196       exit[i] = node;
1197     }
1198   }
1199 }
1200
1201 var selection_data = function(value, key) {
1202   if (!value) {
1203     data = new Array(this.size()), j = -1;
1204     this.each(function(d) { data[++j] = d; });
1205     return data;
1206   }
1207
1208   var bind = key ? bindKey : bindIndex,
1209       parents = this._parents,
1210       groups = this._groups;
1211
1212   if (typeof value !== "function") value = constant$1(value);
1213
1214   for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1215     var parent = parents[j],
1216         group = groups[j],
1217         groupLength = group.length,
1218         data = value.call(parent, parent && parent.__data__, j, parents),
1219         dataLength = data.length,
1220         enterGroup = enter[j] = new Array(dataLength),
1221         updateGroup = update[j] = new Array(dataLength),
1222         exitGroup = exit[j] = new Array(groupLength);
1223
1224     bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1225
1226     // Now connect the enter nodes to their following update node, such that
1227     // appendChild can insert the materialized enter node before this node,
1228     // rather than at the end of the parent node.
1229     for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1230       if (previous = enterGroup[i0]) {
1231         if (i0 >= i1) i1 = i0 + 1;
1232         while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1233         previous._next = next || null;
1234       }
1235     }
1236   }
1237
1238   update = new Selection(update, parents);
1239   update._enter = enter;
1240   update._exit = exit;
1241   return update;
1242 };
1243
1244 var selection_exit = function() {
1245   return new Selection(this._exit || this._groups.map(sparse), this._parents);
1246 };
1247
1248 var selection_merge = function(selection$$1) {
1249
1250   for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
1251     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1252       if (node = group0[i] || group1[i]) {
1253         merge[i] = node;
1254       }
1255     }
1256   }
1257
1258   for (; j < m0; ++j) {
1259     merges[j] = groups0[j];
1260   }
1261
1262   return new Selection(merges, this._parents);
1263 };
1264
1265 var selection_order = function() {
1266
1267   for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1268     for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1269       if (node = group[i]) {
1270         if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1271         next = node;
1272       }
1273     }
1274   }
1275
1276   return this;
1277 };
1278
1279 var selection_sort = function(compare) {
1280   if (!compare) compare = ascending;
1281
1282   function compareNode(a, b) {
1283     return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1284   }
1285
1286   for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1287     for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1288       if (node = group[i]) {
1289         sortgroup[i] = node;
1290       }
1291     }
1292     sortgroup.sort(compareNode);
1293   }
1294
1295   return new Selection(sortgroups, this._parents).order();
1296 };
1297
1298 function ascending(a, b) {
1299   return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1300 }
1301
1302 var selection_call = function() {
1303   var callback = arguments[0];
1304   arguments[0] = this;
1305   callback.apply(null, arguments);
1306   return this;
1307 };
1308
1309 var selection_nodes = function() {
1310   var nodes = new Array(this.size()), i = -1;
1311   this.each(function() { nodes[++i] = this; });
1312   return nodes;
1313 };
1314
1315 var selection_node = function() {
1316
1317   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1318     for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1319       var node = group[i];
1320       if (node) return node;
1321     }
1322   }
1323
1324   return null;
1325 };
1326
1327 var selection_size = function() {
1328   var size = 0;
1329   this.each(function() { ++size; });
1330   return size;
1331 };
1332
1333 var selection_empty = function() {
1334   return !this.node();
1335 };
1336
1337 var selection_each = function(callback) {
1338
1339   for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1340     for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1341       if (node = group[i]) callback.call(node, node.__data__, i, group);
1342     }
1343   }
1344
1345   return this;
1346 };
1347
1348 function attrRemove(name) {
1349   return function() {
1350     this.removeAttribute(name);
1351   };
1352 }
1353
1354 function attrRemoveNS(fullname) {
1355   return function() {
1356     this.removeAttributeNS(fullname.space, fullname.local);
1357   };
1358 }
1359
1360 function attrConstant(name, value) {
1361   return function() {
1362     this.setAttribute(name, value);
1363   };
1364 }
1365
1366 function attrConstantNS(fullname, value) {
1367   return function() {
1368     this.setAttributeNS(fullname.space, fullname.local, value);
1369   };
1370 }
1371
1372 function attrFunction(name, value) {
1373   return function() {
1374     var v = value.apply(this, arguments);
1375     if (v == null) this.removeAttribute(name);
1376     else this.setAttribute(name, v);
1377   };
1378 }
1379
1380 function attrFunctionNS(fullname, value) {
1381   return function() {
1382     var v = value.apply(this, arguments);
1383     if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1384     else this.setAttributeNS(fullname.space, fullname.local, v);
1385   };
1386 }
1387
1388 var selection_attr = function(name, value) {
1389   var fullname = namespace(name);
1390
1391   if (arguments.length < 2) {
1392     var node = this.node();
1393     return fullname.local
1394         ? node.getAttributeNS(fullname.space, fullname.local)
1395         : node.getAttribute(fullname);
1396   }
1397
1398   return this.each((value == null
1399       ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1400       ? (fullname.local ? attrFunctionNS : attrFunction)
1401       : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1402 };
1403
1404 var defaultView = function(node) {
1405   return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1406       || (node.document && node) // node is a Window
1407       || node.defaultView; // node is a Document
1408 };
1409
1410 function styleRemove(name) {
1411   return function() {
1412     this.style.removeProperty(name);
1413   };
1414 }
1415
1416 function styleConstant(name, value, priority) {
1417   return function() {
1418     this.style.setProperty(name, value, priority);
1419   };
1420 }
1421
1422 function styleFunction(name, value, priority) {
1423   return function() {
1424     var v = value.apply(this, arguments);
1425     if (v == null) this.style.removeProperty(name);
1426     else this.style.setProperty(name, v, priority);
1427   };
1428 }
1429
1430 var selection_style = function(name, value, priority) {
1431   return arguments.length > 1
1432       ? this.each((value == null
1433             ? styleRemove : typeof value === "function"
1434             ? styleFunction
1435             : styleConstant)(name, value, priority == null ? "" : priority))
1436       : styleValue(this.node(), name);
1437 };
1438
1439 function styleValue(node, name) {
1440   return node.style.getPropertyValue(name)
1441       || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1442 }
1443
1444 function propertyRemove(name) {
1445   return function() {
1446     delete this[name];
1447   };
1448 }
1449
1450 function propertyConstant(name, value) {
1451   return function() {
1452     this[name] = value;
1453   };
1454 }
1455
1456 function propertyFunction(name, value) {
1457   return function() {
1458     var v = value.apply(this, arguments);
1459     if (v == null) delete this[name];
1460     else this[name] = v;
1461   };
1462 }
1463
1464 var selection_property = function(name, value) {
1465   return arguments.length > 1
1466       ? this.each((value == null
1467           ? propertyRemove : typeof value === "function"
1468           ? propertyFunction
1469           : propertyConstant)(name, value))
1470       : this.node()[name];
1471 };
1472
1473 function classArray(string) {
1474   return string.trim().split(/^|\s+/);
1475 }
1476
1477 function classList(node) {
1478   return node.classList || new ClassList(node);
1479 }
1480
1481 function ClassList(node) {
1482   this._node = node;
1483   this._names = classArray(node.getAttribute("class") || "");
1484 }
1485
1486 ClassList.prototype = {
1487   add: function(name) {
1488     var i = this._names.indexOf(name);
1489     if (i < 0) {
1490       this._names.push(name);
1491       this._node.setAttribute("class", this._names.join(" "));
1492     }
1493   },
1494   remove: function(name) {
1495     var i = this._names.indexOf(name);
1496     if (i >= 0) {
1497       this._names.splice(i, 1);
1498       this._node.setAttribute("class", this._names.join(" "));
1499     }
1500   },
1501   contains: function(name) {
1502     return this._names.indexOf(name) >= 0;
1503   }
1504 };
1505
1506 function classedAdd(node, names) {
1507   var list = classList(node), i = -1, n = names.length;
1508   while (++i < n) list.add(names[i]);
1509 }
1510
1511 function classedRemove(node, names) {
1512   var list = classList(node), i = -1, n = names.length;
1513   while (++i < n) list.remove(names[i]);
1514 }
1515
1516 function classedTrue(names) {
1517   return function() {
1518     classedAdd(this, names);
1519   };
1520 }
1521
1522 function classedFalse(names) {
1523   return function() {
1524     classedRemove(this, names);
1525   };
1526 }
1527
1528 function classedFunction(names, value) {
1529   return function() {
1530     (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1531   };
1532 }
1533
1534 var selection_classed = function(name, value) {
1535   var names = classArray(name + "");
1536
1537   if (arguments.length < 2) {
1538     var list = classList(this.node()), i = -1, n = names.length;
1539     while (++i < n) if (!list.contains(names[i])) return false;
1540     return true;
1541   }
1542
1543   return this.each((typeof value === "function"
1544       ? classedFunction : value
1545       ? classedTrue
1546       : classedFalse)(names, value));
1547 };
1548
1549 function textRemove() {
1550   this.textContent = "";
1551 }
1552
1553 function textConstant(value) {
1554   return function() {
1555     this.textContent = value;
1556   };
1557 }
1558
1559 function textFunction(value) {
1560   return function() {
1561     var v = value.apply(this, arguments);
1562     this.textContent = v == null ? "" : v;
1563   };
1564 }
1565
1566 var selection_text = function(value) {
1567   return arguments.length
1568       ? this.each(value == null
1569           ? textRemove : (typeof value === "function"
1570           ? textFunction
1571           : textConstant)(value))
1572       : this.node().textContent;
1573 };
1574
1575 function htmlRemove() {
1576   this.innerHTML = "";
1577 }
1578
1579 function htmlConstant(value) {
1580   return function() {
1581     this.innerHTML = value;
1582   };
1583 }
1584
1585 function htmlFunction(value) {
1586   return function() {
1587     var v = value.apply(this, arguments);
1588     this.innerHTML = v == null ? "" : v;
1589   };
1590 }
1591
1592 var selection_html = function(value) {
1593   return arguments.length
1594       ? this.each(value == null
1595           ? htmlRemove : (typeof value === "function"
1596           ? htmlFunction
1597           : htmlConstant)(value))
1598       : this.node().innerHTML;
1599 };
1600
1601 function raise() {
1602   if (this.nextSibling) this.parentNode.appendChild(this);
1603 }
1604
1605 var selection_raise = function() {
1606   return this.each(raise);
1607 };
1608
1609 function lower() {
1610   if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1611 }
1612
1613 var selection_lower = function() {
1614   return this.each(lower);
1615 };
1616
1617 var selection_append = function(name) {
1618   var create = typeof name === "function" ? name : creator(name);
1619   return this.select(function() {
1620     return this.appendChild(create.apply(this, arguments));
1621   });
1622 };
1623
1624 function constantNull() {
1625   return null;
1626 }
1627
1628 var selection_insert = function(name, before) {
1629   var create = typeof name === "function" ? name : creator(name),
1630       select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1631   return this.select(function() {
1632     return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1633   });
1634 };
1635
1636 function remove() {
1637   var parent = this.parentNode;
1638   if (parent) parent.removeChild(this);
1639 }
1640
1641 var selection_remove = function() {
1642   return this.each(remove);
1643 };
1644
1645 var selection_datum = function(value) {
1646   return arguments.length
1647       ? this.property("__data__", value)
1648       : this.node().__data__;
1649 };
1650
1651 function dispatchEvent(node, type, params) {
1652   var window = defaultView(node),
1653       event = window.CustomEvent;
1654
1655   if (typeof event === "function") {
1656     event = new event(type, params);
1657   } else {
1658     event = window.document.createEvent("Event");
1659     if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1660     else event.initEvent(type, false, false);
1661   }
1662
1663   node.dispatchEvent(event);
1664 }
1665
1666 function dispatchConstant(type, params) {
1667   return function() {
1668     return dispatchEvent(this, type, params);
1669   };
1670 }
1671
1672 function dispatchFunction(type, params) {
1673   return function() {
1674     return dispatchEvent(this, type, params.apply(this, arguments));
1675   };
1676 }
1677
1678 var selection_dispatch = function(type, params) {
1679   return this.each((typeof params === "function"
1680       ? dispatchFunction
1681       : dispatchConstant)(type, params));
1682 };
1683
1684 var root = [null];
1685
1686 function Selection(groups, parents) {
1687   this._groups = groups;
1688   this._parents = parents;
1689 }
1690
1691 function selection() {
1692   return new Selection([[document.documentElement]], root);
1693 }
1694
1695 Selection.prototype = selection.prototype = {
1696   constructor: Selection,
1697   select: selection_select,
1698   selectAll: selection_selectAll,
1699   filter: selection_filter,
1700   data: selection_data,
1701   enter: selection_enter,
1702   exit: selection_exit,
1703   merge: selection_merge,
1704   order: selection_order,
1705   sort: selection_sort,
1706   call: selection_call,
1707   nodes: selection_nodes,
1708   node: selection_node,
1709   size: selection_size,
1710   empty: selection_empty,
1711   each: selection_each,
1712   attr: selection_attr,
1713   style: selection_style,
1714   property: selection_property,
1715   classed: selection_classed,
1716   text: selection_text,
1717   html: selection_html,
1718   raise: selection_raise,
1719   lower: selection_lower,
1720   append: selection_append,
1721   insert: selection_insert,
1722   remove: selection_remove,
1723   datum: selection_datum,
1724   on: selection_on,
1725   dispatch: selection_dispatch
1726 };
1727
1728 var d3_select = function(selector) {
1729   return typeof selector === "string"
1730       ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1731       : new Selection([[selector]], root);
1732 };
1733
1734 var d3_selectAll = function(selector) {
1735   return typeof selector === "string"
1736       ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1737       : new Selection([selector == null ? [] : selector], root);
1738 };
1739
1740 var touch = function(node, touches, identifier) {
1741   if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1742
1743   for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1744     if ((touch = touches[i]).identifier === identifier) {
1745       return point(node, touch);
1746     }
1747   }
1748
1749   return null;
1750 };
1751
1752 var d3_touches = function(node, touches) {
1753   if (touches == null) touches = sourceEvent().touches;
1754
1755   for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1756     points[i] = point(node, touches[i]);
1757   }
1758
1759   return points;
1760 };
1761
1762 function nopropagation() {
1763   event.stopImmediatePropagation();
1764 }
1765
1766 var noevent = function() {
1767   event.preventDefault();
1768   event.stopImmediatePropagation();
1769 };
1770
1771 var dragDisable = function(view) {
1772   var root = view.document.documentElement,
1773       selection$$1 = d3_select(view).on("dragstart.drag", noevent, true);
1774   if ("onselectstart" in root) {
1775     selection$$1.on("selectstart.drag", noevent, true);
1776   } else {
1777     root.__noselect = root.style.MozUserSelect;
1778     root.style.MozUserSelect = "none";
1779   }
1780 };
1781
1782 function yesdrag(view, noclick) {
1783   var root = view.document.documentElement,
1784       selection$$1 = d3_select(view).on("dragstart.drag", null);
1785   if (noclick) {
1786     selection$$1.on("click.drag", noevent, true);
1787     setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1788   }
1789   if ("onselectstart" in root) {
1790     selection$$1.on("selectstart.drag", null);
1791   } else {
1792     root.style.MozUserSelect = root.__noselect;
1793     delete root.__noselect;
1794   }
1795 }
1796
1797 var constant$2 = function(x) {
1798   return function() {
1799     return x;
1800   };
1801 };
1802
1803 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1804   this.target = target;
1805   this.type = type;
1806   this.subject = subject;
1807   this.identifier = id;
1808   this.active = active;
1809   this.x = x;
1810   this.y = y;
1811   this.dx = dx;
1812   this.dy = dy;
1813   this._ = dispatch;
1814 }
1815
1816 DragEvent.prototype.on = function() {
1817   var value = this._.on.apply(this._, arguments);
1818   return value === this._ ? this : value;
1819 };
1820
1821 // Ignore right-click, since that should open the context menu.
1822 function defaultFilter$1() {
1823   return !event.button;
1824 }
1825
1826 function defaultContainer() {
1827   return this.parentNode;
1828 }
1829
1830 function defaultSubject(d) {
1831   return d == null ? {x: event.x, y: event.y} : d;
1832 }
1833
1834 function defaultTouchable() {
1835   return "ontouchstart" in this;
1836 }
1837
1838 var drag = function() {
1839   var filter = defaultFilter$1,
1840       container = defaultContainer,
1841       subject = defaultSubject,
1842       touchable = defaultTouchable,
1843       gestures = {},
1844       listeners = dispatch("start", "drag", "end"),
1845       active = 0,
1846       mousedownx,
1847       mousedowny,
1848       mousemoving,
1849       touchending,
1850       clickDistance2 = 0;
1851
1852   function drag(selection) {
1853     selection
1854         .on("mousedown.drag", mousedowned)
1855       .filter(touchable)
1856         .on("touchstart.drag", touchstarted)
1857         .on("touchmove.drag", touchmoved)
1858         .on("touchend.drag touchcancel.drag", touchended)
1859         .style("touch-action", "none")
1860         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1861   }
1862
1863   function mousedowned() {
1864     if (touchending || !filter.apply(this, arguments)) return;
1865     var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
1866     if (!gesture) return;
1867     d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1868     dragDisable(event.view);
1869     nopropagation();
1870     mousemoving = false;
1871     mousedownx = event.clientX;
1872     mousedowny = event.clientY;
1873     gesture("start");
1874   }
1875
1876   function mousemoved() {
1877     noevent();
1878     if (!mousemoving) {
1879       var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1880       mousemoving = dx * dx + dy * dy > clickDistance2;
1881     }
1882     gestures.mouse("drag");
1883   }
1884
1885   function mouseupped() {
1886     d3_select(event.view).on("mousemove.drag mouseup.drag", null);
1887     yesdrag(event.view, mousemoving);
1888     noevent();
1889     gestures.mouse("end");
1890   }
1891
1892   function touchstarted() {
1893     if (!filter.apply(this, arguments)) return;
1894     var touches = event.changedTouches,
1895         c = container.apply(this, arguments),
1896         n = touches.length, i, gesture;
1897
1898     for (i = 0; i < n; ++i) {
1899       if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1900         nopropagation();
1901         gesture("start");
1902       }
1903     }
1904   }
1905
1906   function touchmoved() {
1907     var touches = event.changedTouches,
1908         n = touches.length, i, gesture;
1909
1910     for (i = 0; i < n; ++i) {
1911       if (gesture = gestures[touches[i].identifier]) {
1912         noevent();
1913         gesture("drag");
1914       }
1915     }
1916   }
1917
1918   function touchended() {
1919     var touches = event.changedTouches,
1920         n = touches.length, i, gesture;
1921
1922     if (touchending) clearTimeout(touchending);
1923     touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1924     for (i = 0; i < n; ++i) {
1925       if (gesture = gestures[touches[i].identifier]) {
1926         nopropagation();
1927         gesture("end");
1928       }
1929     }
1930   }
1931
1932   function beforestart(id, container, point, that, args) {
1933     var p = point(container, id), s, dx, dy,
1934         sublisteners = listeners.copy();
1935
1936     if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1937       if ((event.subject = s = subject.apply(that, args)) == null) return false;
1938       dx = s.x - p[0] || 0;
1939       dy = s.y - p[1] || 0;
1940       return true;
1941     })) return;
1942
1943     return function gesture(type) {
1944       var p0 = p, n;
1945       switch (type) {
1946         case "start": gestures[id] = gesture, n = active++; break;
1947         case "end": delete gestures[id], --active; // nobreak
1948         case "drag": p = point(container, id), n = active; break;
1949       }
1950       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]);
1951     };
1952   }
1953
1954   drag.filter = function(_) {
1955     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1956   };
1957
1958   drag.container = function(_) {
1959     return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1960   };
1961
1962   drag.subject = function(_) {
1963     return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1964   };
1965
1966   drag.touchable = function(_) {
1967     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1968   };
1969
1970   drag.on = function() {
1971     var value = listeners.on.apply(listeners, arguments);
1972     return value === listeners ? drag : value;
1973   };
1974
1975   drag.clickDistance = function(_) {
1976     return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1977   };
1978
1979   return drag;
1980 };
1981
1982 var define = function(constructor, factory, prototype) {
1983   constructor.prototype = factory.prototype = prototype;
1984   prototype.constructor = constructor;
1985 };
1986
1987 function extend(parent, definition) {
1988   var prototype = Object.create(parent.prototype);
1989   for (var key in definition) prototype[key] = definition[key];
1990   return prototype;
1991 }
1992
1993 function Color() {}
1994
1995 var darker = 0.7;
1996 var brighter = 1 / darker;
1997
1998 var reI = "\\s*([+-]?\\d+)\\s*";
1999 var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*";
2000 var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*";
2001 var reHex3 = /^#([0-9a-f]{3})$/;
2002 var reHex6 = /^#([0-9a-f]{6})$/;
2003 var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$");
2004 var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$");
2005 var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$");
2006 var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$");
2007 var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$");
2008 var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2009
2010 var named = {
2011   aliceblue: 0xf0f8ff,
2012   antiquewhite: 0xfaebd7,
2013   aqua: 0x00ffff,
2014   aquamarine: 0x7fffd4,
2015   azure: 0xf0ffff,
2016   beige: 0xf5f5dc,
2017   bisque: 0xffe4c4,
2018   black: 0x000000,
2019   blanchedalmond: 0xffebcd,
2020   blue: 0x0000ff,
2021   blueviolet: 0x8a2be2,
2022   brown: 0xa52a2a,
2023   burlywood: 0xdeb887,
2024   cadetblue: 0x5f9ea0,
2025   chartreuse: 0x7fff00,
2026   chocolate: 0xd2691e,
2027   coral: 0xff7f50,
2028   cornflowerblue: 0x6495ed,
2029   cornsilk: 0xfff8dc,
2030   crimson: 0xdc143c,
2031   cyan: 0x00ffff,
2032   darkblue: 0x00008b,
2033   darkcyan: 0x008b8b,
2034   darkgoldenrod: 0xb8860b,
2035   darkgray: 0xa9a9a9,
2036   darkgreen: 0x006400,
2037   darkgrey: 0xa9a9a9,
2038   darkkhaki: 0xbdb76b,
2039   darkmagenta: 0x8b008b,
2040   darkolivegreen: 0x556b2f,
2041   darkorange: 0xff8c00,
2042   darkorchid: 0x9932cc,
2043   darkred: 0x8b0000,
2044   darksalmon: 0xe9967a,
2045   darkseagreen: 0x8fbc8f,
2046   darkslateblue: 0x483d8b,
2047   darkslategray: 0x2f4f4f,
2048   darkslategrey: 0x2f4f4f,
2049   darkturquoise: 0x00ced1,
2050   darkviolet: 0x9400d3,
2051   deeppink: 0xff1493,
2052   deepskyblue: 0x00bfff,
2053   dimgray: 0x696969,
2054   dimgrey: 0x696969,
2055   dodgerblue: 0x1e90ff,
2056   firebrick: 0xb22222,
2057   floralwhite: 0xfffaf0,
2058   forestgreen: 0x228b22,
2059   fuchsia: 0xff00ff,
2060   gainsboro: 0xdcdcdc,
2061   ghostwhite: 0xf8f8ff,
2062   gold: 0xffd700,
2063   goldenrod: 0xdaa520,
2064   gray: 0x808080,
2065   green: 0x008000,
2066   greenyellow: 0xadff2f,
2067   grey: 0x808080,
2068   honeydew: 0xf0fff0,
2069   hotpink: 0xff69b4,
2070   indianred: 0xcd5c5c,
2071   indigo: 0x4b0082,
2072   ivory: 0xfffff0,
2073   khaki: 0xf0e68c,
2074   lavender: 0xe6e6fa,
2075   lavenderblush: 0xfff0f5,
2076   lawngreen: 0x7cfc00,
2077   lemonchiffon: 0xfffacd,
2078   lightblue: 0xadd8e6,
2079   lightcoral: 0xf08080,
2080   lightcyan: 0xe0ffff,
2081   lightgoldenrodyellow: 0xfafad2,
2082   lightgray: 0xd3d3d3,
2083   lightgreen: 0x90ee90,
2084   lightgrey: 0xd3d3d3,
2085   lightpink: 0xffb6c1,
2086   lightsalmon: 0xffa07a,
2087   lightseagreen: 0x20b2aa,
2088   lightskyblue: 0x87cefa,
2089   lightslategray: 0x778899,
2090   lightslategrey: 0x778899,
2091   lightsteelblue: 0xb0c4de,
2092   lightyellow: 0xffffe0,
2093   lime: 0x00ff00,
2094   limegreen: 0x32cd32,
2095   linen: 0xfaf0e6,
2096   magenta: 0xff00ff,
2097   maroon: 0x800000,
2098   mediumaquamarine: 0x66cdaa,
2099   mediumblue: 0x0000cd,
2100   mediumorchid: 0xba55d3,
2101   mediumpurple: 0x9370db,
2102   mediumseagreen: 0x3cb371,
2103   mediumslateblue: 0x7b68ee,
2104   mediumspringgreen: 0x00fa9a,
2105   mediumturquoise: 0x48d1cc,
2106   mediumvioletred: 0xc71585,
2107   midnightblue: 0x191970,
2108   mintcream: 0xf5fffa,
2109   mistyrose: 0xffe4e1,
2110   moccasin: 0xffe4b5,
2111   navajowhite: 0xffdead,
2112   navy: 0x000080,
2113   oldlace: 0xfdf5e6,
2114   olive: 0x808000,
2115   olivedrab: 0x6b8e23,
2116   orange: 0xffa500,
2117   orangered: 0xff4500,
2118   orchid: 0xda70d6,
2119   palegoldenrod: 0xeee8aa,
2120   palegreen: 0x98fb98,
2121   paleturquoise: 0xafeeee,
2122   palevioletred: 0xdb7093,
2123   papayawhip: 0xffefd5,
2124   peachpuff: 0xffdab9,
2125   peru: 0xcd853f,
2126   pink: 0xffc0cb,
2127   plum: 0xdda0dd,
2128   powderblue: 0xb0e0e6,
2129   purple: 0x800080,
2130   rebeccapurple: 0x663399,
2131   red: 0xff0000,
2132   rosybrown: 0xbc8f8f,
2133   royalblue: 0x4169e1,
2134   saddlebrown: 0x8b4513,
2135   salmon: 0xfa8072,
2136   sandybrown: 0xf4a460,
2137   seagreen: 0x2e8b57,
2138   seashell: 0xfff5ee,
2139   sienna: 0xa0522d,
2140   silver: 0xc0c0c0,
2141   skyblue: 0x87ceeb,
2142   slateblue: 0x6a5acd,
2143   slategray: 0x708090,
2144   slategrey: 0x708090,
2145   snow: 0xfffafa,
2146   springgreen: 0x00ff7f,
2147   steelblue: 0x4682b4,
2148   tan: 0xd2b48c,
2149   teal: 0x008080,
2150   thistle: 0xd8bfd8,
2151   tomato: 0xff6347,
2152   turquoise: 0x40e0d0,
2153   violet: 0xee82ee,
2154   wheat: 0xf5deb3,
2155   white: 0xffffff,
2156   whitesmoke: 0xf5f5f5,
2157   yellow: 0xffff00,
2158   yellowgreen: 0x9acd32
2159 };
2160
2161 define(Color, color, {
2162   displayable: function() {
2163     return this.rgb().displayable();
2164   },
2165   toString: function() {
2166     return this.rgb() + "";
2167   }
2168 });
2169
2170 function color(format) {
2171   var m;
2172   format = (format + "").trim().toLowerCase();
2173   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
2174       : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2175       : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2176       : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2177       : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2178       : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2179       : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2180       : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2181       : named.hasOwnProperty(format) ? rgbn(named[format])
2182       : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2183       : null;
2184 }
2185
2186 function rgbn(n) {
2187   return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2188 }
2189
2190 function rgba(r, g, b, a) {
2191   if (a <= 0) r = g = b = NaN;
2192   return new Rgb(r, g, b, a);
2193 }
2194
2195 function rgbConvert(o) {
2196   if (!(o instanceof Color)) o = color(o);
2197   if (!o) return new Rgb;
2198   o = o.rgb();
2199   return new Rgb(o.r, o.g, o.b, o.opacity);
2200 }
2201
2202 function rgb(r, g, b, opacity) {
2203   return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2204 }
2205
2206 function Rgb(r, g, b, opacity) {
2207   this.r = +r;
2208   this.g = +g;
2209   this.b = +b;
2210   this.opacity = +opacity;
2211 }
2212
2213 define(Rgb, rgb, extend(Color, {
2214   brighter: function(k) {
2215     k = k == null ? brighter : Math.pow(brighter, k);
2216     return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2217   },
2218   darker: function(k) {
2219     k = k == null ? darker : Math.pow(darker, k);
2220     return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2221   },
2222   rgb: function() {
2223     return this;
2224   },
2225   displayable: function() {
2226     return (0 <= this.r && this.r <= 255)
2227         && (0 <= this.g && this.g <= 255)
2228         && (0 <= this.b && this.b <= 255)
2229         && (0 <= this.opacity && this.opacity <= 1);
2230   },
2231   toString: function() {
2232     var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2233     return (a === 1 ? "rgb(" : "rgba(")
2234         + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2235         + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2236         + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2237         + (a === 1 ? ")" : ", " + a + ")");
2238   }
2239 }));
2240
2241 function hsla(h, s, l, a) {
2242   if (a <= 0) h = s = l = NaN;
2243   else if (l <= 0 || l >= 1) h = s = NaN;
2244   else if (s <= 0) h = NaN;
2245   return new Hsl(h, s, l, a);
2246 }
2247
2248 function hslConvert(o) {
2249   if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2250   if (!(o instanceof Color)) o = color(o);
2251   if (!o) return new Hsl;
2252   if (o instanceof Hsl) return o;
2253   o = o.rgb();
2254   var r = o.r / 255,
2255       g = o.g / 255,
2256       b = o.b / 255,
2257       min = Math.min(r, g, b),
2258       max = Math.max(r, g, b),
2259       h = NaN,
2260       s = max - min,
2261       l = (max + min) / 2;
2262   if (s) {
2263     if (r === max) h = (g - b) / s + (g < b) * 6;
2264     else if (g === max) h = (b - r) / s + 2;
2265     else h = (r - g) / s + 4;
2266     s /= l < 0.5 ? max + min : 2 - max - min;
2267     h *= 60;
2268   } else {
2269     s = l > 0 && l < 1 ? 0 : h;
2270   }
2271   return new Hsl(h, s, l, o.opacity);
2272 }
2273
2274 function hsl(h, s, l, opacity) {
2275   return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2276 }
2277
2278 function Hsl(h, s, l, opacity) {
2279   this.h = +h;
2280   this.s = +s;
2281   this.l = +l;
2282   this.opacity = +opacity;
2283 }
2284
2285 define(Hsl, hsl, extend(Color, {
2286   brighter: function(k) {
2287     k = k == null ? brighter : Math.pow(brighter, k);
2288     return new Hsl(this.h, this.s, this.l * k, this.opacity);
2289   },
2290   darker: function(k) {
2291     k = k == null ? darker : Math.pow(darker, k);
2292     return new Hsl(this.h, this.s, this.l * k, this.opacity);
2293   },
2294   rgb: function() {
2295     var h = this.h % 360 + (this.h < 0) * 360,
2296         s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2297         l = this.l,
2298         m2 = l + (l < 0.5 ? l : 1 - l) * s,
2299         m1 = 2 * l - m2;
2300     return new Rgb(
2301       hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2302       hsl2rgb(h, m1, m2),
2303       hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2304       this.opacity
2305     );
2306   },
2307   displayable: function() {
2308     return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2309         && (0 <= this.l && this.l <= 1)
2310         && (0 <= this.opacity && this.opacity <= 1);
2311   }
2312 }));
2313
2314 /* From FvD 13.37, CSS Color Module Level 3 */
2315 function hsl2rgb(h, m1, m2) {
2316   return (h < 60 ? m1 + (m2 - m1) * h / 60
2317       : h < 180 ? m2
2318       : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2319       : m1) * 255;
2320 }
2321
2322 var deg2rad = Math.PI / 180;
2323 var rad2deg = 180 / Math.PI;
2324
2325 var Kn = 18;
2326 var Xn = 0.950470;
2327 var Yn = 1;
2328 var Zn = 1.088830;
2329 var t0 = 4 / 29;
2330 var t1 = 6 / 29;
2331 var t2 = 3 * t1 * t1;
2332 var t3 = t1 * t1 * t1;
2333
2334 function labConvert(o) {
2335   if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2336   if (o instanceof Hcl) {
2337     var h = o.h * deg2rad;
2338     return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2339   }
2340   if (!(o instanceof Rgb)) o = rgbConvert(o);
2341   var b = rgb2xyz(o.r),
2342       a = rgb2xyz(o.g),
2343       l = rgb2xyz(o.b),
2344       x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2345       y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2346       z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2347   return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2348 }
2349
2350 function lab(l, a, b, opacity) {
2351   return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2352 }
2353
2354 function Lab(l, a, b, opacity) {
2355   this.l = +l;
2356   this.a = +a;
2357   this.b = +b;
2358   this.opacity = +opacity;
2359 }
2360
2361 define(Lab, lab, extend(Color, {
2362   brighter: function(k) {
2363     return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2364   },
2365   darker: function(k) {
2366     return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2367   },
2368   rgb: function() {
2369     var y = (this.l + 16) / 116,
2370         x = isNaN(this.a) ? y : y + this.a / 500,
2371         z = isNaN(this.b) ? y : y - this.b / 200;
2372     y = Yn * lab2xyz(y);
2373     x = Xn * lab2xyz(x);
2374     z = Zn * lab2xyz(z);
2375     return new Rgb(
2376       xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2377       xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2378       xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2379       this.opacity
2380     );
2381   }
2382 }));
2383
2384 function xyz2lab(t) {
2385   return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2386 }
2387
2388 function lab2xyz(t) {
2389   return t > t1 ? t * t * t : t2 * (t - t0);
2390 }
2391
2392 function xyz2rgb(x) {
2393   return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2394 }
2395
2396 function rgb2xyz(x) {
2397   return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2398 }
2399
2400 function hclConvert(o) {
2401   if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2402   if (!(o instanceof Lab)) o = labConvert(o);
2403   var h = Math.atan2(o.b, o.a) * rad2deg;
2404   return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2405 }
2406
2407 function hcl(h, c, l, opacity) {
2408   return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2409 }
2410
2411 function Hcl(h, c, l, opacity) {
2412   this.h = +h;
2413   this.c = +c;
2414   this.l = +l;
2415   this.opacity = +opacity;
2416 }
2417
2418 define(Hcl, hcl, extend(Color, {
2419   brighter: function(k) {
2420     return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2421   },
2422   darker: function(k) {
2423     return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2424   },
2425   rgb: function() {
2426     return labConvert(this).rgb();
2427   }
2428 }));
2429
2430 var A = -0.14861;
2431 var B = +1.78277;
2432 var C = -0.29227;
2433 var D = -0.90649;
2434 var E = +1.97294;
2435 var ED = E * D;
2436 var EB = E * B;
2437 var BC_DA = B * C - D * A;
2438
2439 function cubehelixConvert(o) {
2440   if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2441   if (!(o instanceof Rgb)) o = rgbConvert(o);
2442   var r = o.r / 255,
2443       g = o.g / 255,
2444       b = o.b / 255,
2445       l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2446       bl = b - l,
2447       k = (E * (g - l) - C * bl) / D,
2448       s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2449       h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2450   return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2451 }
2452
2453 function cubehelix(h, s, l, opacity) {
2454   return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2455 }
2456
2457 function Cubehelix(h, s, l, opacity) {
2458   this.h = +h;
2459   this.s = +s;
2460   this.l = +l;
2461   this.opacity = +opacity;
2462 }
2463
2464 define(Cubehelix, cubehelix, extend(Color, {
2465   brighter: function(k) {
2466     k = k == null ? brighter : Math.pow(brighter, k);
2467     return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2468   },
2469   darker: function(k) {
2470     k = k == null ? darker : Math.pow(darker, k);
2471     return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2472   },
2473   rgb: function() {
2474     var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2475         l = +this.l,
2476         a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2477         cosh = Math.cos(h),
2478         sinh = Math.sin(h);
2479     return new Rgb(
2480       255 * (l + a * (A * cosh + B * sinh)),
2481       255 * (l + a * (C * cosh + D * sinh)),
2482       255 * (l + a * (E * cosh)),
2483       this.opacity
2484     );
2485   }
2486 }));
2487
2488 function basis(t1, v0, v1, v2, v3) {
2489   var t2 = t1 * t1, t3 = t2 * t1;
2490   return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2491       + (4 - 6 * t2 + 3 * t3) * v1
2492       + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2493       + t3 * v3) / 6;
2494 }
2495
2496 var basis$1 = function(values) {
2497   var n = values.length - 1;
2498   return function(t) {
2499     var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2500         v1 = values[i],
2501         v2 = values[i + 1],
2502         v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2503         v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2504     return basis((t - i / n) * n, v0, v1, v2, v3);
2505   };
2506 };
2507
2508 var basisClosed = function(values) {
2509   var n = values.length;
2510   return function(t) {
2511     var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2512         v0 = values[(i + n - 1) % n],
2513         v1 = values[i % n],
2514         v2 = values[(i + 1) % n],
2515         v3 = values[(i + 2) % n];
2516     return basis((t - i / n) * n, v0, v1, v2, v3);
2517   };
2518 };
2519
2520 var constant$3 = function(x) {
2521   return function() {
2522     return x;
2523   };
2524 };
2525
2526 function linear(a, d) {
2527   return function(t) {
2528     return a + t * d;
2529   };
2530 }
2531
2532 function exponential(a, b, y) {
2533   return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2534     return Math.pow(a + t * b, y);
2535   };
2536 }
2537
2538 function hue(a, b) {
2539   var d = b - a;
2540   return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2541 }
2542
2543 function gamma(y) {
2544   return (y = +y) === 1 ? nogamma : function(a, b) {
2545     return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2546   };
2547 }
2548
2549 function nogamma(a, b) {
2550   var d = b - a;
2551   return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2552 }
2553
2554 var d3_interpolateRgb = (function rgbGamma(y) {
2555   var color$$1 = gamma(y);
2556
2557   function rgb$$1(start, end) {
2558     var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2559         g = color$$1(start.g, end.g),
2560         b = color$$1(start.b, end.b),
2561         opacity = nogamma(start.opacity, end.opacity);
2562     return function(t) {
2563       start.r = r(t);
2564       start.g = g(t);
2565       start.b = b(t);
2566       start.opacity = opacity(t);
2567       return start + "";
2568     };
2569   }
2570
2571   rgb$$1.gamma = rgbGamma;
2572
2573   return rgb$$1;
2574 })(1);
2575
2576 function rgbSpline(spline) {
2577   return function(colors) {
2578     var n = colors.length,
2579         r = new Array(n),
2580         g = new Array(n),
2581         b = new Array(n),
2582         i, color$$1;
2583     for (i = 0; i < n; ++i) {
2584       color$$1 = rgb(colors[i]);
2585       r[i] = color$$1.r || 0;
2586       g[i] = color$$1.g || 0;
2587       b[i] = color$$1.b || 0;
2588     }
2589     r = spline(r);
2590     g = spline(g);
2591     b = spline(b);
2592     color$$1.opacity = 1;
2593     return function(t) {
2594       color$$1.r = r(t);
2595       color$$1.g = g(t);
2596       color$$1.b = b(t);
2597       return color$$1 + "";
2598     };
2599   };
2600 }
2601
2602 var rgbBasis = rgbSpline(basis$1);
2603 var rgbBasisClosed = rgbSpline(basisClosed);
2604
2605 var array$1 = function(a, b) {
2606   var nb = b ? b.length : 0,
2607       na = a ? Math.min(nb, a.length) : 0,
2608       x = new Array(nb),
2609       c = new Array(nb),
2610       i;
2611
2612   for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
2613   for (; i < nb; ++i) c[i] = b[i];
2614
2615   return function(t) {
2616     for (i = 0; i < na; ++i) c[i] = x[i](t);
2617     return c;
2618   };
2619 };
2620
2621 var date = function(a, b) {
2622   var d = new Date;
2623   return a = +a, b -= a, function(t) {
2624     return d.setTime(a + b * t), d;
2625   };
2626 };
2627
2628 var d3_interpolateNumber = function(a, b) {
2629   return a = +a, b -= a, function(t) {
2630     return a + b * t;
2631   };
2632 };
2633
2634 var object = function(a, b) {
2635   var i = {},
2636       c = {},
2637       k;
2638
2639   if (a === null || typeof a !== "object") a = {};
2640   if (b === null || typeof b !== "object") b = {};
2641
2642   for (k in b) {
2643     if (k in a) {
2644       i[k] = d3_interpolate(a[k], b[k]);
2645     } else {
2646       c[k] = b[k];
2647     }
2648   }
2649
2650   return function(t) {
2651     for (k in i) c[k] = i[k](t);
2652     return c;
2653   };
2654 };
2655
2656 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
2657 var reB = new RegExp(reA.source, "g");
2658
2659 function zero(b) {
2660   return function() {
2661     return b;
2662   };
2663 }
2664
2665 function one(b) {
2666   return function(t) {
2667     return b(t) + "";
2668   };
2669 }
2670
2671 var interpolateString = function(a, b) {
2672   var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2673       am, // current match in a
2674       bm, // current match in b
2675       bs, // string preceding current number in b, if any
2676       i = -1, // index in s
2677       s = [], // string constants and placeholders
2678       q = []; // number interpolators
2679
2680   // Coerce inputs to strings.
2681   a = a + "", b = b + "";
2682
2683   // Interpolate pairs of numbers in a & b.
2684   while ((am = reA.exec(a))
2685       && (bm = reB.exec(b))) {
2686     if ((bs = bm.index) > bi) { // a string precedes the next number in b
2687       bs = b.slice(bi, bs);
2688       if (s[i]) s[i] += bs; // coalesce with previous string
2689       else s[++i] = bs;
2690     }
2691     if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2692       if (s[i]) s[i] += bm; // coalesce with previous string
2693       else s[++i] = bm;
2694     } else { // interpolate non-matching numbers
2695       s[++i] = null;
2696       q.push({i: i, x: d3_interpolateNumber(am, bm)});
2697     }
2698     bi = reB.lastIndex;
2699   }
2700
2701   // Add remains of b.
2702   if (bi < b.length) {
2703     bs = b.slice(bi);
2704     if (s[i]) s[i] += bs; // coalesce with previous string
2705     else s[++i] = bs;
2706   }
2707
2708   // Special optimization for only a single match.
2709   // Otherwise, interpolate each of the numbers and rejoin the string.
2710   return s.length < 2 ? (q[0]
2711       ? one(q[0].x)
2712       : zero(b))
2713       : (b = q.length, function(t) {
2714           for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2715           return s.join("");
2716         });
2717 };
2718
2719 var d3_interpolate = function(a, b) {
2720   var t = typeof b, c;
2721   return b == null || t === "boolean" ? constant$3(b)
2722       : (t === "number" ? d3_interpolateNumber
2723       : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
2724       : b instanceof color ? d3_interpolateRgb
2725       : b instanceof Date ? date
2726       : Array.isArray(b) ? array$1
2727       : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2728       : d3_interpolateNumber)(a, b);
2729 };
2730
2731 var interpolateRound = function(a, b) {
2732   return a = +a, b -= a, function(t) {
2733     return Math.round(a + b * t);
2734   };
2735 };
2736
2737 var degrees = 180 / Math.PI;
2738
2739 var identity$2 = {
2740   translateX: 0,
2741   translateY: 0,
2742   rotate: 0,
2743   skewX: 0,
2744   scaleX: 1,
2745   scaleY: 1
2746 };
2747
2748 var decompose = function(a, b, c, d, e, f) {
2749   var scaleX, scaleY, skewX;
2750   if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2751   if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2752   if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2753   if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2754   return {
2755     translateX: e,
2756     translateY: f,
2757     rotate: Math.atan2(b, a) * degrees,
2758     skewX: Math.atan(skewX) * degrees,
2759     scaleX: scaleX,
2760     scaleY: scaleY
2761   };
2762 };
2763
2764 var cssNode;
2765 var cssRoot;
2766 var cssView;
2767 var svgNode;
2768
2769 function parseCss(value) {
2770   if (value === "none") return identity$2;
2771   if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2772   cssNode.style.transform = value;
2773   value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2774   cssRoot.removeChild(cssNode);
2775   value = value.slice(7, -1).split(",");
2776   return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2777 }
2778
2779 function parseSvg(value) {
2780   if (value == null) return identity$2;
2781   if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2782   svgNode.setAttribute("transform", value);
2783   if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2784   value = value.matrix;
2785   return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2786 }
2787
2788 function interpolateTransform(parse, pxComma, pxParen, degParen) {
2789
2790   function pop(s) {
2791     return s.length ? s.pop() + " " : "";
2792   }
2793
2794   function translate(xa, ya, xb, yb, s, q) {
2795     if (xa !== xb || ya !== yb) {
2796       var i = s.push("translate(", null, pxComma, null, pxParen);
2797       q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2798     } else if (xb || yb) {
2799       s.push("translate(" + xb + pxComma + yb + pxParen);
2800     }
2801   }
2802
2803   function rotate(a, b, s, q) {
2804     if (a !== b) {
2805       if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2806       q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2807     } else if (b) {
2808       s.push(pop(s) + "rotate(" + b + degParen);
2809     }
2810   }
2811
2812   function skewX(a, b, s, q) {
2813     if (a !== b) {
2814       q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
2815     } else if (b) {
2816       s.push(pop(s) + "skewX(" + b + degParen);
2817     }
2818   }
2819
2820   function scale(xa, ya, xb, yb, s, q) {
2821     if (xa !== xb || ya !== yb) {
2822       var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2823       q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
2824     } else if (xb !== 1 || yb !== 1) {
2825       s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2826     }
2827   }
2828
2829   return function(a, b) {
2830     var s = [], // string constants and placeholders
2831         q = []; // number interpolators
2832     a = parse(a), b = parse(b);
2833     translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2834     rotate(a.rotate, b.rotate, s, q);
2835     skewX(a.skewX, b.skewX, s, q);
2836     scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2837     a = b = null; // gc
2838     return function(t) {
2839       var i = -1, n = q.length, o;
2840       while (++i < n) s[(o = q[i]).i] = o.x(t);
2841       return s.join("");
2842     };
2843   };
2844 }
2845
2846 var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2847 var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2848
2849 var rho = Math.SQRT2;
2850 var rho2 = 2;
2851 var rho4 = 4;
2852 var epsilon2 = 1e-12;
2853
2854 function cosh(x) {
2855   return ((x = Math.exp(x)) + 1 / x) / 2;
2856 }
2857
2858 function sinh(x) {
2859   return ((x = Math.exp(x)) - 1 / x) / 2;
2860 }
2861
2862 function tanh(x) {
2863   return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2864 }
2865
2866 // p0 = [ux0, uy0, w0]
2867 // p1 = [ux1, uy1, w1]
2868 var interpolateZoom = function(p0, p1) {
2869   var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2870       ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2871       dx = ux1 - ux0,
2872       dy = uy1 - uy0,
2873       d2 = dx * dx + dy * dy,
2874       i,
2875       S;
2876
2877   // Special case for u0 ≅ u1.
2878   if (d2 < epsilon2) {
2879     S = Math.log(w1 / w0) / rho;
2880     i = function(t) {
2881       return [
2882         ux0 + t * dx,
2883         uy0 + t * dy,
2884         w0 * Math.exp(rho * t * S)
2885       ];
2886     };
2887   }
2888
2889   // General case.
2890   else {
2891     var d1 = Math.sqrt(d2),
2892         b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2893         b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2894         r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2895         r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2896     S = (r1 - r0) / rho;
2897     i = function(t) {
2898       var s = t * S,
2899           coshr0 = cosh(r0),
2900           u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2901       return [
2902         ux0 + u * dx,
2903         uy0 + u * dy,
2904         w0 * coshr0 / cosh(rho * s + r0)
2905       ];
2906     };
2907   }
2908
2909   i.duration = S * 1000;
2910
2911   return i;
2912 };
2913
2914 function hsl$1(hue$$1) {
2915   return function(start, end) {
2916     var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2917         s = nogamma(start.s, end.s),
2918         l = nogamma(start.l, end.l),
2919         opacity = nogamma(start.opacity, end.opacity);
2920     return function(t) {
2921       start.h = h(t);
2922       start.s = s(t);
2923       start.l = l(t);
2924       start.opacity = opacity(t);
2925       return start + "";
2926     };
2927   }
2928 }
2929
2930 var hsl$2 = hsl$1(hue);
2931 var hslLong = hsl$1(nogamma);
2932
2933 function lab$1(start, end) {
2934   var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2935       a = nogamma(start.a, end.a),
2936       b = nogamma(start.b, end.b),
2937       opacity = nogamma(start.opacity, end.opacity);
2938   return function(t) {
2939     start.l = l(t);
2940     start.a = a(t);
2941     start.b = b(t);
2942     start.opacity = opacity(t);
2943     return start + "";
2944   };
2945 }
2946
2947 function hcl$1(hue$$1) {
2948   return function(start, end) {
2949     var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2950         c = nogamma(start.c, end.c),
2951         l = nogamma(start.l, end.l),
2952         opacity = nogamma(start.opacity, end.opacity);
2953     return function(t) {
2954       start.h = h(t);
2955       start.c = c(t);
2956       start.l = l(t);
2957       start.opacity = opacity(t);
2958       return start + "";
2959     };
2960   }
2961 }
2962
2963 var hcl$2 = hcl$1(hue);
2964 var hclLong = hcl$1(nogamma);
2965
2966 function cubehelix$1(hue$$1) {
2967   return (function cubehelixGamma(y) {
2968     y = +y;
2969
2970     function cubehelix$$1(start, end) {
2971       var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2972           s = nogamma(start.s, end.s),
2973           l = nogamma(start.l, end.l),
2974           opacity = nogamma(start.opacity, end.opacity);
2975       return function(t) {
2976         start.h = h(t);
2977         start.s = s(t);
2978         start.l = l(Math.pow(t, y));
2979         start.opacity = opacity(t);
2980         return start + "";
2981       };
2982     }
2983
2984     cubehelix$$1.gamma = cubehelixGamma;
2985
2986     return cubehelix$$1;
2987   })(1);
2988 }
2989
2990 var cubehelix$2 = cubehelix$1(hue);
2991 var cubehelixLong = cubehelix$1(nogamma);
2992
2993 var d3_quantize = function(interpolator, n) {
2994   var samples = new Array(n);
2995   for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
2996   return samples;
2997 };
2998
2999 var frame = 0;
3000 var timeout = 0;
3001 var interval = 0;
3002 var pokeDelay = 1000;
3003 var taskHead;
3004 var taskTail;
3005 var clockLast = 0;
3006 var clockNow = 0;
3007 var clockSkew = 0;
3008 var clock = typeof performance === "object" && performance.now ? performance : Date;
3009 var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3010
3011 function now() {
3012   return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3013 }
3014
3015 function clearNow() {
3016   clockNow = 0;
3017 }
3018
3019 function Timer() {
3020   this._call =
3021   this._time =
3022   this._next = null;
3023 }
3024
3025 Timer.prototype = timer.prototype = {
3026   constructor: Timer,
3027   restart: function(callback, delay, time) {
3028     if (typeof callback !== "function") throw new TypeError("callback is not a function");
3029     time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3030     if (!this._next && taskTail !== this) {
3031       if (taskTail) taskTail._next = this;
3032       else taskHead = this;
3033       taskTail = this;
3034     }
3035     this._call = callback;
3036     this._time = time;
3037     sleep();
3038   },
3039   stop: function() {
3040     if (this._call) {
3041       this._call = null;
3042       this._time = Infinity;
3043       sleep();
3044     }
3045   }
3046 };
3047
3048 function timer(callback, delay, time) {
3049   var t = new Timer;
3050   t.restart(callback, delay, time);
3051   return t;
3052 }
3053
3054 function timerFlush() {
3055   now(); // Get the current time, if not already set.
3056   ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3057   var t = taskHead, e;
3058   while (t) {
3059     if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3060     t = t._next;
3061   }
3062   --frame;
3063 }
3064
3065 function wake() {
3066   clockNow = (clockLast = clock.now()) + clockSkew;
3067   frame = timeout = 0;
3068   try {
3069     timerFlush();
3070   } finally {
3071     frame = 0;
3072     nap();
3073     clockNow = 0;
3074   }
3075 }
3076
3077 function poke() {
3078   var now = clock.now(), delay = now - clockLast;
3079   if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3080 }
3081
3082 function nap() {
3083   var t0, t1 = taskHead, t2, time = Infinity;
3084   while (t1) {
3085     if (t1._call) {
3086       if (time > t1._time) time = t1._time;
3087       t0 = t1, t1 = t1._next;
3088     } else {
3089       t2 = t1._next, t1._next = null;
3090       t1 = t0 ? t0._next = t2 : taskHead = t2;
3091     }
3092   }
3093   taskTail = t0;
3094   sleep(time);
3095 }
3096
3097 function sleep(time) {
3098   if (frame) return; // Soonest alarm already set, or will be.
3099   if (timeout) timeout = clearTimeout(timeout);
3100   var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3101   if (delay > 24) {
3102     if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3103     if (interval) interval = clearInterval(interval);
3104   } else {
3105     if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3106     frame = 1, setFrame(wake);
3107   }
3108 }
3109
3110 var d3_timeout = function(callback, delay, time) {
3111   var t = new Timer;
3112   delay = delay == null ? 0 : +delay;
3113   t.restart(function(elapsed) {
3114     t.stop();
3115     callback(elapsed + delay);
3116   }, delay, time);
3117   return t;
3118 };
3119
3120 var interval$1 = function(callback, delay, time) {
3121   var t = new Timer, total = delay;
3122   if (delay == null) return t.restart(callback, delay, time), t;
3123   delay = +delay, time = time == null ? now() : +time;
3124   t.restart(function tick(elapsed) {
3125     elapsed += total;
3126     t.restart(tick, total += delay, time);
3127     callback(elapsed);
3128   }, delay, time);
3129   return t;
3130 };
3131
3132 var emptyOn = dispatch("start", "end", "interrupt");
3133 var emptyTween = [];
3134
3135 var CREATED = 0;
3136 var SCHEDULED = 1;
3137 var STARTING = 2;
3138 var STARTED = 3;
3139 var RUNNING = 4;
3140 var ENDING = 5;
3141 var ENDED = 6;
3142
3143 var schedule = function(node, name, id, index, group, timing) {
3144   var schedules = node.__transition;
3145   if (!schedules) node.__transition = {};
3146   else if (id in schedules) return;
3147   create(node, id, {
3148     name: name,
3149     index: index, // For context during callback.
3150     group: group, // For context during callback.
3151     on: emptyOn,
3152     tween: emptyTween,
3153     time: timing.time,
3154     delay: timing.delay,
3155     duration: timing.duration,
3156     ease: timing.ease,
3157     timer: null,
3158     state: CREATED
3159   });
3160 };
3161
3162 function init(node, id) {
3163   var schedule = node.__transition;
3164   if (!schedule || !(schedule = schedule[id]) || schedule.state > CREATED) throw new Error("too late");
3165   return schedule;
3166 }
3167
3168 function set$1(node, id) {
3169   var schedule = node.__transition;
3170   if (!schedule || !(schedule = schedule[id]) || schedule.state > STARTING) throw new Error("too late");
3171   return schedule;
3172 }
3173
3174 function get$1(node, id) {
3175   var schedule = node.__transition;
3176   if (!schedule || !(schedule = schedule[id])) throw new Error("too late");
3177   return schedule;
3178 }
3179
3180 function create(node, id, self) {
3181   var schedules = node.__transition,
3182       tween;
3183
3184   // Initialize the self timer when the transition is created.
3185   // Note the actual delay is not known until the first callback!
3186   schedules[id] = self;
3187   self.timer = timer(schedule, 0, self.time);
3188
3189   function schedule(elapsed) {
3190     self.state = SCHEDULED;
3191     self.timer.restart(start, self.delay, self.time);
3192
3193     // If the elapsed delay is less than our first sleep, start immediately.
3194     if (self.delay <= elapsed) start(elapsed - self.delay);
3195   }
3196
3197   function start(elapsed) {
3198     var i, j, n, o;
3199
3200     // If the state is not SCHEDULED, then we previously errored on start.
3201     if (self.state !== SCHEDULED) return stop();
3202
3203     for (i in schedules) {
3204       o = schedules[i];
3205       if (o.name !== self.name) continue;
3206
3207       // While this element already has a starting transition during this frame,
3208       // defer starting an interrupting transition until that transition has a
3209       // chance to tick (and possibly end); see d3/d3-transition#54!
3210       if (o.state === STARTED) return d3_timeout(start);
3211
3212       // Interrupt the active transition, if any.
3213       // Dispatch the interrupt event.
3214       if (o.state === RUNNING) {
3215         o.state = ENDED;
3216         o.timer.stop();
3217         o.on.call("interrupt", node, node.__data__, o.index, o.group);
3218         delete schedules[i];
3219       }
3220
3221       // Cancel any pre-empted transitions. No interrupt event is dispatched
3222       // because the cancelled transitions never started. Note that this also
3223       // removes this transition from the pending list!
3224       else if (+i < id) {
3225         o.state = ENDED;
3226         o.timer.stop();
3227         delete schedules[i];
3228       }
3229     }
3230
3231     // Defer the first tick to end of the current frame; see d3/d3#1576.
3232     // Note the transition may be canceled after start and before the first tick!
3233     // Note this must be scheduled before the start event; see d3/d3-transition#16!
3234     // Assuming this is successful, subsequent callbacks go straight to tick.
3235     d3_timeout(function() {
3236       if (self.state === STARTED) {
3237         self.state = RUNNING;
3238         self.timer.restart(tick, self.delay, self.time);
3239         tick(elapsed);
3240       }
3241     });
3242
3243     // Dispatch the start event.
3244     // Note this must be done before the tween are initialized.
3245     self.state = STARTING;
3246     self.on.call("start", node, node.__data__, self.index, self.group);
3247     if (self.state !== STARTING) return; // interrupted
3248     self.state = STARTED;
3249
3250     // Initialize the tween, deleting null tween.
3251     tween = new Array(n = self.tween.length);
3252     for (i = 0, j = -1; i < n; ++i) {
3253       if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3254         tween[++j] = o;
3255       }
3256     }
3257     tween.length = j + 1;
3258   }
3259
3260   function tick(elapsed) {
3261     var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3262         i = -1,
3263         n = tween.length;
3264
3265     while (++i < n) {
3266       tween[i].call(null, t);
3267     }
3268
3269     // Dispatch the end event.
3270     if (self.state === ENDING) {
3271       self.on.call("end", node, node.__data__, self.index, self.group);
3272       stop();
3273     }
3274   }
3275
3276   function stop() {
3277     self.state = ENDED;
3278     self.timer.stop();
3279     delete schedules[id];
3280     for (var i in schedules) return; // eslint-disable-line no-unused-vars
3281     delete node.__transition;
3282   }
3283 }
3284
3285 var interrupt = function(node, name) {
3286   var schedules = node.__transition,
3287       schedule$$1,
3288       active,
3289       empty = true,
3290       i;
3291
3292   if (!schedules) return;
3293
3294   name = name == null ? null : name + "";
3295
3296   for (i in schedules) {
3297     if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3298     active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3299     schedule$$1.state = ENDED;
3300     schedule$$1.timer.stop();
3301     if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3302     delete schedules[i];
3303   }
3304
3305   if (empty) delete node.__transition;
3306 };
3307
3308 var selection_interrupt = function(name) {
3309   return this.each(function() {
3310     interrupt(this, name);
3311   });
3312 };
3313
3314 function tweenRemove(id, name) {
3315   var tween0, tween1;
3316   return function() {
3317     var schedule$$1 = set$1(this, id),
3318         tween = schedule$$1.tween;
3319
3320     // If this node shared tween with the previous node,
3321     // just assign the updated shared tween and we’re done!
3322     // Otherwise, copy-on-write.
3323     if (tween !== tween0) {
3324       tween1 = tween0 = tween;
3325       for (var i = 0, n = tween1.length; i < n; ++i) {
3326         if (tween1[i].name === name) {
3327           tween1 = tween1.slice();
3328           tween1.splice(i, 1);
3329           break;
3330         }
3331       }
3332     }
3333
3334     schedule$$1.tween = tween1;
3335   };
3336 }
3337
3338 function tweenFunction(id, name, value) {
3339   var tween0, tween1;
3340   if (typeof value !== "function") throw new Error;
3341   return function() {
3342     var schedule$$1 = set$1(this, id),
3343         tween = schedule$$1.tween;
3344
3345     // If this node shared tween with the previous node,
3346     // just assign the updated shared tween and we’re done!
3347     // Otherwise, copy-on-write.
3348     if (tween !== tween0) {
3349       tween1 = (tween0 = tween).slice();
3350       for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3351         if (tween1[i].name === name) {
3352           tween1[i] = t;
3353           break;
3354         }
3355       }
3356       if (i === n) tween1.push(t);
3357     }
3358
3359     schedule$$1.tween = tween1;
3360   };
3361 }
3362
3363 var transition_tween = function(name, value) {
3364   var id = this._id;
3365
3366   name += "";
3367
3368   if (arguments.length < 2) {
3369     var tween = get$1(this.node(), id).tween;
3370     for (var i = 0, n = tween.length, t; i < n; ++i) {
3371       if ((t = tween[i]).name === name) {
3372         return t.value;
3373       }
3374     }
3375     return null;
3376   }
3377
3378   return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3379 };
3380
3381 function tweenValue(transition, name, value) {
3382   var id = transition._id;
3383
3384   transition.each(function() {
3385     var schedule$$1 = set$1(this, id);
3386     (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3387   });
3388
3389   return function(node) {
3390     return get$1(node, id).value[name];
3391   };
3392 }
3393
3394 var interpolate = function(a, b) {
3395   var c;
3396   return (typeof b === "number" ? d3_interpolateNumber
3397       : b instanceof color ? d3_interpolateRgb
3398       : (c = color(b)) ? (b = c, d3_interpolateRgb)
3399       : interpolateString)(a, b);
3400 };
3401
3402 function attrRemove$1(name) {
3403   return function() {
3404     this.removeAttribute(name);
3405   };
3406 }
3407
3408 function attrRemoveNS$1(fullname) {
3409   return function() {
3410     this.removeAttributeNS(fullname.space, fullname.local);
3411   };
3412 }
3413
3414 function attrConstant$1(name, interpolate$$1, value1) {
3415   var value00,
3416       interpolate0;
3417   return function() {
3418     var value0 = this.getAttribute(name);
3419     return value0 === value1 ? null
3420         : value0 === value00 ? interpolate0
3421         : interpolate0 = interpolate$$1(value00 = value0, value1);
3422   };
3423 }
3424
3425 function attrConstantNS$1(fullname, interpolate$$1, value1) {
3426   var value00,
3427       interpolate0;
3428   return function() {
3429     var value0 = this.getAttributeNS(fullname.space, fullname.local);
3430     return value0 === value1 ? null
3431         : value0 === value00 ? interpolate0
3432         : interpolate0 = interpolate$$1(value00 = value0, value1);
3433   };
3434 }
3435
3436 function attrFunction$1(name, interpolate$$1, value) {
3437   var value00,
3438       value10,
3439       interpolate0;
3440   return function() {
3441     var value0, value1 = value(this);
3442     if (value1 == null) return void this.removeAttribute(name);
3443     value0 = this.getAttribute(name);
3444     return value0 === value1 ? null
3445         : value0 === value00 && value1 === value10 ? interpolate0
3446         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3447   };
3448 }
3449
3450 function attrFunctionNS$1(fullname, interpolate$$1, value) {
3451   var value00,
3452       value10,
3453       interpolate0;
3454   return function() {
3455     var value0, value1 = value(this);
3456     if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3457     value0 = this.getAttributeNS(fullname.space, fullname.local);
3458     return value0 === value1 ? null
3459         : value0 === value00 && value1 === value10 ? interpolate0
3460         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3461   };
3462 }
3463
3464 var transition_attr = function(name, value) {
3465   var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
3466   return this.attrTween(name, typeof value === "function"
3467       ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3468       : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3469       : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3470 };
3471
3472 function attrTweenNS(fullname, value) {
3473   function tween() {
3474     var node = this, i = value.apply(node, arguments);
3475     return i && function(t) {
3476       node.setAttributeNS(fullname.space, fullname.local, i(t));
3477     };
3478   }
3479   tween._value = value;
3480   return tween;
3481 }
3482
3483 function attrTween(name, value) {
3484   function tween() {
3485     var node = this, i = value.apply(node, arguments);
3486     return i && function(t) {
3487       node.setAttribute(name, i(t));
3488     };
3489   }
3490   tween._value = value;
3491   return tween;
3492 }
3493
3494 var transition_attrTween = function(name, value) {
3495   var key = "attr." + name;
3496   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3497   if (value == null) return this.tween(key, null);
3498   if (typeof value !== "function") throw new Error;
3499   var fullname = namespace(name);
3500   return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3501 };
3502
3503 function delayFunction(id, value) {
3504   return function() {
3505     init(this, id).delay = +value.apply(this, arguments);
3506   };
3507 }
3508
3509 function delayConstant(id, value) {
3510   return value = +value, function() {
3511     init(this, id).delay = value;
3512   };
3513 }
3514
3515 var transition_delay = function(value) {
3516   var id = this._id;
3517
3518   return arguments.length
3519       ? this.each((typeof value === "function"
3520           ? delayFunction
3521           : delayConstant)(id, value))
3522       : get$1(this.node(), id).delay;
3523 };
3524
3525 function durationFunction(id, value) {
3526   return function() {
3527     set$1(this, id).duration = +value.apply(this, arguments);
3528   };
3529 }
3530
3531 function durationConstant(id, value) {
3532   return value = +value, function() {
3533     set$1(this, id).duration = value;
3534   };
3535 }
3536
3537 var transition_duration = function(value) {
3538   var id = this._id;
3539
3540   return arguments.length
3541       ? this.each((typeof value === "function"
3542           ? durationFunction
3543           : durationConstant)(id, value))
3544       : get$1(this.node(), id).duration;
3545 };
3546
3547 function easeConstant(id, value) {
3548   if (typeof value !== "function") throw new Error;
3549   return function() {
3550     set$1(this, id).ease = value;
3551   };
3552 }
3553
3554 var transition_ease = function(value) {
3555   var id = this._id;
3556
3557   return arguments.length
3558       ? this.each(easeConstant(id, value))
3559       : get$1(this.node(), id).ease;
3560 };
3561
3562 var transition_filter = function(match) {
3563   if (typeof match !== "function") match = matcher$1(match);
3564
3565   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3566     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3567       if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3568         subgroup.push(node);
3569       }
3570     }
3571   }
3572
3573   return new Transition(subgroups, this._parents, this._name, this._id);
3574 };
3575
3576 var transition_merge = function(transition$$1) {
3577   if (transition$$1._id !== this._id) throw new Error;
3578
3579   for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
3580     for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3581       if (node = group0[i] || group1[i]) {
3582         merge[i] = node;
3583       }
3584     }
3585   }
3586
3587   for (; j < m0; ++j) {
3588     merges[j] = groups0[j];
3589   }
3590
3591   return new Transition(merges, this._parents, this._name, this._id);
3592 };
3593
3594 function start(name) {
3595   return (name + "").trim().split(/^|\s+/).every(function(t) {
3596     var i = t.indexOf(".");
3597     if (i >= 0) t = t.slice(0, i);
3598     return !t || t === "start";
3599   });
3600 }
3601
3602 function onFunction(id, name, listener) {
3603   var on0, on1, sit = start(name) ? init : set$1;
3604   return function() {
3605     var schedule$$1 = sit(this, id),
3606         on = schedule$$1.on;
3607
3608     // If this node shared a dispatch with the previous node,
3609     // just assign the updated shared dispatch and we’re done!
3610     // Otherwise, copy-on-write.
3611     if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3612
3613     schedule$$1.on = on1;
3614   };
3615 }
3616
3617 var transition_on = function(name, listener) {
3618   var id = this._id;
3619
3620   return arguments.length < 2
3621       ? get$1(this.node(), id).on.on(name)
3622       : this.each(onFunction(id, name, listener));
3623 };
3624
3625 function removeFunction(id) {
3626   return function() {
3627     var parent = this.parentNode;
3628     for (var i in this.__transition) if (+i !== id) return;
3629     if (parent) parent.removeChild(this);
3630   };
3631 }
3632
3633 var transition_remove = function() {
3634   return this.on("end.remove", removeFunction(this._id));
3635 };
3636
3637 var transition_select = function(select) {
3638   var name = this._name,
3639       id = this._id;
3640
3641   if (typeof select !== "function") select = selector(select);
3642
3643   for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3644     for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3645       if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
3646         if ("__data__" in node) subnode.__data__ = node.__data__;
3647         subgroup[i] = subnode;
3648         schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3649       }
3650     }
3651   }
3652
3653   return new Transition(subgroups, this._parents, name, id);
3654 };
3655
3656 var transition_selectAll = function(select) {
3657   var name = this._name,
3658       id = this._id;
3659
3660   if (typeof select !== "function") select = selectorAll(select);
3661
3662   for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3663     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3664       if (node = group[i]) {
3665         for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3666           if (child = children[k]) {
3667             schedule(child, name, id, k, children, inherit);
3668           }
3669         }
3670         subgroups.push(children);
3671         parents.push(node);
3672       }
3673     }
3674   }
3675
3676   return new Transition(subgroups, parents, name, id);
3677 };
3678
3679 var Selection$1 = selection.prototype.constructor;
3680
3681 var transition_selection = function() {
3682   return new Selection$1(this._groups, this._parents);
3683 };
3684
3685 function styleRemove$1(name, interpolate$$1) {
3686   var value00,
3687       value10,
3688       interpolate0;
3689   return function() {
3690     var value0 = styleValue(this, name),
3691         value1 = (this.style.removeProperty(name), styleValue(this, name));
3692     return value0 === value1 ? null
3693         : value0 === value00 && value1 === value10 ? interpolate0
3694         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3695   };
3696 }
3697
3698 function styleRemoveEnd(name) {
3699   return function() {
3700     this.style.removeProperty(name);
3701   };
3702 }
3703
3704 function styleConstant$1(name, interpolate$$1, value1) {
3705   var value00,
3706       interpolate0;
3707   return function() {
3708     var value0 = styleValue(this, name);
3709     return value0 === value1 ? null
3710         : value0 === value00 ? interpolate0
3711         : interpolate0 = interpolate$$1(value00 = value0, value1);
3712   };
3713 }
3714
3715 function styleFunction$1(name, interpolate$$1, value) {
3716   var value00,
3717       value10,
3718       interpolate0;
3719   return function() {
3720     var value0 = styleValue(this, name),
3721         value1 = value(this);
3722     if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3723     return value0 === value1 ? null
3724         : value0 === value00 && value1 === value10 ? interpolate0
3725         : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3726   };
3727 }
3728
3729 var transition_style = function(name, value, priority) {
3730   var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
3731   return value == null ? this
3732           .styleTween(name, styleRemove$1(name, i))
3733           .on("end.style." + name, styleRemoveEnd(name))
3734       : this.styleTween(name, typeof value === "function"
3735           ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3736           : styleConstant$1(name, i, value + ""), priority);
3737 };
3738
3739 function styleTween(name, value, priority) {
3740   function tween() {
3741     var node = this, i = value.apply(node, arguments);
3742     return i && function(t) {
3743       node.style.setProperty(name, i(t), priority);
3744     };
3745   }
3746   tween._value = value;
3747   return tween;
3748 }
3749
3750 var transition_styleTween = function(name, value, priority) {
3751   var key = "style." + (name += "");
3752   if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3753   if (value == null) return this.tween(key, null);
3754   if (typeof value !== "function") throw new Error;
3755   return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3756 };
3757
3758 function textConstant$1(value) {
3759   return function() {
3760     this.textContent = value;
3761   };
3762 }
3763
3764 function textFunction$1(value) {
3765   return function() {
3766     var value1 = value(this);
3767     this.textContent = value1 == null ? "" : value1;
3768   };
3769 }
3770
3771 var transition_text = function(value) {
3772   return this.tween("text", typeof value === "function"
3773       ? textFunction$1(tweenValue(this, "text", value))
3774       : textConstant$1(value == null ? "" : value + ""));
3775 };
3776
3777 var transition_transition = function() {
3778   var name = this._name,
3779       id0 = this._id,
3780       id1 = newId();
3781
3782   for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3783     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3784       if (node = group[i]) {
3785         var inherit = get$1(node, id0);
3786         schedule(node, name, id1, i, group, {
3787           time: inherit.time + inherit.delay + inherit.duration,
3788           delay: 0,
3789           duration: inherit.duration,
3790           ease: inherit.ease
3791         });
3792       }
3793     }
3794   }
3795
3796   return new Transition(groups, this._parents, name, id1);
3797 };
3798
3799 var id = 0;
3800
3801 function Transition(groups, parents, name, id) {
3802   this._groups = groups;
3803   this._parents = parents;
3804   this._name = name;
3805   this._id = id;
3806 }
3807
3808 function transition(name) {
3809   return selection().transition(name);
3810 }
3811
3812 function newId() {
3813   return ++id;
3814 }
3815
3816 var selection_prototype = selection.prototype;
3817
3818 Transition.prototype = transition.prototype = {
3819   constructor: Transition,
3820   select: transition_select,
3821   selectAll: transition_selectAll,
3822   filter: transition_filter,
3823   merge: transition_merge,
3824   selection: transition_selection,
3825   transition: transition_transition,
3826   call: selection_prototype.call,
3827   nodes: selection_prototype.nodes,
3828   node: selection_prototype.node,
3829   size: selection_prototype.size,
3830   empty: selection_prototype.empty,
3831   each: selection_prototype.each,
3832   on: transition_on,
3833   attr: transition_attr,
3834   attrTween: transition_attrTween,
3835   style: transition_style,
3836   styleTween: transition_styleTween,
3837   text: transition_text,
3838   remove: transition_remove,
3839   tween: transition_tween,
3840   delay: transition_delay,
3841   duration: transition_duration,
3842   ease: transition_ease
3843 };
3844
3845 function linear$1(t) {
3846   return +t;
3847 }
3848
3849 function quadIn(t) {
3850   return t * t;
3851 }
3852
3853 function quadOut(t) {
3854   return t * (2 - t);
3855 }
3856
3857 function quadInOut(t) {
3858   return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3859 }
3860
3861 function cubicIn(t) {
3862   return t * t * t;
3863 }
3864
3865 function cubicOut(t) {
3866   return --t * t * t + 1;
3867 }
3868
3869 function cubicInOut(t) {
3870   return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3871 }
3872
3873 var exponent = 3;
3874
3875 var polyIn = (function custom(e) {
3876   e = +e;
3877
3878   function polyIn(t) {
3879     return Math.pow(t, e);
3880   }
3881
3882   polyIn.exponent = custom;
3883
3884   return polyIn;
3885 })(exponent);
3886
3887 var polyOut = (function custom(e) {
3888   e = +e;
3889
3890   function polyOut(t) {
3891     return 1 - Math.pow(1 - t, e);
3892   }
3893
3894   polyOut.exponent = custom;
3895
3896   return polyOut;
3897 })(exponent);
3898
3899 var polyInOut = (function custom(e) {
3900   e = +e;
3901
3902   function polyInOut(t) {
3903     return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3904   }
3905
3906   polyInOut.exponent = custom;
3907
3908   return polyInOut;
3909 })(exponent);
3910
3911 var pi = Math.PI;
3912 var halfPi = pi / 2;
3913
3914 function sinIn(t) {
3915   return 1 - Math.cos(t * halfPi);
3916 }
3917
3918 function sinOut(t) {
3919   return Math.sin(t * halfPi);
3920 }
3921
3922 function sinInOut(t) {
3923   return (1 - Math.cos(pi * t)) / 2;
3924 }
3925
3926 function expIn(t) {
3927   return Math.pow(2, 10 * t - 10);
3928 }
3929
3930 function expOut(t) {
3931   return 1 - Math.pow(2, -10 * t);
3932 }
3933
3934 function expInOut(t) {
3935   return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3936 }
3937
3938 function circleIn(t) {
3939   return 1 - Math.sqrt(1 - t * t);
3940 }
3941
3942 function circleOut(t) {
3943   return Math.sqrt(1 - --t * t);
3944 }
3945
3946 function circleInOut(t) {
3947   return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3948 }
3949
3950 var b1 = 4 / 11;
3951 var b2 = 6 / 11;
3952 var b3 = 8 / 11;
3953 var b4 = 3 / 4;
3954 var b5 = 9 / 11;
3955 var b6 = 10 / 11;
3956 var b7 = 15 / 16;
3957 var b8 = 21 / 22;
3958 var b9 = 63 / 64;
3959 var b0 = 1 / b1 / b1;
3960
3961 function bounceIn(t) {
3962   return 1 - bounceOut(1 - t);
3963 }
3964
3965 function bounceOut(t) {
3966   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;
3967 }
3968
3969 function bounceInOut(t) {
3970   return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3971 }
3972
3973 var overshoot = 1.70158;
3974
3975 var backIn = (function custom(s) {
3976   s = +s;
3977
3978   function backIn(t) {
3979     return t * t * ((s + 1) * t - s);
3980   }
3981
3982   backIn.overshoot = custom;
3983
3984   return backIn;
3985 })(overshoot);
3986
3987 var backOut = (function custom(s) {
3988   s = +s;
3989
3990   function backOut(t) {
3991     return --t * t * ((s + 1) * t + s) + 1;
3992   }
3993
3994   backOut.overshoot = custom;
3995
3996   return backOut;
3997 })(overshoot);
3998
3999 var backInOut = (function custom(s) {
4000   s = +s;
4001
4002   function backInOut(t) {
4003     return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4004   }
4005
4006   backInOut.overshoot = custom;
4007
4008   return backInOut;
4009 })(overshoot);
4010
4011 var tau = 2 * Math.PI;
4012 var amplitude = 1;
4013 var period = 0.3;
4014
4015 var elasticIn = (function custom(a, p) {
4016   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4017
4018   function elasticIn(t) {
4019     return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4020   }
4021
4022   elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4023   elasticIn.period = function(p) { return custom(a, p); };
4024
4025   return elasticIn;
4026 })(amplitude, period);
4027
4028 var elasticOut = (function custom(a, p) {
4029   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4030
4031   function elasticOut(t) {
4032     return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4033   }
4034
4035   elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4036   elasticOut.period = function(p) { return custom(a, p); };
4037
4038   return elasticOut;
4039 })(amplitude, period);
4040
4041 var elasticInOut = (function custom(a, p) {
4042   var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4043
4044   function elasticInOut(t) {
4045     return ((t = t * 2 - 1) < 0
4046         ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4047         : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4048   }
4049
4050   elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4051   elasticInOut.period = function(p) { return custom(a, p); };
4052
4053   return elasticInOut;
4054 })(amplitude, period);
4055
4056 var defaultTiming = {
4057   time: null, // Set on use.
4058   delay: 0,
4059   duration: 250,
4060   ease: cubicInOut
4061 };
4062
4063 function inherit(node, id) {
4064   var timing;
4065   while (!(timing = node.__transition) || !(timing = timing[id])) {
4066     if (!(node = node.parentNode)) {
4067       return defaultTiming.time = now(), defaultTiming;
4068     }
4069   }
4070   return timing;
4071 }
4072
4073 var selection_transition = function(name) {
4074   var id,
4075       timing;
4076
4077   if (name instanceof Transition) {
4078     id = name._id, name = name._name;
4079   } else {
4080     id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4081   }
4082
4083   for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4084     for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4085       if (node = group[i]) {
4086         schedule(node, name, id, i, group, timing || inherit(node, id));
4087       }
4088     }
4089   }
4090
4091   return new Transition(groups, this._parents, name, id);
4092 };
4093
4094 selection.prototype.interrupt = selection_interrupt;
4095 selection.prototype.transition = selection_transition;
4096
4097 var root$1 = [null];
4098
4099 var active = function(node, name) {
4100   var schedules = node.__transition,
4101       schedule$$1,
4102       i;
4103
4104   if (schedules) {
4105     name = name == null ? null : name + "";
4106     for (i in schedules) {
4107       if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4108         return new Transition([[node]], root$1, name, +i);
4109       }
4110     }
4111   }
4112
4113   return null;
4114 };
4115
4116 var constant$4 = function(x) {
4117   return function() {
4118     return x;
4119   };
4120 };
4121
4122 var BrushEvent = function(target, type, selection) {
4123   this.target = target;
4124   this.type = type;
4125   this.selection = selection;
4126 };
4127
4128 function nopropagation$1() {
4129   event.stopImmediatePropagation();
4130 }
4131
4132 var noevent$1 = function() {
4133   event.preventDefault();
4134   event.stopImmediatePropagation();
4135 };
4136
4137 var MODE_DRAG = {name: "drag"};
4138 var MODE_SPACE = {name: "space"};
4139 var MODE_HANDLE = {name: "handle"};
4140 var MODE_CENTER = {name: "center"};
4141
4142 var X = {
4143   name: "x",
4144   handles: ["e", "w"].map(type),
4145   input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4146   output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4147 };
4148
4149 var Y = {
4150   name: "y",
4151   handles: ["n", "s"].map(type),
4152   input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4153   output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4154 };
4155
4156 var XY = {
4157   name: "xy",
4158   handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4159   input: function(xy) { return xy; },
4160   output: function(xy) { return xy; }
4161 };
4162
4163 var cursors = {
4164   overlay: "crosshair",
4165   selection: "move",
4166   n: "ns-resize",
4167   e: "ew-resize",
4168   s: "ns-resize",
4169   w: "ew-resize",
4170   nw: "nwse-resize",
4171   ne: "nesw-resize",
4172   se: "nwse-resize",
4173   sw: "nesw-resize"
4174 };
4175
4176 var flipX = {
4177   e: "w",
4178   w: "e",
4179   nw: "ne",
4180   ne: "nw",
4181   se: "sw",
4182   sw: "se"
4183 };
4184
4185 var flipY = {
4186   n: "s",
4187   s: "n",
4188   nw: "sw",
4189   ne: "se",
4190   se: "ne",
4191   sw: "nw"
4192 };
4193
4194 var signsX = {
4195   overlay: +1,
4196   selection: +1,
4197   n: null,
4198   e: +1,
4199   s: null,
4200   w: -1,
4201   nw: -1,
4202   ne: +1,
4203   se: +1,
4204   sw: -1
4205 };
4206
4207 var signsY = {
4208   overlay: +1,
4209   selection: +1,
4210   n: -1,
4211   e: null,
4212   s: +1,
4213   w: null,
4214   nw: -1,
4215   ne: -1,
4216   se: +1,
4217   sw: +1
4218 };
4219
4220 function type(t) {
4221   return {type: t};
4222 }
4223
4224 // Ignore right-click, since that should open the context menu.
4225 function defaultFilter() {
4226   return !event.button;
4227 }
4228
4229 function defaultExtent() {
4230   var svg = this.ownerSVGElement || this;
4231   return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4232 }
4233
4234 // Like d3.local, but with the name “__brush” rather than auto-generated.
4235 function local$$1(node) {
4236   while (!node.__brush) if (!(node = node.parentNode)) return;
4237   return node.__brush;
4238 }
4239
4240 function empty(extent) {
4241   return extent[0][0] === extent[1][0]
4242       || extent[0][1] === extent[1][1];
4243 }
4244
4245 function brushSelection(node) {
4246   var state = node.__brush;
4247   return state ? state.dim.output(state.selection) : null;
4248 }
4249
4250 function brushX() {
4251   return brush$1(X);
4252 }
4253
4254 function brushY() {
4255   return brush$1(Y);
4256 }
4257
4258 var brush = function() {
4259   return brush$1(XY);
4260 };
4261
4262 function brush$1(dim) {
4263   var extent = defaultExtent,
4264       filter = defaultFilter,
4265       listeners = dispatch(brush, "start", "brush", "end"),
4266       handleSize = 6,
4267       touchending;
4268
4269   function brush(group) {
4270     var overlay = group
4271         .property("__brush", initialize)
4272       .selectAll(".overlay")
4273       .data([type("overlay")]);
4274
4275     overlay.enter().append("rect")
4276         .attr("class", "overlay")
4277         .attr("pointer-events", "all")
4278         .attr("cursor", cursors.overlay)
4279       .merge(overlay)
4280         .each(function() {
4281           var extent = local$$1(this).extent;
4282           d3_select(this)
4283               .attr("x", extent[0][0])
4284               .attr("y", extent[0][1])
4285               .attr("width", extent[1][0] - extent[0][0])
4286               .attr("height", extent[1][1] - extent[0][1]);
4287         });
4288
4289     group.selectAll(".selection")
4290       .data([type("selection")])
4291       .enter().append("rect")
4292         .attr("class", "selection")
4293         .attr("cursor", cursors.selection)
4294         .attr("fill", "#777")
4295         .attr("fill-opacity", 0.3)
4296         .attr("stroke", "#fff")
4297         .attr("shape-rendering", "crispEdges");
4298
4299     var handle = group.selectAll(".handle")
4300       .data(dim.handles, function(d) { return d.type; });
4301
4302     handle.exit().remove();
4303
4304     handle.enter().append("rect")
4305         .attr("class", function(d) { return "handle handle--" + d.type; })
4306         .attr("cursor", function(d) { return cursors[d.type]; });
4307
4308     group
4309         .each(redraw)
4310         .attr("fill", "none")
4311         .attr("pointer-events", "all")
4312         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4313         .on("mousedown.brush touchstart.brush", started);
4314   }
4315
4316   brush.move = function(group, selection) {
4317     if (group.selection) {
4318       group
4319           .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4320           .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4321           .tween("brush", function() {
4322             var that = this,
4323                 state = that.__brush,
4324                 emit = emitter(that, arguments),
4325                 selection0 = state.selection,
4326                 selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
4327                 i = d3_interpolate(selection0, selection1);
4328
4329             function tween(t) {
4330               state.selection = t === 1 && empty(selection1) ? null : i(t);
4331               redraw.call(that);
4332               emit.brush();
4333             }
4334
4335             return selection0 && selection1 ? tween : tween(1);
4336           });
4337     } else {
4338       group
4339           .each(function() {
4340             var that = this,
4341                 args = arguments,
4342                 state = that.__brush,
4343                 selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
4344                 emit = emitter(that, args).beforestart();
4345
4346             interrupt(that);
4347             state.selection = selection1 == null || empty(selection1) ? null : selection1;
4348             redraw.call(that);
4349             emit.start().brush().end();
4350           });
4351     }
4352   };
4353
4354   function redraw() {
4355     var group = d3_select(this),
4356         selection = local$$1(this).selection;
4357
4358     if (selection) {
4359       group.selectAll(".selection")
4360           .style("display", null)
4361           .attr("x", selection[0][0])
4362           .attr("y", selection[0][1])
4363           .attr("width", selection[1][0] - selection[0][0])
4364           .attr("height", selection[1][1] - selection[0][1]);
4365
4366       group.selectAll(".handle")
4367           .style("display", null)
4368           .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
4369           .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
4370           .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
4371           .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
4372     }
4373
4374     else {
4375       group.selectAll(".selection,.handle")
4376           .style("display", "none")
4377           .attr("x", null)
4378           .attr("y", null)
4379           .attr("width", null)
4380           .attr("height", null);
4381     }
4382   }
4383
4384   function emitter(that, args) {
4385     return that.__brush.emitter || new Emitter(that, args);
4386   }
4387
4388   function Emitter(that, args) {
4389     this.that = that;
4390     this.args = args;
4391     this.state = that.__brush;
4392     this.active = 0;
4393   }
4394
4395   Emitter.prototype = {
4396     beforestart: function() {
4397       if (++this.active === 1) this.state.emitter = this, this.starting = true;
4398       return this;
4399     },
4400     start: function() {
4401       if (this.starting) this.starting = false, this.emit("start");
4402       return this;
4403     },
4404     brush: function() {
4405       this.emit("brush");
4406       return this;
4407     },
4408     end: function() {
4409       if (--this.active === 0) delete this.state.emitter, this.emit("end");
4410       return this;
4411     },
4412     emit: function(type) {
4413       customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4414     }
4415   };
4416
4417   function started() {
4418     if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4419     else if (touchending) return;
4420     if (!filter.apply(this, arguments)) return;
4421
4422     var that = this,
4423         type = event.target.__data__.type,
4424         mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4425         signX = dim === Y ? null : signsX[type],
4426         signY = dim === X ? null : signsY[type],
4427         state = local$$1(that),
4428         extent = state.extent,
4429         selection = state.selection,
4430         W = extent[0][0], w0, w1,
4431         N = extent[0][1], n0, n1,
4432         E = extent[1][0], e0, e1,
4433         S = extent[1][1], s0, s1,
4434         dx,
4435         dy,
4436         moving,
4437         shifting = signX && signY && event.shiftKey,
4438         lockX,
4439         lockY,
4440         point0 = d3_mouse(that),
4441         point = point0,
4442         emit = emitter(that, arguments).beforestart();
4443
4444     if (type === "overlay") {
4445       state.selection = selection = [
4446         [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4447         [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4448       ];
4449     } else {
4450       w0 = selection[0][0];
4451       n0 = selection[0][1];
4452       e0 = selection[1][0];
4453       s0 = selection[1][1];
4454     }
4455
4456     w1 = w0;
4457     n1 = n0;
4458     e1 = e0;
4459     s1 = s0;
4460
4461     var group = d3_select(that)
4462         .attr("pointer-events", "none");
4463
4464     var overlay = group.selectAll(".overlay")
4465         .attr("cursor", cursors[type]);
4466
4467     if (event.touches) {
4468       group
4469           .on("touchmove.brush", moved, true)
4470           .on("touchend.brush touchcancel.brush", ended, true);
4471     } else {
4472       var view = d3_select(event.view)
4473           .on("keydown.brush", keydowned, true)
4474           .on("keyup.brush", keyupped, true)
4475           .on("mousemove.brush", moved, true)
4476           .on("mouseup.brush", ended, true);
4477
4478       dragDisable(event.view);
4479     }
4480
4481     nopropagation$1();
4482     interrupt(that);
4483     redraw.call(that);
4484     emit.start();
4485
4486     function moved() {
4487       var point1 = d3_mouse(that);
4488       if (shifting && !lockX && !lockY) {
4489         if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
4490         else lockX = true;
4491       }
4492       point = point1;
4493       moving = true;
4494       noevent$1();
4495       move();
4496     }
4497
4498     function move() {
4499       var t;
4500
4501       dx = point[0] - point0[0];
4502       dy = point[1] - point0[1];
4503
4504       switch (mode) {
4505         case MODE_SPACE:
4506         case MODE_DRAG: {
4507           if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4508           if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4509           break;
4510         }
4511         case MODE_HANDLE: {
4512           if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4513           else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4514           if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4515           else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4516           break;
4517         }
4518         case MODE_CENTER: {
4519           if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4520           if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4521           break;
4522         }
4523       }
4524
4525       if (e1 < w1) {
4526         signX *= -1;
4527         t = w0, w0 = e0, e0 = t;
4528         t = w1, w1 = e1, e1 = t;
4529         if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4530       }
4531
4532       if (s1 < n1) {
4533         signY *= -1;
4534         t = n0, n0 = s0, s0 = t;
4535         t = n1, n1 = s1, s1 = t;
4536         if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4537       }
4538
4539       if (state.selection) selection = state.selection; // May be set by brush.move!
4540       if (lockX) w1 = selection[0][0], e1 = selection[1][0];
4541       if (lockY) n1 = selection[0][1], s1 = selection[1][1];
4542
4543       if (selection[0][0] !== w1
4544           || selection[0][1] !== n1
4545           || selection[1][0] !== e1
4546           || selection[1][1] !== s1) {
4547         state.selection = [[w1, n1], [e1, s1]];
4548         redraw.call(that);
4549         emit.brush();
4550       }
4551     }
4552
4553     function ended() {
4554       nopropagation$1();
4555       if (event.touches) {
4556         if (event.touches.length) return;
4557         if (touchending) clearTimeout(touchending);
4558         touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4559         group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4560       } else {
4561         yesdrag(event.view, moving);
4562         view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4563       }
4564       group.attr("pointer-events", "all");
4565       overlay.attr("cursor", cursors.overlay);
4566       if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
4567       if (empty(selection)) state.selection = null, redraw.call(that);
4568       emit.end();
4569     }
4570
4571     function keydowned() {
4572       switch (event.keyCode) {
4573         case 16: { // SHIFT
4574           shifting = signX && signY;
4575           break;
4576         }
4577         case 18: { // ALT
4578           if (mode === MODE_HANDLE) {
4579             if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4580             if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4581             mode = MODE_CENTER;
4582             move();
4583           }
4584           break;
4585         }
4586         case 32: { // SPACE; takes priority over ALT
4587           if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4588             if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4589             if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4590             mode = MODE_SPACE;
4591             overlay.attr("cursor", cursors.selection);
4592             move();
4593           }
4594           break;
4595         }
4596         default: return;
4597       }
4598       noevent$1();
4599     }
4600
4601     function keyupped() {
4602       switch (event.keyCode) {
4603         case 16: { // SHIFT
4604           if (shifting) {
4605             lockX = lockY = shifting = false;
4606             move();
4607           }
4608           break;
4609         }
4610         case 18: { // ALT
4611           if (mode === MODE_CENTER) {
4612             if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4613             if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4614             mode = MODE_HANDLE;
4615             move();
4616           }
4617           break;
4618         }
4619         case 32: { // SPACE
4620           if (mode === MODE_SPACE) {
4621             if (event.altKey) {
4622               if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4623               if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4624               mode = MODE_CENTER;
4625             } else {
4626               if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4627               if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4628               mode = MODE_HANDLE;
4629             }
4630             overlay.attr("cursor", cursors[type]);
4631             move();
4632           }
4633           break;
4634         }
4635         default: return;
4636       }
4637       noevent$1();
4638     }
4639   }
4640
4641   function initialize() {
4642     var state = this.__brush || {selection: null};
4643     state.extent = extent.apply(this, arguments);
4644     state.dim = dim;
4645     return state;
4646   }
4647
4648   brush.extent = function(_) {
4649     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4650   };
4651
4652   brush.filter = function(_) {
4653     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4654   };
4655
4656   brush.handleSize = function(_) {
4657     return arguments.length ? (handleSize = +_, brush) : handleSize;
4658   };
4659
4660   brush.on = function() {
4661     var value = listeners.on.apply(listeners, arguments);
4662     return value === listeners ? brush : value;
4663   };
4664
4665   return brush;
4666 }
4667
4668 var cos = Math.cos;
4669 var sin = Math.sin;
4670 var pi$1 = Math.PI;
4671 var halfPi$1 = pi$1 / 2;
4672 var tau$1 = pi$1 * 2;
4673 var max$1 = Math.max;
4674
4675 function compareValue(compare) {
4676   return function(a, b) {
4677     return compare(
4678       a.source.value + a.target.value,
4679       b.source.value + b.target.value
4680     );
4681   };
4682 }
4683
4684 var chord = function() {
4685   var padAngle = 0,
4686       sortGroups = null,
4687       sortSubgroups = null,
4688       sortChords = null;
4689
4690   function chord(matrix) {
4691     var n = matrix.length,
4692         groupSums = [],
4693         groupIndex = d3_range(n),
4694         subgroupIndex = [],
4695         chords = [],
4696         groups = chords.groups = new Array(n),
4697         subgroups = new Array(n * n),
4698         k,
4699         x,
4700         x0,
4701         dx,
4702         i,
4703         j;
4704
4705     // Compute the sum.
4706     k = 0, i = -1; while (++i < n) {
4707       x = 0, j = -1; while (++j < n) {
4708         x += matrix[i][j];
4709       }
4710       groupSums.push(x);
4711       subgroupIndex.push(d3_range(n));
4712       k += x;
4713     }
4714
4715     // Sort groups…
4716     if (sortGroups) groupIndex.sort(function(a, b) {
4717       return sortGroups(groupSums[a], groupSums[b]);
4718     });
4719
4720     // Sort subgroups…
4721     if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4722       d.sort(function(a, b) {
4723         return sortSubgroups(matrix[i][a], matrix[i][b]);
4724       });
4725     });
4726
4727     // Convert the sum to scaling factor for [0, 2pi].
4728     // TODO Allow start and end angle to be specified?
4729     // TODO Allow padding to be specified as percentage?
4730     k = max$1(0, tau$1 - padAngle * n) / k;
4731     dx = k ? padAngle : tau$1 / n;
4732
4733     // Compute the start and end angle for each group and subgroup.
4734     // Note: Opera has a bug reordering object literal properties!
4735     x = 0, i = -1; while (++i < n) {
4736       x0 = x, j = -1; while (++j < n) {
4737         var di = groupIndex[i],
4738             dj = subgroupIndex[di][j],
4739             v = matrix[di][dj],
4740             a0 = x,
4741             a1 = x += v * k;
4742         subgroups[dj * n + di] = {
4743           index: di,
4744           subindex: dj,
4745           startAngle: a0,
4746           endAngle: a1,
4747           value: v
4748         };
4749       }
4750       groups[di] = {
4751         index: di,
4752         startAngle: x0,
4753         endAngle: x,
4754         value: groupSums[di]
4755       };
4756       x += dx;
4757     }
4758
4759     // Generate chords for each (non-empty) subgroup-subgroup link.
4760     i = -1; while (++i < n) {
4761       j = i - 1; while (++j < n) {
4762         var source = subgroups[j * n + i],
4763             target = subgroups[i * n + j];
4764         if (source.value || target.value) {
4765           chords.push(source.value < target.value
4766               ? {source: target, target: source}
4767               : {source: source, target: target});
4768         }
4769       }
4770     }
4771
4772     return sortChords ? chords.sort(sortChords) : chords;
4773   }
4774
4775   chord.padAngle = function(_) {
4776     return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4777   };
4778
4779   chord.sortGroups = function(_) {
4780     return arguments.length ? (sortGroups = _, chord) : sortGroups;
4781   };
4782
4783   chord.sortSubgroups = function(_) {
4784     return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4785   };
4786
4787   chord.sortChords = function(_) {
4788     return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4789   };
4790
4791   return chord;
4792 };
4793
4794 var slice$2 = Array.prototype.slice;
4795
4796 var constant$5 = function(x) {
4797   return function() {
4798     return x;
4799   };
4800 };
4801
4802 var pi$2 = Math.PI;
4803 var tau$2 = 2 * pi$2;
4804 var epsilon$1 = 1e-6;
4805 var tauEpsilon = tau$2 - epsilon$1;
4806
4807 function Path() {
4808   this._x0 = this._y0 = // start of current subpath
4809   this._x1 = this._y1 = null; // end of current subpath
4810   this._ = "";
4811 }
4812
4813 function path() {
4814   return new Path;
4815 }
4816
4817 Path.prototype = path.prototype = {
4818   constructor: Path,
4819   moveTo: function(x, y) {
4820     this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4821   },
4822   closePath: function() {
4823     if (this._x1 !== null) {
4824       this._x1 = this._x0, this._y1 = this._y0;
4825       this._ += "Z";
4826     }
4827   },
4828   lineTo: function(x, y) {
4829     this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4830   },
4831   quadraticCurveTo: function(x1, y1, x, y) {
4832     this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4833   },
4834   bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4835     this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4836   },
4837   arcTo: function(x1, y1, x2, y2, r) {
4838     x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4839     var x0 = this._x1,
4840         y0 = this._y1,
4841         x21 = x2 - x1,
4842         y21 = y2 - y1,
4843         x01 = x0 - x1,
4844         y01 = y0 - y1,
4845         l01_2 = x01 * x01 + y01 * y01;
4846
4847     // Is the radius negative? Error.
4848     if (r < 0) throw new Error("negative radius: " + r);
4849
4850     // Is this path empty? Move to (x1,y1).
4851     if (this._x1 === null) {
4852       this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4853     }
4854
4855     // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4856     else if (!(l01_2 > epsilon$1)) {}
4857
4858     // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4859     // Equivalently, is (x1,y1) coincident with (x2,y2)?
4860     // Or, is the radius zero? Line to (x1,y1).
4861     else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4862       this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4863     }
4864
4865     // Otherwise, draw an arc!
4866     else {
4867       var x20 = x2 - x0,
4868           y20 = y2 - y0,
4869           l21_2 = x21 * x21 + y21 * y21,
4870           l20_2 = x20 * x20 + y20 * y20,
4871           l21 = Math.sqrt(l21_2),
4872           l01 = Math.sqrt(l01_2),
4873           l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4874           t01 = l / l01,
4875           t21 = l / l21;
4876
4877       // If the start tangent is not coincident with (x0,y0), line to.
4878       if (Math.abs(t01 - 1) > epsilon$1) {
4879         this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4880       }
4881
4882       this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4883     }
4884   },
4885   arc: function(x, y, r, a0, a1, ccw) {
4886     x = +x, y = +y, r = +r;
4887     var dx = r * Math.cos(a0),
4888         dy = r * Math.sin(a0),
4889         x0 = x + dx,
4890         y0 = y + dy,
4891         cw = 1 ^ ccw,
4892         da = ccw ? a0 - a1 : a1 - a0;
4893
4894     // Is the radius negative? Error.
4895     if (r < 0) throw new Error("negative radius: " + r);
4896
4897     // Is this path empty? Move to (x0,y0).
4898     if (this._x1 === null) {
4899       this._ += "M" + x0 + "," + y0;
4900     }
4901
4902     // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4903     else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4904       this._ += "L" + x0 + "," + y0;
4905     }
4906
4907     // Is this arc empty? We’re done.
4908     if (!r) return;
4909
4910     // Does the angle go the wrong way? Flip the direction.
4911     if (da < 0) da = da % tau$2 + tau$2;
4912
4913     // Is this a complete circle? Draw two arcs to complete the circle.
4914     if (da > tauEpsilon) {
4915       this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4916     }
4917
4918     // Is this arc non-empty? Draw an arc!
4919     else if (da > epsilon$1) {
4920       this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4921     }
4922   },
4923   rect: function(x, y, w, h) {
4924     this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4925   },
4926   toString: function() {
4927     return this._;
4928   }
4929 };
4930
4931 function defaultSource(d) {
4932   return d.source;
4933 }
4934
4935 function defaultTarget(d) {
4936   return d.target;
4937 }
4938
4939 function defaultRadius(d) {
4940   return d.radius;
4941 }
4942
4943 function defaultStartAngle(d) {
4944   return d.startAngle;
4945 }
4946
4947 function defaultEndAngle(d) {
4948   return d.endAngle;
4949 }
4950
4951 var ribbon = function() {
4952   var source = defaultSource,
4953       target = defaultTarget,
4954       radius = defaultRadius,
4955       startAngle = defaultStartAngle,
4956       endAngle = defaultEndAngle,
4957       context = null;
4958
4959   function ribbon() {
4960     var buffer,
4961         argv = slice$2.call(arguments),
4962         s = source.apply(this, argv),
4963         t = target.apply(this, argv),
4964         sr = +radius.apply(this, (argv[0] = s, argv)),
4965         sa0 = startAngle.apply(this, argv) - halfPi$1,
4966         sa1 = endAngle.apply(this, argv) - halfPi$1,
4967         sx0 = sr * cos(sa0),
4968         sy0 = sr * sin(sa0),
4969         tr = +radius.apply(this, (argv[0] = t, argv)),
4970         ta0 = startAngle.apply(this, argv) - halfPi$1,
4971         ta1 = endAngle.apply(this, argv) - halfPi$1;
4972
4973     if (!context) context = buffer = path();
4974
4975     context.moveTo(sx0, sy0);
4976     context.arc(0, 0, sr, sa0, sa1);
4977     if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4978       context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4979       context.arc(0, 0, tr, ta0, ta1);
4980     }
4981     context.quadraticCurveTo(0, 0, sx0, sy0);
4982     context.closePath();
4983
4984     if (buffer) return context = null, buffer + "" || null;
4985   }
4986
4987   ribbon.radius = function(_) {
4988     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
4989   };
4990
4991   ribbon.startAngle = function(_) {
4992     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
4993   };
4994
4995   ribbon.endAngle = function(_) {
4996     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
4997   };
4998
4999   ribbon.source = function(_) {
5000     return arguments.length ? (source = _, ribbon) : source;
5001   };
5002
5003   ribbon.target = function(_) {
5004     return arguments.length ? (target = _, ribbon) : target;
5005   };
5006
5007   ribbon.context = function(_) {
5008     return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5009   };
5010
5011   return ribbon;
5012 };
5013
5014 var prefix = "$";
5015
5016 function Map() {}
5017
5018 Map.prototype = map$1.prototype = {
5019   constructor: Map,
5020   has: function(key) {
5021     return (prefix + key) in this;
5022   },
5023   get: function(key) {
5024     return this[prefix + key];
5025   },
5026   set: function(key, value) {
5027     this[prefix + key] = value;
5028     return this;
5029   },
5030   remove: function(key) {
5031     var property = prefix + key;
5032     return property in this && delete this[property];
5033   },
5034   clear: function() {
5035     for (var property in this) if (property[0] === prefix) delete this[property];
5036   },
5037   keys: function() {
5038     var keys = [];
5039     for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5040     return keys;
5041   },
5042   values: function() {
5043     var values = [];
5044     for (var property in this) if (property[0] === prefix) values.push(this[property]);
5045     return values;
5046   },
5047   entries: function() {
5048     var entries = [];
5049     for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5050     return entries;
5051   },
5052   size: function() {
5053     var size = 0;
5054     for (var property in this) if (property[0] === prefix) ++size;
5055     return size;
5056   },
5057   empty: function() {
5058     for (var property in this) if (property[0] === prefix) return false;
5059     return true;
5060   },
5061   each: function(f) {
5062     for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5063   }
5064 };
5065
5066 function map$1(object, f) {
5067   var map = new Map;
5068
5069   // Copy constructor.
5070   if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5071
5072   // Index array by numeric index or specified key function.
5073   else if (Array.isArray(object)) {
5074     var i = -1,
5075         n = object.length,
5076         o;
5077
5078     if (f == null) while (++i < n) map.set(i, object[i]);
5079     else while (++i < n) map.set(f(o = object[i], i, object), o);
5080   }
5081
5082   // Convert object to map.
5083   else if (object) for (var key in object) map.set(key, object[key]);
5084
5085   return map;
5086 }
5087
5088 var nest = function() {
5089   var keys = [],
5090       sortKeys = [],
5091       sortValues,
5092       rollup,
5093       nest;
5094
5095   function apply(array, depth, createResult, setResult) {
5096     if (depth >= keys.length) {
5097       if (sortValues != null) array.sort(sortValues);
5098       return rollup != null ? rollup(array) : array;
5099     }
5100
5101     var i = -1,
5102         n = array.length,
5103         key = keys[depth++],
5104         keyValue,
5105         value,
5106         valuesByKey = map$1(),
5107         values,
5108         result = createResult();
5109
5110     while (++i < n) {
5111       if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5112         values.push(value);
5113       } else {
5114         valuesByKey.set(keyValue, [value]);
5115       }
5116     }
5117
5118     valuesByKey.each(function(values, key) {
5119       setResult(result, key, apply(values, depth, createResult, setResult));
5120     });
5121
5122     return result;
5123   }
5124
5125   function entries(map, depth) {
5126     if (++depth > keys.length) return map;
5127     var array, sortKey = sortKeys[depth - 1];
5128     if (rollup != null && depth >= keys.length) array = map.entries();
5129     else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5130     return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5131   }
5132
5133   return nest = {
5134     object: function(array) { return apply(array, 0, createObject, setObject); },
5135     map: function(array) { return apply(array, 0, createMap, setMap); },
5136     entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5137     key: function(d) { keys.push(d); return nest; },
5138     sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5139     sortValues: function(order) { sortValues = order; return nest; },
5140     rollup: function(f) { rollup = f; return nest; }
5141   };
5142 };
5143
5144 function createObject() {
5145   return {};
5146 }
5147
5148 function setObject(object, key, value) {
5149   object[key] = value;
5150 }
5151
5152 function createMap() {
5153   return map$1();
5154 }
5155
5156 function setMap(map, key, value) {
5157   map.set(key, value);
5158 }
5159
5160 function Set() {}
5161
5162 var proto = map$1.prototype;
5163
5164 Set.prototype = set$2.prototype = {
5165   constructor: Set,
5166   has: proto.has,
5167   add: function(value) {
5168     value += "";
5169     this[prefix + value] = value;
5170     return this;
5171   },
5172   remove: proto.remove,
5173   clear: proto.clear,
5174   values: proto.keys,
5175   size: proto.size,
5176   empty: proto.empty,
5177   each: proto.each
5178 };
5179
5180 function set$2(object, f) {
5181   var set = new Set;
5182
5183   // Copy constructor.
5184   if (object instanceof Set) object.each(function(value) { set.add(value); });
5185
5186   // Otherwise, assume it’s an array.
5187   else if (object) {
5188     var i = -1, n = object.length;
5189     if (f == null) while (++i < n) set.add(object[i]);
5190     else while (++i < n) set.add(f(object[i], i, object));
5191   }
5192
5193   return set;
5194 }
5195
5196 var keys = function(map) {
5197   var keys = [];
5198   for (var key in map) keys.push(key);
5199   return keys;
5200 };
5201
5202 var values = function(map) {
5203   var values = [];
5204   for (var key in map) values.push(map[key]);
5205   return values;
5206 };
5207
5208 var entries = function(map) {
5209   var entries = [];
5210   for (var key in map) entries.push({key: key, value: map[key]});
5211   return entries;
5212 };
5213
5214 var EOL = {};
5215 var EOF = {};
5216 var QUOTE = 34;
5217 var NEWLINE = 10;
5218 var RETURN = 13;
5219
5220 function objectConverter(columns) {
5221   return new Function("d", "return {" + columns.map(function(name, i) {
5222     return JSON.stringify(name) + ": d[" + i + "]";
5223   }).join(",") + "}");
5224 }
5225
5226 function customConverter(columns, f) {
5227   var object = objectConverter(columns);
5228   return function(row, i) {
5229     return f(object(row), i, columns);
5230   };
5231 }
5232
5233 // Compute unique columns in order of discovery.
5234 function inferColumns(rows) {
5235   var columnSet = Object.create(null),
5236       columns = [];
5237
5238   rows.forEach(function(row) {
5239     for (var column in row) {
5240       if (!(column in columnSet)) {
5241         columns.push(columnSet[column] = column);
5242       }
5243     }
5244   });
5245
5246   return columns;
5247 }
5248
5249 var dsv = function(delimiter) {
5250   var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5251       DELIMITER = delimiter.charCodeAt(0);
5252
5253   function parse(text, f) {
5254     var convert, columns, rows = parseRows(text, function(row, i) {
5255       if (convert) return convert(row, i - 1);
5256       columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5257     });
5258     rows.columns = columns;
5259     return rows;
5260   }
5261
5262   function parseRows(text, f) {
5263     var rows = [], // output rows
5264         N = text.length,
5265         I = 0, // current character index
5266         n = 0, // current line number
5267         t, // current token
5268         eof = N <= 0, // current token followed by EOF?
5269         eol = false; // current token followed by EOL?
5270
5271     // Strip the trailing newline.
5272     if (text.charCodeAt(N - 1) === NEWLINE) --N;
5273     if (text.charCodeAt(N - 1) === RETURN) --N;
5274
5275     function token() {
5276       if (eof) return EOF;
5277       if (eol) return eol = false, EOL;
5278
5279       // Unescape quotes.
5280       var i, j = I, c;
5281       if (text.charCodeAt(j) === QUOTE) {
5282         while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5283         if ((i = I) >= N) eof = true;
5284         else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5285         else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5286         return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5287       }
5288
5289       // Find next delimiter or newline.
5290       while (I < N) {
5291         if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5292         else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5293         else if (c !== DELIMITER) continue;
5294         return text.slice(j, i);
5295       }
5296
5297       // Return last token before EOF.
5298       return eof = true, text.slice(j, N);
5299     }
5300
5301     while ((t = token()) !== EOF) {
5302       var row = [];
5303       while (t !== EOL && t !== EOF) row.push(t), t = token();
5304       if (f && (row = f(row, n++)) == null) continue;
5305       rows.push(row);
5306     }
5307
5308     return rows;
5309   }
5310
5311   function format(rows, columns) {
5312     if (columns == null) columns = inferColumns(rows);
5313     return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5314       return columns.map(function(column) {
5315         return formatValue(row[column]);
5316       }).join(delimiter);
5317     })).join("\n");
5318   }
5319
5320   function formatRows(rows) {
5321     return rows.map(formatRow).join("\n");
5322   }
5323
5324   function formatRow(row) {
5325     return row.map(formatValue).join(delimiter);
5326   }
5327
5328   function formatValue(text) {
5329     return text == null ? ""
5330         : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5331         : text;
5332   }
5333
5334   return {
5335     parse: parse,
5336     parseRows: parseRows,
5337     format: format,
5338     formatRows: formatRows
5339   };
5340 };
5341
5342 var csv = dsv(",");
5343
5344 var csvParse = csv.parse;
5345 var csvParseRows = csv.parseRows;
5346 var csvFormat = csv.format;
5347 var csvFormatRows = csv.formatRows;
5348
5349 var tsv = dsv("\t");
5350
5351 var tsvParse = tsv.parse;
5352 var tsvParseRows = tsv.parseRows;
5353 var tsvFormat = tsv.format;
5354 var tsvFormatRows = tsv.formatRows;
5355
5356 var center$1 = function(x, y) {
5357   var nodes;
5358
5359   if (x == null) x = 0;
5360   if (y == null) y = 0;
5361
5362   function force() {
5363     var i,
5364         n = nodes.length,
5365         node,
5366         sx = 0,
5367         sy = 0;
5368
5369     for (i = 0; i < n; ++i) {
5370       node = nodes[i], sx += node.x, sy += node.y;
5371     }
5372
5373     for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5374       node = nodes[i], node.x -= sx, node.y -= sy;
5375     }
5376   }
5377
5378   force.initialize = function(_) {
5379     nodes = _;
5380   };
5381
5382   force.x = function(_) {
5383     return arguments.length ? (x = +_, force) : x;
5384   };
5385
5386   force.y = function(_) {
5387     return arguments.length ? (y = +_, force) : y;
5388   };
5389
5390   return force;
5391 };
5392
5393 var constant$6 = function(x) {
5394   return function() {
5395     return x;
5396   };
5397 };
5398
5399 var jiggle = function() {
5400   return (Math.random() - 0.5) * 1e-6;
5401 };
5402
5403 var tree_add = function(d) {
5404   var x = +this._x.call(null, d),
5405       y = +this._y.call(null, d);
5406   return add(this.cover(x, y), x, y, d);
5407 };
5408
5409 function add(tree, x, y, d) {
5410   if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5411
5412   var parent,
5413       node = tree._root,
5414       leaf = {data: d},
5415       x0 = tree._x0,
5416       y0 = tree._y0,
5417       x1 = tree._x1,
5418       y1 = tree._y1,
5419       xm,
5420       ym,
5421       xp,
5422       yp,
5423       right,
5424       bottom,
5425       i,
5426       j;
5427
5428   // If the tree is empty, initialize the root as a leaf.
5429   if (!node) return tree._root = leaf, tree;
5430
5431   // Find the existing leaf for the new point, or add it.
5432   while (node.length) {
5433     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5434     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5435     if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5436   }
5437
5438   // Is the new point is exactly coincident with the existing point?
5439   xp = +tree._x.call(null, node.data);
5440   yp = +tree._y.call(null, node.data);
5441   if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5442
5443   // Otherwise, split the leaf node until the old and new point are separated.
5444   do {
5445     parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5446     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5447     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5448   } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5449   return parent[j] = node, parent[i] = leaf, tree;
5450 }
5451
5452 function addAll(data) {
5453   var d, i, n = data.length,
5454       x,
5455       y,
5456       xz = new Array(n),
5457       yz = new Array(n),
5458       x0 = Infinity,
5459       y0 = Infinity,
5460       x1 = -Infinity,
5461       y1 = -Infinity;
5462
5463   // Compute the points and their extent.
5464   for (i = 0; i < n; ++i) {
5465     if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5466     xz[i] = x;
5467     yz[i] = y;
5468     if (x < x0) x0 = x;
5469     if (x > x1) x1 = x;
5470     if (y < y0) y0 = y;
5471     if (y > y1) y1 = y;
5472   }
5473
5474   // If there were no (valid) points, inherit the existing extent.
5475   if (x1 < x0) x0 = this._x0, x1 = this._x1;
5476   if (y1 < y0) y0 = this._y0, y1 = this._y1;
5477
5478   // Expand the tree to cover the new points.
5479   this.cover(x0, y0).cover(x1, y1);
5480
5481   // Add the new points.
5482   for (i = 0; i < n; ++i) {
5483     add(this, xz[i], yz[i], data[i]);
5484   }
5485
5486   return this;
5487 }
5488
5489 var tree_cover = function(x, y) {
5490   if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5491
5492   var x0 = this._x0,
5493       y0 = this._y0,
5494       x1 = this._x1,
5495       y1 = this._y1;
5496
5497   // If the quadtree has no extent, initialize them.
5498   // Integer extent are necessary so that if we later double the extent,
5499   // the existing quadrant boundaries don’t change due to floating point error!
5500   if (isNaN(x0)) {
5501     x1 = (x0 = Math.floor(x)) + 1;
5502     y1 = (y0 = Math.floor(y)) + 1;
5503   }
5504
5505   // Otherwise, double repeatedly to cover.
5506   else if (x0 > x || x > x1 || y0 > y || y > y1) {
5507     var z = x1 - x0,
5508         node = this._root,
5509         parent,
5510         i;
5511
5512     switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5513       case 0: {
5514         do parent = new Array(4), parent[i] = node, node = parent;
5515         while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5516         break;
5517       }
5518       case 1: {
5519         do parent = new Array(4), parent[i] = node, node = parent;
5520         while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5521         break;
5522       }
5523       case 2: {
5524         do parent = new Array(4), parent[i] = node, node = parent;
5525         while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5526         break;
5527       }
5528       case 3: {
5529         do parent = new Array(4), parent[i] = node, node = parent;
5530         while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5531         break;
5532       }
5533     }
5534
5535     if (this._root && this._root.length) this._root = node;
5536   }
5537
5538   // If the quadtree covers the point already, just return.
5539   else return this;
5540
5541   this._x0 = x0;
5542   this._y0 = y0;
5543   this._x1 = x1;
5544   this._y1 = y1;
5545   return this;
5546 };
5547
5548 var tree_data = function() {
5549   var data = [];
5550   this.visit(function(node) {
5551     if (!node.length) do data.push(node.data); while (node = node.next)
5552   });
5553   return data;
5554 };
5555
5556 var tree_extent = function(_) {
5557   return arguments.length
5558       ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5559       : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5560 };
5561
5562 var Quad = function(node, x0, y0, x1, y1) {
5563   this.node = node;
5564   this.x0 = x0;
5565   this.y0 = y0;
5566   this.x1 = x1;
5567   this.y1 = y1;
5568 };
5569
5570 var tree_find = function(x, y, radius) {
5571   var data,
5572       x0 = this._x0,
5573       y0 = this._y0,
5574       x1,
5575       y1,
5576       x2,
5577       y2,
5578       x3 = this._x1,
5579       y3 = this._y1,
5580       quads = [],
5581       node = this._root,
5582       q,
5583       i;
5584
5585   if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5586   if (radius == null) radius = Infinity;
5587   else {
5588     x0 = x - radius, y0 = y - radius;
5589     x3 = x + radius, y3 = y + radius;
5590     radius *= radius;
5591   }
5592
5593   while (q = quads.pop()) {
5594
5595     // Stop searching if this quadrant can’t contain a closer node.
5596     if (!(node = q.node)
5597         || (x1 = q.x0) > x3
5598         || (y1 = q.y0) > y3
5599         || (x2 = q.x1) < x0
5600         || (y2 = q.y1) < y0) continue;
5601
5602     // Bisect the current quadrant.
5603     if (node.length) {
5604       var xm = (x1 + x2) / 2,
5605           ym = (y1 + y2) / 2;
5606
5607       quads.push(
5608         new Quad(node[3], xm, ym, x2, y2),
5609         new Quad(node[2], x1, ym, xm, y2),
5610         new Quad(node[1], xm, y1, x2, ym),
5611         new Quad(node[0], x1, y1, xm, ym)
5612       );
5613
5614       // Visit the closest quadrant first.
5615       if (i = (y >= ym) << 1 | (x >= xm)) {
5616         q = quads[quads.length - 1];
5617         quads[quads.length - 1] = quads[quads.length - 1 - i];
5618         quads[quads.length - 1 - i] = q;
5619       }
5620     }
5621
5622     // Visit this point. (Visiting coincident points isn’t necessary!)
5623     else {
5624       var dx = x - +this._x.call(null, node.data),
5625           dy = y - +this._y.call(null, node.data),
5626           d2 = dx * dx + dy * dy;
5627       if (d2 < radius) {
5628         var d = Math.sqrt(radius = d2);
5629         x0 = x - d, y0 = y - d;
5630         x3 = x + d, y3 = y + d;
5631         data = node.data;
5632       }
5633     }
5634   }
5635
5636   return data;
5637 };
5638
5639 var tree_remove = function(d) {
5640   if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5641
5642   var parent,
5643       node = this._root,
5644       retainer,
5645       previous,
5646       next,
5647       x0 = this._x0,
5648       y0 = this._y0,
5649       x1 = this._x1,
5650       y1 = this._y1,
5651       x,
5652       y,
5653       xm,
5654       ym,
5655       right,
5656       bottom,
5657       i,
5658       j;
5659
5660   // If the tree is empty, initialize the root as a leaf.
5661   if (!node) return this;
5662
5663   // Find the leaf node for the point.
5664   // While descending, also retain the deepest parent with a non-removed sibling.
5665   if (node.length) while (true) {
5666     if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5667     if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5668     if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5669     if (!node.length) break;
5670     if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5671   }
5672
5673   // Find the point to remove.
5674   while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5675   if (next = node.next) delete node.next;
5676
5677   // If there are multiple coincident points, remove just the point.
5678   if (previous) return (next ? previous.next = next : delete previous.next), this;
5679
5680   // If this is the root point, remove it.
5681   if (!parent) return this._root = next, this;
5682
5683   // Remove this leaf.
5684   next ? parent[i] = next : delete parent[i];
5685
5686   // If the parent now contains exactly one leaf, collapse superfluous parents.
5687   if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5688       && node === (parent[3] || parent[2] || parent[1] || parent[0])
5689       && !node.length) {
5690     if (retainer) retainer[j] = node;
5691     else this._root = node;
5692   }
5693
5694   return this;
5695 };
5696
5697 function removeAll(data) {
5698   for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5699   return this;
5700 }
5701
5702 var tree_root = function() {
5703   return this._root;
5704 };
5705
5706 var tree_size = function() {
5707   var size = 0;
5708   this.visit(function(node) {
5709     if (!node.length) do ++size; while (node = node.next)
5710   });
5711   return size;
5712 };
5713
5714 var tree_visit = function(callback) {
5715   var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5716   if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5717   while (q = quads.pop()) {
5718     if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5719       var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5720       if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5721       if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5722       if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5723       if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5724     }
5725   }
5726   return this;
5727 };
5728
5729 var tree_visitAfter = function(callback) {
5730   var quads = [], next = [], q;
5731   if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5732   while (q = quads.pop()) {
5733     var node = q.node;
5734     if (node.length) {
5735       var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5736       if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5737       if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5738       if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739       if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5740     }
5741     next.push(q);
5742   }
5743   while (q = next.pop()) {
5744     callback(q.node, q.x0, q.y0, q.x1, q.y1);
5745   }
5746   return this;
5747 };
5748
5749 function defaultX(d) {
5750   return d[0];
5751 }
5752
5753 var tree_x = function(_) {
5754   return arguments.length ? (this._x = _, this) : this._x;
5755 };
5756
5757 function defaultY(d) {
5758   return d[1];
5759 }
5760
5761 var tree_y = function(_) {
5762   return arguments.length ? (this._y = _, this) : this._y;
5763 };
5764
5765 function quadtree(nodes, x, y) {
5766   var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5767   return nodes == null ? tree : tree.addAll(nodes);
5768 }
5769
5770 function Quadtree(x, y, x0, y0, x1, y1) {
5771   this._x = x;
5772   this._y = y;
5773   this._x0 = x0;
5774   this._y0 = y0;
5775   this._x1 = x1;
5776   this._y1 = y1;
5777   this._root = undefined;
5778 }
5779
5780 function leaf_copy(leaf) {
5781   var copy = {data: leaf.data}, next = copy;
5782   while (leaf = leaf.next) next = next.next = {data: leaf.data};
5783   return copy;
5784 }
5785
5786 var treeProto = quadtree.prototype = Quadtree.prototype;
5787
5788 treeProto.copy = function() {
5789   var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5790       node = this._root,
5791       nodes,
5792       child;
5793
5794   if (!node) return copy;
5795
5796   if (!node.length) return copy._root = leaf_copy(node), copy;
5797
5798   nodes = [{source: node, target: copy._root = new Array(4)}];
5799   while (node = nodes.pop()) {
5800     for (var i = 0; i < 4; ++i) {
5801       if (child = node.source[i]) {
5802         if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5803         else node.target[i] = leaf_copy(child);
5804       }
5805     }
5806   }
5807
5808   return copy;
5809 };
5810
5811 treeProto.add = tree_add;
5812 treeProto.addAll = addAll;
5813 treeProto.cover = tree_cover;
5814 treeProto.data = tree_data;
5815 treeProto.extent = tree_extent;
5816 treeProto.find = tree_find;
5817 treeProto.remove = tree_remove;
5818 treeProto.removeAll = removeAll;
5819 treeProto.root = tree_root;
5820 treeProto.size = tree_size;
5821 treeProto.visit = tree_visit;
5822 treeProto.visitAfter = tree_visitAfter;
5823 treeProto.x = tree_x;
5824 treeProto.y = tree_y;
5825
5826 function x(d) {
5827   return d.x + d.vx;
5828 }
5829
5830 function y(d) {
5831   return d.y + d.vy;
5832 }
5833
5834 var collide = function(radius) {
5835   var nodes,
5836       radii,
5837       strength = 1,
5838       iterations = 1;
5839
5840   if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5841
5842   function force() {
5843     var i, n = nodes.length,
5844         tree,
5845         node,
5846         xi,
5847         yi,
5848         ri,
5849         ri2;
5850
5851     for (var k = 0; k < iterations; ++k) {
5852       tree = quadtree(nodes, x, y).visitAfter(prepare);
5853       for (i = 0; i < n; ++i) {
5854         node = nodes[i];
5855         ri = radii[node.index], ri2 = ri * ri;
5856         xi = node.x + node.vx;
5857         yi = node.y + node.vy;
5858         tree.visit(apply);
5859       }
5860     }
5861
5862     function apply(quad, x0, y0, x1, y1) {
5863       var data = quad.data, rj = quad.r, r = ri + rj;
5864       if (data) {
5865         if (data.index > node.index) {
5866           var x = xi - data.x - data.vx,
5867               y = yi - data.y - data.vy,
5868               l = x * x + y * y;
5869           if (l < r * r) {
5870             if (x === 0) x = jiggle(), l += x * x;
5871             if (y === 0) y = jiggle(), l += y * y;
5872             l = (r - (l = Math.sqrt(l))) / l * strength;
5873             node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5874             node.vy += (y *= l) * r;
5875             data.vx -= x * (r = 1 - r);
5876             data.vy -= y * r;
5877           }
5878         }
5879         return;
5880       }
5881       return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5882     }
5883   }
5884
5885   function prepare(quad) {
5886     if (quad.data) return quad.r = radii[quad.data.index];
5887     for (var i = quad.r = 0; i < 4; ++i) {
5888       if (quad[i] && quad[i].r > quad.r) {
5889         quad.r = quad[i].r;
5890       }
5891     }
5892   }
5893
5894   function initialize() {
5895     if (!nodes) return;
5896     var i, n = nodes.length, node;
5897     radii = new Array(n);
5898     for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5899   }
5900
5901   force.initialize = function(_) {
5902     nodes = _;
5903     initialize();
5904   };
5905
5906   force.iterations = function(_) {
5907     return arguments.length ? (iterations = +_, force) : iterations;
5908   };
5909
5910   force.strength = function(_) {
5911     return arguments.length ? (strength = +_, force) : strength;
5912   };
5913
5914   force.radius = function(_) {
5915     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5916   };
5917
5918   return force;
5919 };
5920
5921 function index$1(d) {
5922   return d.index;
5923 }
5924
5925 function find(nodeById, nodeId) {
5926   var node = nodeById.get(nodeId);
5927   if (!node) throw new Error("missing: " + nodeId);
5928   return node;
5929 }
5930
5931 var link = function(links) {
5932   var id = index$1,
5933       strength = defaultStrength,
5934       strengths,
5935       distance = constant$6(30),
5936       distances,
5937       nodes,
5938       count,
5939       bias,
5940       iterations = 1;
5941
5942   if (links == null) links = [];
5943
5944   function defaultStrength(link) {
5945     return 1 / Math.min(count[link.source.index], count[link.target.index]);
5946   }
5947
5948   function force(alpha) {
5949     for (var k = 0, n = links.length; k < iterations; ++k) {
5950       for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5951         link = links[i], source = link.source, target = link.target;
5952         x = target.x + target.vx - source.x - source.vx || jiggle();
5953         y = target.y + target.vy - source.y - source.vy || jiggle();
5954         l = Math.sqrt(x * x + y * y);
5955         l = (l - distances[i]) / l * alpha * strengths[i];
5956         x *= l, y *= l;
5957         target.vx -= x * (b = bias[i]);
5958         target.vy -= y * b;
5959         source.vx += x * (b = 1 - b);
5960         source.vy += y * b;
5961       }
5962     }
5963   }
5964
5965   function initialize() {
5966     if (!nodes) return;
5967
5968     var i,
5969         n = nodes.length,
5970         m = links.length,
5971         nodeById = map$1(nodes, id),
5972         link;
5973
5974     for (i = 0, count = new Array(n); i < m; ++i) {
5975       link = links[i], link.index = i;
5976       if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5977       if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5978       count[link.source.index] = (count[link.source.index] || 0) + 1;
5979       count[link.target.index] = (count[link.target.index] || 0) + 1;
5980     }
5981
5982     for (i = 0, bias = new Array(m); i < m; ++i) {
5983       link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
5984     }
5985
5986     strengths = new Array(m), initializeStrength();
5987     distances = new Array(m), initializeDistance();
5988   }
5989
5990   function initializeStrength() {
5991     if (!nodes) return;
5992
5993     for (var i = 0, n = links.length; i < n; ++i) {
5994       strengths[i] = +strength(links[i], i, links);
5995     }
5996   }
5997
5998   function initializeDistance() {
5999     if (!nodes) return;
6000
6001     for (var i = 0, n = links.length; i < n; ++i) {
6002       distances[i] = +distance(links[i], i, links);
6003     }
6004   }
6005
6006   force.initialize = function(_) {
6007     nodes = _;
6008     initialize();
6009   };
6010
6011   force.links = function(_) {
6012     return arguments.length ? (links = _, initialize(), force) : links;
6013   };
6014
6015   force.id = function(_) {
6016     return arguments.length ? (id = _, force) : id;
6017   };
6018
6019   force.iterations = function(_) {
6020     return arguments.length ? (iterations = +_, force) : iterations;
6021   };
6022
6023   force.strength = function(_) {
6024     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6025   };
6026
6027   force.distance = function(_) {
6028     return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6029   };
6030
6031   return force;
6032 };
6033
6034 function x$1(d) {
6035   return d.x;
6036 }
6037
6038 function y$1(d) {
6039   return d.y;
6040 }
6041
6042 var initialRadius = 10;
6043 var initialAngle = Math.PI * (3 - Math.sqrt(5));
6044
6045 var simulation = function(nodes) {
6046   var simulation,
6047       alpha = 1,
6048       alphaMin = 0.001,
6049       alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6050       alphaTarget = 0,
6051       velocityDecay = 0.6,
6052       forces = map$1(),
6053       stepper = timer(step),
6054       event = dispatch("tick", "end");
6055
6056   if (nodes == null) nodes = [];
6057
6058   function step() {
6059     tick();
6060     event.call("tick", simulation);
6061     if (alpha < alphaMin) {
6062       stepper.stop();
6063       event.call("end", simulation);
6064     }
6065   }
6066
6067   function tick() {
6068     var i, n = nodes.length, node;
6069
6070     alpha += (alphaTarget - alpha) * alphaDecay;
6071
6072     forces.each(function(force) {
6073       force(alpha);
6074     });
6075
6076     for (i = 0; i < n; ++i) {
6077       node = nodes[i];
6078       if (node.fx == null) node.x += node.vx *= velocityDecay;
6079       else node.x = node.fx, node.vx = 0;
6080       if (node.fy == null) node.y += node.vy *= velocityDecay;
6081       else node.y = node.fy, node.vy = 0;
6082     }
6083   }
6084
6085   function initializeNodes() {
6086     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6087       node = nodes[i], node.index = i;
6088       if (isNaN(node.x) || isNaN(node.y)) {
6089         var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6090         node.x = radius * Math.cos(angle);
6091         node.y = radius * Math.sin(angle);
6092       }
6093       if (isNaN(node.vx) || isNaN(node.vy)) {
6094         node.vx = node.vy = 0;
6095       }
6096     }
6097   }
6098
6099   function initializeForce(force) {
6100     if (force.initialize) force.initialize(nodes);
6101     return force;
6102   }
6103
6104   initializeNodes();
6105
6106   return simulation = {
6107     tick: tick,
6108
6109     restart: function() {
6110       return stepper.restart(step), simulation;
6111     },
6112
6113     stop: function() {
6114       return stepper.stop(), simulation;
6115     },
6116
6117     nodes: function(_) {
6118       return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6119     },
6120
6121     alpha: function(_) {
6122       return arguments.length ? (alpha = +_, simulation) : alpha;
6123     },
6124
6125     alphaMin: function(_) {
6126       return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6127     },
6128
6129     alphaDecay: function(_) {
6130       return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6131     },
6132
6133     alphaTarget: function(_) {
6134       return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6135     },
6136
6137     velocityDecay: function(_) {
6138       return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6139     },
6140
6141     force: function(name, _) {
6142       return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6143     },
6144
6145     find: function(x, y, radius) {
6146       var i = 0,
6147           n = nodes.length,
6148           dx,
6149           dy,
6150           d2,
6151           node,
6152           closest;
6153
6154       if (radius == null) radius = Infinity;
6155       else radius *= radius;
6156
6157       for (i = 0; i < n; ++i) {
6158         node = nodes[i];
6159         dx = x - node.x;
6160         dy = y - node.y;
6161         d2 = dx * dx + dy * dy;
6162         if (d2 < radius) closest = node, radius = d2;
6163       }
6164
6165       return closest;
6166     },
6167
6168     on: function(name, _) {
6169       return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6170     }
6171   };
6172 };
6173
6174 var manyBody = function() {
6175   var nodes,
6176       node,
6177       alpha,
6178       strength = constant$6(-30),
6179       strengths,
6180       distanceMin2 = 1,
6181       distanceMax2 = Infinity,
6182       theta2 = 0.81;
6183
6184   function force(_) {
6185     var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6186     for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6187   }
6188
6189   function initialize() {
6190     if (!nodes) return;
6191     var i, n = nodes.length, node;
6192     strengths = new Array(n);
6193     for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6194   }
6195
6196   function accumulate(quad) {
6197     var strength = 0, q, c, weight = 0, x, y, i;
6198
6199     // For internal nodes, accumulate forces from child quadrants.
6200     if (quad.length) {
6201       for (x = y = i = 0; i < 4; ++i) {
6202         if ((q = quad[i]) && (c = Math.abs(q.value))) {
6203           strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6204         }
6205       }
6206       quad.x = x / weight;
6207       quad.y = y / weight;
6208     }
6209
6210     // For leaf nodes, accumulate forces from coincident quadrants.
6211     else {
6212       q = quad;
6213       q.x = q.data.x;
6214       q.y = q.data.y;
6215       do strength += strengths[q.data.index];
6216       while (q = q.next);
6217     }
6218
6219     quad.value = strength;
6220   }
6221
6222   function apply(quad, x1, _, x2) {
6223     if (!quad.value) return true;
6224
6225     var x = quad.x - node.x,
6226         y = quad.y - node.y,
6227         w = x2 - x1,
6228         l = x * x + y * y;
6229
6230     // Apply the Barnes-Hut approximation if possible.
6231     // Limit forces for very close nodes; randomize direction if coincident.
6232     if (w * w / theta2 < l) {
6233       if (l < distanceMax2) {
6234         if (x === 0) x = jiggle(), l += x * x;
6235         if (y === 0) y = jiggle(), l += y * y;
6236         if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6237         node.vx += x * quad.value * alpha / l;
6238         node.vy += y * quad.value * alpha / l;
6239       }
6240       return true;
6241     }
6242
6243     // Otherwise, process points directly.
6244     else if (quad.length || l >= distanceMax2) return;
6245
6246     // Limit forces for very close nodes; randomize direction if coincident.
6247     if (quad.data !== node || quad.next) {
6248       if (x === 0) x = jiggle(), l += x * x;
6249       if (y === 0) y = jiggle(), l += y * y;
6250       if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6251     }
6252
6253     do if (quad.data !== node) {
6254       w = strengths[quad.data.index] * alpha / l;
6255       node.vx += x * w;
6256       node.vy += y * w;
6257     } while (quad = quad.next);
6258   }
6259
6260   force.initialize = function(_) {
6261     nodes = _;
6262     initialize();
6263   };
6264
6265   force.strength = function(_) {
6266     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6267   };
6268
6269   force.distanceMin = function(_) {
6270     return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6271   };
6272
6273   force.distanceMax = function(_) {
6274     return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6275   };
6276
6277   force.theta = function(_) {
6278     return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6279   };
6280
6281   return force;
6282 };
6283
6284 var radial = function(radius, x, y) {
6285   var nodes,
6286       strength = constant$6(0.1),
6287       strengths,
6288       radiuses;
6289
6290   if (typeof radius !== "function") radius = constant$6(+radius);
6291   if (x == null) x = 0;
6292   if (y == null) y = 0;
6293
6294   function force(alpha) {
6295     for (var i = 0, n = nodes.length; i < n; ++i) {
6296       var node = nodes[i],
6297           dx = node.x - x || 1e-6,
6298           dy = node.y - y || 1e-6,
6299           r = Math.sqrt(dx * dx + dy * dy),
6300           k = (radiuses[i] - r) * strengths[i] * alpha / r;
6301       node.vx += dx * k;
6302       node.vy += dy * k;
6303     }
6304   }
6305
6306   function initialize() {
6307     if (!nodes) return;
6308     var i, n = nodes.length;
6309     strengths = new Array(n);
6310     radiuses = new Array(n);
6311     for (i = 0; i < n; ++i) {
6312       radiuses[i] = +radius(nodes[i], i, nodes);
6313       strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6314     }
6315   }
6316
6317   force.initialize = function(_) {
6318     nodes = _, initialize();
6319   };
6320
6321   force.strength = function(_) {
6322     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6323   };
6324
6325   force.radius = function(_) {
6326     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6327   };
6328
6329   force.x = function(_) {
6330     return arguments.length ? (x = +_, force) : x;
6331   };
6332
6333   force.y = function(_) {
6334     return arguments.length ? (y = +_, force) : y;
6335   };
6336
6337   return force;
6338 };
6339
6340 var x$2 = function(x) {
6341   var strength = constant$6(0.1),
6342       nodes,
6343       strengths,
6344       xz;
6345
6346   if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6347
6348   function force(alpha) {
6349     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6350       node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6351     }
6352   }
6353
6354   function initialize() {
6355     if (!nodes) return;
6356     var i, n = nodes.length;
6357     strengths = new Array(n);
6358     xz = new Array(n);
6359     for (i = 0; i < n; ++i) {
6360       strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6361     }
6362   }
6363
6364   force.initialize = function(_) {
6365     nodes = _;
6366     initialize();
6367   };
6368
6369   force.strength = function(_) {
6370     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6371   };
6372
6373   force.x = function(_) {
6374     return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6375   };
6376
6377   return force;
6378 };
6379
6380 var y$2 = function(y) {
6381   var strength = constant$6(0.1),
6382       nodes,
6383       strengths,
6384       yz;
6385
6386   if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6387
6388   function force(alpha) {
6389     for (var i = 0, n = nodes.length, node; i < n; ++i) {
6390       node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6391     }
6392   }
6393
6394   function initialize() {
6395     if (!nodes) return;
6396     var i, n = nodes.length;
6397     strengths = new Array(n);
6398     yz = new Array(n);
6399     for (i = 0; i < n; ++i) {
6400       strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6401     }
6402   }
6403
6404   force.initialize = function(_) {
6405     nodes = _;
6406     initialize();
6407   };
6408
6409   force.strength = function(_) {
6410     return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6411   };
6412
6413   force.y = function(_) {
6414     return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6415   };
6416
6417   return force;
6418 };
6419
6420 // Computes the decimal coefficient and exponent of the specified number x with
6421 // significant digits p, where x is positive and p is in [1, 21] or undefined.
6422 // For example, formatDecimal(1.23) returns ["123", 0].
6423 var formatDecimal = function(x, p) {
6424   if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6425   var i, coefficient = x.slice(0, i);
6426
6427   // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6428   // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6429   return [
6430     coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6431     +x.slice(i + 1)
6432   ];
6433 };
6434
6435 var exponent$1 = function(x) {
6436   return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6437 };
6438
6439 var formatGroup = function(grouping, thousands) {
6440   return function(value, width) {
6441     var i = value.length,
6442         t = [],
6443         j = 0,
6444         g = grouping[0],
6445         length = 0;
6446
6447     while (i > 0 && g > 0) {
6448       if (length + g + 1 > width) g = Math.max(1, width - length);
6449       t.push(value.substring(i -= g, i + g));
6450       if ((length += g + 1) > width) break;
6451       g = grouping[j = (j + 1) % grouping.length];
6452     }
6453
6454     return t.reverse().join(thousands);
6455   };
6456 };
6457
6458 var formatNumerals = function(numerals) {
6459   return function(value) {
6460     return value.replace(/[0-9]/g, function(i) {
6461       return numerals[+i];
6462     });
6463   };
6464 };
6465
6466 var formatDefault = function(x, p) {
6467   x = x.toPrecision(p);
6468
6469   out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6470     switch (x[i]) {
6471       case ".": i0 = i1 = i; break;
6472       case "0": if (i0 === 0) i0 = i; i1 = i; break;
6473       case "e": break out;
6474       default: if (i0 > 0) i0 = 0; break;
6475     }
6476   }
6477
6478   return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6479 };
6480
6481 var prefixExponent;
6482
6483 var formatPrefixAuto = function(x, p) {
6484   var d = formatDecimal(x, p);
6485   if (!d) return x + "";
6486   var coefficient = d[0],
6487       exponent = d[1],
6488       i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6489       n = coefficient.length;
6490   return i === n ? coefficient
6491       : i > n ? coefficient + new Array(i - n + 1).join("0")
6492       : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6493       : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6494 };
6495
6496 var formatRounded = function(x, p) {
6497   var d = formatDecimal(x, p);
6498   if (!d) return x + "";
6499   var coefficient = d[0],
6500       exponent = d[1];
6501   return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6502       : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6503       : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6504 };
6505
6506 var formatTypes = {
6507   "": formatDefault,
6508   "%": function(x, p) { return (x * 100).toFixed(p); },
6509   "b": function(x) { return Math.round(x).toString(2); },
6510   "c": function(x) { return x + ""; },
6511   "d": function(x) { return Math.round(x).toString(10); },
6512   "e": function(x, p) { return x.toExponential(p); },
6513   "f": function(x, p) { return x.toFixed(p); },
6514   "g": function(x, p) { return x.toPrecision(p); },
6515   "o": function(x) { return Math.round(x).toString(8); },
6516   "p": function(x, p) { return formatRounded(x * 100, p); },
6517   "r": formatRounded,
6518   "s": formatPrefixAuto,
6519   "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6520   "x": function(x) { return Math.round(x).toString(16); }
6521 };
6522
6523 // [[fill]align][sign][symbol][0][width][,][.precision][type]
6524 var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6525
6526 function formatSpecifier(specifier) {
6527   return new FormatSpecifier(specifier);
6528 }
6529
6530 formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6531
6532 function FormatSpecifier(specifier) {
6533   if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6534
6535   var match,
6536       fill = match[1] || " ",
6537       align = match[2] || ">",
6538       sign = match[3] || "-",
6539       symbol = match[4] || "",
6540       zero = !!match[5],
6541       width = match[6] && +match[6],
6542       comma = !!match[7],
6543       precision = match[8] && +match[8].slice(1),
6544       type = match[9] || "";
6545
6546   // The "n" type is an alias for ",g".
6547   if (type === "n") comma = true, type = "g";
6548
6549   // Map invalid types to the default format.
6550   else if (!formatTypes[type]) type = "";
6551
6552   // If zero fill is specified, padding goes after sign and before digits.
6553   if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6554
6555   this.fill = fill;
6556   this.align = align;
6557   this.sign = sign;
6558   this.symbol = symbol;
6559   this.zero = zero;
6560   this.width = width;
6561   this.comma = comma;
6562   this.precision = precision;
6563   this.type = type;
6564 }
6565
6566 FormatSpecifier.prototype.toString = function() {
6567   return this.fill
6568       + this.align
6569       + this.sign
6570       + this.symbol
6571       + (this.zero ? "0" : "")
6572       + (this.width == null ? "" : Math.max(1, this.width | 0))
6573       + (this.comma ? "," : "")
6574       + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6575       + this.type;
6576 };
6577
6578 var identity$3 = function(x) {
6579   return x;
6580 };
6581
6582 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6583
6584 var formatLocale = function(locale) {
6585   var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6586       currency = locale.currency,
6587       decimal = locale.decimal,
6588       numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6589       percent = locale.percent || "%";
6590
6591   function newFormat(specifier) {
6592     specifier = formatSpecifier(specifier);
6593
6594     var fill = specifier.fill,
6595         align = specifier.align,
6596         sign = specifier.sign,
6597         symbol = specifier.symbol,
6598         zero = specifier.zero,
6599         width = specifier.width,
6600         comma = specifier.comma,
6601         precision = specifier.precision,
6602         type = specifier.type;
6603
6604     // Compute the prefix and suffix.
6605     // For SI-prefix, the suffix is lazily computed.
6606     var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6607         suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6608
6609     // What format function should we use?
6610     // Is this an integer type?
6611     // Can this type generate exponential notation?
6612     var formatType = formatTypes[type],
6613         maybeSuffix = !type || /[defgprs%]/.test(type);
6614
6615     // Set the default precision if not specified,
6616     // or clamp the specified precision to the supported range.
6617     // For significant precision, it must be in [1, 21].
6618     // For fixed precision, it must be in [0, 20].
6619     precision = precision == null ? (type ? 6 : 12)
6620         : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6621         : Math.max(0, Math.min(20, precision));
6622
6623     function format(value) {
6624       var valuePrefix = prefix,
6625           valueSuffix = suffix,
6626           i, n, c;
6627
6628       if (type === "c") {
6629         valueSuffix = formatType(value) + valueSuffix;
6630         value = "";
6631       } else {
6632         value = +value;
6633
6634         // Perform the initial formatting.
6635         var valueNegative = value < 0;
6636         value = formatType(Math.abs(value), precision);
6637
6638         // If a negative value rounds to zero during formatting, treat as positive.
6639         if (valueNegative && +value === 0) valueNegative = false;
6640
6641         // Compute the prefix and suffix.
6642         valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6643         valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : "");
6644
6645         // Break the formatted value into the integer “value” part that can be
6646         // grouped, and fractional or exponential “suffix” part that is not.
6647         if (maybeSuffix) {
6648           i = -1, n = value.length;
6649           while (++i < n) {
6650             if (c = value.charCodeAt(i), 48 > c || c > 57) {
6651               valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6652               value = value.slice(0, i);
6653               break;
6654             }
6655           }
6656         }
6657       }
6658
6659       // If the fill character is not "0", grouping is applied before padding.
6660       if (comma && !zero) value = group(value, Infinity);
6661
6662       // Compute the padding.
6663       var length = valuePrefix.length + value.length + valueSuffix.length,
6664           padding = length < width ? new Array(width - length + 1).join(fill) : "";
6665
6666       // If the fill character is "0", grouping is applied after padding.
6667       if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6668
6669       // Reconstruct the final output based on the desired alignment.
6670       switch (align) {
6671         case "<": value = valuePrefix + value + valueSuffix + padding; break;
6672         case "=": value = valuePrefix + padding + value + valueSuffix; break;
6673         case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6674         default: value = padding + valuePrefix + value + valueSuffix; break;
6675       }
6676
6677       return numerals(value);
6678     }
6679
6680     format.toString = function() {
6681       return specifier + "";
6682     };
6683
6684     return format;
6685   }
6686
6687   function formatPrefix(specifier, value) {
6688     var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6689         e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6690         k = Math.pow(10, -e),
6691         prefix = prefixes[8 + e / 3];
6692     return function(value) {
6693       return f(k * value) + prefix;
6694     };
6695   }
6696
6697   return {
6698     format: newFormat,
6699     formatPrefix: formatPrefix
6700   };
6701 };
6702
6703 var locale$1;
6704 var format;
6705 var formatPrefix;
6706
6707 defaultLocale({
6708   decimal: ".",
6709   thousands: ",",
6710   grouping: [3],
6711   currency: ["$", ""]
6712 });
6713
6714 function defaultLocale(definition) {
6715   locale$1 = formatLocale(definition);
6716   format = locale$1.format;
6717   formatPrefix = locale$1.formatPrefix;
6718   return locale$1;
6719 }
6720
6721 var precisionFixed = function(step) {
6722   return Math.max(0, -exponent$1(Math.abs(step)));
6723 };
6724
6725 var precisionPrefix = function(step, value) {
6726   return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6727 };
6728
6729 var precisionRound = function(step, max) {
6730   step = Math.abs(step), max = Math.abs(max) - step;
6731   return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6732 };
6733
6734 // Adds floating point numbers with twice the normal precision.
6735 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6736 // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6737 // 305–363 (1997).
6738 // Code adapted from GeographicLib by Charles F. F. Karney,
6739 // http://geographiclib.sourceforge.net/
6740
6741 var adder = function() {
6742   return new Adder;
6743 };
6744
6745 function Adder() {
6746   this.reset();
6747 }
6748
6749 Adder.prototype = {
6750   constructor: Adder,
6751   reset: function() {
6752     this.s = // rounded value
6753     this.t = 0; // exact error
6754   },
6755   add: function(y) {
6756     add$1(temp, y, this.t);
6757     add$1(this, temp.s, this.s);
6758     if (this.s) this.t += temp.t;
6759     else this.s = temp.t;
6760   },
6761   valueOf: function() {
6762     return this.s;
6763   }
6764 };
6765
6766 var temp = new Adder;
6767
6768 function add$1(adder, a, b) {
6769   var x = adder.s = a + b,
6770       bv = x - a,
6771       av = x - bv;
6772   adder.t = (a - av) + (b - bv);
6773 }
6774
6775 var epsilon$2 = 1e-6;
6776 var epsilon2$1 = 1e-12;
6777 var pi$3 = Math.PI;
6778 var halfPi$2 = pi$3 / 2;
6779 var quarterPi = pi$3 / 4;
6780 var tau$3 = pi$3 * 2;
6781
6782 var degrees$1 = 180 / pi$3;
6783 var radians = pi$3 / 180;
6784
6785 var abs = Math.abs;
6786 var atan = Math.atan;
6787 var atan2 = Math.atan2;
6788 var cos$1 = Math.cos;
6789 var ceil = Math.ceil;
6790 var exp = Math.exp;
6791
6792 var log = Math.log;
6793 var pow = Math.pow;
6794 var sin$1 = Math.sin;
6795 var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6796 var sqrt = Math.sqrt;
6797 var tan = Math.tan;
6798
6799 function acos(x) {
6800   return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6801 }
6802
6803 function asin(x) {
6804   return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6805 }
6806
6807 function haversin(x) {
6808   return (x = sin$1(x / 2)) * x;
6809 }
6810
6811 function noop$1() {}
6812
6813 function streamGeometry(geometry, stream) {
6814   if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6815     streamGeometryType[geometry.type](geometry, stream);
6816   }
6817 }
6818
6819 var streamObjectType = {
6820   Feature: function(object, stream) {
6821     streamGeometry(object.geometry, stream);
6822   },
6823   FeatureCollection: function(object, stream) {
6824     var features = object.features, i = -1, n = features.length;
6825     while (++i < n) streamGeometry(features[i].geometry, stream);
6826   }
6827 };
6828
6829 var streamGeometryType = {
6830   Sphere: function(object, stream) {
6831     stream.sphere();
6832   },
6833   Point: function(object, stream) {
6834     object = object.coordinates;
6835     stream.point(object[0], object[1], object[2]);
6836   },
6837   MultiPoint: function(object, stream) {
6838     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6839     while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6840   },
6841   LineString: function(object, stream) {
6842     streamLine(object.coordinates, stream, 0);
6843   },
6844   MultiLineString: function(object, stream) {
6845     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6846     while (++i < n) streamLine(coordinates[i], stream, 0);
6847   },
6848   Polygon: function(object, stream) {
6849     streamPolygon(object.coordinates, stream);
6850   },
6851   MultiPolygon: function(object, stream) {
6852     var coordinates = object.coordinates, i = -1, n = coordinates.length;
6853     while (++i < n) streamPolygon(coordinates[i], stream);
6854   },
6855   GeometryCollection: function(object, stream) {
6856     var geometries = object.geometries, i = -1, n = geometries.length;
6857     while (++i < n) streamGeometry(geometries[i], stream);
6858   }
6859 };
6860
6861 function streamLine(coordinates, stream, closed) {
6862   var i = -1, n = coordinates.length - closed, coordinate;
6863   stream.lineStart();
6864   while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6865   stream.lineEnd();
6866 }
6867
6868 function streamPolygon(coordinates, stream) {
6869   var i = -1, n = coordinates.length;
6870   stream.polygonStart();
6871   while (++i < n) streamLine(coordinates[i], stream, 1);
6872   stream.polygonEnd();
6873 }
6874
6875 var d3_geoStream = function(object, stream) {
6876   if (object && streamObjectType.hasOwnProperty(object.type)) {
6877     streamObjectType[object.type](object, stream);
6878   } else {
6879     streamGeometry(object, stream);
6880   }
6881 };
6882
6883 var areaRingSum = adder();
6884
6885 var areaSum = adder();
6886 var lambda00;
6887 var phi00;
6888 var lambda0;
6889 var cosPhi0;
6890 var sinPhi0;
6891
6892 var areaStream = {
6893   point: noop$1,
6894   lineStart: noop$1,
6895   lineEnd: noop$1,
6896   polygonStart: function() {
6897     areaRingSum.reset();
6898     areaStream.lineStart = areaRingStart;
6899     areaStream.lineEnd = areaRingEnd;
6900   },
6901   polygonEnd: function() {
6902     var areaRing = +areaRingSum;
6903     areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6904     this.lineStart = this.lineEnd = this.point = noop$1;
6905   },
6906   sphere: function() {
6907     areaSum.add(tau$3);
6908   }
6909 };
6910
6911 function areaRingStart() {
6912   areaStream.point = areaPointFirst;
6913 }
6914
6915 function areaRingEnd() {
6916   areaPoint(lambda00, phi00);
6917 }
6918
6919 function areaPointFirst(lambda, phi) {
6920   areaStream.point = areaPoint;
6921   lambda00 = lambda, phi00 = phi;
6922   lambda *= radians, phi *= radians;
6923   lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6924 }
6925
6926 function areaPoint(lambda, phi) {
6927   lambda *= radians, phi *= radians;
6928   phi = phi / 2 + quarterPi; // half the angular distance from south pole
6929
6930   // Spherical excess E for a spherical triangle with vertices: south pole,
6931   // previous point, current point.  Uses a formula derived from Cagnoli’s
6932   // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6933   var dLambda = lambda - lambda0,
6934       sdLambda = dLambda >= 0 ? 1 : -1,
6935       adLambda = sdLambda * dLambda,
6936       cosPhi = cos$1(phi),
6937       sinPhi = sin$1(phi),
6938       k = sinPhi0 * sinPhi,
6939       u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6940       v = k * sdLambda * sin$1(adLambda);
6941   areaRingSum.add(atan2(v, u));
6942
6943   // Advance the previous points.
6944   lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6945 }
6946
6947 var d3_geoArea = function(object) {
6948   areaSum.reset();
6949   d3_geoStream(object, areaStream);
6950   return areaSum * 2;
6951 };
6952
6953 function spherical(cartesian) {
6954   return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6955 }
6956
6957 function cartesian(spherical) {
6958   var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6959   return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6960 }
6961
6962 function cartesianDot(a, b) {
6963   return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6964 }
6965
6966 function cartesianCross(a, b) {
6967   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]];
6968 }
6969
6970 // TODO return a
6971 function cartesianAddInPlace(a, b) {
6972   a[0] += b[0], a[1] += b[1], a[2] += b[2];
6973 }
6974
6975 function cartesianScale(vector, k) {
6976   return [vector[0] * k, vector[1] * k, vector[2] * k];
6977 }
6978
6979 // TODO return d
6980 function cartesianNormalizeInPlace(d) {
6981   var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6982   d[0] /= l, d[1] /= l, d[2] /= l;
6983 }
6984
6985 var lambda0$1;
6986 var phi0;
6987 var lambda1;
6988 var phi1;
6989 var lambda2;
6990 var lambda00$1;
6991 var phi00$1;
6992 var p0;
6993 var deltaSum = adder();
6994 var ranges;
6995 var range;
6996
6997 var boundsStream = {
6998   point: boundsPoint,
6999   lineStart: boundsLineStart,
7000   lineEnd: boundsLineEnd,
7001   polygonStart: function() {
7002     boundsStream.point = boundsRingPoint;
7003     boundsStream.lineStart = boundsRingStart;
7004     boundsStream.lineEnd = boundsRingEnd;
7005     deltaSum.reset();
7006     areaStream.polygonStart();
7007   },
7008   polygonEnd: function() {
7009     areaStream.polygonEnd();
7010     boundsStream.point = boundsPoint;
7011     boundsStream.lineStart = boundsLineStart;
7012     boundsStream.lineEnd = boundsLineEnd;
7013     if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7014     else if (deltaSum > epsilon$2) phi1 = 90;
7015     else if (deltaSum < -epsilon$2) phi0 = -90;
7016     range[0] = lambda0$1, range[1] = lambda1;
7017   }
7018 };
7019
7020 function boundsPoint(lambda, phi) {
7021   ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7022   if (phi < phi0) phi0 = phi;
7023   if (phi > phi1) phi1 = phi;
7024 }
7025
7026 function linePoint(lambda, phi) {
7027   var p = cartesian([lambda * radians, phi * radians]);
7028   if (p0) {
7029     var normal = cartesianCross(p0, p),
7030         equatorial = [normal[1], -normal[0], 0],
7031         inflection = cartesianCross(equatorial, normal);
7032     cartesianNormalizeInPlace(inflection);
7033     inflection = spherical(inflection);
7034     var delta = lambda - lambda2,
7035         sign$$1 = delta > 0 ? 1 : -1,
7036         lambdai = inflection[0] * degrees$1 * sign$$1,
7037         phii,
7038         antimeridian = abs(delta) > 180;
7039     if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7040       phii = inflection[1] * degrees$1;
7041       if (phii > phi1) phi1 = phii;
7042     } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7043       phii = -inflection[1] * degrees$1;
7044       if (phii < phi0) phi0 = phii;
7045     } else {
7046       if (phi < phi0) phi0 = phi;
7047       if (phi > phi1) phi1 = phi;
7048     }
7049     if (antimeridian) {
7050       if (lambda < lambda2) {
7051         if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7052       } else {
7053         if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7054       }
7055     } else {
7056       if (lambda1 >= lambda0$1) {
7057         if (lambda < lambda0$1) lambda0$1 = lambda;
7058         if (lambda > lambda1) lambda1 = lambda;
7059       } else {
7060         if (lambda > lambda2) {
7061           if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7062         } else {
7063           if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7064         }
7065       }
7066     }
7067   } else {
7068     ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
7069   }
7070   if (phi < phi0) phi0 = phi;
7071   if (phi > phi1) phi1 = phi;
7072   p0 = p, lambda2 = lambda;
7073 }
7074
7075 function boundsLineStart() {
7076   boundsStream.point = linePoint;
7077 }
7078
7079 function boundsLineEnd() {
7080   range[0] = lambda0$1, range[1] = lambda1;
7081   boundsStream.point = boundsPoint;
7082   p0 = null;
7083 }
7084
7085 function boundsRingPoint(lambda, phi) {
7086   if (p0) {
7087     var delta = lambda - lambda2;
7088     deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7089   } else {
7090     lambda00$1 = lambda, phi00$1 = phi;
7091   }
7092   areaStream.point(lambda, phi);
7093   linePoint(lambda, phi);
7094 }
7095
7096 function boundsRingStart() {
7097   areaStream.lineStart();
7098 }
7099
7100 function boundsRingEnd() {
7101   boundsRingPoint(lambda00$1, phi00$1);
7102   areaStream.lineEnd();
7103   if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7104   range[0] = lambda0$1, range[1] = lambda1;
7105   p0 = null;
7106 }
7107
7108 // Finds the left-right distance between two longitudes.
7109 // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7110 // the distance between ±180° to be 360°.
7111 function angle(lambda0, lambda1) {
7112   return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7113 }
7114
7115 function rangeCompare(a, b) {
7116   return a[0] - b[0];
7117 }
7118
7119 function rangeContains(range, x) {
7120   return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7121 }
7122
7123 var d3_geoBounds = function(feature) {
7124   var i, n, a, b, merged, deltaMax, delta;
7125
7126   phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7127   ranges = [];
7128   d3_geoStream(feature, boundsStream);
7129
7130   // First, sort ranges by their minimum longitudes.
7131   if (n = ranges.length) {
7132     ranges.sort(rangeCompare);
7133
7134     // Then, merge any ranges that overlap.
7135     for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7136       b = ranges[i];
7137       if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7138         if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7139         if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7140       } else {
7141         merged.push(a = b);
7142       }
7143     }
7144
7145     // Finally, find the largest gap between the merged ranges.
7146     // The final bounding box will be the inverse of this gap.
7147     for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7148       b = merged[i];
7149       if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7150     }
7151   }
7152
7153   ranges = range = null;
7154
7155   return lambda0$1 === Infinity || phi0 === Infinity
7156       ? [[NaN, NaN], [NaN, NaN]]
7157       : [[lambda0$1, phi0], [lambda1, phi1]];
7158 };
7159
7160 var W0;
7161 var W1;
7162 var X0;
7163 var Y0;
7164 var Z0;
7165 var X1;
7166 var Y1;
7167 var Z1;
7168 var X2;
7169 var Y2;
7170 var Z2;
7171 var lambda00$2;
7172 var phi00$2;
7173 var x0;
7174 var y0;
7175 var z0; // previous point
7176
7177 var centroidStream = {
7178   sphere: noop$1,
7179   point: centroidPoint,
7180   lineStart: centroidLineStart,
7181   lineEnd: centroidLineEnd,
7182   polygonStart: function() {
7183     centroidStream.lineStart = centroidRingStart;
7184     centroidStream.lineEnd = centroidRingEnd;
7185   },
7186   polygonEnd: function() {
7187     centroidStream.lineStart = centroidLineStart;
7188     centroidStream.lineEnd = centroidLineEnd;
7189   }
7190 };
7191
7192 // Arithmetic mean of Cartesian vectors.
7193 function centroidPoint(lambda, phi) {
7194   lambda *= radians, phi *= radians;
7195   var cosPhi = cos$1(phi);
7196   centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7197 }
7198
7199 function centroidPointCartesian(x, y, z) {
7200   ++W0;
7201   X0 += (x - X0) / W0;
7202   Y0 += (y - Y0) / W0;
7203   Z0 += (z - Z0) / W0;
7204 }
7205
7206 function centroidLineStart() {
7207   centroidStream.point = centroidLinePointFirst;
7208 }
7209
7210 function centroidLinePointFirst(lambda, phi) {
7211   lambda *= radians, phi *= radians;
7212   var cosPhi = cos$1(phi);
7213   x0 = cosPhi * cos$1(lambda);
7214   y0 = cosPhi * sin$1(lambda);
7215   z0 = sin$1(phi);
7216   centroidStream.point = centroidLinePoint;
7217   centroidPointCartesian(x0, y0, z0);
7218 }
7219
7220 function centroidLinePoint(lambda, phi) {
7221   lambda *= radians, phi *= radians;
7222   var cosPhi = cos$1(phi),
7223       x = cosPhi * cos$1(lambda),
7224       y = cosPhi * sin$1(lambda),
7225       z = sin$1(phi),
7226       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);
7227   W1 += w;
7228   X1 += w * (x0 + (x0 = x));
7229   Y1 += w * (y0 + (y0 = y));
7230   Z1 += w * (z0 + (z0 = z));
7231   centroidPointCartesian(x0, y0, z0);
7232 }
7233
7234 function centroidLineEnd() {
7235   centroidStream.point = centroidPoint;
7236 }
7237
7238 // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7239 // J. Applied Mechanics 42, 239 (1975).
7240 function centroidRingStart() {
7241   centroidStream.point = centroidRingPointFirst;
7242 }
7243
7244 function centroidRingEnd() {
7245   centroidRingPoint(lambda00$2, phi00$2);
7246   centroidStream.point = centroidPoint;
7247 }
7248
7249 function centroidRingPointFirst(lambda, phi) {
7250   lambda00$2 = lambda, phi00$2 = phi;
7251   lambda *= radians, phi *= radians;
7252   centroidStream.point = centroidRingPoint;
7253   var cosPhi = cos$1(phi);
7254   x0 = cosPhi * cos$1(lambda);
7255   y0 = cosPhi * sin$1(lambda);
7256   z0 = sin$1(phi);
7257   centroidPointCartesian(x0, y0, z0);
7258 }
7259
7260 function centroidRingPoint(lambda, phi) {
7261   lambda *= radians, phi *= radians;
7262   var cosPhi = cos$1(phi),
7263       x = cosPhi * cos$1(lambda),
7264       y = cosPhi * sin$1(lambda),
7265       z = sin$1(phi),
7266       cx = y0 * z - z0 * y,
7267       cy = z0 * x - x0 * z,
7268       cz = x0 * y - y0 * x,
7269       m = sqrt(cx * cx + cy * cy + cz * cz),
7270       w = asin(m), // line weight = angle
7271       v = m && -w / m; // area weight multiplier
7272   X2 += v * cx;
7273   Y2 += v * cy;
7274   Z2 += v * cz;
7275   W1 += w;
7276   X1 += w * (x0 + (x0 = x));
7277   Y1 += w * (y0 + (y0 = y));
7278   Z1 += w * (z0 + (z0 = z));
7279   centroidPointCartesian(x0, y0, z0);
7280 }
7281
7282 var d3_geoCentroid = function(object) {
7283   W0 = W1 =
7284   X0 = Y0 = Z0 =
7285   X1 = Y1 = Z1 =
7286   X2 = Y2 = Z2 = 0;
7287   d3_geoStream(object, centroidStream);
7288
7289   var x = X2,
7290       y = Y2,
7291       z = Z2,
7292       m = x * x + y * y + z * z;
7293
7294   // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7295   if (m < epsilon2$1) {
7296     x = X1, y = Y1, z = Z1;
7297     // If the feature has zero length, fall back to arithmetic mean of point vectors.
7298     if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7299     m = x * x + y * y + z * z;
7300     // If the feature still has an undefined ccentroid, then return.
7301     if (m < epsilon2$1) return [NaN, NaN];
7302   }
7303
7304   return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7305 };
7306
7307 var constant$7 = function(x) {
7308   return function() {
7309     return x;
7310   };
7311 };
7312
7313 var compose = function(a, b) {
7314
7315   function compose(x, y) {
7316     return x = a(x, y), b(x[0], x[1]);
7317   }
7318
7319   if (a.invert && b.invert) compose.invert = function(x, y) {
7320     return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7321   };
7322
7323   return compose;
7324 };
7325
7326 function rotationIdentity(lambda, phi) {
7327   return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7328 }
7329
7330 rotationIdentity.invert = rotationIdentity;
7331
7332 function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7333   return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7334     : rotationLambda(deltaLambda))
7335     : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7336     : rotationIdentity);
7337 }
7338
7339 function forwardRotationLambda(deltaLambda) {
7340   return function(lambda, phi) {
7341     return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7342   };
7343 }
7344
7345 function rotationLambda(deltaLambda) {
7346   var rotation = forwardRotationLambda(deltaLambda);
7347   rotation.invert = forwardRotationLambda(-deltaLambda);
7348   return rotation;
7349 }
7350
7351 function rotationPhiGamma(deltaPhi, deltaGamma) {
7352   var cosDeltaPhi = cos$1(deltaPhi),
7353       sinDeltaPhi = sin$1(deltaPhi),
7354       cosDeltaGamma = cos$1(deltaGamma),
7355       sinDeltaGamma = sin$1(deltaGamma);
7356
7357   function rotation(lambda, phi) {
7358     var cosPhi = cos$1(phi),
7359         x = cos$1(lambda) * cosPhi,
7360         y = sin$1(lambda) * cosPhi,
7361         z = sin$1(phi),
7362         k = z * cosDeltaPhi + x * sinDeltaPhi;
7363     return [
7364       atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7365       asin(k * cosDeltaGamma + y * sinDeltaGamma)
7366     ];
7367   }
7368
7369   rotation.invert = function(lambda, phi) {
7370     var cosPhi = cos$1(phi),
7371         x = cos$1(lambda) * cosPhi,
7372         y = sin$1(lambda) * cosPhi,
7373         z = sin$1(phi),
7374         k = z * cosDeltaGamma - y * sinDeltaGamma;
7375     return [
7376       atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7377       asin(k * cosDeltaPhi - x * sinDeltaPhi)
7378     ];
7379   };
7380
7381   return rotation;
7382 }
7383
7384 var rotation = function(rotate) {
7385   rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7386
7387   function forward(coordinates) {
7388     coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7389     return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7390   }
7391
7392   forward.invert = function(coordinates) {
7393     coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7394     return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7395   };
7396
7397   return forward;
7398 };
7399
7400 // Generates a circle centered at [0°, 0°], with a given radius and precision.
7401 function circleStream(stream, radius, delta, direction, t0, t1) {
7402   if (!delta) return;
7403   var cosRadius = cos$1(radius),
7404       sinRadius = sin$1(radius),
7405       step = direction * delta;
7406   if (t0 == null) {
7407     t0 = radius + direction * tau$3;
7408     t1 = radius - step / 2;
7409   } else {
7410     t0 = circleRadius(cosRadius, t0);
7411     t1 = circleRadius(cosRadius, t1);
7412     if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7413   }
7414   for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7415     point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7416     stream.point(point[0], point[1]);
7417   }
7418 }
7419
7420 // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7421 function circleRadius(cosRadius, point) {
7422   point = cartesian(point), point[0] -= cosRadius;
7423   cartesianNormalizeInPlace(point);
7424   var radius = acos(-point[1]);
7425   return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7426 }
7427
7428 var circle = function() {
7429   var center = constant$7([0, 0]),
7430       radius = constant$7(90),
7431       precision = constant$7(6),
7432       ring,
7433       rotate,
7434       stream = {point: point};
7435
7436   function point(x, y) {
7437     ring.push(x = rotate(x, y));
7438     x[0] *= degrees$1, x[1] *= degrees$1;
7439   }
7440
7441   function circle() {
7442     var c = center.apply(this, arguments),
7443         r = radius.apply(this, arguments) * radians,
7444         p = precision.apply(this, arguments) * radians;
7445     ring = [];
7446     rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7447     circleStream(stream, r, p, 1);
7448     c = {type: "Polygon", coordinates: [ring]};
7449     ring = rotate = null;
7450     return c;
7451   }
7452
7453   circle.center = function(_) {
7454     return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7455   };
7456
7457   circle.radius = function(_) {
7458     return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7459   };
7460
7461   circle.precision = function(_) {
7462     return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7463   };
7464
7465   return circle;
7466 };
7467
7468 var clipBuffer = function() {
7469   var lines = [],
7470       line;
7471   return {
7472     point: function(x, y) {
7473       line.push([x, y]);
7474     },
7475     lineStart: function() {
7476       lines.push(line = []);
7477     },
7478     lineEnd: noop$1,
7479     rejoin: function() {
7480       if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7481     },
7482     result: function() {
7483       var result = lines;
7484       lines = [];
7485       line = null;
7486       return result;
7487     }
7488   };
7489 };
7490
7491 var pointEqual = function(a, b) {
7492   return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7493 };
7494
7495 function Intersection(point, points, other, entry) {
7496   this.x = point;
7497   this.z = points;
7498   this.o = other; // another intersection
7499   this.e = entry; // is an entry?
7500   this.v = false; // visited
7501   this.n = this.p = null; // next & previous
7502 }
7503
7504 // A generalized polygon clipping algorithm: given a polygon that has been cut
7505 // into its visible line segments, and rejoins the segments by interpolating
7506 // along the clip edge.
7507 var clipRejoin = function(segments, compareIntersection, startInside, interpolate, stream) {
7508   var subject = [],
7509       clip = [],
7510       i,
7511       n;
7512
7513   segments.forEach(function(segment) {
7514     if ((n = segment.length - 1) <= 0) return;
7515     var n, p0 = segment[0], p1 = segment[n], x;
7516
7517     // If the first and last points of a segment are coincident, then treat as a
7518     // closed ring. TODO if all rings are closed, then the winding order of the
7519     // exterior ring should be checked.
7520     if (pointEqual(p0, p1)) {
7521       stream.lineStart();
7522       for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7523       stream.lineEnd();
7524       return;
7525     }
7526
7527     subject.push(x = new Intersection(p0, segment, null, true));
7528     clip.push(x.o = new Intersection(p0, null, x, false));
7529     subject.push(x = new Intersection(p1, segment, null, false));
7530     clip.push(x.o = new Intersection(p1, null, x, true));
7531   });
7532
7533   if (!subject.length) return;
7534
7535   clip.sort(compareIntersection);
7536   link$1(subject);
7537   link$1(clip);
7538
7539   for (i = 0, n = clip.length; i < n; ++i) {
7540     clip[i].e = startInside = !startInside;
7541   }
7542
7543   var start = subject[0],
7544       points,
7545       point;
7546
7547   while (1) {
7548     // Find first unvisited intersection.
7549     var current = start,
7550         isSubject = true;
7551     while (current.v) if ((current = current.n) === start) return;
7552     points = current.z;
7553     stream.lineStart();
7554     do {
7555       current.v = current.o.v = true;
7556       if (current.e) {
7557         if (isSubject) {
7558           for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7559         } else {
7560           interpolate(current.x, current.n.x, 1, stream);
7561         }
7562         current = current.n;
7563       } else {
7564         if (isSubject) {
7565           points = current.p.z;
7566           for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7567         } else {
7568           interpolate(current.x, current.p.x, -1, stream);
7569         }
7570         current = current.p;
7571       }
7572       current = current.o;
7573       points = current.z;
7574       isSubject = !isSubject;
7575     } while (!current.v);
7576     stream.lineEnd();
7577   }
7578 };
7579
7580 function link$1(array) {
7581   if (!(n = array.length)) return;
7582   var n,
7583       i = 0,
7584       a = array[0],
7585       b;
7586   while (++i < n) {
7587     a.n = b = array[i];
7588     b.p = a;
7589     a = b;
7590   }
7591   a.n = b = array[0];
7592   b.p = a;
7593 }
7594
7595 var sum$1 = adder();
7596
7597 var polygonContains = function(polygon, point) {
7598   var lambda = point[0],
7599       phi = point[1],
7600       normal = [sin$1(lambda), -cos$1(lambda), 0],
7601       angle = 0,
7602       winding = 0;
7603
7604   sum$1.reset();
7605
7606   for (var i = 0, n = polygon.length; i < n; ++i) {
7607     if (!(m = (ring = polygon[i]).length)) continue;
7608     var ring,
7609         m,
7610         point0 = ring[m - 1],
7611         lambda0 = point0[0],
7612         phi0 = point0[1] / 2 + quarterPi,
7613         sinPhi0 = sin$1(phi0),
7614         cosPhi0 = cos$1(phi0);
7615
7616     for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7617       var point1 = ring[j],
7618           lambda1 = point1[0],
7619           phi1 = point1[1] / 2 + quarterPi,
7620           sinPhi1 = sin$1(phi1),
7621           cosPhi1 = cos$1(phi1),
7622           delta = lambda1 - lambda0,
7623           sign$$1 = delta >= 0 ? 1 : -1,
7624           absDelta = sign$$1 * delta,
7625           antimeridian = absDelta > pi$3,
7626           k = sinPhi0 * sinPhi1;
7627
7628       sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7629       angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7630
7631       // Are the longitudes either side of the point’s meridian (lambda),
7632       // and are the latitudes smaller than the parallel (phi)?
7633       if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7634         var arc = cartesianCross(cartesian(point0), cartesian(point1));
7635         cartesianNormalizeInPlace(arc);
7636         var intersection = cartesianCross(normal, arc);
7637         cartesianNormalizeInPlace(intersection);
7638         var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7639         if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7640           winding += antimeridian ^ delta >= 0 ? 1 : -1;
7641         }
7642       }
7643     }
7644   }
7645
7646   // First, determine whether the South pole is inside or outside:
7647   //
7648   // It is inside if:
7649   // * the polygon winds around it in a clockwise direction.
7650   // * the polygon does not (cumulatively) wind around it, but has a negative
7651   //   (counter-clockwise) area.
7652   //
7653   // Second, count the (signed) number of times a segment crosses a lambda
7654   // from the point to the South pole.  If it is zero, then the point is the
7655   // same side as the South pole.
7656
7657   return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7658 };
7659
7660 var clip = function(pointVisible, clipLine, interpolate, start) {
7661   return function(sink) {
7662     var line = clipLine(sink),
7663         ringBuffer = clipBuffer(),
7664         ringSink = clipLine(ringBuffer),
7665         polygonStarted = false,
7666         polygon,
7667         segments,
7668         ring;
7669
7670     var clip = {
7671       point: point,
7672       lineStart: lineStart,
7673       lineEnd: lineEnd,
7674       polygonStart: function() {
7675         clip.point = pointRing;
7676         clip.lineStart = ringStart;
7677         clip.lineEnd = ringEnd;
7678         segments = [];
7679         polygon = [];
7680       },
7681       polygonEnd: function() {
7682         clip.point = point;
7683         clip.lineStart = lineStart;
7684         clip.lineEnd = lineEnd;
7685         segments = merge(segments);
7686         var startInside = polygonContains(polygon, start);
7687         if (segments.length) {
7688           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7689           clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7690         } else if (startInside) {
7691           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7692           sink.lineStart();
7693           interpolate(null, null, 1, sink);
7694           sink.lineEnd();
7695         }
7696         if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7697         segments = polygon = null;
7698       },
7699       sphere: function() {
7700         sink.polygonStart();
7701         sink.lineStart();
7702         interpolate(null, null, 1, sink);
7703         sink.lineEnd();
7704         sink.polygonEnd();
7705       }
7706     };
7707
7708     function point(lambda, phi) {
7709       if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7710     }
7711
7712     function pointLine(lambda, phi) {
7713       line.point(lambda, phi);
7714     }
7715
7716     function lineStart() {
7717       clip.point = pointLine;
7718       line.lineStart();
7719     }
7720
7721     function lineEnd() {
7722       clip.point = point;
7723       line.lineEnd();
7724     }
7725
7726     function pointRing(lambda, phi) {
7727       ring.push([lambda, phi]);
7728       ringSink.point(lambda, phi);
7729     }
7730
7731     function ringStart() {
7732       ringSink.lineStart();
7733       ring = [];
7734     }
7735
7736     function ringEnd() {
7737       pointRing(ring[0][0], ring[0][1]);
7738       ringSink.lineEnd();
7739
7740       var clean = ringSink.clean(),
7741           ringSegments = ringBuffer.result(),
7742           i, n = ringSegments.length, m,
7743           segment,
7744           point;
7745
7746       ring.pop();
7747       polygon.push(ring);
7748       ring = null;
7749
7750       if (!n) return;
7751
7752       // No intersections.
7753       if (clean & 1) {
7754         segment = ringSegments[0];
7755         if ((m = segment.length - 1) > 0) {
7756           if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7757           sink.lineStart();
7758           for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7759           sink.lineEnd();
7760         }
7761         return;
7762       }
7763
7764       // Rejoin connected segments.
7765       // TODO reuse ringBuffer.rejoin()?
7766       if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7767
7768       segments.push(ringSegments.filter(validSegment));
7769     }
7770
7771     return clip;
7772   };
7773 };
7774
7775 function validSegment(segment) {
7776   return segment.length > 1;
7777 }
7778
7779 // Intersections are sorted along the clip edge. For both antimeridian cutting
7780 // and circle clipping, the same comparison is used.
7781 function compareIntersection(a, b) {
7782   return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7783        - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7784 }
7785
7786 var clipAntimeridian = clip(
7787   function() { return true; },
7788   clipAntimeridianLine,
7789   clipAntimeridianInterpolate,
7790   [-pi$3, -halfPi$2]
7791 );
7792
7793 // Takes a line and cuts into visible segments. Return values: 0 - there were
7794 // intersections or the line was empty; 1 - no intersections; 2 - there were
7795 // intersections, and the first and last segments should be rejoined.
7796 function clipAntimeridianLine(stream) {
7797   var lambda0 = NaN,
7798       phi0 = NaN,
7799       sign0 = NaN,
7800       clean; // no intersections
7801
7802   return {
7803     lineStart: function() {
7804       stream.lineStart();
7805       clean = 1;
7806     },
7807     point: function(lambda1, phi1) {
7808       var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7809           delta = abs(lambda1 - lambda0);
7810       if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7811         stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7812         stream.point(sign0, phi0);
7813         stream.lineEnd();
7814         stream.lineStart();
7815         stream.point(sign1, phi0);
7816         stream.point(lambda1, phi0);
7817         clean = 0;
7818       } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7819         if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7820         if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7821         phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7822         stream.point(sign0, phi0);
7823         stream.lineEnd();
7824         stream.lineStart();
7825         stream.point(sign1, phi0);
7826         clean = 0;
7827       }
7828       stream.point(lambda0 = lambda1, phi0 = phi1);
7829       sign0 = sign1;
7830     },
7831     lineEnd: function() {
7832       stream.lineEnd();
7833       lambda0 = phi0 = NaN;
7834     },
7835     clean: function() {
7836       return 2 - clean; // if intersections, rejoin first and last segments
7837     }
7838   };
7839 }
7840
7841 function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7842   var cosPhi0,
7843       cosPhi1,
7844       sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7845   return abs(sinLambda0Lambda1) > epsilon$2
7846       ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7847           - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7848           / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7849       : (phi0 + phi1) / 2;
7850 }
7851
7852 function clipAntimeridianInterpolate(from, to, direction, stream) {
7853   var phi;
7854   if (from == null) {
7855     phi = direction * halfPi$2;
7856     stream.point(-pi$3, phi);
7857     stream.point(0, phi);
7858     stream.point(pi$3, phi);
7859     stream.point(pi$3, 0);
7860     stream.point(pi$3, -phi);
7861     stream.point(0, -phi);
7862     stream.point(-pi$3, -phi);
7863     stream.point(-pi$3, 0);
7864     stream.point(-pi$3, phi);
7865   } else if (abs(from[0] - to[0]) > epsilon$2) {
7866     var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7867     phi = direction * lambda / 2;
7868     stream.point(-lambda, phi);
7869     stream.point(0, phi);
7870     stream.point(lambda, phi);
7871   } else {
7872     stream.point(to[0], to[1]);
7873   }
7874 }
7875
7876 var clipCircle = function(radius) {
7877   var cr = cos$1(radius),
7878       delta = 6 * radians,
7879       smallRadius = cr > 0,
7880       notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7881
7882   function interpolate(from, to, direction, stream) {
7883     circleStream(stream, radius, delta, direction, from, to);
7884   }
7885
7886   function visible(lambda, phi) {
7887     return cos$1(lambda) * cos$1(phi) > cr;
7888   }
7889
7890   // Takes a line and cuts into visible segments. Return values used for polygon
7891   // clipping: 0 - there were intersections or the line was empty; 1 - no
7892   // intersections 2 - there were intersections, and the first and last segments
7893   // should be rejoined.
7894   function clipLine(stream) {
7895     var point0, // previous point
7896         c0, // code for previous point
7897         v0, // visibility of previous point
7898         v00, // visibility of first point
7899         clean; // no intersections
7900     return {
7901       lineStart: function() {
7902         v00 = v0 = false;
7903         clean = 1;
7904       },
7905       point: function(lambda, phi) {
7906         var point1 = [lambda, phi],
7907             point2,
7908             v = visible(lambda, phi),
7909             c = smallRadius
7910               ? v ? 0 : code(lambda, phi)
7911               : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7912         if (!point0 && (v00 = v0 = v)) stream.lineStart();
7913         // Handle degeneracies.
7914         // TODO ignore if not clipping polygons.
7915         if (v !== v0) {
7916           point2 = intersect(point0, point1);
7917           if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7918             point1[0] += epsilon$2;
7919             point1[1] += epsilon$2;
7920             v = visible(point1[0], point1[1]);
7921           }
7922         }
7923         if (v !== v0) {
7924           clean = 0;
7925           if (v) {
7926             // outside going in
7927             stream.lineStart();
7928             point2 = intersect(point1, point0);
7929             stream.point(point2[0], point2[1]);
7930           } else {
7931             // inside going out
7932             point2 = intersect(point0, point1);
7933             stream.point(point2[0], point2[1]);
7934             stream.lineEnd();
7935           }
7936           point0 = point2;
7937         } else if (notHemisphere && point0 && smallRadius ^ v) {
7938           var t;
7939           // If the codes for two points are different, or are both zero,
7940           // and there this segment intersects with the small circle.
7941           if (!(c & c0) && (t = intersect(point1, point0, true))) {
7942             clean = 0;
7943             if (smallRadius) {
7944               stream.lineStart();
7945               stream.point(t[0][0], t[0][1]);
7946               stream.point(t[1][0], t[1][1]);
7947               stream.lineEnd();
7948             } else {
7949               stream.point(t[1][0], t[1][1]);
7950               stream.lineEnd();
7951               stream.lineStart();
7952               stream.point(t[0][0], t[0][1]);
7953             }
7954           }
7955         }
7956         if (v && (!point0 || !pointEqual(point0, point1))) {
7957           stream.point(point1[0], point1[1]);
7958         }
7959         point0 = point1, v0 = v, c0 = c;
7960       },
7961       lineEnd: function() {
7962         if (v0) stream.lineEnd();
7963         point0 = null;
7964       },
7965       // Rejoin first and last segments if there were intersections and the first
7966       // and last points were visible.
7967       clean: function() {
7968         return clean | ((v00 && v0) << 1);
7969       }
7970     };
7971   }
7972
7973   // Intersects the great circle between a and b with the clip circle.
7974   function intersect(a, b, two) {
7975     var pa = cartesian(a),
7976         pb = cartesian(b);
7977
7978     // We have two planes, n1.p = d1 and n2.p = d2.
7979     // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7980     var n1 = [1, 0, 0], // normal
7981         n2 = cartesianCross(pa, pb),
7982         n2n2 = cartesianDot(n2, n2),
7983         n1n2 = n2[0], // cartesianDot(n1, n2),
7984         determinant = n2n2 - n1n2 * n1n2;
7985
7986     // Two polar points.
7987     if (!determinant) return !two && a;
7988
7989     var c1 =  cr * n2n2 / determinant,
7990         c2 = -cr * n1n2 / determinant,
7991         n1xn2 = cartesianCross(n1, n2),
7992         A = cartesianScale(n1, c1),
7993         B = cartesianScale(n2, c2);
7994     cartesianAddInPlace(A, B);
7995
7996     // Solve |p(t)|^2 = 1.
7997     var u = n1xn2,
7998         w = cartesianDot(A, u),
7999         uu = cartesianDot(u, u),
8000         t2 = w * w - uu * (cartesianDot(A, A) - 1);
8001
8002     if (t2 < 0) return;
8003
8004     var t = sqrt(t2),
8005         q = cartesianScale(u, (-w - t) / uu);
8006     cartesianAddInPlace(q, A);
8007     q = spherical(q);
8008
8009     if (!two) return q;
8010
8011     // Two intersection points.
8012     var lambda0 = a[0],
8013         lambda1 = b[0],
8014         phi0 = a[1],
8015         phi1 = b[1],
8016         z;
8017
8018     if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8019
8020     var delta = lambda1 - lambda0,
8021         polar = abs(delta - pi$3) < epsilon$2,
8022         meridian = polar || delta < epsilon$2;
8023
8024     if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8025
8026     // Check that the first point is between a and b.
8027     if (meridian
8028         ? polar
8029           ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8030           : phi0 <= q[1] && q[1] <= phi1
8031         : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8032       var q1 = cartesianScale(u, (-w + t) / uu);
8033       cartesianAddInPlace(q1, A);
8034       return [q, spherical(q1)];
8035     }
8036   }
8037
8038   // Generates a 4-bit vector representing the location of a point relative to
8039   // the small circle's bounding box.
8040   function code(lambda, phi) {
8041     var r = smallRadius ? radius : pi$3 - radius,
8042         code = 0;
8043     if (lambda < -r) code |= 1; // left
8044     else if (lambda > r) code |= 2; // right
8045     if (phi < -r) code |= 4; // below
8046     else if (phi > r) code |= 8; // above
8047     return code;
8048   }
8049
8050   return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8051 };
8052
8053 var clipLine = function(a, b, x0, y0, x1, y1) {
8054   var ax = a[0],
8055       ay = a[1],
8056       bx = b[0],
8057       by = b[1],
8058       t0 = 0,
8059       t1 = 1,
8060       dx = bx - ax,
8061       dy = by - ay,
8062       r;
8063
8064   r = x0 - ax;
8065   if (!dx && r > 0) return;
8066   r /= dx;
8067   if (dx < 0) {
8068     if (r < t0) return;
8069     if (r < t1) t1 = r;
8070   } else if (dx > 0) {
8071     if (r > t1) return;
8072     if (r > t0) t0 = r;
8073   }
8074
8075   r = x1 - ax;
8076   if (!dx && r < 0) return;
8077   r /= dx;
8078   if (dx < 0) {
8079     if (r > t1) return;
8080     if (r > t0) t0 = r;
8081   } else if (dx > 0) {
8082     if (r < t0) return;
8083     if (r < t1) t1 = r;
8084   }
8085
8086   r = y0 - ay;
8087   if (!dy && r > 0) return;
8088   r /= dy;
8089   if (dy < 0) {
8090     if (r < t0) return;
8091     if (r < t1) t1 = r;
8092   } else if (dy > 0) {
8093     if (r > t1) return;
8094     if (r > t0) t0 = r;
8095   }
8096
8097   r = y1 - ay;
8098   if (!dy && r < 0) return;
8099   r /= dy;
8100   if (dy < 0) {
8101     if (r > t1) return;
8102     if (r > t0) t0 = r;
8103   } else if (dy > 0) {
8104     if (r < t0) return;
8105     if (r < t1) t1 = r;
8106   }
8107
8108   if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8109   if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8110   return true;
8111 };
8112
8113 var clipMax = 1e9;
8114 var clipMin = -clipMax;
8115
8116 // TODO Use d3-polygon’s polygonContains here for the ring check?
8117 // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8118
8119 function clipRectangle(x0, y0, x1, y1) {
8120
8121   function visible(x, y) {
8122     return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8123   }
8124
8125   function interpolate(from, to, direction, stream) {
8126     var a = 0, a1 = 0;
8127     if (from == null
8128         || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8129         || comparePoint(from, to) < 0 ^ direction > 0) {
8130       do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8131       while ((a = (a + direction + 4) % 4) !== a1);
8132     } else {
8133       stream.point(to[0], to[1]);
8134     }
8135   }
8136
8137   function corner(p, direction) {
8138     return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8139         : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8140         : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8141         : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8142   }
8143
8144   function compareIntersection(a, b) {
8145     return comparePoint(a.x, b.x);
8146   }
8147
8148   function comparePoint(a, b) {
8149     var ca = corner(a, 1),
8150         cb = corner(b, 1);
8151     return ca !== cb ? ca - cb
8152         : ca === 0 ? b[1] - a[1]
8153         : ca === 1 ? a[0] - b[0]
8154         : ca === 2 ? a[1] - b[1]
8155         : b[0] - a[0];
8156   }
8157
8158   return function(stream) {
8159     var activeStream = stream,
8160         bufferStream = clipBuffer(),
8161         segments,
8162         polygon,
8163         ring,
8164         x__, y__, v__, // first point
8165         x_, y_, v_, // previous point
8166         first,
8167         clean;
8168
8169     var clipStream = {
8170       point: point,
8171       lineStart: lineStart,
8172       lineEnd: lineEnd,
8173       polygonStart: polygonStart,
8174       polygonEnd: polygonEnd
8175     };
8176
8177     function point(x, y) {
8178       if (visible(x, y)) activeStream.point(x, y);
8179     }
8180
8181     function polygonInside() {
8182       var winding = 0;
8183
8184       for (var i = 0, n = polygon.length; i < n; ++i) {
8185         for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8186           a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8187           if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8188           else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8189         }
8190       }
8191
8192       return winding;
8193     }
8194
8195     // Buffer geometry within a polygon and then clip it en masse.
8196     function polygonStart() {
8197       activeStream = bufferStream, segments = [], polygon = [], clean = true;
8198     }
8199
8200     function polygonEnd() {
8201       var startInside = polygonInside(),
8202           cleanInside = clean && startInside,
8203           visible = (segments = merge(segments)).length;
8204       if (cleanInside || visible) {
8205         stream.polygonStart();
8206         if (cleanInside) {
8207           stream.lineStart();
8208           interpolate(null, null, 1, stream);
8209           stream.lineEnd();
8210         }
8211         if (visible) {
8212           clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8213         }
8214         stream.polygonEnd();
8215       }
8216       activeStream = stream, segments = polygon = ring = null;
8217     }
8218
8219     function lineStart() {
8220       clipStream.point = linePoint;
8221       if (polygon) polygon.push(ring = []);
8222       first = true;
8223       v_ = false;
8224       x_ = y_ = NaN;
8225     }
8226
8227     // TODO rather than special-case polygons, simply handle them separately.
8228     // Ideally, coincident intersection points should be jittered to avoid
8229     // clipping issues.
8230     function lineEnd() {
8231       if (segments) {
8232         linePoint(x__, y__);
8233         if (v__ && v_) bufferStream.rejoin();
8234         segments.push(bufferStream.result());
8235       }
8236       clipStream.point = point;
8237       if (v_) activeStream.lineEnd();
8238     }
8239
8240     function linePoint(x, y) {
8241       var v = visible(x, y);
8242       if (polygon) ring.push([x, y]);
8243       if (first) {
8244         x__ = x, y__ = y, v__ = v;
8245         first = false;
8246         if (v) {
8247           activeStream.lineStart();
8248           activeStream.point(x, y);
8249         }
8250       } else {
8251         if (v && v_) activeStream.point(x, y);
8252         else {
8253           var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8254               b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8255           if (clipLine(a, b, x0, y0, x1, y1)) {
8256             if (!v_) {
8257               activeStream.lineStart();
8258               activeStream.point(a[0], a[1]);
8259             }
8260             activeStream.point(b[0], b[1]);
8261             if (!v) activeStream.lineEnd();
8262             clean = false;
8263           } else if (v) {
8264             activeStream.lineStart();
8265             activeStream.point(x, y);
8266             clean = false;
8267           }
8268         }
8269       }
8270       x_ = x, y_ = y, v_ = v;
8271     }
8272
8273     return clipStream;
8274   };
8275 }
8276
8277 var extent$1 = function() {
8278   var x0 = 0,
8279       y0 = 0,
8280       x1 = 960,
8281       y1 = 500,
8282       cache,
8283       cacheStream,
8284       clip;
8285
8286   return clip = {
8287     stream: function(stream) {
8288       return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8289     },
8290     extent: function(_) {
8291       return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8292     }
8293   };
8294 };
8295
8296 var lengthSum = adder();
8297 var lambda0$2;
8298 var sinPhi0$1;
8299 var cosPhi0$1;
8300
8301 var lengthStream = {
8302   sphere: noop$1,
8303   point: noop$1,
8304   lineStart: lengthLineStart,
8305   lineEnd: noop$1,
8306   polygonStart: noop$1,
8307   polygonEnd: noop$1
8308 };
8309
8310 function lengthLineStart() {
8311   lengthStream.point = lengthPointFirst;
8312   lengthStream.lineEnd = lengthLineEnd;
8313 }
8314
8315 function lengthLineEnd() {
8316   lengthStream.point = lengthStream.lineEnd = noop$1;
8317 }
8318
8319 function lengthPointFirst(lambda, phi) {
8320   lambda *= radians, phi *= radians;
8321   lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8322   lengthStream.point = lengthPoint;
8323 }
8324
8325 function lengthPoint(lambda, phi) {
8326   lambda *= radians, phi *= radians;
8327   var sinPhi = sin$1(phi),
8328       cosPhi = cos$1(phi),
8329       delta = abs(lambda - lambda0$2),
8330       cosDelta = cos$1(delta),
8331       sinDelta = sin$1(delta),
8332       x = cosPhi * sinDelta,
8333       y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8334       z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8335   lengthSum.add(atan2(sqrt(x * x + y * y), z));
8336   lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8337 }
8338
8339 var d3_geoLength = function(object) {
8340   lengthSum.reset();
8341   d3_geoStream(object, lengthStream);
8342   return +lengthSum;
8343 };
8344
8345 var coordinates = [null, null];
8346 var object$1 = {type: "LineString", coordinates: coordinates};
8347
8348 var distance = function(a, b) {
8349   coordinates[0] = a;
8350   coordinates[1] = b;
8351   return d3_geoLength(object$1);
8352 };
8353
8354 var containsObjectType = {
8355   Feature: function(object, point) {
8356     return containsGeometry(object.geometry, point);
8357   },
8358   FeatureCollection: function(object, point) {
8359     var features = object.features, i = -1, n = features.length;
8360     while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8361     return false;
8362   }
8363 };
8364
8365 var containsGeometryType = {
8366   Sphere: function() {
8367     return true;
8368   },
8369   Point: function(object, point) {
8370     return containsPoint(object.coordinates, point);
8371   },
8372   MultiPoint: function(object, point) {
8373     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8374     while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8375     return false;
8376   },
8377   LineString: function(object, point) {
8378     return containsLine(object.coordinates, point);
8379   },
8380   MultiLineString: function(object, point) {
8381     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8382     while (++i < n) if (containsLine(coordinates[i], point)) return true;
8383     return false;
8384   },
8385   Polygon: function(object, point) {
8386     return containsPolygon(object.coordinates, point);
8387   },
8388   MultiPolygon: function(object, point) {
8389     var coordinates = object.coordinates, i = -1, n = coordinates.length;
8390     while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8391     return false;
8392   },
8393   GeometryCollection: function(object, point) {
8394     var geometries = object.geometries, i = -1, n = geometries.length;
8395     while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8396     return false;
8397   }
8398 };
8399
8400 function containsGeometry(geometry, point) {
8401   return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8402       ? containsGeometryType[geometry.type](geometry, point)
8403       : false;
8404 }
8405
8406 function containsPoint(coordinates, point) {
8407   return distance(coordinates, point) === 0;
8408 }
8409
8410 function containsLine(coordinates, point) {
8411   var ab = distance(coordinates[0], coordinates[1]),
8412       ao = distance(coordinates[0], point),
8413       ob = distance(point, coordinates[1]);
8414   return ao + ob <= ab + epsilon$2;
8415 }
8416
8417 function containsPolygon(coordinates, point) {
8418   return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8419 }
8420
8421 function ringRadians(ring) {
8422   return ring = ring.map(pointRadians), ring.pop(), ring;
8423 }
8424
8425 function pointRadians(point) {
8426   return [point[0] * radians, point[1] * radians];
8427 }
8428
8429 var contains = function(object, point) {
8430   return (object && containsObjectType.hasOwnProperty(object.type)
8431       ? containsObjectType[object.type]
8432       : containsGeometry)(object, point);
8433 };
8434
8435 function graticuleX(y0, y1, dy) {
8436   var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
8437   return function(x) { return y.map(function(y) { return [x, y]; }); };
8438 }
8439
8440 function graticuleY(x0, x1, dx) {
8441   var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
8442   return function(y) { return x.map(function(x) { return [x, y]; }); };
8443 }
8444
8445 function graticule() {
8446   var x1, x0, X1, X0,
8447       y1, y0, Y1, Y0,
8448       dx = 10, dy = dx, DX = 90, DY = 360,
8449       x, y, X, Y,
8450       precision = 2.5;
8451
8452   function graticule() {
8453     return {type: "MultiLineString", coordinates: lines()};
8454   }
8455
8456   function lines() {
8457     return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
8458         .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8459         .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8460         .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8461   }
8462
8463   graticule.lines = function() {
8464     return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8465   };
8466
8467   graticule.outline = function() {
8468     return {
8469       type: "Polygon",
8470       coordinates: [
8471         X(X0).concat(
8472         Y(Y1).slice(1),
8473         X(X1).reverse().slice(1),
8474         Y(Y0).reverse().slice(1))
8475       ]
8476     };
8477   };
8478
8479   graticule.extent = function(_) {
8480     if (!arguments.length) return graticule.extentMinor();
8481     return graticule.extentMajor(_).extentMinor(_);
8482   };
8483
8484   graticule.extentMajor = function(_) {
8485     if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8486     X0 = +_[0][0], X1 = +_[1][0];
8487     Y0 = +_[0][1], Y1 = +_[1][1];
8488     if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8489     if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8490     return graticule.precision(precision);
8491   };
8492
8493   graticule.extentMinor = function(_) {
8494     if (!arguments.length) return [[x0, y0], [x1, y1]];
8495     x0 = +_[0][0], x1 = +_[1][0];
8496     y0 = +_[0][1], y1 = +_[1][1];
8497     if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8498     if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8499     return graticule.precision(precision);
8500   };
8501
8502   graticule.step = function(_) {
8503     if (!arguments.length) return graticule.stepMinor();
8504     return graticule.stepMajor(_).stepMinor(_);
8505   };
8506
8507   graticule.stepMajor = function(_) {
8508     if (!arguments.length) return [DX, DY];
8509     DX = +_[0], DY = +_[1];
8510     return graticule;
8511   };
8512
8513   graticule.stepMinor = function(_) {
8514     if (!arguments.length) return [dx, dy];
8515     dx = +_[0], dy = +_[1];
8516     return graticule;
8517   };
8518
8519   graticule.precision = function(_) {
8520     if (!arguments.length) return precision;
8521     precision = +_;
8522     x = graticuleX(y0, y1, 90);
8523     y = graticuleY(x0, x1, precision);
8524     X = graticuleX(Y0, Y1, 90);
8525     Y = graticuleY(X0, X1, precision);
8526     return graticule;
8527   };
8528
8529   return graticule
8530       .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8531       .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8532 }
8533
8534 function graticule10() {
8535   return graticule()();
8536 }
8537
8538 var interpolate$1 = function(a, b) {
8539   var x0 = a[0] * radians,
8540       y0 = a[1] * radians,
8541       x1 = b[0] * radians,
8542       y1 = b[1] * radians,
8543       cy0 = cos$1(y0),
8544       sy0 = sin$1(y0),
8545       cy1 = cos$1(y1),
8546       sy1 = sin$1(y1),
8547       kx0 = cy0 * cos$1(x0),
8548       ky0 = cy0 * sin$1(x0),
8549       kx1 = cy1 * cos$1(x1),
8550       ky1 = cy1 * sin$1(x1),
8551       d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8552       k = sin$1(d);
8553
8554   var interpolate = d ? function(t) {
8555     var B = sin$1(t *= d) / k,
8556         A = sin$1(d - t) / k,
8557         x = A * kx0 + B * kx1,
8558         y = A * ky0 + B * ky1,
8559         z = A * sy0 + B * sy1;
8560     return [
8561       atan2(y, x) * degrees$1,
8562       atan2(z, sqrt(x * x + y * y)) * degrees$1
8563     ];
8564   } : function() {
8565     return [x0 * degrees$1, y0 * degrees$1];
8566   };
8567
8568   interpolate.distance = d;
8569
8570   return interpolate;
8571 };
8572
8573 var identity$4 = function(x) {
8574   return x;
8575 };
8576
8577 var areaSum$1 = adder();
8578 var areaRingSum$1 = adder();
8579 var x00;
8580 var y00;
8581 var x0$1;
8582 var y0$1;
8583
8584 var areaStream$1 = {
8585   point: noop$1,
8586   lineStart: noop$1,
8587   lineEnd: noop$1,
8588   polygonStart: function() {
8589     areaStream$1.lineStart = areaRingStart$1;
8590     areaStream$1.lineEnd = areaRingEnd$1;
8591   },
8592   polygonEnd: function() {
8593     areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8594     areaSum$1.add(abs(areaRingSum$1));
8595     areaRingSum$1.reset();
8596   },
8597   result: function() {
8598     var area = areaSum$1 / 2;
8599     areaSum$1.reset();
8600     return area;
8601   }
8602 };
8603
8604 function areaRingStart$1() {
8605   areaStream$1.point = areaPointFirst$1;
8606 }
8607
8608 function areaPointFirst$1(x, y) {
8609   areaStream$1.point = areaPoint$1;
8610   x00 = x0$1 = x, y00 = y0$1 = y;
8611 }
8612
8613 function areaPoint$1(x, y) {
8614   areaRingSum$1.add(y0$1 * x - x0$1 * y);
8615   x0$1 = x, y0$1 = y;
8616 }
8617
8618 function areaRingEnd$1() {
8619   areaPoint$1(x00, y00);
8620 }
8621
8622 var x0$2 = Infinity;
8623 var y0$2 = x0$2;
8624 var x1 = -x0$2;
8625 var y1 = x1;
8626
8627 var boundsStream$1 = {
8628   point: boundsPoint$1,
8629   lineStart: noop$1,
8630   lineEnd: noop$1,
8631   polygonStart: noop$1,
8632   polygonEnd: noop$1,
8633   result: function() {
8634     var bounds = [[x0$2, y0$2], [x1, y1]];
8635     x1 = y1 = -(y0$2 = x0$2 = Infinity);
8636     return bounds;
8637   }
8638 };
8639
8640 function boundsPoint$1(x, y) {
8641   if (x < x0$2) x0$2 = x;
8642   if (x > x1) x1 = x;
8643   if (y < y0$2) y0$2 = y;
8644   if (y > y1) y1 = y;
8645 }
8646
8647 // TODO Enforce positive area for exterior, negative area for interior?
8648
8649 var X0$1 = 0;
8650 var Y0$1 = 0;
8651 var Z0$1 = 0;
8652 var X1$1 = 0;
8653 var Y1$1 = 0;
8654 var Z1$1 = 0;
8655 var X2$1 = 0;
8656 var Y2$1 = 0;
8657 var Z2$1 = 0;
8658 var x00$1;
8659 var y00$1;
8660 var x0$3;
8661 var y0$3;
8662
8663 var centroidStream$1 = {
8664   point: centroidPoint$1,
8665   lineStart: centroidLineStart$1,
8666   lineEnd: centroidLineEnd$1,
8667   polygonStart: function() {
8668     centroidStream$1.lineStart = centroidRingStart$1;
8669     centroidStream$1.lineEnd = centroidRingEnd$1;
8670   },
8671   polygonEnd: function() {
8672     centroidStream$1.point = centroidPoint$1;
8673     centroidStream$1.lineStart = centroidLineStart$1;
8674     centroidStream$1.lineEnd = centroidLineEnd$1;
8675   },
8676   result: function() {
8677     var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8678         : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8679         : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8680         : [NaN, NaN];
8681     X0$1 = Y0$1 = Z0$1 =
8682     X1$1 = Y1$1 = Z1$1 =
8683     X2$1 = Y2$1 = Z2$1 = 0;
8684     return centroid;
8685   }
8686 };
8687
8688 function centroidPoint$1(x, y) {
8689   X0$1 += x;
8690   Y0$1 += y;
8691   ++Z0$1;
8692 }
8693
8694 function centroidLineStart$1() {
8695   centroidStream$1.point = centroidPointFirstLine;
8696 }
8697
8698 function centroidPointFirstLine(x, y) {
8699   centroidStream$1.point = centroidPointLine;
8700   centroidPoint$1(x0$3 = x, y0$3 = y);
8701 }
8702
8703 function centroidPointLine(x, y) {
8704   var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8705   X1$1 += z * (x0$3 + x) / 2;
8706   Y1$1 += z * (y0$3 + y) / 2;
8707   Z1$1 += z;
8708   centroidPoint$1(x0$3 = x, y0$3 = y);
8709 }
8710
8711 function centroidLineEnd$1() {
8712   centroidStream$1.point = centroidPoint$1;
8713 }
8714
8715 function centroidRingStart$1() {
8716   centroidStream$1.point = centroidPointFirstRing;
8717 }
8718
8719 function centroidRingEnd$1() {
8720   centroidPointRing(x00$1, y00$1);
8721 }
8722
8723 function centroidPointFirstRing(x, y) {
8724   centroidStream$1.point = centroidPointRing;
8725   centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8726 }
8727
8728 function centroidPointRing(x, y) {
8729   var dx = x - x0$3,
8730       dy = y - y0$3,
8731       z = sqrt(dx * dx + dy * dy);
8732
8733   X1$1 += z * (x0$3 + x) / 2;
8734   Y1$1 += z * (y0$3 + y) / 2;
8735   Z1$1 += z;
8736
8737   z = y0$3 * x - x0$3 * y;
8738   X2$1 += z * (x0$3 + x);
8739   Y2$1 += z * (y0$3 + y);
8740   Z2$1 += z * 3;
8741   centroidPoint$1(x0$3 = x, y0$3 = y);
8742 }
8743
8744 function PathContext(context) {
8745   this._context = context;
8746 }
8747
8748 PathContext.prototype = {
8749   _radius: 4.5,
8750   pointRadius: function(_) {
8751     return this._radius = _, this;
8752   },
8753   polygonStart: function() {
8754     this._line = 0;
8755   },
8756   polygonEnd: function() {
8757     this._line = NaN;
8758   },
8759   lineStart: function() {
8760     this._point = 0;
8761   },
8762   lineEnd: function() {
8763     if (this._line === 0) this._context.closePath();
8764     this._point = NaN;
8765   },
8766   point: function(x, y) {
8767     switch (this._point) {
8768       case 0: {
8769         this._context.moveTo(x, y);
8770         this._point = 1;
8771         break;
8772       }
8773       case 1: {
8774         this._context.lineTo(x, y);
8775         break;
8776       }
8777       default: {
8778         this._context.moveTo(x + this._radius, y);
8779         this._context.arc(x, y, this._radius, 0, tau$3);
8780         break;
8781       }
8782     }
8783   },
8784   result: noop$1
8785 };
8786
8787 var lengthSum$1 = adder();
8788 var lengthRing;
8789 var x00$2;
8790 var y00$2;
8791 var x0$4;
8792 var y0$4;
8793
8794 var lengthStream$1 = {
8795   point: noop$1,
8796   lineStart: function() {
8797     lengthStream$1.point = lengthPointFirst$1;
8798   },
8799   lineEnd: function() {
8800     if (lengthRing) lengthPoint$1(x00$2, y00$2);
8801     lengthStream$1.point = noop$1;
8802   },
8803   polygonStart: function() {
8804     lengthRing = true;
8805   },
8806   polygonEnd: function() {
8807     lengthRing = null;
8808   },
8809   result: function() {
8810     var length = +lengthSum$1;
8811     lengthSum$1.reset();
8812     return length;
8813   }
8814 };
8815
8816 function lengthPointFirst$1(x, y) {
8817   lengthStream$1.point = lengthPoint$1;
8818   x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8819 }
8820
8821 function lengthPoint$1(x, y) {
8822   x0$4 -= x, y0$4 -= y;
8823   lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8824   x0$4 = x, y0$4 = y;
8825 }
8826
8827 function PathString() {
8828   this._string = [];
8829 }
8830
8831 PathString.prototype = {
8832   _radius: 4.5,
8833   _circle: circle$1(4.5),
8834   pointRadius: function(_) {
8835     if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8836     return this;
8837   },
8838   polygonStart: function() {
8839     this._line = 0;
8840   },
8841   polygonEnd: function() {
8842     this._line = NaN;
8843   },
8844   lineStart: function() {
8845     this._point = 0;
8846   },
8847   lineEnd: function() {
8848     if (this._line === 0) this._string.push("Z");
8849     this._point = NaN;
8850   },
8851   point: function(x, y) {
8852     switch (this._point) {
8853       case 0: {
8854         this._string.push("M", x, ",", y);
8855         this._point = 1;
8856         break;
8857       }
8858       case 1: {
8859         this._string.push("L", x, ",", y);
8860         break;
8861       }
8862       default: {
8863         if (this._circle == null) this._circle = circle$1(this._radius);
8864         this._string.push("M", x, ",", y, this._circle);
8865         break;
8866       }
8867     }
8868   },
8869   result: function() {
8870     if (this._string.length) {
8871       var result = this._string.join("");
8872       this._string = [];
8873       return result;
8874     } else {
8875       return null;
8876     }
8877   }
8878 };
8879
8880 function circle$1(radius) {
8881   return "m0," + radius
8882       + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8883       + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8884       + "z";
8885 }
8886
8887 var d3_geoPath = function(projection, context) {
8888   var pointRadius = 4.5,
8889       projectionStream,
8890       contextStream;
8891
8892   function path(object) {
8893     if (object) {
8894       if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8895       d3_geoStream(object, projectionStream(contextStream));
8896     }
8897     return contextStream.result();
8898   }
8899
8900   path.area = function(object) {
8901     d3_geoStream(object, projectionStream(areaStream$1));
8902     return areaStream$1.result();
8903   };
8904
8905   path.measure = function(object) {
8906     d3_geoStream(object, projectionStream(lengthStream$1));
8907     return lengthStream$1.result();
8908   };
8909
8910   path.bounds = function(object) {
8911     d3_geoStream(object, projectionStream(boundsStream$1));
8912     return boundsStream$1.result();
8913   };
8914
8915   path.centroid = function(object) {
8916     d3_geoStream(object, projectionStream(centroidStream$1));
8917     return centroidStream$1.result();
8918   };
8919
8920   path.projection = function(_) {
8921     return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8922   };
8923
8924   path.context = function(_) {
8925     if (!arguments.length) return context;
8926     contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8927     if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8928     return path;
8929   };
8930
8931   path.pointRadius = function(_) {
8932     if (!arguments.length) return pointRadius;
8933     pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8934     return path;
8935   };
8936
8937   return path.projection(projection).context(context);
8938 };
8939
8940 var d3_geoTransform = function(methods) {
8941   return {
8942     stream: transformer(methods)
8943   };
8944 };
8945
8946 function transformer(methods) {
8947   return function(stream) {
8948     var s = new TransformStream;
8949     for (var key in methods) s[key] = methods[key];
8950     s.stream = stream;
8951     return s;
8952   };
8953 }
8954
8955 function TransformStream() {}
8956
8957 TransformStream.prototype = {
8958   constructor: TransformStream,
8959   point: function(x, y) { this.stream.point(x, y); },
8960   sphere: function() { this.stream.sphere(); },
8961   lineStart: function() { this.stream.lineStart(); },
8962   lineEnd: function() { this.stream.lineEnd(); },
8963   polygonStart: function() { this.stream.polygonStart(); },
8964   polygonEnd: function() { this.stream.polygonEnd(); }
8965 };
8966
8967 function fitExtent(projection, extent, object) {
8968   var w = extent[1][0] - extent[0][0],
8969       h = extent[1][1] - extent[0][1],
8970       clip = projection.clipExtent && projection.clipExtent();
8971
8972   projection
8973       .scale(150)
8974       .translate([0, 0]);
8975
8976   if (clip != null) projection.clipExtent(null);
8977
8978   d3_geoStream(object, projection.stream(boundsStream$1));
8979
8980   var b = boundsStream$1.result(),
8981       k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8982       x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8983       y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8984
8985   if (clip != null) projection.clipExtent(clip);
8986
8987   return projection
8988       .scale(k * 150)
8989       .translate([x, y]);
8990 }
8991
8992 function fitSize(projection, size, object) {
8993   return fitExtent(projection, [[0, 0], size], object);
8994 }
8995
8996 var maxDepth = 16;
8997 var cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
8998
8999 var resample = function(project, delta2) {
9000   return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9001 };
9002
9003 function resampleNone(project) {
9004   return transformer({
9005     point: function(x, y) {
9006       x = project(x, y);
9007       this.stream.point(x[0], x[1]);
9008     }
9009   });
9010 }
9011
9012 function resample$1(project, delta2) {
9013
9014   function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9015     var dx = x1 - x0,
9016         dy = y1 - y0,
9017         d2 = dx * dx + dy * dy;
9018     if (d2 > 4 * delta2 && depth--) {
9019       var a = a0 + a1,
9020           b = b0 + b1,
9021           c = c0 + c1,
9022           m = sqrt(a * a + b * b + c * c),
9023           phi2 = asin(c /= m),
9024           lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9025           p = project(lambda2, phi2),
9026           x2 = p[0],
9027           y2 = p[1],
9028           dx2 = x2 - x0,
9029           dy2 = y2 - y0,
9030           dz = dy * dx2 - dx * dy2;
9031       if (dz * dz / d2 > delta2 // perpendicular projected distance
9032           || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9033           || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9034         resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9035         stream.point(x2, y2);
9036         resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9037       }
9038     }
9039   }
9040   return function(stream) {
9041     var lambda00, x00, y00, a00, b00, c00, // first point
9042         lambda0, x0, y0, a0, b0, c0; // previous point
9043
9044     var resampleStream = {
9045       point: point,
9046       lineStart: lineStart,
9047       lineEnd: lineEnd,
9048       polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9049       polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9050     };
9051
9052     function point(x, y) {
9053       x = project(x, y);
9054       stream.point(x[0], x[1]);
9055     }
9056
9057     function lineStart() {
9058       x0 = NaN;
9059       resampleStream.point = linePoint;
9060       stream.lineStart();
9061     }
9062
9063     function linePoint(lambda, phi) {
9064       var c = cartesian([lambda, phi]), p = project(lambda, phi);
9065       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);
9066       stream.point(x0, y0);
9067     }
9068
9069     function lineEnd() {
9070       resampleStream.point = point;
9071       stream.lineEnd();
9072     }
9073
9074     function ringStart() {
9075       lineStart();
9076       resampleStream.point = ringPoint;
9077       resampleStream.lineEnd = ringEnd;
9078     }
9079
9080     function ringPoint(lambda, phi) {
9081       linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9082       resampleStream.point = linePoint;
9083     }
9084
9085     function ringEnd() {
9086       resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9087       resampleStream.lineEnd = lineEnd;
9088       lineEnd();
9089     }
9090
9091     return resampleStream;
9092   };
9093 }
9094
9095 var transformRadians = transformer({
9096   point: function(x, y) {
9097     this.stream.point(x * radians, y * radians);
9098   }
9099 });
9100
9101 function transformRotate(rotate) {
9102   return transformer({
9103     point: function(x, y) {
9104       var r = rotate(x, y);
9105       return this.stream.point(r[0], r[1]);
9106     }
9107   });
9108 }
9109
9110 function projection(project) {
9111   return projectionMutator(function() { return project; })();
9112 }
9113
9114 function projectionMutator(projectAt) {
9115   var project,
9116       k = 150, // scale
9117       x = 480, y = 250, // translate
9118       dx, dy, lambda = 0, phi = 0, // center
9119       deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9120       theta = null, preclip = clipAntimeridian, // clip angle
9121       x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9122       delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9123       cache,
9124       cacheStream;
9125
9126   function projection(point) {
9127     point = projectRotate(point[0] * radians, point[1] * radians);
9128     return [point[0] * k + dx, dy - point[1] * k];
9129   }
9130
9131   function invert(point) {
9132     point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9133     return point && [point[0] * degrees$1, point[1] * degrees$1];
9134   }
9135
9136   function projectTransform(x, y) {
9137     return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9138   }
9139
9140   projection.stream = function(stream) {
9141     return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9142   };
9143
9144   projection.preclip = function(_) {
9145     return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9146   };
9147
9148   projection.postclip = function(_) {
9149     return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9150   };
9151
9152   projection.clipAngle = function(_) {
9153     return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9154   };
9155
9156   projection.clipExtent = function(_) {
9157     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]];
9158   };
9159
9160   projection.scale = function(_) {
9161     return arguments.length ? (k = +_, recenter()) : k;
9162   };
9163
9164   projection.translate = function(_) {
9165     return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9166   };
9167
9168   projection.center = function(_) {
9169     return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9170   };
9171
9172   projection.rotate = function(_) {
9173     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];
9174   };
9175
9176   projection.precision = function(_) {
9177     return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9178   };
9179
9180   projection.fitExtent = function(extent, object) {
9181     return fitExtent(projection, extent, object);
9182   };
9183
9184   projection.fitSize = function(size, object) {
9185     return fitSize(projection, size, object);
9186   };
9187
9188   function recenter() {
9189     projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9190     var center = project(lambda, phi);
9191     dx = x - center[0] * k;
9192     dy = y + center[1] * k;
9193     return reset();
9194   }
9195
9196   function reset() {
9197     cache = cacheStream = null;
9198     return projection;
9199   }
9200
9201   return function() {
9202     project = projectAt.apply(this, arguments);
9203     projection.invert = project.invert && invert;
9204     return recenter();
9205   };
9206 }
9207
9208 function conicProjection(projectAt) {
9209   var phi0 = 0,
9210       phi1 = pi$3 / 3,
9211       m = projectionMutator(projectAt),
9212       p = m(phi0, phi1);
9213
9214   p.parallels = function(_) {
9215     return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9216   };
9217
9218   return p;
9219 }
9220
9221 function cylindricalEqualAreaRaw(phi0) {
9222   var cosPhi0 = cos$1(phi0);
9223
9224   function forward(lambda, phi) {
9225     return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9226   }
9227
9228   forward.invert = function(x, y) {
9229     return [x / cosPhi0, asin(y * cosPhi0)];
9230   };
9231
9232   return forward;
9233 }
9234
9235 function conicEqualAreaRaw(y0, y1) {
9236   var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9237
9238   // Are the parallels symmetrical around the Equator?
9239   if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9240
9241   var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9242
9243   function project(x, y) {
9244     var r = sqrt(c - 2 * n * sin$1(y)) / n;
9245     return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9246   }
9247
9248   project.invert = function(x, y) {
9249     var r0y = r0 - y;
9250     return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9251   };
9252
9253   return project;
9254 }
9255
9256 var conicEqualArea = function() {
9257   return conicProjection(conicEqualAreaRaw)
9258       .scale(155.424)
9259       .center([0, 33.6442]);
9260 };
9261
9262 var albers = function() {
9263   return conicEqualArea()
9264       .parallels([29.5, 45.5])
9265       .scale(1070)
9266       .translate([480, 250])
9267       .rotate([96, 0])
9268       .center([-0.6, 38.7]);
9269 };
9270
9271 // The projections must have mutually exclusive clip regions on the sphere,
9272 // as this will avoid emitting interleaving lines and polygons.
9273 function multiplex(streams) {
9274   var n = streams.length;
9275   return {
9276     point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9277     sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9278     lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9279     lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9280     polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9281     polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9282   };
9283 }
9284
9285 // A composite projection for the United States, configured by default for
9286 // 960×500. The projection also works quite well at 960×600 if you change the
9287 // scale to 1285 and adjust the translate accordingly. The set of standard
9288 // parallels for each region comes from USGS, which is published here:
9289 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9290 var albersUsa = function() {
9291   var cache,
9292       cacheStream,
9293       lower48 = albers(), lower48Point,
9294       alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9295       hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9296       point, pointStream = {point: function(x, y) { point = [x, y]; }};
9297
9298   function albersUsa(coordinates) {
9299     var x = coordinates[0], y = coordinates[1];
9300     return point = null,
9301         (lower48Point.point(x, y), point)
9302         || (alaskaPoint.point(x, y), point)
9303         || (hawaiiPoint.point(x, y), point);
9304   }
9305
9306   albersUsa.invert = function(coordinates) {
9307     var k = lower48.scale(),
9308         t = lower48.translate(),
9309         x = (coordinates[0] - t[0]) / k,
9310         y = (coordinates[1] - t[1]) / k;
9311     return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9312         : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9313         : lower48).invert(coordinates);
9314   };
9315
9316   albersUsa.stream = function(stream) {
9317     return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9318   };
9319
9320   albersUsa.precision = function(_) {
9321     if (!arguments.length) return lower48.precision();
9322     lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9323     return reset();
9324   };
9325
9326   albersUsa.scale = function(_) {
9327     if (!arguments.length) return lower48.scale();
9328     lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9329     return albersUsa.translate(lower48.translate());
9330   };
9331
9332   albersUsa.translate = function(_) {
9333     if (!arguments.length) return lower48.translate();
9334     var k = lower48.scale(), x = +_[0], y = +_[1];
9335
9336     lower48Point = lower48
9337         .translate(_)
9338         .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9339         .stream(pointStream);
9340
9341     alaskaPoint = alaska
9342         .translate([x - 0.307 * k, y + 0.201 * k])
9343         .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]])
9344         .stream(pointStream);
9345
9346     hawaiiPoint = hawaii
9347         .translate([x - 0.205 * k, y + 0.212 * k])
9348         .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]])
9349         .stream(pointStream);
9350
9351     return reset();
9352   };
9353
9354   albersUsa.fitExtent = function(extent, object) {
9355     return fitExtent(albersUsa, extent, object);
9356   };
9357
9358   albersUsa.fitSize = function(size, object) {
9359     return fitSize(albersUsa, size, object);
9360   };
9361
9362   function reset() {
9363     cache = cacheStream = null;
9364     return albersUsa;
9365   }
9366
9367   return albersUsa.scale(1070);
9368 };
9369
9370 function azimuthalRaw(scale) {
9371   return function(x, y) {
9372     var cx = cos$1(x),
9373         cy = cos$1(y),
9374         k = scale(cx * cy);
9375     return [
9376       k * cy * sin$1(x),
9377       k * sin$1(y)
9378     ];
9379   }
9380 }
9381
9382 function azimuthalInvert(angle) {
9383   return function(x, y) {
9384     var z = sqrt(x * x + y * y),
9385         c = angle(z),
9386         sc = sin$1(c),
9387         cc = cos$1(c);
9388     return [
9389       atan2(x * sc, z * cc),
9390       asin(z && y * sc / z)
9391     ];
9392   }
9393 }
9394
9395 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9396   return sqrt(2 / (1 + cxcy));
9397 });
9398
9399 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9400   return 2 * asin(z / 2);
9401 });
9402
9403 var azimuthalEqualArea = function() {
9404   return projection(azimuthalEqualAreaRaw)
9405       .scale(124.75)
9406       .clipAngle(180 - 1e-3);
9407 };
9408
9409 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9410   return (c = acos(c)) && c / sin$1(c);
9411 });
9412
9413 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9414   return z;
9415 });
9416
9417 var azimuthalEquidistant = function() {
9418   return projection(azimuthalEquidistantRaw)
9419       .scale(79.4188)
9420       .clipAngle(180 - 1e-3);
9421 };
9422
9423 function mercatorRaw(lambda, phi) {
9424   return [lambda, log(tan((halfPi$2 + phi) / 2))];
9425 }
9426
9427 mercatorRaw.invert = function(x, y) {
9428   return [x, 2 * atan(exp(y)) - halfPi$2];
9429 };
9430
9431 var mercator = function() {
9432   return mercatorProjection(mercatorRaw)
9433       .scale(961 / tau$3);
9434 };
9435
9436 function mercatorProjection(project) {
9437   var m = projection(project),
9438       center = m.center,
9439       scale = m.scale,
9440       translate = m.translate,
9441       clipExtent = m.clipExtent,
9442       x0 = null, y0, x1, y1; // clip extent
9443
9444   m.scale = function(_) {
9445     return arguments.length ? (scale(_), reclip()) : scale();
9446   };
9447
9448   m.translate = function(_) {
9449     return arguments.length ? (translate(_), reclip()) : translate();
9450   };
9451
9452   m.center = function(_) {
9453     return arguments.length ? (center(_), reclip()) : center();
9454   };
9455
9456   m.clipExtent = function(_) {
9457     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]];
9458   };
9459
9460   function reclip() {
9461     var k = pi$3 * scale(),
9462         t = m(rotation(m.rotate()).invert([0, 0]));
9463     return clipExtent(x0 == null
9464         ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9465         ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9466         : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9467   }
9468
9469   return reclip();
9470 }
9471
9472 function tany(y) {
9473   return tan((halfPi$2 + y) / 2);
9474 }
9475
9476 function conicConformalRaw(y0, y1) {
9477   var cy0 = cos$1(y0),
9478       n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9479       f = cy0 * pow(tany(y0), n) / n;
9480
9481   if (!n) return mercatorRaw;
9482
9483   function project(x, y) {
9484     if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9485     else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9486     var r = f / pow(tany(y), n);
9487     return [r * sin$1(n * x), f - r * cos$1(n * x)];
9488   }
9489
9490   project.invert = function(x, y) {
9491     var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9492     return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9493   };
9494
9495   return project;
9496 }
9497
9498 var conicConformal = function() {
9499   return conicProjection(conicConformalRaw)
9500       .scale(109.5)
9501       .parallels([30, 30]);
9502 };
9503
9504 function equirectangularRaw(lambda, phi) {
9505   return [lambda, phi];
9506 }
9507
9508 equirectangularRaw.invert = equirectangularRaw;
9509
9510 var equirectangular = function() {
9511   return projection(equirectangularRaw)
9512       .scale(152.63);
9513 };
9514
9515 function conicEquidistantRaw(y0, y1) {
9516   var cy0 = cos$1(y0),
9517       n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9518       g = cy0 / n + y0;
9519
9520   if (abs(n) < epsilon$2) return equirectangularRaw;
9521
9522   function project(x, y) {
9523     var gy = g - y, nx = n * x;
9524     return [gy * sin$1(nx), g - gy * cos$1(nx)];
9525   }
9526
9527   project.invert = function(x, y) {
9528     var gy = g - y;
9529     return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9530   };
9531
9532   return project;
9533 }
9534
9535 var conicEquidistant = function() {
9536   return conicProjection(conicEquidistantRaw)
9537       .scale(131.154)
9538       .center([0, 13.9389]);
9539 };
9540
9541 function gnomonicRaw(x, y) {
9542   var cy = cos$1(y), k = cos$1(x) * cy;
9543   return [cy * sin$1(x) / k, sin$1(y) / k];
9544 }
9545
9546 gnomonicRaw.invert = azimuthalInvert(atan);
9547
9548 var gnomonic = function() {
9549   return projection(gnomonicRaw)
9550       .scale(144.049)
9551       .clipAngle(60);
9552 };
9553
9554 function scaleTranslate(kx, ky, tx, ty) {
9555   return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9556     point: function(x, y) {
9557       this.stream.point(x * kx + tx, y * ky + ty);
9558     }
9559   });
9560 }
9561
9562 var d3_geoIdentity = function() {
9563   var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9564       x0 = null, y0, x1, y1, // clip extent
9565       postclip = identity$4,
9566       cache,
9567       cacheStream,
9568       projection;
9569
9570   function reset() {
9571     cache = cacheStream = null;
9572     return projection;
9573   }
9574
9575   return projection = {
9576     stream: function(stream) {
9577       return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9578     },
9579     postclip: function(_) {
9580       return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9581     },
9582     clipExtent: function(_) {
9583       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]];
9584     },
9585     scale: function(_) {
9586       return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9587     },
9588     translate: function(_) {
9589       return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9590     },
9591     reflectX: function(_) {
9592       return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9593     },
9594     reflectY: function(_) {
9595       return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9596     },
9597     fitExtent: function(extent, object) {
9598       return fitExtent(projection, extent, object);
9599     },
9600     fitSize: function(size, object) {
9601       return fitSize(projection, size, object);
9602     }
9603   };
9604 };
9605
9606 function naturalEarth1Raw(lambda, phi) {
9607   var phi2 = phi * phi, phi4 = phi2 * phi2;
9608   return [
9609     lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9610     phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9611   ];
9612 }
9613
9614 naturalEarth1Raw.invert = function(x, y) {
9615   var phi = y, i = 25, delta;
9616   do {
9617     var phi2 = phi * phi, phi4 = phi2 * phi2;
9618     phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9619         (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9620   } while (abs(delta) > epsilon$2 && --i > 0);
9621   return [
9622     x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9623     phi
9624   ];
9625 };
9626
9627 var naturalEarth1 = function() {
9628   return projection(naturalEarth1Raw)
9629       .scale(175.295);
9630 };
9631
9632 function orthographicRaw(x, y) {
9633   return [cos$1(y) * sin$1(x), sin$1(y)];
9634 }
9635
9636 orthographicRaw.invert = azimuthalInvert(asin);
9637
9638 var orthographic = function() {
9639   return projection(orthographicRaw)
9640       .scale(249.5)
9641       .clipAngle(90 + epsilon$2);
9642 };
9643
9644 function stereographicRaw(x, y) {
9645   var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9646   return [cy * sin$1(x) / k, sin$1(y) / k];
9647 }
9648
9649 stereographicRaw.invert = azimuthalInvert(function(z) {
9650   return 2 * atan(z);
9651 });
9652
9653 var stereographic = function() {
9654   return projection(stereographicRaw)
9655       .scale(250)
9656       .clipAngle(142);
9657 };
9658
9659 function transverseMercatorRaw(lambda, phi) {
9660   return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9661 }
9662
9663 transverseMercatorRaw.invert = function(x, y) {
9664   return [-y, 2 * atan(exp(x)) - halfPi$2];
9665 };
9666
9667 var transverseMercator = function() {
9668   var m = mercatorProjection(transverseMercatorRaw),
9669       center = m.center,
9670       rotate = m.rotate;
9671
9672   m.center = function(_) {
9673     return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9674   };
9675
9676   m.rotate = function(_) {
9677     return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9678   };
9679
9680   return rotate([0, 0, 90])
9681       .scale(159.155);
9682 };
9683
9684 function defaultSeparation(a, b) {
9685   return a.parent === b.parent ? 1 : 2;
9686 }
9687
9688 function meanX(children) {
9689   return children.reduce(meanXReduce, 0) / children.length;
9690 }
9691
9692 function meanXReduce(x, c) {
9693   return x + c.x;
9694 }
9695
9696 function maxY(children) {
9697   return 1 + children.reduce(maxYReduce, 0);
9698 }
9699
9700 function maxYReduce(y, c) {
9701   return Math.max(y, c.y);
9702 }
9703
9704 function leafLeft(node) {
9705   var children;
9706   while (children = node.children) node = children[0];
9707   return node;
9708 }
9709
9710 function leafRight(node) {
9711   var children;
9712   while (children = node.children) node = children[children.length - 1];
9713   return node;
9714 }
9715
9716 var cluster = function() {
9717   var separation = defaultSeparation,
9718       dx = 1,
9719       dy = 1,
9720       nodeSize = false;
9721
9722   function cluster(root) {
9723     var previousNode,
9724         x = 0;
9725
9726     // First walk, computing the initial x & y values.
9727     root.eachAfter(function(node) {
9728       var children = node.children;
9729       if (children) {
9730         node.x = meanX(children);
9731         node.y = maxY(children);
9732       } else {
9733         node.x = previousNode ? x += separation(node, previousNode) : 0;
9734         node.y = 0;
9735         previousNode = node;
9736       }
9737     });
9738
9739     var left = leafLeft(root),
9740         right = leafRight(root),
9741         x0 = left.x - separation(left, right) / 2,
9742         x1 = right.x + separation(right, left) / 2;
9743
9744     // Second walk, normalizing x & y to the desired size.
9745     return root.eachAfter(nodeSize ? function(node) {
9746       node.x = (node.x - root.x) * dx;
9747       node.y = (root.y - node.y) * dy;
9748     } : function(node) {
9749       node.x = (node.x - x0) / (x1 - x0) * dx;
9750       node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9751     });
9752   }
9753
9754   cluster.separation = function(x) {
9755     return arguments.length ? (separation = x, cluster) : separation;
9756   };
9757
9758   cluster.size = function(x) {
9759     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9760   };
9761
9762   cluster.nodeSize = function(x) {
9763     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9764   };
9765
9766   return cluster;
9767 };
9768
9769 function count(node) {
9770   var sum = 0,
9771       children = node.children,
9772       i = children && children.length;
9773   if (!i) sum = 1;
9774   else while (--i >= 0) sum += children[i].value;
9775   node.value = sum;
9776 }
9777
9778 var node_count = function() {
9779   return this.eachAfter(count);
9780 };
9781
9782 var node_each = function(callback) {
9783   var node = this, current, next = [node], children, i, n;
9784   do {
9785     current = next.reverse(), next = [];
9786     while (node = current.pop()) {
9787       callback(node), children = node.children;
9788       if (children) for (i = 0, n = children.length; i < n; ++i) {
9789         next.push(children[i]);
9790       }
9791     }
9792   } while (next.length);
9793   return this;
9794 };
9795
9796 var node_eachBefore = function(callback) {
9797   var node = this, nodes = [node], children, i;
9798   while (node = nodes.pop()) {
9799     callback(node), children = node.children;
9800     if (children) for (i = children.length - 1; i >= 0; --i) {
9801       nodes.push(children[i]);
9802     }
9803   }
9804   return this;
9805 };
9806
9807 var node_eachAfter = function(callback) {
9808   var node = this, nodes = [node], next = [], children, i, n;
9809   while (node = nodes.pop()) {
9810     next.push(node), children = node.children;
9811     if (children) for (i = 0, n = children.length; i < n; ++i) {
9812       nodes.push(children[i]);
9813     }
9814   }
9815   while (node = next.pop()) {
9816     callback(node);
9817   }
9818   return this;
9819 };
9820
9821 var node_sum = function(value) {
9822   return this.eachAfter(function(node) {
9823     var sum = +value(node.data) || 0,
9824         children = node.children,
9825         i = children && children.length;
9826     while (--i >= 0) sum += children[i].value;
9827     node.value = sum;
9828   });
9829 };
9830
9831 var node_sort = function(compare) {
9832   return this.eachBefore(function(node) {
9833     if (node.children) {
9834       node.children.sort(compare);
9835     }
9836   });
9837 };
9838
9839 var node_path = function(end) {
9840   var start = this,
9841       ancestor = leastCommonAncestor(start, end),
9842       nodes = [start];
9843   while (start !== ancestor) {
9844     start = start.parent;
9845     nodes.push(start);
9846   }
9847   var k = nodes.length;
9848   while (end !== ancestor) {
9849     nodes.splice(k, 0, end);
9850     end = end.parent;
9851   }
9852   return nodes;
9853 };
9854
9855 function leastCommonAncestor(a, b) {
9856   if (a === b) return a;
9857   var aNodes = a.ancestors(),
9858       bNodes = b.ancestors(),
9859       c = null;
9860   a = aNodes.pop();
9861   b = bNodes.pop();
9862   while (a === b) {
9863     c = a;
9864     a = aNodes.pop();
9865     b = bNodes.pop();
9866   }
9867   return c;
9868 }
9869
9870 var node_ancestors = function() {
9871   var node = this, nodes = [node];
9872   while (node = node.parent) {
9873     nodes.push(node);
9874   }
9875   return nodes;
9876 };
9877
9878 var node_descendants = function() {
9879   var nodes = [];
9880   this.each(function(node) {
9881     nodes.push(node);
9882   });
9883   return nodes;
9884 };
9885
9886 var node_leaves = function() {
9887   var leaves = [];
9888   this.eachBefore(function(node) {
9889     if (!node.children) {
9890       leaves.push(node);
9891     }
9892   });
9893   return leaves;
9894 };
9895
9896 var node_links = function() {
9897   var root = this, links = [];
9898   root.each(function(node) {
9899     if (node !== root) { // Don’t include the root’s parent, if any.
9900       links.push({source: node.parent, target: node});
9901     }
9902   });
9903   return links;
9904 };
9905
9906 function hierarchy(data, children) {
9907   var root = new Node(data),
9908       valued = +data.value && (root.value = data.value),
9909       node,
9910       nodes = [root],
9911       child,
9912       childs,
9913       i,
9914       n;
9915
9916   if (children == null) children = defaultChildren;
9917
9918   while (node = nodes.pop()) {
9919     if (valued) node.value = +node.data.value;
9920     if ((childs = children(node.data)) && (n = childs.length)) {
9921       node.children = new Array(n);
9922       for (i = n - 1; i >= 0; --i) {
9923         nodes.push(child = node.children[i] = new Node(childs[i]));
9924         child.parent = node;
9925         child.depth = node.depth + 1;
9926       }
9927     }
9928   }
9929
9930   return root.eachBefore(computeHeight);
9931 }
9932
9933 function node_copy() {
9934   return hierarchy(this).eachBefore(copyData);
9935 }
9936
9937 function defaultChildren(d) {
9938   return d.children;
9939 }
9940
9941 function copyData(node) {
9942   node.data = node.data.data;
9943 }
9944
9945 function computeHeight(node) {
9946   var height = 0;
9947   do node.height = height;
9948   while ((node = node.parent) && (node.height < ++height));
9949 }
9950
9951 function Node(data) {
9952   this.data = data;
9953   this.depth =
9954   this.height = 0;
9955   this.parent = null;
9956 }
9957
9958 Node.prototype = hierarchy.prototype = {
9959   constructor: Node,
9960   count: node_count,
9961   each: node_each,
9962   eachAfter: node_eachAfter,
9963   eachBefore: node_eachBefore,
9964   sum: node_sum,
9965   sort: node_sort,
9966   path: node_path,
9967   ancestors: node_ancestors,
9968   descendants: node_descendants,
9969   leaves: node_leaves,
9970   links: node_links,
9971   copy: node_copy
9972 };
9973
9974 var slice$3 = Array.prototype.slice;
9975
9976 function shuffle$1(array) {
9977   var m = array.length,
9978       t,
9979       i;
9980
9981   while (m) {
9982     i = Math.random() * m-- | 0;
9983     t = array[m];
9984     array[m] = array[i];
9985     array[i] = t;
9986   }
9987
9988   return array;
9989 }
9990
9991 var enclose = function(circles) {
9992   var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
9993
9994   while (i < n) {
9995     p = circles[i];
9996     if (e && enclosesWeak(e, p)) ++i;
9997     else e = encloseBasis(B = extendBasis(B, p)), i = 0;
9998   }
9999
10000   return e;
10001 };
10002
10003 function extendBasis(B, p) {
10004   var i, j;
10005
10006   if (enclosesWeakAll(p, B)) return [p];
10007
10008   // If we get here then B must have at least one element.
10009   for (i = 0; i < B.length; ++i) {
10010     if (enclosesNot(p, B[i])
10011         && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10012       return [B[i], p];
10013     }
10014   }
10015
10016   // If we get here then B must have at least two elements.
10017   for (i = 0; i < B.length - 1; ++i) {
10018     for (j = i + 1; j < B.length; ++j) {
10019       if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10020           && enclosesNot(encloseBasis2(B[i], p), B[j])
10021           && enclosesNot(encloseBasis2(B[j], p), B[i])
10022           && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10023         return [B[i], B[j], p];
10024       }
10025     }
10026   }
10027
10028   // If we get here then something is very wrong.
10029   throw new Error;
10030 }
10031
10032 function enclosesNot(a, b) {
10033   var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10034   return dr < 0 || dr * dr < dx * dx + dy * dy;
10035 }
10036
10037 function enclosesWeak(a, b) {
10038   var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10039   return dr > 0 && dr * dr > dx * dx + dy * dy;
10040 }
10041
10042 function enclosesWeakAll(a, B) {
10043   for (var i = 0; i < B.length; ++i) {
10044     if (!enclosesWeak(a, B[i])) {
10045       return false;
10046     }
10047   }
10048   return true;
10049 }
10050
10051 function encloseBasis(B) {
10052   switch (B.length) {
10053     case 1: return encloseBasis1(B[0]);
10054     case 2: return encloseBasis2(B[0], B[1]);
10055     case 3: return encloseBasis3(B[0], B[1], B[2]);
10056   }
10057 }
10058
10059 function encloseBasis1(a) {
10060   return {
10061     x: a.x,
10062     y: a.y,
10063     r: a.r
10064   };
10065 }
10066
10067 function encloseBasis2(a, b) {
10068   var x1 = a.x, y1 = a.y, r1 = a.r,
10069       x2 = b.x, y2 = b.y, r2 = b.r,
10070       x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10071       l = Math.sqrt(x21 * x21 + y21 * y21);
10072   return {
10073     x: (x1 + x2 + x21 / l * r21) / 2,
10074     y: (y1 + y2 + y21 / l * r21) / 2,
10075     r: (l + r1 + r2) / 2
10076   };
10077 }
10078
10079 function encloseBasis3(a, b, c) {
10080   var x1 = a.x, y1 = a.y, r1 = a.r,
10081       x2 = b.x, y2 = b.y, r2 = b.r,
10082       x3 = c.x, y3 = c.y, r3 = c.r,
10083       a2 = x1 - x2,
10084       a3 = x1 - x3,
10085       b2 = y1 - y2,
10086       b3 = y1 - y3,
10087       c2 = r2 - r1,
10088       c3 = r3 - r1,
10089       d1 = x1 * x1 + y1 * y1 - r1 * r1,
10090       d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10091       d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10092       ab = a3 * b2 - a2 * b3,
10093       xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10094       xb = (b3 * c2 - b2 * c3) / ab,
10095       ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10096       yb = (a2 * c3 - a3 * c2) / ab,
10097       A = xb * xb + yb * yb - 1,
10098       B = 2 * (r1 + xa * xb + ya * yb),
10099       C = xa * xa + ya * ya - r1 * r1,
10100       r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10101   return {
10102     x: x1 + xa + xb * r,
10103     y: y1 + ya + yb * r,
10104     r: r
10105   };
10106 }
10107
10108 function place(a, b, c) {
10109   var ax = a.x,
10110       ay = a.y,
10111       da = b.r + c.r,
10112       db = a.r + c.r,
10113       dx = b.x - ax,
10114       dy = b.y - ay,
10115       dc = dx * dx + dy * dy;
10116   if (dc) {
10117     var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10118         y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10119     c.x = ax + x * dx + y * dy;
10120     c.y = ay + x * dy - y * dx;
10121   } else {
10122     c.x = ax + db;
10123     c.y = ay;
10124   }
10125 }
10126
10127 function intersects(a, b) {
10128   var dx = b.x - a.x,
10129       dy = b.y - a.y,
10130       dr = a.r + b.r;
10131   return dr * dr - 1e-6 > dx * dx + dy * dy;
10132 }
10133
10134 function score(node) {
10135   var a = node._,
10136       b = node.next._,
10137       ab = a.r + b.r,
10138       dx = (a.x * b.r + b.x * a.r) / ab,
10139       dy = (a.y * b.r + b.y * a.r) / ab;
10140   return dx * dx + dy * dy;
10141 }
10142
10143 function Node$1(circle) {
10144   this._ = circle;
10145   this.next = null;
10146   this.previous = null;
10147 }
10148
10149 function packEnclose(circles) {
10150   if (!(n = circles.length)) return 0;
10151
10152   var a, b, c, n, aa, ca, i, j, k, sj, sk;
10153
10154   // Place the first circle.
10155   a = circles[0], a.x = 0, a.y = 0;
10156   if (!(n > 1)) return a.r;
10157
10158   // Place the second circle.
10159   b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10160   if (!(n > 2)) return a.r + b.r;
10161
10162   // Place the third circle.
10163   place(b, a, c = circles[2]);
10164
10165   // Initialize the front-chain using the first three circles a, b and c.
10166   a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10167   a.next = c.previous = b;
10168   b.next = a.previous = c;
10169   c.next = b.previous = a;
10170
10171   // Attempt to place each remaining circle…
10172   pack: for (i = 3; i < n; ++i) {
10173     place(a._, b._, c = circles[i]), c = new Node$1(c);
10174
10175     // Find the closest intersecting circle on the front-chain, if any.
10176     // “Closeness” is determined by linear distance along the front-chain.
10177     // “Ahead” or “behind” is likewise determined by linear distance.
10178     j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10179     do {
10180       if (sj <= sk) {
10181         if (intersects(j._, c._)) {
10182           b = j, a.next = b, b.previous = a, --i;
10183           continue pack;
10184         }
10185         sj += j._.r, j = j.next;
10186       } else {
10187         if (intersects(k._, c._)) {
10188           a = k, a.next = b, b.previous = a, --i;
10189           continue pack;
10190         }
10191         sk += k._.r, k = k.previous;
10192       }
10193     } while (j !== k.next);
10194
10195     // Success! Insert the new circle c between a and b.
10196     c.previous = a, c.next = b, a.next = b.previous = b = c;
10197
10198     // Compute the new closest circle pair to the centroid.
10199     aa = score(a);
10200     while ((c = c.next) !== b) {
10201       if ((ca = score(c)) < aa) {
10202         a = c, aa = ca;
10203       }
10204     }
10205     b = a.next;
10206   }
10207
10208   // Compute the enclosing circle of the front chain.
10209   a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10210
10211   // Translate the circles to put the enclosing circle around the origin.
10212   for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10213
10214   return c.r;
10215 }
10216
10217 var siblings = function(circles) {
10218   packEnclose(circles);
10219   return circles;
10220 };
10221
10222 function optional(f) {
10223   return f == null ? null : required(f);
10224 }
10225
10226 function required(f) {
10227   if (typeof f !== "function") throw new Error;
10228   return f;
10229 }
10230
10231 function constantZero() {
10232   return 0;
10233 }
10234
10235 var constant$8 = function(x) {
10236   return function() {
10237     return x;
10238   };
10239 };
10240
10241 function defaultRadius$1(d) {
10242   return Math.sqrt(d.value);
10243 }
10244
10245 var index$2 = function() {
10246   var radius = null,
10247       dx = 1,
10248       dy = 1,
10249       padding = constantZero;
10250
10251   function pack(root) {
10252     root.x = dx / 2, root.y = dy / 2;
10253     if (radius) {
10254       root.eachBefore(radiusLeaf(radius))
10255           .eachAfter(packChildren(padding, 0.5))
10256           .eachBefore(translateChild(1));
10257     } else {
10258       root.eachBefore(radiusLeaf(defaultRadius$1))
10259           .eachAfter(packChildren(constantZero, 1))
10260           .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10261           .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10262     }
10263     return root;
10264   }
10265
10266   pack.radius = function(x) {
10267     return arguments.length ? (radius = optional(x), pack) : radius;
10268   };
10269
10270   pack.size = function(x) {
10271     return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10272   };
10273
10274   pack.padding = function(x) {
10275     return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10276   };
10277
10278   return pack;
10279 };
10280
10281 function radiusLeaf(radius) {
10282   return function(node) {
10283     if (!node.children) {
10284       node.r = Math.max(0, +radius(node) || 0);
10285     }
10286   };
10287 }
10288
10289 function packChildren(padding, k) {
10290   return function(node) {
10291     if (children = node.children) {
10292       var children,
10293           i,
10294           n = children.length,
10295           r = padding(node) * k || 0,
10296           e;
10297
10298       if (r) for (i = 0; i < n; ++i) children[i].r += r;
10299       e = packEnclose(children);
10300       if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10301       node.r = e + r;
10302     }
10303   };
10304 }
10305
10306 function translateChild(k) {
10307   return function(node) {
10308     var parent = node.parent;
10309     node.r *= k;
10310     if (parent) {
10311       node.x = parent.x + k * node.x;
10312       node.y = parent.y + k * node.y;
10313     }
10314   };
10315 }
10316
10317 var roundNode = function(node) {
10318   node.x0 = Math.round(node.x0);
10319   node.y0 = Math.round(node.y0);
10320   node.x1 = Math.round(node.x1);
10321   node.y1 = Math.round(node.y1);
10322 };
10323
10324 var treemapDice = function(parent, x0, y0, x1, y1) {
10325   var nodes = parent.children,
10326       node,
10327       i = -1,
10328       n = nodes.length,
10329       k = parent.value && (x1 - x0) / parent.value;
10330
10331   while (++i < n) {
10332     node = nodes[i], node.y0 = y0, node.y1 = y1;
10333     node.x0 = x0, node.x1 = x0 += node.value * k;
10334   }
10335 };
10336
10337 var partition = function() {
10338   var dx = 1,
10339       dy = 1,
10340       padding = 0,
10341       round = false;
10342
10343   function partition(root) {
10344     var n = root.height + 1;
10345     root.x0 =
10346     root.y0 = padding;
10347     root.x1 = dx;
10348     root.y1 = dy / n;
10349     root.eachBefore(positionNode(dy, n));
10350     if (round) root.eachBefore(roundNode);
10351     return root;
10352   }
10353
10354   function positionNode(dy, n) {
10355     return function(node) {
10356       if (node.children) {
10357         treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10358       }
10359       var x0 = node.x0,
10360           y0 = node.y0,
10361           x1 = node.x1 - padding,
10362           y1 = node.y1 - padding;
10363       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10364       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10365       node.x0 = x0;
10366       node.y0 = y0;
10367       node.x1 = x1;
10368       node.y1 = y1;
10369     };
10370   }
10371
10372   partition.round = function(x) {
10373     return arguments.length ? (round = !!x, partition) : round;
10374   };
10375
10376   partition.size = function(x) {
10377     return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10378   };
10379
10380   partition.padding = function(x) {
10381     return arguments.length ? (padding = +x, partition) : padding;
10382   };
10383
10384   return partition;
10385 };
10386
10387 var keyPrefix$1 = "$";
10388 var preroot = {depth: -1};
10389 var ambiguous = {};
10390
10391 function defaultId(d) {
10392   return d.id;
10393 }
10394
10395 function defaultParentId(d) {
10396   return d.parentId;
10397 }
10398
10399 var stratify = function() {
10400   var id = defaultId,
10401       parentId = defaultParentId;
10402
10403   function stratify(data) {
10404     var d,
10405         i,
10406         n = data.length,
10407         root,
10408         parent,
10409         node,
10410         nodes = new Array(n),
10411         nodeId,
10412         nodeKey,
10413         nodeByKey = {};
10414
10415     for (i = 0; i < n; ++i) {
10416       d = data[i], node = nodes[i] = new Node(d);
10417       if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10418         nodeKey = keyPrefix$1 + (node.id = nodeId);
10419         nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10420       }
10421     }
10422
10423     for (i = 0; i < n; ++i) {
10424       node = nodes[i], nodeId = parentId(data[i], i, data);
10425       if (nodeId == null || !(nodeId += "")) {
10426         if (root) throw new Error("multiple roots");
10427         root = node;
10428       } else {
10429         parent = nodeByKey[keyPrefix$1 + nodeId];
10430         if (!parent) throw new Error("missing: " + nodeId);
10431         if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10432         if (parent.children) parent.children.push(node);
10433         else parent.children = [node];
10434         node.parent = parent;
10435       }
10436     }
10437
10438     if (!root) throw new Error("no root");
10439     root.parent = preroot;
10440     root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10441     root.parent = null;
10442     if (n > 0) throw new Error("cycle");
10443
10444     return root;
10445   }
10446
10447   stratify.id = function(x) {
10448     return arguments.length ? (id = required(x), stratify) : id;
10449   };
10450
10451   stratify.parentId = function(x) {
10452     return arguments.length ? (parentId = required(x), stratify) : parentId;
10453   };
10454
10455   return stratify;
10456 };
10457
10458 function defaultSeparation$1(a, b) {
10459   return a.parent === b.parent ? 1 : 2;
10460 }
10461
10462 // function radialSeparation(a, b) {
10463 //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10464 // }
10465
10466 // This function is used to traverse the left contour of a subtree (or
10467 // subforest). It returns the successor of v on this contour. This successor is
10468 // either given by the leftmost child of v or by the thread of v. The function
10469 // returns null if and only if v is on the highest level of its subtree.
10470 function nextLeft(v) {
10471   var children = v.children;
10472   return children ? children[0] : v.t;
10473 }
10474
10475 // This function works analogously to nextLeft.
10476 function nextRight(v) {
10477   var children = v.children;
10478   return children ? children[children.length - 1] : v.t;
10479 }
10480
10481 // Shifts the current subtree rooted at w+. This is done by increasing
10482 // prelim(w+) and mod(w+) by shift.
10483 function moveSubtree(wm, wp, shift) {
10484   var change = shift / (wp.i - wm.i);
10485   wp.c -= change;
10486   wp.s += shift;
10487   wm.c += change;
10488   wp.z += shift;
10489   wp.m += shift;
10490 }
10491
10492 // All other shifts, applied to the smaller subtrees between w- and w+, are
10493 // performed by this function. To prepare the shifts, we have to adjust
10494 // change(w+), shift(w+), and change(w-).
10495 function executeShifts(v) {
10496   var shift = 0,
10497       change = 0,
10498       children = v.children,
10499       i = children.length,
10500       w;
10501   while (--i >= 0) {
10502     w = children[i];
10503     w.z += shift;
10504     w.m += shift;
10505     shift += w.s + (change += w.c);
10506   }
10507 }
10508
10509 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10510 // returns the specified (default) ancestor.
10511 function nextAncestor(vim, v, ancestor) {
10512   return vim.a.parent === v.parent ? vim.a : ancestor;
10513 }
10514
10515 function TreeNode(node, i) {
10516   this._ = node;
10517   this.parent = null;
10518   this.children = null;
10519   this.A = null; // default ancestor
10520   this.a = this; // ancestor
10521   this.z = 0; // prelim
10522   this.m = 0; // mod
10523   this.c = 0; // change
10524   this.s = 0; // shift
10525   this.t = null; // thread
10526   this.i = i; // number
10527 }
10528
10529 TreeNode.prototype = Object.create(Node.prototype);
10530
10531 function treeRoot(root) {
10532   var tree = new TreeNode(root, 0),
10533       node,
10534       nodes = [tree],
10535       child,
10536       children,
10537       i,
10538       n;
10539
10540   while (node = nodes.pop()) {
10541     if (children = node._.children) {
10542       node.children = new Array(n = children.length);
10543       for (i = n - 1; i >= 0; --i) {
10544         nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10545         child.parent = node;
10546       }
10547     }
10548   }
10549
10550   (tree.parent = new TreeNode(null, 0)).children = [tree];
10551   return tree;
10552 }
10553
10554 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10555 var tree = function() {
10556   var separation = defaultSeparation$1,
10557       dx = 1,
10558       dy = 1,
10559       nodeSize = null;
10560
10561   function tree(root) {
10562     var t = treeRoot(root);
10563
10564     // Compute the layout using Buchheim et al.’s algorithm.
10565     t.eachAfter(firstWalk), t.parent.m = -t.z;
10566     t.eachBefore(secondWalk);
10567
10568     // If a fixed node size is specified, scale x and y.
10569     if (nodeSize) root.eachBefore(sizeNode);
10570
10571     // If a fixed tree size is specified, scale x and y based on the extent.
10572     // Compute the left-most, right-most, and depth-most nodes for extents.
10573     else {
10574       var left = root,
10575           right = root,
10576           bottom = root;
10577       root.eachBefore(function(node) {
10578         if (node.x < left.x) left = node;
10579         if (node.x > right.x) right = node;
10580         if (node.depth > bottom.depth) bottom = node;
10581       });
10582       var s = left === right ? 1 : separation(left, right) / 2,
10583           tx = s - left.x,
10584           kx = dx / (right.x + s + tx),
10585           ky = dy / (bottom.depth || 1);
10586       root.eachBefore(function(node) {
10587         node.x = (node.x + tx) * kx;
10588         node.y = node.depth * ky;
10589       });
10590     }
10591
10592     return root;
10593   }
10594
10595   // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10596   // applied recursively to the children of v, as well as the function
10597   // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10598   // node v is placed to the midpoint of its outermost children.
10599   function firstWalk(v) {
10600     var children = v.children,
10601         siblings = v.parent.children,
10602         w = v.i ? siblings[v.i - 1] : null;
10603     if (children) {
10604       executeShifts(v);
10605       var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10606       if (w) {
10607         v.z = w.z + separation(v._, w._);
10608         v.m = v.z - midpoint;
10609       } else {
10610         v.z = midpoint;
10611       }
10612     } else if (w) {
10613       v.z = w.z + separation(v._, w._);
10614     }
10615     v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10616   }
10617
10618   // Computes all real x-coordinates by summing up the modifiers recursively.
10619   function secondWalk(v) {
10620     v._.x = v.z + v.parent.m;
10621     v.m += v.parent.m;
10622   }
10623
10624   // The core of the algorithm. Here, a new subtree is combined with the
10625   // previous subtrees. Threads are used to traverse the inside and outside
10626   // contours of the left and right subtree up to the highest common level. The
10627   // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10628   // superscript o means outside and i means inside, the subscript - means left
10629   // subtree and + means right subtree. For summing up the modifiers along the
10630   // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10631   // nodes of the inside contours conflict, we compute the left one of the
10632   // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10633   // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10634   // Finally, we add a new thread (if necessary).
10635   function apportion(v, w, ancestor) {
10636     if (w) {
10637       var vip = v,
10638           vop = v,
10639           vim = w,
10640           vom = vip.parent.children[0],
10641           sip = vip.m,
10642           sop = vop.m,
10643           sim = vim.m,
10644           som = vom.m,
10645           shift;
10646       while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10647         vom = nextLeft(vom);
10648         vop = nextRight(vop);
10649         vop.a = v;
10650         shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10651         if (shift > 0) {
10652           moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10653           sip += shift;
10654           sop += shift;
10655         }
10656         sim += vim.m;
10657         sip += vip.m;
10658         som += vom.m;
10659         sop += vop.m;
10660       }
10661       if (vim && !nextRight(vop)) {
10662         vop.t = vim;
10663         vop.m += sim - sop;
10664       }
10665       if (vip && !nextLeft(vom)) {
10666         vom.t = vip;
10667         vom.m += sip - som;
10668         ancestor = v;
10669       }
10670     }
10671     return ancestor;
10672   }
10673
10674   function sizeNode(node) {
10675     node.x *= dx;
10676     node.y = node.depth * dy;
10677   }
10678
10679   tree.separation = function(x) {
10680     return arguments.length ? (separation = x, tree) : separation;
10681   };
10682
10683   tree.size = function(x) {
10684     return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10685   };
10686
10687   tree.nodeSize = function(x) {
10688     return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10689   };
10690
10691   return tree;
10692 };
10693
10694 var treemapSlice = function(parent, x0, y0, x1, y1) {
10695   var nodes = parent.children,
10696       node,
10697       i = -1,
10698       n = nodes.length,
10699       k = parent.value && (y1 - y0) / parent.value;
10700
10701   while (++i < n) {
10702     node = nodes[i], node.x0 = x0, node.x1 = x1;
10703     node.y0 = y0, node.y1 = y0 += node.value * k;
10704   }
10705 };
10706
10707 var phi = (1 + Math.sqrt(5)) / 2;
10708
10709 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10710   var rows = [],
10711       nodes = parent.children,
10712       row,
10713       nodeValue,
10714       i0 = 0,
10715       i1 = 0,
10716       n = nodes.length,
10717       dx, dy,
10718       value = parent.value,
10719       sumValue,
10720       minValue,
10721       maxValue,
10722       newRatio,
10723       minRatio,
10724       alpha,
10725       beta;
10726
10727   while (i0 < n) {
10728     dx = x1 - x0, dy = y1 - y0;
10729
10730     // Find the next non-empty node.
10731     do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10732     minValue = maxValue = sumValue;
10733     alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10734     beta = sumValue * sumValue * alpha;
10735     minRatio = Math.max(maxValue / beta, beta / minValue);
10736
10737     // Keep adding nodes while the aspect ratio maintains or improves.
10738     for (; i1 < n; ++i1) {
10739       sumValue += nodeValue = nodes[i1].value;
10740       if (nodeValue < minValue) minValue = nodeValue;
10741       if (nodeValue > maxValue) maxValue = nodeValue;
10742       beta = sumValue * sumValue * alpha;
10743       newRatio = Math.max(maxValue / beta, beta / minValue);
10744       if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10745       minRatio = newRatio;
10746     }
10747
10748     // Position and record the row orientation.
10749     rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10750     if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10751     else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10752     value -= sumValue, i0 = i1;
10753   }
10754
10755   return rows;
10756 }
10757
10758 var squarify = (function custom(ratio) {
10759
10760   function squarify(parent, x0, y0, x1, y1) {
10761     squarifyRatio(ratio, parent, x0, y0, x1, y1);
10762   }
10763
10764   squarify.ratio = function(x) {
10765     return custom((x = +x) > 1 ? x : 1);
10766   };
10767
10768   return squarify;
10769 })(phi);
10770
10771 var index$3 = function() {
10772   var tile = squarify,
10773       round = false,
10774       dx = 1,
10775       dy = 1,
10776       paddingStack = [0],
10777       paddingInner = constantZero,
10778       paddingTop = constantZero,
10779       paddingRight = constantZero,
10780       paddingBottom = constantZero,
10781       paddingLeft = constantZero;
10782
10783   function treemap(root) {
10784     root.x0 =
10785     root.y0 = 0;
10786     root.x1 = dx;
10787     root.y1 = dy;
10788     root.eachBefore(positionNode);
10789     paddingStack = [0];
10790     if (round) root.eachBefore(roundNode);
10791     return root;
10792   }
10793
10794   function positionNode(node) {
10795     var p = paddingStack[node.depth],
10796         x0 = node.x0 + p,
10797         y0 = node.y0 + p,
10798         x1 = node.x1 - p,
10799         y1 = node.y1 - p;
10800     if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10801     if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10802     node.x0 = x0;
10803     node.y0 = y0;
10804     node.x1 = x1;
10805     node.y1 = y1;
10806     if (node.children) {
10807       p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10808       x0 += paddingLeft(node) - p;
10809       y0 += paddingTop(node) - p;
10810       x1 -= paddingRight(node) - p;
10811       y1 -= paddingBottom(node) - p;
10812       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10813       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10814       tile(node, x0, y0, x1, y1);
10815     }
10816   }
10817
10818   treemap.round = function(x) {
10819     return arguments.length ? (round = !!x, treemap) : round;
10820   };
10821
10822   treemap.size = function(x) {
10823     return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10824   };
10825
10826   treemap.tile = function(x) {
10827     return arguments.length ? (tile = required(x), treemap) : tile;
10828   };
10829
10830   treemap.padding = function(x) {
10831     return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10832   };
10833
10834   treemap.paddingInner = function(x) {
10835     return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10836   };
10837
10838   treemap.paddingOuter = function(x) {
10839     return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10840   };
10841
10842   treemap.paddingTop = function(x) {
10843     return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10844   };
10845
10846   treemap.paddingRight = function(x) {
10847     return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10848   };
10849
10850   treemap.paddingBottom = function(x) {
10851     return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10852   };
10853
10854   treemap.paddingLeft = function(x) {
10855     return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10856   };
10857
10858   return treemap;
10859 };
10860
10861 var binary = function(parent, x0, y0, x1, y1) {
10862   var nodes = parent.children,
10863       i, n = nodes.length,
10864       sum, sums = new Array(n + 1);
10865
10866   for (sums[0] = sum = i = 0; i < n; ++i) {
10867     sums[i + 1] = sum += nodes[i].value;
10868   }
10869
10870   partition(0, n, parent.value, x0, y0, x1, y1);
10871
10872   function partition(i, j, value, x0, y0, x1, y1) {
10873     if (i >= j - 1) {
10874       var node = nodes[i];
10875       node.x0 = x0, node.y0 = y0;
10876       node.x1 = x1, node.y1 = y1;
10877       return;
10878     }
10879
10880     var valueOffset = sums[i],
10881         valueTarget = (value / 2) + valueOffset,
10882         k = i + 1,
10883         hi = j - 1;
10884
10885     while (k < hi) {
10886       var mid = k + hi >>> 1;
10887       if (sums[mid] < valueTarget) k = mid + 1;
10888       else hi = mid;
10889     }
10890
10891     if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10892
10893     var valueLeft = sums[k] - valueOffset,
10894         valueRight = value - valueLeft;
10895
10896     if ((x1 - x0) > (y1 - y0)) {
10897       var xk = (x0 * valueRight + x1 * valueLeft) / value;
10898       partition(i, k, valueLeft, x0, y0, xk, y1);
10899       partition(k, j, valueRight, xk, y0, x1, y1);
10900     } else {
10901       var yk = (y0 * valueRight + y1 * valueLeft) / value;
10902       partition(i, k, valueLeft, x0, y0, x1, yk);
10903       partition(k, j, valueRight, x0, yk, x1, y1);
10904     }
10905   }
10906 };
10907
10908 var sliceDice = function(parent, x0, y0, x1, y1) {
10909   (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10910 };
10911
10912 var resquarify = (function custom(ratio) {
10913
10914   function resquarify(parent, x0, y0, x1, y1) {
10915     if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10916       var rows,
10917           row,
10918           nodes,
10919           i,
10920           j = -1,
10921           n,
10922           m = rows.length,
10923           value = parent.value;
10924
10925       while (++j < m) {
10926         row = rows[j], nodes = row.children;
10927         for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10928         if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10929         else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10930         value -= row.value;
10931       }
10932     } else {
10933       parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10934       rows.ratio = ratio;
10935     }
10936   }
10937
10938   resquarify.ratio = function(x) {
10939     return custom((x = +x) > 1 ? x : 1);
10940   };
10941
10942   return resquarify;
10943 })(phi);
10944
10945 var d3_polygonArea = function(polygon) {
10946   var i = -1,
10947       n = polygon.length,
10948       a,
10949       b = polygon[n - 1],
10950       area = 0;
10951
10952   while (++i < n) {
10953     a = b;
10954     b = polygon[i];
10955     area += a[1] * b[0] - a[0] * b[1];
10956   }
10957
10958   return area / 2;
10959 };
10960
10961 var d3_polygonCentroid = function(polygon) {
10962   var i = -1,
10963       n = polygon.length,
10964       x = 0,
10965       y = 0,
10966       a,
10967       b = polygon[n - 1],
10968       c,
10969       k = 0;
10970
10971   while (++i < n) {
10972     a = b;
10973     b = polygon[i];
10974     k += c = a[0] * b[1] - b[0] * a[1];
10975     x += (a[0] + b[0]) * c;
10976     y += (a[1] + b[1]) * c;
10977   }
10978
10979   return k *= 3, [x / k, y / k];
10980 };
10981
10982 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
10983 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
10984 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
10985 // negative if clockwise, and zero if the points are collinear.
10986 var cross$1 = function(a, b, c) {
10987   return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
10988 };
10989
10990 function lexicographicOrder(a, b) {
10991   return a[0] - b[0] || a[1] - b[1];
10992 }
10993
10994 // Computes the upper convex hull per the monotone chain algorithm.
10995 // Assumes points.length >= 3, is sorted by x, unique in y.
10996 // Returns an array of indices into points in left-to-right order.
10997 function computeUpperHullIndexes(points) {
10998   var n = points.length,
10999       indexes = [0, 1],
11000       size = 2;
11001
11002   for (var i = 2; i < n; ++i) {
11003     while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11004     indexes[size++] = i;
11005   }
11006
11007   return indexes.slice(0, size); // remove popped points
11008 }
11009
11010 var d3_polygonHull = function(points) {
11011   if ((n = points.length) < 3) return null;
11012
11013   var i,
11014       n,
11015       sortedPoints = new Array(n),
11016       flippedPoints = new Array(n);
11017
11018   for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11019   sortedPoints.sort(lexicographicOrder);
11020   for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11021
11022   var upperIndexes = computeUpperHullIndexes(sortedPoints),
11023       lowerIndexes = computeUpperHullIndexes(flippedPoints);
11024
11025   // Construct the hull polygon, removing possible duplicate endpoints.
11026   var skipLeft = lowerIndexes[0] === upperIndexes[0],
11027       skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11028       hull = [];
11029
11030   // Add upper hull in right-to-l order.
11031   // Then add lower hull in left-to-right order.
11032   for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11033   for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11034
11035   return hull;
11036 };
11037
11038 var contains$1 = function(polygon, point) {
11039   var n = polygon.length,
11040       p = polygon[n - 1],
11041       x = point[0], y = point[1],
11042       x0 = p[0], y0 = p[1],
11043       x1, y1,
11044       inside = false;
11045
11046   for (var i = 0; i < n; ++i) {
11047     p = polygon[i], x1 = p[0], y1 = p[1];
11048     if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11049     x0 = x1, y0 = y1;
11050   }
11051
11052   return inside;
11053 };
11054
11055 var length$1 = function(polygon) {
11056   var i = -1,
11057       n = polygon.length,
11058       b = polygon[n - 1],
11059       xa,
11060       ya,
11061       xb = b[0],
11062       yb = b[1],
11063       perimeter = 0;
11064
11065   while (++i < n) {
11066     xa = xb;
11067     ya = yb;
11068     b = polygon[i];
11069     xb = b[0];
11070     yb = b[1];
11071     xa -= xb;
11072     ya -= yb;
11073     perimeter += Math.sqrt(xa * xa + ya * ya);
11074   }
11075
11076   return perimeter;
11077 };
11078
11079 var slice$4 = [].slice;
11080
11081 var noabort = {};
11082
11083 function Queue(size) {
11084   this._size = size;
11085   this._call =
11086   this._error = null;
11087   this._tasks = [];
11088   this._data = [];
11089   this._waiting =
11090   this._active =
11091   this._ended =
11092   this._start = 0; // inside a synchronous task callback?
11093 }
11094
11095 Queue.prototype = queue.prototype = {
11096   constructor: Queue,
11097   defer: function(callback) {
11098     if (typeof callback !== "function") throw new Error("invalid callback");
11099     if (this._call) throw new Error("defer after await");
11100     if (this._error != null) return this;
11101     var t = slice$4.call(arguments, 1);
11102     t.push(callback);
11103     ++this._waiting, this._tasks.push(t);
11104     poke$1(this);
11105     return this;
11106   },
11107   abort: function() {
11108     if (this._error == null) abort(this, new Error("abort"));
11109     return this;
11110   },
11111   await: function(callback) {
11112     if (typeof callback !== "function") throw new Error("invalid callback");
11113     if (this._call) throw new Error("multiple await");
11114     this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11115     maybeNotify(this);
11116     return this;
11117   },
11118   awaitAll: function(callback) {
11119     if (typeof callback !== "function") throw new Error("invalid callback");
11120     if (this._call) throw new Error("multiple await");
11121     this._call = callback;
11122     maybeNotify(this);
11123     return this;
11124   }
11125 };
11126
11127 function poke$1(q) {
11128   if (!q._start) {
11129     try { start$1(q); } // let the current task complete
11130     catch (e) {
11131       if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11132       else if (!q._data) throw e; // await callback errored synchronously
11133     }
11134   }
11135 }
11136
11137 function start$1(q) {
11138   while (q._start = q._waiting && q._active < q._size) {
11139     var i = q._ended + q._active,
11140         t = q._tasks[i],
11141         j = t.length - 1,
11142         c = t[j];
11143     t[j] = end(q, i);
11144     --q._waiting, ++q._active;
11145     t = c.apply(null, t);
11146     if (!q._tasks[i]) continue; // task finished synchronously
11147     q._tasks[i] = t || noabort;
11148   }
11149 }
11150
11151 function end(q, i) {
11152   return function(e, r) {
11153     if (!q._tasks[i]) return; // ignore multiple callbacks
11154     --q._active, ++q._ended;
11155     q._tasks[i] = null;
11156     if (q._error != null) return; // ignore secondary errors
11157     if (e != null) {
11158       abort(q, e);
11159     } else {
11160       q._data[i] = r;
11161       if (q._waiting) poke$1(q);
11162       else maybeNotify(q);
11163     }
11164   };
11165 }
11166
11167 function abort(q, e) {
11168   var i = q._tasks.length, t;
11169   q._error = e; // ignore active callbacks
11170   q._data = undefined; // allow gc
11171   q._waiting = NaN; // prevent starting
11172
11173   while (--i >= 0) {
11174     if (t = q._tasks[i]) {
11175       q._tasks[i] = null;
11176       if (t.abort) {
11177         try { t.abort(); }
11178         catch (e) { /* ignore */ }
11179       }
11180     }
11181   }
11182
11183   q._active = NaN; // allow notification
11184   maybeNotify(q);
11185 }
11186
11187 function maybeNotify(q) {
11188   if (!q._active && q._call) {
11189     var d = q._data;
11190     q._data = undefined; // allow gc
11191     q._call(q._error, d);
11192   }
11193 }
11194
11195 function queue(concurrency) {
11196   if (concurrency == null) concurrency = Infinity;
11197   else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11198   return new Queue(concurrency);
11199 }
11200
11201 var defaultSource$1 = function() {
11202   return Math.random();
11203 };
11204
11205 var uniform = (function sourceRandomUniform(source) {
11206   function randomUniform(min, max) {
11207     min = min == null ? 0 : +min;
11208     max = max == null ? 1 : +max;
11209     if (arguments.length === 1) max = min, min = 0;
11210     else max -= min;
11211     return function() {
11212       return source() * max + min;
11213     };
11214   }
11215
11216   randomUniform.source = sourceRandomUniform;
11217
11218   return randomUniform;
11219 })(defaultSource$1);
11220
11221 var normal = (function sourceRandomNormal(source) {
11222   function randomNormal(mu, sigma) {
11223     var x, r;
11224     mu = mu == null ? 0 : +mu;
11225     sigma = sigma == null ? 1 : +sigma;
11226     return function() {
11227       var y;
11228
11229       // If available, use the second previously-generated uniform random.
11230       if (x != null) y = x, x = null;
11231
11232       // Otherwise, generate a new x and y.
11233       else do {
11234         x = source() * 2 - 1;
11235         y = source() * 2 - 1;
11236         r = x * x + y * y;
11237       } while (!r || r > 1);
11238
11239       return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11240     };
11241   }
11242
11243   randomNormal.source = sourceRandomNormal;
11244
11245   return randomNormal;
11246 })(defaultSource$1);
11247
11248 var logNormal = (function sourceRandomLogNormal(source) {
11249   function randomLogNormal() {
11250     var randomNormal = normal.source(source).apply(this, arguments);
11251     return function() {
11252       return Math.exp(randomNormal());
11253     };
11254   }
11255
11256   randomLogNormal.source = sourceRandomLogNormal;
11257
11258   return randomLogNormal;
11259 })(defaultSource$1);
11260
11261 var irwinHall = (function sourceRandomIrwinHall(source) {
11262   function randomIrwinHall(n) {
11263     return function() {
11264       for (var sum = 0, i = 0; i < n; ++i) sum += source();
11265       return sum;
11266     };
11267   }
11268
11269   randomIrwinHall.source = sourceRandomIrwinHall;
11270
11271   return randomIrwinHall;
11272 })(defaultSource$1);
11273
11274 var bates = (function sourceRandomBates(source) {
11275   function randomBates(n) {
11276     var randomIrwinHall = irwinHall.source(source)(n);
11277     return function() {
11278       return randomIrwinHall() / n;
11279     };
11280   }
11281
11282   randomBates.source = sourceRandomBates;
11283
11284   return randomBates;
11285 })(defaultSource$1);
11286
11287 var exponential$1 = (function sourceRandomExponential(source) {
11288   function randomExponential(lambda) {
11289     return function() {
11290       return -Math.log(1 - source()) / lambda;
11291     };
11292   }
11293
11294   randomExponential.source = sourceRandomExponential;
11295
11296   return randomExponential;
11297 })(defaultSource$1);
11298
11299 var d3_request = function(url, callback) {
11300   var request,
11301       event = dispatch("beforesend", "progress", "load", "error"),
11302       mimeType,
11303       headers = map$1(),
11304       xhr = new XMLHttpRequest,
11305       user = null,
11306       password = null,
11307       response,
11308       responseType,
11309       timeout = 0;
11310
11311   // If IE does not support CORS, use XDomainRequest.
11312   if (typeof XDomainRequest !== "undefined"
11313       && !("withCredentials" in xhr)
11314       && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11315
11316   "onload" in xhr
11317       ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11318       : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11319
11320   function respond(o) {
11321     var status = xhr.status, result;
11322     if (!status && hasResponse(xhr)
11323         || status >= 200 && status < 300
11324         || status === 304) {
11325       if (response) {
11326         try {
11327           result = response.call(request, xhr);
11328         } catch (e) {
11329           event.call("error", request, e);
11330           return;
11331         }
11332       } else {
11333         result = xhr;
11334       }
11335       event.call("load", request, result);
11336     } else {
11337       event.call("error", request, o);
11338     }
11339   }
11340
11341   xhr.onprogress = function(e) {
11342     event.call("progress", request, e);
11343   };
11344
11345   request = {
11346     header: function(name, value) {
11347       name = (name + "").toLowerCase();
11348       if (arguments.length < 2) return headers.get(name);
11349       if (value == null) headers.remove(name);
11350       else headers.set(name, value + "");
11351       return request;
11352     },
11353
11354     // If mimeType is non-null and no Accept header is set, a default is used.
11355     mimeType: function(value) {
11356       if (!arguments.length) return mimeType;
11357       mimeType = value == null ? null : value + "";
11358       return request;
11359     },
11360
11361     // Specifies what type the response value should take;
11362     // for instance, arraybuffer, blob, document, or text.
11363     responseType: function(value) {
11364       if (!arguments.length) return responseType;
11365       responseType = value;
11366       return request;
11367     },
11368
11369     timeout: function(value) {
11370       if (!arguments.length) return timeout;
11371       timeout = +value;
11372       return request;
11373     },
11374
11375     user: function(value) {
11376       return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11377     },
11378
11379     password: function(value) {
11380       return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11381     },
11382
11383     // Specify how to convert the response content to a specific type;
11384     // changes the callback value on "load" events.
11385     response: function(value) {
11386       response = value;
11387       return request;
11388     },
11389
11390     // Alias for send("GET", …).
11391     get: function(data, callback) {
11392       return request.send("GET", data, callback);
11393     },
11394
11395     // Alias for send("POST", …).
11396     post: function(data, callback) {
11397       return request.send("POST", data, callback);
11398     },
11399
11400     // If callback is non-null, it will be used for error and load events.
11401     send: function(method, data, callback) {
11402       xhr.open(method, url, true, user, password);
11403       if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11404       if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11405       if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11406       if (responseType != null) xhr.responseType = responseType;
11407       if (timeout > 0) xhr.timeout = timeout;
11408       if (callback == null && typeof data === "function") callback = data, data = null;
11409       if (callback != null && callback.length === 1) callback = fixCallback(callback);
11410       if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11411       event.call("beforesend", request, xhr);
11412       xhr.send(data == null ? null : data);
11413       return request;
11414     },
11415
11416     abort: function() {
11417       xhr.abort();
11418       return request;
11419     },
11420
11421     on: function() {
11422       var value = event.on.apply(event, arguments);
11423       return value === event ? request : value;
11424     }
11425   };
11426
11427   if (callback != null) {
11428     if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11429     return request.get(callback);
11430   }
11431
11432   return request;
11433 };
11434
11435 function fixCallback(callback) {
11436   return function(error, xhr) {
11437     callback(error == null ? xhr : null);
11438   };
11439 }
11440
11441 function hasResponse(xhr) {
11442   var type = xhr.responseType;
11443   return type && type !== "text"
11444       ? xhr.response // null on error
11445       : xhr.responseText; // "" on error
11446 }
11447
11448 var type$1 = function(defaultMimeType, response) {
11449   return function(url, callback) {
11450     var r = d3_request(url).mimeType(defaultMimeType).response(response);
11451     if (callback != null) {
11452       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11453       return r.get(callback);
11454     }
11455     return r;
11456   };
11457 };
11458
11459 var html = type$1("text/html", function(xhr) {
11460   return document.createRange().createContextualFragment(xhr.responseText);
11461 });
11462
11463 var d3_json = type$1("application/json", function(xhr) {
11464   return JSON.parse(xhr.responseText);
11465 });
11466
11467 var d3_text = type$1("text/plain", function(xhr) {
11468   return xhr.responseText;
11469 });
11470
11471 var d3_xml = type$1("application/xml", function(xhr) {
11472   var xml = xhr.responseXML;
11473   if (!xml) throw new Error("parse error");
11474   return xml;
11475 });
11476
11477 var dsv$1 = function(defaultMimeType, parse) {
11478   return function(url, row, callback) {
11479     if (arguments.length < 3) callback = row, row = null;
11480     var r = d3_request(url).mimeType(defaultMimeType);
11481     r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11482     r.row(row);
11483     return callback ? r.get(callback) : r;
11484   };
11485 };
11486
11487 function responseOf(parse, row) {
11488   return function(request) {
11489     return parse(request.responseText, row);
11490   };
11491 }
11492
11493 var csv$1 = dsv$1("text/csv", csvParse);
11494
11495 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11496
11497 var array$2 = Array.prototype;
11498
11499 var map$3 = array$2.map;
11500 var slice$5 = array$2.slice;
11501
11502 var implicit = {name: "implicit"};
11503
11504 function ordinal(range) {
11505   var index = map$1(),
11506       domain = [],
11507       unknown = implicit;
11508
11509   range = range == null ? [] : slice$5.call(range);
11510
11511   function scale(d) {
11512     var key = d + "", i = index.get(key);
11513     if (!i) {
11514       if (unknown !== implicit) return unknown;
11515       index.set(key, i = domain.push(d));
11516     }
11517     return range[(i - 1) % range.length];
11518   }
11519
11520   scale.domain = function(_) {
11521     if (!arguments.length) return domain.slice();
11522     domain = [], index = map$1();
11523     var i = -1, n = _.length, d, key;
11524     while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11525     return scale;
11526   };
11527
11528   scale.range = function(_) {
11529     return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11530   };
11531
11532   scale.unknown = function(_) {
11533     return arguments.length ? (unknown = _, scale) : unknown;
11534   };
11535
11536   scale.copy = function() {
11537     return ordinal()
11538         .domain(domain)
11539         .range(range)
11540         .unknown(unknown);
11541   };
11542
11543   return scale;
11544 }
11545
11546 function band() {
11547   var scale = ordinal().unknown(undefined),
11548       domain = scale.domain,
11549       ordinalRange = scale.range,
11550       range = [0, 1],
11551       step,
11552       bandwidth,
11553       round = false,
11554       paddingInner = 0,
11555       paddingOuter = 0,
11556       align = 0.5;
11557
11558   delete scale.unknown;
11559
11560   function rescale() {
11561     var n = domain().length,
11562         reverse = range[1] < range[0],
11563         start = range[reverse - 0],
11564         stop = range[1 - reverse];
11565     step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11566     if (round) step = Math.floor(step);
11567     start += (stop - start - step * (n - paddingInner)) * align;
11568     bandwidth = step * (1 - paddingInner);
11569     if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11570     var values = d3_range(n).map(function(i) { return start + step * i; });
11571     return ordinalRange(reverse ? values.reverse() : values);
11572   }
11573
11574   scale.domain = function(_) {
11575     return arguments.length ? (domain(_), rescale()) : domain();
11576   };
11577
11578   scale.range = function(_) {
11579     return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
11580   };
11581
11582   scale.rangeRound = function(_) {
11583     return range = [+_[0], +_[1]], round = true, rescale();
11584   };
11585
11586   scale.bandwidth = function() {
11587     return bandwidth;
11588   };
11589
11590   scale.step = function() {
11591     return step;
11592   };
11593
11594   scale.round = function(_) {
11595     return arguments.length ? (round = !!_, rescale()) : round;
11596   };
11597
11598   scale.padding = function(_) {
11599     return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11600   };
11601
11602   scale.paddingInner = function(_) {
11603     return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11604   };
11605
11606   scale.paddingOuter = function(_) {
11607     return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11608   };
11609
11610   scale.align = function(_) {
11611     return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11612   };
11613
11614   scale.copy = function() {
11615     return band()
11616         .domain(domain())
11617         .range(range)
11618         .round(round)
11619         .paddingInner(paddingInner)
11620         .paddingOuter(paddingOuter)
11621         .align(align);
11622   };
11623
11624   return rescale();
11625 }
11626
11627 function pointish(scale) {
11628   var copy = scale.copy;
11629
11630   scale.padding = scale.paddingOuter;
11631   delete scale.paddingInner;
11632   delete scale.paddingOuter;
11633
11634   scale.copy = function() {
11635     return pointish(copy());
11636   };
11637
11638   return scale;
11639 }
11640
11641 function point$1() {
11642   return pointish(band().paddingInner(1));
11643 }
11644
11645 var constant$9 = function(x) {
11646   return function() {
11647     return x;
11648   };
11649 };
11650
11651 var number$2 = function(x) {
11652   return +x;
11653 };
11654
11655 var unit = [0, 1];
11656
11657 function deinterpolateLinear(a, b) {
11658   return (b -= (a = +a))
11659       ? function(x) { return (x - a) / b; }
11660       : constant$9(b);
11661 }
11662
11663 function deinterpolateClamp(deinterpolate) {
11664   return function(a, b) {
11665     var d = deinterpolate(a = +a, b = +b);
11666     return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11667   };
11668 }
11669
11670 function reinterpolateClamp(reinterpolate) {
11671   return function(a, b) {
11672     var r = reinterpolate(a = +a, b = +b);
11673     return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11674   };
11675 }
11676
11677 function bimap(domain, range, deinterpolate, reinterpolate) {
11678   var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
11679   if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11680   else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11681   return function(x) { return r0(d0(x)); };
11682 }
11683
11684 function polymap(domain, range, deinterpolate, reinterpolate) {
11685   var j = Math.min(domain.length, range.length) - 1,
11686       d = new Array(j),
11687       r = new Array(j),
11688       i = -1;
11689
11690   // Reverse descending domains.
11691   if (domain[j] < domain[0]) {
11692     domain = domain.slice().reverse();
11693     range = range.slice().reverse();
11694   }
11695
11696   while (++i < j) {
11697     d[i] = deinterpolate(domain[i], domain[i + 1]);
11698     r[i] = reinterpolate(range[i], range[i + 1]);
11699   }
11700
11701   return function(x) {
11702     var i = bisectRight(domain, x, 1, j) - 1;
11703     return r[i](d[i](x));
11704   };
11705 }
11706
11707 function copy(source, target) {
11708   return target
11709       .domain(source.domain())
11710       .range(source.range())
11711       .interpolate(source.interpolate())
11712       .clamp(source.clamp());
11713 }
11714
11715 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11716 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11717 function continuous(deinterpolate, reinterpolate) {
11718   var domain = unit,
11719       range = unit,
11720       interpolate = d3_interpolate,
11721       clamp = false,
11722       piecewise,
11723       output,
11724       input;
11725
11726   function rescale() {
11727     piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
11728     output = input = null;
11729     return scale;
11730   }
11731
11732   function scale(x) {
11733     return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);
11734   }
11735
11736   scale.invert = function(y) {
11737     return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11738   };
11739
11740   scale.domain = function(_) {
11741     return arguments.length ? (domain = map$3.call(_, number$2), rescale()) : domain.slice();
11742   };
11743
11744   scale.range = function(_) {
11745     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
11746   };
11747
11748   scale.rangeRound = function(_) {
11749     return range = slice$5.call(_), interpolate = interpolateRound, rescale();
11750   };
11751
11752   scale.clamp = function(_) {
11753     return arguments.length ? (clamp = !!_, rescale()) : clamp;
11754   };
11755
11756   scale.interpolate = function(_) {
11757     return arguments.length ? (interpolate = _, rescale()) : interpolate;
11758   };
11759
11760   return rescale();
11761 }
11762
11763 var tickFormat = function(domain, count, specifier) {
11764   var start = domain[0],
11765       stop = domain[domain.length - 1],
11766       step = tickStep(start, stop, count == null ? 10 : count),
11767       precision;
11768   specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11769   switch (specifier.type) {
11770     case "s": {
11771       var value = Math.max(Math.abs(start), Math.abs(stop));
11772       if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11773       return formatPrefix(specifier, value);
11774     }
11775     case "":
11776     case "e":
11777     case "g":
11778     case "p":
11779     case "r": {
11780       if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11781       break;
11782     }
11783     case "f":
11784     case "%": {
11785       if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11786       break;
11787     }
11788   }
11789   return format(specifier);
11790 };
11791
11792 function linearish(scale) {
11793   var domain = scale.domain;
11794
11795   scale.ticks = function(count) {
11796     var d = domain();
11797     return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11798   };
11799
11800   scale.tickFormat = function(count, specifier) {
11801     return tickFormat(domain(), count, specifier);
11802   };
11803
11804   scale.nice = function(count) {
11805     if (count == null) count = 10;
11806
11807     var d = domain(),
11808         i0 = 0,
11809         i1 = d.length - 1,
11810         start = d[i0],
11811         stop = d[i1],
11812         step;
11813
11814     if (stop < start) {
11815       step = start, start = stop, stop = step;
11816       step = i0, i0 = i1, i1 = step;
11817     }
11818
11819     step = tickIncrement(start, stop, count);
11820
11821     if (step > 0) {
11822       start = Math.floor(start / step) * step;
11823       stop = Math.ceil(stop / step) * step;
11824       step = tickIncrement(start, stop, count);
11825     } else if (step < 0) {
11826       start = Math.ceil(start * step) / step;
11827       stop = Math.floor(stop * step) / step;
11828       step = tickIncrement(start, stop, count);
11829     }
11830
11831     if (step > 0) {
11832       d[i0] = Math.floor(start / step) * step;
11833       d[i1] = Math.ceil(stop / step) * step;
11834       domain(d);
11835     } else if (step < 0) {
11836       d[i0] = Math.ceil(start * step) / step;
11837       d[i1] = Math.floor(stop * step) / step;
11838       domain(d);
11839     }
11840
11841     return scale;
11842   };
11843
11844   return scale;
11845 }
11846
11847 function linear$2() {
11848   var scale = continuous(deinterpolateLinear, d3_interpolateNumber);
11849
11850   scale.copy = function() {
11851     return copy(scale, linear$2());
11852   };
11853
11854   return linearish(scale);
11855 }
11856
11857 function identity$5() {
11858   var domain = [0, 1];
11859
11860   function scale(x) {
11861     return +x;
11862   }
11863
11864   scale.invert = scale;
11865
11866   scale.domain = scale.range = function(_) {
11867     return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice();
11868   };
11869
11870   scale.copy = function() {
11871     return identity$5().domain(domain);
11872   };
11873
11874   return linearish(scale);
11875 }
11876
11877 var nice = function(domain, interval) {
11878   domain = domain.slice();
11879
11880   var i0 = 0,
11881       i1 = domain.length - 1,
11882       x0 = domain[i0],
11883       x1 = domain[i1],
11884       t;
11885
11886   if (x1 < x0) {
11887     t = i0, i0 = i1, i1 = t;
11888     t = x0, x0 = x1, x1 = t;
11889   }
11890
11891   domain[i0] = interval.floor(x0);
11892   domain[i1] = interval.ceil(x1);
11893   return domain;
11894 };
11895
11896 function deinterpolate(a, b) {
11897   return (b = Math.log(b / a))
11898       ? function(x) { return Math.log(x / a) / b; }
11899       : constant$9(b);
11900 }
11901
11902 function reinterpolate(a, b) {
11903   return a < 0
11904       ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11905       : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11906 }
11907
11908 function pow10(x) {
11909   return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11910 }
11911
11912 function powp(base) {
11913   return base === 10 ? pow10
11914       : base === Math.E ? Math.exp
11915       : function(x) { return Math.pow(base, x); };
11916 }
11917
11918 function logp(base) {
11919   return base === Math.E ? Math.log
11920       : base === 10 && Math.log10
11921       || base === 2 && Math.log2
11922       || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11923 }
11924
11925 function reflect(f) {
11926   return function(x) {
11927     return -f(-x);
11928   };
11929 }
11930
11931 function log$1() {
11932   var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11933       domain = scale.domain,
11934       base = 10,
11935       logs = logp(10),
11936       pows = powp(10);
11937
11938   function rescale() {
11939     logs = logp(base), pows = powp(base);
11940     if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11941     return scale;
11942   }
11943
11944   scale.base = function(_) {
11945     return arguments.length ? (base = +_, rescale()) : base;
11946   };
11947
11948   scale.domain = function(_) {
11949     return arguments.length ? (domain(_), rescale()) : domain();
11950   };
11951
11952   scale.ticks = function(count) {
11953     var d = domain(),
11954         u = d[0],
11955         v = d[d.length - 1],
11956         r;
11957
11958     if (r = v < u) i = u, u = v, v = i;
11959
11960     var i = logs(u),
11961         j = logs(v),
11962         p,
11963         k,
11964         t,
11965         n = count == null ? 10 : +count,
11966         z = [];
11967
11968     if (!(base % 1) && j - i < n) {
11969       i = Math.round(i) - 1, j = Math.round(j) + 1;
11970       if (u > 0) for (; i < j; ++i) {
11971         for (k = 1, p = pows(i); k < base; ++k) {
11972           t = p * k;
11973           if (t < u) continue;
11974           if (t > v) break;
11975           z.push(t);
11976         }
11977       } else for (; i < j; ++i) {
11978         for (k = base - 1, p = pows(i); k >= 1; --k) {
11979           t = p * k;
11980           if (t < u) continue;
11981           if (t > v) break;
11982           z.push(t);
11983         }
11984       }
11985     } else {
11986       z = ticks(i, j, Math.min(j - i, n)).map(pows);
11987     }
11988
11989     return r ? z.reverse() : z;
11990   };
11991
11992   scale.tickFormat = function(count, specifier) {
11993     if (specifier == null) specifier = base === 10 ? ".0e" : ",";
11994     if (typeof specifier !== "function") specifier = format(specifier);
11995     if (count === Infinity) return specifier;
11996     if (count == null) count = 10;
11997     var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
11998     return function(d) {
11999       var i = d / pows(Math.round(logs(d)));
12000       if (i * base < base - 0.5) i *= base;
12001       return i <= k ? specifier(d) : "";
12002     };
12003   };
12004
12005   scale.nice = function() {
12006     return domain(nice(domain(), {
12007       floor: function(x) { return pows(Math.floor(logs(x))); },
12008       ceil: function(x) { return pows(Math.ceil(logs(x))); }
12009     }));
12010   };
12011
12012   scale.copy = function() {
12013     return copy(scale, log$1().base(base));
12014   };
12015
12016   return scale;
12017 }
12018
12019 function raise$1(x, exponent) {
12020   return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12021 }
12022
12023 function pow$1() {
12024   var exponent = 1,
12025       scale = continuous(deinterpolate, reinterpolate),
12026       domain = scale.domain;
12027
12028   function deinterpolate(a, b) {
12029     return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12030         ? function(x) { return (raise$1(x, exponent) - a) / b; }
12031         : constant$9(b);
12032   }
12033
12034   function reinterpolate(a, b) {
12035     b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12036     return function(t) { return raise$1(a + b * t, 1 / exponent); };
12037   }
12038
12039   scale.exponent = function(_) {
12040     return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12041   };
12042
12043   scale.copy = function() {
12044     return copy(scale, pow$1().exponent(exponent));
12045   };
12046
12047   return linearish(scale);
12048 }
12049
12050 function sqrt$1() {
12051   return pow$1().exponent(0.5);
12052 }
12053
12054 function quantile() {
12055   var domain = [],
12056       range = [],
12057       thresholds = [];
12058
12059   function rescale() {
12060     var i = 0, n = Math.max(1, range.length);
12061     thresholds = new Array(n - 1);
12062     while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
12063     return scale;
12064   }
12065
12066   function scale(x) {
12067     if (!isNaN(x = +x)) return range[bisectRight(thresholds, x)];
12068   }
12069
12070   scale.invertExtent = function(y) {
12071     var i = range.indexOf(y);
12072     return i < 0 ? [NaN, NaN] : [
12073       i > 0 ? thresholds[i - 1] : domain[0],
12074       i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12075     ];
12076   };
12077
12078   scale.domain = function(_) {
12079     if (!arguments.length) return domain.slice();
12080     domain = [];
12081     for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12082     domain.sort(d3_ascending);
12083     return rescale();
12084   };
12085
12086   scale.range = function(_) {
12087     return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice();
12088   };
12089
12090   scale.quantiles = function() {
12091     return thresholds.slice();
12092   };
12093
12094   scale.copy = function() {
12095     return quantile()
12096         .domain(domain)
12097         .range(range);
12098   };
12099
12100   return scale;
12101 }
12102
12103 function quantize() {
12104   var x0 = 0,
12105       x1 = 1,
12106       n = 1,
12107       domain = [0.5],
12108       range = [0, 1];
12109
12110   function scale(x) {
12111     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12112   }
12113
12114   function rescale() {
12115     var i = -1;
12116     domain = new Array(n);
12117     while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12118     return scale;
12119   }
12120
12121   scale.domain = function(_) {
12122     return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12123   };
12124
12125   scale.range = function(_) {
12126     return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice();
12127   };
12128
12129   scale.invertExtent = function(y) {
12130     var i = range.indexOf(y);
12131     return i < 0 ? [NaN, NaN]
12132         : i < 1 ? [x0, domain[0]]
12133         : i >= n ? [domain[n - 1], x1]
12134         : [domain[i - 1], domain[i]];
12135   };
12136
12137   scale.copy = function() {
12138     return quantize()
12139         .domain([x0, x1])
12140         .range(range);
12141   };
12142
12143   return linearish(scale);
12144 }
12145
12146 function threshold$1() {
12147   var domain = [0.5],
12148       range = [0, 1],
12149       n = 1;
12150
12151   function scale(x) {
12152     if (x <= x) return range[bisectRight(domain, x, 0, n)];
12153   }
12154
12155   scale.domain = function(_) {
12156     return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
12157   };
12158
12159   scale.range = function(_) {
12160     return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12161   };
12162
12163   scale.invertExtent = function(y) {
12164     var i = range.indexOf(y);
12165     return [domain[i - 1], domain[i]];
12166   };
12167
12168   scale.copy = function() {
12169     return threshold$1()
12170         .domain(domain)
12171         .range(range);
12172   };
12173
12174   return scale;
12175 }
12176
12177 var t0$1 = new Date;
12178 var t1$1 = new Date;
12179
12180 function newInterval(floori, offseti, count, field) {
12181
12182   function interval(date) {
12183     return floori(date = new Date(+date)), date;
12184   }
12185
12186   interval.floor = interval;
12187
12188   interval.ceil = function(date) {
12189     return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12190   };
12191
12192   interval.round = function(date) {
12193     var d0 = interval(date),
12194         d1 = interval.ceil(date);
12195     return date - d0 < d1 - date ? d0 : d1;
12196   };
12197
12198   interval.offset = function(date, step) {
12199     return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12200   };
12201
12202   interval.range = function(start, stop, step) {
12203     var range = [];
12204     start = interval.ceil(start);
12205     step = step == null ? 1 : Math.floor(step);
12206     if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12207     do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop)
12208     return range;
12209   };
12210
12211   interval.filter = function(test) {
12212     return newInterval(function(date) {
12213       if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12214     }, function(date, step) {
12215       if (date >= date) {
12216         if (step < 0) while (++step <= 0) {
12217           while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12218         } else while (--step >= 0) {
12219           while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12220         }
12221       }
12222     });
12223   };
12224
12225   if (count) {
12226     interval.count = function(start, end) {
12227       t0$1.setTime(+start), t1$1.setTime(+end);
12228       floori(t0$1), floori(t1$1);
12229       return Math.floor(count(t0$1, t1$1));
12230     };
12231
12232     interval.every = function(step) {
12233       step = Math.floor(step);
12234       return !isFinite(step) || !(step > 0) ? null
12235           : !(step > 1) ? interval
12236           : interval.filter(field
12237               ? function(d) { return field(d) % step === 0; }
12238               : function(d) { return interval.count(0, d) % step === 0; });
12239     };
12240   }
12241
12242   return interval;
12243 }
12244
12245 var millisecond = newInterval(function() {
12246   // noop
12247 }, function(date, step) {
12248   date.setTime(+date + step);
12249 }, function(start, end) {
12250   return end - start;
12251 });
12252
12253 // An optimized implementation for this simple case.
12254 millisecond.every = function(k) {
12255   k = Math.floor(k);
12256   if (!isFinite(k) || !(k > 0)) return null;
12257   if (!(k > 1)) return millisecond;
12258   return newInterval(function(date) {
12259     date.setTime(Math.floor(date / k) * k);
12260   }, function(date, step) {
12261     date.setTime(+date + step * k);
12262   }, function(start, end) {
12263     return (end - start) / k;
12264   });
12265 };
12266
12267 var milliseconds = millisecond.range;
12268
12269 var durationSecond$1 = 1e3;
12270 var durationMinute$1 = 6e4;
12271 var durationHour$1 = 36e5;
12272 var durationDay$1 = 864e5;
12273 var durationWeek$1 = 6048e5;
12274
12275 var second = newInterval(function(date) {
12276   date.setTime(Math.floor(date / durationSecond$1) * durationSecond$1);
12277 }, function(date, step) {
12278   date.setTime(+date + step * durationSecond$1);
12279 }, function(start, end) {
12280   return (end - start) / durationSecond$1;
12281 }, function(date) {
12282   return date.getUTCSeconds();
12283 });
12284
12285 var seconds = second.range;
12286
12287 var minute = newInterval(function(date) {
12288   date.setTime(Math.floor(date / durationMinute$1) * durationMinute$1);
12289 }, function(date, step) {
12290   date.setTime(+date + step * durationMinute$1);
12291 }, function(start, end) {
12292   return (end - start) / durationMinute$1;
12293 }, function(date) {
12294   return date.getMinutes();
12295 });
12296
12297 var minutes = minute.range;
12298
12299 var hour = newInterval(function(date) {
12300   var offset = date.getTimezoneOffset() * durationMinute$1 % durationHour$1;
12301   if (offset < 0) offset += durationHour$1;
12302   date.setTime(Math.floor((+date - offset) / durationHour$1) * durationHour$1 + offset);
12303 }, function(date, step) {
12304   date.setTime(+date + step * durationHour$1);
12305 }, function(start, end) {
12306   return (end - start) / durationHour$1;
12307 }, function(date) {
12308   return date.getHours();
12309 });
12310
12311 var hours = hour.range;
12312
12313 var day = newInterval(function(date) {
12314   date.setHours(0, 0, 0, 0);
12315 }, function(date, step) {
12316   date.setDate(date.getDate() + step);
12317 }, function(start, end) {
12318   return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1;
12319 }, function(date) {
12320   return date.getDate() - 1;
12321 });
12322
12323 var days = day.range;
12324
12325 function weekday(i) {
12326   return newInterval(function(date) {
12327     date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12328     date.setHours(0, 0, 0, 0);
12329   }, function(date, step) {
12330     date.setDate(date.getDate() + step * 7);
12331   }, function(start, end) {
12332     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;
12333   });
12334 }
12335
12336 var sunday = weekday(0);
12337 var monday = weekday(1);
12338 var tuesday = weekday(2);
12339 var wednesday = weekday(3);
12340 var thursday = weekday(4);
12341 var friday = weekday(5);
12342 var saturday = weekday(6);
12343
12344 var sundays = sunday.range;
12345 var mondays = monday.range;
12346 var tuesdays = tuesday.range;
12347 var wednesdays = wednesday.range;
12348 var thursdays = thursday.range;
12349 var fridays = friday.range;
12350 var saturdays = saturday.range;
12351
12352 var month = newInterval(function(date) {
12353   date.setDate(1);
12354   date.setHours(0, 0, 0, 0);
12355 }, function(date, step) {
12356   date.setMonth(date.getMonth() + step);
12357 }, function(start, end) {
12358   return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12359 }, function(date) {
12360   return date.getMonth();
12361 });
12362
12363 var months = month.range;
12364
12365 var year = newInterval(function(date) {
12366   date.setMonth(0, 1);
12367   date.setHours(0, 0, 0, 0);
12368 }, function(date, step) {
12369   date.setFullYear(date.getFullYear() + step);
12370 }, function(start, end) {
12371   return end.getFullYear() - start.getFullYear();
12372 }, function(date) {
12373   return date.getFullYear();
12374 });
12375
12376 // An optimized implementation for this simple case.
12377 year.every = function(k) {
12378   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12379     date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12380     date.setMonth(0, 1);
12381     date.setHours(0, 0, 0, 0);
12382   }, function(date, step) {
12383     date.setFullYear(date.getFullYear() + step * k);
12384   });
12385 };
12386
12387 var years = year.range;
12388
12389 var utcMinute = newInterval(function(date) {
12390   date.setUTCSeconds(0, 0);
12391 }, function(date, step) {
12392   date.setTime(+date + step * durationMinute$1);
12393 }, function(start, end) {
12394   return (end - start) / durationMinute$1;
12395 }, function(date) {
12396   return date.getUTCMinutes();
12397 });
12398
12399 var utcMinutes = utcMinute.range;
12400
12401 var utcHour = newInterval(function(date) {
12402   date.setUTCMinutes(0, 0, 0);
12403 }, function(date, step) {
12404   date.setTime(+date + step * durationHour$1);
12405 }, function(start, end) {
12406   return (end - start) / durationHour$1;
12407 }, function(date) {
12408   return date.getUTCHours();
12409 });
12410
12411 var utcHours = utcHour.range;
12412
12413 var utcDay = newInterval(function(date) {
12414   date.setUTCHours(0, 0, 0, 0);
12415 }, function(date, step) {
12416   date.setUTCDate(date.getUTCDate() + step);
12417 }, function(start, end) {
12418   return (end - start) / durationDay$1;
12419 }, function(date) {
12420   return date.getUTCDate() - 1;
12421 });
12422
12423 var utcDays = utcDay.range;
12424
12425 function utcWeekday(i) {
12426   return newInterval(function(date) {
12427     date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12428     date.setUTCHours(0, 0, 0, 0);
12429   }, function(date, step) {
12430     date.setUTCDate(date.getUTCDate() + step * 7);
12431   }, function(start, end) {
12432     return (end - start) / durationWeek$1;
12433   });
12434 }
12435
12436 var utcSunday = utcWeekday(0);
12437 var utcMonday = utcWeekday(1);
12438 var utcTuesday = utcWeekday(2);
12439 var utcWednesday = utcWeekday(3);
12440 var utcThursday = utcWeekday(4);
12441 var utcFriday = utcWeekday(5);
12442 var utcSaturday = utcWeekday(6);
12443
12444 var utcSundays = utcSunday.range;
12445 var utcMondays = utcMonday.range;
12446 var utcTuesdays = utcTuesday.range;
12447 var utcWednesdays = utcWednesday.range;
12448 var utcThursdays = utcThursday.range;
12449 var utcFridays = utcFriday.range;
12450 var utcSaturdays = utcSaturday.range;
12451
12452 var utcMonth = newInterval(function(date) {
12453   date.setUTCDate(1);
12454   date.setUTCHours(0, 0, 0, 0);
12455 }, function(date, step) {
12456   date.setUTCMonth(date.getUTCMonth() + step);
12457 }, function(start, end) {
12458   return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12459 }, function(date) {
12460   return date.getUTCMonth();
12461 });
12462
12463 var utcMonths = utcMonth.range;
12464
12465 var utcYear = newInterval(function(date) {
12466   date.setUTCMonth(0, 1);
12467   date.setUTCHours(0, 0, 0, 0);
12468 }, function(date, step) {
12469   date.setUTCFullYear(date.getUTCFullYear() + step);
12470 }, function(start, end) {
12471   return end.getUTCFullYear() - start.getUTCFullYear();
12472 }, function(date) {
12473   return date.getUTCFullYear();
12474 });
12475
12476 // An optimized implementation for this simple case.
12477 utcYear.every = function(k) {
12478   return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12479     date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12480     date.setUTCMonth(0, 1);
12481     date.setUTCHours(0, 0, 0, 0);
12482   }, function(date, step) {
12483     date.setUTCFullYear(date.getUTCFullYear() + step * k);
12484   });
12485 };
12486
12487 var utcYears = utcYear.range;
12488
12489 function localDate(d) {
12490   if (0 <= d.y && d.y < 100) {
12491     var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12492     date.setFullYear(d.y);
12493     return date;
12494   }
12495   return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12496 }
12497
12498 function utcDate(d) {
12499   if (0 <= d.y && d.y < 100) {
12500     var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12501     date.setUTCFullYear(d.y);
12502     return date;
12503   }
12504   return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12505 }
12506
12507 function newYear(y) {
12508   return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12509 }
12510
12511 function formatLocale$1(locale) {
12512   var locale_dateTime = locale.dateTime,
12513       locale_date = locale.date,
12514       locale_time = locale.time,
12515       locale_periods = locale.periods,
12516       locale_weekdays = locale.days,
12517       locale_shortWeekdays = locale.shortDays,
12518       locale_months = locale.months,
12519       locale_shortMonths = locale.shortMonths;
12520
12521   var periodRe = formatRe(locale_periods),
12522       periodLookup = formatLookup(locale_periods),
12523       weekdayRe = formatRe(locale_weekdays),
12524       weekdayLookup = formatLookup(locale_weekdays),
12525       shortWeekdayRe = formatRe(locale_shortWeekdays),
12526       shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12527       monthRe = formatRe(locale_months),
12528       monthLookup = formatLookup(locale_months),
12529       shortMonthRe = formatRe(locale_shortMonths),
12530       shortMonthLookup = formatLookup(locale_shortMonths);
12531
12532   var formats = {
12533     "a": formatShortWeekday,
12534     "A": formatWeekday,
12535     "b": formatShortMonth,
12536     "B": formatMonth,
12537     "c": null,
12538     "d": formatDayOfMonth,
12539     "e": formatDayOfMonth,
12540     "H": formatHour24,
12541     "I": formatHour12,
12542     "j": formatDayOfYear,
12543     "L": formatMilliseconds,
12544     "m": formatMonthNumber,
12545     "M": formatMinutes,
12546     "p": formatPeriod,
12547     "S": formatSeconds,
12548     "U": formatWeekNumberSunday,
12549     "w": formatWeekdayNumber,
12550     "W": formatWeekNumberMonday,
12551     "x": null,
12552     "X": null,
12553     "y": formatYear,
12554     "Y": formatFullYear,
12555     "Z": formatZone,
12556     "%": formatLiteralPercent
12557   };
12558
12559   var utcFormats = {
12560     "a": formatUTCShortWeekday,
12561     "A": formatUTCWeekday,
12562     "b": formatUTCShortMonth,
12563     "B": formatUTCMonth,
12564     "c": null,
12565     "d": formatUTCDayOfMonth,
12566     "e": formatUTCDayOfMonth,
12567     "H": formatUTCHour24,
12568     "I": formatUTCHour12,
12569     "j": formatUTCDayOfYear,
12570     "L": formatUTCMilliseconds,
12571     "m": formatUTCMonthNumber,
12572     "M": formatUTCMinutes,
12573     "p": formatUTCPeriod,
12574     "S": formatUTCSeconds,
12575     "U": formatUTCWeekNumberSunday,
12576     "w": formatUTCWeekdayNumber,
12577     "W": formatUTCWeekNumberMonday,
12578     "x": null,
12579     "X": null,
12580     "y": formatUTCYear,
12581     "Y": formatUTCFullYear,
12582     "Z": formatUTCZone,
12583     "%": formatLiteralPercent
12584   };
12585
12586   var parses = {
12587     "a": parseShortWeekday,
12588     "A": parseWeekday,
12589     "b": parseShortMonth,
12590     "B": parseMonth,
12591     "c": parseLocaleDateTime,
12592     "d": parseDayOfMonth,
12593     "e": parseDayOfMonth,
12594     "H": parseHour24,
12595     "I": parseHour24,
12596     "j": parseDayOfYear,
12597     "L": parseMilliseconds,
12598     "m": parseMonthNumber,
12599     "M": parseMinutes,
12600     "p": parsePeriod,
12601     "S": parseSeconds,
12602     "U": parseWeekNumberSunday,
12603     "w": parseWeekdayNumber,
12604     "W": parseWeekNumberMonday,
12605     "x": parseLocaleDate,
12606     "X": parseLocaleTime,
12607     "y": parseYear,
12608     "Y": parseFullYear,
12609     "Z": parseZone,
12610     "%": parseLiteralPercent
12611   };
12612
12613   // These recursive directive definitions must be deferred.
12614   formats.x = newFormat(locale_date, formats);
12615   formats.X = newFormat(locale_time, formats);
12616   formats.c = newFormat(locale_dateTime, formats);
12617   utcFormats.x = newFormat(locale_date, utcFormats);
12618   utcFormats.X = newFormat(locale_time, utcFormats);
12619   utcFormats.c = newFormat(locale_dateTime, utcFormats);
12620
12621   function newFormat(specifier, formats) {
12622     return function(date) {
12623       var string = [],
12624           i = -1,
12625           j = 0,
12626           n = specifier.length,
12627           c,
12628           pad,
12629           format;
12630
12631       if (!(date instanceof Date)) date = new Date(+date);
12632
12633       while (++i < n) {
12634         if (specifier.charCodeAt(i) === 37) {
12635           string.push(specifier.slice(j, i));
12636           if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12637           else pad = c === "e" ? " " : "0";
12638           if (format = formats[c]) c = format(date, pad);
12639           string.push(c);
12640           j = i + 1;
12641         }
12642       }
12643
12644       string.push(specifier.slice(j, i));
12645       return string.join("");
12646     };
12647   }
12648
12649   function newParse(specifier, newDate) {
12650     return function(string) {
12651       var d = newYear(1900),
12652           i = parseSpecifier(d, specifier, string += "", 0);
12653       if (i != string.length) return null;
12654
12655       // The am-pm flag is 0 for AM, and 1 for PM.
12656       if ("p" in d) d.H = d.H % 12 + d.p * 12;
12657
12658       // Convert day-of-week and week-of-year to day-of-year.
12659       if ("W" in d || "U" in d) {
12660         if (!("w" in d)) d.w = "W" in d ? 1 : 0;
12661         var day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12662         d.m = 0;
12663         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;
12664       }
12665
12666       // If a time zone is specified, all fields are interpreted as UTC and then
12667       // offset according to the specified time zone.
12668       if ("Z" in d) {
12669         d.H += d.Z / 100 | 0;
12670         d.M += d.Z % 100;
12671         return utcDate(d);
12672       }
12673
12674       // Otherwise, all fields are in local time.
12675       return newDate(d);
12676     };
12677   }
12678
12679   function parseSpecifier(d, specifier, string, j) {
12680     var i = 0,
12681         n = specifier.length,
12682         m = string.length,
12683         c,
12684         parse;
12685
12686     while (i < n) {
12687       if (j >= m) return -1;
12688       c = specifier.charCodeAt(i++);
12689       if (c === 37) {
12690         c = specifier.charAt(i++);
12691         parse = parses[c in pads ? specifier.charAt(i++) : c];
12692         if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12693       } else if (c != string.charCodeAt(j++)) {
12694         return -1;
12695       }
12696     }
12697
12698     return j;
12699   }
12700
12701   function parsePeriod(d, string, i) {
12702     var n = periodRe.exec(string.slice(i));
12703     return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12704   }
12705
12706   function parseShortWeekday(d, string, i) {
12707     var n = shortWeekdayRe.exec(string.slice(i));
12708     return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12709   }
12710
12711   function parseWeekday(d, string, i) {
12712     var n = weekdayRe.exec(string.slice(i));
12713     return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12714   }
12715
12716   function parseShortMonth(d, string, i) {
12717     var n = shortMonthRe.exec(string.slice(i));
12718     return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12719   }
12720
12721   function parseMonth(d, string, i) {
12722     var n = monthRe.exec(string.slice(i));
12723     return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12724   }
12725
12726   function parseLocaleDateTime(d, string, i) {
12727     return parseSpecifier(d, locale_dateTime, string, i);
12728   }
12729
12730   function parseLocaleDate(d, string, i) {
12731     return parseSpecifier(d, locale_date, string, i);
12732   }
12733
12734   function parseLocaleTime(d, string, i) {
12735     return parseSpecifier(d, locale_time, string, i);
12736   }
12737
12738   function formatShortWeekday(d) {
12739     return locale_shortWeekdays[d.getDay()];
12740   }
12741
12742   function formatWeekday(d) {
12743     return locale_weekdays[d.getDay()];
12744   }
12745
12746   function formatShortMonth(d) {
12747     return locale_shortMonths[d.getMonth()];
12748   }
12749
12750   function formatMonth(d) {
12751     return locale_months[d.getMonth()];
12752   }
12753
12754   function formatPeriod(d) {
12755     return locale_periods[+(d.getHours() >= 12)];
12756   }
12757
12758   function formatUTCShortWeekday(d) {
12759     return locale_shortWeekdays[d.getUTCDay()];
12760   }
12761
12762   function formatUTCWeekday(d) {
12763     return locale_weekdays[d.getUTCDay()];
12764   }
12765
12766   function formatUTCShortMonth(d) {
12767     return locale_shortMonths[d.getUTCMonth()];
12768   }
12769
12770   function formatUTCMonth(d) {
12771     return locale_months[d.getUTCMonth()];
12772   }
12773
12774   function formatUTCPeriod(d) {
12775     return locale_periods[+(d.getUTCHours() >= 12)];
12776   }
12777
12778   return {
12779     format: function(specifier) {
12780       var f = newFormat(specifier += "", formats);
12781       f.toString = function() { return specifier; };
12782       return f;
12783     },
12784     parse: function(specifier) {
12785       var p = newParse(specifier += "", localDate);
12786       p.toString = function() { return specifier; };
12787       return p;
12788     },
12789     utcFormat: function(specifier) {
12790       var f = newFormat(specifier += "", utcFormats);
12791       f.toString = function() { return specifier; };
12792       return f;
12793     },
12794     utcParse: function(specifier) {
12795       var p = newParse(specifier, utcDate);
12796       p.toString = function() { return specifier; };
12797       return p;
12798     }
12799   };
12800 }
12801
12802 var pads = {"-": "", "_": " ", "0": "0"};
12803 var numberRe = /^\s*\d+/;
12804 var percentRe = /^%/;
12805 var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
12806
12807 function pad(value, fill, width) {
12808   var sign = value < 0 ? "-" : "",
12809       string = (sign ? -value : value) + "",
12810       length = string.length;
12811   return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12812 }
12813
12814 function requote(s) {
12815   return s.replace(requoteRe, "\\$&");
12816 }
12817
12818 function formatRe(names) {
12819   return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12820 }
12821
12822 function formatLookup(names) {
12823   var map = {}, i = -1, n = names.length;
12824   while (++i < n) map[names[i].toLowerCase()] = i;
12825   return map;
12826 }
12827
12828 function parseWeekdayNumber(d, string, i) {
12829   var n = numberRe.exec(string.slice(i, i + 1));
12830   return n ? (d.w = +n[0], i + n[0].length) : -1;
12831 }
12832
12833 function parseWeekNumberSunday(d, string, i) {
12834   var n = numberRe.exec(string.slice(i));
12835   return n ? (d.U = +n[0], i + n[0].length) : -1;
12836 }
12837
12838 function parseWeekNumberMonday(d, string, i) {
12839   var n = numberRe.exec(string.slice(i));
12840   return n ? (d.W = +n[0], i + n[0].length) : -1;
12841 }
12842
12843 function parseFullYear(d, string, i) {
12844   var n = numberRe.exec(string.slice(i, i + 4));
12845   return n ? (d.y = +n[0], i + n[0].length) : -1;
12846 }
12847
12848 function parseYear(d, string, i) {
12849   var n = numberRe.exec(string.slice(i, i + 2));
12850   return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12851 }
12852
12853 function parseZone(d, string, i) {
12854   var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6));
12855   return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12856 }
12857
12858 function parseMonthNumber(d, string, i) {
12859   var n = numberRe.exec(string.slice(i, i + 2));
12860   return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12861 }
12862
12863 function parseDayOfMonth(d, string, i) {
12864   var n = numberRe.exec(string.slice(i, i + 2));
12865   return n ? (d.d = +n[0], i + n[0].length) : -1;
12866 }
12867
12868 function parseDayOfYear(d, string, i) {
12869   var n = numberRe.exec(string.slice(i, i + 3));
12870   return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12871 }
12872
12873 function parseHour24(d, string, i) {
12874   var n = numberRe.exec(string.slice(i, i + 2));
12875   return n ? (d.H = +n[0], i + n[0].length) : -1;
12876 }
12877
12878 function parseMinutes(d, string, i) {
12879   var n = numberRe.exec(string.slice(i, i + 2));
12880   return n ? (d.M = +n[0], i + n[0].length) : -1;
12881 }
12882
12883 function parseSeconds(d, string, i) {
12884   var n = numberRe.exec(string.slice(i, i + 2));
12885   return n ? (d.S = +n[0], i + n[0].length) : -1;
12886 }
12887
12888 function parseMilliseconds(d, string, i) {
12889   var n = numberRe.exec(string.slice(i, i + 3));
12890   return n ? (d.L = +n[0], i + n[0].length) : -1;
12891 }
12892
12893 function parseLiteralPercent(d, string, i) {
12894   var n = percentRe.exec(string.slice(i, i + 1));
12895   return n ? i + n[0].length : -1;
12896 }
12897
12898 function formatDayOfMonth(d, p) {
12899   return pad(d.getDate(), p, 2);
12900 }
12901
12902 function formatHour24(d, p) {
12903   return pad(d.getHours(), p, 2);
12904 }
12905
12906 function formatHour12(d, p) {
12907   return pad(d.getHours() % 12 || 12, p, 2);
12908 }
12909
12910 function formatDayOfYear(d, p) {
12911   return pad(1 + day.count(year(d), d), p, 3);
12912 }
12913
12914 function formatMilliseconds(d, p) {
12915   return pad(d.getMilliseconds(), p, 3);
12916 }
12917
12918 function formatMonthNumber(d, p) {
12919   return pad(d.getMonth() + 1, p, 2);
12920 }
12921
12922 function formatMinutes(d, p) {
12923   return pad(d.getMinutes(), p, 2);
12924 }
12925
12926 function formatSeconds(d, p) {
12927   return pad(d.getSeconds(), p, 2);
12928 }
12929
12930 function formatWeekNumberSunday(d, p) {
12931   return pad(sunday.count(year(d), d), p, 2);
12932 }
12933
12934 function formatWeekdayNumber(d) {
12935   return d.getDay();
12936 }
12937
12938 function formatWeekNumberMonday(d, p) {
12939   return pad(monday.count(year(d), d), p, 2);
12940 }
12941
12942 function formatYear(d, p) {
12943   return pad(d.getFullYear() % 100, p, 2);
12944 }
12945
12946 function formatFullYear(d, p) {
12947   return pad(d.getFullYear() % 10000, p, 4);
12948 }
12949
12950 function formatZone(d) {
12951   var z = d.getTimezoneOffset();
12952   return (z > 0 ? "-" : (z *= -1, "+"))
12953       + pad(z / 60 | 0, "0", 2)
12954       + pad(z % 60, "0", 2);
12955 }
12956
12957 function formatUTCDayOfMonth(d, p) {
12958   return pad(d.getUTCDate(), p, 2);
12959 }
12960
12961 function formatUTCHour24(d, p) {
12962   return pad(d.getUTCHours(), p, 2);
12963 }
12964
12965 function formatUTCHour12(d, p) {
12966   return pad(d.getUTCHours() % 12 || 12, p, 2);
12967 }
12968
12969 function formatUTCDayOfYear(d, p) {
12970   return pad(1 + utcDay.count(utcYear(d), d), p, 3);
12971 }
12972
12973 function formatUTCMilliseconds(d, p) {
12974   return pad(d.getUTCMilliseconds(), p, 3);
12975 }
12976
12977 function formatUTCMonthNumber(d, p) {
12978   return pad(d.getUTCMonth() + 1, p, 2);
12979 }
12980
12981 function formatUTCMinutes(d, p) {
12982   return pad(d.getUTCMinutes(), p, 2);
12983 }
12984
12985 function formatUTCSeconds(d, p) {
12986   return pad(d.getUTCSeconds(), p, 2);
12987 }
12988
12989 function formatUTCWeekNumberSunday(d, p) {
12990   return pad(utcSunday.count(utcYear(d), d), p, 2);
12991 }
12992
12993 function formatUTCWeekdayNumber(d) {
12994   return d.getUTCDay();
12995 }
12996
12997 function formatUTCWeekNumberMonday(d, p) {
12998   return pad(utcMonday.count(utcYear(d), d), p, 2);
12999 }
13000
13001 function formatUTCYear(d, p) {
13002   return pad(d.getUTCFullYear() % 100, p, 2);
13003 }
13004
13005 function formatUTCFullYear(d, p) {
13006   return pad(d.getUTCFullYear() % 10000, p, 4);
13007 }
13008
13009 function formatUTCZone() {
13010   return "+0000";
13011 }
13012
13013 function formatLiteralPercent() {
13014   return "%";
13015 }
13016
13017 var locale$2;
13018 var timeFormat;
13019 var timeParse;
13020 var utcFormat;
13021 var utcParse;
13022
13023 defaultLocale$1({
13024   dateTime: "%x, %X",
13025   date: "%-m/%-d/%Y",
13026   time: "%-I:%M:%S %p",
13027   periods: ["AM", "PM"],
13028   days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13029   shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13030   months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13031   shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13032 });
13033
13034 function defaultLocale$1(definition) {
13035   locale$2 = formatLocale$1(definition);
13036   timeFormat = locale$2.format;
13037   timeParse = locale$2.parse;
13038   utcFormat = locale$2.utcFormat;
13039   utcParse = locale$2.utcParse;
13040   return locale$2;
13041 }
13042
13043 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13044
13045 function formatIsoNative(date) {
13046   return date.toISOString();
13047 }
13048
13049 var formatIso = Date.prototype.toISOString
13050     ? formatIsoNative
13051     : utcFormat(isoSpecifier);
13052
13053 function parseIsoNative(string) {
13054   var date = new Date(string);
13055   return isNaN(date) ? null : date;
13056 }
13057
13058 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13059     ? parseIsoNative
13060     : utcParse(isoSpecifier);
13061
13062 var durationSecond = 1000;
13063 var durationMinute = durationSecond * 60;
13064 var durationHour = durationMinute * 60;
13065 var durationDay = durationHour * 24;
13066 var durationWeek = durationDay * 7;
13067 var durationMonth = durationDay * 30;
13068 var durationYear = durationDay * 365;
13069
13070 function date$1(t) {
13071   return new Date(t);
13072 }
13073
13074 function number$3(t) {
13075   return t instanceof Date ? +t : +new Date(+t);
13076 }
13077
13078 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13079   var scale = continuous(deinterpolateLinear, d3_interpolateNumber),
13080       invert = scale.invert,
13081       domain = scale.domain;
13082
13083   var formatMillisecond = format(".%L"),
13084       formatSecond = format(":%S"),
13085       formatMinute = format("%I:%M"),
13086       formatHour = format("%I %p"),
13087       formatDay = format("%a %d"),
13088       formatWeek = format("%b %d"),
13089       formatMonth = format("%B"),
13090       formatYear = format("%Y");
13091
13092   var tickIntervals = [
13093     [second$$1,  1,      durationSecond],
13094     [second$$1,  5,  5 * durationSecond],
13095     [second$$1, 15, 15 * durationSecond],
13096     [second$$1, 30, 30 * durationSecond],
13097     [minute$$1,  1,      durationMinute],
13098     [minute$$1,  5,  5 * durationMinute],
13099     [minute$$1, 15, 15 * durationMinute],
13100     [minute$$1, 30, 30 * durationMinute],
13101     [  hour$$1,  1,      durationHour  ],
13102     [  hour$$1,  3,  3 * durationHour  ],
13103     [  hour$$1,  6,  6 * durationHour  ],
13104     [  hour$$1, 12, 12 * durationHour  ],
13105     [   day$$1,  1,      durationDay   ],
13106     [   day$$1,  2,  2 * durationDay   ],
13107     [  week,  1,      durationWeek  ],
13108     [ month$$1,  1,      durationMonth ],
13109     [ month$$1,  3,  3 * durationMonth ],
13110     [  year$$1,  1,      durationYear  ]
13111   ];
13112
13113   function tickFormat(date$$1) {
13114     return (second$$1(date$$1) < date$$1 ? formatMillisecond
13115         : minute$$1(date$$1) < date$$1 ? formatSecond
13116         : hour$$1(date$$1) < date$$1 ? formatMinute
13117         : day$$1(date$$1) < date$$1 ? formatHour
13118         : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13119         : year$$1(date$$1) < date$$1 ? formatMonth
13120         : formatYear)(date$$1);
13121   }
13122
13123   function tickInterval(interval$$1, start, stop, step) {
13124     if (interval$$1 == null) interval$$1 = 10;
13125
13126     // If a desired tick count is specified, pick a reasonable tick interval
13127     // based on the extent of the domain and a rough estimate of tick size.
13128     // Otherwise, assume interval is already a time interval and use it.
13129     if (typeof interval$$1 === "number") {
13130       var target = Math.abs(stop - start) / interval$$1,
13131           i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13132       if (i === tickIntervals.length) {
13133         step = tickStep(start / durationYear, stop / durationYear, interval$$1);
13134         interval$$1 = year$$1;
13135       } else if (i) {
13136         i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13137         step = i[1];
13138         interval$$1 = i[0];
13139       } else {
13140         step = tickStep(start, stop, interval$$1);
13141         interval$$1 = millisecond$$1;
13142       }
13143     }
13144
13145     return step == null ? interval$$1 : interval$$1.every(step);
13146   }
13147
13148   scale.invert = function(y) {
13149     return new Date(invert(y));
13150   };
13151
13152   scale.domain = function(_) {
13153     return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1);
13154   };
13155
13156   scale.ticks = function(interval$$1, step) {
13157     var d = domain(),
13158         t0 = d[0],
13159         t1 = d[d.length - 1],
13160         r = t1 < t0,
13161         t;
13162     if (r) t = t0, t0 = t1, t1 = t;
13163     t = tickInterval(interval$$1, t0, t1, step);
13164     t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13165     return r ? t.reverse() : t;
13166   };
13167
13168   scale.tickFormat = function(count, specifier) {
13169     return specifier == null ? tickFormat : format(specifier);
13170   };
13171
13172   scale.nice = function(interval$$1, step) {
13173     var d = domain();
13174     return (interval$$1 = tickInterval(interval$$1, d[0], d[d.length - 1], step))
13175         ? domain(nice(d, interval$$1))
13176         : scale;
13177   };
13178
13179   scale.copy = function() {
13180     return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13181   };
13182
13183   return scale;
13184 }
13185
13186 var time = function() {
13187   return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13188 };
13189
13190 var utcTime = function() {
13191   return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13192 };
13193
13194 var colors = function(s) {
13195   return s.match(/.{6}/g).map(function(x) {
13196     return "#" + x;
13197   });
13198 };
13199
13200 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13201
13202 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13203
13204 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13205
13206 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13207
13208 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13209
13210 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13211
13212 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13213
13214 var rainbow = cubehelix();
13215
13216 var rainbow$1 = function(t) {
13217   if (t < 0 || t > 1) t -= Math.floor(t);
13218   var ts = Math.abs(t - 0.5);
13219   rainbow.h = 360 * t - 100;
13220   rainbow.s = 1.5 - 1.5 * ts;
13221   rainbow.l = 0.8 - 0.9 * ts;
13222   return rainbow + "";
13223 };
13224
13225 function ramp(range) {
13226   var n = range.length;
13227   return function(t) {
13228     return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13229   };
13230 }
13231
13232 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13233
13234 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13235
13236 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13237
13238 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13239
13240 function sequential(interpolator) {
13241   var x0 = 0,
13242       x1 = 1,
13243       clamp = false;
13244
13245   function scale(x) {
13246     var t = (x - x0) / (x1 - x0);
13247     return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13248   }
13249
13250   scale.domain = function(_) {
13251     return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13252   };
13253
13254   scale.clamp = function(_) {
13255     return arguments.length ? (clamp = !!_, scale) : clamp;
13256   };
13257
13258   scale.interpolator = function(_) {
13259     return arguments.length ? (interpolator = _, scale) : interpolator;
13260   };
13261
13262   scale.copy = function() {
13263     return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13264   };
13265
13266   return linearish(scale);
13267 }
13268
13269 var constant$10 = function(x) {
13270   return function constant() {
13271     return x;
13272   };
13273 };
13274
13275 var abs$1 = Math.abs;
13276 var atan2$1 = Math.atan2;
13277 var cos$2 = Math.cos;
13278 var max$2 = Math.max;
13279 var min$1 = Math.min;
13280 var sin$2 = Math.sin;
13281 var sqrt$2 = Math.sqrt;
13282
13283 var epsilon$3 = 1e-12;
13284 var pi$4 = Math.PI;
13285 var halfPi$3 = pi$4 / 2;
13286 var tau$4 = 2 * pi$4;
13287
13288 function acos$1(x) {
13289   return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13290 }
13291
13292 function asin$1(x) {
13293   return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13294 }
13295
13296 function arcInnerRadius(d) {
13297   return d.innerRadius;
13298 }
13299
13300 function arcOuterRadius(d) {
13301   return d.outerRadius;
13302 }
13303
13304 function arcStartAngle(d) {
13305   return d.startAngle;
13306 }
13307
13308 function arcEndAngle(d) {
13309   return d.endAngle;
13310 }
13311
13312 function arcPadAngle(d) {
13313   return d && d.padAngle; // Note: optional!
13314 }
13315
13316 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13317   var x10 = x1 - x0, y10 = y1 - y0,
13318       x32 = x3 - x2, y32 = y3 - y2,
13319       t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13320   return [x0 + t * x10, y0 + t * y10];
13321 }
13322
13323 // Compute perpendicular offset line of length rc.
13324 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13325 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13326   var x01 = x0 - x1,
13327       y01 = y0 - y1,
13328       lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13329       ox = lo * y01,
13330       oy = -lo * x01,
13331       x11 = x0 + ox,
13332       y11 = y0 + oy,
13333       x10 = x1 + ox,
13334       y10 = y1 + oy,
13335       x00 = (x11 + x10) / 2,
13336       y00 = (y11 + y10) / 2,
13337       dx = x10 - x11,
13338       dy = y10 - y11,
13339       d2 = dx * dx + dy * dy,
13340       r = r1 - rc,
13341       D = x11 * y10 - x10 * y11,
13342       d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13343       cx0 = (D * dy - dx * d) / d2,
13344       cy0 = (-D * dx - dy * d) / d2,
13345       cx1 = (D * dy + dx * d) / d2,
13346       cy1 = (-D * dx + dy * d) / d2,
13347       dx0 = cx0 - x00,
13348       dy0 = cy0 - y00,
13349       dx1 = cx1 - x00,
13350       dy1 = cy1 - y00;
13351
13352   // Pick the closer of the two intersection points.
13353   // TODO Is there a faster way to determine which intersection to use?
13354   if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13355
13356   return {
13357     cx: cx0,
13358     cy: cy0,
13359     x01: -ox,
13360     y01: -oy,
13361     x11: cx0 * (r1 / r - 1),
13362     y11: cy0 * (r1 / r - 1)
13363   };
13364 }
13365
13366 var arc = function() {
13367   var innerRadius = arcInnerRadius,
13368       outerRadius = arcOuterRadius,
13369       cornerRadius = constant$10(0),
13370       padRadius = null,
13371       startAngle = arcStartAngle,
13372       endAngle = arcEndAngle,
13373       padAngle = arcPadAngle,
13374       context = null;
13375
13376   function arc() {
13377     var buffer,
13378         r,
13379         r0 = +innerRadius.apply(this, arguments),
13380         r1 = +outerRadius.apply(this, arguments),
13381         a0 = startAngle.apply(this, arguments) - halfPi$3,
13382         a1 = endAngle.apply(this, arguments) - halfPi$3,
13383         da = abs$1(a1 - a0),
13384         cw = a1 > a0;
13385
13386     if (!context) context = buffer = path();
13387
13388     // Ensure that the outer radius is always larger than the inner radius.
13389     if (r1 < r0) r = r1, r1 = r0, r0 = r;
13390
13391     // Is it a point?
13392     if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13393
13394     // Or is it a circle or annulus?
13395     else if (da > tau$4 - epsilon$3) {
13396       context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13397       context.arc(0, 0, r1, a0, a1, !cw);
13398       if (r0 > epsilon$3) {
13399         context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13400         context.arc(0, 0, r0, a1, a0, cw);
13401       }
13402     }
13403
13404     // Or is it a circular or annular sector?
13405     else {
13406       var a01 = a0,
13407           a11 = a1,
13408           a00 = a0,
13409           a10 = a1,
13410           da0 = da,
13411           da1 = da,
13412           ap = padAngle.apply(this, arguments) / 2,
13413           rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13414           rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13415           rc0 = rc,
13416           rc1 = rc,
13417           t0,
13418           t1;
13419
13420       // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13421       if (rp > epsilon$3) {
13422         var p0 = asin$1(rp / r0 * sin$2(ap)),
13423             p1 = asin$1(rp / r1 * sin$2(ap));
13424         if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13425         else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13426         if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13427         else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13428       }
13429
13430       var x01 = r1 * cos$2(a01),
13431           y01 = r1 * sin$2(a01),
13432           x10 = r0 * cos$2(a10),
13433           y10 = r0 * sin$2(a10);
13434
13435       // Apply rounded corners?
13436       if (rc > epsilon$3) {
13437         var x11 = r1 * cos$2(a11),
13438             y11 = r1 * sin$2(a11),
13439             x00 = r0 * cos$2(a00),
13440             y00 = r0 * sin$2(a00);
13441
13442         // Restrict the corner radius according to the sector angle.
13443         if (da < pi$4) {
13444           var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13445               ax = x01 - oc[0],
13446               ay = y01 - oc[1],
13447               bx = x11 - oc[0],
13448               by = y11 - oc[1],
13449               kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13450               lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13451           rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13452           rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13453         }
13454       }
13455
13456       // Is the sector collapsed to a line?
13457       if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13458
13459       // Does the sector’s outer ring have rounded corners?
13460       else if (rc1 > epsilon$3) {
13461         t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13462         t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13463
13464         context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13465
13466         // Have the corners merged?
13467         if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13468
13469         // Otherwise, draw the two corners and the ring.
13470         else {
13471           context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13472           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);
13473           context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13474         }
13475       }
13476
13477       // Or is the outer ring just a circular arc?
13478       else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13479
13480       // Is there no inner ring, and it’s a circular sector?
13481       // Or perhaps it’s an annular sector collapsed due to padding?
13482       if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13483
13484       // Does the sector’s inner ring (or point) have rounded corners?
13485       else if (rc0 > epsilon$3) {
13486         t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13487         t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13488
13489         context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13490
13491         // Have the corners merged?
13492         if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13493
13494         // Otherwise, draw the two corners and the ring.
13495         else {
13496           context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13497           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);
13498           context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13499         }
13500       }
13501
13502       // Or is the inner ring just a circular arc?
13503       else context.arc(0, 0, r0, a10, a00, cw);
13504     }
13505
13506     context.closePath();
13507
13508     if (buffer) return context = null, buffer + "" || null;
13509   }
13510
13511   arc.centroid = function() {
13512     var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13513         a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13514     return [cos$2(a) * r, sin$2(a) * r];
13515   };
13516
13517   arc.innerRadius = function(_) {
13518     return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : innerRadius;
13519   };
13520
13521   arc.outerRadius = function(_) {
13522     return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : outerRadius;
13523   };
13524
13525   arc.cornerRadius = function(_) {
13526     return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$10(+_), arc) : cornerRadius;
13527   };
13528
13529   arc.padRadius = function(_) {
13530     return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), arc) : padRadius;
13531   };
13532
13533   arc.startAngle = function(_) {
13534     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : startAngle;
13535   };
13536
13537   arc.endAngle = function(_) {
13538     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : endAngle;
13539   };
13540
13541   arc.padAngle = function(_) {
13542     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), arc) : padAngle;
13543   };
13544
13545   arc.context = function(_) {
13546     return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13547   };
13548
13549   return arc;
13550 };
13551
13552 function Linear(context) {
13553   this._context = context;
13554 }
13555
13556 Linear.prototype = {
13557   areaStart: function() {
13558     this._line = 0;
13559   },
13560   areaEnd: function() {
13561     this._line = NaN;
13562   },
13563   lineStart: function() {
13564     this._point = 0;
13565   },
13566   lineEnd: function() {
13567     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13568     this._line = 1 - this._line;
13569   },
13570   point: function(x, y) {
13571     x = +x, y = +y;
13572     switch (this._point) {
13573       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13574       case 1: this._point = 2; // proceed
13575       default: this._context.lineTo(x, y); break;
13576     }
13577   }
13578 };
13579
13580 var curveLinear = function(context) {
13581   return new Linear(context);
13582 };
13583
13584 function x$3(p) {
13585   return p[0];
13586 }
13587
13588 function y$3(p) {
13589   return p[1];
13590 }
13591
13592 var line = function() {
13593   var x = x$3,
13594       y = y$3,
13595       defined = constant$10(true),
13596       context = null,
13597       curve = curveLinear,
13598       output = null;
13599
13600   function line(data) {
13601     var i,
13602         n = data.length,
13603         d,
13604         defined0 = false,
13605         buffer;
13606
13607     if (context == null) output = curve(buffer = path());
13608
13609     for (i = 0; i <= n; ++i) {
13610       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13611         if (defined0 = !defined0) output.lineStart();
13612         else output.lineEnd();
13613       }
13614       if (defined0) output.point(+x(d, i, data), +y(d, i, data));
13615     }
13616
13617     if (buffer) return output = null, buffer + "" || null;
13618   }
13619
13620   line.x = function(_) {
13621     return arguments.length ? (x = typeof _ === "function" ? _ : constant$10(+_), line) : x;
13622   };
13623
13624   line.y = function(_) {
13625     return arguments.length ? (y = typeof _ === "function" ? _ : constant$10(+_), line) : y;
13626   };
13627
13628   line.defined = function(_) {
13629     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), line) : defined;
13630   };
13631
13632   line.curve = function(_) {
13633     return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13634   };
13635
13636   line.context = function(_) {
13637     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13638   };
13639
13640   return line;
13641 };
13642
13643 var area = function() {
13644   var x0 = x$3,
13645       x1 = null,
13646       y0 = constant$10(0),
13647       y1 = y$3,
13648       defined = constant$10(true),
13649       context = null,
13650       curve = curveLinear,
13651       output = null;
13652
13653   function area(data) {
13654     var i,
13655         j,
13656         k,
13657         n = data.length,
13658         d,
13659         defined0 = false,
13660         buffer,
13661         x0z = new Array(n),
13662         y0z = new Array(n);
13663
13664     if (context == null) output = curve(buffer = path());
13665
13666     for (i = 0; i <= n; ++i) {
13667       if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13668         if (defined0 = !defined0) {
13669           j = i;
13670           output.areaStart();
13671           output.lineStart();
13672         } else {
13673           output.lineEnd();
13674           output.lineStart();
13675           for (k = i - 1; k >= j; --k) {
13676             output.point(x0z[k], y0z[k]);
13677           }
13678           output.lineEnd();
13679           output.areaEnd();
13680         }
13681       }
13682       if (defined0) {
13683         x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13684         output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13685       }
13686     }
13687
13688     if (buffer) return output = null, buffer + "" || null;
13689   }
13690
13691   function arealine() {
13692     return line().defined(defined).curve(curve).context(context);
13693   }
13694
13695   area.x = function(_) {
13696     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), x1 = null, area) : x0;
13697   };
13698
13699   area.x0 = function(_) {
13700     return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$10(+_), area) : x0;
13701   };
13702
13703   area.x1 = function(_) {
13704     return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : x1;
13705   };
13706
13707   area.y = function(_) {
13708     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), y1 = null, area) : y0;
13709   };
13710
13711   area.y0 = function(_) {
13712     return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$10(+_), area) : y0;
13713   };
13714
13715   area.y1 = function(_) {
13716     return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$10(+_), area) : y1;
13717   };
13718
13719   area.lineX0 =
13720   area.lineY0 = function() {
13721     return arealine().x(x0).y(y0);
13722   };
13723
13724   area.lineY1 = function() {
13725     return arealine().x(x0).y(y1);
13726   };
13727
13728   area.lineX1 = function() {
13729     return arealine().x(x1).y(y0);
13730   };
13731
13732   area.defined = function(_) {
13733     return arguments.length ? (defined = typeof _ === "function" ? _ : constant$10(!!_), area) : defined;
13734   };
13735
13736   area.curve = function(_) {
13737     return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13738   };
13739
13740   area.context = function(_) {
13741     return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13742   };
13743
13744   return area;
13745 };
13746
13747 var descending = function(a, b) {
13748   return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13749 };
13750
13751 var identity$6 = function(d) {
13752   return d;
13753 };
13754
13755 var pie = function() {
13756   var value = identity$6,
13757       sortValues = descending,
13758       sort = null,
13759       startAngle = constant$10(0),
13760       endAngle = constant$10(tau$4),
13761       padAngle = constant$10(0);
13762
13763   function pie(data) {
13764     var i,
13765         n = data.length,
13766         j,
13767         k,
13768         sum = 0,
13769         index = new Array(n),
13770         arcs = new Array(n),
13771         a0 = +startAngle.apply(this, arguments),
13772         da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13773         a1,
13774         p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13775         pa = p * (da < 0 ? -1 : 1),
13776         v;
13777
13778     for (i = 0; i < n; ++i) {
13779       if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13780         sum += v;
13781       }
13782     }
13783
13784     // Optionally sort the arcs by previously-computed values or by data.
13785     if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13786     else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13787
13788     // Compute the arcs! They are stored in the original data's order.
13789     for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13790       j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13791         data: data[j],
13792         index: i,
13793         value: v,
13794         startAngle: a0,
13795         endAngle: a1,
13796         padAngle: p
13797       };
13798     }
13799
13800     return arcs;
13801   }
13802
13803   pie.value = function(_) {
13804     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), pie) : value;
13805   };
13806
13807   pie.sortValues = function(_) {
13808     return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13809   };
13810
13811   pie.sort = function(_) {
13812     return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13813   };
13814
13815   pie.startAngle = function(_) {
13816     return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : startAngle;
13817   };
13818
13819   pie.endAngle = function(_) {
13820     return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : endAngle;
13821   };
13822
13823   pie.padAngle = function(_) {
13824     return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$10(+_), pie) : padAngle;
13825   };
13826
13827   return pie;
13828 };
13829
13830 var curveRadialLinear = curveRadial(curveLinear);
13831
13832 function Radial(curve) {
13833   this._curve = curve;
13834 }
13835
13836 Radial.prototype = {
13837   areaStart: function() {
13838     this._curve.areaStart();
13839   },
13840   areaEnd: function() {
13841     this._curve.areaEnd();
13842   },
13843   lineStart: function() {
13844     this._curve.lineStart();
13845   },
13846   lineEnd: function() {
13847     this._curve.lineEnd();
13848   },
13849   point: function(a, r) {
13850     this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13851   }
13852 };
13853
13854 function curveRadial(curve) {
13855
13856   function radial(context) {
13857     return new Radial(curve(context));
13858   }
13859
13860   radial._curve = curve;
13861
13862   return radial;
13863 }
13864
13865 function lineRadial(l) {
13866   var c = l.curve;
13867
13868   l.angle = l.x, delete l.x;
13869   l.radius = l.y, delete l.y;
13870
13871   l.curve = function(_) {
13872     return arguments.length ? c(curveRadial(_)) : c()._curve;
13873   };
13874
13875   return l;
13876 }
13877
13878 var lineRadial$1 = function() {
13879   return lineRadial(line().curve(curveRadialLinear));
13880 };
13881
13882 var areaRadial = function() {
13883   var a = area().curve(curveRadialLinear),
13884       c = a.curve,
13885       x0 = a.lineX0,
13886       x1 = a.lineX1,
13887       y0 = a.lineY0,
13888       y1 = a.lineY1;
13889
13890   a.angle = a.x, delete a.x;
13891   a.startAngle = a.x0, delete a.x0;
13892   a.endAngle = a.x1, delete a.x1;
13893   a.radius = a.y, delete a.y;
13894   a.innerRadius = a.y0, delete a.y0;
13895   a.outerRadius = a.y1, delete a.y1;
13896   a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
13897   a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
13898   a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
13899   a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
13900
13901   a.curve = function(_) {
13902     return arguments.length ? c(curveRadial(_)) : c()._curve;
13903   };
13904
13905   return a;
13906 };
13907
13908 var pointRadial = function(x, y) {
13909   return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
13910 };
13911
13912 var slice$6 = Array.prototype.slice;
13913
13914 function linkSource(d) {
13915   return d.source;
13916 }
13917
13918 function linkTarget(d) {
13919   return d.target;
13920 }
13921
13922 function link$2(curve) {
13923   var source = linkSource,
13924       target = linkTarget,
13925       x = x$3,
13926       y = y$3,
13927       context = null;
13928
13929   function link() {
13930     var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
13931     if (!context) context = buffer = path();
13932     curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
13933     if (buffer) return context = null, buffer + "" || null;
13934   }
13935
13936   link.source = function(_) {
13937     return arguments.length ? (source = _, link) : source;
13938   };
13939
13940   link.target = function(_) {
13941     return arguments.length ? (target = _, link) : target;
13942   };
13943
13944   link.x = function(_) {
13945     return arguments.length ? (x = typeof _ === "function" ? _ : constant$10(+_), link) : x;
13946   };
13947
13948   link.y = function(_) {
13949     return arguments.length ? (y = typeof _ === "function" ? _ : constant$10(+_), link) : y;
13950   };
13951
13952   link.context = function(_) {
13953     return arguments.length ? ((context = _ == null ? null : _), link) : context;
13954   };
13955
13956   return link;
13957 }
13958
13959 function curveHorizontal(context, x0, y0, x1, y1) {
13960   context.moveTo(x0, y0);
13961   context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
13962 }
13963
13964 function curveVertical(context, x0, y0, x1, y1) {
13965   context.moveTo(x0, y0);
13966   context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
13967 }
13968
13969 function curveRadial$1(context, x0, y0, x1, y1) {
13970   var p0 = pointRadial(x0, y0),
13971       p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
13972       p2 = pointRadial(x1, y0),
13973       p3 = pointRadial(x1, y1);
13974   context.moveTo(p0[0], p0[1]);
13975   context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
13976 }
13977
13978 function linkHorizontal() {
13979   return link$2(curveHorizontal);
13980 }
13981
13982 function linkVertical() {
13983   return link$2(curveVertical);
13984 }
13985
13986 function linkRadial() {
13987   var l = link$2(curveRadial$1);
13988   l.angle = l.x, delete l.x;
13989   l.radius = l.y, delete l.y;
13990   return l;
13991 }
13992
13993 var circle$2 = {
13994   draw: function(context, size) {
13995     var r = Math.sqrt(size / pi$4);
13996     context.moveTo(r, 0);
13997     context.arc(0, 0, r, 0, tau$4);
13998   }
13999 };
14000
14001 var cross$2 = {
14002   draw: function(context, size) {
14003     var r = Math.sqrt(size / 5) / 2;
14004     context.moveTo(-3 * r, -r);
14005     context.lineTo(-r, -r);
14006     context.lineTo(-r, -3 * r);
14007     context.lineTo(r, -3 * r);
14008     context.lineTo(r, -r);
14009     context.lineTo(3 * r, -r);
14010     context.lineTo(3 * r, r);
14011     context.lineTo(r, r);
14012     context.lineTo(r, 3 * r);
14013     context.lineTo(-r, 3 * r);
14014     context.lineTo(-r, r);
14015     context.lineTo(-3 * r, r);
14016     context.closePath();
14017   }
14018 };
14019
14020 var tan30 = Math.sqrt(1 / 3);
14021 var tan30_2 = tan30 * 2;
14022
14023 var diamond = {
14024   draw: function(context, size) {
14025     var y = Math.sqrt(size / tan30_2),
14026         x = y * tan30;
14027     context.moveTo(0, -y);
14028     context.lineTo(x, 0);
14029     context.lineTo(0, y);
14030     context.lineTo(-x, 0);
14031     context.closePath();
14032   }
14033 };
14034
14035 var ka = 0.89081309152928522810;
14036 var kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10);
14037 var kx = Math.sin(tau$4 / 10) * kr;
14038 var ky = -Math.cos(tau$4 / 10) * kr;
14039
14040 var star = {
14041   draw: function(context, size) {
14042     var r = Math.sqrt(size * ka),
14043         x = kx * r,
14044         y = ky * r;
14045     context.moveTo(0, -r);
14046     context.lineTo(x, y);
14047     for (var i = 1; i < 5; ++i) {
14048       var a = tau$4 * i / 5,
14049           c = Math.cos(a),
14050           s = Math.sin(a);
14051       context.lineTo(s * r, -c * r);
14052       context.lineTo(c * x - s * y, s * x + c * y);
14053     }
14054     context.closePath();
14055   }
14056 };
14057
14058 var square = {
14059   draw: function(context, size) {
14060     var w = Math.sqrt(size),
14061         x = -w / 2;
14062     context.rect(x, x, w, w);
14063   }
14064 };
14065
14066 var sqrt3 = Math.sqrt(3);
14067
14068 var triangle = {
14069   draw: function(context, size) {
14070     var y = -Math.sqrt(size / (sqrt3 * 3));
14071     context.moveTo(0, y * 2);
14072     context.lineTo(-sqrt3 * y, -y);
14073     context.lineTo(sqrt3 * y, -y);
14074     context.closePath();
14075   }
14076 };
14077
14078 var c = -0.5;
14079 var s = Math.sqrt(3) / 2;
14080 var k = 1 / Math.sqrt(12);
14081 var a = (k / 2 + 1) * 3;
14082
14083 var wye = {
14084   draw: function(context, size) {
14085     var r = Math.sqrt(size / a),
14086         x0 = r / 2,
14087         y0 = r * k,
14088         x1 = x0,
14089         y1 = r * k + r,
14090         x2 = -x1,
14091         y2 = y1;
14092     context.moveTo(x0, y0);
14093     context.lineTo(x1, y1);
14094     context.lineTo(x2, y2);
14095     context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14096     context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14097     context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14098     context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14099     context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14100     context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14101     context.closePath();
14102   }
14103 };
14104
14105 var symbols = [
14106   circle$2,
14107   cross$2,
14108   diamond,
14109   square,
14110   star,
14111   triangle,
14112   wye
14113 ];
14114
14115 var symbol = function() {
14116   var type = constant$10(circle$2),
14117       size = constant$10(64),
14118       context = null;
14119
14120   function symbol() {
14121     var buffer;
14122     if (!context) context = buffer = path();
14123     type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14124     if (buffer) return context = null, buffer + "" || null;
14125   }
14126
14127   symbol.type = function(_) {
14128     return arguments.length ? (type = typeof _ === "function" ? _ : constant$10(_), symbol) : type;
14129   };
14130
14131   symbol.size = function(_) {
14132     return arguments.length ? (size = typeof _ === "function" ? _ : constant$10(+_), symbol) : size;
14133   };
14134
14135   symbol.context = function(_) {
14136     return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14137   };
14138
14139   return symbol;
14140 };
14141
14142 var noop$2 = function() {};
14143
14144 function point$2(that, x, y) {
14145   that._context.bezierCurveTo(
14146     (2 * that._x0 + that._x1) / 3,
14147     (2 * that._y0 + that._y1) / 3,
14148     (that._x0 + 2 * that._x1) / 3,
14149     (that._y0 + 2 * that._y1) / 3,
14150     (that._x0 + 4 * that._x1 + x) / 6,
14151     (that._y0 + 4 * that._y1 + y) / 6
14152   );
14153 }
14154
14155 function Basis(context) {
14156   this._context = context;
14157 }
14158
14159 Basis.prototype = {
14160   areaStart: function() {
14161     this._line = 0;
14162   },
14163   areaEnd: function() {
14164     this._line = NaN;
14165   },
14166   lineStart: function() {
14167     this._x0 = this._x1 =
14168     this._y0 = this._y1 = NaN;
14169     this._point = 0;
14170   },
14171   lineEnd: function() {
14172     switch (this._point) {
14173       case 3: point$2(this, this._x1, this._y1); // proceed
14174       case 2: this._context.lineTo(this._x1, this._y1); break;
14175     }
14176     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14177     this._line = 1 - this._line;
14178   },
14179   point: function(x, y) {
14180     x = +x, y = +y;
14181     switch (this._point) {
14182       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14183       case 1: this._point = 2; break;
14184       case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14185       default: point$2(this, x, y); break;
14186     }
14187     this._x0 = this._x1, this._x1 = x;
14188     this._y0 = this._y1, this._y1 = y;
14189   }
14190 };
14191
14192 var basis$2 = function(context) {
14193   return new Basis(context);
14194 };
14195
14196 function BasisClosed(context) {
14197   this._context = context;
14198 }
14199
14200 BasisClosed.prototype = {
14201   areaStart: noop$2,
14202   areaEnd: noop$2,
14203   lineStart: function() {
14204     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14205     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14206     this._point = 0;
14207   },
14208   lineEnd: function() {
14209     switch (this._point) {
14210       case 1: {
14211         this._context.moveTo(this._x2, this._y2);
14212         this._context.closePath();
14213         break;
14214       }
14215       case 2: {
14216         this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14217         this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14218         this._context.closePath();
14219         break;
14220       }
14221       case 3: {
14222         this.point(this._x2, this._y2);
14223         this.point(this._x3, this._y3);
14224         this.point(this._x4, this._y4);
14225         break;
14226       }
14227     }
14228   },
14229   point: function(x, y) {
14230     x = +x, y = +y;
14231     switch (this._point) {
14232       case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14233       case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14234       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;
14235       default: point$2(this, x, y); break;
14236     }
14237     this._x0 = this._x1, this._x1 = x;
14238     this._y0 = this._y1, this._y1 = y;
14239   }
14240 };
14241
14242 var basisClosed$1 = function(context) {
14243   return new BasisClosed(context);
14244 };
14245
14246 function BasisOpen(context) {
14247   this._context = context;
14248 }
14249
14250 BasisOpen.prototype = {
14251   areaStart: function() {
14252     this._line = 0;
14253   },
14254   areaEnd: function() {
14255     this._line = NaN;
14256   },
14257   lineStart: function() {
14258     this._x0 = this._x1 =
14259     this._y0 = this._y1 = NaN;
14260     this._point = 0;
14261   },
14262   lineEnd: function() {
14263     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14264     this._line = 1 - this._line;
14265   },
14266   point: function(x, y) {
14267     x = +x, y = +y;
14268     switch (this._point) {
14269       case 0: this._point = 1; break;
14270       case 1: this._point = 2; break;
14271       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;
14272       case 3: this._point = 4; // proceed
14273       default: point$2(this, x, y); break;
14274     }
14275     this._x0 = this._x1, this._x1 = x;
14276     this._y0 = this._y1, this._y1 = y;
14277   }
14278 };
14279
14280 var basisOpen = function(context) {
14281   return new BasisOpen(context);
14282 };
14283
14284 function Bundle(context, beta) {
14285   this._basis = new Basis(context);
14286   this._beta = beta;
14287 }
14288
14289 Bundle.prototype = {
14290   lineStart: function() {
14291     this._x = [];
14292     this._y = [];
14293     this._basis.lineStart();
14294   },
14295   lineEnd: function() {
14296     var x = this._x,
14297         y = this._y,
14298         j = x.length - 1;
14299
14300     if (j > 0) {
14301       var x0 = x[0],
14302           y0 = y[0],
14303           dx = x[j] - x0,
14304           dy = y[j] - y0,
14305           i = -1,
14306           t;
14307
14308       while (++i <= j) {
14309         t = i / j;
14310         this._basis.point(
14311           this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14312           this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14313         );
14314       }
14315     }
14316
14317     this._x = this._y = null;
14318     this._basis.lineEnd();
14319   },
14320   point: function(x, y) {
14321     this._x.push(+x);
14322     this._y.push(+y);
14323   }
14324 };
14325
14326 var bundle = (function custom(beta) {
14327
14328   function bundle(context) {
14329     return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14330   }
14331
14332   bundle.beta = function(beta) {
14333     return custom(+beta);
14334   };
14335
14336   return bundle;
14337 })(0.85);
14338
14339 function point$3(that, x, y) {
14340   that._context.bezierCurveTo(
14341     that._x1 + that._k * (that._x2 - that._x0),
14342     that._y1 + that._k * (that._y2 - that._y0),
14343     that._x2 + that._k * (that._x1 - x),
14344     that._y2 + that._k * (that._y1 - y),
14345     that._x2,
14346     that._y2
14347   );
14348 }
14349
14350 function Cardinal(context, tension) {
14351   this._context = context;
14352   this._k = (1 - tension) / 6;
14353 }
14354
14355 Cardinal.prototype = {
14356   areaStart: function() {
14357     this._line = 0;
14358   },
14359   areaEnd: function() {
14360     this._line = NaN;
14361   },
14362   lineStart: function() {
14363     this._x0 = this._x1 = this._x2 =
14364     this._y0 = this._y1 = this._y2 = NaN;
14365     this._point = 0;
14366   },
14367   lineEnd: function() {
14368     switch (this._point) {
14369       case 2: this._context.lineTo(this._x2, this._y2); break;
14370       case 3: point$3(this, this._x1, this._y1); break;
14371     }
14372     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14373     this._line = 1 - this._line;
14374   },
14375   point: function(x, y) {
14376     x = +x, y = +y;
14377     switch (this._point) {
14378       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14379       case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14380       case 2: this._point = 3; // proceed
14381       default: point$3(this, x, y); break;
14382     }
14383     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14384     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14385   }
14386 };
14387
14388 var cardinal = (function custom(tension) {
14389
14390   function cardinal(context) {
14391     return new Cardinal(context, tension);
14392   }
14393
14394   cardinal.tension = function(tension) {
14395     return custom(+tension);
14396   };
14397
14398   return cardinal;
14399 })(0);
14400
14401 function CardinalClosed(context, tension) {
14402   this._context = context;
14403   this._k = (1 - tension) / 6;
14404 }
14405
14406 CardinalClosed.prototype = {
14407   areaStart: noop$2,
14408   areaEnd: noop$2,
14409   lineStart: function() {
14410     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14411     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14412     this._point = 0;
14413   },
14414   lineEnd: function() {
14415     switch (this._point) {
14416       case 1: {
14417         this._context.moveTo(this._x3, this._y3);
14418         this._context.closePath();
14419         break;
14420       }
14421       case 2: {
14422         this._context.lineTo(this._x3, this._y3);
14423         this._context.closePath();
14424         break;
14425       }
14426       case 3: {
14427         this.point(this._x3, this._y3);
14428         this.point(this._x4, this._y4);
14429         this.point(this._x5, this._y5);
14430         break;
14431       }
14432     }
14433   },
14434   point: function(x, y) {
14435     x = +x, y = +y;
14436     switch (this._point) {
14437       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14438       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14439       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14440       default: point$3(this, x, y); break;
14441     }
14442     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14443     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14444   }
14445 };
14446
14447 var cardinalClosed = (function custom(tension) {
14448
14449   function cardinal$$1(context) {
14450     return new CardinalClosed(context, tension);
14451   }
14452
14453   cardinal$$1.tension = function(tension) {
14454     return custom(+tension);
14455   };
14456
14457   return cardinal$$1;
14458 })(0);
14459
14460 function CardinalOpen(context, tension) {
14461   this._context = context;
14462   this._k = (1 - tension) / 6;
14463 }
14464
14465 CardinalOpen.prototype = {
14466   areaStart: function() {
14467     this._line = 0;
14468   },
14469   areaEnd: function() {
14470     this._line = NaN;
14471   },
14472   lineStart: function() {
14473     this._x0 = this._x1 = this._x2 =
14474     this._y0 = this._y1 = this._y2 = NaN;
14475     this._point = 0;
14476   },
14477   lineEnd: function() {
14478     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14479     this._line = 1 - this._line;
14480   },
14481   point: function(x, y) {
14482     x = +x, y = +y;
14483     switch (this._point) {
14484       case 0: this._point = 1; break;
14485       case 1: this._point = 2; break;
14486       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14487       case 3: this._point = 4; // proceed
14488       default: point$3(this, x, y); break;
14489     }
14490     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14491     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14492   }
14493 };
14494
14495 var cardinalOpen = (function custom(tension) {
14496
14497   function cardinal$$1(context) {
14498     return new CardinalOpen(context, tension);
14499   }
14500
14501   cardinal$$1.tension = function(tension) {
14502     return custom(+tension);
14503   };
14504
14505   return cardinal$$1;
14506 })(0);
14507
14508 function point$4(that, x, y) {
14509   var x1 = that._x1,
14510       y1 = that._y1,
14511       x2 = that._x2,
14512       y2 = that._y2;
14513
14514   if (that._l01_a > epsilon$3) {
14515     var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14516         n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14517     x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14518     y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14519   }
14520
14521   if (that._l23_a > epsilon$3) {
14522     var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14523         m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14524     x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14525     y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14526   }
14527
14528   that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14529 }
14530
14531 function CatmullRom(context, alpha) {
14532   this._context = context;
14533   this._alpha = alpha;
14534 }
14535
14536 CatmullRom.prototype = {
14537   areaStart: function() {
14538     this._line = 0;
14539   },
14540   areaEnd: function() {
14541     this._line = NaN;
14542   },
14543   lineStart: function() {
14544     this._x0 = this._x1 = this._x2 =
14545     this._y0 = this._y1 = this._y2 = NaN;
14546     this._l01_a = this._l12_a = this._l23_a =
14547     this._l01_2a = this._l12_2a = this._l23_2a =
14548     this._point = 0;
14549   },
14550   lineEnd: function() {
14551     switch (this._point) {
14552       case 2: this._context.lineTo(this._x2, this._y2); break;
14553       case 3: this.point(this._x2, this._y2); break;
14554     }
14555     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14556     this._line = 1 - this._line;
14557   },
14558   point: function(x, y) {
14559     x = +x, y = +y;
14560
14561     if (this._point) {
14562       var x23 = this._x2 - x,
14563           y23 = this._y2 - y;
14564       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14565     }
14566
14567     switch (this._point) {
14568       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14569       case 1: this._point = 2; break;
14570       case 2: this._point = 3; // proceed
14571       default: point$4(this, x, y); break;
14572     }
14573
14574     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14575     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14576     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14577     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14578   }
14579 };
14580
14581 var catmullRom = (function custom(alpha) {
14582
14583   function catmullRom(context) {
14584     return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14585   }
14586
14587   catmullRom.alpha = function(alpha) {
14588     return custom(+alpha);
14589   };
14590
14591   return catmullRom;
14592 })(0.5);
14593
14594 function CatmullRomClosed(context, alpha) {
14595   this._context = context;
14596   this._alpha = alpha;
14597 }
14598
14599 CatmullRomClosed.prototype = {
14600   areaStart: noop$2,
14601   areaEnd: noop$2,
14602   lineStart: function() {
14603     this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14604     this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14605     this._l01_a = this._l12_a = this._l23_a =
14606     this._l01_2a = this._l12_2a = this._l23_2a =
14607     this._point = 0;
14608   },
14609   lineEnd: function() {
14610     switch (this._point) {
14611       case 1: {
14612         this._context.moveTo(this._x3, this._y3);
14613         this._context.closePath();
14614         break;
14615       }
14616       case 2: {
14617         this._context.lineTo(this._x3, this._y3);
14618         this._context.closePath();
14619         break;
14620       }
14621       case 3: {
14622         this.point(this._x3, this._y3);
14623         this.point(this._x4, this._y4);
14624         this.point(this._x5, this._y5);
14625         break;
14626       }
14627     }
14628   },
14629   point: function(x, y) {
14630     x = +x, y = +y;
14631
14632     if (this._point) {
14633       var x23 = this._x2 - x,
14634           y23 = this._y2 - y;
14635       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14636     }
14637
14638     switch (this._point) {
14639       case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14640       case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14641       case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14642       default: point$4(this, x, y); break;
14643     }
14644
14645     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14646     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14647     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14648     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14649   }
14650 };
14651
14652 var catmullRomClosed = (function custom(alpha) {
14653
14654   function catmullRom$$1(context) {
14655     return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14656   }
14657
14658   catmullRom$$1.alpha = function(alpha) {
14659     return custom(+alpha);
14660   };
14661
14662   return catmullRom$$1;
14663 })(0.5);
14664
14665 function CatmullRomOpen(context, alpha) {
14666   this._context = context;
14667   this._alpha = alpha;
14668 }
14669
14670 CatmullRomOpen.prototype = {
14671   areaStart: function() {
14672     this._line = 0;
14673   },
14674   areaEnd: function() {
14675     this._line = NaN;
14676   },
14677   lineStart: function() {
14678     this._x0 = this._x1 = this._x2 =
14679     this._y0 = this._y1 = this._y2 = NaN;
14680     this._l01_a = this._l12_a = this._l23_a =
14681     this._l01_2a = this._l12_2a = this._l23_2a =
14682     this._point = 0;
14683   },
14684   lineEnd: function() {
14685     if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14686     this._line = 1 - this._line;
14687   },
14688   point: function(x, y) {
14689     x = +x, y = +y;
14690
14691     if (this._point) {
14692       var x23 = this._x2 - x,
14693           y23 = this._y2 - y;
14694       this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14695     }
14696
14697     switch (this._point) {
14698       case 0: this._point = 1; break;
14699       case 1: this._point = 2; break;
14700       case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14701       case 3: this._point = 4; // proceed
14702       default: point$4(this, x, y); break;
14703     }
14704
14705     this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14706     this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14707     this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14708     this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14709   }
14710 };
14711
14712 var catmullRomOpen = (function custom(alpha) {
14713
14714   function catmullRom$$1(context) {
14715     return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14716   }
14717
14718   catmullRom$$1.alpha = function(alpha) {
14719     return custom(+alpha);
14720   };
14721
14722   return catmullRom$$1;
14723 })(0.5);
14724
14725 function LinearClosed(context) {
14726   this._context = context;
14727 }
14728
14729 LinearClosed.prototype = {
14730   areaStart: noop$2,
14731   areaEnd: noop$2,
14732   lineStart: function() {
14733     this._point = 0;
14734   },
14735   lineEnd: function() {
14736     if (this._point) this._context.closePath();
14737   },
14738   point: function(x, y) {
14739     x = +x, y = +y;
14740     if (this._point) this._context.lineTo(x, y);
14741     else this._point = 1, this._context.moveTo(x, y);
14742   }
14743 };
14744
14745 var linearClosed = function(context) {
14746   return new LinearClosed(context);
14747 };
14748
14749 function sign$1(x) {
14750   return x < 0 ? -1 : 1;
14751 }
14752
14753 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14754 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14755 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14756 // NOV(II), P. 443, 1990.
14757 function slope3(that, x2, y2) {
14758   var h0 = that._x1 - that._x0,
14759       h1 = x2 - that._x1,
14760       s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14761       s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14762       p = (s0 * h1 + s1 * h0) / (h0 + h1);
14763   return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14764 }
14765
14766 // Calculate a one-sided slope.
14767 function slope2(that, t) {
14768   var h = that._x1 - that._x0;
14769   return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14770 }
14771
14772 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14773 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14774 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14775 function point$5(that, t0, t1) {
14776   var x0 = that._x0,
14777       y0 = that._y0,
14778       x1 = that._x1,
14779       y1 = that._y1,
14780       dx = (x1 - x0) / 3;
14781   that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14782 }
14783
14784 function MonotoneX(context) {
14785   this._context = context;
14786 }
14787
14788 MonotoneX.prototype = {
14789   areaStart: function() {
14790     this._line = 0;
14791   },
14792   areaEnd: function() {
14793     this._line = NaN;
14794   },
14795   lineStart: function() {
14796     this._x0 = this._x1 =
14797     this._y0 = this._y1 =
14798     this._t0 = NaN;
14799     this._point = 0;
14800   },
14801   lineEnd: function() {
14802     switch (this._point) {
14803       case 2: this._context.lineTo(this._x1, this._y1); break;
14804       case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14805     }
14806     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14807     this._line = 1 - this._line;
14808   },
14809   point: function(x, y) {
14810     var t1 = NaN;
14811
14812     x = +x, y = +y;
14813     if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14814     switch (this._point) {
14815       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14816       case 1: this._point = 2; break;
14817       case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14818       default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14819     }
14820
14821     this._x0 = this._x1, this._x1 = x;
14822     this._y0 = this._y1, this._y1 = y;
14823     this._t0 = t1;
14824   }
14825 };
14826
14827 function MonotoneY(context) {
14828   this._context = new ReflectContext(context);
14829 }
14830
14831 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14832   MonotoneX.prototype.point.call(this, y, x);
14833 };
14834
14835 function ReflectContext(context) {
14836   this._context = context;
14837 }
14838
14839 ReflectContext.prototype = {
14840   moveTo: function(x, y) { this._context.moveTo(y, x); },
14841   closePath: function() { this._context.closePath(); },
14842   lineTo: function(x, y) { this._context.lineTo(y, x); },
14843   bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14844 };
14845
14846 function monotoneX(context) {
14847   return new MonotoneX(context);
14848 }
14849
14850 function monotoneY(context) {
14851   return new MonotoneY(context);
14852 }
14853
14854 function Natural(context) {
14855   this._context = context;
14856 }
14857
14858 Natural.prototype = {
14859   areaStart: function() {
14860     this._line = 0;
14861   },
14862   areaEnd: function() {
14863     this._line = NaN;
14864   },
14865   lineStart: function() {
14866     this._x = [];
14867     this._y = [];
14868   },
14869   lineEnd: function() {
14870     var x = this._x,
14871         y = this._y,
14872         n = x.length;
14873
14874     if (n) {
14875       this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
14876       if (n === 2) {
14877         this._context.lineTo(x[1], y[1]);
14878       } else {
14879         var px = controlPoints(x),
14880             py = controlPoints(y);
14881         for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
14882           this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
14883         }
14884       }
14885     }
14886
14887     if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
14888     this._line = 1 - this._line;
14889     this._x = this._y = null;
14890   },
14891   point: function(x, y) {
14892     this._x.push(+x);
14893     this._y.push(+y);
14894   }
14895 };
14896
14897 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
14898 function controlPoints(x) {
14899   var i,
14900       n = x.length - 1,
14901       m,
14902       a = new Array(n),
14903       b = new Array(n),
14904       r = new Array(n);
14905   a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
14906   for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
14907   a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
14908   for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
14909   a[n - 1] = r[n - 1] / b[n - 1];
14910   for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
14911   b[n - 1] = (x[n] + a[n - 1]) / 2;
14912   for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
14913   return [a, b];
14914 }
14915
14916 var natural = function(context) {
14917   return new Natural(context);
14918 };
14919
14920 function Step(context, t) {
14921   this._context = context;
14922   this._t = t;
14923 }
14924
14925 Step.prototype = {
14926   areaStart: function() {
14927     this._line = 0;
14928   },
14929   areaEnd: function() {
14930     this._line = NaN;
14931   },
14932   lineStart: function() {
14933     this._x = this._y = NaN;
14934     this._point = 0;
14935   },
14936   lineEnd: function() {
14937     if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
14938     if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14939     if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
14940   },
14941   point: function(x, y) {
14942     x = +x, y = +y;
14943     switch (this._point) {
14944       case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14945       case 1: this._point = 2; // proceed
14946       default: {
14947         if (this._t <= 0) {
14948           this._context.lineTo(this._x, y);
14949           this._context.lineTo(x, y);
14950         } else {
14951           var x1 = this._x * (1 - this._t) + x * this._t;
14952           this._context.lineTo(x1, this._y);
14953           this._context.lineTo(x1, y);
14954         }
14955         break;
14956       }
14957     }
14958     this._x = x, this._y = y;
14959   }
14960 };
14961
14962 var step = function(context) {
14963   return new Step(context, 0.5);
14964 };
14965
14966 function stepBefore(context) {
14967   return new Step(context, 0);
14968 }
14969
14970 function stepAfter(context) {
14971   return new Step(context, 1);
14972 }
14973
14974 var none$1 = function(series, order) {
14975   if (!((n = series.length) > 1)) return;
14976   for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
14977     s0 = s1, s1 = series[order[i]];
14978     for (j = 0; j < m; ++j) {
14979       s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
14980     }
14981   }
14982 };
14983
14984 var none$2 = function(series) {
14985   var n = series.length, o = new Array(n);
14986   while (--n >= 0) o[n] = n;
14987   return o;
14988 };
14989
14990 function stackValue(d, key) {
14991   return d[key];
14992 }
14993
14994 var stack = function() {
14995   var keys = constant$10([]),
14996       order = none$2,
14997       offset = none$1,
14998       value = stackValue;
14999
15000   function stack(data) {
15001     var kz = keys.apply(this, arguments),
15002         i,
15003         m = data.length,
15004         n = kz.length,
15005         sz = new Array(n),
15006         oz;
15007
15008     for (i = 0; i < n; ++i) {
15009       for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15010         si[j] = sij = [0, +value(data[j], ki, j, data)];
15011         sij.data = data[j];
15012       }
15013       si.key = ki;
15014     }
15015
15016     for (i = 0, oz = order(sz); i < n; ++i) {
15017       sz[oz[i]].index = i;
15018     }
15019
15020     offset(sz, oz);
15021     return sz;
15022   }
15023
15024   stack.keys = function(_) {
15025     return arguments.length ? (keys = typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : keys;
15026   };
15027
15028   stack.value = function(_) {
15029     return arguments.length ? (value = typeof _ === "function" ? _ : constant$10(+_), stack) : value;
15030   };
15031
15032   stack.order = function(_) {
15033     return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$10(slice$6.call(_)), stack) : order;
15034   };
15035
15036   stack.offset = function(_) {
15037     return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15038   };
15039
15040   return stack;
15041 };
15042
15043 var expand = function(series, order) {
15044   if (!((n = series.length) > 0)) return;
15045   for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15046     for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15047     if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15048   }
15049   none$1(series, order);
15050 };
15051
15052 var diverging = function(series, order) {
15053   if (!((n = series.length) > 1)) return;
15054   for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15055     for (yp = yn = 0, i = 0; i < n; ++i) {
15056       if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15057         d[0] = yp, d[1] = yp += dy;
15058       } else if (dy < 0) {
15059         d[1] = yn, d[0] = yn += dy;
15060       } else {
15061         d[0] = yp;
15062       }
15063     }
15064   }
15065 };
15066
15067 var silhouette = function(series, order) {
15068   if (!((n = series.length) > 0)) return;
15069   for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15070     for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15071     s0[j][1] += s0[j][0] = -y / 2;
15072   }
15073   none$1(series, order);
15074 };
15075
15076 var wiggle = function(series, order) {
15077   if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15078   for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15079     for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15080       var si = series[order[i]],
15081           sij0 = si[j][1] || 0,
15082           sij1 = si[j - 1][1] || 0,
15083           s3 = (sij0 - sij1) / 2;
15084       for (var k = 0; k < i; ++k) {
15085         var sk = series[order[k]],
15086             skj0 = sk[j][1] || 0,
15087             skj1 = sk[j - 1][1] || 0;
15088         s3 += skj0 - skj1;
15089       }
15090       s1 += sij0, s2 += s3 * sij0;
15091     }
15092     s0[j - 1][1] += s0[j - 1][0] = y;
15093     if (s1) y -= s2 / s1;
15094   }
15095   s0[j - 1][1] += s0[j - 1][0] = y;
15096   none$1(series, order);
15097 };
15098
15099 var ascending$1 = function(series) {
15100   var sums = series.map(sum$2);
15101   return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15102 };
15103
15104 function sum$2(series) {
15105   var s = 0, i = -1, n = series.length, v;
15106   while (++i < n) if (v = +series[i][1]) s += v;
15107   return s;
15108 }
15109
15110 var descending$1 = function(series) {
15111   return ascending$1(series).reverse();
15112 };
15113
15114 var insideOut = function(series) {
15115   var n = series.length,
15116       i,
15117       j,
15118       sums = series.map(sum$2),
15119       order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15120       top = 0,
15121       bottom = 0,
15122       tops = [],
15123       bottoms = [];
15124
15125   for (i = 0; i < n; ++i) {
15126     j = order[i];
15127     if (top < bottom) {
15128       top += sums[j];
15129       tops.push(j);
15130     } else {
15131       bottom += sums[j];
15132       bottoms.push(j);
15133     }
15134   }
15135
15136   return bottoms.reverse().concat(tops);
15137 };
15138
15139 var reverse = function(series) {
15140   return none$2(series).reverse();
15141 };
15142
15143 var constant$11 = function(x) {
15144   return function() {
15145     return x;
15146   };
15147 };
15148
15149 function x$4(d) {
15150   return d[0];
15151 }
15152
15153 function y$4(d) {
15154   return d[1];
15155 }
15156
15157 function RedBlackTree() {
15158   this._ = null; // root node
15159 }
15160
15161 function RedBlackNode(node) {
15162   node.U = // parent node
15163   node.C = // color - true for red, false for black
15164   node.L = // left node
15165   node.R = // right node
15166   node.P = // previous node
15167   node.N = null; // next node
15168 }
15169
15170 RedBlackTree.prototype = {
15171   constructor: RedBlackTree,
15172
15173   insert: function(after, node) {
15174     var parent, grandpa, uncle;
15175
15176     if (after) {
15177       node.P = after;
15178       node.N = after.N;
15179       if (after.N) after.N.P = node;
15180       after.N = node;
15181       if (after.R) {
15182         after = after.R;
15183         while (after.L) after = after.L;
15184         after.L = node;
15185       } else {
15186         after.R = node;
15187       }
15188       parent = after;
15189     } else if (this._) {
15190       after = RedBlackFirst(this._);
15191       node.P = null;
15192       node.N = after;
15193       after.P = after.L = node;
15194       parent = after;
15195     } else {
15196       node.P = node.N = null;
15197       this._ = node;
15198       parent = null;
15199     }
15200     node.L = node.R = null;
15201     node.U = parent;
15202     node.C = true;
15203
15204     after = node;
15205     while (parent && parent.C) {
15206       grandpa = parent.U;
15207       if (parent === grandpa.L) {
15208         uncle = grandpa.R;
15209         if (uncle && uncle.C) {
15210           parent.C = uncle.C = false;
15211           grandpa.C = true;
15212           after = grandpa;
15213         } else {
15214           if (after === parent.R) {
15215             RedBlackRotateLeft(this, parent);
15216             after = parent;
15217             parent = after.U;
15218           }
15219           parent.C = false;
15220           grandpa.C = true;
15221           RedBlackRotateRight(this, grandpa);
15222         }
15223       } else {
15224         uncle = grandpa.L;
15225         if (uncle && uncle.C) {
15226           parent.C = uncle.C = false;
15227           grandpa.C = true;
15228           after = grandpa;
15229         } else {
15230           if (after === parent.L) {
15231             RedBlackRotateRight(this, parent);
15232             after = parent;
15233             parent = after.U;
15234           }
15235           parent.C = false;
15236           grandpa.C = true;
15237           RedBlackRotateLeft(this, grandpa);
15238         }
15239       }
15240       parent = after.U;
15241     }
15242     this._.C = false;
15243   },
15244
15245   remove: function(node) {
15246     if (node.N) node.N.P = node.P;
15247     if (node.P) node.P.N = node.N;
15248     node.N = node.P = null;
15249
15250     var parent = node.U,
15251         sibling,
15252         left = node.L,
15253         right = node.R,
15254         next,
15255         red;
15256
15257     if (!left) next = right;
15258     else if (!right) next = left;
15259     else next = RedBlackFirst(right);
15260
15261     if (parent) {
15262       if (parent.L === node) parent.L = next;
15263       else parent.R = next;
15264     } else {
15265       this._ = next;
15266     }
15267
15268     if (left && right) {
15269       red = next.C;
15270       next.C = node.C;
15271       next.L = left;
15272       left.U = next;
15273       if (next !== right) {
15274         parent = next.U;
15275         next.U = node.U;
15276         node = next.R;
15277         parent.L = node;
15278         next.R = right;
15279         right.U = next;
15280       } else {
15281         next.U = parent;
15282         parent = next;
15283         node = next.R;
15284       }
15285     } else {
15286       red = node.C;
15287       node = next;
15288     }
15289
15290     if (node) node.U = parent;
15291     if (red) return;
15292     if (node && node.C) { node.C = false; return; }
15293
15294     do {
15295       if (node === this._) break;
15296       if (node === parent.L) {
15297         sibling = parent.R;
15298         if (sibling.C) {
15299           sibling.C = false;
15300           parent.C = true;
15301           RedBlackRotateLeft(this, parent);
15302           sibling = parent.R;
15303         }
15304         if ((sibling.L && sibling.L.C)
15305             || (sibling.R && sibling.R.C)) {
15306           if (!sibling.R || !sibling.R.C) {
15307             sibling.L.C = false;
15308             sibling.C = true;
15309             RedBlackRotateRight(this, sibling);
15310             sibling = parent.R;
15311           }
15312           sibling.C = parent.C;
15313           parent.C = sibling.R.C = false;
15314           RedBlackRotateLeft(this, parent);
15315           node = this._;
15316           break;
15317         }
15318       } else {
15319         sibling = parent.L;
15320         if (sibling.C) {
15321           sibling.C = false;
15322           parent.C = true;
15323           RedBlackRotateRight(this, parent);
15324           sibling = parent.L;
15325         }
15326         if ((sibling.L && sibling.L.C)
15327           || (sibling.R && sibling.R.C)) {
15328           if (!sibling.L || !sibling.L.C) {
15329             sibling.R.C = false;
15330             sibling.C = true;
15331             RedBlackRotateLeft(this, sibling);
15332             sibling = parent.L;
15333           }
15334           sibling.C = parent.C;
15335           parent.C = sibling.L.C = false;
15336           RedBlackRotateRight(this, parent);
15337           node = this._;
15338           break;
15339         }
15340       }
15341       sibling.C = true;
15342       node = parent;
15343       parent = parent.U;
15344     } while (!node.C);
15345
15346     if (node) node.C = false;
15347   }
15348 };
15349
15350 function RedBlackRotateLeft(tree, node) {
15351   var p = node,
15352       q = node.R,
15353       parent = p.U;
15354
15355   if (parent) {
15356     if (parent.L === p) parent.L = q;
15357     else parent.R = q;
15358   } else {
15359     tree._ = q;
15360   }
15361
15362   q.U = parent;
15363   p.U = q;
15364   p.R = q.L;
15365   if (p.R) p.R.U = p;
15366   q.L = p;
15367 }
15368
15369 function RedBlackRotateRight(tree, node) {
15370   var p = node,
15371       q = node.L,
15372       parent = p.U;
15373
15374   if (parent) {
15375     if (parent.L === p) parent.L = q;
15376     else parent.R = q;
15377   } else {
15378     tree._ = q;
15379   }
15380
15381   q.U = parent;
15382   p.U = q;
15383   p.L = q.R;
15384   if (p.L) p.L.U = p;
15385   q.R = p;
15386 }
15387
15388 function RedBlackFirst(node) {
15389   while (node.L) node = node.L;
15390   return node;
15391 }
15392
15393 function createEdge(left, right, v0, v1) {
15394   var edge = [null, null],
15395       index = edges.push(edge) - 1;
15396   edge.left = left;
15397   edge.right = right;
15398   if (v0) setEdgeEnd(edge, left, right, v0);
15399   if (v1) setEdgeEnd(edge, right, left, v1);
15400   cells[left.index].halfedges.push(index);
15401   cells[right.index].halfedges.push(index);
15402   return edge;
15403 }
15404
15405 function createBorderEdge(left, v0, v1) {
15406   var edge = [v0, v1];
15407   edge.left = left;
15408   return edge;
15409 }
15410
15411 function setEdgeEnd(edge, left, right, vertex) {
15412   if (!edge[0] && !edge[1]) {
15413     edge[0] = vertex;
15414     edge.left = left;
15415     edge.right = right;
15416   } else if (edge.left === right) {
15417     edge[1] = vertex;
15418   } else {
15419     edge[0] = vertex;
15420   }
15421 }
15422
15423 // Liang–Barsky line clipping.
15424 function clipEdge(edge, x0, y0, x1, y1) {
15425   var a = edge[0],
15426       b = edge[1],
15427       ax = a[0],
15428       ay = a[1],
15429       bx = b[0],
15430       by = b[1],
15431       t0 = 0,
15432       t1 = 1,
15433       dx = bx - ax,
15434       dy = by - ay,
15435       r;
15436
15437   r = x0 - ax;
15438   if (!dx && r > 0) return;
15439   r /= dx;
15440   if (dx < 0) {
15441     if (r < t0) return;
15442     if (r < t1) t1 = r;
15443   } else if (dx > 0) {
15444     if (r > t1) return;
15445     if (r > t0) t0 = r;
15446   }
15447
15448   r = x1 - ax;
15449   if (!dx && r < 0) return;
15450   r /= dx;
15451   if (dx < 0) {
15452     if (r > t1) return;
15453     if (r > t0) t0 = r;
15454   } else if (dx > 0) {
15455     if (r < t0) return;
15456     if (r < t1) t1 = r;
15457   }
15458
15459   r = y0 - ay;
15460   if (!dy && r > 0) return;
15461   r /= dy;
15462   if (dy < 0) {
15463     if (r < t0) return;
15464     if (r < t1) t1 = r;
15465   } else if (dy > 0) {
15466     if (r > t1) return;
15467     if (r > t0) t0 = r;
15468   }
15469
15470   r = y1 - ay;
15471   if (!dy && r < 0) return;
15472   r /= dy;
15473   if (dy < 0) {
15474     if (r > t1) return;
15475     if (r > t0) t0 = r;
15476   } else if (dy > 0) {
15477     if (r < t0) return;
15478     if (r < t1) t1 = r;
15479   }
15480
15481   if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15482
15483   if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15484   if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15485   return true;
15486 }
15487
15488 function connectEdge(edge, x0, y0, x1, y1) {
15489   var v1 = edge[1];
15490   if (v1) return true;
15491
15492   var v0 = edge[0],
15493       left = edge.left,
15494       right = edge.right,
15495       lx = left[0],
15496       ly = left[1],
15497       rx = right[0],
15498       ry = right[1],
15499       fx = (lx + rx) / 2,
15500       fy = (ly + ry) / 2,
15501       fm,
15502       fb;
15503
15504   if (ry === ly) {
15505     if (fx < x0 || fx >= x1) return;
15506     if (lx > rx) {
15507       if (!v0) v0 = [fx, y0];
15508       else if (v0[1] >= y1) return;
15509       v1 = [fx, y1];
15510     } else {
15511       if (!v0) v0 = [fx, y1];
15512       else if (v0[1] < y0) return;
15513       v1 = [fx, y0];
15514     }
15515   } else {
15516     fm = (lx - rx) / (ry - ly);
15517     fb = fy - fm * fx;
15518     if (fm < -1 || fm > 1) {
15519       if (lx > rx) {
15520         if (!v0) v0 = [(y0 - fb) / fm, y0];
15521         else if (v0[1] >= y1) return;
15522         v1 = [(y1 - fb) / fm, y1];
15523       } else {
15524         if (!v0) v0 = [(y1 - fb) / fm, y1];
15525         else if (v0[1] < y0) return;
15526         v1 = [(y0 - fb) / fm, y0];
15527       }
15528     } else {
15529       if (ly < ry) {
15530         if (!v0) v0 = [x0, fm * x0 + fb];
15531         else if (v0[0] >= x1) return;
15532         v1 = [x1, fm * x1 + fb];
15533       } else {
15534         if (!v0) v0 = [x1, fm * x1 + fb];
15535         else if (v0[0] < x0) return;
15536         v1 = [x0, fm * x0 + fb];
15537       }
15538     }
15539   }
15540
15541   edge[0] = v0;
15542   edge[1] = v1;
15543   return true;
15544 }
15545
15546 function clipEdges(x0, y0, x1, y1) {
15547   var i = edges.length,
15548       edge;
15549
15550   while (i--) {
15551     if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15552         || !clipEdge(edge, x0, y0, x1, y1)
15553         || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15554             || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15555       delete edges[i];
15556     }
15557   }
15558 }
15559
15560 function createCell(site) {
15561   return cells[site.index] = {
15562     site: site,
15563     halfedges: []
15564   };
15565 }
15566
15567 function cellHalfedgeAngle(cell, edge) {
15568   var site = cell.site,
15569       va = edge.left,
15570       vb = edge.right;
15571   if (site === vb) vb = va, va = site;
15572   if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15573   if (site === va) va = edge[1], vb = edge[0];
15574   else va = edge[0], vb = edge[1];
15575   return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15576 }
15577
15578 function cellHalfedgeStart(cell, edge) {
15579   return edge[+(edge.left !== cell.site)];
15580 }
15581
15582 function cellHalfedgeEnd(cell, edge) {
15583   return edge[+(edge.left === cell.site)];
15584 }
15585
15586 function sortCellHalfedges() {
15587   for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15588     if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15589       var index = new Array(m),
15590           array = new Array(m);
15591       for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15592       index.sort(function(i, j) { return array[j] - array[i]; });
15593       for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15594       for (j = 0; j < m; ++j) halfedges[j] = array[j];
15595     }
15596   }
15597 }
15598
15599 function clipCells(x0, y0, x1, y1) {
15600   var nCells = cells.length,
15601       iCell,
15602       cell,
15603       site,
15604       iHalfedge,
15605       halfedges,
15606       nHalfedges,
15607       start,
15608       startX,
15609       startY,
15610       end,
15611       endX,
15612       endY,
15613       cover = true;
15614
15615   for (iCell = 0; iCell < nCells; ++iCell) {
15616     if (cell = cells[iCell]) {
15617       site = cell.site;
15618       halfedges = cell.halfedges;
15619       iHalfedge = halfedges.length;
15620
15621       // Remove any dangling clipped edges.
15622       while (iHalfedge--) {
15623         if (!edges[halfedges[iHalfedge]]) {
15624           halfedges.splice(iHalfedge, 1);
15625         }
15626       }
15627
15628       // Insert any border edges as necessary.
15629       iHalfedge = 0, nHalfedges = halfedges.length;
15630       while (iHalfedge < nHalfedges) {
15631         end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15632         start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15633         if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15634           halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15635               Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15636               : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15637               : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15638               : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15639               : null)) - 1);
15640           ++nHalfedges;
15641         }
15642       }
15643
15644       if (nHalfedges) cover = false;
15645     }
15646   }
15647
15648   // If there weren’t any edges, have the closest site cover the extent.
15649   // It doesn’t matter which corner of the extent we measure!
15650   if (cover) {
15651     var dx, dy, d2, dc = Infinity;
15652
15653     for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15654       if (cell = cells[iCell]) {
15655         site = cell.site;
15656         dx = site[0] - x0;
15657         dy = site[1] - y0;
15658         d2 = dx * dx + dy * dy;
15659         if (d2 < dc) dc = d2, cover = cell;
15660       }
15661     }
15662
15663     if (cover) {
15664       var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15665       cover.halfedges.push(
15666         edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15667         edges.push(createBorderEdge(site, v01, v11)) - 1,
15668         edges.push(createBorderEdge(site, v11, v10)) - 1,
15669         edges.push(createBorderEdge(site, v10, v00)) - 1
15670       );
15671     }
15672   }
15673
15674   // Lastly delete any cells with no edges; these were entirely clipped.
15675   for (iCell = 0; iCell < nCells; ++iCell) {
15676     if (cell = cells[iCell]) {
15677       if (!cell.halfedges.length) {
15678         delete cells[iCell];
15679       }
15680     }
15681   }
15682 }
15683
15684 var circlePool = [];
15685
15686 var firstCircle;
15687
15688 function Circle() {
15689   RedBlackNode(this);
15690   this.x =
15691   this.y =
15692   this.arc =
15693   this.site =
15694   this.cy = null;
15695 }
15696
15697 function attachCircle(arc) {
15698   var lArc = arc.P,
15699       rArc = arc.N;
15700
15701   if (!lArc || !rArc) return;
15702
15703   var lSite = lArc.site,
15704       cSite = arc.site,
15705       rSite = rArc.site;
15706
15707   if (lSite === rSite) return;
15708
15709   var bx = cSite[0],
15710       by = cSite[1],
15711       ax = lSite[0] - bx,
15712       ay = lSite[1] - by,
15713       cx = rSite[0] - bx,
15714       cy = rSite[1] - by;
15715
15716   var d = 2 * (ax * cy - ay * cx);
15717   if (d >= -epsilon2$2) return;
15718
15719   var ha = ax * ax + ay * ay,
15720       hc = cx * cx + cy * cy,
15721       x = (cy * ha - ay * hc) / d,
15722       y = (ax * hc - cx * ha) / d;
15723
15724   var circle = circlePool.pop() || new Circle;
15725   circle.arc = arc;
15726   circle.site = cSite;
15727   circle.x = x + bx;
15728   circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15729
15730   arc.circle = circle;
15731
15732   var before = null,
15733       node = circles._;
15734
15735   while (node) {
15736     if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15737       if (node.L) node = node.L;
15738       else { before = node.P; break; }
15739     } else {
15740       if (node.R) node = node.R;
15741       else { before = node; break; }
15742     }
15743   }
15744
15745   circles.insert(before, circle);
15746   if (!before) firstCircle = circle;
15747 }
15748
15749 function detachCircle(arc) {
15750   var circle = arc.circle;
15751   if (circle) {
15752     if (!circle.P) firstCircle = circle.N;
15753     circles.remove(circle);
15754     circlePool.push(circle);
15755     RedBlackNode(circle);
15756     arc.circle = null;
15757   }
15758 }
15759
15760 var beachPool = [];
15761
15762 function Beach() {
15763   RedBlackNode(this);
15764   this.edge =
15765   this.site =
15766   this.circle = null;
15767 }
15768
15769 function createBeach(site) {
15770   var beach = beachPool.pop() || new Beach;
15771   beach.site = site;
15772   return beach;
15773 }
15774
15775 function detachBeach(beach) {
15776   detachCircle(beach);
15777   beaches.remove(beach);
15778   beachPool.push(beach);
15779   RedBlackNode(beach);
15780 }
15781
15782 function removeBeach(beach) {
15783   var circle = beach.circle,
15784       x = circle.x,
15785       y = circle.cy,
15786       vertex = [x, y],
15787       previous = beach.P,
15788       next = beach.N,
15789       disappearing = [beach];
15790
15791   detachBeach(beach);
15792
15793   var lArc = previous;
15794   while (lArc.circle
15795       && Math.abs(x - lArc.circle.x) < epsilon$4
15796       && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15797     previous = lArc.P;
15798     disappearing.unshift(lArc);
15799     detachBeach(lArc);
15800     lArc = previous;
15801   }
15802
15803   disappearing.unshift(lArc);
15804   detachCircle(lArc);
15805
15806   var rArc = next;
15807   while (rArc.circle
15808       && Math.abs(x - rArc.circle.x) < epsilon$4
15809       && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15810     next = rArc.N;
15811     disappearing.push(rArc);
15812     detachBeach(rArc);
15813     rArc = next;
15814   }
15815
15816   disappearing.push(rArc);
15817   detachCircle(rArc);
15818
15819   var nArcs = disappearing.length,
15820       iArc;
15821   for (iArc = 1; iArc < nArcs; ++iArc) {
15822     rArc = disappearing[iArc];
15823     lArc = disappearing[iArc - 1];
15824     setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15825   }
15826
15827   lArc = disappearing[0];
15828   rArc = disappearing[nArcs - 1];
15829   rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15830
15831   attachCircle(lArc);
15832   attachCircle(rArc);
15833 }
15834
15835 function addBeach(site) {
15836   var x = site[0],
15837       directrix = site[1],
15838       lArc,
15839       rArc,
15840       dxl,
15841       dxr,
15842       node = beaches._;
15843
15844   while (node) {
15845     dxl = leftBreakPoint(node, directrix) - x;
15846     if (dxl > epsilon$4) node = node.L; else {
15847       dxr = x - rightBreakPoint(node, directrix);
15848       if (dxr > epsilon$4) {
15849         if (!node.R) {
15850           lArc = node;
15851           break;
15852         }
15853         node = node.R;
15854       } else {
15855         if (dxl > -epsilon$4) {
15856           lArc = node.P;
15857           rArc = node;
15858         } else if (dxr > -epsilon$4) {
15859           lArc = node;
15860           rArc = node.N;
15861         } else {
15862           lArc = rArc = node;
15863         }
15864         break;
15865       }
15866     }
15867   }
15868
15869   createCell(site);
15870   var newArc = createBeach(site);
15871   beaches.insert(lArc, newArc);
15872
15873   if (!lArc && !rArc) return;
15874
15875   if (lArc === rArc) {
15876     detachCircle(lArc);
15877     rArc = createBeach(lArc.site);
15878     beaches.insert(newArc, rArc);
15879     newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
15880     attachCircle(lArc);
15881     attachCircle(rArc);
15882     return;
15883   }
15884
15885   if (!rArc) { // && lArc
15886     newArc.edge = createEdge(lArc.site, newArc.site);
15887     return;
15888   }
15889
15890   // else lArc !== rArc
15891   detachCircle(lArc);
15892   detachCircle(rArc);
15893
15894   var lSite = lArc.site,
15895       ax = lSite[0],
15896       ay = lSite[1],
15897       bx = site[0] - ax,
15898       by = site[1] - ay,
15899       rSite = rArc.site,
15900       cx = rSite[0] - ax,
15901       cy = rSite[1] - ay,
15902       d = 2 * (bx * cy - by * cx),
15903       hb = bx * bx + by * by,
15904       hc = cx * cx + cy * cy,
15905       vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
15906
15907   setEdgeEnd(rArc.edge, lSite, rSite, vertex);
15908   newArc.edge = createEdge(lSite, site, null, vertex);
15909   rArc.edge = createEdge(site, rSite, null, vertex);
15910   attachCircle(lArc);
15911   attachCircle(rArc);
15912 }
15913
15914 function leftBreakPoint(arc, directrix) {
15915   var site = arc.site,
15916       rfocx = site[0],
15917       rfocy = site[1],
15918       pby2 = rfocy - directrix;
15919
15920   if (!pby2) return rfocx;
15921
15922   var lArc = arc.P;
15923   if (!lArc) return -Infinity;
15924
15925   site = lArc.site;
15926   var lfocx = site[0],
15927       lfocy = site[1],
15928       plby2 = lfocy - directrix;
15929
15930   if (!plby2) return lfocx;
15931
15932   var hl = lfocx - rfocx,
15933       aby2 = 1 / pby2 - 1 / plby2,
15934       b = hl / plby2;
15935
15936   if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
15937
15938   return (rfocx + lfocx) / 2;
15939 }
15940
15941 function rightBreakPoint(arc, directrix) {
15942   var rArc = arc.N;
15943   if (rArc) return leftBreakPoint(rArc, directrix);
15944   var site = arc.site;
15945   return site[1] === directrix ? site[0] : Infinity;
15946 }
15947
15948 var epsilon$4 = 1e-6;
15949 var epsilon2$2 = 1e-12;
15950 var beaches;
15951 var cells;
15952 var circles;
15953 var edges;
15954
15955 function triangleArea(a, b, c) {
15956   return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
15957 }
15958
15959 function lexicographic(a, b) {
15960   return b[1] - a[1]
15961       || b[0] - a[0];
15962 }
15963
15964 function Diagram(sites, extent) {
15965   var site = sites.sort(lexicographic).pop(),
15966       x,
15967       y,
15968       circle;
15969
15970   edges = [];
15971   cells = new Array(sites.length);
15972   beaches = new RedBlackTree;
15973   circles = new RedBlackTree;
15974
15975   while (true) {
15976     circle = firstCircle;
15977     if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
15978       if (site[0] !== x || site[1] !== y) {
15979         addBeach(site);
15980         x = site[0], y = site[1];
15981       }
15982       site = sites.pop();
15983     } else if (circle) {
15984       removeBeach(circle.arc);
15985     } else {
15986       break;
15987     }
15988   }
15989
15990   sortCellHalfedges();
15991
15992   if (extent) {
15993     var x0 = +extent[0][0],
15994         y0 = +extent[0][1],
15995         x1 = +extent[1][0],
15996         y1 = +extent[1][1];
15997     clipEdges(x0, y0, x1, y1);
15998     clipCells(x0, y0, x1, y1);
15999   }
16000
16001   this.edges = edges;
16002   this.cells = cells;
16003
16004   beaches =
16005   circles =
16006   edges =
16007   cells = null;
16008 }
16009
16010 Diagram.prototype = {
16011   constructor: Diagram,
16012
16013   polygons: function() {
16014     var edges = this.edges;
16015
16016     return this.cells.map(function(cell) {
16017       var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16018       polygon.data = cell.site.data;
16019       return polygon;
16020     });
16021   },
16022
16023   triangles: function() {
16024     var triangles = [],
16025         edges = this.edges;
16026
16027     this.cells.forEach(function(cell, i) {
16028       if (!(m = (halfedges = cell.halfedges).length)) return;
16029       var site = cell.site,
16030           halfedges,
16031           j = -1,
16032           m,
16033           s0,
16034           e1 = edges[halfedges[m - 1]],
16035           s1 = e1.left === site ? e1.right : e1.left;
16036
16037       while (++j < m) {
16038         s0 = s1;
16039         e1 = edges[halfedges[j]];
16040         s1 = e1.left === site ? e1.right : e1.left;
16041         if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16042           triangles.push([site.data, s0.data, s1.data]);
16043         }
16044       }
16045     });
16046
16047     return triangles;
16048   },
16049
16050   links: function() {
16051     return this.edges.filter(function(edge) {
16052       return edge.right;
16053     }).map(function(edge) {
16054       return {
16055         source: edge.left.data,
16056         target: edge.right.data
16057       };
16058     });
16059   },
16060
16061   find: function(x, y, radius) {
16062     var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16063
16064     // Use the previously-found cell, or start with an arbitrary one.
16065     while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16066     var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16067
16068     // Traverse the half-edges to find a closer cell, if any.
16069     do {
16070       cell = that.cells[i0 = i1], i1 = null;
16071       cell.halfedges.forEach(function(e) {
16072         var edge = that.edges[e], v = edge.left;
16073         if ((v === cell.site || !v) && !(v = edge.right)) return;
16074         var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16075         if (v2 < d2) d2 = v2, i1 = v.index;
16076       });
16077     } while (i1 !== null);
16078
16079     that._found = i0;
16080
16081     return radius == null || d2 <= radius * radius ? cell.site : null;
16082   }
16083 };
16084
16085 var voronoi = function() {
16086   var x = x$4,
16087       y = y$4,
16088       extent = null;
16089
16090   function voronoi(data) {
16091     return new Diagram(data.map(function(d, i) {
16092       var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
16093       s.index = i;
16094       s.data = d;
16095       return s;
16096     }), extent);
16097   }
16098
16099   voronoi.polygons = function(data) {
16100     return voronoi(data).polygons();
16101   };
16102
16103   voronoi.links = function(data) {
16104     return voronoi(data).links();
16105   };
16106
16107   voronoi.triangles = function(data) {
16108     return voronoi(data).triangles();
16109   };
16110
16111   voronoi.x = function(_) {
16112     return arguments.length ? (x = typeof _ === "function" ? _ : constant$11(+_), voronoi) : x;
16113   };
16114
16115   voronoi.y = function(_) {
16116     return arguments.length ? (y = typeof _ === "function" ? _ : constant$11(+_), voronoi) : y;
16117   };
16118
16119   voronoi.extent = function(_) {
16120     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]]];
16121   };
16122
16123   voronoi.size = function(_) {
16124     return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16125   };
16126
16127   return voronoi;
16128 };
16129
16130 var constant$12 = function(x) {
16131   return function() {
16132     return x;
16133   };
16134 };
16135
16136 function ZoomEvent(target, type, transform) {
16137   this.target = target;
16138   this.type = type;
16139   this.transform = transform;
16140 }
16141
16142 function Transform(k, x, y) {
16143   this.k = k;
16144   this.x = x;
16145   this.y = y;
16146 }
16147
16148 Transform.prototype = {
16149   constructor: Transform,
16150   scale: function(k) {
16151     return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16152   },
16153   translate: function(x, y) {
16154     return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16155   },
16156   apply: function(point) {
16157     return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16158   },
16159   applyX: function(x) {
16160     return x * this.k + this.x;
16161   },
16162   applyY: function(y) {
16163     return y * this.k + this.y;
16164   },
16165   invert: function(location) {
16166     return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16167   },
16168   invertX: function(x) {
16169     return (x - this.x) / this.k;
16170   },
16171   invertY: function(y) {
16172     return (y - this.y) / this.k;
16173   },
16174   rescaleX: function(x) {
16175     return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16176   },
16177   rescaleY: function(y) {
16178     return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16179   },
16180   toString: function() {
16181     return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16182   }
16183 };
16184
16185 var identity$7 = new Transform(1, 0, 0);
16186
16187 transform.prototype = Transform.prototype;
16188
16189 function transform(node) {
16190   return node.__zoom || identity$7;
16191 }
16192
16193 function nopropagation$2() {
16194   event.stopImmediatePropagation();
16195 }
16196
16197 var noevent$2 = function() {
16198   event.preventDefault();
16199   event.stopImmediatePropagation();
16200 };
16201
16202 // Ignore right-click, since that should open the context menu.
16203 function defaultFilter$2() {
16204   return !event.button;
16205 }
16206
16207 function defaultExtent$1() {
16208   var e = this, w, h;
16209   if (e instanceof SVGElement) {
16210     e = e.ownerSVGElement || e;
16211     w = e.width.baseVal.value;
16212     h = e.height.baseVal.value;
16213   } else {
16214     w = e.clientWidth;
16215     h = e.clientHeight;
16216   }
16217   return [[0, 0], [w, h]];
16218 }
16219
16220 function defaultTransform() {
16221   return this.__zoom || identity$7;
16222 }
16223
16224 function defaultWheelDelta() {
16225   return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16226 }
16227
16228 function defaultTouchable$1() {
16229   return "ontouchstart" in this;
16230 }
16231
16232 var d3_zoom = function() {
16233   var filter = defaultFilter$2,
16234       extent = defaultExtent$1,
16235       wheelDelta = defaultWheelDelta,
16236       touchable = defaultTouchable$1,
16237       k0 = 0,
16238       k1 = Infinity,
16239       x0 = -k1,
16240       x1 = k1,
16241       y0 = x0,
16242       y1 = x1,
16243       duration = 250,
16244       interpolate = interpolateZoom,
16245       gestures = [],
16246       listeners = dispatch("start", "zoom", "end"),
16247       touchstarting,
16248       touchending,
16249       touchDelay = 500,
16250       wheelDelay = 150,
16251       clickDistance2 = 0;
16252
16253   function zoom(selection$$1) {
16254     selection$$1
16255         .property("__zoom", defaultTransform)
16256         .on("wheel.zoom", wheeled)
16257         .on("mousedown.zoom", mousedowned)
16258         .on("dblclick.zoom", dblclicked)
16259       .filter(touchable)
16260         .on("touchstart.zoom", touchstarted)
16261         .on("touchmove.zoom", touchmoved)
16262         .on("touchend.zoom touchcancel.zoom", touchended)
16263         .style("touch-action", "none")
16264         .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16265   }
16266
16267   zoom.transform = function(collection, transform$$1) {
16268     var selection$$1 = collection.selection ? collection.selection() : collection;
16269     selection$$1.property("__zoom", defaultTransform);
16270     if (collection !== selection$$1) {
16271       schedule(collection, transform$$1);
16272     } else {
16273       selection$$1.interrupt().each(function() {
16274         gesture(this, arguments)
16275             .start()
16276             .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16277             .end();
16278       });
16279     }
16280   };
16281
16282   zoom.scaleBy = function(selection$$1, k) {
16283     zoom.scaleTo(selection$$1, function() {
16284       var k0 = this.__zoom.k,
16285           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16286       return k0 * k1;
16287     });
16288   };
16289
16290   zoom.scaleTo = function(selection$$1, k) {
16291     zoom.transform(selection$$1, function() {
16292       var e = extent.apply(this, arguments),
16293           t0 = this.__zoom,
16294           p0 = centroid(e),
16295           p1 = t0.invert(p0),
16296           k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16297       return constrain(translate(scale(t0, k1), p0, p1), e);
16298     });
16299   };
16300
16301   zoom.translateBy = function(selection$$1, x, y) {
16302     zoom.transform(selection$$1, function() {
16303       return constrain(this.__zoom.translate(
16304         typeof x === "function" ? x.apply(this, arguments) : x,
16305         typeof y === "function" ? y.apply(this, arguments) : y
16306       ), extent.apply(this, arguments));
16307     });
16308   };
16309
16310   zoom.translateTo = function(selection$$1, x, y) {
16311     zoom.transform(selection$$1, function() {
16312       var e = extent.apply(this, arguments),
16313           t = this.__zoom,
16314           p = centroid(e);
16315       return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16316         typeof x === "function" ? -x.apply(this, arguments) : -x,
16317         typeof y === "function" ? -y.apply(this, arguments) : -y
16318       ), e);
16319     });
16320   };
16321
16322   function scale(transform$$1, k) {
16323     k = Math.max(k0, Math.min(k1, k));
16324     return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16325   }
16326
16327   function translate(transform$$1, p0, p1) {
16328     var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16329     return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16330   }
16331
16332   function constrain(transform$$1, extent) {
16333     var dx0 = transform$$1.invertX(extent[0][0]) - x0,
16334         dx1 = transform$$1.invertX(extent[1][0]) - x1,
16335         dy0 = transform$$1.invertY(extent[0][1]) - y0,
16336         dy1 = transform$$1.invertY(extent[1][1]) - y1;
16337     return transform$$1.translate(
16338       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16339       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16340     );
16341   }
16342
16343   function centroid(extent) {
16344     return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16345   }
16346
16347   function schedule(transition$$1, transform$$1, center) {
16348     transition$$1
16349         .on("start.zoom", function() { gesture(this, arguments).start(); })
16350         .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16351         .tween("zoom", function() {
16352           var that = this,
16353               args = arguments,
16354               g = gesture(that, args),
16355               e = extent.apply(that, args),
16356               p = center || centroid(e),
16357               w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16358               a = that.__zoom,
16359               b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16360               i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16361           return function(t) {
16362             if (t === 1) t = b; // Avoid rounding error on end.
16363             else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16364             g.zoom(null, t);
16365           };
16366         });
16367   }
16368
16369   function gesture(that, args) {
16370     for (var i = 0, n = gestures.length, g; i < n; ++i) {
16371       if ((g = gestures[i]).that === that) {
16372         return g;
16373       }
16374     }
16375     return new Gesture(that, args);
16376   }
16377
16378   function Gesture(that, args) {
16379     this.that = that;
16380     this.args = args;
16381     this.index = -1;
16382     this.active = 0;
16383     this.extent = extent.apply(that, args);
16384   }
16385
16386   Gesture.prototype = {
16387     start: function() {
16388       if (++this.active === 1) {
16389         this.index = gestures.push(this) - 1;
16390         this.emit("start");
16391       }
16392       return this;
16393     },
16394     zoom: function(key, transform$$1) {
16395       if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16396       if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16397       if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16398       this.that.__zoom = transform$$1;
16399       this.emit("zoom");
16400       return this;
16401     },
16402     end: function() {
16403       if (--this.active === 0) {
16404         gestures.splice(this.index, 1);
16405         this.index = -1;
16406         this.emit("end");
16407       }
16408       return this;
16409     },
16410     emit: function(type) {
16411       customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16412     }
16413   };
16414
16415   function wheeled() {
16416     if (!filter.apply(this, arguments)) return;
16417     var g = gesture(this, arguments),
16418         t = this.__zoom,
16419         k = Math.max(k0, Math.min(k1, t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16420         p = d3_mouse(this);
16421
16422     // If the mouse is in the same location as before, reuse it.
16423     // If there were recent wheel events, reset the wheel idle timeout.
16424     if (g.wheel) {
16425       if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16426         g.mouse[1] = t.invert(g.mouse[0] = p);
16427       }
16428       clearTimeout(g.wheel);
16429     }
16430
16431     // If this wheel event won’t trigger a transform change, ignore it.
16432     else if (t.k === k) return;
16433
16434     // Otherwise, capture the mouse point and location at the start.
16435     else {
16436       g.mouse = [p, t.invert(p)];
16437       interrupt(this);
16438       g.start();
16439     }
16440
16441     noevent$2();
16442     g.wheel = setTimeout(wheelidled, wheelDelay);
16443     g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent));
16444
16445     function wheelidled() {
16446       g.wheel = null;
16447       g.end();
16448     }
16449   }
16450
16451   function mousedowned() {
16452     if (touchending || !filter.apply(this, arguments)) return;
16453     var g = gesture(this, arguments),
16454         v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16455         p = d3_mouse(this),
16456         x0 = event.clientX,
16457         y0 = event.clientY;
16458
16459     dragDisable(event.view);
16460     nopropagation$2();
16461     g.mouse = [p, this.__zoom.invert(p)];
16462     interrupt(this);
16463     g.start();
16464
16465     function mousemoved() {
16466       noevent$2();
16467       if (!g.moved) {
16468         var dx = event.clientX - x0, dy = event.clientY - y0;
16469         g.moved = dx * dx + dy * dy > clickDistance2;
16470       }
16471       g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent));
16472     }
16473
16474     function mouseupped() {
16475       v.on("mousemove.zoom mouseup.zoom", null);
16476       yesdrag(event.view, g.moved);
16477       noevent$2();
16478       g.end();
16479     }
16480   }
16481
16482   function dblclicked() {
16483     if (!filter.apply(this, arguments)) return;
16484     var t0 = this.__zoom,
16485         p0 = d3_mouse(this),
16486         p1 = t0.invert(p0),
16487         k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16488         t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments));
16489
16490     noevent$2();
16491     if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
16492     else d3_select(this).call(zoom.transform, t1);
16493   }
16494
16495   function touchstarted() {
16496     if (!filter.apply(this, arguments)) return;
16497     var g = gesture(this, arguments),
16498         touches = event.changedTouches,
16499         started,
16500         n = touches.length, i, t, p;
16501
16502     nopropagation$2();
16503     for (i = 0; i < n; ++i) {
16504       t = touches[i], p = touch(this, touches, t.identifier);
16505       p = [p, this.__zoom.invert(p), t.identifier];
16506       if (!g.touch0) g.touch0 = p, started = true;
16507       else if (!g.touch1) g.touch1 = p;
16508     }
16509
16510     // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16511     if (touchstarting) {
16512       touchstarting = clearTimeout(touchstarting);
16513       if (!g.touch1) {
16514         g.end();
16515         p = d3_select(this).on("dblclick.zoom");
16516         if (p) p.apply(this, arguments);
16517         return;
16518       }
16519     }
16520
16521     if (started) {
16522       touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16523       interrupt(this);
16524       g.start();
16525     }
16526   }
16527
16528   function touchmoved() {
16529     var g = gesture(this, arguments),
16530         touches = event.changedTouches,
16531         n = touches.length, i, t, p, l;
16532
16533     noevent$2();
16534     if (touchstarting) touchstarting = clearTimeout(touchstarting);
16535     for (i = 0; i < n; ++i) {
16536       t = touches[i], p = touch(this, touches, t.identifier);
16537       if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16538       else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16539     }
16540     t = g.that.__zoom;
16541     if (g.touch1) {
16542       var p0 = g.touch0[0], l0 = g.touch0[1],
16543           p1 = g.touch1[0], l1 = g.touch1[1],
16544           dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16545           dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16546       t = scale(t, Math.sqrt(dp / dl));
16547       p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16548       l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16549     }
16550     else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16551     else return;
16552     g.zoom("touch", constrain(translate(t, p, l), g.extent));
16553   }
16554
16555   function touchended() {
16556     var g = gesture(this, arguments),
16557         touches = event.changedTouches,
16558         n = touches.length, i, t;
16559
16560     nopropagation$2();
16561     if (touchending) clearTimeout(touchending);
16562     touchending = setTimeout(function() { touchending = null; }, touchDelay);
16563     for (i = 0; i < n; ++i) {
16564       t = touches[i];
16565       if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16566       else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16567     }
16568     if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16569     if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16570     else g.end();
16571   }
16572
16573   zoom.wheelDelta = function(_) {
16574     return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$12(+_), zoom) : wheelDelta;
16575   };
16576
16577   zoom.filter = function(_) {
16578     return arguments.length ? (filter = typeof _ === "function" ? _ : constant$12(!!_), zoom) : filter;
16579   };
16580
16581   zoom.touchable = function(_) {
16582     return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$12(!!_), zoom) : touchable;
16583   };
16584
16585   zoom.extent = function(_) {
16586     return arguments.length ? (extent = typeof _ === "function" ? _ : constant$12([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16587   };
16588
16589   zoom.scaleExtent = function(_) {
16590     return arguments.length ? (k0 = +_[0], k1 = +_[1], zoom) : [k0, k1];
16591   };
16592
16593   zoom.translateExtent = function(_) {
16594     return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], zoom) : [[x0, y0], [x1, y1]];
16595   };
16596
16597   zoom.duration = function(_) {
16598     return arguments.length ? (duration = +_, zoom) : duration;
16599   };
16600
16601   zoom.interpolate = function(_) {
16602     return arguments.length ? (interpolate = _, zoom) : interpolate;
16603   };
16604
16605   zoom.on = function() {
16606     var value = listeners.on.apply(listeners, arguments);
16607     return value === listeners ? zoom : value;
16608   };
16609
16610   zoom.clickDistance = function(_) {
16611     return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16612   };
16613
16614   return zoom;
16615 };
16616
16617
16618
16619 var index = Object.freeze({
16620         version: version,
16621         bisect: bisectRight,
16622         bisectRight: bisectRight,
16623         bisectLeft: bisectLeft,
16624         ascending: d3_ascending,
16625         bisector: d3_bisector,
16626         cross: cross,
16627         descending: d3_descending,
16628         deviation: deviation,
16629         extent: extent,
16630         histogram: histogram,
16631         thresholdFreedmanDiaconis: freedmanDiaconis,
16632         thresholdScott: scott,
16633         thresholdSturges: sturges,
16634         max: max,
16635         mean: mean,
16636         median: d3_median,
16637         merge: merge,
16638         min: min,
16639         pairs: pairs,
16640         permute: permute,
16641         quantile: threshold,
16642         range: d3_range,
16643         scan: scan,
16644         shuffle: shuffle,
16645         sum: sum,
16646         ticks: ticks,
16647         tickIncrement: tickIncrement,
16648         tickStep: tickStep,
16649         transpose: transpose,
16650         variance: variance,
16651         zip: zip,
16652         axisTop: axisTop,
16653         axisRight: axisRight,
16654         axisBottom: axisBottom,
16655         axisLeft: axisLeft,
16656         brush: brush,
16657         brushX: brushX,
16658         brushY: brushY,
16659         brushSelection: brushSelection,
16660         chord: chord,
16661         ribbon: ribbon,
16662         nest: nest,
16663         set: set$2,
16664         map: map$1,
16665         keys: keys,
16666         values: values,
16667         entries: entries,
16668         color: color,
16669         rgb: rgb,
16670         hsl: hsl,
16671         lab: lab,
16672         hcl: hcl,
16673         cubehelix: cubehelix,
16674         dispatch: dispatch,
16675         drag: drag,
16676         dragDisable: dragDisable,
16677         dragEnable: yesdrag,
16678         dsvFormat: dsv,
16679         csvParse: csvParse,
16680         csvParseRows: csvParseRows,
16681         csvFormat: csvFormat,
16682         csvFormatRows: csvFormatRows,
16683         tsvParse: tsvParse,
16684         tsvParseRows: tsvParseRows,
16685         tsvFormat: tsvFormat,
16686         tsvFormatRows: tsvFormatRows,
16687         easeLinear: linear$1,
16688         easeQuad: quadInOut,
16689         easeQuadIn: quadIn,
16690         easeQuadOut: quadOut,
16691         easeQuadInOut: quadInOut,
16692         easeCubic: cubicInOut,
16693         easeCubicIn: cubicIn,
16694         easeCubicOut: cubicOut,
16695         easeCubicInOut: cubicInOut,
16696         easePoly: polyInOut,
16697         easePolyIn: polyIn,
16698         easePolyOut: polyOut,
16699         easePolyInOut: polyInOut,
16700         easeSin: sinInOut,
16701         easeSinIn: sinIn,
16702         easeSinOut: sinOut,
16703         easeSinInOut: sinInOut,
16704         easeExp: expInOut,
16705         easeExpIn: expIn,
16706         easeExpOut: expOut,
16707         easeExpInOut: expInOut,
16708         easeCircle: circleInOut,
16709         easeCircleIn: circleIn,
16710         easeCircleOut: circleOut,
16711         easeCircleInOut: circleInOut,
16712         easeBounce: bounceOut,
16713         easeBounceIn: bounceIn,
16714         easeBounceOut: bounceOut,
16715         easeBounceInOut: bounceInOut,
16716         easeBack: backInOut,
16717         easeBackIn: backIn,
16718         easeBackOut: backOut,
16719         easeBackInOut: backInOut,
16720         easeElastic: elasticOut,
16721         easeElasticIn: elasticIn,
16722         easeElasticOut: elasticOut,
16723         easeElasticInOut: elasticInOut,
16724         forceCenter: center$1,
16725         forceCollide: collide,
16726         forceLink: link,
16727         forceManyBody: manyBody,
16728         forceRadial: radial,
16729         forceSimulation: simulation,
16730         forceX: x$2,
16731         forceY: y$2,
16732         formatDefaultLocale: defaultLocale,
16733         get format () { return format; },
16734         get formatPrefix () { return formatPrefix; },
16735         formatLocale: formatLocale,
16736         formatSpecifier: formatSpecifier,
16737         precisionFixed: precisionFixed,
16738         precisionPrefix: precisionPrefix,
16739         precisionRound: precisionRound,
16740         geoArea: d3_geoArea,
16741         geoBounds: d3_geoBounds,
16742         geoCentroid: d3_geoCentroid,
16743         geoCircle: circle,
16744         geoClipAntimeridian: clipAntimeridian,
16745         geoClipCircle: clipCircle,
16746         geoClipExtent: extent$1,
16747         geoClipRectangle: clipRectangle,
16748         geoContains: contains,
16749         geoDistance: distance,
16750         geoGraticule: graticule,
16751         geoGraticule10: graticule10,
16752         geoInterpolate: interpolate$1,
16753         geoLength: d3_geoLength,
16754         geoPath: d3_geoPath,
16755         geoAlbers: albers,
16756         geoAlbersUsa: albersUsa,
16757         geoAzimuthalEqualArea: azimuthalEqualArea,
16758         geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16759         geoAzimuthalEquidistant: azimuthalEquidistant,
16760         geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16761         geoConicConformal: conicConformal,
16762         geoConicConformalRaw: conicConformalRaw,
16763         geoConicEqualArea: conicEqualArea,
16764         geoConicEqualAreaRaw: conicEqualAreaRaw,
16765         geoConicEquidistant: conicEquidistant,
16766         geoConicEquidistantRaw: conicEquidistantRaw,
16767         geoEquirectangular: equirectangular,
16768         geoEquirectangularRaw: equirectangularRaw,
16769         geoGnomonic: gnomonic,
16770         geoGnomonicRaw: gnomonicRaw,
16771         geoIdentity: d3_geoIdentity,
16772         geoProjection: projection,
16773         geoProjectionMutator: projectionMutator,
16774         geoMercator: mercator,
16775         geoMercatorRaw: mercatorRaw,
16776         geoNaturalEarth1: naturalEarth1,
16777         geoNaturalEarth1Raw: naturalEarth1Raw,
16778         geoOrthographic: orthographic,
16779         geoOrthographicRaw: orthographicRaw,
16780         geoStereographic: stereographic,
16781         geoStereographicRaw: stereographicRaw,
16782         geoTransverseMercator: transverseMercator,
16783         geoTransverseMercatorRaw: transverseMercatorRaw,
16784         geoRotation: rotation,
16785         geoStream: d3_geoStream,
16786         geoTransform: d3_geoTransform,
16787         cluster: cluster,
16788         hierarchy: hierarchy,
16789         pack: index$2,
16790         packSiblings: siblings,
16791         packEnclose: enclose,
16792         partition: partition,
16793         stratify: stratify,
16794         tree: tree,
16795         treemap: index$3,
16796         treemapBinary: binary,
16797         treemapDice: treemapDice,
16798         treemapSlice: treemapSlice,
16799         treemapSliceDice: sliceDice,
16800         treemapSquarify: squarify,
16801         treemapResquarify: resquarify,
16802         interpolate: d3_interpolate,
16803         interpolateArray: array$1,
16804         interpolateBasis: basis$1,
16805         interpolateBasisClosed: basisClosed,
16806         interpolateDate: date,
16807         interpolateNumber: d3_interpolateNumber,
16808         interpolateObject: object,
16809         interpolateRound: interpolateRound,
16810         interpolateString: interpolateString,
16811         interpolateTransformCss: interpolateTransformCss,
16812         interpolateTransformSvg: interpolateTransformSvg,
16813         interpolateZoom: interpolateZoom,
16814         interpolateRgb: d3_interpolateRgb,
16815         interpolateRgbBasis: rgbBasis,
16816         interpolateRgbBasisClosed: rgbBasisClosed,
16817         interpolateHsl: hsl$2,
16818         interpolateHslLong: hslLong,
16819         interpolateLab: lab$1,
16820         interpolateHcl: hcl$2,
16821         interpolateHclLong: hclLong,
16822         interpolateCubehelix: cubehelix$2,
16823         interpolateCubehelixLong: cubehelixLong,
16824         quantize: d3_quantize,
16825         path: path,
16826         polygonArea: d3_polygonArea,
16827         polygonCentroid: d3_polygonCentroid,
16828         polygonHull: d3_polygonHull,
16829         polygonContains: contains$1,
16830         polygonLength: length$1,
16831         quadtree: quadtree,
16832         queue: queue,
16833         randomUniform: uniform,
16834         randomNormal: normal,
16835         randomLogNormal: logNormal,
16836         randomBates: bates,
16837         randomIrwinHall: irwinHall,
16838         randomExponential: exponential$1,
16839         request: d3_request,
16840         html: html,
16841         json: d3_json,
16842         text: d3_text,
16843         xml: d3_xml,
16844         csv: csv$1,
16845         tsv: tsv$1,
16846         scaleBand: band,
16847         scalePoint: point$1,
16848         scaleIdentity: identity$5,
16849         scaleLinear: linear$2,
16850         scaleLog: log$1,
16851         scaleOrdinal: ordinal,
16852         scaleImplicit: implicit,
16853         scalePow: pow$1,
16854         scaleSqrt: sqrt$1,
16855         scaleQuantile: quantile,
16856         scaleQuantize: quantize,
16857         scaleThreshold: threshold$1,
16858         scaleTime: time,
16859         scaleUtc: utcTime,
16860         schemeCategory10: category10,
16861         schemeCategory20b: category20b,
16862         schemeCategory20c: category20c,
16863         schemeCategory20: category20,
16864         interpolateCubehelixDefault: cubehelix$3,
16865         interpolateRainbow: rainbow$1,
16866         interpolateWarm: warm,
16867         interpolateCool: cool,
16868         interpolateViridis: viridis,
16869         interpolateMagma: magma,
16870         interpolateInferno: inferno,
16871         interpolatePlasma: plasma,
16872         scaleSequential: sequential,
16873         creator: creator,
16874         local: local$1,
16875         matcher: matcher$1,
16876         mouse: d3_mouse,
16877         namespace: namespace,
16878         namespaces: namespaces,
16879         select: d3_select,
16880         selectAll: d3_selectAll,
16881         selection: selection,
16882         selector: selector,
16883         selectorAll: selectorAll,
16884         style: styleValue,
16885         touch: touch,
16886         touches: d3_touches,
16887         window: defaultView,
16888         get event () { return event; },
16889         customEvent: customEvent,
16890         arc: arc,
16891         area: area,
16892         line: line,
16893         pie: pie,
16894         areaRadial: areaRadial,
16895         radialArea: areaRadial,
16896         lineRadial: lineRadial$1,
16897         radialLine: lineRadial$1,
16898         pointRadial: pointRadial,
16899         linkHorizontal: linkHorizontal,
16900         linkVertical: linkVertical,
16901         linkRadial: linkRadial,
16902         symbol: symbol,
16903         symbols: symbols,
16904         symbolCircle: circle$2,
16905         symbolCross: cross$2,
16906         symbolDiamond: diamond,
16907         symbolSquare: square,
16908         symbolStar: star,
16909         symbolTriangle: triangle,
16910         symbolWye: wye,
16911         curveBasisClosed: basisClosed$1,
16912         curveBasisOpen: basisOpen,
16913         curveBasis: basis$2,
16914         curveBundle: bundle,
16915         curveCardinalClosed: cardinalClosed,
16916         curveCardinalOpen: cardinalOpen,
16917         curveCardinal: cardinal,
16918         curveCatmullRomClosed: catmullRomClosed,
16919         curveCatmullRomOpen: catmullRomOpen,
16920         curveCatmullRom: catmullRom,
16921         curveLinearClosed: linearClosed,
16922         curveLinear: curveLinear,
16923         curveMonotoneX: monotoneX,
16924         curveMonotoneY: monotoneY,
16925         curveNatural: natural,
16926         curveStep: step,
16927         curveStepAfter: stepAfter,
16928         curveStepBefore: stepBefore,
16929         stack: stack,
16930         stackOffsetExpand: expand,
16931         stackOffsetDiverging: diverging,
16932         stackOffsetNone: none$1,
16933         stackOffsetSilhouette: silhouette,
16934         stackOffsetWiggle: wiggle,
16935         stackOrderAscending: ascending$1,
16936         stackOrderDescending: descending$1,
16937         stackOrderInsideOut: insideOut,
16938         stackOrderNone: none$2,
16939         stackOrderReverse: reverse,
16940         timeInterval: newInterval,
16941         timeMillisecond: millisecond,
16942         timeMilliseconds: milliseconds,
16943         utcMillisecond: millisecond,
16944         utcMilliseconds: milliseconds,
16945         timeSecond: second,
16946         timeSeconds: seconds,
16947         utcSecond: second,
16948         utcSeconds: seconds,
16949         timeMinute: minute,
16950         timeMinutes: minutes,
16951         timeHour: hour,
16952         timeHours: hours,
16953         timeDay: day,
16954         timeDays: days,
16955         timeWeek: sunday,
16956         timeWeeks: sundays,
16957         timeSunday: sunday,
16958         timeSundays: sundays,
16959         timeMonday: monday,
16960         timeMondays: mondays,
16961         timeTuesday: tuesday,
16962         timeTuesdays: tuesdays,
16963         timeWednesday: wednesday,
16964         timeWednesdays: wednesdays,
16965         timeThursday: thursday,
16966         timeThursdays: thursdays,
16967         timeFriday: friday,
16968         timeFridays: fridays,
16969         timeSaturday: saturday,
16970         timeSaturdays: saturdays,
16971         timeMonth: month,
16972         timeMonths: months,
16973         timeYear: year,
16974         timeYears: years,
16975         utcMinute: utcMinute,
16976         utcMinutes: utcMinutes,
16977         utcHour: utcHour,
16978         utcHours: utcHours,
16979         utcDay: utcDay,
16980         utcDays: utcDays,
16981         utcWeek: utcSunday,
16982         utcWeeks: utcSundays,
16983         utcSunday: utcSunday,
16984         utcSundays: utcSundays,
16985         utcMonday: utcMonday,
16986         utcMondays: utcMondays,
16987         utcTuesday: utcTuesday,
16988         utcTuesdays: utcTuesdays,
16989         utcWednesday: utcWednesday,
16990         utcWednesdays: utcWednesdays,
16991         utcThursday: utcThursday,
16992         utcThursdays: utcThursdays,
16993         utcFriday: utcFriday,
16994         utcFridays: utcFridays,
16995         utcSaturday: utcSaturday,
16996         utcSaturdays: utcSaturdays,
16997         utcMonth: utcMonth,
16998         utcMonths: utcMonths,
16999         utcYear: utcYear,
17000         utcYears: utcYears,
17001         timeFormatDefaultLocale: defaultLocale$1,
17002         get timeFormat () { return timeFormat; },
17003         get timeParse () { return timeParse; },
17004         get utcFormat () { return utcFormat; },
17005         get utcParse () { return utcParse; },
17006         timeFormatLocale: formatLocale$1,
17007         isoFormat: formatIso,
17008         isoParse: parseIso,
17009         now: now,
17010         timer: timer,
17011         timerFlush: timerFlush,
17012         timeout: d3_timeout,
17013         interval: interval$1,
17014         transition: transition,
17015         active: active,
17016         interrupt: interrupt,
17017         voronoi: voronoi,
17018         zoom: d3_zoom,
17019         zoomTransform: transform,
17020         zoomIdentity: identity$7
17021 });
17022
17023 function actionAddEntity(way) {
17024     return function(graph) {
17025         return graph.replace(way);
17026     };
17027 }
17028
17029 /**
17030  * Creates an array with all falsey values removed. The values `false`, `null`,
17031  * `0`, `""`, `undefined`, and `NaN` are falsey.
17032  *
17033  * @static
17034  * @memberOf _
17035  * @since 0.1.0
17036  * @category Array
17037  * @param {Array} array The array to compact.
17038  * @returns {Array} Returns the new array of filtered values.
17039  * @example
17040  *
17041  * _.compact([0, 1, false, 2, '', 3]);
17042  * // => [1, 2, 3]
17043  */
17044 function compact(array) {
17045   var index = -1,
17046       length = array == null ? 0 : array.length,
17047       resIndex = 0,
17048       result = [];
17049
17050   while (++index < length) {
17051     var value = array[index];
17052     if (value) {
17053       result[resIndex++] = value;
17054     }
17055   }
17056   return result;
17057 }
17058
17059 /** Detect free variable `global` from Node.js. */
17060 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17061
17062 /** Detect free variable `self`. */
17063 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17064
17065 /** Used as a reference to the global object. */
17066 var root$2 = freeGlobal || freeSelf || Function('return this')();
17067
17068 /** Built-in value references. */
17069 var Symbol = root$2.Symbol;
17070
17071 /** Used for built-in method references. */
17072 var objectProto$2 = Object.prototype;
17073
17074 /** Used to check objects for own properties. */
17075 var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
17076
17077 /**
17078  * Used to resolve the
17079  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17080  * of values.
17081  */
17082 var nativeObjectToString = objectProto$2.toString;
17083
17084 /** Built-in value references. */
17085 var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17086
17087 /**
17088  * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17089  *
17090  * @private
17091  * @param {*} value The value to query.
17092  * @returns {string} Returns the raw `toStringTag`.
17093  */
17094 function getRawTag(value) {
17095   var isOwn = hasOwnProperty$2.call(value, symToStringTag$1),
17096       tag = value[symToStringTag$1];
17097
17098   try {
17099     value[symToStringTag$1] = undefined;
17100     var unmasked = true;
17101   } catch (e) {}
17102
17103   var result = nativeObjectToString.call(value);
17104   if (unmasked) {
17105     if (isOwn) {
17106       value[symToStringTag$1] = tag;
17107     } else {
17108       delete value[symToStringTag$1];
17109     }
17110   }
17111   return result;
17112 }
17113
17114 /** Used for built-in method references. */
17115 var objectProto$3 = Object.prototype;
17116
17117 /**
17118  * Used to resolve the
17119  * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17120  * of values.
17121  */
17122 var nativeObjectToString$1 = objectProto$3.toString;
17123
17124 /**
17125  * Converts `value` to a string using `Object.prototype.toString`.
17126  *
17127  * @private
17128  * @param {*} value The value to convert.
17129  * @returns {string} Returns the converted string.
17130  */
17131 function objectToString(value) {
17132   return nativeObjectToString$1.call(value);
17133 }
17134
17135 /** `Object#toString` result references. */
17136 var nullTag = '[object Null]';
17137 var undefinedTag = '[object Undefined]';
17138
17139 /** Built-in value references. */
17140 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17141
17142 /**
17143  * The base implementation of `getTag` without fallbacks for buggy environments.
17144  *
17145  * @private
17146  * @param {*} value The value to query.
17147  * @returns {string} Returns the `toStringTag`.
17148  */
17149 function baseGetTag(value) {
17150   if (value == null) {
17151     return value === undefined ? undefinedTag : nullTag;
17152   }
17153   return (symToStringTag && symToStringTag in Object(value))
17154     ? getRawTag(value)
17155     : objectToString(value);
17156 }
17157
17158 /**
17159  * Checks if `value` is the
17160  * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17161  * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17162  *
17163  * @static
17164  * @memberOf _
17165  * @since 0.1.0
17166  * @category Lang
17167  * @param {*} value The value to check.
17168  * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17169  * @example
17170  *
17171  * _.isObject({});
17172  * // => true
17173  *
17174  * _.isObject([1, 2, 3]);
17175  * // => true
17176  *
17177  * _.isObject(_.noop);
17178  * // => true
17179  *
17180  * _.isObject(null);
17181  * // => false
17182  */
17183 function isObject(value) {
17184   var type = typeof value;
17185   return value != null && (type == 'object' || type == 'function');
17186 }
17187
17188 /** `Object#toString` result references. */
17189 var asyncTag = '[object AsyncFunction]';
17190 var funcTag = '[object Function]';
17191 var genTag = '[object GeneratorFunction]';
17192 var proxyTag = '[object Proxy]';
17193
17194 /**
17195  * Checks if `value` is classified as a `Function` object.
17196  *
17197  * @static
17198  * @memberOf _
17199  * @since 0.1.0
17200  * @category Lang
17201  * @param {*} value The value to check.
17202  * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17203  * @example
17204  *
17205  * _.isFunction(_);
17206  * // => true
17207  *
17208  * _.isFunction(/abc/);
17209  * // => false
17210  */
17211 function isFunction(value) {
17212   if (!isObject(value)) {
17213     return false;
17214   }
17215   // The use of `Object#toString` avoids issues with the `typeof` operator
17216   // in Safari 9 which returns 'object' for typed arrays and other constructors.
17217   var tag = baseGetTag(value);
17218   return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17219 }
17220
17221 /** Used to detect overreaching core-js shims. */
17222 var coreJsData = root$2['__core-js_shared__'];
17223
17224 /** Used to detect methods masquerading as native. */
17225 var maskSrcKey = (function() {
17226   var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17227   return uid ? ('Symbol(src)_1.' + uid) : '';
17228 }());
17229
17230 /**
17231  * Checks if `func` has its source masked.
17232  *
17233  * @private
17234  * @param {Function} func The function to check.
17235  * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17236  */
17237 function isMasked(func) {
17238   return !!maskSrcKey && (maskSrcKey in func);
17239 }
17240
17241 /** Used for built-in method references. */
17242 var funcProto$1 = Function.prototype;
17243
17244 /** Used to resolve the decompiled source of functions. */
17245 var funcToString$1 = funcProto$1.toString;
17246
17247 /**
17248  * Converts `func` to its source code.
17249  *
17250  * @private
17251  * @param {Function} func The function to convert.
17252  * @returns {string} Returns the source code.
17253  */
17254 function toSource(func) {
17255   if (func != null) {
17256     try {
17257       return funcToString$1.call(func);
17258     } catch (e) {}
17259     try {
17260       return (func + '');
17261     } catch (e) {}
17262   }
17263   return '';
17264 }
17265
17266 /**
17267  * Used to match `RegExp`
17268  * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17269  */
17270 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17271
17272 /** Used to detect host constructors (Safari). */
17273 var reIsHostCtor = /^\[object .+?Constructor\]$/;
17274
17275 /** Used for built-in method references. */
17276 var funcProto = Function.prototype;
17277 var objectProto$1 = Object.prototype;
17278
17279 /** Used to resolve the decompiled source of functions. */
17280 var funcToString = funcProto.toString;
17281
17282 /** Used to check objects for own properties. */
17283 var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
17284
17285 /** Used to detect if a method is native. */
17286 var reIsNative = RegExp('^' +
17287   funcToString.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17288   .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17289 );
17290
17291 /**
17292  * The base implementation of `_.isNative` without bad shim checks.
17293  *
17294  * @private
17295  * @param {*} value The value to check.
17296  * @returns {boolean} Returns `true` if `value` is a native function,
17297  *  else `false`.
17298  */
17299 function baseIsNative(value) {
17300   if (!isObject(value) || isMasked(value)) {
17301     return false;
17302   }
17303   var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17304   return pattern.test(toSource(value));
17305 }
17306
17307 /**
17308  * Gets the value at `key` of `object`.
17309  *
17310  * @private
17311  * @param {Object} [object] The object to query.
17312  * @param {string} key The key of the property to get.
17313  * @returns {*} Returns the property value.
17314  */
17315 function getValue(object, key) {
17316   return object == null ? undefined : object[key];
17317 }
17318
17319 /**
17320  * Gets the native function at `key` of `object`.
17321  *
17322  * @private
17323  * @param {Object} object The object to query.
17324  * @param {string} key The key of the method to get.
17325  * @returns {*} Returns the function if it's native, else `undefined`.
17326  */
17327 function getNative(object, key) {
17328   var value = getValue(object, key);
17329   return baseIsNative(value) ? value : undefined;
17330 }
17331
17332 var defineProperty = (function() {
17333   try {
17334     var func = getNative(Object, 'defineProperty');
17335     func({}, '', {});
17336     return func;
17337   } catch (e) {}
17338 }());
17339
17340 /**
17341  * The base implementation of `assignValue` and `assignMergeValue` without
17342  * value checks.
17343  *
17344  * @private
17345  * @param {Object} object The object to modify.
17346  * @param {string} key The key of the property to assign.
17347  * @param {*} value The value to assign.
17348  */
17349 function baseAssignValue(object, key, value) {
17350   if (key == '__proto__' && defineProperty) {
17351     defineProperty(object, key, {
17352       'configurable': true,
17353       'enumerable': true,
17354       'value': value,
17355       'writable': true
17356     });
17357   } else {
17358     object[key] = value;
17359   }
17360 }
17361
17362 /**
17363  * Performs a
17364  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17365  * comparison between two values to determine if they are equivalent.
17366  *
17367  * @static
17368  * @memberOf _
17369  * @since 4.0.0
17370  * @category Lang
17371  * @param {*} value The value to compare.
17372  * @param {*} other The other value to compare.
17373  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17374  * @example
17375  *
17376  * var object = { 'a': 1 };
17377  * var other = { 'a': 1 };
17378  *
17379  * _.eq(object, object);
17380  * // => true
17381  *
17382  * _.eq(object, other);
17383  * // => false
17384  *
17385  * _.eq('a', 'a');
17386  * // => true
17387  *
17388  * _.eq('a', Object('a'));
17389  * // => false
17390  *
17391  * _.eq(NaN, NaN);
17392  * // => true
17393  */
17394 function eq(value, other) {
17395   return value === other || (value !== value && other !== other);
17396 }
17397
17398 /** Used for built-in method references. */
17399 var objectProto = Object.prototype;
17400
17401 /** Used to check objects for own properties. */
17402 var hasOwnProperty = objectProto.hasOwnProperty;
17403
17404 /**
17405  * Assigns `value` to `key` of `object` if the existing value is not equivalent
17406  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17407  * for equality comparisons.
17408  *
17409  * @private
17410  * @param {Object} object The object to modify.
17411  * @param {string} key The key of the property to assign.
17412  * @param {*} value The value to assign.
17413  */
17414 function assignValue(object, key, value) {
17415   var objValue = object[key];
17416   if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
17417       (value === undefined && !(key in object))) {
17418     baseAssignValue(object, key, value);
17419   }
17420 }
17421
17422 /**
17423  * Copies properties of `source` to `object`.
17424  *
17425  * @private
17426  * @param {Object} source The object to copy properties from.
17427  * @param {Array} props The property identifiers to copy.
17428  * @param {Object} [object={}] The object to copy properties to.
17429  * @param {Function} [customizer] The function to customize copied values.
17430  * @returns {Object} Returns `object`.
17431  */
17432 function copyObject(source, props, object, customizer) {
17433   var isNew = !object;
17434   object || (object = {});
17435
17436   var index = -1,
17437       length = props.length;
17438
17439   while (++index < length) {
17440     var key = props[index];
17441
17442     var newValue = customizer
17443       ? customizer(object[key], source[key], key, object, source)
17444       : undefined;
17445
17446     if (newValue === undefined) {
17447       newValue = source[key];
17448     }
17449     if (isNew) {
17450       baseAssignValue(object, key, newValue);
17451     } else {
17452       assignValue(object, key, newValue);
17453     }
17454   }
17455   return object;
17456 }
17457
17458 /**
17459  * This method returns the first argument it receives.
17460  *
17461  * @static
17462  * @since 0.1.0
17463  * @memberOf _
17464  * @category Util
17465  * @param {*} value Any value.
17466  * @returns {*} Returns `value`.
17467  * @example
17468  *
17469  * var object = { 'a': 1 };
17470  *
17471  * console.log(_.identity(object) === object);
17472  * // => true
17473  */
17474 function identity$8(value) {
17475   return value;
17476 }
17477
17478 /**
17479  * A faster alternative to `Function#apply`, this function invokes `func`
17480  * with the `this` binding of `thisArg` and the arguments of `args`.
17481  *
17482  * @private
17483  * @param {Function} func The function to invoke.
17484  * @param {*} thisArg The `this` binding of `func`.
17485  * @param {Array} args The arguments to invoke `func` with.
17486  * @returns {*} Returns the result of `func`.
17487  */
17488 function apply(func, thisArg, args) {
17489   switch (args.length) {
17490     case 0: return func.call(thisArg);
17491     case 1: return func.call(thisArg, args[0]);
17492     case 2: return func.call(thisArg, args[0], args[1]);
17493     case 3: return func.call(thisArg, args[0], args[1], args[2]);
17494   }
17495   return func.apply(thisArg, args);
17496 }
17497
17498 /* Built-in method references for those with the same name as other `lodash` methods. */
17499 var nativeMax = Math.max;
17500
17501 /**
17502  * A specialized version of `baseRest` which transforms the rest array.
17503  *
17504  * @private
17505  * @param {Function} func The function to apply a rest parameter to.
17506  * @param {number} [start=func.length-1] The start position of the rest parameter.
17507  * @param {Function} transform The rest array transform.
17508  * @returns {Function} Returns the new function.
17509  */
17510 function overRest(func, start, transform) {
17511   start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
17512   return function() {
17513     var args = arguments,
17514         index = -1,
17515         length = nativeMax(args.length - start, 0),
17516         array = Array(length);
17517
17518     while (++index < length) {
17519       array[index] = args[start + index];
17520     }
17521     index = -1;
17522     var otherArgs = Array(start + 1);
17523     while (++index < start) {
17524       otherArgs[index] = args[index];
17525     }
17526     otherArgs[start] = transform(array);
17527     return apply(func, this, otherArgs);
17528   };
17529 }
17530
17531 /**
17532  * Creates a function that returns `value`.
17533  *
17534  * @static
17535  * @memberOf _
17536  * @since 2.4.0
17537  * @category Util
17538  * @param {*} value The value to return from the new function.
17539  * @returns {Function} Returns the new constant function.
17540  * @example
17541  *
17542  * var objects = _.times(2, _.constant({ 'a': 1 }));
17543  *
17544  * console.log(objects);
17545  * // => [{ 'a': 1 }, { 'a': 1 }]
17546  *
17547  * console.log(objects[0] === objects[1]);
17548  * // => true
17549  */
17550 function constant$13(value) {
17551   return function() {
17552     return value;
17553   };
17554 }
17555
17556 /**
17557  * The base implementation of `setToString` without support for hot loop shorting.
17558  *
17559  * @private
17560  * @param {Function} func The function to modify.
17561  * @param {Function} string The `toString` result.
17562  * @returns {Function} Returns `func`.
17563  */
17564 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
17565   return defineProperty(func, 'toString', {
17566     'configurable': true,
17567     'enumerable': false,
17568     'value': constant$13(string),
17569     'writable': true
17570   });
17571 };
17572
17573 /** Used to detect hot functions by number of calls within a span of milliseconds. */
17574 var HOT_COUNT = 800;
17575 var HOT_SPAN = 16;
17576
17577 /* Built-in method references for those with the same name as other `lodash` methods. */
17578 var nativeNow = Date.now;
17579
17580 /**
17581  * Creates a function that'll short out and invoke `identity` instead
17582  * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
17583  * milliseconds.
17584  *
17585  * @private
17586  * @param {Function} func The function to restrict.
17587  * @returns {Function} Returns the new shortable function.
17588  */
17589 function shortOut(func) {
17590   var count = 0,
17591       lastCalled = 0;
17592
17593   return function() {
17594     var stamp = nativeNow(),
17595         remaining = HOT_SPAN - (stamp - lastCalled);
17596
17597     lastCalled = stamp;
17598     if (remaining > 0) {
17599       if (++count >= HOT_COUNT) {
17600         return arguments[0];
17601       }
17602     } else {
17603       count = 0;
17604     }
17605     return func.apply(undefined, arguments);
17606   };
17607 }
17608
17609 /**
17610  * Sets the `toString` method of `func` to return `string`.
17611  *
17612  * @private
17613  * @param {Function} func The function to modify.
17614  * @param {Function} string The `toString` result.
17615  * @returns {Function} Returns `func`.
17616  */
17617 var setToString = shortOut(baseSetToString);
17618
17619 /**
17620  * The base implementation of `_.rest` which doesn't validate or coerce arguments.
17621  *
17622  * @private
17623  * @param {Function} func The function to apply a rest parameter to.
17624  * @param {number} [start=func.length-1] The start position of the rest parameter.
17625  * @returns {Function} Returns the new function.
17626  */
17627 function baseRest(func, start) {
17628   return setToString(overRest(func, start, identity$8), func + '');
17629 }
17630
17631 /** Used as references for various `Number` constants. */
17632 var MAX_SAFE_INTEGER = 9007199254740991;
17633
17634 /**
17635  * Checks if `value` is a valid array-like length.
17636  *
17637  * **Note:** This method is loosely based on
17638  * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
17639  *
17640  * @static
17641  * @memberOf _
17642  * @since 4.0.0
17643  * @category Lang
17644  * @param {*} value The value to check.
17645  * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
17646  * @example
17647  *
17648  * _.isLength(3);
17649  * // => true
17650  *
17651  * _.isLength(Number.MIN_VALUE);
17652  * // => false
17653  *
17654  * _.isLength(Infinity);
17655  * // => false
17656  *
17657  * _.isLength('3');
17658  * // => false
17659  */
17660 function isLength(value) {
17661   return typeof value == 'number' &&
17662     value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
17663 }
17664
17665 /**
17666  * Checks if `value` is array-like. A value is considered array-like if it's
17667  * not a function and has a `value.length` that's an integer greater than or
17668  * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
17669  *
17670  * @static
17671  * @memberOf _
17672  * @since 4.0.0
17673  * @category Lang
17674  * @param {*} value The value to check.
17675  * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
17676  * @example
17677  *
17678  * _.isArrayLike([1, 2, 3]);
17679  * // => true
17680  *
17681  * _.isArrayLike(document.body.children);
17682  * // => true
17683  *
17684  * _.isArrayLike('abc');
17685  * // => true
17686  *
17687  * _.isArrayLike(_.noop);
17688  * // => false
17689  */
17690 function isArrayLike(value) {
17691   return value != null && isLength(value.length) && !isFunction(value);
17692 }
17693
17694 /** Used as references for various `Number` constants. */
17695 var MAX_SAFE_INTEGER$1 = 9007199254740991;
17696
17697 /** Used to detect unsigned integer values. */
17698 var reIsUint = /^(?:0|[1-9]\d*)$/;
17699
17700 /**
17701  * Checks if `value` is a valid array-like index.
17702  *
17703  * @private
17704  * @param {*} value The value to check.
17705  * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
17706  * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
17707  */
17708 function isIndex(value, length) {
17709   length = length == null ? MAX_SAFE_INTEGER$1 : length;
17710   return !!length &&
17711     (typeof value == 'number' || reIsUint.test(value)) &&
17712     (value > -1 && value % 1 == 0 && value < length);
17713 }
17714
17715 /**
17716  * Checks if the given arguments are from an iteratee call.
17717  *
17718  * @private
17719  * @param {*} value The potential iteratee value argument.
17720  * @param {*} index The potential iteratee index or key argument.
17721  * @param {*} object The potential iteratee object argument.
17722  * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
17723  *  else `false`.
17724  */
17725 function isIterateeCall(value, index, object) {
17726   if (!isObject(object)) {
17727     return false;
17728   }
17729   var type = typeof index;
17730   if (type == 'number'
17731         ? (isArrayLike(object) && isIndex(index, object.length))
17732         : (type == 'string' && index in object)
17733       ) {
17734     return eq(object[index], value);
17735   }
17736   return false;
17737 }
17738
17739 /**
17740  * Creates a function like `_.assign`.
17741  *
17742  * @private
17743  * @param {Function} assigner The function to assign values.
17744  * @returns {Function} Returns the new assigner function.
17745  */
17746 function createAssigner(assigner) {
17747   return baseRest(function(object, sources) {
17748     var index = -1,
17749         length = sources.length,
17750         customizer = length > 1 ? sources[length - 1] : undefined,
17751         guard = length > 2 ? sources[2] : undefined;
17752
17753     customizer = (assigner.length > 3 && typeof customizer == 'function')
17754       ? (length--, customizer)
17755       : undefined;
17756
17757     if (guard && isIterateeCall(sources[0], sources[1], guard)) {
17758       customizer = length < 3 ? undefined : customizer;
17759       length = 1;
17760     }
17761     object = Object(object);
17762     while (++index < length) {
17763       var source = sources[index];
17764       if (source) {
17765         assigner(object, source, index, customizer);
17766       }
17767     }
17768     return object;
17769   });
17770 }
17771
17772 /**
17773  * The base implementation of `_.times` without support for iteratee shorthands
17774  * or max array length checks.
17775  *
17776  * @private
17777  * @param {number} n The number of times to invoke `iteratee`.
17778  * @param {Function} iteratee The function invoked per iteration.
17779  * @returns {Array} Returns the array of results.
17780  */
17781 function baseTimes(n, iteratee) {
17782   var index = -1,
17783       result = Array(n);
17784
17785   while (++index < n) {
17786     result[index] = iteratee(index);
17787   }
17788   return result;
17789 }
17790
17791 /**
17792  * Checks if `value` is object-like. A value is object-like if it's not `null`
17793  * and has a `typeof` result of "object".
17794  *
17795  * @static
17796  * @memberOf _
17797  * @since 4.0.0
17798  * @category Lang
17799  * @param {*} value The value to check.
17800  * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
17801  * @example
17802  *
17803  * _.isObjectLike({});
17804  * // => true
17805  *
17806  * _.isObjectLike([1, 2, 3]);
17807  * // => true
17808  *
17809  * _.isObjectLike(_.noop);
17810  * // => false
17811  *
17812  * _.isObjectLike(null);
17813  * // => false
17814  */
17815 function isObjectLike(value) {
17816   return value != null && typeof value == 'object';
17817 }
17818
17819 /** `Object#toString` result references. */
17820 var argsTag = '[object Arguments]';
17821
17822 /**
17823  * The base implementation of `_.isArguments`.
17824  *
17825  * @private
17826  * @param {*} value The value to check.
17827  * @returns {boolean} Returns `true` if `value` is an `arguments` object,
17828  */
17829 function baseIsArguments(value) {
17830   return isObjectLike(value) && baseGetTag(value) == argsTag;
17831 }
17832
17833 /** Used for built-in method references. */
17834 var objectProto$5 = Object.prototype;
17835
17836 /** Used to check objects for own properties. */
17837 var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
17838
17839 /** Built-in value references. */
17840 var propertyIsEnumerable = objectProto$5.propertyIsEnumerable;
17841
17842 /**
17843  * Checks if `value` is likely an `arguments` object.
17844  *
17845  * @static
17846  * @memberOf _
17847  * @since 0.1.0
17848  * @category Lang
17849  * @param {*} value The value to check.
17850  * @returns {boolean} Returns `true` if `value` is an `arguments` object,
17851  *  else `false`.
17852  * @example
17853  *
17854  * _.isArguments(function() { return arguments; }());
17855  * // => true
17856  *
17857  * _.isArguments([1, 2, 3]);
17858  * // => false
17859  */
17860 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
17861   return isObjectLike(value) && hasOwnProperty$4.call(value, 'callee') &&
17862     !propertyIsEnumerable.call(value, 'callee');
17863 };
17864
17865 /**
17866  * Checks if `value` is classified as an `Array` object.
17867  *
17868  * @static
17869  * @memberOf _
17870  * @since 0.1.0
17871  * @category Lang
17872  * @param {*} value The value to check.
17873  * @returns {boolean} Returns `true` if `value` is an array, else `false`.
17874  * @example
17875  *
17876  * _.isArray([1, 2, 3]);
17877  * // => true
17878  *
17879  * _.isArray(document.body.children);
17880  * // => false
17881  *
17882  * _.isArray('abc');
17883  * // => false
17884  *
17885  * _.isArray(_.noop);
17886  * // => false
17887  */
17888 var isArray = Array.isArray;
17889
17890 /**
17891  * This method returns `false`.
17892  *
17893  * @static
17894  * @memberOf _
17895  * @since 4.13.0
17896  * @category Util
17897  * @returns {boolean} Returns `false`.
17898  * @example
17899  *
17900  * _.times(2, _.stubFalse);
17901  * // => [false, false]
17902  */
17903 function stubFalse() {
17904   return false;
17905 }
17906
17907 /** Detect free variable `exports`. */
17908 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
17909
17910 /** Detect free variable `module`. */
17911 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
17912
17913 /** Detect the popular CommonJS extension `module.exports`. */
17914 var moduleExports = freeModule && freeModule.exports === freeExports;
17915
17916 /** Built-in value references. */
17917 var Buffer = moduleExports ? root$2.Buffer : undefined;
17918
17919 /* Built-in method references for those with the same name as other `lodash` methods. */
17920 var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
17921
17922 /**
17923  * Checks if `value` is a buffer.
17924  *
17925  * @static
17926  * @memberOf _
17927  * @since 4.3.0
17928  * @category Lang
17929  * @param {*} value The value to check.
17930  * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
17931  * @example
17932  *
17933  * _.isBuffer(new Buffer(2));
17934  * // => true
17935  *
17936  * _.isBuffer(new Uint8Array(2));
17937  * // => false
17938  */
17939 var isBuffer = nativeIsBuffer || stubFalse;
17940
17941 /** `Object#toString` result references. */
17942 var argsTag$1 = '[object Arguments]';
17943 var arrayTag = '[object Array]';
17944 var boolTag = '[object Boolean]';
17945 var dateTag = '[object Date]';
17946 var errorTag = '[object Error]';
17947 var funcTag$1 = '[object Function]';
17948 var mapTag = '[object Map]';
17949 var numberTag = '[object Number]';
17950 var objectTag = '[object Object]';
17951 var regexpTag = '[object RegExp]';
17952 var setTag = '[object Set]';
17953 var stringTag = '[object String]';
17954 var weakMapTag = '[object WeakMap]';
17955
17956 var arrayBufferTag = '[object ArrayBuffer]';
17957 var dataViewTag = '[object DataView]';
17958 var float32Tag = '[object Float32Array]';
17959 var float64Tag = '[object Float64Array]';
17960 var int8Tag = '[object Int8Array]';
17961 var int16Tag = '[object Int16Array]';
17962 var int32Tag = '[object Int32Array]';
17963 var uint8Tag = '[object Uint8Array]';
17964 var uint8ClampedTag = '[object Uint8ClampedArray]';
17965 var uint16Tag = '[object Uint16Array]';
17966 var uint32Tag = '[object Uint32Array]';
17967
17968 /** Used to identify `toStringTag` values of typed arrays. */
17969 var typedArrayTags = {};
17970 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
17971 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
17972 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
17973 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
17974 typedArrayTags[uint32Tag] = true;
17975 typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
17976 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
17977 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
17978 typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
17979 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
17980 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
17981 typedArrayTags[setTag] = typedArrayTags[stringTag] =
17982 typedArrayTags[weakMapTag] = false;
17983
17984 /**
17985  * The base implementation of `_.isTypedArray` without Node.js optimizations.
17986  *
17987  * @private
17988  * @param {*} value The value to check.
17989  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
17990  */
17991 function baseIsTypedArray(value) {
17992   return isObjectLike(value) &&
17993     isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
17994 }
17995
17996 /**
17997  * The base implementation of `_.unary` without support for storing metadata.
17998  *
17999  * @private
18000  * @param {Function} func The function to cap arguments for.
18001  * @returns {Function} Returns the new capped function.
18002  */
18003 function baseUnary(func) {
18004   return function(value) {
18005     return func(value);
18006   };
18007 }
18008
18009 /** Detect free variable `exports`. */
18010 var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18011
18012 /** Detect free variable `module`. */
18013 var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18014
18015 /** Detect the popular CommonJS extension `module.exports`. */
18016 var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18017
18018 /** Detect free variable `process` from Node.js. */
18019 var freeProcess = moduleExports$1 && freeGlobal.process;
18020
18021 /** Used to access faster Node.js helpers. */
18022 var nodeUtil = (function() {
18023   try {
18024     return freeProcess && freeProcess.binding && freeProcess.binding('util');
18025   } catch (e) {}
18026 }());
18027
18028 /* Node.js helper references. */
18029 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18030
18031 /**
18032  * Checks if `value` is classified as a typed array.
18033  *
18034  * @static
18035  * @memberOf _
18036  * @since 3.0.0
18037  * @category Lang
18038  * @param {*} value The value to check.
18039  * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18040  * @example
18041  *
18042  * _.isTypedArray(new Uint8Array);
18043  * // => true
18044  *
18045  * _.isTypedArray([]);
18046  * // => false
18047  */
18048 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18049
18050 /** Used for built-in method references. */
18051 var objectProto$4 = Object.prototype;
18052
18053 /** Used to check objects for own properties. */
18054 var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
18055
18056 /**
18057  * Creates an array of the enumerable property names of the array-like `value`.
18058  *
18059  * @private
18060  * @param {*} value The value to query.
18061  * @param {boolean} inherited Specify returning inherited property names.
18062  * @returns {Array} Returns the array of property names.
18063  */
18064 function arrayLikeKeys(value, inherited) {
18065   var isArr = isArray(value),
18066       isArg = !isArr && isArguments(value),
18067       isBuff = !isArr && !isArg && isBuffer(value),
18068       isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18069       skipIndexes = isArr || isArg || isBuff || isType,
18070       result = skipIndexes ? baseTimes(value.length, String) : [],
18071       length = result.length;
18072
18073   for (var key in value) {
18074     if ((inherited || hasOwnProperty$3.call(value, key)) &&
18075         !(skipIndexes && (
18076            // Safari 9 has enumerable `arguments.length` in strict mode.
18077            key == 'length' ||
18078            // Node.js 0.10 has enumerable non-index properties on buffers.
18079            (isBuff && (key == 'offset' || key == 'parent')) ||
18080            // PhantomJS 2 has enumerable non-index properties on typed arrays.
18081            (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18082            // Skip index properties.
18083            isIndex(key, length)
18084         ))) {
18085       result.push(key);
18086     }
18087   }
18088   return result;
18089 }
18090
18091 /** Used for built-in method references. */
18092 var objectProto$7 = Object.prototype;
18093
18094 /**
18095  * Checks if `value` is likely a prototype object.
18096  *
18097  * @private
18098  * @param {*} value The value to check.
18099  * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18100  */
18101 function isPrototype(value) {
18102   var Ctor = value && value.constructor,
18103       proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$7;
18104
18105   return value === proto;
18106 }
18107
18108 /**
18109  * This function is like
18110  * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18111  * except that it includes inherited enumerable properties.
18112  *
18113  * @private
18114  * @param {Object} object The object to query.
18115  * @returns {Array} Returns the array of property names.
18116  */
18117 function nativeKeysIn(object) {
18118   var result = [];
18119   if (object != null) {
18120     for (var key in Object(object)) {
18121       result.push(key);
18122     }
18123   }
18124   return result;
18125 }
18126
18127 /** Used for built-in method references. */
18128 var objectProto$6 = Object.prototype;
18129
18130 /** Used to check objects for own properties. */
18131 var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18132
18133 /**
18134  * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18135  *
18136  * @private
18137  * @param {Object} object The object to query.
18138  * @returns {Array} Returns the array of property names.
18139  */
18140 function baseKeysIn(object) {
18141   if (!isObject(object)) {
18142     return nativeKeysIn(object);
18143   }
18144   var isProto = isPrototype(object),
18145       result = [];
18146
18147   for (var key in object) {
18148     if (!(key == 'constructor' && (isProto || !hasOwnProperty$5.call(object, key)))) {
18149       result.push(key);
18150     }
18151   }
18152   return result;
18153 }
18154
18155 /**
18156  * Creates an array of the own and inherited enumerable property names of `object`.
18157  *
18158  * **Note:** Non-object values are coerced to objects.
18159  *
18160  * @static
18161  * @memberOf _
18162  * @since 3.0.0
18163  * @category Object
18164  * @param {Object} object The object to query.
18165  * @returns {Array} Returns the array of property names.
18166  * @example
18167  *
18168  * function Foo() {
18169  *   this.a = 1;
18170  *   this.b = 2;
18171  * }
18172  *
18173  * Foo.prototype.c = 3;
18174  *
18175  * _.keysIn(new Foo);
18176  * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18177  */
18178 function keysIn$1(object) {
18179   return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18180 }
18181
18182 /**
18183  * This method is like `_.assign` except that it iterates over own and
18184  * inherited source properties.
18185  *
18186  * **Note:** This method mutates `object`.
18187  *
18188  * @static
18189  * @memberOf _
18190  * @since 4.0.0
18191  * @alias extend
18192  * @category Object
18193  * @param {Object} object The destination object.
18194  * @param {...Object} [sources] The source objects.
18195  * @returns {Object} Returns `object`.
18196  * @see _.assign
18197  * @example
18198  *
18199  * function Foo() {
18200  *   this.a = 1;
18201  * }
18202  *
18203  * function Bar() {
18204  *   this.c = 3;
18205  * }
18206  *
18207  * Foo.prototype.b = 2;
18208  * Bar.prototype.d = 4;
18209  *
18210  * _.assignIn({ 'a': 0 }, new Foo, new Bar);
18211  * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
18212  */
18213 var assignIn$1 = createAssigner(function(object, source) {
18214   copyObject(source, keysIn$1(source), object);
18215 });
18216
18217 /**
18218  * A specialized version of `_.filter` for arrays without support for
18219  * iteratee shorthands.
18220  *
18221  * @private
18222  * @param {Array} [array] The array to iterate over.
18223  * @param {Function} predicate The function invoked per iteration.
18224  * @returns {Array} Returns the new filtered array.
18225  */
18226 function arrayFilter(array, predicate) {
18227   var index = -1,
18228       length = array == null ? 0 : array.length,
18229       resIndex = 0,
18230       result = [];
18231
18232   while (++index < length) {
18233     var value = array[index];
18234     if (predicate(value, index, array)) {
18235       result[resIndex++] = value;
18236     }
18237   }
18238   return result;
18239 }
18240
18241 /**
18242  * Creates a base function for methods like `_.forIn` and `_.forOwn`.
18243  *
18244  * @private
18245  * @param {boolean} [fromRight] Specify iterating from right to left.
18246  * @returns {Function} Returns the new base function.
18247  */
18248 function createBaseFor(fromRight) {
18249   return function(object, iteratee, keysFunc) {
18250     var index = -1,
18251         iterable = Object(object),
18252         props = keysFunc(object),
18253         length = props.length;
18254
18255     while (length--) {
18256       var key = props[fromRight ? length : ++index];
18257       if (iteratee(iterable[key], key, iterable) === false) {
18258         break;
18259       }
18260     }
18261     return object;
18262   };
18263 }
18264
18265 /**
18266  * The base implementation of `baseForOwn` which iterates over `object`
18267  * properties returned by `keysFunc` and invokes `iteratee` for each property.
18268  * Iteratee functions may exit iteration early by explicitly returning `false`.
18269  *
18270  * @private
18271  * @param {Object} object The object to iterate over.
18272  * @param {Function} iteratee The function invoked per iteration.
18273  * @param {Function} keysFunc The function to get the keys of `object`.
18274  * @returns {Object} Returns `object`.
18275  */
18276 var baseFor = createBaseFor();
18277
18278 /**
18279  * Creates a unary function that invokes `func` with its argument transformed.
18280  *
18281  * @private
18282  * @param {Function} func The function to wrap.
18283  * @param {Function} transform The argument transform.
18284  * @returns {Function} Returns the new function.
18285  */
18286 function overArg(func, transform) {
18287   return function(arg) {
18288     return func(transform(arg));
18289   };
18290 }
18291
18292 /* Built-in method references for those with the same name as other `lodash` methods. */
18293 var nativeKeys = overArg(Object.keys, Object);
18294
18295 /** Used for built-in method references. */
18296 var objectProto$8 = Object.prototype;
18297
18298 /** Used to check objects for own properties. */
18299 var hasOwnProperty$6 = objectProto$8.hasOwnProperty;
18300
18301 /**
18302  * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18303  *
18304  * @private
18305  * @param {Object} object The object to query.
18306  * @returns {Array} Returns the array of property names.
18307  */
18308 function baseKeys(object) {
18309   if (!isPrototype(object)) {
18310     return nativeKeys(object);
18311   }
18312   var result = [];
18313   for (var key in Object(object)) {
18314     if (hasOwnProperty$6.call(object, key) && key != 'constructor') {
18315       result.push(key);
18316     }
18317   }
18318   return result;
18319 }
18320
18321 /**
18322  * Creates an array of the own enumerable property names of `object`.
18323  *
18324  * **Note:** Non-object values are coerced to objects. See the
18325  * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18326  * for more details.
18327  *
18328  * @static
18329  * @since 0.1.0
18330  * @memberOf _
18331  * @category Object
18332  * @param {Object} object The object to query.
18333  * @returns {Array} Returns the array of property names.
18334  * @example
18335  *
18336  * function Foo() {
18337  *   this.a = 1;
18338  *   this.b = 2;
18339  * }
18340  *
18341  * Foo.prototype.c = 3;
18342  *
18343  * _.keys(new Foo);
18344  * // => ['a', 'b'] (iteration order is not guaranteed)
18345  *
18346  * _.keys('hi');
18347  * // => ['0', '1']
18348  */
18349 function keys$1(object) {
18350   return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18351 }
18352
18353 /**
18354  * The base implementation of `_.forOwn` without support for iteratee shorthands.
18355  *
18356  * @private
18357  * @param {Object} object The object to iterate over.
18358  * @param {Function} iteratee The function invoked per iteration.
18359  * @returns {Object} Returns `object`.
18360  */
18361 function baseForOwn(object, iteratee) {
18362   return object && baseFor(object, iteratee, keys$1);
18363 }
18364
18365 /**
18366  * Creates a `baseEach` or `baseEachRight` function.
18367  *
18368  * @private
18369  * @param {Function} eachFunc The function to iterate over a collection.
18370  * @param {boolean} [fromRight] Specify iterating from right to left.
18371  * @returns {Function} Returns the new base function.
18372  */
18373 function createBaseEach(eachFunc, fromRight) {
18374   return function(collection, iteratee) {
18375     if (collection == null) {
18376       return collection;
18377     }
18378     if (!isArrayLike(collection)) {
18379       return eachFunc(collection, iteratee);
18380     }
18381     var length = collection.length,
18382         index = fromRight ? length : -1,
18383         iterable = Object(collection);
18384
18385     while ((fromRight ? index-- : ++index < length)) {
18386       if (iteratee(iterable[index], index, iterable) === false) {
18387         break;
18388       }
18389     }
18390     return collection;
18391   };
18392 }
18393
18394 /**
18395  * The base implementation of `_.forEach` without support for iteratee shorthands.
18396  *
18397  * @private
18398  * @param {Array|Object} collection The collection to iterate over.
18399  * @param {Function} iteratee The function invoked per iteration.
18400  * @returns {Array|Object} Returns `collection`.
18401  */
18402 var baseEach = createBaseEach(baseForOwn);
18403
18404 /**
18405  * The base implementation of `_.filter` without support for iteratee shorthands.
18406  *
18407  * @private
18408  * @param {Array|Object} collection The collection to iterate over.
18409  * @param {Function} predicate The function invoked per iteration.
18410  * @returns {Array} Returns the new filtered array.
18411  */
18412 function baseFilter(collection, predicate) {
18413   var result = [];
18414   baseEach(collection, function(value, index, collection) {
18415     if (predicate(value, index, collection)) {
18416       result.push(value);
18417     }
18418   });
18419   return result;
18420 }
18421
18422 /**
18423  * Removes all key-value entries from the list cache.
18424  *
18425  * @private
18426  * @name clear
18427  * @memberOf ListCache
18428  */
18429 function listCacheClear() {
18430   this.__data__ = [];
18431   this.size = 0;
18432 }
18433
18434 /**
18435  * Gets the index at which the `key` is found in `array` of key-value pairs.
18436  *
18437  * @private
18438  * @param {Array} array The array to inspect.
18439  * @param {*} key The key to search for.
18440  * @returns {number} Returns the index of the matched value, else `-1`.
18441  */
18442 function assocIndexOf(array, key) {
18443   var length = array.length;
18444   while (length--) {
18445     if (eq(array[length][0], key)) {
18446       return length;
18447     }
18448   }
18449   return -1;
18450 }
18451
18452 /** Used for built-in method references. */
18453 var arrayProto = Array.prototype;
18454
18455 /** Built-in value references. */
18456 var splice = arrayProto.splice;
18457
18458 /**
18459  * Removes `key` and its value from the list cache.
18460  *
18461  * @private
18462  * @name delete
18463  * @memberOf ListCache
18464  * @param {string} key The key of the value to remove.
18465  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18466  */
18467 function listCacheDelete(key) {
18468   var data = this.__data__,
18469       index = assocIndexOf(data, key);
18470
18471   if (index < 0) {
18472     return false;
18473   }
18474   var lastIndex = data.length - 1;
18475   if (index == lastIndex) {
18476     data.pop();
18477   } else {
18478     splice.call(data, index, 1);
18479   }
18480   --this.size;
18481   return true;
18482 }
18483
18484 /**
18485  * Gets the list cache value for `key`.
18486  *
18487  * @private
18488  * @name get
18489  * @memberOf ListCache
18490  * @param {string} key The key of the value to get.
18491  * @returns {*} Returns the entry value.
18492  */
18493 function listCacheGet(key) {
18494   var data = this.__data__,
18495       index = assocIndexOf(data, key);
18496
18497   return index < 0 ? undefined : data[index][1];
18498 }
18499
18500 /**
18501  * Checks if a list cache value for `key` exists.
18502  *
18503  * @private
18504  * @name has
18505  * @memberOf ListCache
18506  * @param {string} key The key of the entry to check.
18507  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18508  */
18509 function listCacheHas(key) {
18510   return assocIndexOf(this.__data__, key) > -1;
18511 }
18512
18513 /**
18514  * Sets the list cache `key` to `value`.
18515  *
18516  * @private
18517  * @name set
18518  * @memberOf ListCache
18519  * @param {string} key The key of the value to set.
18520  * @param {*} value The value to set.
18521  * @returns {Object} Returns the list cache instance.
18522  */
18523 function listCacheSet(key, value) {
18524   var data = this.__data__,
18525       index = assocIndexOf(data, key);
18526
18527   if (index < 0) {
18528     ++this.size;
18529     data.push([key, value]);
18530   } else {
18531     data[index][1] = value;
18532   }
18533   return this;
18534 }
18535
18536 /**
18537  * Creates an list cache object.
18538  *
18539  * @private
18540  * @constructor
18541  * @param {Array} [entries] The key-value pairs to cache.
18542  */
18543 function ListCache(entries) {
18544   var index = -1,
18545       length = entries == null ? 0 : entries.length;
18546
18547   this.clear();
18548   while (++index < length) {
18549     var entry = entries[index];
18550     this.set(entry[0], entry[1]);
18551   }
18552 }
18553
18554 // Add methods to `ListCache`.
18555 ListCache.prototype.clear = listCacheClear;
18556 ListCache.prototype['delete'] = listCacheDelete;
18557 ListCache.prototype.get = listCacheGet;
18558 ListCache.prototype.has = listCacheHas;
18559 ListCache.prototype.set = listCacheSet;
18560
18561 /**
18562  * Removes all key-value entries from the stack.
18563  *
18564  * @private
18565  * @name clear
18566  * @memberOf Stack
18567  */
18568 function stackClear() {
18569   this.__data__ = new ListCache;
18570   this.size = 0;
18571 }
18572
18573 /**
18574  * Removes `key` and its value from the stack.
18575  *
18576  * @private
18577  * @name delete
18578  * @memberOf Stack
18579  * @param {string} key The key of the value to remove.
18580  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18581  */
18582 function stackDelete(key) {
18583   var data = this.__data__,
18584       result = data['delete'](key);
18585
18586   this.size = data.size;
18587   return result;
18588 }
18589
18590 /**
18591  * Gets the stack value for `key`.
18592  *
18593  * @private
18594  * @name get
18595  * @memberOf Stack
18596  * @param {string} key The key of the value to get.
18597  * @returns {*} Returns the entry value.
18598  */
18599 function stackGet(key) {
18600   return this.__data__.get(key);
18601 }
18602
18603 /**
18604  * Checks if a stack value for `key` exists.
18605  *
18606  * @private
18607  * @name has
18608  * @memberOf Stack
18609  * @param {string} key The key of the entry to check.
18610  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18611  */
18612 function stackHas(key) {
18613   return this.__data__.has(key);
18614 }
18615
18616 /* Built-in method references that are verified to be native. */
18617 var Map$1 = getNative(root$2, 'Map');
18618
18619 /* Built-in method references that are verified to be native. */
18620 var nativeCreate = getNative(Object, 'create');
18621
18622 /**
18623  * Removes all key-value entries from the hash.
18624  *
18625  * @private
18626  * @name clear
18627  * @memberOf Hash
18628  */
18629 function hashClear() {
18630   this.__data__ = nativeCreate ? nativeCreate(null) : {};
18631   this.size = 0;
18632 }
18633
18634 /**
18635  * Removes `key` and its value from the hash.
18636  *
18637  * @private
18638  * @name delete
18639  * @memberOf Hash
18640  * @param {Object} hash The hash to modify.
18641  * @param {string} key The key of the value to remove.
18642  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18643  */
18644 function hashDelete(key) {
18645   var result = this.has(key) && delete this.__data__[key];
18646   this.size -= result ? 1 : 0;
18647   return result;
18648 }
18649
18650 /** Used to stand-in for `undefined` hash values. */
18651 var HASH_UNDEFINED = '__lodash_hash_undefined__';
18652
18653 /** Used for built-in method references. */
18654 var objectProto$9 = Object.prototype;
18655
18656 /** Used to check objects for own properties. */
18657 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18658
18659 /**
18660  * Gets the hash value for `key`.
18661  *
18662  * @private
18663  * @name get
18664  * @memberOf Hash
18665  * @param {string} key The key of the value to get.
18666  * @returns {*} Returns the entry value.
18667  */
18668 function hashGet(key) {
18669   var data = this.__data__;
18670   if (nativeCreate) {
18671     var result = data[key];
18672     return result === HASH_UNDEFINED ? undefined : result;
18673   }
18674   return hasOwnProperty$7.call(data, key) ? data[key] : undefined;
18675 }
18676
18677 /** Used for built-in method references. */
18678 var objectProto$10 = Object.prototype;
18679
18680 /** Used to check objects for own properties. */
18681 var hasOwnProperty$8 = objectProto$10.hasOwnProperty;
18682
18683 /**
18684  * Checks if a hash value for `key` exists.
18685  *
18686  * @private
18687  * @name has
18688  * @memberOf Hash
18689  * @param {string} key The key of the entry to check.
18690  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18691  */
18692 function hashHas(key) {
18693   var data = this.__data__;
18694   return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$8.call(data, key);
18695 }
18696
18697 /** Used to stand-in for `undefined` hash values. */
18698 var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
18699
18700 /**
18701  * Sets the hash `key` to `value`.
18702  *
18703  * @private
18704  * @name set
18705  * @memberOf Hash
18706  * @param {string} key The key of the value to set.
18707  * @param {*} value The value to set.
18708  * @returns {Object} Returns the hash instance.
18709  */
18710 function hashSet(key, value) {
18711   var data = this.__data__;
18712   this.size += this.has(key) ? 0 : 1;
18713   data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
18714   return this;
18715 }
18716
18717 /**
18718  * Creates a hash object.
18719  *
18720  * @private
18721  * @constructor
18722  * @param {Array} [entries] The key-value pairs to cache.
18723  */
18724 function Hash(entries) {
18725   var index = -1,
18726       length = entries == null ? 0 : entries.length;
18727
18728   this.clear();
18729   while (++index < length) {
18730     var entry = entries[index];
18731     this.set(entry[0], entry[1]);
18732   }
18733 }
18734
18735 // Add methods to `Hash`.
18736 Hash.prototype.clear = hashClear;
18737 Hash.prototype['delete'] = hashDelete;
18738 Hash.prototype.get = hashGet;
18739 Hash.prototype.has = hashHas;
18740 Hash.prototype.set = hashSet;
18741
18742 /**
18743  * Removes all key-value entries from the map.
18744  *
18745  * @private
18746  * @name clear
18747  * @memberOf MapCache
18748  */
18749 function mapCacheClear() {
18750   this.size = 0;
18751   this.__data__ = {
18752     'hash': new Hash,
18753     'map': new (Map$1 || ListCache),
18754     'string': new Hash
18755   };
18756 }
18757
18758 /**
18759  * Checks if `value` is suitable for use as unique object key.
18760  *
18761  * @private
18762  * @param {*} value The value to check.
18763  * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
18764  */
18765 function isKeyable(value) {
18766   var type = typeof value;
18767   return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
18768     ? (value !== '__proto__')
18769     : (value === null);
18770 }
18771
18772 /**
18773  * Gets the data for `map`.
18774  *
18775  * @private
18776  * @param {Object} map The map to query.
18777  * @param {string} key The reference key.
18778  * @returns {*} Returns the map data.
18779  */
18780 function getMapData(map, key) {
18781   var data = map.__data__;
18782   return isKeyable(key)
18783     ? data[typeof key == 'string' ? 'string' : 'hash']
18784     : data.map;
18785 }
18786
18787 /**
18788  * Removes `key` and its value from the map.
18789  *
18790  * @private
18791  * @name delete
18792  * @memberOf MapCache
18793  * @param {string} key The key of the value to remove.
18794  * @returns {boolean} Returns `true` if the entry was removed, else `false`.
18795  */
18796 function mapCacheDelete(key) {
18797   var result = getMapData(this, key)['delete'](key);
18798   this.size -= result ? 1 : 0;
18799   return result;
18800 }
18801
18802 /**
18803  * Gets the map value for `key`.
18804  *
18805  * @private
18806  * @name get
18807  * @memberOf MapCache
18808  * @param {string} key The key of the value to get.
18809  * @returns {*} Returns the entry value.
18810  */
18811 function mapCacheGet(key) {
18812   return getMapData(this, key).get(key);
18813 }
18814
18815 /**
18816  * Checks if a map value for `key` exists.
18817  *
18818  * @private
18819  * @name has
18820  * @memberOf MapCache
18821  * @param {string} key The key of the entry to check.
18822  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
18823  */
18824 function mapCacheHas(key) {
18825   return getMapData(this, key).has(key);
18826 }
18827
18828 /**
18829  * Sets the map `key` to `value`.
18830  *
18831  * @private
18832  * @name set
18833  * @memberOf MapCache
18834  * @param {string} key The key of the value to set.
18835  * @param {*} value The value to set.
18836  * @returns {Object} Returns the map cache instance.
18837  */
18838 function mapCacheSet(key, value) {
18839   var data = getMapData(this, key),
18840       size = data.size;
18841
18842   data.set(key, value);
18843   this.size += data.size == size ? 0 : 1;
18844   return this;
18845 }
18846
18847 /**
18848  * Creates a map cache object to store key-value pairs.
18849  *
18850  * @private
18851  * @constructor
18852  * @param {Array} [entries] The key-value pairs to cache.
18853  */
18854 function MapCache(entries) {
18855   var index = -1,
18856       length = entries == null ? 0 : entries.length;
18857
18858   this.clear();
18859   while (++index < length) {
18860     var entry = entries[index];
18861     this.set(entry[0], entry[1]);
18862   }
18863 }
18864
18865 // Add methods to `MapCache`.
18866 MapCache.prototype.clear = mapCacheClear;
18867 MapCache.prototype['delete'] = mapCacheDelete;
18868 MapCache.prototype.get = mapCacheGet;
18869 MapCache.prototype.has = mapCacheHas;
18870 MapCache.prototype.set = mapCacheSet;
18871
18872 /** Used as the size to enable large array optimizations. */
18873 var LARGE_ARRAY_SIZE = 200;
18874
18875 /**
18876  * Sets the stack `key` to `value`.
18877  *
18878  * @private
18879  * @name set
18880  * @memberOf Stack
18881  * @param {string} key The key of the value to set.
18882  * @param {*} value The value to set.
18883  * @returns {Object} Returns the stack cache instance.
18884  */
18885 function stackSet(key, value) {
18886   var data = this.__data__;
18887   if (data instanceof ListCache) {
18888     var pairs = data.__data__;
18889     if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
18890       pairs.push([key, value]);
18891       this.size = ++data.size;
18892       return this;
18893     }
18894     data = this.__data__ = new MapCache(pairs);
18895   }
18896   data.set(key, value);
18897   this.size = data.size;
18898   return this;
18899 }
18900
18901 /**
18902  * Creates a stack cache object to store key-value pairs.
18903  *
18904  * @private
18905  * @constructor
18906  * @param {Array} [entries] The key-value pairs to cache.
18907  */
18908 function Stack(entries) {
18909   var data = this.__data__ = new ListCache(entries);
18910   this.size = data.size;
18911 }
18912
18913 // Add methods to `Stack`.
18914 Stack.prototype.clear = stackClear;
18915 Stack.prototype['delete'] = stackDelete;
18916 Stack.prototype.get = stackGet;
18917 Stack.prototype.has = stackHas;
18918 Stack.prototype.set = stackSet;
18919
18920 /** Used to stand-in for `undefined` hash values. */
18921 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
18922
18923 /**
18924  * Adds `value` to the array cache.
18925  *
18926  * @private
18927  * @name add
18928  * @memberOf SetCache
18929  * @alias push
18930  * @param {*} value The value to cache.
18931  * @returns {Object} Returns the cache instance.
18932  */
18933 function setCacheAdd(value) {
18934   this.__data__.set(value, HASH_UNDEFINED$2);
18935   return this;
18936 }
18937
18938 /**
18939  * Checks if `value` is in the array cache.
18940  *
18941  * @private
18942  * @name has
18943  * @memberOf SetCache
18944  * @param {*} value The value to search for.
18945  * @returns {number} Returns `true` if `value` is found, else `false`.
18946  */
18947 function setCacheHas(value) {
18948   return this.__data__.has(value);
18949 }
18950
18951 /**
18952  *
18953  * Creates an array cache object to store unique values.
18954  *
18955  * @private
18956  * @constructor
18957  * @param {Array} [values] The values to cache.
18958  */
18959 function SetCache(values) {
18960   var index = -1,
18961       length = values == null ? 0 : values.length;
18962
18963   this.__data__ = new MapCache;
18964   while (++index < length) {
18965     this.add(values[index]);
18966   }
18967 }
18968
18969 // Add methods to `SetCache`.
18970 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
18971 SetCache.prototype.has = setCacheHas;
18972
18973 /**
18974  * A specialized version of `_.some` for arrays without support for iteratee
18975  * shorthands.
18976  *
18977  * @private
18978  * @param {Array} [array] The array to iterate over.
18979  * @param {Function} predicate The function invoked per iteration.
18980  * @returns {boolean} Returns `true` if any element passes the predicate check,
18981  *  else `false`.
18982  */
18983 function arraySome(array, predicate) {
18984   var index = -1,
18985       length = array == null ? 0 : array.length;
18986
18987   while (++index < length) {
18988     if (predicate(array[index], index, array)) {
18989       return true;
18990     }
18991   }
18992   return false;
18993 }
18994
18995 /**
18996  * Checks if a `cache` value for `key` exists.
18997  *
18998  * @private
18999  * @param {Object} cache The cache to query.
19000  * @param {string} key The key of the entry to check.
19001  * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19002  */
19003 function cacheHas(cache, key) {
19004   return cache.has(key);
19005 }
19006
19007 /** Used to compose bitmasks for value comparisons. */
19008 var COMPARE_PARTIAL_FLAG$2 = 1;
19009 var COMPARE_UNORDERED_FLAG$1 = 2;
19010
19011 /**
19012  * A specialized version of `baseIsEqualDeep` for arrays with support for
19013  * partial deep comparisons.
19014  *
19015  * @private
19016  * @param {Array} array The array to compare.
19017  * @param {Array} other The other array to compare.
19018  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19019  * @param {Function} customizer The function to customize comparisons.
19020  * @param {Function} equalFunc The function to determine equivalents of values.
19021  * @param {Object} stack Tracks traversed `array` and `other` objects.
19022  * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19023  */
19024 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19025   var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19026       arrLength = array.length,
19027       othLength = other.length;
19028
19029   if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19030     return false;
19031   }
19032   // Assume cyclic values are equal.
19033   var stacked = stack.get(array);
19034   if (stacked && stack.get(other)) {
19035     return stacked == other;
19036   }
19037   var index = -1,
19038       result = true,
19039       seen = (bitmask & COMPARE_UNORDERED_FLAG$1) ? new SetCache : undefined;
19040
19041   stack.set(array, other);
19042   stack.set(other, array);
19043
19044   // Ignore non-index properties.
19045   while (++index < arrLength) {
19046     var arrValue = array[index],
19047         othValue = other[index];
19048
19049     if (customizer) {
19050       var compared = isPartial
19051         ? customizer(othValue, arrValue, index, other, array, stack)
19052         : customizer(arrValue, othValue, index, array, other, stack);
19053     }
19054     if (compared !== undefined) {
19055       if (compared) {
19056         continue;
19057       }
19058       result = false;
19059       break;
19060     }
19061     // Recursively compare arrays (susceptible to call stack limits).
19062     if (seen) {
19063       if (!arraySome(other, function(othValue, othIndex) {
19064             if (!cacheHas(seen, othIndex) &&
19065                 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19066               return seen.push(othIndex);
19067             }
19068           })) {
19069         result = false;
19070         break;
19071       }
19072     } else if (!(
19073           arrValue === othValue ||
19074             equalFunc(arrValue, othValue, bitmask, customizer, stack)
19075         )) {
19076       result = false;
19077       break;
19078     }
19079   }
19080   stack['delete'](array);
19081   stack['delete'](other);
19082   return result;
19083 }
19084
19085 /** Built-in value references. */
19086 var Uint8Array = root$2.Uint8Array;
19087
19088 /**
19089  * Converts `map` to its key-value pairs.
19090  *
19091  * @private
19092  * @param {Object} map The map to convert.
19093  * @returns {Array} Returns the key-value pairs.
19094  */
19095 function mapToArray(map) {
19096   var index = -1,
19097       result = Array(map.size);
19098
19099   map.forEach(function(value, key) {
19100     result[++index] = [key, value];
19101   });
19102   return result;
19103 }
19104
19105 /**
19106  * Converts `set` to an array of its values.
19107  *
19108  * @private
19109  * @param {Object} set The set to convert.
19110  * @returns {Array} Returns the values.
19111  */
19112 function setToArray(set) {
19113   var index = -1,
19114       result = Array(set.size);
19115
19116   set.forEach(function(value) {
19117     result[++index] = value;
19118   });
19119   return result;
19120 }
19121
19122 /** Used to compose bitmasks for value comparisons. */
19123 var COMPARE_PARTIAL_FLAG$3 = 1;
19124 var COMPARE_UNORDERED_FLAG$2 = 2;
19125
19126 /** `Object#toString` result references. */
19127 var boolTag$1 = '[object Boolean]';
19128 var dateTag$1 = '[object Date]';
19129 var errorTag$1 = '[object Error]';
19130 var mapTag$1 = '[object Map]';
19131 var numberTag$1 = '[object Number]';
19132 var regexpTag$1 = '[object RegExp]';
19133 var setTag$1 = '[object Set]';
19134 var stringTag$1 = '[object String]';
19135 var symbolTag = '[object Symbol]';
19136
19137 var arrayBufferTag$1 = '[object ArrayBuffer]';
19138 var dataViewTag$1 = '[object DataView]';
19139
19140 /** Used to convert symbols to primitives and strings. */
19141 var symbolProto = Symbol ? Symbol.prototype : undefined;
19142 var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19143
19144 /**
19145  * A specialized version of `baseIsEqualDeep` for comparing objects of
19146  * the same `toStringTag`.
19147  *
19148  * **Note:** This function only supports comparing values with tags of
19149  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19150  *
19151  * @private
19152  * @param {Object} object The object to compare.
19153  * @param {Object} other The other object to compare.
19154  * @param {string} tag The `toStringTag` of the objects to compare.
19155  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19156  * @param {Function} customizer The function to customize comparisons.
19157  * @param {Function} equalFunc The function to determine equivalents of values.
19158  * @param {Object} stack Tracks traversed `object` and `other` objects.
19159  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19160  */
19161 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19162   switch (tag) {
19163     case dataViewTag$1:
19164       if ((object.byteLength != other.byteLength) ||
19165           (object.byteOffset != other.byteOffset)) {
19166         return false;
19167       }
19168       object = object.buffer;
19169       other = other.buffer;
19170
19171     case arrayBufferTag$1:
19172       if ((object.byteLength != other.byteLength) ||
19173           !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19174         return false;
19175       }
19176       return true;
19177
19178     case boolTag$1:
19179     case dateTag$1:
19180     case numberTag$1:
19181       // Coerce booleans to `1` or `0` and dates to milliseconds.
19182       // Invalid dates are coerced to `NaN`.
19183       return eq(+object, +other);
19184
19185     case errorTag$1:
19186       return object.name == other.name && object.message == other.message;
19187
19188     case regexpTag$1:
19189     case stringTag$1:
19190       // Coerce regexes to strings and treat strings, primitives and objects,
19191       // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19192       // for more details.
19193       return object == (other + '');
19194
19195     case mapTag$1:
19196       var convert = mapToArray;
19197
19198     case setTag$1:
19199       var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3;
19200       convert || (convert = setToArray);
19201
19202       if (object.size != other.size && !isPartial) {
19203         return false;
19204       }
19205       // Assume cyclic values are equal.
19206       var stacked = stack.get(object);
19207       if (stacked) {
19208         return stacked == other;
19209       }
19210       bitmask |= COMPARE_UNORDERED_FLAG$2;
19211
19212       // Recursively compare objects (susceptible to call stack limits).
19213       stack.set(object, other);
19214       var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19215       stack['delete'](object);
19216       return result;
19217
19218     case symbolTag:
19219       if (symbolValueOf) {
19220         return symbolValueOf.call(object) == symbolValueOf.call(other);
19221       }
19222   }
19223   return false;
19224 }
19225
19226 /**
19227  * Appends the elements of `values` to `array`.
19228  *
19229  * @private
19230  * @param {Array} array The array to modify.
19231  * @param {Array} values The values to append.
19232  * @returns {Array} Returns `array`.
19233  */
19234 function arrayPush(array, values) {
19235   var index = -1,
19236       length = values.length,
19237       offset = array.length;
19238
19239   while (++index < length) {
19240     array[offset + index] = values[index];
19241   }
19242   return array;
19243 }
19244
19245 /**
19246  * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
19247  * `keysFunc` and `symbolsFunc` to get the enumerable property names and
19248  * symbols of `object`.
19249  *
19250  * @private
19251  * @param {Object} object The object to query.
19252  * @param {Function} keysFunc The function to get the keys of `object`.
19253  * @param {Function} symbolsFunc The function to get the symbols of `object`.
19254  * @returns {Array} Returns the array of property names and symbols.
19255  */
19256 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
19257   var result = keysFunc(object);
19258   return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
19259 }
19260
19261 /**
19262  * This method returns a new empty array.
19263  *
19264  * @static
19265  * @memberOf _
19266  * @since 4.13.0
19267  * @category Util
19268  * @returns {Array} Returns the new empty array.
19269  * @example
19270  *
19271  * var arrays = _.times(2, _.stubArray);
19272  *
19273  * console.log(arrays);
19274  * // => [[], []]
19275  *
19276  * console.log(arrays[0] === arrays[1]);
19277  * // => false
19278  */
19279 function stubArray() {
19280   return [];
19281 }
19282
19283 /** Used for built-in method references. */
19284 var objectProto$13 = Object.prototype;
19285
19286 /** Built-in value references. */
19287 var propertyIsEnumerable$1 = objectProto$13.propertyIsEnumerable;
19288
19289 /* Built-in method references for those with the same name as other `lodash` methods. */
19290 var nativeGetSymbols = Object.getOwnPropertySymbols;
19291
19292 /**
19293  * Creates an array of the own enumerable symbols of `object`.
19294  *
19295  * @private
19296  * @param {Object} object The object to query.
19297  * @returns {Array} Returns the array of symbols.
19298  */
19299 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
19300   if (object == null) {
19301     return [];
19302   }
19303   object = Object(object);
19304   return arrayFilter(nativeGetSymbols(object), function(symbol) {
19305     return propertyIsEnumerable$1.call(object, symbol);
19306   });
19307 };
19308
19309 /**
19310  * Creates an array of own enumerable property names and symbols of `object`.
19311  *
19312  * @private
19313  * @param {Object} object The object to query.
19314  * @returns {Array} Returns the array of property names and symbols.
19315  */
19316 function getAllKeys(object) {
19317   return baseGetAllKeys(object, keys$1, getSymbols);
19318 }
19319
19320 /** Used to compose bitmasks for value comparisons. */
19321 var COMPARE_PARTIAL_FLAG$4 = 1;
19322
19323 /** Used for built-in method references. */
19324 var objectProto$12 = Object.prototype;
19325
19326 /** Used to check objects for own properties. */
19327 var hasOwnProperty$10 = objectProto$12.hasOwnProperty;
19328
19329 /**
19330  * A specialized version of `baseIsEqualDeep` for objects with support for
19331  * partial deep comparisons.
19332  *
19333  * @private
19334  * @param {Object} object The object to compare.
19335  * @param {Object} other The other object to compare.
19336  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19337  * @param {Function} customizer The function to customize comparisons.
19338  * @param {Function} equalFunc The function to determine equivalents of values.
19339  * @param {Object} stack Tracks traversed `object` and `other` objects.
19340  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19341  */
19342 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19343   var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4,
19344       objProps = getAllKeys(object),
19345       objLength = objProps.length,
19346       othProps = getAllKeys(other),
19347       othLength = othProps.length;
19348
19349   if (objLength != othLength && !isPartial) {
19350     return false;
19351   }
19352   var index = objLength;
19353   while (index--) {
19354     var key = objProps[index];
19355     if (!(isPartial ? key in other : hasOwnProperty$10.call(other, key))) {
19356       return false;
19357     }
19358   }
19359   // Assume cyclic values are equal.
19360   var stacked = stack.get(object);
19361   if (stacked && stack.get(other)) {
19362     return stacked == other;
19363   }
19364   var result = true;
19365   stack.set(object, other);
19366   stack.set(other, object);
19367
19368   var skipCtor = isPartial;
19369   while (++index < objLength) {
19370     key = objProps[index];
19371     var objValue = object[key],
19372         othValue = other[key];
19373
19374     if (customizer) {
19375       var compared = isPartial
19376         ? customizer(othValue, objValue, key, other, object, stack)
19377         : customizer(objValue, othValue, key, object, other, stack);
19378     }
19379     // Recursively compare objects (susceptible to call stack limits).
19380     if (!(compared === undefined
19381           ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19382           : compared
19383         )) {
19384       result = false;
19385       break;
19386     }
19387     skipCtor || (skipCtor = key == 'constructor');
19388   }
19389   if (result && !skipCtor) {
19390     var objCtor = object.constructor,
19391         othCtor = other.constructor;
19392
19393     // Non `Object` object instances with different constructors are not equal.
19394     if (objCtor != othCtor &&
19395         ('constructor' in object && 'constructor' in other) &&
19396         !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19397           typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19398       result = false;
19399     }
19400   }
19401   stack['delete'](object);
19402   stack['delete'](other);
19403   return result;
19404 }
19405
19406 /* Built-in method references that are verified to be native. */
19407 var DataView = getNative(root$2, 'DataView');
19408
19409 /* Built-in method references that are verified to be native. */
19410 var Promise = getNative(root$2, 'Promise');
19411
19412 /* Built-in method references that are verified to be native. */
19413 var Set$1 = getNative(root$2, 'Set');
19414
19415 /* Built-in method references that are verified to be native. */
19416 var WeakMap = getNative(root$2, 'WeakMap');
19417
19418 /** `Object#toString` result references. */
19419 var mapTag$2 = '[object Map]';
19420 var objectTag$2 = '[object Object]';
19421 var promiseTag = '[object Promise]';
19422 var setTag$2 = '[object Set]';
19423 var weakMapTag$1 = '[object WeakMap]';
19424
19425 var dataViewTag$2 = '[object DataView]';
19426
19427 /** Used to detect maps, sets, and weakmaps. */
19428 var dataViewCtorString = toSource(DataView);
19429 var mapCtorString = toSource(Map$1);
19430 var promiseCtorString = toSource(Promise);
19431 var setCtorString = toSource(Set$1);
19432 var weakMapCtorString = toSource(WeakMap);
19433
19434 /**
19435  * Gets the `toStringTag` of `value`.
19436  *
19437  * @private
19438  * @param {*} value The value to query.
19439  * @returns {string} Returns the `toStringTag`.
19440  */
19441 var getTag = baseGetTag;
19442
19443 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
19444 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$2) ||
19445     (Map$1 && getTag(new Map$1) != mapTag$2) ||
19446     (Promise && getTag(Promise.resolve()) != promiseTag) ||
19447     (Set$1 && getTag(new Set$1) != setTag$2) ||
19448     (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
19449   getTag = function(value) {
19450     var result = baseGetTag(value),
19451         Ctor = result == objectTag$2 ? value.constructor : undefined,
19452         ctorString = Ctor ? toSource(Ctor) : '';
19453
19454     if (ctorString) {
19455       switch (ctorString) {
19456         case dataViewCtorString: return dataViewTag$2;
19457         case mapCtorString: return mapTag$2;
19458         case promiseCtorString: return promiseTag;
19459         case setCtorString: return setTag$2;
19460         case weakMapCtorString: return weakMapTag$1;
19461       }
19462     }
19463     return result;
19464   };
19465 }
19466
19467 var getTag$1 = getTag;
19468
19469 /** Used to compose bitmasks for value comparisons. */
19470 var COMPARE_PARTIAL_FLAG$1 = 1;
19471
19472 /** `Object#toString` result references. */
19473 var argsTag$2 = '[object Arguments]';
19474 var arrayTag$1 = '[object Array]';
19475 var objectTag$1 = '[object Object]';
19476
19477 /** Used for built-in method references. */
19478 var objectProto$11 = Object.prototype;
19479
19480 /** Used to check objects for own properties. */
19481 var hasOwnProperty$9 = objectProto$11.hasOwnProperty;
19482
19483 /**
19484  * A specialized version of `baseIsEqual` for arrays and objects which performs
19485  * deep comparisons and tracks traversed objects enabling objects with circular
19486  * references to be compared.
19487  *
19488  * @private
19489  * @param {Object} object The object to compare.
19490  * @param {Object} other The other object to compare.
19491  * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19492  * @param {Function} customizer The function to customize comparisons.
19493  * @param {Function} equalFunc The function to determine equivalents of values.
19494  * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19495  * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19496  */
19497 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19498   var objIsArr = isArray(object),
19499       othIsArr = isArray(other),
19500       objTag = objIsArr ? arrayTag$1 : getTag$1(object),
19501       othTag = othIsArr ? arrayTag$1 : getTag$1(other);
19502
19503   objTag = objTag == argsTag$2 ? objectTag$1 : objTag;
19504   othTag = othTag == argsTag$2 ? objectTag$1 : othTag;
19505
19506   var objIsObj = objTag == objectTag$1,
19507       othIsObj = othTag == objectTag$1,
19508       isSameTag = objTag == othTag;
19509
19510   if (isSameTag && isBuffer(object)) {
19511     if (!isBuffer(other)) {
19512       return false;
19513     }
19514     objIsArr = true;
19515     objIsObj = false;
19516   }
19517   if (isSameTag && !objIsObj) {
19518     stack || (stack = new Stack);
19519     return (objIsArr || isTypedArray(object))
19520       ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
19521       : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
19522   }
19523   if (!(bitmask & COMPARE_PARTIAL_FLAG$1)) {
19524     var objIsWrapped = objIsObj && hasOwnProperty$9.call(object, '__wrapped__'),
19525         othIsWrapped = othIsObj && hasOwnProperty$9.call(other, '__wrapped__');
19526
19527     if (objIsWrapped || othIsWrapped) {
19528       var objUnwrapped = objIsWrapped ? object.value() : object,
19529           othUnwrapped = othIsWrapped ? other.value() : other;
19530
19531       stack || (stack = new Stack);
19532       return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
19533     }
19534   }
19535   if (!isSameTag) {
19536     return false;
19537   }
19538   stack || (stack = new Stack);
19539   return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
19540 }
19541
19542 /**
19543  * The base implementation of `_.isEqual` which supports partial comparisons
19544  * and tracks traversed objects.
19545  *
19546  * @private
19547  * @param {*} value The value to compare.
19548  * @param {*} other The other value to compare.
19549  * @param {boolean} bitmask The bitmask flags.
19550  *  1 - Unordered comparison
19551  *  2 - Partial comparison
19552  * @param {Function} [customizer] The function to customize comparisons.
19553  * @param {Object} [stack] Tracks traversed `value` and `other` objects.
19554  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
19555  */
19556 function baseIsEqual(value, other, bitmask, customizer, stack) {
19557   if (value === other) {
19558     return true;
19559   }
19560   if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
19561     return value !== value && other !== other;
19562   }
19563   return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
19564 }
19565
19566 /** Used to compose bitmasks for value comparisons. */
19567 var COMPARE_PARTIAL_FLAG = 1;
19568 var COMPARE_UNORDERED_FLAG = 2;
19569
19570 /**
19571  * The base implementation of `_.isMatch` without support for iteratee shorthands.
19572  *
19573  * @private
19574  * @param {Object} object The object to inspect.
19575  * @param {Object} source The object of property values to match.
19576  * @param {Array} matchData The property names, values, and compare flags to match.
19577  * @param {Function} [customizer] The function to customize comparisons.
19578  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
19579  */
19580 function baseIsMatch(object, source, matchData, customizer) {
19581   var index = matchData.length,
19582       length = index,
19583       noCustomizer = !customizer;
19584
19585   if (object == null) {
19586     return !length;
19587   }
19588   object = Object(object);
19589   while (index--) {
19590     var data = matchData[index];
19591     if ((noCustomizer && data[2])
19592           ? data[1] !== object[data[0]]
19593           : !(data[0] in object)
19594         ) {
19595       return false;
19596     }
19597   }
19598   while (++index < length) {
19599     data = matchData[index];
19600     var key = data[0],
19601         objValue = object[key],
19602         srcValue = data[1];
19603
19604     if (noCustomizer && data[2]) {
19605       if (objValue === undefined && !(key in object)) {
19606         return false;
19607       }
19608     } else {
19609       var stack = new Stack;
19610       if (customizer) {
19611         var result = customizer(objValue, srcValue, key, object, source, stack);
19612       }
19613       if (!(result === undefined
19614             ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
19615             : result
19616           )) {
19617         return false;
19618       }
19619     }
19620   }
19621   return true;
19622 }
19623
19624 /**
19625  * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
19626  *
19627  * @private
19628  * @param {*} value The value to check.
19629  * @returns {boolean} Returns `true` if `value` if suitable for strict
19630  *  equality comparisons, else `false`.
19631  */
19632 function isStrictComparable(value) {
19633   return value === value && !isObject(value);
19634 }
19635
19636 /**
19637  * Gets the property names, values, and compare flags of `object`.
19638  *
19639  * @private
19640  * @param {Object} object The object to query.
19641  * @returns {Array} Returns the match data of `object`.
19642  */
19643 function getMatchData(object) {
19644   var result = keys$1(object),
19645       length = result.length;
19646
19647   while (length--) {
19648     var key = result[length],
19649         value = object[key];
19650
19651     result[length] = [key, value, isStrictComparable(value)];
19652   }
19653   return result;
19654 }
19655
19656 /**
19657  * A specialized version of `matchesProperty` for source values suitable
19658  * for strict equality comparisons, i.e. `===`.
19659  *
19660  * @private
19661  * @param {string} key The key of the property to get.
19662  * @param {*} srcValue The value to match.
19663  * @returns {Function} Returns the new spec function.
19664  */
19665 function matchesStrictComparable(key, srcValue) {
19666   return function(object) {
19667     if (object == null) {
19668       return false;
19669     }
19670     return object[key] === srcValue &&
19671       (srcValue !== undefined || (key in Object(object)));
19672   };
19673 }
19674
19675 /**
19676  * The base implementation of `_.matches` which doesn't clone `source`.
19677  *
19678  * @private
19679  * @param {Object} source The object of property values to match.
19680  * @returns {Function} Returns the new spec function.
19681  */
19682 function baseMatches(source) {
19683   var matchData = getMatchData(source);
19684   if (matchData.length == 1 && matchData[0][2]) {
19685     return matchesStrictComparable(matchData[0][0], matchData[0][1]);
19686   }
19687   return function(object) {
19688     return object === source || baseIsMatch(object, source, matchData);
19689   };
19690 }
19691
19692 /** `Object#toString` result references. */
19693 var symbolTag$1 = '[object Symbol]';
19694
19695 /**
19696  * Checks if `value` is classified as a `Symbol` primitive or object.
19697  *
19698  * @static
19699  * @memberOf _
19700  * @since 4.0.0
19701  * @category Lang
19702  * @param {*} value The value to check.
19703  * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
19704  * @example
19705  *
19706  * _.isSymbol(Symbol.iterator);
19707  * // => true
19708  *
19709  * _.isSymbol('abc');
19710  * // => false
19711  */
19712 function isSymbol(value) {
19713   return typeof value == 'symbol' ||
19714     (isObjectLike(value) && baseGetTag(value) == symbolTag$1);
19715 }
19716
19717 /** Used to match property names within property paths. */
19718 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/;
19719 var reIsPlainProp = /^\w*$/;
19720
19721 /**
19722  * Checks if `value` is a property name and not a property path.
19723  *
19724  * @private
19725  * @param {*} value The value to check.
19726  * @param {Object} [object] The object to query keys on.
19727  * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
19728  */
19729 function isKey(value, object) {
19730   if (isArray(value)) {
19731     return false;
19732   }
19733   var type = typeof value;
19734   if (type == 'number' || type == 'symbol' || type == 'boolean' ||
19735       value == null || isSymbol(value)) {
19736     return true;
19737   }
19738   return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
19739     (object != null && value in Object(object));
19740 }
19741
19742 /** Error message constants. */
19743 var FUNC_ERROR_TEXT = 'Expected a function';
19744
19745 /**
19746  * Creates a function that memoizes the result of `func`. If `resolver` is
19747  * provided, it determines the cache key for storing the result based on the
19748  * arguments provided to the memoized function. By default, the first argument
19749  * provided to the memoized function is used as the map cache key. The `func`
19750  * is invoked with the `this` binding of the memoized function.
19751  *
19752  * **Note:** The cache is exposed as the `cache` property on the memoized
19753  * function. Its creation may be customized by replacing the `_.memoize.Cache`
19754  * constructor with one whose instances implement the
19755  * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
19756  * method interface of `clear`, `delete`, `get`, `has`, and `set`.
19757  *
19758  * @static
19759  * @memberOf _
19760  * @since 0.1.0
19761  * @category Function
19762  * @param {Function} func The function to have its output memoized.
19763  * @param {Function} [resolver] The function to resolve the cache key.
19764  * @returns {Function} Returns the new memoized function.
19765  * @example
19766  *
19767  * var object = { 'a': 1, 'b': 2 };
19768  * var other = { 'c': 3, 'd': 4 };
19769  *
19770  * var values = _.memoize(_.values);
19771  * values(object);
19772  * // => [1, 2]
19773  *
19774  * values(other);
19775  * // => [3, 4]
19776  *
19777  * object.a = 2;
19778  * values(object);
19779  * // => [1, 2]
19780  *
19781  * // Modify the result cache.
19782  * values.cache.set(object, ['a', 'b']);
19783  * values(object);
19784  * // => ['a', 'b']
19785  *
19786  * // Replace `_.memoize.Cache`.
19787  * _.memoize.Cache = WeakMap;
19788  */
19789 function memoize(func, resolver) {
19790   if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
19791     throw new TypeError(FUNC_ERROR_TEXT);
19792   }
19793   var memoized = function() {
19794     var args = arguments,
19795         key = resolver ? resolver.apply(this, args) : args[0],
19796         cache = memoized.cache;
19797
19798     if (cache.has(key)) {
19799       return cache.get(key);
19800     }
19801     var result = func.apply(this, args);
19802     memoized.cache = cache.set(key, result) || cache;
19803     return result;
19804   };
19805   memoized.cache = new (memoize.Cache || MapCache);
19806   return memoized;
19807 }
19808
19809 // Expose `MapCache`.
19810 memoize.Cache = MapCache;
19811
19812 /** Used as the maximum memoize cache size. */
19813 var MAX_MEMOIZE_SIZE = 500;
19814
19815 /**
19816  * A specialized version of `_.memoize` which clears the memoized function's
19817  * cache when it exceeds `MAX_MEMOIZE_SIZE`.
19818  *
19819  * @private
19820  * @param {Function} func The function to have its output memoized.
19821  * @returns {Function} Returns the new memoized function.
19822  */
19823 function memoizeCapped(func) {
19824   var result = memoize(func, function(key) {
19825     if (cache.size === MAX_MEMOIZE_SIZE) {
19826       cache.clear();
19827     }
19828     return key;
19829   });
19830
19831   var cache = result.cache;
19832   return result;
19833 }
19834
19835 /** Used to match property names within property paths. */
19836 var reLeadingDot = /^\./;
19837 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
19838
19839 /** Used to match backslashes in property paths. */
19840 var reEscapeChar = /\\(\\)?/g;
19841
19842 /**
19843  * Converts `string` to a property path array.
19844  *
19845  * @private
19846  * @param {string} string The string to convert.
19847  * @returns {Array} Returns the property path array.
19848  */
19849 var stringToPath = memoizeCapped(function(string) {
19850   var result = [];
19851   if (reLeadingDot.test(string)) {
19852     result.push('');
19853   }
19854   string.replace(rePropName, function(match, number, quote, string) {
19855     result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
19856   });
19857   return result;
19858 });
19859
19860 /**
19861  * A specialized version of `_.map` for arrays without support for iteratee
19862  * shorthands.
19863  *
19864  * @private
19865  * @param {Array} [array] The array to iterate over.
19866  * @param {Function} iteratee The function invoked per iteration.
19867  * @returns {Array} Returns the new mapped array.
19868  */
19869 function arrayMap(array, iteratee) {
19870   var index = -1,
19871       length = array == null ? 0 : array.length,
19872       result = Array(length);
19873
19874   while (++index < length) {
19875     result[index] = iteratee(array[index], index, array);
19876   }
19877   return result;
19878 }
19879
19880 /** Used as references for various `Number` constants. */
19881 var INFINITY = 1 / 0;
19882
19883 /** Used to convert symbols to primitives and strings. */
19884 var symbolProto$1 = Symbol ? Symbol.prototype : undefined;
19885 var symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined;
19886
19887 /**
19888  * The base implementation of `_.toString` which doesn't convert nullish
19889  * values to empty strings.
19890  *
19891  * @private
19892  * @param {*} value The value to process.
19893  * @returns {string} Returns the string.
19894  */
19895 function baseToString(value) {
19896   // Exit early for strings to avoid a performance hit in some environments.
19897   if (typeof value == 'string') {
19898     return value;
19899   }
19900   if (isArray(value)) {
19901     // Recursively convert values (susceptible to call stack limits).
19902     return arrayMap(value, baseToString) + '';
19903   }
19904   if (isSymbol(value)) {
19905     return symbolToString ? symbolToString.call(value) : '';
19906   }
19907   var result = (value + '');
19908   return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
19909 }
19910
19911 /**
19912  * Converts `value` to a string. An empty string is returned for `null`
19913  * and `undefined` values. The sign of `-0` is preserved.
19914  *
19915  * @static
19916  * @memberOf _
19917  * @since 4.0.0
19918  * @category Lang
19919  * @param {*} value The value to convert.
19920  * @returns {string} Returns the converted string.
19921  * @example
19922  *
19923  * _.toString(null);
19924  * // => ''
19925  *
19926  * _.toString(-0);
19927  * // => '-0'
19928  *
19929  * _.toString([1, 2, 3]);
19930  * // => '1,2,3'
19931  */
19932 function toString(value) {
19933   return value == null ? '' : baseToString(value);
19934 }
19935
19936 /**
19937  * Casts `value` to a path array if it's not one.
19938  *
19939  * @private
19940  * @param {*} value The value to inspect.
19941  * @param {Object} [object] The object to query keys on.
19942  * @returns {Array} Returns the cast property path array.
19943  */
19944 function castPath(value, object) {
19945   if (isArray(value)) {
19946     return value;
19947   }
19948   return isKey(value, object) ? [value] : stringToPath(toString(value));
19949 }
19950
19951 /** Used as references for various `Number` constants. */
19952 var INFINITY$1 = 1 / 0;
19953
19954 /**
19955  * Converts `value` to a string key if it's not a string or symbol.
19956  *
19957  * @private
19958  * @param {*} value The value to inspect.
19959  * @returns {string|symbol} Returns the key.
19960  */
19961 function toKey(value) {
19962   if (typeof value == 'string' || isSymbol(value)) {
19963     return value;
19964   }
19965   var result = (value + '');
19966   return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
19967 }
19968
19969 /**
19970  * The base implementation of `_.get` without support for default values.
19971  *
19972  * @private
19973  * @param {Object} object The object to query.
19974  * @param {Array|string} path The path of the property to get.
19975  * @returns {*} Returns the resolved value.
19976  */
19977 function baseGet(object, path) {
19978   path = castPath(path, object);
19979
19980   var index = 0,
19981       length = path.length;
19982
19983   while (object != null && index < length) {
19984     object = object[toKey(path[index++])];
19985   }
19986   return (index && index == length) ? object : undefined;
19987 }
19988
19989 /**
19990  * Gets the value at `path` of `object`. If the resolved value is
19991  * `undefined`, the `defaultValue` is returned in its place.
19992  *
19993  * @static
19994  * @memberOf _
19995  * @since 3.7.0
19996  * @category Object
19997  * @param {Object} object The object to query.
19998  * @param {Array|string} path The path of the property to get.
19999  * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20000  * @returns {*} Returns the resolved value.
20001  * @example
20002  *
20003  * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20004  *
20005  * _.get(object, 'a[0].b.c');
20006  * // => 3
20007  *
20008  * _.get(object, ['a', '0', 'b', 'c']);
20009  * // => 3
20010  *
20011  * _.get(object, 'a.b.c', 'default');
20012  * // => 'default'
20013  */
20014 function get$2(object, path, defaultValue) {
20015   var result = object == null ? undefined : baseGet(object, path);
20016   return result === undefined ? defaultValue : result;
20017 }
20018
20019 /**
20020  * The base implementation of `_.hasIn` without support for deep paths.
20021  *
20022  * @private
20023  * @param {Object} [object] The object to query.
20024  * @param {Array|string} key The key to check.
20025  * @returns {boolean} Returns `true` if `key` exists, else `false`.
20026  */
20027 function baseHasIn(object, key) {
20028   return object != null && key in Object(object);
20029 }
20030
20031 /**
20032  * Checks if `path` exists on `object`.
20033  *
20034  * @private
20035  * @param {Object} object The object to query.
20036  * @param {Array|string} path The path to check.
20037  * @param {Function} hasFunc The function to check properties.
20038  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20039  */
20040 function hasPath(object, path, hasFunc) {
20041   path = castPath(path, object);
20042
20043   var index = -1,
20044       length = path.length,
20045       result = false;
20046
20047   while (++index < length) {
20048     var key = toKey(path[index]);
20049     if (!(result = object != null && hasFunc(object, key))) {
20050       break;
20051     }
20052     object = object[key];
20053   }
20054   if (result || ++index != length) {
20055     return result;
20056   }
20057   length = object == null ? 0 : object.length;
20058   return !!length && isLength(length) && isIndex(key, length) &&
20059     (isArray(object) || isArguments(object));
20060 }
20061
20062 /**
20063  * Checks if `path` is a direct or inherited property of `object`.
20064  *
20065  * @static
20066  * @memberOf _
20067  * @since 4.0.0
20068  * @category Object
20069  * @param {Object} object The object to query.
20070  * @param {Array|string} path The path to check.
20071  * @returns {boolean} Returns `true` if `path` exists, else `false`.
20072  * @example
20073  *
20074  * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20075  *
20076  * _.hasIn(object, 'a');
20077  * // => true
20078  *
20079  * _.hasIn(object, 'a.b');
20080  * // => true
20081  *
20082  * _.hasIn(object, ['a', 'b']);
20083  * // => true
20084  *
20085  * _.hasIn(object, 'b');
20086  * // => false
20087  */
20088 function hasIn(object, path) {
20089   return object != null && hasPath(object, path, baseHasIn);
20090 }
20091
20092 /** Used to compose bitmasks for value comparisons. */
20093 var COMPARE_PARTIAL_FLAG$5 = 1;
20094 var COMPARE_UNORDERED_FLAG$3 = 2;
20095
20096 /**
20097  * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20098  *
20099  * @private
20100  * @param {string} path The path of the property to get.
20101  * @param {*} srcValue The value to match.
20102  * @returns {Function} Returns the new spec function.
20103  */
20104 function baseMatchesProperty(path, srcValue) {
20105   if (isKey(path) && isStrictComparable(srcValue)) {
20106     return matchesStrictComparable(toKey(path), srcValue);
20107   }
20108   return function(object) {
20109     var objValue = get$2(object, path);
20110     return (objValue === undefined && objValue === srcValue)
20111       ? hasIn(object, path)
20112       : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20113   };
20114 }
20115
20116 /**
20117  * The base implementation of `_.property` without support for deep paths.
20118  *
20119  * @private
20120  * @param {string} key The key of the property to get.
20121  * @returns {Function} Returns the new accessor function.
20122  */
20123 function baseProperty(key) {
20124   return function(object) {
20125     return object == null ? undefined : object[key];
20126   };
20127 }
20128
20129 /**
20130  * A specialized version of `baseProperty` which supports deep paths.
20131  *
20132  * @private
20133  * @param {Array|string} path The path of the property to get.
20134  * @returns {Function} Returns the new accessor function.
20135  */
20136 function basePropertyDeep(path) {
20137   return function(object) {
20138     return baseGet(object, path);
20139   };
20140 }
20141
20142 /**
20143  * Creates a function that returns the value at `path` of a given object.
20144  *
20145  * @static
20146  * @memberOf _
20147  * @since 2.4.0
20148  * @category Util
20149  * @param {Array|string} path The path of the property to get.
20150  * @returns {Function} Returns the new accessor function.
20151  * @example
20152  *
20153  * var objects = [
20154  *   { 'a': { 'b': 2 } },
20155  *   { 'a': { 'b': 1 } }
20156  * ];
20157  *
20158  * _.map(objects, _.property('a.b'));
20159  * // => [2, 1]
20160  *
20161  * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20162  * // => [1, 2]
20163  */
20164 function property(path) {
20165   return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20166 }
20167
20168 /**
20169  * The base implementation of `_.iteratee`.
20170  *
20171  * @private
20172  * @param {*} [value=_.identity] The value to convert to an iteratee.
20173  * @returns {Function} Returns the iteratee.
20174  */
20175 function baseIteratee(value) {
20176   // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20177   // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20178   if (typeof value == 'function') {
20179     return value;
20180   }
20181   if (value == null) {
20182     return identity$8;
20183   }
20184   if (typeof value == 'object') {
20185     return isArray(value)
20186       ? baseMatchesProperty(value[0], value[1])
20187       : baseMatches(value);
20188   }
20189   return property(value);
20190 }
20191
20192 /**
20193  * Iterates over elements of `collection`, returning an array of all elements
20194  * `predicate` returns truthy for. The predicate is invoked with three
20195  * arguments: (value, index|key, collection).
20196  *
20197  * **Note:** Unlike `_.remove`, this method returns a new array.
20198  *
20199  * @static
20200  * @memberOf _
20201  * @since 0.1.0
20202  * @category Collection
20203  * @param {Array|Object} collection The collection to iterate over.
20204  * @param {Function} [predicate=_.identity] The function invoked per iteration.
20205  * @returns {Array} Returns the new filtered array.
20206  * @see _.reject
20207  * @example
20208  *
20209  * var users = [
20210  *   { 'user': 'barney', 'age': 36, 'active': true },
20211  *   { 'user': 'fred',   'age': 40, 'active': false }
20212  * ];
20213  *
20214  * _.filter(users, function(o) { return !o.active; });
20215  * // => objects for ['fred']
20216  *
20217  * // The `_.matches` iteratee shorthand.
20218  * _.filter(users, { 'age': 36, 'active': true });
20219  * // => objects for ['barney']
20220  *
20221  * // The `_.matchesProperty` iteratee shorthand.
20222  * _.filter(users, ['active', false]);
20223  * // => objects for ['fred']
20224  *
20225  * // The `_.property` iteratee shorthand.
20226  * _.filter(users, 'active');
20227  * // => objects for ['barney']
20228  */
20229 function filter(collection, predicate) {
20230   var func = isArray(collection) ? arrayFilter : baseFilter;
20231   return func(collection, baseIteratee(predicate, 3));
20232 }
20233
20234 /**
20235  * Creates a `_.find` or `_.findLast` function.
20236  *
20237  * @private
20238  * @param {Function} findIndexFunc The function to find the collection index.
20239  * @returns {Function} Returns the new find function.
20240  */
20241 function createFind(findIndexFunc) {
20242   return function(collection, predicate, fromIndex) {
20243     var iterable = Object(collection);
20244     if (!isArrayLike(collection)) {
20245       var iteratee = baseIteratee(predicate, 3);
20246       collection = keys$1(collection);
20247       predicate = function(key) { return iteratee(iterable[key], key, iterable); };
20248     }
20249     var index = findIndexFunc(collection, predicate, fromIndex);
20250     return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
20251   };
20252 }
20253
20254 /**
20255  * The base implementation of `_.findIndex` and `_.findLastIndex` without
20256  * support for iteratee shorthands.
20257  *
20258  * @private
20259  * @param {Array} array The array to inspect.
20260  * @param {Function} predicate The function invoked per iteration.
20261  * @param {number} fromIndex The index to search from.
20262  * @param {boolean} [fromRight] Specify iterating from right to left.
20263  * @returns {number} Returns the index of the matched value, else `-1`.
20264  */
20265 function baseFindIndex(array, predicate, fromIndex, fromRight) {
20266   var length = array.length,
20267       index = fromIndex + (fromRight ? 1 : -1);
20268
20269   while ((fromRight ? index-- : ++index < length)) {
20270     if (predicate(array[index], index, array)) {
20271       return index;
20272     }
20273   }
20274   return -1;
20275 }
20276
20277 /** Used as references for various `Number` constants. */
20278 var NAN = 0 / 0;
20279
20280 /** Used to match leading and trailing whitespace. */
20281 var reTrim = /^\s+|\s+$/g;
20282
20283 /** Used to detect bad signed hexadecimal string values. */
20284 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
20285
20286 /** Used to detect binary string values. */
20287 var reIsBinary = /^0b[01]+$/i;
20288
20289 /** Used to detect octal string values. */
20290 var reIsOctal = /^0o[0-7]+$/i;
20291
20292 /** Built-in method references without a dependency on `root`. */
20293 var freeParseInt = parseInt;
20294
20295 /**
20296  * Converts `value` to a number.
20297  *
20298  * @static
20299  * @memberOf _
20300  * @since 4.0.0
20301  * @category Lang
20302  * @param {*} value The value to process.
20303  * @returns {number} Returns the number.
20304  * @example
20305  *
20306  * _.toNumber(3.2);
20307  * // => 3.2
20308  *
20309  * _.toNumber(Number.MIN_VALUE);
20310  * // => 5e-324
20311  *
20312  * _.toNumber(Infinity);
20313  * // => Infinity
20314  *
20315  * _.toNumber('3.2');
20316  * // => 3.2
20317  */
20318 function toNumber(value) {
20319   if (typeof value == 'number') {
20320     return value;
20321   }
20322   if (isSymbol(value)) {
20323     return NAN;
20324   }
20325   if (isObject(value)) {
20326     var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
20327     value = isObject(other) ? (other + '') : other;
20328   }
20329   if (typeof value != 'string') {
20330     return value === 0 ? value : +value;
20331   }
20332   value = value.replace(reTrim, '');
20333   var isBinary = reIsBinary.test(value);
20334   return (isBinary || reIsOctal.test(value))
20335     ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
20336     : (reIsBadHex.test(value) ? NAN : +value);
20337 }
20338
20339 /** Used as references for various `Number` constants. */
20340 var INFINITY$2 = 1 / 0;
20341 var MAX_INTEGER = 1.7976931348623157e+308;
20342
20343 /**
20344  * Converts `value` to a finite number.
20345  *
20346  * @static
20347  * @memberOf _
20348  * @since 4.12.0
20349  * @category Lang
20350  * @param {*} value The value to convert.
20351  * @returns {number} Returns the converted number.
20352  * @example
20353  *
20354  * _.toFinite(3.2);
20355  * // => 3.2
20356  *
20357  * _.toFinite(Number.MIN_VALUE);
20358  * // => 5e-324
20359  *
20360  * _.toFinite(Infinity);
20361  * // => 1.7976931348623157e+308
20362  *
20363  * _.toFinite('3.2');
20364  * // => 3.2
20365  */
20366 function toFinite(value) {
20367   if (!value) {
20368     return value === 0 ? value : 0;
20369   }
20370   value = toNumber(value);
20371   if (value === INFINITY$2 || value === -INFINITY$2) {
20372     var sign = (value < 0 ? -1 : 1);
20373     return sign * MAX_INTEGER;
20374   }
20375   return value === value ? value : 0;
20376 }
20377
20378 /**
20379  * Converts `value` to an integer.
20380  *
20381  * **Note:** This method is loosely based on
20382  * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
20383  *
20384  * @static
20385  * @memberOf _
20386  * @since 4.0.0
20387  * @category Lang
20388  * @param {*} value The value to convert.
20389  * @returns {number} Returns the converted integer.
20390  * @example
20391  *
20392  * _.toInteger(3.2);
20393  * // => 3
20394  *
20395  * _.toInteger(Number.MIN_VALUE);
20396  * // => 0
20397  *
20398  * _.toInteger(Infinity);
20399  * // => 1.7976931348623157e+308
20400  *
20401  * _.toInteger('3.2');
20402  * // => 3
20403  */
20404 function toInteger(value) {
20405   var result = toFinite(value),
20406       remainder = result % 1;
20407
20408   return result === result ? (remainder ? result - remainder : result) : 0;
20409 }
20410
20411 /* Built-in method references for those with the same name as other `lodash` methods. */
20412 var nativeMax$1 = Math.max;
20413
20414 /**
20415  * This method is like `_.find` except that it returns the index of the first
20416  * element `predicate` returns truthy for instead of the element itself.
20417  *
20418  * @static
20419  * @memberOf _
20420  * @since 1.1.0
20421  * @category Array
20422  * @param {Array} array The array to inspect.
20423  * @param {Function} [predicate=_.identity] The function invoked per iteration.
20424  * @param {number} [fromIndex=0] The index to search from.
20425  * @returns {number} Returns the index of the found element, else `-1`.
20426  * @example
20427  *
20428  * var users = [
20429  *   { 'user': 'barney',  'active': false },
20430  *   { 'user': 'fred',    'active': false },
20431  *   { 'user': 'pebbles', 'active': true }
20432  * ];
20433  *
20434  * _.findIndex(users, function(o) { return o.user == 'barney'; });
20435  * // => 0
20436  *
20437  * // The `_.matches` iteratee shorthand.
20438  * _.findIndex(users, { 'user': 'fred', 'active': false });
20439  * // => 1
20440  *
20441  * // The `_.matchesProperty` iteratee shorthand.
20442  * _.findIndex(users, ['active', false]);
20443  * // => 0
20444  *
20445  * // The `_.property` iteratee shorthand.
20446  * _.findIndex(users, 'active');
20447  * // => 2
20448  */
20449 function findIndex(array, predicate, fromIndex) {
20450   var length = array == null ? 0 : array.length;
20451   if (!length) {
20452     return -1;
20453   }
20454   var index = fromIndex == null ? 0 : toInteger(fromIndex);
20455   if (index < 0) {
20456     index = nativeMax$1(length + index, 0);
20457   }
20458   return baseFindIndex(array, baseIteratee(predicate, 3), index);
20459 }
20460
20461 /**
20462  * Iterates over elements of `collection`, returning the first element
20463  * `predicate` returns truthy for. The predicate is invoked with three
20464  * arguments: (value, index|key, collection).
20465  *
20466  * @static
20467  * @memberOf _
20468  * @since 0.1.0
20469  * @category Collection
20470  * @param {Array|Object} collection The collection to inspect.
20471  * @param {Function} [predicate=_.identity] The function invoked per iteration.
20472  * @param {number} [fromIndex=0] The index to search from.
20473  * @returns {*} Returns the matched element, else `undefined`.
20474  * @example
20475  *
20476  * var users = [
20477  *   { 'user': 'barney',  'age': 36, 'active': true },
20478  *   { 'user': 'fred',    'age': 40, 'active': false },
20479  *   { 'user': 'pebbles', 'age': 1,  'active': true }
20480  * ];
20481  *
20482  * _.find(users, function(o) { return o.age < 40; });
20483  * // => object for 'barney'
20484  *
20485  * // The `_.matches` iteratee shorthand.
20486  * _.find(users, { 'age': 1, 'active': true });
20487  * // => object for 'pebbles'
20488  *
20489  * // The `_.matchesProperty` iteratee shorthand.
20490  * _.find(users, ['active', false]);
20491  * // => object for 'fred'
20492  *
20493  * // The `_.property` iteratee shorthand.
20494  * _.find(users, 'active');
20495  * // => object for 'barney'
20496  */
20497 var find$1 = createFind(findIndex);
20498
20499 /**
20500  * The base implementation of `_.map` without support for iteratee shorthands.
20501  *
20502  * @private
20503  * @param {Array|Object} collection The collection to iterate over.
20504  * @param {Function} iteratee The function invoked per iteration.
20505  * @returns {Array} Returns the new mapped array.
20506  */
20507 function baseMap(collection, iteratee) {
20508   var index = -1,
20509       result = isArrayLike(collection) ? Array(collection.length) : [];
20510
20511   baseEach(collection, function(value, key, collection) {
20512     result[++index] = iteratee(value, key, collection);
20513   });
20514   return result;
20515 }
20516
20517 /**
20518  * Creates an array of values by running each element in `collection` thru
20519  * `iteratee`. The iteratee is invoked with three arguments:
20520  * (value, index|key, collection).
20521  *
20522  * Many lodash methods are guarded to work as iteratees for methods like
20523  * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
20524  *
20525  * The guarded methods are:
20526  * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
20527  * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
20528  * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
20529  * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
20530  *
20531  * @static
20532  * @memberOf _
20533  * @since 0.1.0
20534  * @category Collection
20535  * @param {Array|Object} collection The collection to iterate over.
20536  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
20537  * @returns {Array} Returns the new mapped array.
20538  * @example
20539  *
20540  * function square(n) {
20541  *   return n * n;
20542  * }
20543  *
20544  * _.map([4, 8], square);
20545  * // => [16, 64]
20546  *
20547  * _.map({ 'a': 4, 'b': 8 }, square);
20548  * // => [16, 64] (iteration order is not guaranteed)
20549  *
20550  * var users = [
20551  *   { 'user': 'barney' },
20552  *   { 'user': 'fred' }
20553  * ];
20554  *
20555  * // The `_.property` iteratee shorthand.
20556  * _.map(users, 'user');
20557  * // => ['barney', 'fred']
20558  */
20559 function map$4(collection, iteratee) {
20560   var func = isArray(collection) ? arrayMap : baseMap;
20561   return func(collection, baseIteratee(iteratee, 3));
20562 }
20563
20564 /**
20565  * The base implementation of `_.values` and `_.valuesIn` which creates an
20566  * array of `object` property values corresponding to the property names
20567  * of `props`.
20568  *
20569  * @private
20570  * @param {Object} object The object to query.
20571  * @param {Array} props The property names to get values for.
20572  * @returns {Object} Returns the array of property values.
20573  */
20574 function baseValues(object, props) {
20575   return arrayMap(props, function(key) {
20576     return object[key];
20577   });
20578 }
20579
20580 /**
20581  * Creates an array of the own enumerable string keyed property values of `object`.
20582  *
20583  * **Note:** Non-object values are coerced to objects.
20584  *
20585  * @static
20586  * @since 0.1.0
20587  * @memberOf _
20588  * @category Object
20589  * @param {Object} object The object to query.
20590  * @returns {Array} Returns the array of property values.
20591  * @example
20592  *
20593  * function Foo() {
20594  *   this.a = 1;
20595  *   this.b = 2;
20596  * }
20597  *
20598  * Foo.prototype.c = 3;
20599  *
20600  * _.values(new Foo);
20601  * // => [1, 2] (iteration order is not guaranteed)
20602  *
20603  * _.values('hi');
20604  * // => ['h', 'i']
20605  */
20606 function values$1(object) {
20607   return object == null ? [] : baseValues(object, keys$1(object));
20608 }
20609
20610 /**
20611  * A specialized version of `_.forEach` for arrays without support for
20612  * iteratee shorthands.
20613  *
20614  * @private
20615  * @param {Array} [array] The array to iterate over.
20616  * @param {Function} iteratee The function invoked per iteration.
20617  * @returns {Array} Returns `array`.
20618  */
20619 function arrayEach(array, iteratee) {
20620   var index = -1,
20621       length = array == null ? 0 : array.length;
20622
20623   while (++index < length) {
20624     if (iteratee(array[index], index, array) === false) {
20625       break;
20626     }
20627   }
20628   return array;
20629 }
20630
20631 /**
20632  * The base implementation of `_.assign` without support for multiple sources
20633  * or `customizer` functions.
20634  *
20635  * @private
20636  * @param {Object} object The destination object.
20637  * @param {Object} source The source object.
20638  * @returns {Object} Returns `object`.
20639  */
20640 function baseAssign(object, source) {
20641   return object && copyObject(source, keys$1(source), object);
20642 }
20643
20644 /**
20645  * The base implementation of `_.assignIn` without support for multiple sources
20646  * or `customizer` functions.
20647  *
20648  * @private
20649  * @param {Object} object The destination object.
20650  * @param {Object} source The source object.
20651  * @returns {Object} Returns `object`.
20652  */
20653 function baseAssignIn(object, source) {
20654   return object && copyObject(source, keysIn$1(source), object);
20655 }
20656
20657 /** Detect free variable `exports`. */
20658 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
20659
20660 /** Detect free variable `module`. */
20661 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
20662
20663 /** Detect the popular CommonJS extension `module.exports`. */
20664 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
20665
20666 /** Built-in value references. */
20667 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined;
20668 var allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
20669
20670 /**
20671  * Creates a clone of  `buffer`.
20672  *
20673  * @private
20674  * @param {Buffer} buffer The buffer to clone.
20675  * @param {boolean} [isDeep] Specify a deep clone.
20676  * @returns {Buffer} Returns the cloned buffer.
20677  */
20678 function cloneBuffer(buffer, isDeep) {
20679   if (isDeep) {
20680     return buffer.slice();
20681   }
20682   var length = buffer.length,
20683       result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
20684
20685   buffer.copy(result);
20686   return result;
20687 }
20688
20689 /**
20690  * Copies the values of `source` to `array`.
20691  *
20692  * @private
20693  * @param {Array} source The array to copy values from.
20694  * @param {Array} [array=[]] The array to copy values to.
20695  * @returns {Array} Returns `array`.
20696  */
20697 function copyArray(source, array) {
20698   var index = -1,
20699       length = source.length;
20700
20701   array || (array = Array(length));
20702   while (++index < length) {
20703     array[index] = source[index];
20704   }
20705   return array;
20706 }
20707
20708 /**
20709  * Copies own symbols of `source` to `object`.
20710  *
20711  * @private
20712  * @param {Object} source The object to copy symbols from.
20713  * @param {Object} [object={}] The object to copy symbols to.
20714  * @returns {Object} Returns `object`.
20715  */
20716 function copySymbols(source, object) {
20717   return copyObject(source, getSymbols(source), object);
20718 }
20719
20720 /** Built-in value references. */
20721 var getPrototype = overArg(Object.getPrototypeOf, Object);
20722
20723 /* Built-in method references for those with the same name as other `lodash` methods. */
20724 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
20725
20726 /**
20727  * Creates an array of the own and inherited enumerable symbols of `object`.
20728  *
20729  * @private
20730  * @param {Object} object The object to query.
20731  * @returns {Array} Returns the array of symbols.
20732  */
20733 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
20734   var result = [];
20735   while (object) {
20736     arrayPush(result, getSymbols(object));
20737     object = getPrototype(object);
20738   }
20739   return result;
20740 };
20741
20742 /**
20743  * Copies own and inherited symbols of `source` to `object`.
20744  *
20745  * @private
20746  * @param {Object} source The object to copy symbols from.
20747  * @param {Object} [object={}] The object to copy symbols to.
20748  * @returns {Object} Returns `object`.
20749  */
20750 function copySymbolsIn(source, object) {
20751   return copyObject(source, getSymbolsIn(source), object);
20752 }
20753
20754 /**
20755  * Creates an array of own and inherited enumerable property names and
20756  * symbols of `object`.
20757  *
20758  * @private
20759  * @param {Object} object The object to query.
20760  * @returns {Array} Returns the array of property names and symbols.
20761  */
20762 function getAllKeysIn(object) {
20763   return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
20764 }
20765
20766 /** Used for built-in method references. */
20767 var objectProto$14 = Object.prototype;
20768
20769 /** Used to check objects for own properties. */
20770 var hasOwnProperty$11 = objectProto$14.hasOwnProperty;
20771
20772 /**
20773  * Initializes an array clone.
20774  *
20775  * @private
20776  * @param {Array} array The array to clone.
20777  * @returns {Array} Returns the initialized clone.
20778  */
20779 function initCloneArray(array) {
20780   var length = array.length,
20781       result = array.constructor(length);
20782
20783   // Add properties assigned by `RegExp#exec`.
20784   if (length && typeof array[0] == 'string' && hasOwnProperty$11.call(array, 'index')) {
20785     result.index = array.index;
20786     result.input = array.input;
20787   }
20788   return result;
20789 }
20790
20791 /**
20792  * Creates a clone of `arrayBuffer`.
20793  *
20794  * @private
20795  * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
20796  * @returns {ArrayBuffer} Returns the cloned array buffer.
20797  */
20798 function cloneArrayBuffer(arrayBuffer) {
20799   var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
20800   new Uint8Array(result).set(new Uint8Array(arrayBuffer));
20801   return result;
20802 }
20803
20804 /**
20805  * Creates a clone of `dataView`.
20806  *
20807  * @private
20808  * @param {Object} dataView The data view to clone.
20809  * @param {boolean} [isDeep] Specify a deep clone.
20810  * @returns {Object} Returns the cloned data view.
20811  */
20812 function cloneDataView(dataView, isDeep) {
20813   var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
20814   return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
20815 }
20816
20817 /**
20818  * Adds the key-value `pair` to `map`.
20819  *
20820  * @private
20821  * @param {Object} map The map to modify.
20822  * @param {Array} pair The key-value pair to add.
20823  * @returns {Object} Returns `map`.
20824  */
20825 function addMapEntry(map, pair) {
20826   // Don't return `map.set` because it's not chainable in IE 11.
20827   map.set(pair[0], pair[1]);
20828   return map;
20829 }
20830
20831 /**
20832  * A specialized version of `_.reduce` for arrays without support for
20833  * iteratee shorthands.
20834  *
20835  * @private
20836  * @param {Array} [array] The array to iterate over.
20837  * @param {Function} iteratee The function invoked per iteration.
20838  * @param {*} [accumulator] The initial value.
20839  * @param {boolean} [initAccum] Specify using the first element of `array` as
20840  *  the initial value.
20841  * @returns {*} Returns the accumulated value.
20842  */
20843 function arrayReduce(array, iteratee, accumulator, initAccum) {
20844   var index = -1,
20845       length = array == null ? 0 : array.length;
20846
20847   if (initAccum && length) {
20848     accumulator = array[++index];
20849   }
20850   while (++index < length) {
20851     accumulator = iteratee(accumulator, array[index], index, array);
20852   }
20853   return accumulator;
20854 }
20855
20856 /** Used to compose bitmasks for cloning. */
20857 var CLONE_DEEP_FLAG$1 = 1;
20858
20859 /**
20860  * Creates a clone of `map`.
20861  *
20862  * @private
20863  * @param {Object} map The map to clone.
20864  * @param {Function} cloneFunc The function to clone values.
20865  * @param {boolean} [isDeep] Specify a deep clone.
20866  * @returns {Object} Returns the cloned map.
20867  */
20868 function cloneMap(map, isDeep, cloneFunc) {
20869   var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG$1) : mapToArray(map);
20870   return arrayReduce(array, addMapEntry, new map.constructor);
20871 }
20872
20873 /** Used to match `RegExp` flags from their coerced string values. */
20874 var reFlags = /\w*$/;
20875
20876 /**
20877  * Creates a clone of `regexp`.
20878  *
20879  * @private
20880  * @param {Object} regexp The regexp to clone.
20881  * @returns {Object} Returns the cloned regexp.
20882  */
20883 function cloneRegExp(regexp) {
20884   var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
20885   result.lastIndex = regexp.lastIndex;
20886   return result;
20887 }
20888
20889 /**
20890  * Adds `value` to `set`.
20891  *
20892  * @private
20893  * @param {Object} set The set to modify.
20894  * @param {*} value The value to add.
20895  * @returns {Object} Returns `set`.
20896  */
20897 function addSetEntry(set, value) {
20898   // Don't return `set.add` because it's not chainable in IE 11.
20899   set.add(value);
20900   return set;
20901 }
20902
20903 /** Used to compose bitmasks for cloning. */
20904 var CLONE_DEEP_FLAG$2 = 1;
20905
20906 /**
20907  * Creates a clone of `set`.
20908  *
20909  * @private
20910  * @param {Object} set The set to clone.
20911  * @param {Function} cloneFunc The function to clone values.
20912  * @param {boolean} [isDeep] Specify a deep clone.
20913  * @returns {Object} Returns the cloned set.
20914  */
20915 function cloneSet(set, isDeep, cloneFunc) {
20916   var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG$2) : setToArray(set);
20917   return arrayReduce(array, addSetEntry, new set.constructor);
20918 }
20919
20920 /** Used to convert symbols to primitives and strings. */
20921 var symbolProto$2 = Symbol ? Symbol.prototype : undefined;
20922 var symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined;
20923
20924 /**
20925  * Creates a clone of the `symbol` object.
20926  *
20927  * @private
20928  * @param {Object} symbol The symbol object to clone.
20929  * @returns {Object} Returns the cloned symbol object.
20930  */
20931 function cloneSymbol(symbol) {
20932   return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {};
20933 }
20934
20935 /**
20936  * Creates a clone of `typedArray`.
20937  *
20938  * @private
20939  * @param {Object} typedArray The typed array to clone.
20940  * @param {boolean} [isDeep] Specify a deep clone.
20941  * @returns {Object} Returns the cloned typed array.
20942  */
20943 function cloneTypedArray(typedArray, isDeep) {
20944   var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
20945   return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
20946 }
20947
20948 /** `Object#toString` result references. */
20949 var boolTag$3 = '[object Boolean]';
20950 var dateTag$3 = '[object Date]';
20951 var mapTag$4 = '[object Map]';
20952 var numberTag$3 = '[object Number]';
20953 var regexpTag$3 = '[object RegExp]';
20954 var setTag$4 = '[object Set]';
20955 var stringTag$3 = '[object String]';
20956 var symbolTag$3 = '[object Symbol]';
20957
20958 var arrayBufferTag$3 = '[object ArrayBuffer]';
20959 var dataViewTag$4 = '[object DataView]';
20960 var float32Tag$2 = '[object Float32Array]';
20961 var float64Tag$2 = '[object Float64Array]';
20962 var int8Tag$2 = '[object Int8Array]';
20963 var int16Tag$2 = '[object Int16Array]';
20964 var int32Tag$2 = '[object Int32Array]';
20965 var uint8Tag$2 = '[object Uint8Array]';
20966 var uint8ClampedTag$2 = '[object Uint8ClampedArray]';
20967 var uint16Tag$2 = '[object Uint16Array]';
20968 var uint32Tag$2 = '[object Uint32Array]';
20969
20970 /**
20971  * Initializes an object clone based on its `toStringTag`.
20972  *
20973  * **Note:** This function only supports cloning values with tags of
20974  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
20975  *
20976  * @private
20977  * @param {Object} object The object to clone.
20978  * @param {string} tag The `toStringTag` of the object to clone.
20979  * @param {Function} cloneFunc The function to clone values.
20980  * @param {boolean} [isDeep] Specify a deep clone.
20981  * @returns {Object} Returns the initialized clone.
20982  */
20983 function initCloneByTag(object, tag, cloneFunc, isDeep) {
20984   var Ctor = object.constructor;
20985   switch (tag) {
20986     case arrayBufferTag$3:
20987       return cloneArrayBuffer(object);
20988
20989     case boolTag$3:
20990     case dateTag$3:
20991       return new Ctor(+object);
20992
20993     case dataViewTag$4:
20994       return cloneDataView(object, isDeep);
20995
20996     case float32Tag$2: case float64Tag$2:
20997     case int8Tag$2: case int16Tag$2: case int32Tag$2:
20998     case uint8Tag$2: case uint8ClampedTag$2: case uint16Tag$2: case uint32Tag$2:
20999       return cloneTypedArray(object, isDeep);
21000
21001     case mapTag$4:
21002       return cloneMap(object, isDeep, cloneFunc);
21003
21004     case numberTag$3:
21005     case stringTag$3:
21006       return new Ctor(object);
21007
21008     case regexpTag$3:
21009       return cloneRegExp(object);
21010
21011     case setTag$4:
21012       return cloneSet(object, isDeep, cloneFunc);
21013
21014     case symbolTag$3:
21015       return cloneSymbol(object);
21016   }
21017 }
21018
21019 /** Built-in value references. */
21020 var objectCreate = Object.create;
21021
21022 /**
21023  * The base implementation of `_.create` without support for assigning
21024  * properties to the created object.
21025  *
21026  * @private
21027  * @param {Object} proto The object to inherit from.
21028  * @returns {Object} Returns the new object.
21029  */
21030 var baseCreate = (function() {
21031   function object() {}
21032   return function(proto) {
21033     if (!isObject(proto)) {
21034       return {};
21035     }
21036     if (objectCreate) {
21037       return objectCreate(proto);
21038     }
21039     object.prototype = proto;
21040     var result = new object;
21041     object.prototype = undefined;
21042     return result;
21043   };
21044 }());
21045
21046 /**
21047  * Initializes an object clone.
21048  *
21049  * @private
21050  * @param {Object} object The object to clone.
21051  * @returns {Object} Returns the initialized clone.
21052  */
21053 function initCloneObject(object) {
21054   return (typeof object.constructor == 'function' && !isPrototype(object))
21055     ? baseCreate(getPrototype(object))
21056     : {};
21057 }
21058
21059 /** Used to compose bitmasks for cloning. */
21060 var CLONE_DEEP_FLAG = 1;
21061 var CLONE_FLAT_FLAG = 2;
21062 var CLONE_SYMBOLS_FLAG$1 = 4;
21063
21064 /** `Object#toString` result references. */
21065 var argsTag$3 = '[object Arguments]';
21066 var arrayTag$2 = '[object Array]';
21067 var boolTag$2 = '[object Boolean]';
21068 var dateTag$2 = '[object Date]';
21069 var errorTag$2 = '[object Error]';
21070 var funcTag$2 = '[object Function]';
21071 var genTag$1 = '[object GeneratorFunction]';
21072 var mapTag$3 = '[object Map]';
21073 var numberTag$2 = '[object Number]';
21074 var objectTag$3 = '[object Object]';
21075 var regexpTag$2 = '[object RegExp]';
21076 var setTag$3 = '[object Set]';
21077 var stringTag$2 = '[object String]';
21078 var symbolTag$2 = '[object Symbol]';
21079 var weakMapTag$2 = '[object WeakMap]';
21080
21081 var arrayBufferTag$2 = '[object ArrayBuffer]';
21082 var dataViewTag$3 = '[object DataView]';
21083 var float32Tag$1 = '[object Float32Array]';
21084 var float64Tag$1 = '[object Float64Array]';
21085 var int8Tag$1 = '[object Int8Array]';
21086 var int16Tag$1 = '[object Int16Array]';
21087 var int32Tag$1 = '[object Int32Array]';
21088 var uint8Tag$1 = '[object Uint8Array]';
21089 var uint8ClampedTag$1 = '[object Uint8ClampedArray]';
21090 var uint16Tag$1 = '[object Uint16Array]';
21091 var uint32Tag$1 = '[object Uint32Array]';
21092
21093 /** Used to identify `toStringTag` values supported by `_.clone`. */
21094 var cloneableTags = {};
21095 cloneableTags[argsTag$3] = cloneableTags[arrayTag$2] =
21096 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
21097 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
21098 cloneableTags[float32Tag$1] = cloneableTags[float64Tag$1] =
21099 cloneableTags[int8Tag$1] = cloneableTags[int16Tag$1] =
21100 cloneableTags[int32Tag$1] = cloneableTags[mapTag$3] =
21101 cloneableTags[numberTag$2] = cloneableTags[objectTag$3] =
21102 cloneableTags[regexpTag$2] = cloneableTags[setTag$3] =
21103 cloneableTags[stringTag$2] = cloneableTags[symbolTag$2] =
21104 cloneableTags[uint8Tag$1] = cloneableTags[uint8ClampedTag$1] =
21105 cloneableTags[uint16Tag$1] = cloneableTags[uint32Tag$1] = true;
21106 cloneableTags[errorTag$2] = cloneableTags[funcTag$2] =
21107 cloneableTags[weakMapTag$2] = false;
21108
21109 /**
21110  * The base implementation of `_.clone` and `_.cloneDeep` which tracks
21111  * traversed objects.
21112  *
21113  * @private
21114  * @param {*} value The value to clone.
21115  * @param {boolean} bitmask The bitmask flags.
21116  *  1 - Deep clone
21117  *  2 - Flatten inherited properties
21118  *  4 - Clone symbols
21119  * @param {Function} [customizer] The function to customize cloning.
21120  * @param {string} [key] The key of `value`.
21121  * @param {Object} [object] The parent object of `value`.
21122  * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
21123  * @returns {*} Returns the cloned value.
21124  */
21125 function baseClone(value, bitmask, customizer, key, object, stack) {
21126   var result,
21127       isDeep = bitmask & CLONE_DEEP_FLAG,
21128       isFlat = bitmask & CLONE_FLAT_FLAG,
21129       isFull = bitmask & CLONE_SYMBOLS_FLAG$1;
21130
21131   if (customizer) {
21132     result = object ? customizer(value, key, object, stack) : customizer(value);
21133   }
21134   if (result !== undefined) {
21135     return result;
21136   }
21137   if (!isObject(value)) {
21138     return value;
21139   }
21140   var isArr = isArray(value);
21141   if (isArr) {
21142     result = initCloneArray(value);
21143     if (!isDeep) {
21144       return copyArray(value, result);
21145     }
21146   } else {
21147     var tag = getTag$1(value),
21148         isFunc = tag == funcTag$2 || tag == genTag$1;
21149
21150     if (isBuffer(value)) {
21151       return cloneBuffer(value, isDeep);
21152     }
21153     if (tag == objectTag$3 || tag == argsTag$3 || (isFunc && !object)) {
21154       result = (isFlat || isFunc) ? {} : initCloneObject(value);
21155       if (!isDeep) {
21156         return isFlat
21157           ? copySymbolsIn(value, baseAssignIn(result, value))
21158           : copySymbols(value, baseAssign(result, value));
21159       }
21160     } else {
21161       if (!cloneableTags[tag]) {
21162         return object ? value : {};
21163       }
21164       result = initCloneByTag(value, tag, baseClone, isDeep);
21165     }
21166   }
21167   // Check for circular references and return its corresponding clone.
21168   stack || (stack = new Stack);
21169   var stacked = stack.get(value);
21170   if (stacked) {
21171     return stacked;
21172   }
21173   stack.set(value, result);
21174
21175   var keysFunc = isFull
21176     ? (isFlat ? getAllKeysIn : getAllKeys)
21177     : (isFlat ? keysIn : keys$1);
21178
21179   var props = isArr ? undefined : keysFunc(value);
21180   arrayEach(props || value, function(subValue, key) {
21181     if (props) {
21182       key = subValue;
21183       subValue = value[key];
21184     }
21185     // Recursively populate clone (susceptible to call stack limits).
21186     assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
21187   });
21188   return result;
21189 }
21190
21191 /** Used to compose bitmasks for cloning. */
21192 var CLONE_SYMBOLS_FLAG = 4;
21193
21194 /**
21195  * Creates a shallow clone of `value`.
21196  *
21197  * **Note:** This method is loosely based on the
21198  * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
21199  * and supports cloning arrays, array buffers, booleans, date objects, maps,
21200  * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
21201  * arrays. The own enumerable properties of `arguments` objects are cloned
21202  * as plain objects. An empty object is returned for uncloneable values such
21203  * as error objects, functions, DOM nodes, and WeakMaps.
21204  *
21205  * @static
21206  * @memberOf _
21207  * @since 0.1.0
21208  * @category Lang
21209  * @param {*} value The value to clone.
21210  * @returns {*} Returns the cloned value.
21211  * @see _.cloneDeep
21212  * @example
21213  *
21214  * var objects = [{ 'a': 1 }, { 'b': 2 }];
21215  *
21216  * var shallow = _.clone(objects);
21217  * console.log(shallow[0] === objects[0]);
21218  * // => true
21219  */
21220 function clone(value) {
21221   return baseClone(value, CLONE_SYMBOLS_FLAG);
21222 }
21223
21224 /**
21225  * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21226  * of key-value pairs for `object` corresponding to the property names of `props`.
21227  *
21228  * @private
21229  * @param {Object} object The object to query.
21230  * @param {Array} props The property names to get values for.
21231  * @returns {Object} Returns the key-value pairs.
21232  */
21233 function baseToPairs(object, props) {
21234   return arrayMap(props, function(key) {
21235     return [key, object[key]];
21236   });
21237 }
21238
21239 /**
21240  * Converts `set` to its value-value pairs.
21241  *
21242  * @private
21243  * @param {Object} set The set to convert.
21244  * @returns {Array} Returns the value-value pairs.
21245  */
21246 function setToPairs(set) {
21247   var index = -1,
21248       result = Array(set.size);
21249
21250   set.forEach(function(value) {
21251     result[++index] = [value, value];
21252   });
21253   return result;
21254 }
21255
21256 /** `Object#toString` result references. */
21257 var mapTag$5 = '[object Map]';
21258 var setTag$5 = '[object Set]';
21259
21260 /**
21261  * Creates a `_.toPairs` or `_.toPairsIn` function.
21262  *
21263  * @private
21264  * @param {Function} keysFunc The function to get the keys of a given object.
21265  * @returns {Function} Returns the new pairs function.
21266  */
21267 function createToPairs(keysFunc) {
21268   return function(object) {
21269     var tag = getTag$1(object);
21270     if (tag == mapTag$5) {
21271       return mapToArray(object);
21272     }
21273     if (tag == setTag$5) {
21274       return setToPairs(object);
21275     }
21276     return baseToPairs(object, keysFunc(object));
21277   };
21278 }
21279
21280 /**
21281  * Creates an array of own enumerable string keyed-value pairs for `object`
21282  * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21283  * entries are returned.
21284  *
21285  * @static
21286  * @memberOf _
21287  * @since 4.0.0
21288  * @alias entries
21289  * @category Object
21290  * @param {Object} object The object to query.
21291  * @returns {Array} Returns the key-value pairs.
21292  * @example
21293  *
21294  * function Foo() {
21295  *   this.a = 1;
21296  *   this.b = 2;
21297  * }
21298  *
21299  * Foo.prototype.c = 3;
21300  *
21301  * _.toPairs(new Foo);
21302  * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21303  */
21304 var toPairs = createToPairs(keys$1);
21305
21306 /** Built-in value references. */
21307 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
21308
21309 /**
21310  * Checks if `value` is a flattenable `arguments` object or array.
21311  *
21312  * @private
21313  * @param {*} value The value to check.
21314  * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
21315  */
21316 function isFlattenable(value) {
21317   return isArray(value) || isArguments(value) ||
21318     !!(spreadableSymbol && value && value[spreadableSymbol]);
21319 }
21320
21321 /**
21322  * The base implementation of `_.flatten` with support for restricting flattening.
21323  *
21324  * @private
21325  * @param {Array} array The array to flatten.
21326  * @param {number} depth The maximum recursion depth.
21327  * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
21328  * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
21329  * @param {Array} [result=[]] The initial result value.
21330  * @returns {Array} Returns the new flattened array.
21331  */
21332 function baseFlatten(array, depth, predicate, isStrict, result) {
21333   var index = -1,
21334       length = array.length;
21335
21336   predicate || (predicate = isFlattenable);
21337   result || (result = []);
21338
21339   while (++index < length) {
21340     var value = array[index];
21341     if (depth > 0 && predicate(value)) {
21342       if (depth > 1) {
21343         // Recursively flatten arrays (susceptible to call stack limits).
21344         baseFlatten(value, depth - 1, predicate, isStrict, result);
21345       } else {
21346         arrayPush(result, value);
21347       }
21348     } else if (!isStrict) {
21349       result[result.length] = value;
21350     }
21351   }
21352   return result;
21353 }
21354
21355 /**
21356  * The base implementation of `_.isNaN` without support for number objects.
21357  *
21358  * @private
21359  * @param {*} value The value to check.
21360  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21361  */
21362 function baseIsNaN(value) {
21363   return value !== value;
21364 }
21365
21366 /**
21367  * A specialized version of `_.indexOf` which performs strict equality
21368  * comparisons of values, i.e. `===`.
21369  *
21370  * @private
21371  * @param {Array} array The array to inspect.
21372  * @param {*} value The value to search for.
21373  * @param {number} fromIndex The index to search from.
21374  * @returns {number} Returns the index of the matched value, else `-1`.
21375  */
21376 function strictIndexOf(array, value, fromIndex) {
21377   var index = fromIndex - 1,
21378       length = array.length;
21379
21380   while (++index < length) {
21381     if (array[index] === value) {
21382       return index;
21383     }
21384   }
21385   return -1;
21386 }
21387
21388 /**
21389  * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21390  *
21391  * @private
21392  * @param {Array} array The array to inspect.
21393  * @param {*} value The value to search for.
21394  * @param {number} fromIndex The index to search from.
21395  * @returns {number} Returns the index of the matched value, else `-1`.
21396  */
21397 function baseIndexOf(array, value, fromIndex) {
21398   return value === value
21399     ? strictIndexOf(array, value, fromIndex)
21400     : baseFindIndex(array, baseIsNaN, fromIndex);
21401 }
21402
21403 /**
21404  * A specialized version of `_.includes` for arrays without support for
21405  * specifying an index to search from.
21406  *
21407  * @private
21408  * @param {Array} [array] The array to inspect.
21409  * @param {*} target The value to search for.
21410  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21411  */
21412 function arrayIncludes(array, value) {
21413   var length = array == null ? 0 : array.length;
21414   return !!length && baseIndexOf(array, value, 0) > -1;
21415 }
21416
21417 /**
21418  * This function is like `arrayIncludes` except that it accepts a comparator.
21419  *
21420  * @private
21421  * @param {Array} [array] The array to inspect.
21422  * @param {*} target The value to search for.
21423  * @param {Function} comparator The comparator invoked per element.
21424  * @returns {boolean} Returns `true` if `target` is found, else `false`.
21425  */
21426 function arrayIncludesWith(array, value, comparator) {
21427   var index = -1,
21428       length = array == null ? 0 : array.length;
21429
21430   while (++index < length) {
21431     if (comparator(value, array[index])) {
21432       return true;
21433     }
21434   }
21435   return false;
21436 }
21437
21438 /**
21439  * This method returns `undefined`.
21440  *
21441  * @static
21442  * @memberOf _
21443  * @since 2.3.0
21444  * @category Util
21445  * @example
21446  *
21447  * _.times(2, _.noop);
21448  * // => [undefined, undefined]
21449  */
21450 function noop$3() {
21451   // No operation performed.
21452 }
21453
21454 /** Used as references for various `Number` constants. */
21455 var INFINITY$3 = 1 / 0;
21456
21457 /**
21458  * Creates a set object of `values`.
21459  *
21460  * @private
21461  * @param {Array} values The values to add to the set.
21462  * @returns {Object} Returns the new set.
21463  */
21464 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21465   return new Set$1(values);
21466 };
21467
21468 /** Used as the size to enable large array optimizations. */
21469 var LARGE_ARRAY_SIZE$1 = 200;
21470
21471 /**
21472  * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21473  *
21474  * @private
21475  * @param {Array} array The array to inspect.
21476  * @param {Function} [iteratee] The iteratee invoked per element.
21477  * @param {Function} [comparator] The comparator invoked per element.
21478  * @returns {Array} Returns the new duplicate free array.
21479  */
21480 function baseUniq(array, iteratee, comparator) {
21481   var index = -1,
21482       includes = arrayIncludes,
21483       length = array.length,
21484       isCommon = true,
21485       result = [],
21486       seen = result;
21487
21488   if (comparator) {
21489     isCommon = false;
21490     includes = arrayIncludesWith;
21491   }
21492   else if (length >= LARGE_ARRAY_SIZE$1) {
21493     var set = iteratee ? null : createSet(array);
21494     if (set) {
21495       return setToArray(set);
21496     }
21497     isCommon = false;
21498     includes = cacheHas;
21499     seen = new SetCache;
21500   }
21501   else {
21502     seen = iteratee ? [] : result;
21503   }
21504   outer:
21505   while (++index < length) {
21506     var value = array[index],
21507         computed = iteratee ? iteratee(value) : value;
21508
21509     value = (comparator || value !== 0) ? value : 0;
21510     if (isCommon && computed === computed) {
21511       var seenIndex = seen.length;
21512       while (seenIndex--) {
21513         if (seen[seenIndex] === computed) {
21514           continue outer;
21515         }
21516       }
21517       if (iteratee) {
21518         seen.push(computed);
21519       }
21520       result.push(value);
21521     }
21522     else if (!includes(seen, computed, comparator)) {
21523       if (seen !== result) {
21524         seen.push(computed);
21525       }
21526       result.push(value);
21527     }
21528   }
21529   return result;
21530 }
21531
21532 /**
21533  * This method is like `_.isArrayLike` except that it also checks if `value`
21534  * is an object.
21535  *
21536  * @static
21537  * @memberOf _
21538  * @since 4.0.0
21539  * @category Lang
21540  * @param {*} value The value to check.
21541  * @returns {boolean} Returns `true` if `value` is an array-like object,
21542  *  else `false`.
21543  * @example
21544  *
21545  * _.isArrayLikeObject([1, 2, 3]);
21546  * // => true
21547  *
21548  * _.isArrayLikeObject(document.body.children);
21549  * // => true
21550  *
21551  * _.isArrayLikeObject('abc');
21552  * // => false
21553  *
21554  * _.isArrayLikeObject(_.noop);
21555  * // => false
21556  */
21557 function isArrayLikeObject(value) {
21558   return isObjectLike(value) && isArrayLike(value);
21559 }
21560
21561 /**
21562  * Creates an array of unique values, in order, from all given arrays using
21563  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21564  * for equality comparisons.
21565  *
21566  * @static
21567  * @memberOf _
21568  * @since 0.1.0
21569  * @category Array
21570  * @param {...Array} [arrays] The arrays to inspect.
21571  * @returns {Array} Returns the new array of combined values.
21572  * @example
21573  *
21574  * _.union([2], [1, 2]);
21575  * // => [2, 1]
21576  */
21577 var union = baseRest(function(arrays) {
21578   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
21579 });
21580
21581 /** Used as the size to enable large array optimizations. */
21582 var LARGE_ARRAY_SIZE$2 = 200;
21583
21584 /**
21585  * The base implementation of methods like `_.difference` without support
21586  * for excluding multiple arrays or iteratee shorthands.
21587  *
21588  * @private
21589  * @param {Array} array The array to inspect.
21590  * @param {Array} values The values to exclude.
21591  * @param {Function} [iteratee] The iteratee invoked per element.
21592  * @param {Function} [comparator] The comparator invoked per element.
21593  * @returns {Array} Returns the new array of filtered values.
21594  */
21595 function baseDifference(array, values, iteratee, comparator) {
21596   var index = -1,
21597       includes = arrayIncludes,
21598       isCommon = true,
21599       length = array.length,
21600       result = [],
21601       valuesLength = values.length;
21602
21603   if (!length) {
21604     return result;
21605   }
21606   if (iteratee) {
21607     values = arrayMap(values, baseUnary(iteratee));
21608   }
21609   if (comparator) {
21610     includes = arrayIncludesWith;
21611     isCommon = false;
21612   }
21613   else if (values.length >= LARGE_ARRAY_SIZE$2) {
21614     includes = cacheHas;
21615     isCommon = false;
21616     values = new SetCache(values);
21617   }
21618   outer:
21619   while (++index < length) {
21620     var value = array[index],
21621         computed = iteratee == null ? value : iteratee(value);
21622
21623     value = (comparator || value !== 0) ? value : 0;
21624     if (isCommon && computed === computed) {
21625       var valuesIndex = valuesLength;
21626       while (valuesIndex--) {
21627         if (values[valuesIndex] === computed) {
21628           continue outer;
21629         }
21630       }
21631       result.push(value);
21632     }
21633     else if (!includes(values, computed, comparator)) {
21634       result.push(value);
21635     }
21636   }
21637   return result;
21638 }
21639
21640 /**
21641  * Creates an array excluding all given values using
21642  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21643  * for equality comparisons.
21644  *
21645  * **Note:** Unlike `_.pull`, this method returns a new array.
21646  *
21647  * @static
21648  * @memberOf _
21649  * @since 0.1.0
21650  * @category Array
21651  * @param {Array} array The array to inspect.
21652  * @param {...*} [values] The values to exclude.
21653  * @returns {Array} Returns the new array of filtered values.
21654  * @see _.difference, _.xor
21655  * @example
21656  *
21657  * _.without([2, 1, 2, 3], 1, 2);
21658  * // => [3]
21659  */
21660 var without = baseRest(function(array, values) {
21661   return isArrayLikeObject(array)
21662     ? baseDifference(array, values)
21663     : [];
21664 });
21665
21666 function osmIsInterestingTag(key) {
21667     return key !== 'attribution' &&
21668         key !== 'created_by' &&
21669         key !== 'source' &&
21670         key !== 'odbl' &&
21671         key.indexOf('tiger:') !== 0;
21672
21673 }
21674
21675
21676 var osmOneWayTags = {
21677     'aerialway': {
21678         'chair_lift': true,
21679         'mixed_lift': true,
21680         't-bar': true,
21681         'j-bar': true,
21682         'platter': true,
21683         'rope_tow': true,
21684         'magic_carpet': true,
21685         'yes': true
21686     },
21687     'highway': {
21688         'motorway': true,
21689         'motorway_link': true
21690     },
21691     'junction': {
21692         'roundabout': true
21693     },
21694     'man_made': {
21695         'piste:halfpipe': true
21696     },
21697     'piste:type': {
21698         'downhill': true,
21699         'sled': true,
21700         'yes': true
21701     },
21702     'waterway': {
21703         'canal': true,
21704         'ditch': true,
21705         'drain': true,
21706         'river': true,
21707         'stream': true
21708     }
21709 };
21710
21711
21712 var osmPavedTags = {
21713     'surface': {
21714         'paved': true,
21715         'asphalt': true,
21716         'concrete': true,
21717         'concrete:lanes': true,
21718         'concrete:plates': true
21719     },
21720     'tracktype': {
21721         'grade1': true
21722     }
21723 };
21724
21725 var dataWikipedia = [
21726     [
21727         "Abkhazian",
21728         "Аҧсшәа",
21729         "ab"
21730     ],
21731     [
21732         "Achinese",
21733         "Acèh",
21734         "ace"
21735     ],
21736     [
21737         "Adyghe",
21738         "адыгабзэ",
21739         "ady"
21740     ],
21741     [
21742         "Afrikaans",
21743         "Afrikaans",
21744         "af"
21745     ],
21746     [
21747         "Akan",
21748         "Akan",
21749         "ak"
21750     ],
21751     [
21752         "Alemannisch",
21753         "Alemannisch",
21754         "als"
21755     ],
21756     [
21757         "Amharic",
21758         "አማርኛ",
21759         "am"
21760     ],
21761     [
21762         "Aragonese",
21763         "aragonés",
21764         "an"
21765     ],
21766     [
21767         "Old English",
21768         "Ænglisc",
21769         "ang"
21770     ],
21771     [
21772         "Arabic",
21773         "العربية",
21774         "ar"
21775     ],
21776     [
21777         "Aramaic",
21778         "ܐܪܡܝܐ",
21779         "arc"
21780     ],
21781     [
21782         "Egyptian Arabic",
21783         "مصرى",
21784         "arz"
21785     ],
21786     [
21787         "Assamese",
21788         "অসমীয়া",
21789         "as"
21790     ],
21791     [
21792         "Asturian",
21793         "asturianu",
21794         "ast"
21795     ],
21796     [
21797         "Avaric",
21798         "авар",
21799         "av"
21800     ],
21801     [
21802         "Aymara",
21803         "Aymar aru",
21804         "ay"
21805     ],
21806     [
21807         "Azerbaijani",
21808         "azərbaycanca",
21809         "az"
21810     ],
21811     [
21812         "تۆرکجه",
21813         "تۆرکجه",
21814         "azb"
21815     ],
21816     [
21817         "Bashkir",
21818         "башҡортса",
21819         "ba"
21820     ],
21821     [
21822         "Bavarian",
21823         "Boarisch",
21824         "bar"
21825     ],
21826     [
21827         "Samogitian",
21828         "žemaitėška",
21829         "bat-smg"
21830     ],
21831     [
21832         "Bikol Central",
21833         "Bikol Central",
21834         "bcl"
21835     ],
21836     [
21837         "Belarusian",
21838         "беларуская",
21839         "be"
21840     ],
21841     [
21842         "беларуская (тарашкевіца)‎",
21843         "беларуская (тарашкевіца)‎",
21844         "be-x-old"
21845     ],
21846     [
21847         "Bulgarian",
21848         "български",
21849         "bg"
21850     ],
21851     [
21852         "भोजपुरी",
21853         "भोजपुरी",
21854         "bh"
21855     ],
21856     [
21857         "Bislama",
21858         "Bislama",
21859         "bi"
21860     ],
21861     [
21862         "Banjar",
21863         "Bahasa Banjar",
21864         "bjn"
21865     ],
21866     [
21867         "Bambara",
21868         "bamanankan",
21869         "bm"
21870     ],
21871     [
21872         "Bangla",
21873         "বাংলা",
21874         "bn"
21875     ],
21876     [
21877         "Tibetan",
21878         "བོད་ཡིག",
21879         "bo"
21880     ],
21881     [
21882         "Bishnupriya",
21883         "বিষ্ণুপ্রিয়া মণিপুরী",
21884         "bpy"
21885     ],
21886     [
21887         "Breton",
21888         "brezhoneg",
21889         "br"
21890     ],
21891     [
21892         "Bosnian",
21893         "bosanski",
21894         "bs"
21895     ],
21896     [
21897         "Buginese",
21898         "ᨅᨔ ᨕᨘᨁᨗ",
21899         "bug"
21900     ],
21901     [
21902         "буряад",
21903         "буряад",
21904         "bxr"
21905     ],
21906     [
21907         "Catalan",
21908         "català",
21909         "ca"
21910     ],
21911     [
21912         "Chavacano de Zamboanga",
21913         "Chavacano de Zamboanga",
21914         "cbk-zam"
21915     ],
21916     [
21917         "Min Dong Chinese",
21918         "Mìng-dĕ̤ng-ngṳ̄",
21919         "cdo"
21920     ],
21921     [
21922         "Chechen",
21923         "нохчийн",
21924         "ce"
21925     ],
21926     [
21927         "Cebuano",
21928         "Cebuano",
21929         "ceb"
21930     ],
21931     [
21932         "Chamorro",
21933         "Chamoru",
21934         "ch"
21935     ],
21936     [
21937         "Cherokee",
21938         "ᏣᎳᎩ",
21939         "chr"
21940     ],
21941     [
21942         "Cheyenne",
21943         "Tsetsêhestâhese",
21944         "chy"
21945     ],
21946     [
21947         "Central Kurdish",
21948         "کوردیی ناوەندی",
21949         "ckb"
21950     ],
21951     [
21952         "Corsican",
21953         "corsu",
21954         "co"
21955     ],
21956     [
21957         "Cree",
21958         "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
21959         "cr"
21960     ],
21961     [
21962         "Crimean Turkish",
21963         "qırımtatarca",
21964         "crh"
21965     ],
21966     [
21967         "Czech",
21968         "čeština",
21969         "cs"
21970     ],
21971     [
21972         "Kashubian",
21973         "kaszëbsczi",
21974         "csb"
21975     ],
21976     [
21977         "Church Slavic",
21978         "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
21979         "cu"
21980     ],
21981     [
21982         "Chuvash",
21983         "Чӑвашла",
21984         "cv"
21985     ],
21986     [
21987         "Welsh",
21988         "Cymraeg",
21989         "cy"
21990     ],
21991     [
21992         "Danish",
21993         "dansk",
21994         "da"
21995     ],
21996     [
21997         "German",
21998         "Deutsch",
21999         "de"
22000     ],
22001     [
22002         "Zazaki",
22003         "Zazaki",
22004         "diq"
22005     ],
22006     [
22007         "Lower Sorbian",
22008         "dolnoserbski",
22009         "dsb"
22010     ],
22011     [
22012         "Divehi",
22013         "ދިވެހިބަސް",
22014         "dv"
22015     ],
22016     [
22017         "Dzongkha",
22018         "ཇོང་ཁ",
22019         "dz"
22020     ],
22021     [
22022         "Ewe",
22023         "eʋegbe",
22024         "ee"
22025     ],
22026     [
22027         "Greek",
22028         "Ελληνικά",
22029         "el"
22030     ],
22031     [
22032         "Emiliano-Romagnolo",
22033         "emiliàn e rumagnòl",
22034         "eml"
22035     ],
22036     [
22037         "English",
22038         "English",
22039         "en"
22040     ],
22041     [
22042         "Esperanto",
22043         "Esperanto",
22044         "eo"
22045     ],
22046     [
22047         "Spanish",
22048         "español",
22049         "es"
22050     ],
22051     [
22052         "Estonian",
22053         "eesti",
22054         "et"
22055     ],
22056     [
22057         "Basque",
22058         "euskara",
22059         "eu"
22060     ],
22061     [
22062         "Extremaduran",
22063         "estremeñu",
22064         "ext"
22065     ],
22066     [
22067         "Persian",
22068         "فارسی",
22069         "fa"
22070     ],
22071     [
22072         "Fulah",
22073         "Fulfulde",
22074         "ff"
22075     ],
22076     [
22077         "Finnish",
22078         "suomi",
22079         "fi"
22080     ],
22081     [
22082         "Võro",
22083         "Võro",
22084         "fiu-vro"
22085     ],
22086     [
22087         "Fijian",
22088         "Na Vosa Vakaviti",
22089         "fj"
22090     ],
22091     [
22092         "Faroese",
22093         "føroyskt",
22094         "fo"
22095     ],
22096     [
22097         "French",
22098         "français",
22099         "fr"
22100     ],
22101     [
22102         "Arpitan",
22103         "arpetan",
22104         "frp"
22105     ],
22106     [
22107         "Northern Frisian",
22108         "Nordfriisk",
22109         "frr"
22110     ],
22111     [
22112         "Friulian",
22113         "furlan",
22114         "fur"
22115     ],
22116     [
22117         "Western Frisian",
22118         "Frysk",
22119         "fy"
22120     ],
22121     [
22122         "Irish",
22123         "Gaeilge",
22124         "ga"
22125     ],
22126     [
22127         "Gagauz",
22128         "Gagauz",
22129         "gag"
22130     ],
22131     [
22132         "Gan Chinese",
22133         "贛語",
22134         "gan"
22135     ],
22136     [
22137         "Scottish Gaelic",
22138         "Gàidhlig",
22139         "gd"
22140     ],
22141     [
22142         "Galician",
22143         "galego",
22144         "gl"
22145     ],
22146     [
22147         "Gilaki",
22148         "گیلکی",
22149         "glk"
22150     ],
22151     [
22152         "Guarani",
22153         "Avañe'ẽ",
22154         "gn"
22155     ],
22156     [
22157         "Goan Konkani",
22158         "गोंयची कोंकणी / Gõychi Konknni",
22159         "gom"
22160     ],
22161     [
22162         "Gothic",
22163         "𐌲𐌿𐍄𐌹𐍃𐌺",
22164         "got"
22165     ],
22166     [
22167         "Gujarati",
22168         "ગુજરાતી",
22169         "gu"
22170     ],
22171     [
22172         "Manx",
22173         "Gaelg",
22174         "gv"
22175     ],
22176     [
22177         "Hausa",
22178         "Hausa",
22179         "ha"
22180     ],
22181     [
22182         "Hakka Chinese",
22183         "客家語/Hak-kâ-ngî",
22184         "hak"
22185     ],
22186     [
22187         "Hawaiian",
22188         "Hawaiʻi",
22189         "haw"
22190     ],
22191     [
22192         "Hebrew",
22193         "עברית",
22194         "he"
22195     ],
22196     [
22197         "Hindi",
22198         "हिन्दी",
22199         "hi"
22200     ],
22201     [
22202         "Fiji Hindi",
22203         "Fiji Hindi",
22204         "hif"
22205     ],
22206     [
22207         "Croatian",
22208         "hrvatski",
22209         "hr"
22210     ],
22211     [
22212         "Upper Sorbian",
22213         "hornjoserbsce",
22214         "hsb"
22215     ],
22216     [
22217         "Haitian Creole",
22218         "Kreyòl ayisyen",
22219         "ht"
22220     ],
22221     [
22222         "Hungarian",
22223         "magyar",
22224         "hu"
22225     ],
22226     [
22227         "Armenian",
22228         "Հայերեն",
22229         "hy"
22230     ],
22231     [
22232         "Interlingua",
22233         "interlingua",
22234         "ia"
22235     ],
22236     [
22237         "Indonesian",
22238         "Bahasa Indonesia",
22239         "id"
22240     ],
22241     [
22242         "Interlingue",
22243         "Interlingue",
22244         "ie"
22245     ],
22246     [
22247         "Igbo",
22248         "Igbo",
22249         "ig"
22250     ],
22251     [
22252         "Inupiaq",
22253         "Iñupiak",
22254         "ik"
22255     ],
22256     [
22257         "Iloko",
22258         "Ilokano",
22259         "ilo"
22260     ],
22261     [
22262         "Ido",
22263         "Ido",
22264         "io"
22265     ],
22266     [
22267         "Icelandic",
22268         "íslenska",
22269         "is"
22270     ],
22271     [
22272         "Italian",
22273         "italiano",
22274         "it"
22275     ],
22276     [
22277         "Inuktitut",
22278         "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22279         "iu"
22280     ],
22281     [
22282         "Japanese",
22283         "日本語",
22284         "ja"
22285     ],
22286     [
22287         "Jamaican Creole English",
22288         "Patois",
22289         "jam"
22290     ],
22291     [
22292         "Lojban",
22293         "la .lojban.",
22294         "jbo"
22295     ],
22296     [
22297         "Javanese",
22298         "Basa Jawa",
22299         "jv"
22300     ],
22301     [
22302         "Georgian",
22303         "ქართული",
22304         "ka"
22305     ],
22306     [
22307         "Kara-Kalpak",
22308         "Qaraqalpaqsha",
22309         "kaa"
22310     ],
22311     [
22312         "Kabyle",
22313         "Taqbaylit",
22314         "kab"
22315     ],
22316     [
22317         "Kabardian",
22318         "Адыгэбзэ",
22319         "kbd"
22320     ],
22321     [
22322         "Kongo",
22323         "Kongo",
22324         "kg"
22325     ],
22326     [
22327         "Kikuyu",
22328         "Gĩkũyũ",
22329         "ki"
22330     ],
22331     [
22332         "Kazakh",
22333         "қазақша",
22334         "kk"
22335     ],
22336     [
22337         "Kalaallisut",
22338         "kalaallisut",
22339         "kl"
22340     ],
22341     [
22342         "Khmer",
22343         "ភាសាខ្មែរ",
22344         "km"
22345     ],
22346     [
22347         "Kannada",
22348         "ಕನ್ನಡ",
22349         "kn"
22350     ],
22351     [
22352         "Korean",
22353         "한국어",
22354         "ko"
22355     ],
22356     [
22357         "Komi-Permyak",
22358         "Перем Коми",
22359         "koi"
22360     ],
22361     [
22362         "Karachay-Balkar",
22363         "къарачай-малкъар",
22364         "krc"
22365     ],
22366     [
22367         "Kashmiri",
22368         "कॉशुर / کٲشُر",
22369         "ks"
22370     ],
22371     [
22372         "Colognian",
22373         "Ripoarisch",
22374         "ksh"
22375     ],
22376     [
22377         "Kurdish",
22378         "Kurdî",
22379         "ku"
22380     ],
22381     [
22382         "Komi",
22383         "коми",
22384         "kv"
22385     ],
22386     [
22387         "Cornish",
22388         "kernowek",
22389         "kw"
22390     ],
22391     [
22392         "Kyrgyz",
22393         "Кыргызча",
22394         "ky"
22395     ],
22396     [
22397         "Latin",
22398         "Latina",
22399         "la"
22400     ],
22401     [
22402         "Ladino",
22403         "Ladino",
22404         "lad"
22405     ],
22406     [
22407         "Luxembourgish",
22408         "Lëtzebuergesch",
22409         "lb"
22410     ],
22411     [
22412         "лакку",
22413         "лакку",
22414         "lbe"
22415     ],
22416     [
22417         "Lezghian",
22418         "лезги",
22419         "lez"
22420     ],
22421     [
22422         "Ganda",
22423         "Luganda",
22424         "lg"
22425     ],
22426     [
22427         "Limburgish",
22428         "Limburgs",
22429         "li"
22430     ],
22431     [
22432         "Ligurian",
22433         "Ligure",
22434         "lij"
22435     ],
22436     [
22437         "Lombard",
22438         "lumbaart",
22439         "lmo"
22440     ],
22441     [
22442         "Lingala",
22443         "lingála",
22444         "ln"
22445     ],
22446     [
22447         "Lao",
22448         "ລາວ",
22449         "lo"
22450     ],
22451     [
22452         "Northern Luri",
22453         "لۊری شومالی",
22454         "lrc"
22455     ],
22456     [
22457         "Lithuanian",
22458         "lietuvių",
22459         "lt"
22460     ],
22461     [
22462         "Latgalian",
22463         "latgaļu",
22464         "ltg"
22465     ],
22466     [
22467         "Latvian",
22468         "latviešu",
22469         "lv"
22470     ],
22471     [
22472         "Maithili",
22473         "मैथिली",
22474         "mai"
22475     ],
22476     [
22477         "Basa Banyumasan",
22478         "Basa Banyumasan",
22479         "map-bms"
22480     ],
22481     [
22482         "Moksha",
22483         "мокшень",
22484         "mdf"
22485     ],
22486     [
22487         "Malagasy",
22488         "Malagasy",
22489         "mg"
22490     ],
22491     [
22492         "Eastern Mari",
22493         "олык марий",
22494         "mhr"
22495     ],
22496     [
22497         "Maori",
22498         "Māori",
22499         "mi"
22500     ],
22501     [
22502         "Minangkabau",
22503         "Baso Minangkabau",
22504         "min"
22505     ],
22506     [
22507         "Macedonian",
22508         "македонски",
22509         "mk"
22510     ],
22511     [
22512         "Malayalam",
22513         "മലയാളം",
22514         "ml"
22515     ],
22516     [
22517         "Mongolian",
22518         "монгол",
22519         "mn"
22520     ],
22521     [
22522         "Marathi",
22523         "मराठी",
22524         "mr"
22525     ],
22526     [
22527         "Western Mari",
22528         "кырык мары",
22529         "mrj"
22530     ],
22531     [
22532         "Malay",
22533         "Bahasa Melayu",
22534         "ms"
22535     ],
22536     [
22537         "Maltese",
22538         "Malti",
22539         "mt"
22540     ],
22541     [
22542         "Mirandese",
22543         "Mirandés",
22544         "mwl"
22545     ],
22546     [
22547         "Burmese",
22548         "မြန်မာဘာသာ",
22549         "my"
22550     ],
22551     [
22552         "Erzya",
22553         "эрзянь",
22554         "myv"
22555     ],
22556     [
22557         "Mazanderani",
22558         "مازِرونی",
22559         "mzn"
22560     ],
22561     [
22562         "Nauru",
22563         "Dorerin Naoero",
22564         "na"
22565     ],
22566     [
22567         "Nāhuatl",
22568         "Nāhuatl",
22569         "nah"
22570     ],
22571     [
22572         "Neapolitan",
22573         "Napulitano",
22574         "nap"
22575     ],
22576     [
22577         "Low German",
22578         "Plattdüütsch",
22579         "nds"
22580     ],
22581     [
22582         "Low Saxon",
22583         "Nedersaksies",
22584         "nds-nl"
22585     ],
22586     [
22587         "Nepali",
22588         "नेपाली",
22589         "ne"
22590     ],
22591     [
22592         "Newari",
22593         "नेपाल भाषा",
22594         "new"
22595     ],
22596     [
22597         "Dutch",
22598         "Nederlands",
22599         "nl"
22600     ],
22601     [
22602         "Norwegian Nynorsk",
22603         "norsk nynorsk",
22604         "nn"
22605     ],
22606     [
22607         "Norwegian",
22608         "norsk bokmål",
22609         "no"
22610     ],
22611     [
22612         "Novial",
22613         "Novial",
22614         "nov"
22615     ],
22616     [
22617         "Nouormand",
22618         "Nouormand",
22619         "nrm"
22620     ],
22621     [
22622         "Northern Sotho",
22623         "Sesotho sa Leboa",
22624         "nso"
22625     ],
22626     [
22627         "Navajo",
22628         "Diné bizaad",
22629         "nv"
22630     ],
22631     [
22632         "Nyanja",
22633         "Chi-Chewa",
22634         "ny"
22635     ],
22636     [
22637         "Occitan",
22638         "occitan",
22639         "oc"
22640     ],
22641     [
22642         "Livvi-Karelian",
22643         "Livvinkarjala",
22644         "olo"
22645     ],
22646     [
22647         "Oromo",
22648         "Oromoo",
22649         "om"
22650     ],
22651     [
22652         "Odia",
22653         "ଓଡ଼ିଆ",
22654         "or"
22655     ],
22656     [
22657         "Ossetic",
22658         "Ирон",
22659         "os"
22660     ],
22661     [
22662         "Punjabi",
22663         "ਪੰਜਾਬੀ",
22664         "pa"
22665     ],
22666     [
22667         "Pangasinan",
22668         "Pangasinan",
22669         "pag"
22670     ],
22671     [
22672         "Pampanga",
22673         "Kapampangan",
22674         "pam"
22675     ],
22676     [
22677         "Papiamento",
22678         "Papiamentu",
22679         "pap"
22680     ],
22681     [
22682         "Picard",
22683         "Picard",
22684         "pcd"
22685     ],
22686     [
22687         "Pennsylvania German",
22688         "Deitsch",
22689         "pdc"
22690     ],
22691     [
22692         "Palatine German",
22693         "Pälzisch",
22694         "pfl"
22695     ],
22696     [
22697         "Pali",
22698         "पालि",
22699         "pi"
22700     ],
22701     [
22702         "Norfuk / Pitkern",
22703         "Norfuk / Pitkern",
22704         "pih"
22705     ],
22706     [
22707         "Polish",
22708         "polski",
22709         "pl"
22710     ],
22711     [
22712         "Piedmontese",
22713         "Piemontèis",
22714         "pms"
22715     ],
22716     [
22717         "Western Punjabi",
22718         "پنجابی",
22719         "pnb"
22720     ],
22721     [
22722         "Pontic",
22723         "Ποντιακά",
22724         "pnt"
22725     ],
22726     [
22727         "Pashto",
22728         "پښتو",
22729         "ps"
22730     ],
22731     [
22732         "Portuguese",
22733         "português",
22734         "pt"
22735     ],
22736     [
22737         "Quechua",
22738         "Runa Simi",
22739         "qu"
22740     ],
22741     [
22742         "Romansh",
22743         "rumantsch",
22744         "rm"
22745     ],
22746     [
22747         "Romani",
22748         "Romani",
22749         "rmy"
22750     ],
22751     [
22752         "Rundi",
22753         "Kirundi",
22754         "rn"
22755     ],
22756     [
22757         "Romanian",
22758         "română",
22759         "ro"
22760     ],
22761     [
22762         "Aromanian",
22763         "armãneashti",
22764         "roa-rup"
22765     ],
22766     [
22767         "tarandíne",
22768         "tarandíne",
22769         "roa-tara"
22770     ],
22771     [
22772         "Russian",
22773         "русский",
22774         "ru"
22775     ],
22776     [
22777         "Rusyn",
22778         "русиньскый",
22779         "rue"
22780     ],
22781     [
22782         "Kinyarwanda",
22783         "Kinyarwanda",
22784         "rw"
22785     ],
22786     [
22787         "Sanskrit",
22788         "संस्कृतम्",
22789         "sa"
22790     ],
22791     [
22792         "Sakha",
22793         "саха тыла",
22794         "sah"
22795     ],
22796     [
22797         "Sardinian",
22798         "sardu",
22799         "sc"
22800     ],
22801     [
22802         "Sicilian",
22803         "sicilianu",
22804         "scn"
22805     ],
22806     [
22807         "Scots",
22808         "Scots",
22809         "sco"
22810     ],
22811     [
22812         "Sindhi",
22813         "سنڌي",
22814         "sd"
22815     ],
22816     [
22817         "Northern Sami",
22818         "sámegiella",
22819         "se"
22820     ],
22821     [
22822         "Sango",
22823         "Sängö",
22824         "sg"
22825     ],
22826     [
22827         "Serbo-Croatian",
22828         "srpskohrvatski / српскохрватски",
22829         "sh"
22830     ],
22831     [
22832         "Sinhala",
22833         "සිංහල",
22834         "si"
22835     ],
22836     [
22837         "Simple English",
22838         "Simple English",
22839         "simple"
22840     ],
22841     [
22842         "Slovak",
22843         "slovenčina",
22844         "sk"
22845     ],
22846     [
22847         "Slovenian",
22848         "slovenščina",
22849         "sl"
22850     ],
22851     [
22852         "Samoan",
22853         "Gagana Samoa",
22854         "sm"
22855     ],
22856     [
22857         "Shona",
22858         "chiShona",
22859         "sn"
22860     ],
22861     [
22862         "Somali",
22863         "Soomaaliga",
22864         "so"
22865     ],
22866     [
22867         "Albanian",
22868         "shqip",
22869         "sq"
22870     ],
22871     [
22872         "Serbian",
22873         "српски / srpski",
22874         "sr"
22875     ],
22876     [
22877         "Sranan Tongo",
22878         "Sranantongo",
22879         "srn"
22880     ],
22881     [
22882         "Swati",
22883         "SiSwati",
22884         "ss"
22885     ],
22886     [
22887         "Southern Sotho",
22888         "Sesotho",
22889         "st"
22890     ],
22891     [
22892         "Saterland Frisian",
22893         "Seeltersk",
22894         "stq"
22895     ],
22896     [
22897         "Sundanese",
22898         "Basa Sunda",
22899         "su"
22900     ],
22901     [
22902         "Swedish",
22903         "svenska",
22904         "sv"
22905     ],
22906     [
22907         "Swahili",
22908         "Kiswahili",
22909         "sw"
22910     ],
22911     [
22912         "Silesian",
22913         "ślůnski",
22914         "szl"
22915     ],
22916     [
22917         "Tamil",
22918         "தமிழ்",
22919         "ta"
22920     ],
22921     [
22922         "Tulu",
22923         "ತುಳು",
22924         "tcy"
22925     ],
22926     [
22927         "Telugu",
22928         "తెలుగు",
22929         "te"
22930     ],
22931     [
22932         "Tetum",
22933         "tetun",
22934         "tet"
22935     ],
22936     [
22937         "Tajik",
22938         "тоҷикӣ",
22939         "tg"
22940     ],
22941     [
22942         "Thai",
22943         "ไทย",
22944         "th"
22945     ],
22946     [
22947         "Tigrinya",
22948         "ትግርኛ",
22949         "ti"
22950     ],
22951     [
22952         "Turkmen",
22953         "Türkmençe",
22954         "tk"
22955     ],
22956     [
22957         "Tagalog",
22958         "Tagalog",
22959         "tl"
22960     ],
22961     [
22962         "Tswana",
22963         "Setswana",
22964         "tn"
22965     ],
22966     [
22967         "Tongan",
22968         "lea faka-Tonga",
22969         "to"
22970     ],
22971     [
22972         "Tok Pisin",
22973         "Tok Pisin",
22974         "tpi"
22975     ],
22976     [
22977         "Turkish",
22978         "Türkçe",
22979         "tr"
22980     ],
22981     [
22982         "Tsonga",
22983         "Xitsonga",
22984         "ts"
22985     ],
22986     [
22987         "Tatar",
22988         "татарча/tatarça",
22989         "tt"
22990     ],
22991     [
22992         "Tumbuka",
22993         "chiTumbuka",
22994         "tum"
22995     ],
22996     [
22997         "Twi",
22998         "Twi",
22999         "tw"
23000     ],
23001     [
23002         "Tahitian",
23003         "reo tahiti",
23004         "ty"
23005     ],
23006     [
23007         "Tuvinian",
23008         "тыва дыл",
23009         "tyv"
23010     ],
23011     [
23012         "Udmurt",
23013         "удмурт",
23014         "udm"
23015     ],
23016     [
23017         "Uyghur",
23018         "ئۇيغۇرچە / Uyghurche",
23019         "ug"
23020     ],
23021     [
23022         "Ukrainian",
23023         "українська",
23024         "uk"
23025     ],
23026     [
23027         "Urdu",
23028         "اردو",
23029         "ur"
23030     ],
23031     [
23032         "Uzbek",
23033         "oʻzbekcha/ўзбекча",
23034         "uz"
23035     ],
23036     [
23037         "Venda",
23038         "Tshivenda",
23039         "ve"
23040     ],
23041     [
23042         "Venetian",
23043         "vèneto",
23044         "vec"
23045     ],
23046     [
23047         "Veps",
23048         "vepsän kel’",
23049         "vep"
23050     ],
23051     [
23052         "Vietnamese",
23053         "Tiếng Việt",
23054         "vi"
23055     ],
23056     [
23057         "West Flemish",
23058         "West-Vlams",
23059         "vls"
23060     ],
23061     [
23062         "Volapük",
23063         "Volapük",
23064         "vo"
23065     ],
23066     [
23067         "Walloon",
23068         "walon",
23069         "wa"
23070     ],
23071     [
23072         "Waray",
23073         "Winaray",
23074         "war"
23075     ],
23076     [
23077         "Wolof",
23078         "Wolof",
23079         "wo"
23080     ],
23081     [
23082         "Wu Chinese",
23083         "吴语",
23084         "wuu"
23085     ],
23086     [
23087         "Kalmyk",
23088         "хальмг",
23089         "xal"
23090     ],
23091     [
23092         "Xhosa",
23093         "isiXhosa",
23094         "xh"
23095     ],
23096     [
23097         "Mingrelian",
23098         "მარგალური",
23099         "xmf"
23100     ],
23101     [
23102         "Yiddish",
23103         "ייִדיש",
23104         "yi"
23105     ],
23106     [
23107         "Yoruba",
23108         "Yorùbá",
23109         "yo"
23110     ],
23111     [
23112         "Zhuang",
23113         "Vahcuengh",
23114         "za"
23115     ],
23116     [
23117         "Zeelandic",
23118         "Zeêuws",
23119         "zea"
23120     ],
23121     [
23122         "Chinese",
23123         "中文",
23124         "zh"
23125     ],
23126     [
23127         "Classical Chinese",
23128         "文言",
23129         "zh-classical"
23130     ],
23131     [
23132         "Chinese (Min Nan)",
23133         "Bân-lâm-gú",
23134         "zh-min-nan"
23135     ],
23136     [
23137         "Cantonese",
23138         "粵語",
23139         "zh-yue"
23140     ],
23141     [
23142         "Zulu",
23143         "isiZulu",
23144         "zu"
23145     ]
23146 ];
23147
23148 var amenity = {"arts_centre":{"Świetlica wiejska":{"count":62},"Дом культуры":{"count":182}},"bank":{"ABANCA":{"count":83},"ABN AMRO":{"count":152},"ABSA":{"count":105},"AIB":{"count":85},"ANZ":{"count":378},"ASB Bank":{"count":51},"ATB Financial":{"count":68},"AXA":{"count":106},"Agribank":{"count":58},"Akbank":{"count":129},"Alior Bank":{"count":180},"Allahabad Bank":{"count":52},"Allied Bank":{"count":67},"Alpha Bank":{"count":329},"Andhra Bank":{"count":97},"Antonveneta":{"count":56},"Argenta":{"count":125},"Asia United Bank":{"count":57},"Askari Bank":{"count":71},"Associated Bank":{"count":55},"Axis Bank":{"count":198},"BAC":{"count":77},"BAWAG PSK":{"count":97},"BB&T":{"count":418},"BBBank":{"count":58},"BBK":{"count":122},"BBVA":{"count":1445},"BBVA Bancomer":{"count":157},"BBVA Compass":{"count":80},"BBVA Continental":{"count":74},"BBVA Francés":{"count":158},"BCA":{"count":135},"BCI":{"count":140},"BCP":{"count":226},"BCR":{"count":232},"BDO":{"count":538},"BGŻ BNP Paribas":{"count":74},"BMCE":{"count":53},"BMN":{"count":88},"BMO":{"count":339},"BMO Harris Bank":{"count":72},"BNA":{"count":70},"BNI":{"count":136},"BNL":{"count":159},"BNP Paribas":{"count":1165},"BNP Paribas Fortis":{"count":303},"BOC":{"count":95},"BPH":{"count":63},"BPI":{"count":579},"BPI Family Savings Bank":{"count":54},"BRD":{"count":276},"BRED":{"count":70},"BRI":{"count":209},"BW-Bank":{"count":95},"BZ WBK":{"count":156},"Banamex":{"count":356},"Banc Sabadell":{"count":175},"Banca Intesa":{"count":92},"Banca March":{"count":51},"Banca Popolare di Milano":{"count":99},"Banca Popolare di Novara":{"count":79},"Banca Popolare di Sondrio":{"count":105},"Banca Popolare di Verona":{"count":59},"Banca Popolare di Vicenza":{"count":119},"Banca Românească":{"count":61},"Banca Sella":{"count":56},"Banca Transilvania":{"count":167},"Banco Agrario":{"count":58},"Banco Azteca":{"count":119},"Banco BCI":{"count":74},"Banco Bradesco":{"count":226},"Banco Continental":{"count":64},"Banco Estado":{"count":153},"Banco Fassil":{"count":59},"Banco G&T Continental":{"count":84},"Banco General":{"count":53},"Banco Industrial":{"count":91},"Banco Internacional":{"count":62},"Banco Itaú":{"count":351},"Banco Nacional":{"count":143},"Banco Nación":{"count":149},"Banco Pastor":{"count":74},"Banco Pichincha":{"count":109},"Banco Popular":{"count":619},"Banco Provincia":{"count":138},"Banco Sabadell":{"count":189},"Banco Santander":{"count":112},"Banco Sol":{"count":74},"Banco de Bogotá":{"count":74},"Banco de Chile":{"count":175},"Banco de Costa Rica":{"count":123},"Banco de Desarrollo Banrural":{"count":85},"Banco de Occidente":{"count":67},"Banco de Venezuela":{"count":76},"Banco de la Nación":{"count":156},"Banco de la Nación Argentina":{"count":166},"Banco di Napoli":{"count":79},"Banco di Sardegna":{"count":79},"Banco do Brasil":{"count":1313},"Banco do Nordeste":{"count":56},"BancoEstado":{"count":121},"Bancolombia":{"count":170},"Bancomer":{"count":227},"Bancpost":{"count":77},"Banesco":{"count":209},"Bangkok Bank":{"count":69},"Bank Al Habib":{"count":52},"Bank Alfalah":{"count":63},"Bank Austria":{"count":123},"Bank BCA":{"count":71},"Bank BNI":{"count":67},"Bank BPH":{"count":56},"Bank BRI":{"count":196},"Bank Danamon":{"count":60},"Bank Mandiri":{"count":232},"Bank Mega":{"count":54},"Bank Spółdzielczy":{"count":395},"Bank Zachodni WBK":{"count":103},"Bank of Africa":{"count":59},"Bank of America":{"count":1787},"Bank of Baroda":{"count":122},"Bank of Ceylon":{"count":74},"Bank of China":{"count":152},"Bank of Commerce":{"count":69},"Bank of India":{"count":113},"Bank of Ireland":{"count":151},"Bank of Montreal":{"count":157},"Bank of New Zealand":{"count":63},"Bank of Scotland":{"count":122},"Bank of the West":{"count":173},"Bankia":{"count":613},"Bankinter":{"count":139},"Banner Bank":{"count":53},"Banorte":{"count":260},"Banque Atlantique":{"count":57},"Banque Nationale":{"count":137},"Banque Populaire":{"count":919},"Banrisul":{"count":101},"Banrural":{"count":84},"Barclays":{"count":1243},"Bcc":{"count":54},"Belfius":{"count":285},"Bendigo Bank":{"count":140},"Berliner Volksbank":{"count":73},"Bicentenario":{"count":173},"Bradesco":{"count":751},"Budapest Bank":{"count":56},"CBAO":{"count":53},"CEC Bank":{"count":121},"CGD":{"count":52},"CIB Bank":{"count":64},"CIBC":{"count":574},"CIC":{"count":742},"CIMB Bank":{"count":64},"CNEP":{"count":52},"Caisse Desjardins":{"count":69},"Caisse d'Épargne":{"count":1607},"Caixa":{"count":239},"Caixa Econômica Federal":{"count":573},"Caixa Geral de Depósitos":{"count":231},"CaixaBank":{"count":343},"Caja Círculo":{"count":68},"Caja Duero":{"count":90},"Caja España":{"count":74},"Caja Rural":{"count":216},"Caja Rural de Jaén":{"count":55},"CajaSur":{"count":73},"Cajamar":{"count":216},"Cajero Automatico Bancared":{"count":123},"Canara Bank":{"count":270},"Capital One":{"count":199},"Carige":{"count":57},"Cariparma":{"count":69},"Cassa di Risparmio del Veneto":{"count":102},"CatalunyaCaixa":{"count":107},"Central Bank of India":{"count":60},"Chase":{"count":1658},"China Bank":{"count":156},"China Bank Savings":{"count":54},"China Construction Bank":{"count":68},"Citibank":{"count":485},"Citizens Bank":{"count":248},"Clydesdale Bank":{"count":55},"Columbia Bank":{"count":79},"Comerica Bank":{"count":67},"Commerce Bank":{"count":61},"Commercial Bank":{"count":75},"Commercial Bank of Ceylon PLC":{"count":100},"Commerzbank":{"count":879},"Commonwealth Bank":{"count":376},"Corporation Bank":{"count":92},"Credem":{"count":77},"Credicoop":{"count":111},"Credit Agricole":{"count":104},"Credit Suisse":{"count":93},"Crelan":{"count":53},"Crédit Agricole":{"count":2544},"Crédit Mutuel":{"count":1129},"Crédit Mutuel de Bretagne":{"count":368},"Crédit du Nord":{"count":148},"Crédito Agrícola":{"count":87},"Cбербанк":{"count":74},"Danske Bank":{"count":157},"Davivienda":{"count":172},"De Venezuela":{"count":87},"Denizbank":{"count":58},"Desjardins":{"count":80},"Deutsche Bank":{"count":995},"Dubai Islamic Bank":{"count":71},"EastWest Bank":{"count":127},"Ecobank":{"count":197},"Erste Bank":{"count":200},"Eurobank":{"count":261},"Express Union":{"count":58},"FNB":{"count":143},"Federal Bank":{"count":88},"Fifth Third Bank":{"count":234},"Finansbank":{"count":68},"First Bank":{"count":91},"First Citizens Bank":{"count":88},"First National Bank":{"count":209},"Galicia":{"count":179},"Garanti":{"count":58},"Garanti Bankası":{"count":82},"Getin Bank":{"count":112},"Groupama":{"count":61},"HDFC Bank":{"count":219},"HNB":{"count":67},"HSBC":{"count":1748},"Halifax":{"count":367},"Halkbank":{"count":74},"Hamburger Sparkasse":{"count":159},"Handelsbanken":{"count":250},"Hong Leong Bank":{"count":51},"Hrvatska poštanska banka":{"count":54},"Huntington Bank":{"count":110},"HypoVereinsbank":{"count":408},"ICBC":{"count":158},"ICICI Bank":{"count":224},"IDBI Bank":{"count":73},"ING":{"count":654},"ING Bank Śląski":{"count":128},"IberCaja":{"count":209},"Indian Bank":{"count":98},"Indian Overseas Bank":{"count":108},"Interbank":{"count":131},"Intesa San Paolo":{"count":257},"Itaú":{"count":726},"K&H Bank":{"count":75},"KBC":{"count":273},"Kasa Stefczyka":{"count":65},"Key Bank":{"count":382},"Komerční banka":{"count":180},"Kreissparkasse":{"count":600},"Kreissparkasse Köln":{"count":69},"Kutxabank":{"count":68},"LCL":{"count":903},"La Banque Postale":{"count":124},"La Caixa":{"count":1144},"Laboral Kutxa":{"count":66},"Landbank":{"count":115},"Liberbank":{"count":164},"Lloyds Bank":{"count":612},"M&T Bank":{"count":184},"MCB":{"count":62},"MCB Bank":{"count":54},"MONETA Money Bank":{"count":92},"Macro":{"count":174},"Maybank":{"count":234},"Meezan Bank":{"count":63},"Mercantil":{"count":132},"Metro Bank":{"count":57},"Metrobank":{"count":434},"Millennium BCP":{"count":119},"Millennium Bank":{"count":386},"Monte dei Paschi di Siena":{"count":265},"Montepio":{"count":113},"NAB":{"count":205},"NSB":{"count":51},"NatWest":{"count":800},"National Bank":{"count":147},"Nationwide":{"count":337},"Nedbank":{"count":100},"Nordea":{"count":331},"Novo Banco":{"count":101},"OLB":{"count":57},"OTP":{"count":362},"Oberbank":{"count":103},"Occidental de Descuento":{"count":68},"Oldenburgische Landesbank":{"count":68},"One Network Bank":{"count":91},"Osuuspankki":{"count":89},"PBZ":{"count":65},"PKO":{"count":58},"PKO BP":{"count":561},"PNB":{"count":323},"PNC":{"count":52},"PNC Bank":{"count":639},"PSBank":{"count":108},"Patagonia":{"count":94},"Pekao SA":{"count":155},"Peoples Bank":{"count":254},"Philippine National Bank":{"count":69},"Piraeus Bank":{"count":96},"Popular":{"count":104},"Postbank":{"count":567},"Postbank Finanzcenter":{"count":65},"Provincial":{"count":135},"Public Bank":{"count":90},"Punjab National Bank":{"count":134},"RBC":{"count":487},"RBC Financial Group":{"count":59},"RBS":{"count":190},"RCBC":{"count":144},"RCBC Savings Bank":{"count":84},"Rabobank":{"count":557},"Raiffeisen Polbank":{"count":78},"Raiffeisenbank":{"count":2705},"Regions Bank":{"count":204},"Republic Bank":{"count":85},"Royal Bank":{"count":90},"Royal Bank of Canada":{"count":56},"Royal Bank of Scotland":{"count":129},"SEB":{"count":129},"SNS Bank":{"count":58},"Sabadell":{"count":97},"Sampath Bank":{"count":87},"Santander":{"count":3268},"Santander Consumer Bank":{"count":109},"Santander Río":{"count":239},"Santander Totta":{"count":201},"Sberbank":{"count":135},"Scotiabank":{"count":1144},"Security Bank":{"count":171},"Sicredi":{"count":94},"Slovenská sporiteľňa":{"count":165},"Société Générale":{"count":1136},"Sparda-Bank":{"count":277},"Sparkasse":{"count":4667},"Sparkasse Aachen":{"count":56},"Sparkasse KölnBonn":{"count":76},"Stadtsparkasse":{"count":68},"Stanbic Bank":{"count":63},"Standard Bank":{"count":165},"Standard Chartered":{"count":95},"Standard Chartered Bank":{"count":74},"State Bank of India":{"count":1013},"SunTrust":{"count":322},"Supervielle":{"count":72},"Swedbank":{"count":252},"Syndicate Bank":{"count":118},"TCF Bank":{"count":85},"TD Bank":{"count":425},"TD Canada Trust":{"count":675},"TEB":{"count":56},"TSB":{"count":259},"Takarékszövetkezet":{"count":120},"Targobank":{"count":279},"Tatra banka":{"count":70},"Türkiye İş Bankası":{"count":53},"UBS":{"count":169},"UCO Bank":{"count":51},"UCPB":{"count":122},"UOB":{"count":126},"US Bank":{"count":723},"Ulster Bank":{"count":100},"Umpqua Bank":{"count":103},"UniCredit Bank":{"count":548},"Unicaja Banco":{"count":182},"Unicredit Banca":{"count":496},"Union Bank":{"count":304},"United Bank":{"count":68},"VR-Bank":{"count":506},"Vakıfbank":{"count":85},"Veneto Banca":{"count":73},"Vijaya Bank":{"count":56},"Volks- und Raiffeisenbank":{"count":53},"Volksbank":{"count":2665},"Volksbank Mittelhessen":{"count":53},"Volksbank Raiffeisenbank":{"count":63},"VÚB":{"count":105},"Washington Federal":{"count":65},"Wells Fargo":{"count":1947},"Western Union":{"count":440},"Westpac":{"count":322},"Yorkshire Bank":{"count":95},"Yorkshire Building Society":{"count":69},"Zagrebačka banka":{"count":54},"Ziraat Bankası":{"count":172},"mBank":{"count":70},"ČSOB":{"count":211},"Česká spořitelna":{"count":243},"İş Bankası":{"count":112},"Εθνική Τράπεζα":{"count":103},"Πειραιώς":{"count":120},"Τράπεζα Πειραιώς":{"count":104},"Авангард":{"count":76},"Альфа-Банк":{"count":301},"Банк Москвы":{"count":176},"Банка ДСК":{"count":63},"Белагропромбанк":{"count":184},"Беларусбанк":{"count":570},"Белинвестбанк":{"count":78},"Бинбанк":{"count":114},"ВТБ":{"count":80},"ВТБ24":{"count":545},"Возрождение":{"count":81},"Газпромбанк":{"count":161},"Генбанк":{"count":83},"Казкоммерцбанк":{"count":74},"МДМ Банк":{"count":52},"Московский индустриальный банк":{"count":53},"Мособлбанк":{"count":54},"Народный банк":{"count":63},"ОТП Банк":{"count":54},"Открытие":{"count":92},"Ощадбанк":{"count":883},"ПУМБ":{"count":78},"Почта Банк":{"count":65},"ПриватБанк":{"count":1018},"Приватбанк":{"count":76},"Приднестровский Сбербанк":{"count":59},"Приорбанк":{"count":69},"Промсвязьбанк":{"count":133},"РНКБ":{"count":124},"Райффайзен":{"count":65},"Райффайзен Банк Аваль":{"count":125},"Райффайзенбанк":{"count":52},"Росбанк":{"count":218},"Россельхозбанк":{"count":374},"Русский стандарт":{"count":55},"Сбербанк":{"count":6921},"Совкомбанк":{"count":186},"УкрСиббанк":{"count":213},"Укрсоцбанк":{"count":57},"Уралсиб":{"count":130},"Хоум Кредит":{"count":53},"בנק הפועלים":{"count":112},"בנק לאומי":{"count":83},"بانک":{"count":219},"بانک آینده":{"count":58},"بانک اقتصاد نوین":{"count":78},"بانک انصار":{"count":99},"بانک تجارت":{"count":365},"بانک رفاه":{"count":138},"بانک رفاه کارگران":{"count":72},"بانک سپه":{"count":348},"بانک شهر":{"count":93},"بانک صادرات":{"count":492},"بانک قوامین":{"count":110},"بانک مسکن":{"count":263},"بانک ملت":{"count":428},"بانک ملی":{"count":561},"بانک ملی ایران":{"count":80},"بانک مهر اقتصاد":{"count":92},"بانک پارسیان":{"count":103},"بانک پاسارگاد":{"count":107},"بانک کشاورزی":{"count":277},"صادرات":{"count":85},"ملی":{"count":67},"پست بانک":{"count":71},"ธนาคารกรุงเทพ":{"count":121},"ธนาคารกรุงไทย":{"count":85},"ธนาคารกสิกรไทย":{"count":108},"ธนาคารออมสิน":{"count":71},"ธนาคารไทยพาณิชย์":{"count":95},"みずほ銀行":{"count":255},"りそな銀行":{"count":135},"三井住友銀行":{"count":204},"三菱東京UFJ銀行":{"count":235},"中国农业银行":{"count":198},"中国工商银行":{"count":181},"中国建设银行":{"count":158},"中国邮政储蓄银行":{"count":76},"中国银行":{"count":275},"交通银行":{"count":68},"京都中央信用金庫":{"count":53},"京都銀行":{"count":66},"农业银行":{"count":78},"北海道銀行":{"count":51},"合作金庫銀行":{"count":55},"土地銀行":{"count":54},"工商银行":{"count":160},"建设银行":{"count":89},"彰化銀行":{"count":53},"招商银行":{"count":94},"横浜銀行":{"count":92},"第一銀行":{"count":78},"華南銀行":{"count":52},"국민은행":{"count":199,"tags":{"name:en":"Gungmin Bank"}},"기업은행":{"count":53},"농협":{"count":148},"새마을금고":{"count":102},"신한은행":{"count":245,"tags":{"name:en":"Sinhan Bank"}},"우리은행":{"count":316,"tags":{"name:en":"Uri Bank"}},"하나은행":{"count":85}},"bar":{"Bar Centrale":{"count":141},"Bar Sport":{"count":90},"Beach Bar":{"count":80},"Pool Bar":{"count":54}},"bicycle_rental":{"Bicing":{"count":130},"Call a Bike":{"count":95},"Grid":{"count":51},"Mibici":{"count":116},"metropolradruhr":{"count":91}},"bureau_de_change":{"Abitab":{"count":55},"Change":{"count":51},"Travelex":{"count":75},"Western Union":{"count":189}},"cafe":{"85度C":{"count":128},"Bar Centrale":{"count":77},"Bar Kafe":{"count":253},"Barista":{"count":65},"Bistro":{"count":60},"Bonafide":{"count":63},"Cafe Coffee Day":{"count":239},"Cafe Nero":{"count":52},"Cafeteria":{"count":579},"Cafetería":{"count":61},"Caffè Nero":{"count":316},"Café Amazon":{"count":241},"Café Central":{"count":115},"Café de la Place":{"count":55},"Café des Sports":{"count":71},"Caribou Coffee":{"count":184},"Coffee Fellows":{"count":77},"Coffee House":{"count":71},"Coffee Island":{"count":51},"Coffee Shop":{"count":180},"Coffee Time":{"count":133},"Costa":{"count":1403},"Country Style":{"count":58},"Dolce Vita":{"count":55},"Dunkin' Donuts":{"count":1662,"tags":{"cuisine":"donut"}},"Eiscafe Dolomiti":{"count":51},"Eiscafe Venezia":{"count":237},"Espresso House":{"count":122},"Havanna":{"count":81},"Internet Cafe":{"count":95},"Jamba Juice":{"count":86},"Kafe":{"count":55},"Krispy Kreme":{"count":63},"Le Pain Quotidien":{"count":59},"McCafé":{"count":72,"tags":{"amenity":"cafe","cuisine":"coffee_shop"}},"Peet's Coffee & Tea":{"count":82},"Pret A Manger":{"count":174},"Prime":{"count":51},"Second Cup":{"count":234},"Segafredo":{"count":103},"Starbucks":{"count":8463,"tags":{"cuisine":"coffee_shop"}},"Subway":{"count":114},"Tchibo":{"count":168},"The Coffee Bean & Tea Leaf":{"count":93},"The Coffee Club":{"count":81},"Tim Hortons":{"count":1945},"Traveler's Coffee":{"count":70},"Venezia":{"count":55},"Wayne's Coffee":{"count":52},"Берёзка":{"count":52},"Бистро":{"count":84},"Буфет":{"count":56},"Встреча":{"count":83},"Даблби":{"count":59},"Закусочная":{"count":101},"Кофе Хауз":{"count":119},"Кофейня":{"count":78},"Лакомка":{"count":62},"Летнее кафе":{"count":61},"Оазис":{"count":54},"Пельменная":{"count":63},"Пиццерия":{"count":60},"Рандеву":{"count":54},"Сказка":{"count":66},"Смак":{"count":62},"Старбакс":{"count":55},"Столовая":{"count":1181},"Теремок":{"count":64},"Уют":{"count":115},"Хуторок":{"count":59},"Шашлычная":{"count":153},"Шоколад":{"count":54},"Шоколадница":{"count":252},"ארומה":{"count":64},"مقهى":{"count":136},"คาเฟ่ อเมซอน":{"count":59},"エクセルシオール カフェ":{"count":61},"カフェ・ド・クリエ":{"count":80,"tags":{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{"count":105},"コメダ珈琲店":{"count":179},"サンマルクカフェ":{"count":156},"スターバックス":{"count":558,"tags":{"name:en":"Starbucks"}},"タリーズコーヒー":{"count":243},"ドトールコーヒーショップ":{"count":489},"星巴克":{"count":146},"스타벅스":{"count":52}},"car_rental":{"Alamo":{"count":57},"Avis":{"count":604},"Budget":{"count":218},"Enterprise":{"count":594},"Enterprise Rent-a-Car":{"count":51},"Europcar":{"count":611},"Hertz":{"count":654},"Localiza":{"count":59},"Sixt":{"count":323},"Thrifty":{"count":81},"U-Haul":{"count":94},"オリックスレンタカー":{"count":54},"トヨタレンタカー":{"count":57},"トヨタレンタリース":{"count":63},"ニッポンレンタカー":{"count":113}},"car_wash":{"Aral":{"count":88},"Autolavaggio":{"count":52},"BP":{"count":63},"Esso":{"count":55},"H-E-B Car Wash":{"count":71},"Intermarché":{"count":60},"Lavage Auto":{"count":60},"Lavazh":{"count":52},"Myjnia":{"count":54},"Myjnia bezdotykowa":{"count":93},"Myjnia samochodowa":{"count":66},"Shell":{"count":162},"Spălătorie Auto":{"count":69},"Spălătorie auto":{"count":52},"Автомийка":{"count":63}},"cinema":{"Cinema City":{"count":61},"Cinemark":{"count":87},"Cinemex":{"count":70},"Cinepolis":{"count":59},"Cineworld":{"count":64},"Odeon":{"count":81}},"clinic":{"ФАП":{"count":162}},"dentist":{"Aspen Dental":{"count":73},"Consultorio Dental":{"count":187},"Dentista":{"count":109},"Family Dentistry":{"count":51},"Vitaldent":{"count":54},"Стоматолог":{"count":72},"Стоматологія":{"count":66}},"doctors":{"Háziorvosi rendelő":{"count":54},"Инвитро":{"count":115},"ФАП":{"count":147}},"driving_school":{"Автодром":{"count":55}},"fast_food":{"A&W":{"count":614},"Ali Baba":{"count":101},"Angel's Burger":{"count":66},"Antalya":{"count":53},"Arby's":{"count":1432},"Asia Bistro":{"count":53},"Asia Wok":{"count":53},"Baskin-Robbins":{"count":262,"tags":{"amenity":"ice_cream"}},"Bistro":{"count":80},"Bob's":{"count":83},"Bojangles":{"count":89},"Booster Juice":{"count":76},"Boston Market":{"count":107},"Braum's":{"count":58},"Burger King":{"count":6601,"tags":{"cuisine":"burger"}},"Burger Machine":{"count":55},"Büfé":{"count":72},"Captain D's":{"count":56},"Carl's Jr.":{"count":593,"tags":{"cuisine":"burger"}},"Checkers":{"count":102},"Chick-fil-A":{"count":906,"tags":{"cuisine":"chicken"}},"Chicken Express":{"count":67},"Chipotle":{"count":688,"tags":{"cuisine":"mexican"}},"Chowking":{"count":250},"Church's Chicken":{"count":249},"CoCo壱番屋":{"count":218},"Cold Stone Creamery":{"count":72},"Cook Out":{"count":81},"Culver's":{"count":541},"DQ":{"count":66},"Dairy Queen":{"count":1485},"Del Taco":{"count":244},"Ditsch":{"count":55},"Domino's Pizza":{"count":2577,"tags":{"cuisine":"pizza"}},"Dunkin' Donuts":{"count":747,"tags":{"cuisine":"donut"}},"El Pollo Loco":{"count":132},"Everest":{"count":59},"Extreme Pita":{"count":58},"Fazoli's":{"count":53},"Firehouse Subs":{"count":147},"Fish & Chips":{"count":185},"Fish and Chips":{"count":55},"Five Guys":{"count":457},"Food Court":{"count":72},"Greenwich":{"count":83},"Habib's":{"count":87},"Hallo Pizza":{"count":98},"Hardee's":{"count":634,"tags":{"cuisine":"burger"}},"Harvey's":{"count":158},"Hesburger":{"count":164},"Hungry Jacks":{"count":261,"tags":{"cuisine":"burger"}},"In-N-Out Burger":{"count":211},"Istanbul":{"count":96},"Istanbul Kebab":{"count":59},"Jack in the Box":{"count":951,"tags":{"cuisine":"burger"}},"Jamba Juice":{"count":148},"Jersey Mike's Subs":{"count":88},"Jimmy John's":{"count":519,"tags":{"cuisine":"sandwich"}},"Jollibee":{"count":740},"KFC":{"count":6003,"tags":{"cuisine":"chicken"}},"KFC/Taco Bell":{"count":70},"Kebab House":{"count":74},"Kebabai":{"count":64},"Kochlöffel":{"count":78},"Kotipizza":{"count":89},"Krispy Kreme":{"count":63},"Krystal":{"count":53},"Little Caesars":{"count":567},"Little Caesars Pizza":{"count":82},"Long John Silver's":{"count":200},"Lotteria":{"count":67},"Max":{"count":54},"McDonald's":{"count":18327,"tags":{"cuisine":"burger"}},"Minute Burger":{"count":53},"Mr. Sub":{"count":153},"New York Pizza":{"count":65},"Nordsee":{"count":198},"Panda Express":{"count":593,"tags":{"cuisine":"chinese"}},"Panera Bread":{"count":120},"Papa John's":{"count":820,"tags":{"cuisine":"pizza"}},"Papa Murphy's":{"count":100},"Pinulito":{"count":58},"Pita Pit":{"count":150},"Pizza Hut":{"count":1503,"tags":{"cuisine":"pizza"}},"Pizza Hut Delivery":{"count":70},"Pizza King":{"count":56},"Pizza Nova":{"count":90},"Pizza Pizza":{"count":411},"Pollo Campero":{"count":134},"Pollo Granjero":{"count":66},"Popeye's":{"count":521,"tags":{"cuisine":"chicken"}},"Popeyes Louisiana Kitchen":{"count":51},"Qdoba":{"count":91},"Quick":{"count":434},"Quiznos":{"count":401},"Rally's":{"count":68},"Red Rooster":{"count":192},"Sbarro":{"count":65},"Schlotzsky's Deli":{"count":348},"Sibylla":{"count":74},"Sonic":{"count":1166,"tags":{"cuisine":"burger"}},"Starbucks":{"count":60,"tags":{"cuisine":"coffee_shop"}},"Steers":{"count":190},"Subway":{"count":11431},"Taco Bell":{"count":2947,"tags":{"cuisine":"mexican"}},"Taco Bueno":{"count":59},"Taco Cabana":{"count":57},"Taco Del Mar":{"count":57},"Taco John's":{"count":141},"Taco Time":{"count":171},"Telepizza":{"count":323},"Thai Express":{"count":63},"The Pizza Company":{"count":62},"Waffle House":{"count":86},"Wendy's":{"count":3036,"tags":{"cuisine":"burger"}},"Whataburger":{"count":815},"White Castle":{"count":149},"Wienerschnitzel":{"count":61},"Wimpy":{"count":168},"Zaxby's":{"count":185},"Γρηγόρης":{"count":59},"Бистро":{"count":61},"Бургер Кинг":{"count":181},"Крошка Картошка":{"count":77},"Макдоналдс":{"count":469,"tags":{"name:en":"McDonald's"}},"Робин Сдобин":{"count":131},"Русский Аппетит":{"count":129},"Сабвэй":{"count":73},"Стардог!s":{"count":66},"Теремок":{"count":155},"Шаверма":{"count":93},"Шаурма":{"count":265},"かっぱ寿司":{"count":84},"かつや":{"count":58},"くら寿司":{"count":99},"すき家":{"count":571,"tags":{"name:en":"SUKIYA"}},"なか卯":{"count":180},"ほっかほっか亭":{"count":57},"ほっともっと":{"count":168},"オリジン弁当":{"count":93},"ケンタッキーフライドチキン":{"count":334,"tags":{"cuisine":"chicken","name:en":"KFC"}},"サブウェイ":{"count":74},"スシロー":{"count":94},"マクドナルド":{"count":1261,"tags":{"cuisine":"burger","name:en":"McDonald's"}},"ミスタードーナツ":{"count":188},"モスバーガー":{"count":507,"tags":{"name:en":"MOS BURGER"}},"ロッテリア":{"count":97},"丸亀製麺":{"count":57},"吉野家":{"count":461},"幸楽苑":{"count":80},"摩斯漢堡":{"count":86},"松屋":{"count":574,"tags":{"name:en":"Matsuya"}},"肯德基":{"count":197},"麥當勞":{"count":224},"麦当劳":{"count":97},"롯데리아":{"count":83}},"fuel":{"76":{"count":603},"1-2-3":{"count":75},"7-Eleven":{"count":1013},"ABC":{"count":83},"ADNOC":{"count":76},"ANP":{"count":202},"ARAL":{"count":68},"Aegean":{"count":56},"Afriquia":{"count":134},"Agip":{"count":2348},"Agrola":{"count":99},"Alon":{"count":54},"Alpet":{"count":61},"Api":{"count":234},"Aral":{"count":1708},"Arco":{"count":585},"Asda":{"count":51},"Auchan":{"count":84},"Avanti":{"count":112},"Avia":{"count":1061},"BEBECO":{"count":77},"BFT":{"count":102},"BHPetrol":{"count":60},"BP":{"count":4069},"BR":{"count":165},"Bangchak":{"count":106},"Benzina":{"count":167},"Bharat Petroleum":{"count":230},"Bliska":{"count":141},"CAMPSA":{"count":420},"CARREFOUR":{"count":61},"CEPSA":{"count":892},"CNG":{"count":373},"Caltex":{"count":1574},"Campsa":{"count":64},"Canadian Tire":{"count":97},"Carrefour":{"count":372},"Casey's General Store":{"count":385},"Cenex":{"count":222},"Cepsa":{"count":305},"Ceypetco":{"count":70},"Chevron":{"count":1781},"Circle K":{"count":730},"Citgo":{"count":692},"Clark":{"count":56},"Co-op":{"count":52},"Coles Express":{"count":305},"Conoco":{"count":398},"Coop":{"count":71},"Copec":{"count":566},"Copetrol":{"count":119},"Cosmo":{"count":68},"Costco":{"count":82},"Costco Gas":{"count":62},"Costco Gasoline":{"count":59},"Couche-Tard":{"count":54},"Crodux":{"count":51},"Cumberland Farms":{"count":93},"Delta":{"count":157},"Diamond Shamrock":{"count":51},"Drummed Fuel":{"count":178},"E. Leclerc":{"count":136},"EKO":{"count":224},"ENEOS":{"count":1600},"ENI":{"count":92},"ERG":{"count":71},"Elan":{"count":208},"Eneos":{"count":130},"Engen":{"count":383},"Eni":{"count":681},"Erg":{"count":469},"Esso":{"count":4742},"Esso Express":{"count":176},"EuroOil":{"count":52},"Exxon":{"count":1064},"F24":{"count":67},"Firezone":{"count":66},"Flying V":{"count":175},"GALP":{"count":788},"GNV":{"count":58},"Gas":{"count":66},"Gazprom":{"count":68},"GetGo":{"count":54},"Goil":{"count":78},"Gulf":{"count":416},"H-E-B Fuel":{"count":51},"H-E-B Gas":{"count":155},"HEM":{"count":276},"HP":{"count":163},"HP Petrol Pump":{"count":53},"Helios":{"count":63},"Hess":{"count":195},"Hindustan Petroleum":{"count":82},"Holiday":{"count":156},"Husky":{"count":244},"IES":{"count":57},"IP":{"count":993},"Independent Fuel Station":{"count":52},"Indian Oil":{"count":416},"Indipend.":{"count":129},"Ingo":{"count":62},"Intermarché":{"count":556},"Intermarché Super":{"count":102},"Ipiranga":{"count":173},"Irving":{"count":194},"JA-SS":{"count":74},"JOMO":{"count":51},"Jet":{"count":707},"Jetti":{"count":61},"Kangaroo":{"count":115},"Kobil":{"count":87},"Kroger":{"count":59},"Kroger Fuel":{"count":68},"Kum & Go":{"count":136},"Kwik Trip":{"count":210},"LPG":{"count":349},"LPG Station":{"count":51},"LUKOIL":{"count":61},"Liberty":{"count":93},"Lotos":{"count":284},"Lotos Optima":{"count":71},"Love's":{"count":52},"Lukoil":{"count":908},"MEROIL":{"count":70},"MOL":{"count":436},"MRS":{"count":65},"Marathon":{"count":694},"Maverik":{"count":66},"Maxol":{"count":57},"Metano":{"count":248},"Migrol":{"count":71},"Minipump":{"count":140},"Mobil":{"count":1387},"Mobile":{"count":62},"Mol":{"count":64},"Morrisons":{"count":128},"Moya":{"count":62},"Murphy USA":{"count":190},"NP":{"count":63},"Neste":{"count":166},"OIL!":{"count":110},"OK":{"count":269},"OKQ8":{"count":218},"OMV":{"count":936},"Oilibya":{"count":127},"Opet":{"count":117},"Orlen":{"count":1185},"PETRONOR":{"count":182},"PSO":{"count":121},"PSO Petrol Pump":{"count":56},"PT":{"count":306},"PTT":{"count":423},"PV Oil":{"count":100},"Pacific Pride":{"count":54},"Pecsa":{"count":130},"Pemex":{"count":2023},"Pertamina":{"count":324},"Petro":{"count":54},"Petro-Canada":{"count":893},"Petrobras":{"count":487},"Petrochina":{"count":116},"Petroecuador":{"count":64},"Petrol Ofisi":{"count":237},"Petrolimex":{"count":325},"Petrom":{"count":381},"Petron":{"count":1485},"Petronas":{"count":387},"Petroperu":{"count":110},"Phillips 66":{"count":424},"Phoenix":{"count":210},"Pilot":{"count":69},"Pioneer":{"count":104},"Posto":{"count":52},"Posto Atem":{"count":68},"Posto BR":{"count":222},"Posto Ipiranga":{"count":177},"Posto Shell":{"count":104},"Primax":{"count":288},"Prio":{"count":52},"Puma":{"count":442},"Q1":{"count":53},"Q8":{"count":1467},"Q8 Easy":{"count":66},"QuikTrip":{"count":251},"REPSOL":{"count":1380},"RaceTrac":{"count":80},"Raiffeisenbank":{"count":130},"Repsol":{"count":1099},"Rompetrol":{"count":234},"Royal Farms":{"count":79},"Rubis":{"count":108},"SB Tank":{"count":62},"SPBU":{"count":203},"Safeway":{"count":74},"Sainsbury's":{"count":75},"Sam's Club":{"count":57},"Sasol":{"count":90},"Sea Oil":{"count":142},"Sheetz":{"count":304},"Shell":{"count":12317},"Shell Express":{"count":135},"Sinclair":{"count":201},"Sinopec":{"count":106},"Sinopec Fuel":{"count":116},"Slovnaft":{"count":259},"Socar":{"count":86},"Sokimex":{"count":85},"Speedway":{"count":556},"St1":{"count":141},"Star":{"count":419},"Star Oil":{"count":100},"Station Service E. Leclerc":{"count":423},"Statoil":{"count":495},"Stewart's":{"count":72},"Sunoco":{"count":853},"Super U":{"count":174},"Tamoil":{"count":959},"Tango":{"count":146},"Teboil":{"count":100},"Tela":{"count":191},"Terpel":{"count":367},"Tesco":{"count":218},"Texaco":{"count":1167},"Tinq":{"count":219},"Topaz":{"count":111},"Total":{"count":3591},"Total Access":{"count":226},"Total Erg":{"count":59},"TotalErg":{"count":267},"Turkey Hill":{"count":80},"Turmöl":{"count":80},"Ultramar":{"count":372},"United":{"count":197},"Uno":{"count":134},"Uno-X":{"count":69},"Valero":{"count":778},"Vito":{"count":91},"WOG":{"count":350},"Wawa":{"count":173},"Westfalen":{"count":94},"Woolworths Petrol":{"count":187},"Z":{"count":98},"bft":{"count":202},"eni":{"count":71},"ΕΚΟ":{"count":58},"АГЗС":{"count":1020},"АЗС":{"count":86},"Авіас":{"count":116},"БРСМ-Нафта":{"count":64},"Башнефть":{"count":272},"Белоруснефть":{"count":71},"Газовая заправка":{"count":57},"Газпромнефть":{"count":1242},"Гелиос":{"count":61},"ЕКА":{"count":78},"Заправка":{"count":63},"КазМунайГаз":{"count":150},"Лукойл":{"count":2327},"Макпетрол":{"count":108},"НК Альянс":{"count":105},"Нефтьмагистраль":{"count":66},"ОККО":{"count":316},"ОМВ":{"count":55},"Октан":{"count":53},"ПТК":{"count":104},"Петрол":{"count":124},"Пропан":{"count":83},"Роснефть":{"count":957},"Сибнефть":{"count":51},"Сургутнефтегаз":{"count":95},"ТНК":{"count":588},"Татнефтепродукт":{"count":58},"Татнефть":{"count":331},"Укрнафта":{"count":228},"דור אלון":{"count":126},"דלק":{"count":160},"סונול":{"count":159},"פז":{"count":209},"محطة وقود":{"count":221},"محطه وقود":{"count":98},"پمپ بنزین":{"count":559},"پمپ گاز":{"count":152},"บางจาก":{"count":214},"ป.ต.ท.":{"count":414},"เชลล์":{"count":90},"เอสโซ่":{"count":82},"エッソ":{"count":70},"エネオス":{"count":301},"コスモ石油":{"count":415},"ゼネラル":{"count":75},"中国石化":{"count":104},"中国石化 Sinopec":{"count":61},"中国石油":{"count":82},"中油":{"count":64},"出光":{"count":620,"tags":{"name:en":"IDEMITSU"}},"加油站":{"count":60},"台灣中油":{"count":257},"昭和シェル":{"count":274}},"hospital":{"Cruz Roja":{"count":93},"IMSS":{"count":64},"Инфекционное отделение":{"count":91},"Кожно-венерологический диспансер":{"count":57},"Районная больница":{"count":88},"Роддом":{"count":133},"Родильный дом":{"count":75},"Скорая помощь":{"count":75},"ФАП":{"count":108},"ЦРБ":{"count":122},"Центральная районная больница":{"count":144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{"count":69}},"ice_cream":{"Baskin-Robbins":{"count":69,"tags":{"amenity":"ice_cream"}},"Cold Stone Creamery":{"count":66},"Grido":{"count":163}},"kindergarten":{"Amado Nervo":{"count":64},"Anganwadi":{"count":85},"Arche Noah":{"count":67},"Benito Juarez":{"count":89},"CONAFE Preescolar":{"count":90},"Cuauhtemoc":{"count":54},"Cursos Comunitarios":{"count":74},"Educacion Inicial de CONAFE No Escolarizado":{"count":184},"Emiliano Zapata":{"count":60},"Estefania Casta�eda":{"count":53},"Evangelischer Kindergarten":{"count":320},"Federico Froebel":{"count":88},"Gabriela Mistral":{"count":129},"Jardin Infantil":{"count":85},"Jean Piaget":{"count":82},"Jose Vasconcelos":{"count":71},"Juan Escutia":{"count":82},"Katholischer Kindergarten":{"count":99},"Kindergarten Regenbogen":{"count":62},"Kindergarten St. Josef":{"count":55},"Kindergarten St. Martin":{"count":55},"Maria Montessori":{"count":93},"Miguel Hidalgo Y Costilla":{"count":57},"Ni�os Heroes":{"count":68},"PAUD":{"count":82},"Pusteblume":{"count":54},"Rosaura Zapata":{"count":68},"Sor Juana Ines De La Cruz":{"count":76},"Spatzennest":{"count":54},"Städtischer Kindergarten":{"count":103},"Villa Kunterbunt":{"count":88},"Waldkindergarten":{"count":111},"Waldorfkindergarten":{"count":71},"Óvoda":{"count":72},"Детсад":{"count":65},"Детский сад \"Солнышко\"":{"count":83},"Детский сад № 1":{"count":54},"Детский сад №1":{"count":150},"Детский сад №10":{"count":77},"Детский сад №11":{"count":81},"Детский сад №12":{"count":57},"Детский сад №13":{"count":57},"Детский сад №14":{"count":76},"Детский сад №15":{"count":72},"Детский сад №16":{"count":58},"Детский сад №17":{"count":67},"Детский сад №18":{"count":77},"Детский сад №19":{"count":62},"Детский сад №2":{"count":155},"Детский сад №22":{"count":60},"Детский сад №24":{"count":53},"Детский сад №25":{"count":56},"Детский сад №27":{"count":54},"Детский сад №29":{"count":57},"Детский сад №3":{"count":129},"Детский сад №33":{"count":55},"Детский сад №4":{"count":86},"Детский сад №5":{"count":106},"Детский сад №6":{"count":93},"Детский сад №7":{"count":98},"Детский сад №8":{"count":80},"Детский сад №9":{"count":80},"Дитячий садок":{"count":58},"Сказка":{"count":52},"Солнышко":{"count":99},"Теремок":{"count":59},"საბავშვო ბაღი":{"count":69},"中央保育所":{"count":56}},"library":{"Biblioteca Comunale":{"count":212},"Biblioteca Municipal":{"count":451},"Biblioteca Pública":{"count":66},"Biblioteca Pública Municipal":{"count":85},"Biblioteca comunale":{"count":187},"Biblioteka Publiczna":{"count":78},"Bibliothèque Municipale":{"count":299},"Bibliothèque municipale":{"count":247},"Bücherei":{"count":113},"Central Library":{"count":65},"Gemeindebücherei":{"count":150},"Gminna Biblioteka Publiczna":{"count":71},"Miejska Biblioteka Publiczna":{"count":66},"Médiathèque":{"count":287},"Městská knihovna":{"count":60},"Public Library":{"count":91},"Stadtbibliothek":{"count":232},"Stadtbücherei":{"count":289},"Городская библиотека":{"count":69},"Детская библиотека":{"count":260},"Центральная библиотека":{"count":83},"Центральная городская библиотека":{"count":61},"图书馆":{"count":65}},"pharmacy":{"36.6":{"count":57},"Adler-Apotheke":{"count":375},"Alte Apotheke":{"count":99},"Apollo Pharmacy":{"count":87},"Apotek":{"count":62},"Apotek Hjärtat":{"count":51},"Apotheke am Markt":{"count":83},"Bahnhof Apotheke":{"count":51},"Bahnhof-Apotheke":{"count":90},"Bartell Drugs":{"count":53},"Benavides":{"count":83},"Benu":{"count":61},"Boots":{"count":1348},"Botica":{"count":118},"Brunnen-Apotheke":{"count":77},"Burg-Apotheke":{"count":76},"Bären-Apotheke":{"count":111},"CVS":{"count":3228},"Camelia":{"count":54},"Catena":{"count":112},"Chemist Warehouse":{"count":82},"Clicks":{"count":123},"Cruz Azul":{"count":97},"Cruz Verde":{"count":223},"Dbam o Zdrowie":{"count":68},"Dr. Max":{"count":324},"Droga Raia":{"count":152},"Drogaria São Paulo":{"count":87},"Drogasil":{"count":157},"Duane Reade":{"count":91},"Eczane":{"count":88},"Engel-Apotheke":{"count":143},"Eurovaistinė":{"count":89},"Familiprix":{"count":70},"Farmacenter":{"count":65},"Farmacia Centrale":{"count":61},"Farmacia Comunale":{"count":196},"Farmacia Guadalajara":{"count":146},"Farmacia del Ahorro":{"count":65},"Farmacias Ahumada":{"count":182},"Farmacias Cruz Azul":{"count":134},"Farmacias Cruz Verde":{"count":162},"Farmacias Económicas":{"count":63},"Farmacias Guadalajara":{"count":107},"Farmacias SalcoBrand":{"count":140},"Farmacias Sana Sana":{"count":111},"Farmacias Similares":{"count":137},"Farmacias del Ahorro":{"count":187},"Farmacity":{"count":191},"Farmahorro":{"count":53},"Farmatodo":{"count":165},"Farmácia":{"count":85},"Felicia":{"count":56},"Fybeca":{"count":52},"Generika Drugstore":{"count":52},"Gintarinė vaistinė":{"count":121},"Guardian":{"count":71},"Gyógyszertár":{"count":59},"H-E-B Pharmacy":{"count":239},"Hirsch-Apotheke":{"count":180},"Hubertus Apotheke":{"count":120},"Inkafarma":{"count":234},"Jean Coutu":{"count":132},"Kinney Drugs":{"count":74},"Kur-Apotheke":{"count":52},"Linden-Apotheke":{"count":224},"Ljekarna":{"count":77},"Lloyds Pharmacy":{"count":539},"Lékárna":{"count":52},"Löwen-Apotheke":{"count":397},"Marien-Apotheke":{"count":370},"Markt-Apotheke":{"count":207},"Mercury Drug":{"count":584},"Mifarma":{"count":195},"Mēness aptieka":{"count":64},"Neue Apotheke":{"count":129},"Pague Menos":{"count":74},"Panvel":{"count":77},"Park-Apotheke":{"count":54},"Pharmacie Centrale":{"count":218},"Pharmacie Principale":{"count":62},"Pharmacie de l'Hôtel de Ville":{"count":52},"Pharmacie de la Gare":{"count":114},"Pharmacie de la Mairie":{"count":71},"Pharmacie de la Poste":{"count":68},"Pharmacie du Centre":{"count":154},"Pharmacie du Marché":{"count":110},"Pharmacie du Parc":{"count":60},"Pharmaprix":{"count":99},"Pharmasave":{"count":129},"Punkt Apteczny":{"count":53},"Rathaus-Apotheke":{"count":181},"Rats-Apotheke":{"count":126},"Rexall":{"count":109},"Rite Aid":{"count":1481},"Rose Pharmacy":{"count":99},"Rosen-Apotheke":{"count":205},"Rowlands Pharmacy":{"count":127},"SalcoBrand":{"count":112},"Sana Sana":{"count":95},"Schloss-Apotheke":{"count":62},"Sensiblu":{"count":115},"Shoppers Drug Mart":{"count":713},"Sonnen-Apotheke":{"count":372},"South Star Drug":{"count":69},"Stadt-Apotheke":{"count":397},"Stern-Apotheke":{"count":83},"Superdrug":{"count":177},"São João":{"count":54},"The Generics Pharmacy":{"count":211},"Uniprix":{"count":63},"Walgreens":{"count":3314},"Walgreens Pharmacy":{"count":76},"Walmart Pharmacy":{"count":99},"Watsons":{"count":110},"Well Pharmacy":{"count":61},"centro naturista":{"count":123},"А5":{"count":94},"Айболит":{"count":88},"Аптека 36,6":{"count":285},"Аптека низких цен":{"count":65},"Аптека низьких цін":{"count":88},"Аптека от склада":{"count":83},"Аптека №1":{"count":92},"Аптечный пункт":{"count":285},"Арніка":{"count":124},"Бережная аптека":{"count":67},"Будь здоров":{"count":63},"Вита":{"count":140},"Горздрав":{"count":395},"Живика":{"count":105},"Здоровье":{"count":87},"Имплозия":{"count":84},"Классика":{"count":102},"Ладушка":{"count":53},"Мед-сервіс":{"count":59},"Мелодия здоровья":{"count":60},"Невис":{"count":151},"Норма":{"count":89},"Озерки":{"count":54},"Панацея":{"count":68},"Первая помощь":{"count":132},"Планета здоровья":{"count":140},"Радуга":{"count":139},"Ригла":{"count":215},"Семейная":{"count":52},"Социальная аптека":{"count":62},"Столички":{"count":83},"Фармакопейка":{"count":85},"Фармакор":{"count":106},"Фармация":{"count":187},"Фармленд":{"count":108},"Центральная аптека":{"count":57},"סופר-פארם":{"count":93},"داروخانه":{"count":264},"داروخانه شبانه روزی":{"count":54},"صيدلية":{"count":148},"くすりの福太郎":{"count":51},"さくら薬局":{"count":52},"ウエルシア":{"count":84},"カワチ薬品":{"count":52},"クリエイト":{"count":53},"サンドラッグ":{"count":130},"スギ薬局":{"count":134},"セイジョー":{"count":58},"ツルハドラッグ":{"count":185},"ドラッグてらしま (Drug Terashima)":{"count":58},"マツモトキヨシ":{"count":221},"丁丁藥局":{"count":75}},"pub":{"Black Bull":{"count":55},"Commercial Hotel":{"count":62},"Cross Keys":{"count":64},"Irish Pub":{"count":107},"Kings Arms":{"count":81},"Kings Head":{"count":65},"New Inn":{"count":100},"Prince of Wales":{"count":89},"Queens Head":{"count":55},"Red Lion":{"count":201},"Rose & Crown":{"count":63},"Rose and Crown":{"count":82},"Royal Hotel":{"count":64},"Royal Oak":{"count":172},"The Albion":{"count":51},"The Anchor":{"count":68},"The Angel":{"count":55},"The Beehive":{"count":52},"The Bell":{"count":128},"The Bell Inn":{"count":58},"The Black Horse":{"count":100},"The Bull":{"count":82},"The Castle":{"count":63},"The Chequers":{"count":74},"The Cricketers":{"count":56},"The Cross Keys":{"count":58},"The Crown":{"count":252},"The Crown Inn":{"count":88},"The Fox":{"count":76},"The George":{"count":119},"The Green Man":{"count":59},"The Greyhound":{"count":99},"The Kings Arms":{"count":65},"The Kings Head":{"count":68},"The New Inn":{"count":126},"The Plough":{"count":182},"The Plough Inn":{"count":57},"The Queens Head":{"count":61},"The Railway":{"count":112},"The Red Lion":{"count":271},"The Rising Sun":{"count":74},"The Royal Oak":{"count":223},"The Ship":{"count":92},"The Ship Inn":{"count":98},"The Star":{"count":72},"The Star Inn":{"count":53},"The Sun Inn":{"count":51},"The Swan":{"count":155},"The Swan Inn":{"count":59},"The Victoria":{"count":72},"The Wheatsheaf":{"count":126},"The White Hart":{"count":247},"The White Horse":{"count":234},"The White Lion":{"count":75},"The White Swan":{"count":55},"魚民":{"count":119},"鳥貴族":{"count":57}},"restaurant":{"Adler":{"count":228},"Adria":{"count":60},"Adyar Ananda Bhavan":{"count":60},"Akropolis":{"count":212},"Ali Baba":{"count":59},"Alte Post":{"count":68},"Applebee's":{"count":977},"Asia":{"count":78},"Athen":{"count":75},"Athos":{"count":61},"Autogrill":{"count":60},"Bahnhof":{"count":56},"Bella Italia":{"count":194},"Bella Napoli":{"count":88},"Belvedere":{"count":55},"Big Boy":{"count":58},"Bistro":{"count":64},"Bob Evans":{"count":269},"Bonefish Grill":{"count":73},"Boston Market":{"count":91},"Boston Pizza":{"count":278},"Buffalo Grill":{"count":282},"Buffalo Wild Wings":{"count":454},"Bären":{"count":75},"Cafeteria":{"count":65},"California Pizza Kitchen":{"count":116},"Campanile":{"count":55},"Canteen":{"count":91},"Capri":{"count":56},"Captain D's":{"count":54},"Carluccio's":{"count":57},"Carpe Diem":{"count":60},"Carrabba's Italian Grill":{"count":62},"Casa Mia":{"count":64},"Casablanca":{"count":61},"Cheesecake Factory":{"count":52},"Chifa":{"count":86},"Chili's":{"count":698},"China Buffet":{"count":54},"China Garden":{"count":114},"China House":{"count":72},"China Town":{"count":117},"China Wok":{"count":100},"Chiquito":{"count":55},"Chuck E. Cheese's":{"count":54},"Cici's Pizza":{"count":51},"CoCo壱番屋":{"count":77},"Cold Stone Creamery":{"count":67},"Comedor":{"count":60},"Comida China":{"count":52},"Courtepaille":{"count":170},"Cracker Barrel":{"count":392},"Da Grasso":{"count":63},"Da Vinci":{"count":88},"Delphi":{"count":105},"Denny's":{"count":850},"Deutsches Haus":{"count":93},"Dionysos":{"count":75},"Dolce Vita":{"count":121},"Dorfkrug":{"count":60},"Dunkin' Donuts":{"count":94,"tags":{"cuisine":"donut"}},"East Side Mario's":{"count":53},"El Greco":{"count":112},"El Paso":{"count":60},"El Rancho":{"count":82},"Europa":{"count":61},"Famous Dave's":{"count":62},"Firehouse Subs":{"count":85},"Five Guys":{"count":91},"Flunch":{"count":179},"Food Court":{"count":52},"Frankie & Benny's":{"count":151},"Friendly's":{"count":113},"Gasthaus Krone":{"count":93},"Gasthaus zur Linde":{"count":59},"Gasthof zur Post":{"count":109},"Golden Corral":{"count":209},"Golden Dragon":{"count":62},"Great Wall":{"count":54},"Grüner Baum":{"count":122},"Gusto":{"count":74},"Hard Rock Cafe":{"count":96},"Hardee's":{"count":56,"tags":{"cuisine":"burger"}},"Harvester":{"count":75},"Hellas":{"count":66},"Hippopotamus":{"count":115},"Hirsch":{"count":83},"Hirschen":{"count":86},"Hong Kong":{"count":126},"Hooters":{"count":190},"IHOP":{"count":758},"IL Патио":{"count":51},"Jason's Deli":{"count":73},"Jimmy John's":{"count":150,"tags":{"cuisine":"sandwich"}},"Joe's Crab Shack":{"count":70},"Jägerhof":{"count":54},"Kantine":{"count":104},"Kelsey's":{"count":66},"Kirchenwirt":{"count":94},"Kreta":{"count":70},"Kreuz":{"count":85},"Krone":{"count":179},"Kudu":{"count":172},"L'Escale":{"count":66},"L'Osteria":{"count":80},"La Bodega":{"count":55},"La Boucherie":{"count":80},"La Cantina":{"count":105},"La Casa":{"count":66},"La Casona":{"count":62},"La Dolce Vita":{"count":129},"La Fontana":{"count":62},"La Gondola":{"count":60},"La Hacienda":{"count":54},"La Pataterie":{"count":116},"La Pergola":{"count":87},"La Perla":{"count":85},"La Piazza":{"count":123},"La Piazzetta":{"count":77},"La Place":{"count":55},"La Scala":{"count":62},"La Strada":{"count":74},"La Tagliatella":{"count":69},"La Tasca":{"count":56},"La Taverna":{"count":58},"La Terrasse":{"count":82},"La Terraza":{"count":56},"La Terrazza":{"count":57},"La Trattoria":{"count":91},"Lamm":{"count":69},"Linde":{"count":114},"Lindenhof":{"count":95},"Little Caesars":{"count":80},"Little Chef":{"count":62},"Little Italy":{"count":90},"Logan's Roadhouse":{"count":89},"LongHorn Steakhouse":{"count":183},"Lotus":{"count":87},"Léon de Bruxelles":{"count":63},"Löwen":{"count":141},"MK Restaurants":{"count":65},"Maharaja":{"count":52},"Mamma Mia":{"count":130},"Mandarin":{"count":90},"Mang Inasal":{"count":128},"Marco Polo":{"count":62},"Marco's Pizza":{"count":53},"McAlister's Deli":{"count":51},"Mediterraneo":{"count":55},"Mellow Mushroom":{"count":73},"Mensa":{"count":148},"Milano":{"count":77},"Mimi's Cafe":{"count":52},"Moe's Southwest Grill":{"count":79},"Mykonos":{"count":89},"Mythos":{"count":61},"Nando's":{"count":412},"Noodles & Company":{"count":106},"O'Charley's":{"count":61},"Oasis":{"count":73},"Ocean Basket":{"count":71},"Ochsen":{"count":94},"Old Chicago":{"count":54},"Olive Garden":{"count":504},"Olympia":{"count":86},"Osaka":{"count":52},"Outback Steakhouse":{"count":399},"P.F. Chang's":{"count":53},"Pancake House":{"count":79},"Panda":{"count":52},"Panera Bread":{"count":582},"Panorama":{"count":102},"Papa Murphy's":{"count":66},"Parrilla":{"count":62},"Peking":{"count":68},"Perkins":{"count":157},"Pinocchio":{"count":63},"Pizza Express":{"count":417},"Pizza Factory":{"count":59},"Pizza House":{"count":56},"Pizza Hut":{"count":2688,"tags":{"cuisine":"pizza"}},"Pizza Ranch":{"count":77},"Pizzeria Italia":{"count":65},"Pizzeria Milano":{"count":51},"Pizzeria Napoli":{"count":53},"Pizzeria Roma":{"count":86},"Pizzeria Venezia":{"count":54},"Poivre Rouge":{"count":56},"Pollo Campero":{"count":53},"Pomodoro":{"count":62},"Portofino":{"count":67},"Poseidon":{"count":145},"Prezzo":{"count":147},"Qdoba":{"count":81},"Qdoba Mexican Grill":{"count":54},"Ratskeller":{"count":161},"Red Lobster":{"count":419},"Red Robin":{"count":312},"Restaurante Universitário":{"count":53},"Rhodos":{"count":94},"Ristorante Del Arte":{"count":160},"Roma":{"count":85},"Rose":{"count":51},"Round Table Pizza":{"count":100},"Ruby Tuesday":{"count":303},"Rössle":{"count":54},"Rössli":{"count":93},"Saigon":{"count":51},"Sakura":{"count":139},"San Marco":{"count":88},"Santorini":{"count":59},"Schwarzer Adler":{"count":65},"Schützenhaus":{"count":151},"Shakey's":{"count":64},"Shalimar":{"count":53},"Shanghai":{"count":96},"Shari's":{"count":75},"Shoney's":{"count":55},"Sizzler":{"count":90},"Sonic":{"count":80,"tags":{"cuisine":"burger"}},"Sonne":{"count":121},"Sphinx":{"count":66},"Sportheim":{"count":113},"Spur":{"count":70},"Starbucks":{"count":54,"tags":{"cuisine":"coffee_shop"}},"Steak 'n Shake":{"count":86,"tags":{"cuisine":"burger"}},"Steak House":{"count":58},"Sternen":{"count":85},"Subway":{"count":1108},"Sunset Grill":{"count":55},"Sushi":{"count":88},"Sushi Bar":{"count":68},"Swiss Chalet":{"count":162},"Syrtaki":{"count":65},"TGI Friday's":{"count":364},"Taj Mahal":{"count":183},"Taste of India":{"count":68},"Taverna":{"count":69},"Telepizza":{"count":109},"Texas Roadhouse":{"count":232},"The Cheesecake Factory":{"count":52},"Tim Hortons":{"count":61},"Toby Carvery":{"count":51},"Tony Roma's":{"count":63},"Toscana":{"count":76},"Trattoria":{"count":70},"Traube":{"count":68},"Vapiano":{"count":136},"Venezia":{"count":68},"Village Inn":{"count":149},"Vips":{"count":109},"Waffle House":{"count":521},"Wagamama":{"count":111},"Waldschänke":{"count":52},"Warung":{"count":73},"Wasabi":{"count":70},"Wimpy":{"count":66},"Zaxby's":{"count":60},"Zizzi":{"count":102},"Zorbas":{"count":62},"Zum Hirschen":{"count":52},"Zum Löwen":{"count":80},"Zur Krone":{"count":96},"Zur Linde":{"count":228},"Zur Post":{"count":125},"Zur Sonne":{"count":77},"Евразия":{"count":93},"Ресторан":{"count":60},"Тануки":{"count":62},"Якитория":{"count":84},"رستوران":{"count":72},"مطعم":{"count":52},"すき家":{"count":61,"tags":{"name:en":"SUKIYA"}},"はま寿司":{"count":67},"びっくりドンキー":{"count":120},"やよい軒":{"count":71},"ガスト":{"count":512,"tags":{"name:en":"Gusto"}},"ココス":{"count":142},"サイゼリア":{"count":54},"サイゼリヤ":{"count":285},"ジョイフル":{"count":83},"ジョナサン":{"count":139},"ジョリーパスタ":{"count":75},"デニーズ":{"count":199},"バーミヤン":{"count":130},"ロイヤルホスト":{"count":108},"丸亀製麺":{"count":98},"八方雲集":{"count":145},"吉野家":{"count":61},"夢庵":{"count":67},"大戸屋":{"count":68},"大阪王将":{"count":68},"天下一品":{"count":70},"安楽亭":{"count":60},"牛角":{"count":107},"食堂":{"count":63},"餃子の王将":{"count":212},"바다횟집 (Bada Fish Restaurant)":{"count":52}},"school":{"Adolfo Lopez Mateos":{"count":137},"Agustin Ya�ez":{"count":57},"Albert-Schweitzer-Schule":{"count":81},"Amado Nervo":{"count":85},"Astrid-Lindgren-Schule":{"count":77},"Benito Juarez":{"count":294},"Brown School":{"count":54},"CEM":{"count":215},"Center School":{"count":115},"Central Elementary School":{"count":179},"Central High School":{"count":130},"Central School":{"count":215},"Colegio San José":{"count":74},"Collège Jean Moulin":{"count":68},"Collège privé Saint-Joseph":{"count":60},"Cuauhtemoc":{"count":152},"Curso Comunitario":{"count":57},"Cursos Comunitarios":{"count":116},"EPP":{"count":112},"Emiliano Zapata":{"count":286},"Escola Estadual":{"count":73},"Escola Municipal":{"count":211},"Fairview Elementary School":{"count":64},"Fairview School":{"count":164},"Francisco I Madero":{"count":86},"Francisco I. Madero":{"count":52},"Francisco Villa":{"count":116},"Franklin Elementary School":{"count":96},"Franklin School":{"count":126},"Garfield Elementary School":{"count":69},"Garfield School":{"count":58},"Gimnazjum nr 1":{"count":59},"Government School":{"count":60},"Gregorio Torres Quintero":{"count":53},"Groupe Scolaire":{"count":57},"Guadalupe Victoria":{"count":58},"Highland School":{"count":71},"Hillcrest Elementary School":{"count":63},"Holy Cross School":{"count":68},"Holy Family School":{"count":77},"Holy Trinity School":{"count":59},"Ignacio Allende":{"count":51},"Ignacio Zaragoza":{"count":98},"Immaculate Conception School":{"count":83},"Jackson Elementary School":{"count":53},"Jackson School":{"count":56},"Jefferson Elementary School":{"count":177},"Jefferson School":{"count":108},"Jose Clemente Orozco":{"count":59},"Jose Ma Morelos Y Pavon":{"count":120},"Jose Vasconcelos":{"count":73},"Josefa Ortiz De Dominguez":{"count":78},"Juan Escutia":{"count":121},"Justo Sierra":{"count":118},"Kumon":{"count":66},"Lazaro Cardenas":{"count":68},"Lazaro Cardenas Del Rio":{"count":153},"Leona Vicario":{"count":64},"Liberty Elementary School":{"count":56},"Liberty School":{"count":84},"Lincoln Elementary School":{"count":264},"Lincoln School":{"count":269},"Longfellow Elementary School":{"count":55},"Longfellow School":{"count":53},"Madison Elementary School":{"count":55},"Manuel Lopez Cotilla":{"count":107},"Maple Grove School":{"count":51},"McKinley Elementary School":{"count":62},"McKinley School":{"count":63},"Miguel Hidalgo":{"count":86},"Miguel Hidalgo Y Costilla":{"count":213},"Miller School":{"count":66},"Mount Pleasant School":{"count":61},"Mount Zion School":{"count":53},"Mountain View Elementary School":{"count":52},"New Hope School":{"count":51},"Nicolas Bravo":{"count":58},"Ni�os Heroes":{"count":155},"Nombre En Tramite":{"count":126},"North Elementary School":{"count":57},"Oak Grove School":{"count":148},"Pedro Moreno":{"count":69},"Pestalozzischule":{"count":84},"Pine Grove School":{"count":63},"Pleasant Hill School":{"count":110},"Pleasant Valley School":{"count":85},"Pleasant View School":{"count":61},"Primaria Comunitaria":{"count":59},"Ramon Corona":{"count":54},"Ricardo Flores Magon":{"count":91},"Riverside School":{"count":76},"Roosevelt Elementary School":{"count":112},"Roosevelt School":{"count":114},"SD":{"count":76},"SDN":{"count":290},"Sacred Heart School":{"count":206},"Saint Francis School":{"count":56},"Saint James School":{"count":83},"Saint Johns School":{"count":173},"Saint Joseph School":{"count":147},"Saint Josephs School":{"count":157},"Saint Kizito Primary School":{"count":61},"Saint Mary School":{"count":54},"Saint Marys School":{"count":256},"Saint Patricks School":{"count":80},"Saint Paul School":{"count":53},"Saint Pauls School":{"count":74},"Saint Peters School":{"count":81},"Schillerschule":{"count":61},"School Number 1":{"count":233},"School Number 2":{"count":206},"School Number 3":{"count":184},"School Number 4":{"count":126},"Smith School":{"count":60},"Sor Juana Ines De La Cruz":{"count":56},"South Elementary School":{"count":53},"Sunnyside School":{"count":60},"Szkoła Podstawowa nr 1":{"count":78},"Szkoła Podstawowa nr 2":{"count":75},"Szkoła Podstawowa nr 3":{"count":60},"Trinity School":{"count":85},"UNIDAD EDUCATIVA":{"count":106},"Union School":{"count":128},"Valentin Gomez Farias":{"count":71},"Venustiano Carranza":{"count":64},"Vicente Guerrero":{"count":159},"Volkshochschule":{"count":105},"Volksschule":{"count":366},"Washington Elementary School":{"count":192},"Washington School":{"count":213},"West Elementary School":{"count":58},"White School":{"count":51},"Wilson Elementary School":{"count":66},"Wilson School":{"count":80},"Általános iskola":{"count":105},"École Jules Ferry":{"count":51},"École Notre-Dame":{"count":61},"École Saint-Joseph":{"count":96},"École primaire Jean Jaurès":{"count":71},"École primaire Jules Ferry":{"count":82},"École primaire privée Notre-Dame":{"count":69},"École primaire privée Saint-Joseph":{"count":132},"École primaire privée Sainte-Marie":{"count":63},"École élémentaire Jules Ferry":{"count":52},"Școala Generală":{"count":51},"Școală":{"count":53},"Вечерняя школа":{"count":53},"Гимназия №1":{"count":96},"ДЮСШ":{"count":63},"Средняя школа №1":{"count":80},"Средняя школа №2":{"count":86},"Средняя школа №3":{"count":58},"Школа № 1":{"count":130},"Школа № 2":{"count":117},"Школа № 3":{"count":80},"Школа № 4":{"count":77},"Школа № 5":{"count":55},"Школа №1":{"count":576},"Школа №10":{"count":167},"Школа №11":{"count":148},"Школа №12":{"count":136},"Школа №13":{"count":129},"Школа №14":{"count":123},"Школа №15":{"count":129},"Школа №16":{"count":99},"Школа №17":{"count":117},"Школа №18":{"count":111},"Школа №19":{"count":98},"Школа №2":{"count":509},"Школа №20":{"count":100},"Школа №21":{"count":72},"Школа №22":{"count":72},"Школа №23":{"count":75},"Школа №24":{"count":78},"Школа №25":{"count":57},"Школа №26":{"count":64},"Школа №27":{"count":58},"Школа №28":{"count":53},"Школа №3":{"count":393},"Школа №31":{"count":55},"Школа №35":{"count":54},"Школа №4":{"count":281},"Школа №5":{"count":275},"Школа №6":{"count":217},"Школа №7":{"count":215},"Школа №8":{"count":188},"Школа №9":{"count":183},"مدرسة":{"count":92},"مدرسه":{"count":500},"市立南中学校":{"count":53},"市立南小学校":{"count":56},"市立東中学校":{"count":54}},"social_facility":{"Safe Haven":{"count":92},"Детский дом":{"count":70},"Социальный участковый":{"count":195}},"theatre":{"Amfiteatr":{"count":97},"Amphitheater":{"count":110},"Amphitheatre":{"count":109},"Anfiteatro":{"count":94},"Freilichtbühne":{"count":78},"Teatro Comunale":{"count":56},"Teatro Municipal":{"count":94}},"veterinary":{"Clinica Veterinaria":{"count":75},"Veterinaria":{"count":153}}};
23149 var leisure = {"fitness_centre":{"Anytime Fitness":{"count":143},"Gold's Gym":{"count":61},"LA Fitness":{"count":126},"Planet Fitness":{"count":106},"Snap Fitness":{"count":67}},"playground":{"Çocuk Parkı":{"count":60},"놀이터":{"count":292}},"sports_centre":{"Anytime Fitness":{"count":152},"Complejo Municipal de Deportes":{"count":88},"Complexe Sportif":{"count":51},"Curves":{"count":91},"Fitness First":{"count":70},"Gold's Gym":{"count":82},"Kieser Training":{"count":90},"LA Fitness":{"count":72},"Life Time Fitness":{"count":76},"McFit":{"count":60},"Mrs. Sporty":{"count":76},"Orlik":{"count":82},"Pabellón Municipal de Deportes":{"count":109},"Palestra Comunale":{"count":81},"Planet Fitness":{"count":106},"Polideportivo":{"count":248},"Salle Omnisport":{"count":57},"Schützenhaus":{"count":79},"Snap Fitness":{"count":51},"Virgin Active":{"count":69},"YMCA":{"count":174},"ДЮСШ":{"count":82},"Ледовый дворец":{"count":54},"体育館":{"count":80}},"swimming_pool":{"Schwimmerbecken":{"count":57},"Yüzme Havuzu":{"count":51},"プール":{"count":56},"游泳池":{"count":55}}};
23150 var man_made = {"windmill":{"De Hoop":{"count":57}}};
23151 var shop = {"alcohol":{"Alko":{"count":170},"BC Liquor Store":{"count":66},"BWS":{"count":157},"Bargain Booze":{"count":140},"Beer Store":{"count":66},"Botilleria":{"count":121},"Dan Murphy's":{"count":61},"Gall & Gall":{"count":511},"LCBO":{"count":430},"Liquor Depot":{"count":53},"Liquor Store":{"count":72},"Liquorland":{"count":112},"Mitra":{"count":60},"Nicolas":{"count":253},"SAQ":{"count":169},"Systembolaget":{"count":271},"The Beer Store":{"count":231},"Vinmonopolet":{"count":66},"Алкомаркет":{"count":67},"Ароматный мир":{"count":196},"Бристоль":{"count":329},"Градус":{"count":52},"Живое пиво":{"count":182},"Красное & Белое":{"count":989},"Кристалл":{"count":56},"Норман":{"count":146},"Отдохни":{"count":75},"Пиво":{"count":73},"Разливное пиво":{"count":143}},"baby_goods":{"Aubert":{"count":56},"Babies R Us":{"count":80},"BabyOne":{"count":52},"西松屋":{"count":53}},"bakery":{"AILI":{"count":53},"Anker":{"count":85},"Awiteks":{"count":53},"Backshop":{"count":57},"Backwerk":{"count":161},"Baguette":{"count":72},"Bakers Delight":{"count":75},"Bakker Bart":{"count":97},"Banette":{"count":111},"Bäckerei Fuchs":{"count":62},"Bäckerei Grimminger":{"count":51},"Bäckerei Müller":{"count":68},"Bäckerei Schmidt":{"count":103},"Bäckerei Schneider":{"count":52},"Cooplands":{"count":63},"Dat Backhus":{"count":81},"Der Beck":{"count":114},"Der Mann":{"count":53},"Ditsch":{"count":70},"Dunkin' Donuts":{"count":55,"tags":{"cuisine":"donut"}},"Fornetti":{"count":113},"Goeken backen":{"count":53},"Goldilocks":{"count":124},"Greggs":{"count":613},"Hofpfisterei":{"count":134},"Ihle":{"count":108},"Julie's Bakeshop":{"count":57},"K&U":{"count":117},"K&U Bäckerei":{"count":54},"Kamps":{"count":268},"La Mie Câline":{"count":56},"Le Crobag":{"count":54},"Le Fournil":{"count":57},"Lila Bäcker":{"count":107},"Lipóti Pékség":{"count":54},"Marie Blachère":{"count":89},"Mlinar":{"count":80},"Musmanni":{"count":81},"Oebel":{"count":65},"Panaderia":{"count":615},"Paul":{"count":186},"Red Ribbon":{"count":72},"Schäfer's":{"count":146},"Sehne":{"count":91},"Stadtbäckerei":{"count":60},"Steinecke":{"count":268},"Sternenbäck":{"count":89},"Ströck":{"count":62},"Wiener Feinbäcker":{"count":55},"von Allwörden":{"count":65},"Булочная":{"count":71},"Горячий хлеб":{"count":54},"Каравай":{"count":56},"Кулиничи":{"count":121},"Кулиничі":{"count":59},"Свежий хлеб":{"count":68},"Хлеб":{"count":177},"مخبز":{"count":72},"مخبزة":{"count":55},"نان لواش":{"count":54},"نانوایی":{"count":665},"نانوایی بربری":{"count":140},"نانوایی سنگک":{"count":68},"نانوایی سنگکی":{"count":52},"نانوایی لواش":{"count":63}},"beauty":{"Marionnaud":{"count":54},"Sally Beauty Supply":{"count":151},"Yves Rocher":{"count":654}},"bed":{"Dänisches Bettenlager":{"count":157},"Matratzen Concord":{"count":361},"Mattress Firm":{"count":173},"Sleepy's":{"count":52}},"beverages":{"50嵐":{"count":101},"Dursty":{"count":77},"Edeka Getränkemarkt":{"count":69},"Fristo":{"count":88},"Getränke Hoffmann":{"count":187},"Getränkeland":{"count":81},"Getränkemarkt":{"count":110},"Orterer Getränkemarkt":{"count":64},"Rewe Getränkemarkt":{"count":256},"Trinkgut":{"count":112},"茶湯會":{"count":56}},"bicycle":{"Giant":{"count":52},"Halfords":{"count":158},"Веломарка":{"count":51},"サイクルベースあさひ":{"count":87}},"bookmaker":{"Betfred":{"count":320},"Coral":{"count":466},"Ladbrokes":{"count":629},"Paddy Power":{"count":127},"William Hill":{"count":634},"ΟΠΑΠ":{"count":102}},"butcher":{"Boucherie Charcuterie":{"count":51},"Carnicería":{"count":78},"Fleischerei Richter":{"count":51},"Húsbolt":{"count":52},"Macelleria":{"count":84},"Vinzenzmurr":{"count":55},"Ариант":{"count":84},"Великолукский мясокомбинат":{"count":173},"Мясная лавка":{"count":226},"Мясницкий ряд":{"count":64},"Мясной":{"count":53},"Мясо":{"count":156},"Наша Ряба":{"count":60},"Свежее мясо":{"count":111}},"car":{"Audi":{"count":191},"BMW":{"count":216},"Chevrolet":{"count":259},"Citroën":{"count":445},"Dacia":{"count":56},"Fiat":{"count":167},"Ford":{"count":446},"Honda":{"count":348},"Hyundai":{"count":421},"Isuzu":{"count":66},"Kia":{"count":456},"Land Rover":{"count":54},"Lexus":{"count":76},"Mazda":{"count":193},"Mercedes-Benz":{"count":447},"Mitsubishi":{"count":176},"Mitsubishi Motors":{"count":60},"NISSAN":{"count":51},"Nissan":{"count":424},"Opel":{"count":218},"Peugeot":{"count":527},"Porsche":{"count":97},"Renault":{"count":701},"Seat":{"count":90},"Skoda":{"count":143},"Subaru":{"count":118},"Suzuki":{"count":178},"Toyota":{"count":597},"Volkswagen":{"count":371},"Volvo":{"count":180}},"car_parts":{"Advance Auto Parts":{"count":306},"AutoZone":{"count":759},"Brezan":{"count":95},"Halfords":{"count":95},"NAPA Auto Parts":{"count":250},"Napa Auto Parts":{"count":61},"O'Reilly Auto Parts":{"count":374},"Repco":{"count":77},"Tokić":{"count":61},"repuestos automotrices":{"count":56},"Автозапчастини":{"count":61},"Автомир":{"count":53},"イエローハット":{"count":80},"オートバックス":{"count":91},"タイヤ館":{"count":83}},"car_repair":{"A.T.U":{"count":457},"Advance Auto Parts":{"count":290},"Borracharia":{"count":56},"Bosch Car Service":{"count":65},"Carglass":{"count":234},"Citroën":{"count":108},"Euromaster":{"count":142},"Feu Vert":{"count":178},"Firestone":{"count":224},"Firestone Complete Auto Care":{"count":73},"Ford":{"count":61},"Garage Renault":{"count":84},"Gomeria":{"count":153},"Gomería":{"count":107},"Goodyear":{"count":97},"Grease Monkey":{"count":57},"Halfords":{"count":56},"Jiffy Lube":{"count":464},"Kwik Fit":{"count":249},"Lubricentro":{"count":83},"Meineke":{"count":52},"Mekonomen":{"count":59},"Midas":{"count":462},"Mr. Lube":{"count":56},"NAPA Auto Parts":{"count":82},"Norauto":{"count":257},"O'Reilly Auto Parts":{"count":227},"Pep Boys":{"count":79},"Peugeot":{"count":152},"Pit Stop":{"count":84},"Point S":{"count":59},"Renault":{"count":294},"Roady":{"count":82},"Sears Auto Center":{"count":59},"Speedy":{"count":192},"Stacja Kontroli Pojazdów":{"count":70},"Taller":{"count":63},"Toyota":{"count":63},"Valvoline":{"count":52},"Valvoline Instant Oil Change":{"count":92},"Wulkanizacja":{"count":84},"ÖAMTC":{"count":52},"Автомастерская":{"count":93},"Авторемонт":{"count":57},"Автосервис":{"count":799},"Автосервис+шиномонтаж":{"count":66},"Вулканизация":{"count":72},"Замена масла":{"count":98},"СТО":{"count":1058},"Шиномонтаж":{"count":3591},"шиномонтаж":{"count":173}},"carpet":{"Carpet Right":{"count":111},"Carpetright":{"count":53}},"charity":{"Age UK":{"count":116},"Barnardo's":{"count":56},"British Heart Foundation":{"count":189},"Cancer Research UK":{"count":129},"Goodwill":{"count":120},"Oxfam":{"count":216},"Salvation Army":{"count":63},"Scope":{"count":74},"Sue Ryder":{"count":83}},"chemist":{"7 Дней":{"count":55},"Bipa":{"count":485},"Budnikowsky":{"count":114},"CVS":{"count":58},"Etos":{"count":486},"Kruidvat":{"count":1169},"Matas":{"count":74},"Müller":{"count":350},"Rossmann":{"count":2516},"Schlecker":{"count":51},"Teta":{"count":120},"Trekpleister":{"count":185},"Walgreens":{"count":142},"Watsons":{"count":123},"dm":{"count":1877},"Бытовая химия":{"count":73},"Магнит Косметик":{"count":233},"Мила":{"count":70},"Остров чистоты":{"count":110},"Рубль Бум":{"count":68},"Улыбка радуги":{"count":110},"スギ薬局":{"count":51},"丁丁藥局":{"count":72},"屈臣氏":{"count":134},"康是美":{"count":81}},"clothes":{"AOKI":{"count":119},"AWG":{"count":95},"Ackermans":{"count":98},"Adidas":{"count":224},"Adler":{"count":83},"American Apparel":{"count":89},"American Eagle Outfitters":{"count":93},"Anthropologie":{"count":55},"Ardene":{"count":55},"Armand Thiery":{"count":89},"Banana Republic":{"count":120},"Benetton":{"count":190},"Bershka":{"count":166},"Bonita":{"count":315},"Bonobo":{"count":59},"Brooks Brothers":{"count":55},"Burberry":{"count":63},"Burlington Coat Factory":{"count":104},"Burton":{"count":94},"C&A":{"count":860},"Cache Cache":{"count":59},"Calvin Klein":{"count":78},"Calzedonia":{"count":264},"Camaïeu":{"count":167},"Caroll":{"count":75},"Carter's":{"count":64},"Cecil":{"count":119},"Celio":{"count":206},"Charles Vögele":{"count":133},"Chico's":{"count":96},"Cropp":{"count":68},"Cubus":{"count":65},"Desigual":{"count":175},"Devred":{"count":59},"Didi":{"count":72},"Diesel":{"count":77},"Dorothy Perkins":{"count":85},"Dress Barn":{"count":135},"Dressmann":{"count":67},"Eddie Bauer":{"count":54},"Edgars":{"count":117},"Engbers":{"count":64},"Ernsting's family":{"count":720},"Esprit":{"count":404},"Etam":{"count":121},"Express":{"count":56},"Fat Face":{"count":82},"Forever 21":{"count":124},"Gant":{"count":78},"Gap":{"count":258},"Gerry Weber":{"count":220},"Gina Laura":{"count":80},"Goodwill":{"count":65},"Guess":{"count":146},"Gymboree":{"count":60},"Gémo":{"count":99},"H&M":{"count":1467},"Hallhuber":{"count":63},"House":{"count":67},"Hugo Boss":{"count":109},"Humana":{"count":83},"Hunkemöller":{"count":224},"Intimissimi":{"count":173},"JBC":{"count":54},"Jack & Jones":{"count":174},"Jack Wolfskin":{"count":68},"Jeans Fritz":{"count":110},"Jennyfer":{"count":81},"Jet":{"count":68},"Jigsaw":{"count":51},"Jules":{"count":120},"Justice":{"count":81},"KappAhl":{"count":68},"KiK":{"count":1862},"Kiabi":{"count":276},"La Halle":{"count":148},"Lacoste":{"count":193},"Lane Bryant":{"count":86},"Levi's":{"count":197},"Lindex":{"count":120},"Loft":{"count":62},"Mango":{"count":339},"Marc O'Polo":{"count":82},"Mark's":{"count":76},"Marks & Spencer":{"count":53},"Marshalls":{"count":218},"Massimo Dutti":{"count":109},"Matalan":{"count":144},"Maurices":{"count":70},"Max Mara":{"count":55},"Men's Wearhouse":{"count":128},"Mexx":{"count":68},"Michael Kors":{"count":55},"Mim":{"count":57},"Monsoon":{"count":75},"Mr Price":{"count":99},"NKD":{"count":783},"New Look":{"count":280},"New Yorker":{"count":350},"NewYorker":{"count":54},"Next":{"count":313},"Nike":{"count":122},"Nordstrom Rack":{"count":57},"OVS":{"count":92},"Okaïdi":{"count":63},"Old Navy":{"count":361},"Only":{"count":94},"Orchestra":{"count":117},"Original Marines":{"count":60},"Orsay":{"count":168},"Outfit":{"count":51},"Outlet":{"count":63},"Palmers":{"count":78},"Peacocks":{"count":178},"Peek & Cloppenburg":{"count":69},"Pep":{"count":139},"Pepco":{"count":153},"Petit Bateau":{"count":67},"Pimkie":{"count":163},"Plato's Closet":{"count":53},"Primark":{"count":177},"Promod":{"count":195},"Pull & Bear":{"count":63},"Puma":{"count":65},"Reitmans":{"count":71},"Reserved":{"count":150},"River Island":{"count":125},"Ross":{"count":363},"Sela":{"count":58},"Sergent Major":{"count":77},"Shoeby":{"count":109},"Sisley":{"count":82},"Springfield":{"count":83},"Stefanel":{"count":63},"Steps":{"count":56},"Stradivarius":{"count":103},"Street One":{"count":153},"Superdry":{"count":82},"TJ Maxx":{"count":200},"TK Maxx":{"count":209},"Takko":{"count":843},"Talbots":{"count":54},"Tally Weijl":{"count":151},"Tati":{"count":64},"Terranova":{"count":63},"Tesha":{"count":76},"Tezenis":{"count":98},"The Children's Place":{"count":71},"The North Face":{"count":56},"The Sting":{"count":53},"Timberland":{"count":87},"Toko Pakaian":{"count":72},"Tom Tailor":{"count":120},"Tommy Hilfiger":{"count":206},"Topshop":{"count":62},"Triumph":{"count":132},"Truworths":{"count":72},"Ulla Popken":{"count":117},"Uniqlo":{"count":63},"United Colors of Benetton":{"count":210},"Urban Outfitters":{"count":130},"Vero Moda":{"count":222},"Victoria's Secret":{"count":143},"Vögele":{"count":191},"WE":{"count":68},"Wibra":{"count":99},"Winners":{"count":112},"Woolworths":{"count":119},"Yamamay":{"count":65},"Zara":{"count":540},"Zeeman":{"count":379},"mister*lady":{"count":59},"s.Oliver":{"count":103},"Детская одежда":{"count":59},"Женская одежда":{"count":65},"Липненски":{"count":81},"Московская ярмарка":{"count":51},"Одежда":{"count":163},"Смешные цены":{"count":86},"Спецодежда":{"count":85},"しまむら":{"count":213},"ユニクロ":{"count":201},"ワークマン":{"count":65},"洋服の青山":{"count":242},"西松屋":{"count":113}},"coffee":{"Café Amazon":{"count":212},"Coffee Shop":{"count":71},"Nespresso":{"count":74},"Starbucks":{"count":264,"tags":{"cuisine":"coffee_shop"}},"Tchibo":{"count":197}},"computer":{"Apple Store":{"count":75},"DNS":{"count":234},"PC World":{"count":59},"ДНС":{"count":55}},"confectionery":{"Fagyizó":{"count":58},"Hussel":{"count":78},"Leonidas":{"count":84},"T. SN":{"count":77},"Thorntons":{"count":66}},"convenience":{"711":{"count":64},"777":{"count":58},"24 часа":{"count":85},"7-Eleven":{"count":11418},"8 à Huit":{"count":82},"99 Speedmart":{"count":85},"ABC":{"count":716},"AMPM":{"count":125},"Aibė":{"count":112},"Alepa":{"count":60},"Alfamart":{"count":427},"Alimentara":{"count":63},"Almacen":{"count":405},"Almacén":{"count":94},"Aral":{"count":93},"BP":{"count":273},"BP Shop":{"count":70},"Baqala":{"count":181},"Best One":{"count":57},"Best-One":{"count":63},"Biedronka":{"count":98},"Bodega":{"count":83},"Bonjour":{"count":71},"CBA":{"count":299},"COOP":{"count":470},"COOP Jednota":{"count":381},"CU":{"count":324},"Carrefour City":{"count":91},"Carrefour Express":{"count":255},"Casey's General Store":{"count":225},"Casino":{"count":91},"Casino Shop":{"count":56},"Centra":{"count":139},"Central Convenience Store":{"count":69},"Chevron":{"count":110},"Circle K":{"count":790},"Citgo":{"count":73},"Co-Op":{"count":54},"Co-op":{"count":161},"Coles Express":{"count":217},"Coop":{"count":492},"Coop Jednota":{"count":128},"Corner Store":{"count":109},"Costcutter":{"count":435},"Couche-Tard":{"count":139},"Cumberland Farms":{"count":109},"Daisy Mart":{"count":57},"Delikatesy":{"count":148},"Delikatesy Centrum":{"count":182},"Dollar General":{"count":646},"Dollar Tree":{"count":67},"Dépanneur":{"count":53},"Esso":{"count":143},"Express":{"count":53},"Extra":{"count":86},"Exxon":{"count":51},"Family Dollar":{"count":85},"FamilyMart":{"count":919},"Food Mart":{"count":512},"Four Square":{"count":99},"Franprix":{"count":96},"Fresh":{"count":67},"Freshmarket":{"count":224},"GS25":{"count":343},"Groszek":{"count":254},"Hasty Market":{"count":87},"Holiday":{"count":67},"Hruška":{"count":89},"Indomaret":{"count":483},"Jednota":{"count":66},"Joker":{"count":56},"K-Market":{"count":104},"Kangaroo":{"count":54},"Kangaroo Express":{"count":51},"Kiosco":{"count":74},"Kisbolt":{"count":94},"Konzum":{"count":229},"Kum & Go":{"count":127},"Kwik Trip":{"count":134},"Lawson":{"count":311},"Lewiatan":{"count":565},"Lifestyle Express":{"count":114},"Londis":{"count":505},"M&S Simply Food":{"count":72},"Mac's":{"count":295},"Mace":{"count":166},"Magazin":{"count":81},"Magazin Mixt":{"count":139},"Magazin Non-Stop":{"count":62},"Magazin mixt":{"count":57},"Marathon":{"count":59},"Maxikiosco":{"count":86},"Małpka Express":{"count":71},"McColl's":{"count":289},"Mercator":{"count":122},"Migrolino":{"count":63},"Mini ABC":{"count":77},"Mini Market":{"count":1312},"Mini Market Non-Stop":{"count":134},"Mini Mart":{"count":78},"Mini Stop":{"count":466},"Minimarket":{"count":255},"Minimercado":{"count":77},"Mlin i pekare":{"count":63},"Mobil":{"count":82},"Nasz Sklep":{"count":92},"Nisa":{"count":70},"Nisa Local":{"count":164},"OK":{"count":107},"OK-Mart":{"count":51},"OK便利商店":{"count":96},"OK便利店 Circle K":{"count":92},"Odido":{"count":148},"On The Run":{"count":53},"On the Run":{"count":111},"One Stop":{"count":294},"Oxxo":{"count":2261},"Parduotuvė":{"count":102},"Petit Casino":{"count":297},"Plaid Pantry":{"count":69},"Potraviny":{"count":438},"Prehrana":{"count":88},"Premier":{"count":321},"Proxi":{"count":249},"Proxy":{"count":53},"Pulperia":{"count":56},"Pulpería":{"count":51},"QuikTrip":{"count":161},"Rite Aid":{"count":72},"Royal Farms":{"count":90},"Sainsbury's Local":{"count":208},"Sale":{"count":89},"Sari-sari Store":{"count":82},"Select":{"count":133},"Sheetz":{"count":137},"Shell":{"count":479},"Shell Select":{"count":71},"Shop & Go":{"count":80},"Siwa":{"count":157},"Sklep spożywczy":{"count":151},"Smíšené zboží":{"count":57},"Spar":{"count":1472},"Speedway":{"count":108},"Społem":{"count":199},"Spätkauf":{"count":60},"Statoil":{"count":62},"Stewart's":{"count":255},"Stores":{"count":70},"Stripes":{"count":63},"Studenac":{"count":113},"Sunkus":{"count":51},"Sunoco":{"count":65},"Słoneczko":{"count":61},"TESCO Lotus Express":{"count":55},"Tchibo":{"count":75},"Tesco":{"count":54},"Tesco Express":{"count":661},"Tesco Lotus Express":{"count":107},"The Co-operative Food":{"count":341},"Tom Market 89":{"count":232},"Total":{"count":172},"United Dairy Farmers":{"count":55},"Utile":{"count":63},"Valero":{"count":71},"Vegyesbolt":{"count":391},"Večerka":{"count":131},"Vival":{"count":381},"Volg":{"count":149},"Wawa":{"count":279},"Weltladen":{"count":64},"Woolworths Petrol":{"count":97},"abc":{"count":374},"ampm":{"count":152},"best-one":{"count":52},"odido":{"count":77},"Élelmiszer":{"count":59},"Élelmiszerbolt":{"count":65},"Żabka":{"count":1656},"Žabka":{"count":61},"АТБ":{"count":56},"Августина":{"count":52},"Авоська":{"count":115},"Агрокомплекс":{"count":79},"Альянс":{"count":51},"Апельсин":{"count":72},"Ассорти":{"count":118},"Белорусские продукты":{"count":58},"Берёзка":{"count":193},"Везунчик":{"count":66},"Верный":{"count":61},"Весна":{"count":101},"Ветеран":{"count":56},"Визит":{"count":99},"Виктория":{"count":164},"ВкусВилл":{"count":131},"Гастроном":{"count":383},"Гермес":{"count":68},"Гроздь":{"count":52},"Гурман":{"count":92},"Дикси":{"count":270},"Домашний":{"count":77},"Евроопт":{"count":152},"Елена":{"count":68},"Ермолино":{"count":51},"КазМунайГаз":{"count":117},"Калинка":{"count":61},"Каравай":{"count":52},"Квартал":{"count":57},"Кировский":{"count":86},"Колобок":{"count":51},"Колосок":{"count":58},"Копеечка":{"count":99},"Копейка":{"count":65},"Корзинка":{"count":54},"Крамниця":{"count":64},"Кристалл":{"count":57},"Кулинария":{"count":134},"Купец":{"count":64},"Ласточка":{"count":51},"Лидер":{"count":60},"Любимый":{"count":84},"Люкс":{"count":59},"Магазин при АЗС":{"count":54},"Магнит":{"count":1991},"Магнолия":{"count":88},"Мария-Ра":{"count":197},"Маяк":{"count":76},"Меркурий":{"count":77},"Мечта":{"count":103},"Минимаркет":{"count":424},"Мираж":{"count":56},"Монетка":{"count":165},"Надежда":{"count":115},"Ника":{"count":57},"Оазис":{"count":57},"Олимп":{"count":51},"Перекресток":{"count":157},"Подсолнух":{"count":69},"Престиж":{"count":58},"Продукти":{"count":1446},"Продуктовый":{"count":307},"Продуктовый магазин":{"count":803},"Продукты":{"count":8416},"Продукты 24":{"count":65},"Пятёрочка":{"count":1324},"Радуга":{"count":165},"Родны кут":{"count":90},"Ромашка":{"count":83},"Русь":{"count":61},"Светлана":{"count":96},"Сказка":{"count":62},"Смак":{"count":151},"Солнечный":{"count":54},"Солнышко":{"count":54},"Татьяна":{"count":68},"Теремок":{"count":105},"Тройка":{"count":62},"У Палыча":{"count":69},"Универсам":{"count":153},"Фортуна":{"count":97},"Хороший":{"count":55},"Центральный":{"count":73},"Чайка":{"count":57},"Шанс":{"count":60},"Эконом":{"count":72},"Юбилейный":{"count":56},"Юлия":{"count":58},"продукты":{"count":157},"მარკეტი":{"count":134},"მარკეტი (Market)":{"count":71},"サンクス":{"count":970,"tags":{"name:en":"sunkus"}},"サークルK":{"count":1109,"tags":{"name:en":"Circle K"}},"スリーエフ":{"count":228},"セイコーマート":{"count":449},"セブンイレブン":{"count":7859,"tags":{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{"count":332},"セーブオン":{"count":71},"デイリーヤマザキ":{"count":421},"ファミリーマート":{"count":4457,"tags":{"name:en":"FamilyMart"}},"ポプラ":{"count":101},"ミニストップ":{"count":773,"tags":{"name:en":"MINISTOP"}},"ヤマザキショップ":{"count":106},"ローソン":{"count":4247,"tags":{"name:en":"LAWSON"}},"ローソンストア100":{"count":272},"全家":{"count":482},"全家便利商店":{"count":833},"萊爾富":{"count":405},"세븐일레븐":{"count":157}},"copyshop":{"FedEx Office":{"count":53},"FedEx Office Print and Ship Center":{"count":170}},"cosmetics":{"Douglas":{"count":58},"Lush":{"count":80},"Marionnaud":{"count":55},"Sephora":{"count":184},"The Body Shop":{"count":95},"Yves Rocher":{"count":111},"Л'Этуаль":{"count":111},"Магнит Косметик":{"count":116},"Магнит косметик":{"count":63},"Магнит-Косметик":{"count":55},"Мила":{"count":68},"Подружка":{"count":51}},"craft":{"Hobby Lobby":{"count":96},"Michaels":{"count":222}},"deli":{"ほっともっと":{"count":58}},"department_store":{"Argos":{"count":90},"Bed Bath & Beyond":{"count":72},"Big Lots":{"count":142},"Big W":{"count":120},"Canadian Tire":{"count":176},"Coppel":{"count":55},"Debenhams":{"count":118},"Dillard's":{"count":86},"Dollar General":{"count":62},"Dollar Tree":{"count":64},"El Corte Inglés":{"count":61},"Family Dollar":{"count":76},"Fred Meyer":{"count":51},"Galeria Kaufhof":{"count":60},"HEMA":{"count":248},"Harvey Norman":{"count":62},"JCPenney":{"count":365},"Karstadt":{"count":66},"Kmart":{"count":390},"Kohl's":{"count":371},"Lojas Americanas":{"count":63},"Macy's":{"count":292},"Marks & Spencer":{"count":136},"Marshalls":{"count":58},"Myer":{"count":51},"Nordstrom":{"count":54},"Sam's Club":{"count":103},"Sears":{"count":462},"Shopko":{"count":65},"Target":{"count":1104},"The Warehouse":{"count":68},"Walmart":{"count":847},"Walmart Supercenter":{"count":234},"Woolworth":{"count":153},"Магнит":{"count":88},"Универмаг":{"count":170}},"doityourself":{"Ace Hardware":{"count":300},"B&Q":{"count":229},"Bauhaus":{"count":223},"Biltema":{"count":64},"Brico":{"count":126},"Bricomarché":{"count":425},"Bricorama":{"count":117},"Bunnings Warehouse":{"count":210},"Canadian Tire":{"count":138},"Castorama":{"count":168},"Easy":{"count":53},"Gamma":{"count":133},"Globus Baumarkt":{"count":52},"Hagebaumarkt":{"count":132},"Hellweg":{"count":70},"Home Depot":{"count":1345},"Home Hardware":{"count":172},"Homebase":{"count":205},"Hornbach":{"count":134},"Hubo":{"count":107},"Karwei":{"count":77},"Lagerhaus":{"count":116},"Leroy Merlin":{"count":285},"Lowe's":{"count":1236},"Lowes":{"count":95},"Menards":{"count":132},"Mr Bricolage":{"count":112},"Mr.Bricolage":{"count":139},"OBI":{"count":501},"Point P":{"count":125},"Praktiker":{"count":54},"Praxis":{"count":61},"Rona":{"count":77},"Screwfix":{"count":80},"Sonderpreis Baumarkt":{"count":68},"Tekzen":{"count":112},"Toom Baumarkt":{"count":155},"Weldom":{"count":110},"Wickes":{"count":159},"Леруа Мерлен":{"count":54},"Мастер":{"count":59},"Сантехника":{"count":51},"Строитель":{"count":67},"Стройматериалы":{"count":506},"Хозтовары":{"count":137},"カインズホーム":{"count":51},"コメリ":{"count":137},"コーナン":{"count":77}},"dry_cleaning":{"Cleaners":{"count":103},"Pressing":{"count":58},"Диана":{"count":88},"Химчистка":{"count":73},"ホワイト急便":{"count":136}},"electronics":{"Apple Store":{"count":63},"BCC":{"count":54},"Batteries Plus Bulbs":{"count":74},"Bell":{"count":73},"Best Buy":{"count":706},"Boulanger":{"count":71},"Currys":{"count":109},"Currys PC World":{"count":70},"DNS":{"count":111},"Darty":{"count":168},"Elektra":{"count":64},"Elgiganten":{"count":67},"Euronics":{"count":247},"Expert":{"count":224},"Hartlauer":{"count":64},"Interdiscount":{"count":57},"La Curacao":{"count":69},"Maplin":{"count":114},"Media Expert":{"count":163},"Media Markt":{"count":422},"Musimundo":{"count":53},"Neonet":{"count":97},"RTV Euro AGD":{"count":68},"Radio Shack":{"count":485},"Rogers":{"count":61},"Samsung":{"count":164},"Saturn":{"count":155},"Sony":{"count":51},"The Source":{"count":91},"Unieuro":{"count":66},"М.Видео":{"count":121},"Фокстрот":{"count":76},"Эксперт":{"count":70},"Эльдорадо":{"count":313},"エディオン":{"count":74},"ケーズデンキ":{"count":136},"コジマ":{"count":53},"ヤマダ電機":{"count":162},"全國電子":{"count":72},"燦坤3C":{"count":52}},"erotic":{"Orion":{"count":85}},"fabric":{"Ткани":{"count":121}},"farm":{"Hofladen":{"count":63}},"florist":{"Blume 2000":{"count":94},"Blumen Risse":{"count":69},"Fleuriste":{"count":54},"Interflora":{"count":78},"Monceau Fleurs":{"count":69},"Virágbolt":{"count":64},"Квіти":{"count":86},"Цветочный магазин":{"count":57},"Цветы":{"count":1098}},"frame":{"rumah penduduk":{"count":316}},"funeral_directors":{"Funeraria":{"count":51},"The Co-operative Funeralcare":{"count":82},"Ритуальные услуги":{"count":133}},"furniture":{"Aaron's":{"count":57},"Black Red White":{"count":79},"Bodzio":{"count":61},"But":{"count":162},"Casa":{"count":62},"Conforama":{"count":174},"DFS":{"count":52},"Dänisches Bettenlager":{"count":464},"Fly":{"count":53},"Harveys":{"count":58},"IKEA":{"count":234},"JYSK":{"count":431},"Kwantum":{"count":54},"Leen Bakker":{"count":72},"Pier 1 Imports":{"count":95},"Roller":{"count":99},"The Brick":{"count":68},"Меблі":{"count":70},"ニトリ":{"count":93}},"garden_centre":{"Dehner":{"count":59},"Gamm Vert":{"count":210},"Jardiland":{"count":124},"Point Vert":{"count":68},"Welkoop":{"count":97},"Семена":{"count":53}},"gift":{"Card Factory":{"count":116},"Hallmark":{"count":163},"Подарки":{"count":56}},"greengrocer":{"Frutería":{"count":60},"Овощи и фрукты":{"count":71}},"hairdresser":{"Barbershop":{"count":51},"Berber":{"count":71},"Cost Cutters":{"count":69},"Fantastic Sams":{"count":53},"Figaro":{"count":79},"First Choice Haircutters":{"count":51},"Franck Provost":{"count":136},"Frizerie":{"count":59},"Great Clips":{"count":578},"Haarmonie":{"count":79},"Haarscharf":{"count":59},"Hair Cuttery":{"count":121},"Hairkiller":{"count":73},"Jean Louis David":{"count":90},"Jean-Louis David":{"count":59},"Klier":{"count":239},"Klipp":{"count":76},"Le Salon":{"count":55},"Marco Aldany":{"count":55},"Peluquería":{"count":165},"Salon":{"count":57},"Salon fryzjerski":{"count":52},"Sport Clips":{"count":114},"Super Cuts":{"count":55},"Supercuts":{"count":359},"Tchip":{"count":62},"The Barber Shop":{"count":130},"Toni & Guy":{"count":77},"Top Hair":{"count":74},"Виктория":{"count":53},"Елена":{"count":53},"Локон":{"count":67},"Парикмахерская":{"count":798},"Перукарня":{"count":119},"Салон красоты":{"count":58},"Стиль":{"count":94},"Шарм":{"count":79},"حلاق":{"count":65}},"hardware":{"1000 мелочей":{"count":125},"Ferretería":{"count":295},"Harbor Freight Tools":{"count":57},"Home Hardware":{"count":94},"Lowe's":{"count":74},"Quincaillerie":{"count":105},"True Value":{"count":52},"Würth":{"count":51},"Промтовары":{"count":67},"Сантехника":{"count":87},"Стройматериалы":{"count":142},"Товары для дома":{"count":69},"Хозтовары":{"count":477}},"hearing_aids":{"Amplifon":{"count":124},"Geers":{"count":66},"Kind Hörgeräte":{"count":74},"amplifon":{"count":52}},"hifi":{"Bang & Olufsen":{"count":51}},"houseware":{"Blokker":{"count":264},"Marskramer":{"count":72},"Xenos":{"count":119}},"ice_cream":{"Мороженое":{"count":51}},"interior_decoration":{"Casa":{"count":65},"Depot":{"count":97}},"jewelry":{"585":{"count":94},"Apart":{"count":53},"Bijou Brigitte":{"count":172},"Christ":{"count":116},"Claire's":{"count":99},"Ernest Jones":{"count":53},"H Samuel":{"count":55},"James Avery Jewelry":{"count":99},"Julien d'Orcel":{"count":123},"Kay Jewelers":{"count":78},"Pandora":{"count":280},"Swarovski":{"count":240},"Адамас":{"count":60},"Золото":{"count":51}},"kiosk":{"Aral":{"count":76},"Edicola":{"count":94},"Esso":{"count":51},"KIOS":{"count":288},"Kiosco":{"count":203},"Kiosko":{"count":62},"Kiosque":{"count":68},"Kolporter":{"count":88},"Lietuvos spauda":{"count":62},"Narvesen":{"count":188},"Pressbyrån":{"count":117},"Pulpería":{"count":61},"R-Kioski":{"count":352},"Relay":{"count":61},"Ruch":{"count":187},"Shell":{"count":122},"Tabak Trafik":{"count":83},"Tisak":{"count":245},"Trafik":{"count":221},"Trafika":{"count":64},"Trinkhalle":{"count":98},"Warung":{"count":73},"Белсоюзпечать":{"count":59},"Киоск":{"count":143},"Мороженое":{"count":56},"Продукты":{"count":212},"Роспечать":{"count":233},"Союзпечать":{"count":94},"მარკეტი (Market)":{"count":94}},"kitchen":{"Cuisinella":{"count":60},"Home Utensils":{"count":65},"Kitchen":{"count":202},"kitchen":{"count":101}},"laundry":{"Launderette":{"count":51},"Lavandería":{"count":84},"コインランドリー":{"count":64}},"lottery":{"Loteria de la Provincia":{"count":63},"Lotería Nacional":{"count":221},"Lotería de la Provincia":{"count":349},"Lotto":{"count":192},"Lottózó":{"count":69},"ONCE":{"count":91}},"mall":{"Торговый центр":{"count":57}},"massage":{"Massage Envy":{"count":80}},"medical_supply":{"Pofam-Poznań":{"count":61}},"mobile_phone":{"3 Store":{"count":90},"AT&T":{"count":558},"Bell":{"count":140},"Bitė":{"count":66},"Boost Mobile":{"count":151},"Carphone Warehouse":{"count":357},"Claro":{"count":446},"Cricket":{"count":122},"Cricket Wireless":{"count":73},"Digicel":{"count":152},"EE":{"count":190},"MetroPCS":{"count":201},"Movistar":{"count":411},"O2":{"count":527},"Orange":{"count":730},"Personal":{"count":54},"Play":{"count":150},"Plus":{"count":122},"Rogers":{"count":52},"SFR":{"count":156},"Samsung":{"count":71},"Sprint":{"count":394},"T-Mobile":{"count":665},"TIM":{"count":67},"Telcel":{"count":52},"Tele2":{"count":186},"Telekom":{"count":148},"Telekom Shop":{"count":99},"Telenor":{"count":99},"Telus":{"count":69},"The Phone House":{"count":137},"Three":{"count":57},"Tim":{"count":51},"Télécentre":{"count":76},"Verizon":{"count":152},"Verizon Wireless":{"count":629},"Vodafone":{"count":1168},"Vodafone Shop":{"count":52},"Wind":{"count":156},"Yoigo":{"count":61},"au":{"count":136},"auショップ":{"count":340},"mobilcom debitel":{"count":63},"Алло":{"count":86},"Билайн":{"count":441},"Евросеть":{"count":1020},"Київстар":{"count":57},"МТС":{"count":1012},"Мегафон":{"count":687},"Связной":{"count":842},"Теле2":{"count":70},"ソフトバンクショップ":{"count":482},"ドコモショップ":{"count":426}},"money_lender":{"Money Mart":{"count":95}},"motorcycle":{"Harley Davidson":{"count":81},"Honda":{"count":238},"Suzuki":{"count":90},"Yamaha":{"count":235}},"music":{"HMV":{"count":81},"TSUTAYA":{"count":53}},"musical_instrument":{"Guitar Center":{"count":51}},"newsagent":{"Edicola":{"count":111},"Kolporter":{"count":56},"Maison de la Presse":{"count":132},"Relay":{"count":246},"Tabac Presse":{"count":82},"Trafika":{"count":60},"WHSmith":{"count":160},"Белсоюзпечать":{"count":52},"Витебскоблсоюзпечать":{"count":56},"Первая полоса":{"count":57},"Печать":{"count":74},"Роспечать":{"count":371},"Союзпечать":{"count":130}},"optician":{"Alain Afflelou":{"count":204},"Apollo":{"count":441},"Atol":{"count":124},"Boots Opticians":{"count":101},"Fielmann":{"count":477},"General Óptica":{"count":53},"Grand Optical":{"count":57},"Générale d'Optique":{"count":94},"Hakim Optical":{"count":73},"Hans Anders":{"count":105},"Krys":{"count":192},"Les Opticiens Mutualistes":{"count":103},"Optic 2000":{"count":281},"Optica":{"count":159},"Optical Center":{"count":125},"Pearle":{"count":199},"Pearle Vision":{"count":52},"Specsavers":{"count":384},"Sunglass Hut":{"count":61},"Synoptik":{"count":55},"Vision Express":{"count":183},"แว่นท็อปเจริญ":{"count":97},"メガネスーパー":{"count":62},"眼鏡市場":{"count":206}},"outdoor":{"Jack Wolfskin":{"count":51},"Mountain Warehouse":{"count":74},"REI":{"count":77},"Рыболов":{"count":70}},"paint":{"Benjamin Moore":{"count":58},"Comex":{"count":68},"Jotun":{"count":51},"National Paints":{"count":53},"Sherwin Williams":{"count":323},"Sherwin-Williams Paints":{"count":59}},"pawnbroker":{"Cash Converters":{"count":83},"Lombard":{"count":55},"Palawan Pawnshop":{"count":52}},"pet":{"Das Futterhaus":{"count":158},"Fressnapf":{"count":620},"Global Pet Foods":{"count":54},"Maxi Zoo":{"count":65},"Pet Valu":{"count":112},"PetSmart":{"count":491},"Petco":{"count":377},"Pets at Home":{"count":170},"Бетховен":{"count":60},"Зоотовары":{"count":79},"Четыре лапы":{"count":56}},"second_hand":{"Goodwill":{"count":235},"Value Village":{"count":53}},"shoes":{"Adidas":{"count":51},"Aldo":{"count":74},"Bata":{"count":281},"Besson Chaussures":{"count":124},"Brantano":{"count":132},"CCC":{"count":245},"Camper":{"count":51},"Chaussea":{"count":102},"Clarks":{"count":268},"Converse":{"count":58},"Crocs":{"count":64},"DSW":{"count":52},"Deichmann":{"count":1231},"Dosenbach":{"count":58},"Ecco":{"count":185},"Famous Footwear":{"count":178},"Foot Locker":{"count":240},"Geox":{"count":151},"Kari":{"count":66},"La Halle aux Chaussures":{"count":158},"Mephisto":{"count":57},"Minelli":{"count":55},"New Balance":{"count":52},"Payless":{"count":56},"Payless Shoe Source":{"count":316},"Payless ShoeSource":{"count":133},"Quick Schuh":{"count":116},"Rack Room Shoes":{"count":51},"Reno":{"count":233},"Rieker":{"count":83},"Salamander":{"count":103},"San Marina":{"count":54},"Scapino":{"count":67},"Shoe Carnival":{"count":66},"Shoe Zone":{"count":161},"Siemes Schuhcenter":{"count":69},"Skechers":{"count":83},"Tamaris":{"count":99},"Timberland":{"count":51},"vanHaren":{"count":98},"Éram":{"count":88},"Ремонт обуви":{"count":71},"ЦентрОбувь":{"count":76},"Юничел":{"count":73},"東京靴流通センター":{"count":81}},"sports":{"Adidas":{"count":132},"Aktiesport":{"count":61},"Big 5 Sporting Goods":{"count":93},"Decathlon":{"count":409},"Dick's Sporting Goods":{"count":222},"Hervis":{"count":66},"Intersport":{"count":737},"JD Sports":{"count":58},"Nike":{"count":95},"Sport 2000":{"count":209},"Sports Authority":{"count":108},"Sports Direct":{"count":217},"Stadium":{"count":53},"Спортмастер":{"count":208},"Спорттовары":{"count":68}},"stationery":{"Bureau Vallée":{"count":64},"Libro":{"count":73},"McPaper":{"count":158},"Office Depot":{"count":378},"Office Max":{"count":169},"Officeworks":{"count":73},"Pagro":{"count":64},"Paperchase":{"count":54},"Ryman":{"count":85},"Staples":{"count":671},"Канцтовары":{"count":140}},"supermarket":{"7-Eleven":{"count":60},"A&O":{"count":67},"A101":{"count":388},"AD Delhaize":{"count":80},"ADEG":{"count":85},"Ahorramás":{"count":66},"Albert":{"count":245},"Albert Heijn":{"count":766},"Albertsons":{"count":316},"Aldi":{"count":6323},"Aldi Nord":{"count":356},"Aldi Süd":{"count":916},"Alfamart":{"count":109},"Alimerka":{"count":96},"Alnatura":{"count":97},"Asda":{"count":474},"Atac":{"count":53},"Atacadão":{"count":80},"Auchan":{"count":229},"BM":{"count":52},"Biedronka":{"count":2348},"Big C":{"count":53},"Billa":{"count":1592},"Bim":{"count":678},"Biocoop":{"count":159},"Bodega Aurrera":{"count":264},"Budgens":{"count":77},"Bulk Barn":{"count":54},"Bunnpris":{"count":69},"CBA":{"count":236},"CONAD":{"count":67},"COOP":{"count":255},"COOP Jednota":{"count":177},"CRAI":{"count":66},"CU":{"count":64},"Caprabo":{"count":144},"Cargills Food City":{"count":79},"Carrefour":{"count":2544},"Carrefour City":{"count":349},"Carrefour Contact":{"count":270},"Carrefour Express":{"count":921},"Casino":{"count":337},"Centra":{"count":63},"Centre Commercial E. Leclerc":{"count":385},"Checkers":{"count":140},"Chedraui":{"count":80},"Co-Op":{"count":62},"Co-op":{"count":352},"Co-operative":{"count":51},"Coles":{"count":583},"Colmado":{"count":103},"Colruyt":{"count":212},"Combi":{"count":127},"Comercial Mexicana":{"count":59},"Conad":{"count":560},"Conad City":{"count":95},"Condis":{"count":126},"Consum":{"count":236},"Continente":{"count":111},"Coop":{"count":1665},"Coop Extra":{"count":88},"Coop Jednota":{"count":101},"Coop Konsum":{"count":96},"Costco":{"count":295},"Costcutter":{"count":93},"Coto":{"count":65},"Countdown":{"count":135},"Coviran":{"count":124},"Covirán":{"count":51},"Crai":{"count":119},"Cub Foods":{"count":57},"Dagli'Brugsen":{"count":135},"Deen":{"count":55},"Delhaize":{"count":228},"Delikatesy Centrum":{"count":209},"Denner":{"count":412},"Despar":{"count":209},"Despensa Familiar":{"count":81},"Dia":{"count":1329},"Dia %":{"count":181},"Dia Market":{"count":60},"Dino":{"count":298},"Dirk van den Broek":{"count":66},"Disco":{"count":74},"Diska":{"count":68},"Dollar General":{"count":106},"Dollar Tree":{"count":52},"Dunnes Stores":{"count":72},"E-Center":{"count":66},"E. Leclerc":{"count":186},"E. Leclerc Drive":{"count":97},"EKO":{"count":78},"EMTÉ":{"count":74},"Edeka":{"count":2231},"Ekom":{"count":64},"Ekono":{"count":68},"El Árbol":{"count":86},"Eroski":{"count":351},"Esselunga":{"count":106},"EuroSpin":{"count":81},"Eurospar":{"count":340},"Eurospin":{"count":328},"Extra":{"count":149},"Famiglia Cooperativa":{"count":89},"Famila":{"count":167},"Family Dollar":{"count":72},"Fareway":{"count":51},"Farmfoods":{"count":141},"Feneberg":{"count":64},"Food Basics":{"count":116},"Food Lion":{"count":425},"Foodland":{"count":192},"Foodworks":{"count":90},"Franprix":{"count":401},"Fred Meyer":{"count":70},"Freshmarket":{"count":86},"Froiz":{"count":97},"Føtex":{"count":74},"G20":{"count":71},"GS25":{"count":72},"Gadis":{"count":126},"Game":{"count":59},"Giant":{"count":276},"Giant Eagle":{"count":134},"Grand Frais":{"count":70},"Grocery Outlet":{"count":128},"Géant Casino":{"count":75},"H-E-B":{"count":274},"HIT":{"count":64},"Hannaford":{"count":95},"Harris Teeter":{"count":158},"Hemköp":{"count":87},"Heron Foods":{"count":55},"Hofer":{"count":484},"Hoogvliet":{"count":66},"Hruška":{"count":54},"Hy-Vee":{"count":121},"ICA":{"count":255},"ICA Kvantum":{"count":51},"IDEA":{"count":52},"IGA":{"count":568},"Iceland":{"count":538},"Indomaret":{"count":124},"Intermarché":{"count":1477},"Intermarché Contact":{"count":122},"Intermarché Super":{"count":261},"Interspar":{"count":117},"Irma":{"count":69},"Jewel-Osco":{"count":72},"Jumbo":{"count":476},"K+K":{"count":119},"Kaufland":{"count":1172},"King Soopers":{"count":99},"Kiwi":{"count":178},"Konsum":{"count":144},"Konzum":{"count":370},"Kroger":{"count":627},"Kvickly":{"count":60},"La Vie Claire":{"count":65},"Landi":{"count":54},"Leader Price":{"count":502},"Leclerc Drive":{"count":120},"Lewiatan":{"count":255},"Lider":{"count":78},"Lidl":{"count":8927},"Londis":{"count":52},"Lupa":{"count":79},"M&S Simply Food":{"count":52},"MPREIS":{"count":187},"Makro":{"count":226},"Markant":{"count":98},"Market Basket":{"count":57},"Marktkauf":{"count":117},"Match":{"count":139},"Maxi":{"count":198},"Maxi Dia":{"count":52},"Maxima":{"count":111},"Maxima X":{"count":158},"Maxima XX":{"count":69},"Mega Image":{"count":97},"Mego":{"count":52},"Meijer":{"count":129},"Meny":{"count":105},"Mercado":{"count":63},"Mercado Municipal":{"count":52},"Mercado de Abastos":{"count":57},"Mercadona":{"count":1228},"Mercator":{"count":155},"Merkur":{"count":132},"Metro":{"count":395},"Migros":{"count":641},"Mila":{"count":90},"Mini Market":{"count":81},"Minimarket":{"count":69},"Minipreço":{"count":213},"Mix Markt":{"count":60},"Monoprix":{"count":283},"More":{"count":61},"Morrisons":{"count":443},"NORMA":{"count":144},"NP":{"count":251},"Nah & Frisch":{"count":107},"Nahkauf":{"count":324},"Netto":{"count":4429},"Netto Marken-Discount":{"count":706},"New World":{"count":89},"No Frills":{"count":177},"Norfa XL":{"count":66},"Norma":{"count":1162},"Oxxo":{"count":278},"PENNY":{"count":89},"PLUS":{"count":92},"POLOmarket":{"count":172},"Palí":{"count":69},"Pam":{"count":77},"Penny":{"count":2819},"Penny Markt":{"count":77},"Petit Casino":{"count":146},"Pick n Pay":{"count":268},"Piggly Wiggly":{"count":103},"Pingo Doce":{"count":308},"Piotr i Paweł":{"count":112},"Plaza Vea":{"count":68},"Plodine":{"count":67},"Poiesz":{"count":53},"Price Chopper":{"count":132},"Prix":{"count":53},"Profi":{"count":203},"Proxi":{"count":75},"Proxy Delhaize":{"count":63},"Publix":{"count":645},"Punto Simply":{"count":54},"Puregold":{"count":75},"Pão de Açúcar":{"count":76},"QFC":{"count":54},"REMA 1000":{"count":89},"Ralphs":{"count":81},"Real":{"count":210},"Real Canadian Superstore":{"count":69},"Reliance Fresh":{"count":95},"Rema 1000":{"count":394},"Rewe":{"count":2808},"Rewe City":{"count":78},"Rimi":{"count":115},"S-Market":{"count":110},"Safeway":{"count":619},"Sainsbury's":{"count":595},"Sainsbury's Local":{"count":248},"Sam's Club":{"count":303},"Santa Isabel":{"count":174},"Save-A-Lot":{"count":100,"tags":{"shop":"supermarket"}},"ShopRite":{"count":53},"Shoprite":{"count":337},"Sigma":{"count":107},"Simply Market":{"count":541},"Sky":{"count":113},"Smith's":{"count":56},"Sobeys":{"count":186},"Soriana":{"count":194},"Spar":{"count":3381},"Społem":{"count":120},"Sprouts Farmers Market":{"count":71},"Stokrotka":{"count":227},"Stop & Shop":{"count":147},"Super C":{"count":57},"Super U":{"count":654},"SuperBrugsen":{"count":183},"SuperValu":{"count":80},"Superama":{"count":51},"Supersol":{"count":51},"Superspar":{"count":54},"Tegut":{"count":118},"Tengelmann":{"count":155},"Tesco":{"count":1373},"Tesco Express":{"count":566},"Tesco Extra":{"count":200},"Tesco Lotus":{"count":95},"Tesco Metro":{"count":153},"The Co-operative":{"count":79},"The Co-operative Food":{"count":1261},"Tommy":{"count":56},"Tottus":{"count":82},"Trader Joe's":{"count":345},"Treff 3000":{"count":134},"U Express":{"count":129},"Unimarc":{"count":256},"Unimarkt":{"count":104},"Utile":{"count":68},"Vea":{"count":67},"Vival":{"count":80},"Volg":{"count":231},"Waitrose":{"count":301},"Walmart":{"count":1164},"Walmart Neighborhood Market":{"count":171},"Walmart Supercenter":{"count":688},"Wasgau":{"count":51},"Wegmans":{"count":89},"Wellcome":{"count":51},"Whole Foods Market":{"count":379,"tags":{"shop":"supermarket"}},"Willys":{"count":89},"WinCo Foods":{"count":53},"Winn Dixie":{"count":168},"Woolworths":{"count":816},"denn's Biomarkt":{"count":147},"fakta":{"count":296},"real":{"count":58},"tegut":{"count":89},"Şok":{"count":271},"Żabka":{"count":88},"ΑΒ Βασιλόπουλος":{"count":82},"Γαλαξίας":{"count":54},"Μασούτης":{"count":85},"Σκλαβενίτης":{"count":92},"АТБ":{"count":618},"Абсолют":{"count":51},"Авоська":{"count":60},"Азбука Вкуса":{"count":66},"Атак":{"count":85},"Ашан":{"count":80},"Верный":{"count":226},"Виктория":{"count":74},"Вопак":{"count":59},"Гастроном":{"count":54},"Гроздь":{"count":63},"Десяточка":{"count":52},"Дикси":{"count":1670},"Евроопт":{"count":201},"Карусель":{"count":68},"Квартал":{"count":77},"Кировский":{"count":54},"Командор":{"count":75},"Красный Яр":{"count":58},"Лента":{"count":165},"Магнит":{"count":4289},"Магнолия":{"count":121},"Мария-Ра":{"count":159},"Монетка":{"count":363},"Народная 7Я семьЯ":{"count":199},"Перекресток":{"count":501},"Покупочка":{"count":73},"Полушка":{"count":213},"Пятёрочка":{"count":3622},"Радеж":{"count":64},"Рукавичка":{"count":78},"Светофор":{"count":73},"Седьмой континент":{"count":69},"Семейный":{"count":52},"Семья":{"count":85},"Супермаркет":{"count":65},"Сільпо":{"count":203},"Таврія‑В":{"count":66},"Универсам":{"count":77},"Фора":{"count":162},"Фуршет":{"count":86},"Хүнсний дэлгүүр":{"count":63},"Эдельвейс":{"count":55},"хүнсний дэлгүүр":{"count":73},"بقالة":{"count":74},"سوپر مارکت":{"count":75},"سوپرمارکت":{"count":79},"いなげや":{"count":66},"まいばすけっと":{"count":162},"イオン":{"count":95},"イトーヨーカドー":{"count":67},"カスミ":{"count":56},"マックスバリュ":{"count":143},"マルエツ":{"count":99},"ライフ":{"count":125},"全聯":{"count":74},"全聯福利中心":{"count":241},"惠康 Wellcome":{"count":57},"業務スーパー":{"count":176},"美廉社":{"count":74},"西友":{"count":137}},"tailor":{"Atelier de couture":{"count":63}},"tattoo":{"Tattoo":{"count":73}},"ticket":{"Boutique Grandes Lignes":{"count":60},"Guichet Transilien":{"count":243},"Касса":{"count":61},"Проездные билеты":{"count":65}},"tobacco":{"Dohánybolt":{"count":109},"Estanco":{"count":134},"Nemzeti Dohánybolt":{"count":926},"Tabacos":{"count":62},"Табакерка":{"count":73}},"toys":{"Dráčik":{"count":63},"Intertoys":{"count":242},"King Jouet":{"count":102},"La Grande Récré":{"count":112},"Maxi Toys":{"count":63},"Toys R Us":{"count":410,"tags":{"shop":"toys"}},"Детский мир":{"count":186},"Игрушки":{"count":95}},"travel_agency":{"D-reizen":{"count":64},"DER Reisebüro":{"count":52},"First Reisebüro":{"count":57},"Flight Centre":{"count":159},"Reiseland":{"count":52},"TUI":{"count":262},"The Co-operative Travel":{"count":58},"Thomas Cook":{"count":298},"Thomson":{"count":144}},"tyres":{"Borracharia":{"count":98},"Bridgestone":{"count":65},"Discount Tire":{"count":94},"Euromaster":{"count":76},"Firestone":{"count":57},"Gomeria":{"count":71},"Les Schwab Tire Center":{"count":59},"Vianor":{"count":52},"Vulcanizing Shop":{"count":54},"Вулканизация":{"count":113},"Шиномонтаж":{"count":419}},"variety_store":{"Action":{"count":147},"Bazar":{"count":56},"Big Bazar":{"count":60},"Big Lots":{"count":65},"Dollar General":{"count":345},"Dollar Tree":{"count":753},"Dollarama":{"count":404},"EuroShop":{"count":59},"Family Dollar":{"count":590},"Fix Price":{"count":97},"Fix price":{"count":127},"FixPrice":{"count":62},"GiFi":{"count":229},"Home Bargains":{"count":68},"Mäc-Geiz":{"count":59},"NOZ":{"count":82},"Poundland":{"count":197},"Poundworld":{"count":70},"Tedi":{"count":611},"ダイソー":{"count":226}},"video":{"Blockbuster":{"count":75},"Family Video":{"count":113},"TSUTAYA":{"count":122},"World of Video":{"count":53},"ゲオ":{"count":81}},"video_games":{"EB Games":{"count":101},"Game":{"count":76},"GameStop":{"count":676},"Micromania":{"count":83}}};
23152 var tourism = {"alpine_hut":{"КОШ":{"count":105}},"apartment":{"Двухкомнатная квартира на сутки":{"count":52}},"attraction":{"Arch":{"count":51},"Kursächsische Postmeilensäule":{"count":54},"Lavoir":{"count":109},"Maibaum":{"count":52},"Moab trail":{"count":55},"Moai":{"count":702},"OWŚ":{"count":102},"Sommerrodelbahn":{"count":54},"path continues":{"count":71},"path contiunes":{"count":75},"white blaze":{"count":53},"Кладбище еврейское":{"count":89},"Колесо обозрения":{"count":69},"Приусадебный парк":{"count":69},"Усадьба":{"count":53},"Хозяйственный двор":{"count":72},"Часовня":{"count":64},"дольмен":{"count":86}},"camp_site":{"Camping Municipal":{"count":198},"Camping municipal":{"count":80},"Campsite":{"count":70}},"guest_house":{"Casa":{"count":61},"Guest House":{"count":64},"Home":{"count":68},"OW \"Bielanka\"":{"count":54}},"hostel":{"Albergue de Peregrinos":{"count":67},"Hospedaje":{"count":70},"Hostal":{"count":124}},"hotel":{"B&B Hôtel":{"count":104},"B&b Hôtel":{"count":78},"Best Western":{"count":242},"Campanile":{"count":145},"Central Hotel":{"count":51},"City Hotel":{"count":74},"Comfort Inn":{"count":283},"Comfort Inn & Suites":{"count":67},"Comfort Suites":{"count":148},"Country Inn & Suites":{"count":83},"Courtyard by Marriott":{"count":155},"Crowne Plaza":{"count":85},"Days Inn":{"count":245},"Econo Lodge":{"count":70},"Embassy Suites":{"count":68},"Extended Stay America":{"count":102},"Fairfield Inn":{"count":60},"Fairfield Inn & Suites":{"count":67},"Formule 1":{"count":74},"Grand Hotel":{"count":90},"Hampton Inn":{"count":376},"Hampton Inn & Suites":{"count":96},"Hilton Garden Inn":{"count":183},"Holiday Inn":{"count":411},"Holiday Inn Express":{"count":479},"Holiday Inn Express & Suites":{"count":72},"Homewood Suites":{"count":61},"Hotel Central":{"count":92},"Hotel Europa":{"count":91},"Hotel Ibis":{"count":67},"Hotel Krone":{"count":58},"Hotel Panorama":{"count":61},"Hotel Plaza":{"count":62},"Hotel Post":{"count":60},"Hotel Royal":{"count":62},"Hotel Victoria":{"count":71},"Hotel zur Post":{"count":60},"Hôtel Ibis":{"count":70},"Hôtel de France":{"count":61},"Ibis":{"count":215},"Ibis Budget":{"count":188},"Ibis Styles":{"count":53},"Krone":{"count":68},"Kyriad":{"count":65},"La Quinta":{"count":54},"Marriott":{"count":57},"Mercure":{"count":109},"Motel 6":{"count":83},"Novotel":{"count":180},"Palace Hotel":{"count":54},"Park Hotel":{"count":88},"Parkhotel":{"count":64},"Premier Inn":{"count":400},"Première Classe":{"count":62},"Quality Inn":{"count":178},"Quality Inn & Suites":{"count":80},"Ramada":{"count":97},"Residence Inn":{"count":89},"Royal Hotel":{"count":94},"Sheraton":{"count":56},"Sleep Inn":{"count":68},"Staybridge Suites":{"count":54},"Super 8":{"count":229},"Travelodge":{"count":284},"Гостиница":{"count":166},"Уют":{"count":58},"東横イン":{"count":57}},"motel":{"Best Western":{"count":59},"Budget Inn":{"count":76},"Comfort Inn":{"count":131},"Days Inn":{"count":103},"Econo Lodge":{"count":117},"Motel":{"count":105},"Motel 6":{"count":214},"Quality Inn":{"count":113},"Rodeway Inn":{"count":102},"Super 8":{"count":173},"Travelodge":{"count":68}},"museum":{"Heimatmuseum":{"count":336},"Museum":{"count":51},"Stadtmuseum":{"count":86},"Tájház":{"count":93},"Краеведческий музей":{"count":247},"Музей":{"count":99}}};
23153 var dataSuggestions = {
23154         amenity: amenity,
23155         leisure: leisure,
23156         man_made: man_made,
23157         shop: shop,
23158         tourism: tourism
23159 };
23160
23161 var dataAddressFormats = [{"format":[["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["gb"],"format":[["housename"],["housenumber","street","unit"],["city","postcode"]]},{"countryCodes":["ie"],"format":[["housename"],["housenumber","street","unit"],["city"],["postcode"]]},{"countryCodes":["at","ch","de"],"format":[["street","housenumber"],["postcode","city"]]},{"countryCodes":["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","si","sk","sm","va"],"format":[["unit","street","housenumber"],["postcode","city"]]},{"countryCodes":["pl"],"format":[["street","housenumber"],["postcode"],["place","city"]]},{"countryCodes":["fr","lu","mo"],"format":[["unit","housenumber","street"],["postcode","city"]]},{"countryCodes":["br"],"format":[["street"],["housenumber","suburb"],["city","postcode"]]},{"countryCodes":["vn"],"format":[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{"countryCodes":["au","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","unit"],["postcode","district","city"]]},{"countryCodes":["ua"],"format":[["housenumber","postcode"],["street","unit"]]},{"countryCodes":["cn"],"format":[["postcode","province"],["city","district"],["street","housenumber"]]}];
23162
23163 var dataDeprecated = [{"old":{"amenity":"firepit"},"replace":{"leisure":"firepit"}},{"old":{"barrier":"wire_fence"},"replace":{"barrier":"fence","fence_type":"chain"}},{"old":{"barrier":"wood_fence"},"replace":{"barrier":"fence","fence_type":"wood"}},{"old":{"highway":"ford"},"replace":{"ford":"yes"}},{"old":{"highway":"stile"},"replace":{"barrier":"stile"}},{"old":{"highway":"incline"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"incline_steep"},"replace":{"highway":"road","incline":"up"}},{"old":{"highway":"unsurfaced"},"replace":{"highway":"road","incline":"unpaved"}},{"old":{"landuse":"wood"},"replace":{"landuse":"forest","natural":"wood"}},{"old":{"natural":"marsh"},"replace":{"natural":"wetland","wetland":"marsh"}},{"old":{"power_source":"*"},"replace":{"generator:source":"$1"}},{"old":{"power_rating":"*"},"replace":{"generator:output":"$1"}},{"old":{"shop":"organic"},"replace":{"shop":"supermarket","organic":"only"}}];
23164
23165 var dataDiscarded = ["created_by","odbl","odbl:note","tiger:upload_uuid","tiger:tlid","tiger:source","tiger:separated","geobase:datasetName","geobase:uuid","sub_sea:type","KSJ2:ADS","KSJ2:ARE","KSJ2:AdminArea","KSJ2:COP_label","KSJ2:DFD","KSJ2:INT","KSJ2:INT_label","KSJ2:LOC","KSJ2:LPN","KSJ2:OPC","KSJ2:PubFacAdmin","KSJ2:RAC","KSJ2:RAC_label","KSJ2:RIC","KSJ2:RIN","KSJ2:WSC","KSJ2:coordinate","KSJ2:curve_id","KSJ2:curve_type","KSJ2:filename","KSJ2:lake_id","KSJ2:lat","KSJ2:long","KSJ2:river_id","yh:LINE_NAME","yh:LINE_NUM","yh:STRUCTURE","yh:TOTYUMONO","yh:TYPE","yh:WIDTH","yh:WIDTH_RANK","SK53_bulk:load"];
23166
23167 var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":true},"el":{"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":true},"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},"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}};
23168
23169 var dataPhoneFormats = {"us":"+1-202-555-1234","ca":"+1-226-555-1234","bs":"+1-242-555-1234","bb":"+1-246-555-1234","ai":"+1-264-555-1234","ag":"+1-268-555-1234","vg":"+1-284-555-1234","vi":"+1-340-555-1234","ky":"+1-345-555-1234","bm":"+1-441-555-1234","gd":"+1-473-555-1234","tc":"+1-649-555-1234","ms":"+1-664-555-1234","mp":"+1-670-555-1234","gu":"+1-671-555-1234","as":"+1-684-555-1234","sx":"+1-721-555-1234","lc":"+1-758-555-1234","dm":"+1-767-555-1234","vc":"+1-784-555-1234","pr":"+1-787-555-1234","do":"+1-809-555-1234","tt":"+1-868-555-1234","kn":"+1-869-555-1234","jm":"+1-876-555-1234","za":"+27 11 907 1111","nl":"+31 42 123 4567","fr":"+33 1 23 45 67 89","es":"+34 989 12 34 56","pt":"+351 211 123456","ie":"+353 20 912 3456","fi":"+358 40 123 4567","hu":"+36 1 123 45 67","hr":"+385 01 123 4567","si":"+386 31 123 4567","it":"+39 01 123 456","va":"+39 01 123 456","gb":"+44 1632 961234","gg":"+44 1632 961234","im":"+44 1632 961234","je":"+44 1632 961234","se":"+46 31 123 4567","no":"+47 22 12 34 56","sj":"+47 22 12 34 56","pl":"+48 42 123 4567","de":"+49 89 1234567","br":"+55 11 0982 1098","ru":"+7 495 1234567","kz":"+7 495 1234567","vn":"+84 1 234 5678","hk":"+852 1234 5678","cn":"+86 10 12345678","tw":"+886 1 2345 6789","tr":"+90 312 123 4567","ua":"+380 44 123 4567","at":"+43 1 123 45 67","ci":"+225 20 12 34 56","bj":"+229 20 12 34 56"};
23170
23171 var dataShortcuts = [{"tab":"browsing","text":"shortcuts.browsing.title","columns":[{"rows":[{"section":"navigation","text":"shortcuts.browsing.navigation.title"},{"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan","separator":","},{"modifiers":["⌘"],"shortcuts":["↓","↑","←","→"],"text":"shortcuts.browsing.navigation.pan_more","separator":","},{"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom","separator":","},{"modifiers":["⌘"],"shortcuts":["+","-"],"text":"shortcuts.browsing.navigation.zoom_more","separator":","},{"section":"help","text":"shortcuts.browsing.help.title"},{"shortcuts":["help.key"],"text":"shortcuts.browsing.help.help"},{"shortcuts":["shortcuts.toggle.key"],"text":"shortcuts.browsing.help.keyboard"},{"section":"display_options","text":"shortcuts.browsing.display_options.title"},{"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background"},{"modifiers":["⌘"],"shortcuts":["background.key"],"text":"shortcuts.browsing.display_options.background_switch"},{"shortcuts":["map_data.key"],"text":"shortcuts.browsing.display_options.map_data"},{"modifiers":["⌃","⌘"],"shortcuts":["F","F11"],"text":"shortcuts.browsing.display_options.fullscreen"},{"shortcuts":["area_fill.wireframe.key"],"text":"shortcuts.browsing.display_options.wireframe"},{"shortcuts":["background.minimap.key"],"text":"shortcuts.browsing.display_options.minimap"}]},{"rows":[{"section":"selecting","text":"shortcuts.browsing.selecting.title"},{"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_one"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"text":"shortcuts.browsing.selecting.select_multi"},{"modifiers":["⇧"],"shortcuts":["Left-click"],"gesture":"shortcuts.gesture.drag","text":"shortcuts.browsing.selecting.lasso"},{"shortcuts":[],"text":""},{"section":"with_selected","text":"shortcuts.browsing.with_selected.title"},{"shortcuts":["Right-click","shortcuts.key.space"],"text":"shortcuts.browsing.with_selected.edit_menu"},{"shortcuts":[],"text":""},{"section":"vertex_selected","text":"shortcuts.browsing.vertex_selected.title"},{"shortcuts":["[","↖"],"text":"shortcuts.browsing.vertex_selected.previous"},{"shortcuts":["]","↘"],"text":"shortcuts.browsing.vertex_selected.next"},{"shortcuts":["{","⇞"],"text":"shortcuts.browsing.vertex_selected.first"},{"shortcuts":["}","⇟"],"text":"shortcuts.browsing.vertex_selected.last"},{"shortcuts":["\\","shortcuts.key.pause"],"text":"shortcuts.browsing.vertex_selected.change_parent"}]}]},{"tab":"editing","text":"shortcuts.editing.title","columns":[{"rows":[{"section":"drawing","text":"shortcuts.editing.drawing.title"},{"shortcuts":["1"],"text":"shortcuts.editing.drawing.add_point"},{"shortcuts":["2"],"text":"shortcuts.editing.drawing.add_line"},{"shortcuts":["3"],"text":"shortcuts.editing.drawing.add_area"},{"shortcuts":["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.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"}]}]}];
23172
23173 var type$2 = "FeatureCollection";
23174 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]]]}}];
23175 var dataImperial = {
23176         type: type$2,
23177         features: features
23178 };
23179
23180 var type$3 = "FeatureCollection";
23181 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]]]}}];
23182 var dataDriveLeft = {
23183         type: type$3,
23184         features: features$1
23185 };
23186
23187 var en = {"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."},"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."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"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 at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"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":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections.  You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","request_review":"I would like someone to review my edits.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","download_changes":"Download osmChange file","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"http://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"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History on openstreetmap.org"},"location":{"key":"L","title":"Location","unknown_location":"Unknown Location"},"measurement":{"key":"M","title":"Measurement","selected":"{n} selected","geometry":"Geometry","closed":"closed","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial"}},"geometry":{"point":"point","vertex":"vertex","line":"line","area":"area","relation":"relation"},"geocoder":{"search":"Search worldwide...","no_results_visible":"No results in visible map area","no_results_worldwide":"No results found"},"geolocate":{"title":"Show My Location","locating":"Locating, please wait..."},"inspector":{"no_documentation_combination":"There is no documentation available for this tag combination","no_documentation_key":"There is no documentation available for this key","documentation_redirect":"This documentation has been redirected to a new page","show_more":"Show More","view_on_osm":"View on openstreetmap.org","all_fields":"All fields","all_tags":"All tags","all_members":"All members","all_relations":"All relations","new_relation":"New relation...","role":"Role","choose":"Select feature type","results":"{n} results for {search}","reference":"View on OpenStreetMap Wiki","back_tooltip":"Change feature","remove":"Remove","search":"Search","multiselect":"Selected features","unknown":"Unknown","incomplete":"<not downloaded>","feature_list":"Search features","edit":"Edit feature","check":{"yes":"Yes","no":"No","reverser":"Change Direction"},"radio":{"structure":{"type":"Type","default":"Default","layer":"Layer"}},"add":"Add","none":"None","node":"Node","way":"Way","relation":"Relation","location":"Location","add_fields":"Add field:"},"background":{"title":"Background","description":"Background settings","key":"B","percent_brightness":"{opacity}% brightness","none":"None","best_imagery":"Best known imagery source for this location","switch":"Switch back to this background","custom":"Custom","custom_button":"Edit custom background","custom_prompt":"Enter a tile URL template. Valid tokens are:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {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}","fix_misalignment":"Adjust imagery offset","imagery_source_faq":"Where does this imagery come from?","reset":"reset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.","minimap":{"description":"Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"}},"map_data":{"title":"Map Data","description":"Map Data","key":"F","data_layers":"Data Layers","layers":{"osm":{"tooltip":"Map data from OpenStreetMap","title":"OpenStreetMap data"}},"fill_area":"Fill Areas","map_features":"Map Features","autohidden":"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.","osmhidden":"These features have been automatically hidden because the OpenStreetMap layer is hidden."},"feature":{"points":{"description":"Points","tooltip":"Points of Interest"},"traffic_roads":{"description":"Traffic Roads","tooltip":"Highways, Streets, etc."},"service_roads":{"description":"Service Roads","tooltip":"Service Roads, Parking Aisles, Tracks, etc."},"paths":{"description":"Paths","tooltip":"Sidewalks, Foot Paths, Cycle Paths, etc."},"buildings":{"description":"Buildings","tooltip":"Buildings, Shelters, Garages, etc."},"landuse":{"description":"Landuse Features","tooltip":"Forests, Farmland, Parks, Residential, Commercial, etc."},"boundaries":{"description":"Boundaries","tooltip":"Administrative Boundaries"},"water":{"description":"Water Features","tooltip":"Rivers, Lakes, Ponds, Basins, etc."},"rail":{"description":"Rail Features","tooltip":"Railways"},"power":{"description":"Power Features","tooltip":"Power Lines, Power Plants, Substations, etc."},"past_future":{"description":"Past/Future","tooltip":"Proposed, Construction, Abandoned, Demolished, etc."},"others":{"description":"Others","tooltip":"Everything Else"}},"area_fill":{"wireframe":{"description":"No Fill (Wireframe)","tooltip":"Enabling wireframe mode makes it easy to see the background imagery.","key":"W"},"partial":{"description":"Partial Fill","tooltip":"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},"full":{"description":"Full Fill","tooltip":"Areas are drawn fully filled."}},"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...","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":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","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"},"confirm":{"okay":"OK","cancel":"Cancel"},"splash":{"welcome":"Welcome to the iD OpenStreetMap editor","text":"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.","walkthrough":"Start the Walkthrough","start":"Edit Now"},"source_switch":{"live":"live","lose_changes":"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?","dev":"dev"},"version":{"whats_new":"What's new in iD {version}"},"tag_reference":{"description":"Description","on_wiki":"{tag} on wiki.osm.org","used_with":"used with {type}"},"validations":{"disconnected_highway":"Disconnected highway","disconnected_highway_tooltip":"Roads should be connected to other roads or building entrances.","old_multipolygon":"Multipolygon tags on outer way","old_multipolygon_tooltip":"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.","untagged_point":"Untagged point","untagged_point_tooltip":"Select a feature type that describes what this point is.","untagged_line":"Untagged line","untagged_line_tooltip":"Select a feature type that describes what this line is.","untagged_area":"Untagged area","untagged_area_tooltip":"Select a feature type that describes what this area is.","untagged_relation":"Untagged relation","untagged_relation_tooltip":"Select a feature type that describes what this relation is.","many_deletions":"You're deleting {n} features. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.","tag_suggests_area":"The tag {tag} suggests line should be area, but it is not an area","deprecated_tags":"Deprecated tags: {tags}"},"zoom":{"in":"Zoom In","out":"Zoom Out"},"cannot_zoom":"Cannot zoom out further in current mode.","full_screen":"Toggle Full Screen","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"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"},"help":{"title":"Help","key":"H","help":"# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n","editing_saving":"# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click on it on\nthe map. This will highlight the selected feature and load a sidebar with\ndetails about it. If you right-click on it, it will show a menu of things\nyou can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a contour\naround those features. All the points inside the lasso area will be selected.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Upload' to post the changes to\n[OpenStreetMap.org](http://www.openstreetmap.org/), where they will be visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n","roads":"# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a sidebar showing more information about the road. If you right-click\non it, you'll have a menu of actions you can apply on the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also right-click on it and select the 'Move' tool, or simply press\nthe `M` shortcut key, to move the entire road at one time, and then click\nagain to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then pressing the 'Delete'\nkey or right-clicking it and then clicking the trash can icon.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n","gps":"# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n","imagery":"# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n","addresses":"# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n","inspector":"# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n","buildings":"# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and load a sidebar showing more information about the building.\nIf you right-click on it, it will show a menu of actions you can execute\nin the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it and press the 'M' shortcut key,\nor right-click it and select the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then pressing the 'Delete'\nkey, or right-clicking it and then clicking the trash can icon.\n","relations":"# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the bottom of the\nsidebar, you can see which relations a feature is a member of, and click on a\nrelation there will select it. When the relation is selected, you can see all of\nits members listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\npress the 'C' shortcut key. Other option is to select both, and then right-click one\nof the and click the \"Merge\" (+) button.\n"},"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 be also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**","start_playground":"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**","continue_playground":"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**","finish_playground":"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**","search_playground":"**Search for '{preset}'.**","choose_playground":"**Choose {preset} from the list.**","add_field":"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**","choose_field":"**Choose {field} from the list.**","retry_add_field":"You didn't select the {field} field. Let's try again.","describe_playground":"**Add a description, then click the {button} button to close the feature editor.**","play":"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"lines":{"title":"Lines","add_line":"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**","start_line":"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**","intersect":"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**","retry_intersect":"The road needs to intersect {name}. Let's try again!","continue_line":"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**","choose_category_road":"**Select {category} from the list.**","choose_preset_residential":"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**","retry_preset_residential":"You didn't select the {preset} type. **Click here to choose again.**","name_road":"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**","did_name_road":"Looks good! Next we will learn how to update the shape of a line.","update_line":"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.","add_node":"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**","start_drag_endpoint":"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**","finish_drag_endpoint":"This spot looks good. **Release the left mouse button to finish dragging.**","start_drag_midpoint":"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**","continue_drag_midpoint":"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**","delete_lines":"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.","rightclick_intersection":"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**","split_intersection":"**Click on the {button} button to split {street}.**","retry_split":"You didn't click the Split button. Try again.","did_split_multi":"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**","did_split_single":"**Click the top part of {street2} to select it.**","multi_select":"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**","multi_rightclick":"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**","multi_delete":"**Click on the {button} button to delete the extra lines.**","retry_delete":"You didn't click the Delete button. Try again.","play":"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},"buildings":{"title":"Buildings","add_building":"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**","start_building":"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**","continue_building":"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**","retry_building":"It looks like you had some trouble placing the nodes at the building corners. Try again!","choose_category_building":"**Choose {category} from the list.**","choose_preset_house":"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**","close":"**Hit escape or click the {button} button to close the feature editor.**","rightclick_building":"**Right-click to select the building you created and show the edit menu.**","square_building":"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**","retry_square":"You didn't click the Square button. Try again.","done_square":"See how the corners of the building moved into place? Let's learn another useful trick.","add_tank":"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**","start_tank":"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**","continue_tank":"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**","search_tank":"**Search for '{preset}'.**","choose_tank":"**Choose {preset} from the list.**","rightclick_tank":"**Right-click to select the storage tank you created and show the edit menu.**","circle_tank":"**Click on the {button} button to make the tank a circle.**","retry_circle":"You didn't click the Circularize button. Try again.","play":"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},"startediting":{"title":"Start Editing","help":"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.","shortcuts":"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.","save":"Don't forget to regularly save your changes!","start":"Start mapping!"}},"shortcuts":{"title":"Keyboard shortcuts","tooltip":"Show the keyboard shortcuts screen.","toggle":{"key":"?"},"key":{"alt":"Alt","backspace":"Backspace","cmd":"Cmd","ctrl":"Ctrl","delete":"Delete","del":"Del","end":"End","enter":"Enter","esc":"Esc","home":"Home","option":"Option","pause":"Pause","pgdn":"PgDn","pgup":"PgUp","return":"Return","shift":"Shift","space":"Space"},"gesture":{"drag":"drag"},"or":"-or-","browsing":{"title":"Browsing","navigation":{"title":"Navigation","pan":"Pan map","pan_more":"Pan map by one screenful","zoom":"Zoom in / Zoom out","zoom_more":"Zoom in / Zoom out by a lot"},"help":{"title":"Help","help":"Show help/documentation","keyboard":"Show keyboard shortcuts"},"display_options":{"title":"Display options","background":"Show background options","background_switch":"Switch back to last background","map_data":"Show map data options","fullscreen":"Enter full screen mode","wireframe":"Toggle wireframe mode","minimap":"Toggle minimap"},"selecting":{"title":"Selecting features","select_one":"Select a single feature","select_multi":"Select multiple features","lasso":"Draw a selection lasso around features"},"with_selected":{"title":"With feature selected","edit_menu":"Toggle edit menu"},"vertex_selected":{"title":"With node selected","previous":"Jump to previous node","next":"Jump to next node","first":"Jump to first node","last":"Jump to last node","change_parent":"Switch parent way"}},"editing":{"title":"Editing","drawing":{"title":"Drawing","add_point":"'Add point' mode","add_line":"'Add line' mode","add_area":"'Add area' mode","place_point":"Place a point","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","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"}}},"presets":{"categories":{"category-barrier":{"name":"Barrier Features"},"category-building":{"name":"Building Features"},"category-golf":{"name":"Golf Features"},"category-landuse":{"name":"Land Use Features"},"category-natural-area":{"name":"Natural Features"},"category-natural-line":{"name":"Natural Features"},"category-natural-point":{"name":"Natural Features"},"category-path":{"name":"Path Features"},"category-rail":{"name":"Rail Features"},"category-restriction":{"name":"Restriction Features"},"category-road":{"name":"Road Features"},"category-route":{"name":"Route Features"},"category-water-area":{"name":"Water Features"},"category-water-line":{"name":"Water Features"}},"fields":{"access_simple":{"label":"Allowed Access"},"access":{"label":"Allowed Access","placeholder":"Not Specified","types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"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"},"amenity":{"label":"Type"},"animal_boarding":{"label":"For Animals"},"animal_breeding":{"label":"For Animals"},"animal_shelter":{"label":"For Animals"},"area/highway":{"label":"Type"},"artist":{"label":"Artist"},"artwork_type":{"label":"Type"},"atm":{"label":"ATM"},"backrest":{"label":"Backrest"},"barrier":{"label":"Type"},"bath/open_air":{"label":"Open Air"},"bath/sand_bath":{"label":"Sand Bath"},"bath/type":{"label":"Specialty","options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}},"beauty":{"label":"Shop Type"},"bench":{"label":"Bench"},"bicycle_parking":{"label":"Type"},"bin":{"label":"Waste Bin"},"blood_components":{"label":"Blood Components","options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}},"board_type":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"bridge":{"label":"Type","placeholder":"Default"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"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..."},"cardinal_direction":{"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"}},"castle_type":{"label":"Type"},"clock_direction":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"clothes":{"label":"Clothes"},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"comment":{"label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"label":"Communication Types"},"construction":{"label":"Type"},"contact/webcam":{"label":"Webcam URL","placeholder":"http://example.com/"},"content":{"label":"Content"},"country":{"label":"Country"},"covered":{"label":"Covered"},"craft":{"label":"Type"},"crane/type":{"label":"Crane Type","options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}},"crop":{"label":"Crops"},"crossing":{"label":"Type"},"cuisine":{"label":"Cuisines"},"currency_multi":{"label":"Currency Types"},"cutting":{"label":"Type","placeholder":"Default"},"cycle_network":{"label":"Network"},"cycleway":{"label":"Bike Lanes","placeholder":"none","types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"diaper":{"label":"Diaper Changing Available"},"display":{"label":"Display"},"dock":{"label":"Type"},"drive_through":{"label":"Drive-Through"},"duration":{"label":"Duration","placeholder":"00:00"},"electrified":{"label":"Electrification","placeholder":"Contact Line, Electrified Rail...","options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}},"elevation":{"label":"Elevation"},"email":{"label":"Email","placeholder":"example@example.com"},"embankment":{"label":"Type","placeholder":"Default"},"emergency":{"label":"Emergency"},"entrance":{"label":"Type"},"except":{"label":"Exceptions"},"fax":{"label":"Fax","placeholder":"+31 42 123 4567"},"fee":{"label":"Fee"},"fence_type":{"label":"Type"},"fire_hydrant/position":{"label":"Position","options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}},"fire_hydrant/type":{"label":"Type","options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}},"fixme":{"label":"Fix Me"},"ford":{"label":"Type","placeholder":"Default"},"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"},"grape_variety":{"label":"Grape Varieties"},"handicap":{"label":"Handicap","placeholder":"1-18"},"handrail":{"label":"Handrail"},"hashtags":{"label":"Suggested Hashtags","placeholder":"#example"},"healthcare":{"label":"Type"},"healthcare/speciality":{"label":"Specialties"},"height":{"label":"Height (Meters)"},"highway":{"label":"Type"},"historic":{"label":"Type"},"historic/civilization":{"label":"Historic Civilization"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"information":{"label":"Type"},"inscription":{"label":"Inscription"},"intermittent":{"label":"Intermittent"},"internet_access":{"label":"Internet Access","options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}},"internet_access/fee":{"label":"Internet Access Fee"},"internet_access/ssid":{"label":"SSID (Network Name)"},"kerb":{"label":"Curb"},"label":{"label":"Label"},"lamp_type":{"label":"Type"},"landuse":{"label":"Type"},"lanes":{"label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}},"leaf_cycle":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}},"leaf_type_singular":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}},"leaf_type":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}},"leisure":{"label":"Type"},"length":{"label":"Length (Meters)"},"level":{"label":"Level"},"levels":{"label":"Levels","placeholder":"2, 4, 6..."},"lit":{"label":"Lit"},"location":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"label":"Max Stay"},"maxweight":{"label":"Max Weight"},"memorial":{"label":"Type"},"milestone_position":{"label":"Milestone Position","placeholder":"Distance to one decimal (123.4)"},"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"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward"}},"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"},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}},"piste/grooming":{"label":"Grooming","options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}},"piste/type":{"label":"Type","options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}},"place":{"label":"Type"},"plant":{"label":"Plant"},"plant/output/electricity":{"label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"label":"Baby Seat"},"playground/max_age":{"label":"Maximum Age"},"playground/min_age":{"label":"Minimum Age"},"population":{"label":"Population"},"power_supply":{"label":"Power Supply"},"power":{"label":"Type"},"produce":{"label":"Produce"},"product":{"label":"Products"},"railway":{"label":"Type"},"recycling_accepts":{"label":"Accepts"},"recycling_type":{"label":"Recycling Type","options":{"container":"Container","centre":"Recycling 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"},"relation":{"label":"Type"},"religion":{"label":"Religion"},"restriction":{"label":"Type"},"restrictions":{"label":"Turn Restrictions"},"rooms":{"label":"Rooms"},"route_master":{"label":"Type"},"route":{"label":"Type"},"sac_scale":{"label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}},"sanitary_dump_station":{"label":"Toilet Disposal"},"seasonal":{"label":"Seasonal"},"second_hand":{"label":"Sells Used","placeholder":"Yes, No, Only","options":{"yes":"Yes","no":"No","only":"Only"}},"service_rail":{"label":"Service Type","options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}},"service_times":{"label":"Service Times"},"service":{"label":"Type"},"service/bicycle":{"label":"Services"},"service/vehicle":{"label":"Services"},"shelter_type":{"label":"Type"},"shelter":{"label":"Shelter"},"shop":{"label":"Type"},"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"},"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"},"tactile_paving":{"label":"Tactile Paving"},"takeaway":{"label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","options":{"yes":"Yes","no":"No","only":"Takeaway Only"}},"toilets/disposal":{"label":"Disposal","options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}},"toll":{"label":"Toll"},"tomb":{"label":"Type"},"tourism_attraction":{"label":"Tourism"},"tourism":{"label":"Type"},"tower/construction":{"label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"label":"Type"},"tracktype":{"label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}},"trade":{"label":"Type"},"traffic_calming":{"label":"Type"},"traffic_signals":{"label":"Type"},"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"}},"trees":{"label":"Trees"},"tunnel":{"label":"Type","placeholder":"Default"},"vending":{"label":"Type 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"}},"wall":{"label":"Type"},"water_point":{"label":"Water Point"},"water":{"label":"Type"},"waterway":{"label":"Type"},"website":{"label":"Website","placeholder":"http://example.com/"},"wetland":{"label":"Type"},"wheelchair":{"label":"Wheelchair Access"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","terms":""},"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/station":{"name":"Aerialway Station","terms":""},"aerialway/t-bar":{"name":"T-bar Lift","terms":"tbar"},"aeroway/aerodrome":{"name":"Airport","terms":"airplane,airport,aerodrome"},"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"},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,dog,horse,kitten,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":"Beer Garden","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/bus_station":{"name":"Bus Station","terms":""},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_rental":{"name":"Car Rental","terms":""},"amenity/car_sharing":{"name":"Car Sharing","terms":""},"amenity/car_wash":{"name":"Car Wash","terms":""},"amenity/casino":{"name":"Casino","terms":"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{"name":"Charging Station","terms":"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{"name":"Nursery/Childcare","terms":"daycare,orphanage,playgroup"},"amenity/cinema":{"name":"Cinema","terms":"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{"name":"Clinic","terms":"medical,urgentcare"},"amenity/clinic/abortion":{"name":"Abortion Clinic","terms":""},"amenity/clinic/fertility":{"name":"Fertility Clinic","terms":"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{"name":"Clock","terms":""},"amenity/college":{"name":"College Grounds","terms":"university"},"amenity/community_centre":{"name":"Community Center","terms":"event,hall"},"amenity/compressed_air":{"name":"Compressed Air","terms":""},"amenity/courthouse":{"name":"Courthouse","terms":""},"amenity/crematorium":{"name":"Crematorium","terms":"cemetery,funeral"},"amenity/dentist":{"name":"Dentist","terms":"tooth,teeth"},"amenity/doctors":{"name":"Doctor","terms":"medic*,physician"},"amenity/dojo":{"name":"Dojo / Martial Arts Academy","terms":"martial arts,dojang"},"amenity/drinking_water":{"name":"Drinking Water","terms":"fountain,potable"},"amenity/driving_school":{"name":"Driving School","terms":""},"amenity/embassy":{"name":"Embassy","terms":""},"amenity/fast_food":{"name":"Fast Food","terms":"restaurant,takeaway"},"amenity/ferry_terminal":{"name":"Ferry Terminal","terms":""},"amenity/fire_station":{"name":"Fire Station","terms":""},"amenity/food_court":{"name":"Food Court","terms":"fast food,restaurant,food"},"amenity/fountain":{"name":"Fountain","terms":""},"amenity/fuel":{"name":"Gas Station","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{"name":"Graveyard","terms":""},"amenity/grit_bin":{"name":"Grit Bin","terms":"salt,sand"},"amenity/hospital":{"name":"Hospital Grounds","terms":"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{"name":"Hunting Stand","terms":"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{"name":"Ice Cream Shop","terms":"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{"name":"Internet Cafe","terms":"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{"name":"Preschool/Kindergarten Grounds","terms":"kindergarden,pre-school"},"amenity/library":{"name":"Library","terms":"book"},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/nightclub":{"name":"Nightclub","terms":"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{"name":"Parking Garage Entrance/Exit","terms":""},"amenity/parking_space":{"name":"Parking Space","terms":""},"amenity/parking":{"name":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"drug*,med*,prescription"},"amenity/place_of_worship":{"name":"Place of Worship","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{"name":"Buddhist Temple","terms":"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{"name":"Church","terms":"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{"name":"Hindu Temple","terms":"garbhargriha,mandu,puja,shrine,temple"},"amenity/place_of_worship/jewish":{"name":"Synagogue","terms":"jewish"},"amenity/place_of_worship/muslim":{"name":"Mosque","terms":"muslim"},"amenity/place_of_worship/shinto":{"name":"Shinto Shrine","terms":"kami,torii"},"amenity/place_of_worship/sikh":{"name":"Sikh Temple","terms":"gurudwara,temple"},"amenity/place_of_worship/taoist":{"name":"Taoist Temple","terms":"daoist,monastery,temple"},"amenity/planetarium":{"name":"Planetarium","terms":"museum,astronomy,observatory"},"amenity/police":{"name":"Police","terms":"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{"name":"Mailbox","terms":"letter,post"},"amenity/post_office":{"name":"Post Office","terms":"letter,mail"},"amenity/prison":{"name":"Prison Grounds","terms":"cell,jail"},"amenity/pub":{"name":"Pub","terms":"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{"name":"Public Bath","terms":"onsen,foot bath,hot springs"},"amenity/public_bookcase":{"name":"Public Bookcase","terms":"library,bookcrossing"},"amenity/ranger_station":{"name":"Ranger Station","terms":"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{"name":"Recycling Center","terms":"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{"name":"Recycling","terms":"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{"name":"Restaurant","terms":"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{"name":"RV Toilet Disposal","terms":"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{"name":"School Grounds","terms":"academy,elementary school,middle school,high school"},"amenity/scrapyard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"amenity/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/shower":{"name":"Shower","terms":"rain closet"},"amenity/social_facility":{"name":"Social Facility","terms":""},"amenity/social_facility/food_bank":{"name":"Food Bank","terms":""},"amenity/social_facility/group_home":{"name":"Elderly Group Home","terms":"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{"name":"Homeless Shelter","terms":"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{"name":"Nursing Home","terms":"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{"name":"Studio","terms":"recording,radio,television"},"amenity/taxi":{"name":"Taxi Stand","terms":"cab"},"amenity/telephone":{"name":"Telephone","terms":"phone"},"amenity/theatre":{"name":"Theater","terms":"theatre,performance,play,musical"},"amenity/toilets":{"name":"Toilets","terms":"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{"name":"Town Hall","terms":"village,city,government,courthouse,municipal"},"amenity/university":{"name":"University Grounds","terms":"college"},"amenity/vending_machine":{"name":"Vending Machine","terms":""},"amenity/vending_machine/news_papers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/cigarettes":{"name":"Cigarette Vending Machine","terms":"cigarette"},"amenity/vending_machine/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"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/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{"name":"Parking Ticket Vending Machine","terms":"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{"name":"Transit Ticket Vending Machine","terms":"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/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/pirate_ship":{"name":"Pirate Ship","terms":"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{"name":"River Rafting","terms":"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{"name":"Roller Coaster","terms":"theme park,amusement ride"},"attraction/train":{"name":"Tourist Train","terms":"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{"name":"Water Slide","terms":"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},"barrier":{"name":"Barrier","terms":""},"barrier/entrance":{"name":"Entrance","terms":""},"barrier/block":{"name":"Block","terms":""},"barrier/bollard":{"name":"Bollard","terms":""},"barrier/border_control":{"name":"Border Control","terms":""},"barrier/cattle_grid":{"name":"Cattle Grid","terms":""},"barrier/city_wall":{"name":"City Wall","terms":""},"barrier/cycle_barrier":{"name":"Cycle Barrier","terms":""},"barrier/ditch":{"name":"Trench","terms":""},"barrier/fence":{"name":"Fence","terms":""},"barrier/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kissing_gate":{"name":"Kissing Gate","terms":""},"barrier/lift_gate":{"name":"Lift Gate","terms":""},"barrier/retaining_wall":{"name":"Retaining Wall","terms":""},"barrier/stile":{"name":"Stile","terms":""},"barrier/toll_booth":{"name":"Toll Booth","terms":""},"barrier/wall":{"name":"Wall","terms":""},"boundary/administrative":{"name":"Administrative Boundary","terms":""},"building":{"name":"Building","terms":""},"building/bunker":{"name":"Bunker","terms":""},"building/entrance":{"name":"Entrance/Exit","terms":""},"building/train_station":{"name":"Train Station","terms":""},"building/apartments":{"name":"Apartments","terms":""},"building/barn":{"name":"Barn","terms":""},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church 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/garage":{"name":"Garage","terms":""},"building/garages":{"name":"Garages","terms":""},"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/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","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/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/university":{"name":"University Building","terms":"college"},"building/warehouse":{"name":"Warehouse","terms":""},"camp_site/camp_pitch":{"name":"Camp Pitch","terms":"tent,rv"},"club":{"name":"Club","terms":"social"},"craft":{"name":"Craft","terms":""},"craft/jeweler":{"name":"Jeweler","terms":""},"craft/locksmith":{"name":"Locksmith","terms":""},"craft/optician":{"name":"Optician","terms":""},"craft/tailor":{"name":"Tailor","terms":"clothes,suit"},"craft/basket_maker":{"name":"Basket Maker","terms":""},"craft/beekeeper":{"name":"Beekeeper","terms":""},"craft/blacksmith":{"name":"Blacksmith","terms":""},"craft/boatbuilder":{"name":"Boat Builder","terms":""},"craft/bookbinder":{"name":"Bookbinder","terms":"book repair"},"craft/brewery":{"name":"Brewery","terms":"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{"name":"Carpenter","terms":"woodworker"},"craft/carpet_layer":{"name":"Carpet Layer","terms":""},"craft/caterer":{"name":"Caterer","terms":""},"craft/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/sculpter":{"name":"Sculpter","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"craft/sweep":{"name":"Chimney Sweep","terms":""},"craft/tiler":{"name":"Tiler","terms":""},"craft/tinsmith":{"name":"Tinsmith","terms":""},"craft/upholsterer":{"name":"Upholsterer","terms":""},"craft/watchmaker":{"name":"Watchmaker","terms":""},"craft/window_construction":{"name":"Window Construction","terms":"glass"},"craft/winery":{"name":"Winery","terms":""},"embankment":{"name":"Embankment","terms":""},"emergency/designated":{"name":"Emergency Access Designated","terms":""},"emergency/destination":{"name":"Emergency Access Destination","terms":""},"emergency/no":{"name":"Emergency Access No","terms":""},"emergency/official":{"name":"Emergency Access Official","terms":""},"emergency/private":{"name":"Emergency Access Private","terms":""},"emergency/yes":{"name":"Emergency Access Yes","terms":""},"emergency/ambulance_station":{"name":"Ambulance Station","terms":"EMS,EMT,rescue"},"emergency/defibrillator":{"name":"Defibrillator","terms":"AED"},"emergency/fire_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/life_ring":{"name":"Life Ring","terms":"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/phone":{"name":"Emergency Phone","terms":""},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"ford":{"name":"Ford","terms":""},"golf/bunker":{"name":"Sand Trap","terms":"hazard,bunker"},"golf/fairway":{"name":"Fairway","terms":""},"golf/green":{"name":"Putting Green","terms":""},"golf/hole":{"name":"Golf Hole","terms":""},"golf/lateral_water_hazard_area":{"name":"Lateral Water Hazard","terms":""},"golf/lateral_water_hazard_line":{"name":"Lateral Water Hazard","terms":""},"golf/rough":{"name":"Rough","terms":""},"golf/tee":{"name":"Tee Box","terms":"teeing ground"},"golf/water_hazard_area":{"name":"Water Hazard","terms":""},"golf/water_hazard_line":{"name":"Water Hazard","terms":""},"healthcare":{"name":"Healthcare Facility","terms":"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{"name":"Alternative Medicine","terms":"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{"name":"Chiropractor","terms":"back,pain,spine"},"healthcare/audiologist":{"name":"Audiologist","terms":"ear,hearing,sound"},"healthcare/birthing_center":{"name":"Birthing Center","terms":"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{"name":"Blood Donor Center","terms":"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{"name":"Hospice","terms":"terminal,illness"},"healthcare/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/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_stop":{"name":"Bus Stop","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{"name":"Raised Street Crossing","terms":"flat top,hump,speed,slow"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk-raised":{"name":"Raised Pedestrian Crosswalk","terms":"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"highway/cycleway":{"name":"Cycle Path","terms":"bike"},"highway/elevator":{"name":"Elevator","terms":"lift"},"highway/footway":{"name":"Foot Path","terms":"hike,hiking,trackway,trail,walk"},"highway/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"highway/path":{"name":"Path","terms":"hike,hiking,trackway,trail,walk"},"highway/pedestrian":{"name":"Pedestrian Street","terms":""},"highway/primary_link":{"name":"Primary Link","terms":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"highway/service/alley":{"name":"Alley","terms":""},"highway/service/drive-through":{"name":"Drive-Through","terms":""},"highway/service/driveway":{"name":"Driveway","terms":""},"highway/service/emergency_access":{"name":"Emergency Access","terms":""},"highway/service/parking_aisle":{"name":"Parking Aisle","terms":""},"highway/services":{"name":"Service Area","terms":"services,travel plaza,service station"},"highway/speed_camera":{"name":"Speed Camera","terms":""},"highway/steps":{"name":"Steps","terms":"stairs,staircase"},"highway/stop":{"name":"Stop Sign","terms":"stop,halt,sign"},"highway/street_lamp":{"name":"Street Lamp","terms":"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{"name":"Tertiary Link","terms":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"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":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"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":""},"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":""},"historic/monument":{"name":"Monument","terms":""},"historic/ruins":{"name":"Ruins","terms":""},"historic/tomb":{"name":"Tomb","terms":""},"historic/wayside_cross":{"name":"Wayside Cross","terms":""},"historic/wayside_shrine":{"name":"Wayside Shrine","terms":""},"junction":{"name":"Junction","terms":""},"landuse":{"name":"Land Use","terms":""},"landuse/farm":{"name":"Farmland","terms":""},"landuse/allotments":{"name":"Community Garden","terms":"allotment,garden"},"landuse/aquaculture":{"name":"Aquaculture","terms":"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{"name":"Basin","terms":""},"landuse/cemetery":{"name":"Cemetery","terms":""},"landuse/churchyard":{"name":"Churchyard","terms":""},"landuse/commercial":{"name":"Commercial Area","terms":""},"landuse/construction":{"name":"Construction","terms":""},"landuse/farmland":{"name":"Farmland","terms":"crop,grow,plant"},"landuse/farmyard":{"name":"Farmyard","terms":"crop,grow,plant"},"landuse/forest":{"name":"Forest","terms":"tree"},"landuse/garages":{"name":"Garages","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/landfill":{"name":"Landfill","terms":"dump"},"landuse/meadow":{"name":"Meadow","terms":""},"landuse/military":{"name":"Military Area","terms":""},"landuse/military/airfield":{"name":"Military Airfield","terms":"air force,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/residential":{"name":"Residential Area","terms":""},"landuse/retail":{"name":"Retail Area","terms":""},"landuse/vineyard":{"name":"Vineyard","terms":"grape,wine"},"leisure":{"name":"Leisure","terms":""},"leisure/adult_gaming_centre":{"name":"Adult Gaming Center","terms":"gambling,slot machine"},"leisure/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"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/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"leisure/fitness_centre":{"name":"Gym / Fitness Center","terms":"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{"name":"Yoga Studio","terms":"studio"},"leisure/fitness_station":{"name":"Outdoor Fitness Station","terms":"fitness,gym,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/park":{"name":"Park","terms":"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{"name":"Picnic Table","terms":"bench"},"leisure/pitch":{"name":"Sport Pitch","terms":"field"},"leisure/pitch/american_football":{"name":"American Football Field","terms":""},"leisure/pitch/baseball":{"name":"Baseball Diamond","terms":""},"leisure/pitch/basketball":{"name":"Basketball Court","terms":""},"leisure/pitch/beachvolleyball":{"name":"Beach Volleyball Court","terms":"volleyball"},"leisure/pitch/bowls":{"name":"Bowling Green","terms":""},"leisure/pitch/cricket":{"name":"Cricket Field","terms":""},"leisure/pitch/equestrian":{"name":"Riding Arena","terms":"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{"name":"Rugby League Field","terms":""},"leisure/pitch/rugby_union":{"name":"Rugby Union Field","terms":""},"leisure/pitch/skateboard":{"name":"Skate Park","terms":""},"leisure/pitch/soccer":{"name":"Soccer Field","terms":"football"},"leisure/pitch/table_tennis":{"name":"Ping Pong Table","terms":"table tennis,ping pong"},"leisure/pitch/tennis":{"name":"Tennis Court","terms":""},"leisure/pitch/volleyball":{"name":"Volleyball Court","terms":""},"leisure/playground":{"name":"Playground","terms":"jungle gym,play area"},"leisure/resort":{"name":"Resort","terms":""},"leisure/running_track":{"name":"Racetrack (Running)","terms":"race*,running,sprint,track"},"leisure/slipway":{"name":"Slipway","terms":"boat launch,boat ramp"},"leisure/sports_centre":{"name":"Sports Center / Complex","terms":""},"leisure/sports_centre/swimming":{"name":"Swimming Pool Facility","terms":"dive,water"},"leisure/stadium":{"name":"Stadium","terms":""},"leisure/swimming_pool":{"name":"Swimming Pool","terms":"dive,water"},"leisure/track":{"name":"Racetrack (Non-Motorsport)","terms":"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{"name":"Water Park","terms":"swim,pool,dive"},"line":{"name":"Line","terms":""},"man_made":{"name":"Man Made","terms":""},"man_made/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/crane":{"name":"Crane","terms":""},"man_made/cutline":{"name":"Cut line","terms":""},"man_made/flagpole":{"name":"Flagpole","terms":""},"man_made/gasometer":{"name":"Gasometer","terms":"gas holder"},"man_made/groyne":{"name":"Groyne","terms":""},"man_made/lighthouse":{"name":"Lighthouse","terms":""},"man_made/mast":{"name":"Mast","terms":"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"man_made/petroleum_well":{"name":"Oil Well","terms":"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{"name":"Pier","terms":"dock,jetty"},"man_made/pipeline":{"name":"Pipeline","terms":""},"man_made/pumping_station":{"name":"Pumping Station","terms":""},"man_made/silo":{"name":"Silo","terms":"grain,corn,wheat"},"man_made/storage_tank":{"name":"Storage Tank","terms":"water,oil,gas,petrol"},"man_made/surveillance_camera":{"name":"Surveillance Camera","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{"name":"Surveillance","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{"name":"Survey Point","terms":"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{"name":"Tower","terms":""},"man_made/wastewater_plant":{"name":"Wastewater Plant","terms":"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{"name":"Water Tower","terms":""},"man_made/water_well":{"name":"Water Well","terms":""},"man_made/water_works":{"name":"Water Works","terms":""},"man_made/watermill":{"name":"Watermill","terms":"water,wheel,mill"},"man_made/windmill":{"name":"Windmill","terms":"wind,wheel,mill"},"man_made/works":{"name":"Factory","terms":"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},"manhole":{"name":"Manhole","terms":"cover,hole,sewer,sewage,telecom"},"manhole/drain":{"name":"Storm Drain","terms":"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{"name":"Telecom Manhole","terms":"cover,phone,hole,telecom,telephone,bt"},"natural":{"name":"Natural","terms":""},"natural/bare_rock":{"name":"Bare Rock","terms":"rock"},"natural/bay":{"name":"Bay","terms":""},"natural/beach":{"name":"Beach","terms":"shore"},"natural/cave_entrance":{"name":"Cave Entrance","terms":"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{"name":"Cliff","terms":"escarpment"},"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/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/ridge":{"name":"Ridge","terms":"crest"},"natural/saddle":{"name":"Saddle","terms":"pass,mountain pass,top"},"natural/sand":{"name":"Sand","terms":"desert"},"natural/scree":{"name":"Scree","terms":"loose rocks"},"natural/scrub":{"name":"Scrub","terms":"bush,shrubs"},"natural/spring":{"name":"Spring","terms":""},"natural/tree_row":{"name":"Tree row","terms":""},"natural/tree":{"name":"Tree","terms":""},"natural/volcano":{"name":"Volcano","terms":"mountain,crater"},"natural/water":{"name":"Water","terms":""},"natural/water/lake":{"name":"Lake","terms":"lakelet,loch,mere"},"natural/water/pond":{"name":"Pond","terms":"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{"name":"Reservoir","terms":""},"natural/wetland":{"name":"Wetland","terms":"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{"name":"Wood","terms":"tree"},"noexit/yes":{"name":"No Exit","terms":"no exit,road end,dead end"},"office":{"name":"Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant","terms":""},"office/administrative":{"name":"Administrative Office","terms":""},"office/architect":{"name":"Architect","terms":""},"office/company":{"name":"Company 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/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"IT Office","terms":""},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":"clerk,signature,wills,deeds,estate"},"office/newspaper":{"name":"Newspaper","terms":""},"office/ngo":{"name":"NGO Office","terms":""},"office/political_party":{"name":"Political Party","terms":""},"office/research":{"name":"Research Office","terms":""},"office/telecommunication":{"name":"Telecom Office","terms":""},"office/therapist":{"name":"Therapist","terms":""},"piste":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","terms":""},"place/city":{"name":"City","terms":""},"place/hamlet":{"name":"Hamlet","terms":""},"place/island":{"name":"Island","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{"name":"Isolated Dwelling","terms":""},"place/locality":{"name":"Locality","terms":""},"place/neighbourhood":{"name":"Neighborhood","terms":"neighbourhood"},"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":"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":"Horizontal Bar","terms":"high bar"},"playground/rocker":{"name":"Springy Rocker","terms":""},"playground/roundabout":{"name":"Play Roundabout","terms":""},"playground/sandpit":{"name":"Sandpit","terms":""},"playground/seesaw":{"name":"Seesaw","terms":""},"playground/slide":{"name":"Slide","terms":""},"playground/structure":{"name":"Play Structure","terms":""},"playground/swing":{"name":"Swing","terms":""},"playground/zipwire":{"name":"Zip Wire","terms":""},"point":{"name":"Point","terms":""},"power/sub_station":{"name":"Substation","terms":""},"power/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{"name":"Nuclear Reactor","terms":"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{"name":"Wind Turbine","terms":"generator,turbine,windmill,wind"},"power/line":{"name":"Power Line","terms":""},"power/minor_line":{"name":"Minor Power Line","terms":""},"power/plant":{"name":"Power Station Grounds","terms":"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{"name":"Power Pole","terms":""},"power/substation":{"name":"Substation","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/platform":{"name":"Platform","terms":""},"public_transport/stop_position":{"name":"Stop Position","terms":""},"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/halt":{"name":"Railway Halt","terms":"break,interrupt,rest,wait,interruption"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/milestone":{"name":"Railway Milestone","terms":"milestone,marker"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/platform":{"name":"Railway Platform","terms":""},"railway/rail":{"name":"Rail","terms":""},"railway/signal":{"name":"Railway Signal","terms":"signal,lights"},"railway/station":{"name":"Railway Station","terms":"train station,station"},"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_stop":{"name":"Tram Stop","terms":"light rail,streetcar,tram,trolley"},"railway/tram":{"name":"Tram","terms":"light rail,streetcar,tram,trolley"},"relation":{"name":"Relation","terms":""},"route/ferry":{"name":"Ferry Route","terms":""},"shop":{"name":"Shop","terms":""},"shop/fishmonger":{"name":"Fishmonger","terms":""},"shop/furnace":{"name":"Furnace Store","terms":"oven,stove"},"shop/vacant":{"name":"Vacant Shop","terms":""},"shop/alcohol":{"name":"Liquor Store","terms":"alcohol,beer,booze,wine"},"shop/anime":{"name":"Anime Shop","terms":"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{"name":"Antiques Shop","terms":""},"shop/appliance":{"name":"Appliance Store","terms":"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{"name":"Art Store","terms":"art*,exhibit*,gallery"},"shop/baby_goods":{"name":"Baby Goods Store","terms":""},"shop/bag":{"name":"Bag/Luggage Store","terms":"handbag,purse"},"shop/bakery":{"name":"Bakery","terms":""},"shop/bathroom_furnishing":{"name":"Bathroom Furnishing Store","terms":""},"shop/beauty":{"name":"Beauty Shop","terms":"spa,salon,tanning"},"shop/beauty/nails":{"name":"Nail Salon","terms":"manicure,pedicure"},"shop/beauty/tanning":{"name":"Tanning Salon","terms":""},"shop/bed":{"name":"Bedding/Mattress Store","terms":""},"shop/beverages":{"name":"Beverage Store","terms":""},"shop/bicycle":{"name":"Bicycle Shop","terms":"bike,repair"},"shop/bookmaker":{"name":"Bookmaker","terms":"betting"},"shop/books":{"name":"Book Store","terms":""},"shop/boutique":{"name":"Boutique","terms":""},"shop/butcher":{"name":"Butcher","terms":"meat"},"shop/candles":{"name":"Candle Shop","terms":""},"shop/car_parts":{"name":"Car Parts Store","terms":"auto"},"shop/car_repair":{"name":"Car Repair Shop","terms":"auto,garage,service"},"shop/car":{"name":"Car Dealership","terms":"auto"},"shop/carpet":{"name":"Carpet Store","terms":"rug"},"shop/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"med*,drug*,gift"},"shop/chocolate":{"name":"Chocolate Store","terms":""},"shop/clothes":{"name":"Clothing Store","terms":""},"shop/coffee":{"name":"Coffee Store","terms":""},"shop/computer":{"name":"Computer Store","terms":""},"shop/confectionery":{"name":"Candy Store","terms":"sweet"},"shop/convenience":{"name":"Convenience Store","terms":""},"shop/copyshop":{"name":"Copy Store","terms":""},"shop/cosmetics":{"name":"Cosmetics Store","terms":""},"shop/craft":{"name":"Arts and Crafts Store","terms":"art*,paint*,frame"},"shop/curtain":{"name":"Curtain Store","terms":"drape*,window"},"shop/dairy":{"name":"Dairy Store","terms":"milk,egg,cheese"},"shop/deli":{"name":"Deli","terms":"lunch,meat,sandwich"},"shop/department_store":{"name":"Department Store","terms":""},"shop/doityourself":{"name":"DIY Store","terms":""},"shop/dry_cleaning":{"name":"Dry Cleaner","terms":""},"shop/e-cigarette":{"name":"E-Cigarette Shop","terms":"electronic,vapor"},"shop/electronics":{"name":"Electronics Store","terms":"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{"name":"Erotic Store","terms":"sex,porn"},"shop/fabric":{"name":"Fabric Store","terms":"sew"},"shop/farm":{"name":"Produce Stand","terms":"farm shop,farm stand"},"shop/fashion":{"name":"Fashion Store","terms":""},"shop/florist":{"name":"Florist","terms":"flower"},"shop/frame":{"name":"Framing Shop","terms":"art*,paint*,photo*,frame"},"shop/funeral_directors":{"name":"Funeral Home","terms":"undertaker,memorial home"},"shop/furniture":{"name":"Furniture Store","terms":"chair,sofa,table"},"shop/garden_centre":{"name":"Garden Center","terms":"landscape,mulch,shrub,tree"},"shop/gas":{"name":"Bottled Gas Shop","terms":"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{"name":"Gift Shop","terms":"souvenir"},"shop/greengrocer":{"name":"Greengrocer","terms":"fruit,vegetable"},"shop/hairdresser":{"name":"Hairdresser","terms":"barber"},"shop/hardware":{"name":"Hardware Store","terms":""},"shop/hearing_aids":{"name":"Hearing Aids Store","terms":""},"shop/herbalist":{"name":"Herbalist","terms":""},"shop/hifi":{"name":"Hifi Store","terms":"stereo,video"},"shop/houseware":{"name":"Houseware Store","terms":"home,household"},"shop/interior_decoration":{"name":"Interior Decoration Store","terms":""},"shop/jewelry":{"name":"Jeweler","terms":"diamond,gem,ring"},"shop/kiosk":{"name":"News Kiosk","terms":""},"shop/kitchen":{"name":"Kitchen Design Store","terms":""},"shop/laundry":{"name":"Laundry","terms":""},"shop/leather":{"name":"Leather Store","terms":""},"shop/locksmith":{"name":"Locksmith","terms":"key,lockpick"},"shop/lottery":{"name":"Lottery Shop","terms":""},"shop/mall":{"name":"Mall","terms":"shopping"},"shop/massage":{"name":"Massage Shop","terms":""},"shop/medical_supply":{"name":"Medical Supply Store","terms":""},"shop/mobile_phone":{"name":"Mobile Phone Store","terms":""},"shop/money_lender":{"name":"Money Lender","terms":""},"shop/motorcycle":{"name":"Motorcycle Dealership","terms":"bike"},"shop/music":{"name":"Music Store","terms":"CD,vinyl"},"shop/musical_instrument":{"name":"Musical Instrument Store","terms":"guitar"},"shop/newsagent":{"name":"Newspaper/Magazine Shop","terms":""},"shop/nutrition_supplements":{"name":"Nutrition Supplements Store","terms":""},"shop/optician":{"name":"Optician","terms":"eye,glasses"},"shop/organic":{"name":"Organic Goods Store","terms":""},"shop/outdoor":{"name":"Outdoors Store","terms":"camping,climbing,hiking"},"shop/paint":{"name":"Paint Store","terms":""},"shop/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"shop/pet":{"name":"Pet Store","terms":"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{"name":"Photography Store","terms":"camera,film"},"shop/pyrotechnics":{"name":"Fireworks Store","terms":""},"shop/radiotechnics":{"name":"Radio/Electronic Component Store","terms":""},"shop/religion":{"name":"Religious Store","terms":""},"shop/scuba_diving":{"name":"Scuba Diving Shop","terms":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"shop/shoes":{"name":"Shoe Store","terms":""},"shop/sports":{"name":"Sporting Goods Store","terms":""},"shop/stationery":{"name":"Stationery Store","terms":"card,paper"},"shop/storage_rental":{"name":"Storage Rental","terms":""},"shop/supermarket":{"name":"Supermarket","terms":"grocery,store,shop"},"shop/tailor":{"name":"Tailor","terms":"clothes,suit"},"shop/tattoo":{"name":"Tattoo Parlor","terms":""},"shop/tea":{"name":"Tea Store","terms":""},"shop/ticket":{"name":"Ticket Seller","terms":""},"shop/tiles":{"name":"Tile Shop","terms":""},"shop/tobacco":{"name":"Tobacco Shop","terms":""},"shop/toys":{"name":"Toy Store","terms":""},"shop/trade":{"name":"Trade Shop","terms":""},"shop/travel_agency":{"name":"Travel Agency","terms":""},"shop/tyres":{"name":"Tire Store","terms":""},"shop/vacuum_cleaner":{"name":"Vacuum Cleaner Store","terms":""},"shop/variety_store":{"name":"Variety Store","terms":""},"shop/video_games":{"name":"Video Game Store","terms":""},"shop/video":{"name":"Video Store","terms":"DVD"},"shop/watches":{"name":"Watches Shop","terms":""},"shop/water_sports":{"name":"Watersport/Swim Shop","terms":""},"shop/weapons":{"name":"Weapon Shop","terms":"ammo,gun,knife,knives"},"shop/window_blind":{"name":"Window Blind Store","terms":""},"shop/wine":{"name":"Wine Shop","terms":""},"tourism":{"name":"Tourism","terms":""},"tourism/alpine_hut":{"name":"Alpine Hut","terms":""},"tourism/apartment":{"name":"Guest Apartment / Condo","terms":""},"tourism/aquarium":{"name":"Aquarium","terms":"fish,sea,water"},"tourism/artwork":{"name":"Artwork","terms":"mural,sculpture,statue"},"tourism/attraction":{"name":"Tourist Attraction","terms":""},"tourism/camp_site":{"name":"Campground","terms":"tent,rv"},"tourism/caravan_site":{"name":"RV Park","terms":"Motor Home,Camper"},"tourism/chalet":{"name":"Chalet","terms":""},"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/viewpoint":{"name":"Viewpoint","terms":""},"tourism/zoo":{"name":"Zoo","terms":"animal"},"traffic_calming":{"name":"Traffic Calming","terms":"bump,hump,slow,speed"},"traffic_calming/bump":{"name":"Speed Bump","terms":"hump,speed,slow"},"traffic_calming/chicane":{"name":"Traffic Chicane","terms":"driveway link,speed,slow"},"traffic_calming/choker":{"name":"Traffic Choker","terms":"speed,slow"},"traffic_calming/cushion":{"name":"Speed Cushion","terms":"bump,hump,speed,slow"},"traffic_calming/dip":{"name":"Dip","terms":"speed,slow"},"traffic_calming/hump":{"name":"Speed Hump","terms":"bump,speed,slow"},"traffic_calming/island":{"name":"Traffic Island","terms":"circle,roundabout,slow"},"traffic_calming/rumble_strip":{"name":"Rumble Strip","terms":"audible lines,sleeper lines,growlers"},"traffic_calming/table":{"name":"Speed Table","terms":"flat top,hump,speed,slow"},"type/multipolygon":{"name":"Multipolygon","terms":""},"type/boundary":{"name":"Boundary","terms":""},"type/boundary/administrative":{"name":"Administrative Boundary","terms":""},"type/restriction":{"name":"Restriction","terms":""},"type/restriction/no_left_turn":{"name":"No Left Turn","terms":""},"type/restriction/no_right_turn":{"name":"No Right Turn","terms":""},"type/restriction/no_straight_on":{"name":"No Straight On","terms":""},"type/restriction/no_u_turn":{"name":"No U-turn","terms":""},"type/restriction/only_left_turn":{"name":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","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/pipeline":{"name":"Pipeline Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/train":{"name":"Train Route","terms":""},"type/route/tram":{"name":"Tram Route","terms":""},"type/site":{"name":"Site","terms":""},"type/waterway":{"name":"Waterway","terms":""},"vertex":{"name":"Other","terms":""},"waterway/boatyard":{"name":"Boatyard","terms":""},"waterway/canal":{"name":"Canal","terms":""},"waterway/dam":{"name":"Dam","terms":""},"waterway/ditch":{"name":"Ditch","terms":""},"waterway/dock":{"name":"Wet Dock / Dry Dock","terms":"boat,ship,vessel,marine"},"waterway/drain":{"name":"Drain","terms":""},"waterway/fuel":{"name":"Marine Fuel Station","terms":"petrol,gas,diesel,boat"},"waterway/river":{"name":"River","terms":"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{"name":"Riverbank","terms":""},"waterway/sanitary_dump_station":{"name":"Marine Toilet Disposal","terms":"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{"name":"Intermittent Stream","terms":"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{"name":"Stream","terms":"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{"name":"Marine Drinking Water","terms":""},"waterway/waterfall":{"name":"Waterfall","terms":"fall"},"waterway/weir":{"name":"Weir","terms":""}}},"imagery":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"EsriWorldImagery":{"attribution":{"text":"Terms & Feedback"},"description":"Esri world imagery.","name":"Esri World Imagery"},"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"},"US-TIGER-Roads-2012":{"name":"TIGER Roads 2012"},"US-TIGER-Roads-2014":{"description":"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap","name":"TIGER Roads 2014"},"US-TIGER-Roads-2017":{"description":"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap","name":"TIGER Roads 2017"},"Waymarked_Trails-Cycling":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Winter Sports"},"basemap.at":{"attribution":{"text":"basemap.at"},"description":"Basemap of Austria, based on goverment data.","name":"basemap.at"},"basemap.at-orthofoto":{"attribution":{"text":"basemap.at"},"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","name":"basemap.at Orthofoto"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"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)"},"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"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
23188
23189 var dataImagery = [{"id":"sjcgis.org-Aerials_2013_WM","name":"2013 aerial imagery for San Juan County WA","type":"tms","template":"http://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","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"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":"http://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","scaleExtent":[0,19],"polygon":[[[-123.02167396992,48.44667085335],[-122.9466579482,48.44780949945],[-122.90151100606,48.41306930778],[-122.80263405293,48.40771378918],[-122.79199104756,48.44279926564],[-122.8088138625,48.47865708877],[-122.73911934346,48.49572334021],[-122.78546791524,48.62160819278],[-122.73087959737,48.6361306644],[-122.75559883565,48.71207854113],[-122.95747261494,48.71592956034],[-122.97086220235,48.695765074],[-122.99970131367,48.69780454658],[-123.00347786397,48.73427448605],[-123.04330330342,48.74310484148],[-123.0762622878,48.70528190578],[-123.08484535664,48.66334903433],[-123.12844734639,48.66380254936],[-123.22698097676,48.70301615666],[-123.24655037373,48.68352650341],[-123.17445259541,48.64701977542],[-123.21513634175,48.60106537642],[-123.21393471211,48.57335906966],[-123.18080406636,48.56574853208],[-123.16621284932,48.52006125122],[-123.10235481709,48.47683634964],[-123.02167396992,48.44667085335]],[[-122.98339348286,48.78214357977],[-122.93498497456,48.76653172572],[-122.91181068867,48.73857664785],[-122.80229073018,48.73982194177],[-122.81945686787,48.75498940888],[-122.93429832906,48.79571515892],[-122.98373680562,48.79435816618],[-122.98339348286,48.78214357977]]],"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":"http://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg","polygon":[[[-3.046968,54.839473],[-3.058641,55.2415704],[-4.0446639,55.2329572],[-4.0707564,55.6365416],[-4.6190429,55.6253005],[-4.6492553,56.0283381],[-4.4896102,56.0321747],[-4.5239425,56.4367031],[-3.8675094,56.4458128],[-3.8417602,56.049435],[-3.445909,56.0498185],[-3.4349227,55.6442923],[-2.7949691,55.6504917],[-2.8080153,56.0574872],[-3.2066131,56.0532696],[-3.2141662,56.4568175],[-3.7380767,56.4507463],[-3.7418532,56.8617541],[-5.0766921,56.8317131],[-5.0365233,56.4294897],[-5.1601195,56.4249331],[-5.1299071,56.0179772],[-5.9260726,55.994559],[-5.8551764,55.2333487],[-5.2280974,55.2513559],[-5.2102447,55.027647],[-4.659555,55.0418131],[-4.6454787,54.8163344],[-3.046968,54.839473]],[[-1.7483497,57.7642809],[-1.7406468,57.3599979],[-2.5802193,57.3553698],[-2.5743689,57.0452643],[-2.0840782,57.0479899],[-2.0765057,56.6427564],[-2.734497,56.6390587],[-2.737815,56.8171751],[-3.2388513,56.8143725],[-3.2489563,57.351683],[-3.7562947,57.3488858],[-3.7621877,57.6586785],[-4.7658688,57.6447324],[-4.810078,58.2698422],[-5.2511001,58.2654711],[-5.2737594,58.6676722],[-3.5581778,58.6988712],[-3.566072,58.9316035],[-3.3765578,58.9344382],[-3.3858372,59.2017095],[-3.187134,59.2021481],[-3.1874677,59.2417623],[-3.0675673,59.2420266],[-3.0785537,59.4213467],[-2.3713088,59.4276337],[-2.3685622,59.0221982],[-2.678926,59.0207845],[-2.6734328,58.8393493],[-2.8656936,58.8365068],[-2.8602004,58.5353109],[-3.0346084,58.5331604],[-3.0195022,58.1315879],[-3.6155983,58.1198177],[-3.6127639,57.9775439],[-3.7109154,57.9756153],[-3.699316,57.7536442],[-1.7483497,57.7642809]],[[-7.0749164,56.7631857],[-7.7347099,56.7356573],[-7.7911007,57.1399384],[-7.7066243,57.1434261],[-7.7629881,57.5431114],[-7.6021787,57.5496778],[-7.6213373,57.6845215],[-7.724988,57.6803049],[-7.7301746,57.7167278],[-7.6026437,57.7219106],[-7.5996413,57.7008338],[-7.4863439,57.7054402],[-7.49528,57.7681282],[-7.3749316,57.7730121],[-7.3933722,57.9020139],[-7.2359063,57.9083804],[-7.2432312,57.9594843],[-7.1391571,57.9636854],[-7.1450794,58.0049464],[-7.2374247,58.001223],[-7.2329687,57.9701789],[-7.3113276,57.9670164],[-7.3153794,57.9952475],[-7.2490415,57.9979228],[-7.2808211,58.218564],[-7.0735459,58.2268701],[-7.0827038,58.2901845],[-6.807432,58.3011927],[-6.8276802,58.4407359],[-6.5030498,58.4536624],[-6.5153194,58.5379206],[-6.1647379,58.5518417],[-6.1063084,58.1489361],[-6.3346892,58.139764],[-6.2775862,57.7414459],[-6.9613783,57.7136632],[-6.9333168,57.5161471],[-7.100168,57.5093277],[-7.0521806,57.169002],[-7.1311072,57.1657457],[-7.0749164,56.7631857]],[[0.4107642,50.8208689],[0.9810233,50.8061178],[0.9943731,51.0117337],[1.4506241,50.9999804],[1.4771216,51.4055151],[0.8961869,51.4203486],[0.882435,51.2103932],[0.5050041,51.2200721],[0.5227271,51.4904202],[-0.6339669,51.5106322],[-0.6367135,51.4456291],[-1.0995126,51.4524759],[-1.1148479,51.0481357],[-0.5298744,51.0394048],[-0.5275085,51.10203],[0.4280611,51.0877836],[0.4107642,50.8208689]],[[-5.3945661,51.9618998],[-4.7958112,51.9805124],[-4.7887332,51.8940308],[-4.2026458,51.9122773],[-4.2294099,52.2382823],[-3.6551984,52.2560218],[-3.6222764,51.8548323],[-4.2134157,51.836405],[-4.1855134,51.4934202],[-4.776615,51.4748465],[-4.7847576,51.5752482],[-5.0879928,51.5657379],[-5.0942224,51.6424172],[-5.3678001,51.6338498],[-5.3945661,51.9618998]],[[-1.2389016,54.0353696],[-0.6277871,54.0281103],[-0.6200376,54.2525704],[-0.5726819,54.2520109],[-0.5586479,54.6554165],[-1.17998,54.6626853],[-1.1878192,54.4378771],[-1.2322093,54.4383992],[-1.2389016,54.0353696]],[[-2.6722741,50.9767709],[-2.0996118,50.9802295],[-2.1057212,51.3794917],[-1.5887659,51.3825866],[-1.594992,51.7858908],[-2.1756313,51.7889106],[-2.1715392,51.3839176],[-2.6784576,51.3808828],[-2.6722741,50.9767709]],[[-2.6015496,53.2715461],[-3.2297251,53.2685042],[-3.2352183,53.6723131],[-2.6070428,53.6753262],[-2.6015496,53.2715461]],[[-0.0394177,51.7727994],[-0.6156335,51.7757705],[-0.6046472,52.5841377],[-0.0284314,52.5812201],[-0.0394177,51.7727994]],[[-2.9152892,54.0352257],[-3.5322877,54.0286638],[-3.5448438,54.4339736],[-2.9278454,54.4404713],[-2.9152892,54.0352257]],[[-6.3058305,57.1968949],[-6.3538957,57.6001458],[-5.6911121,57.6229455],[-5.643047,57.2199469],[-6.3058305,57.1968949]],[[1.171145,52.5723589],[1.1986505,52.9759408],[1.7978754,52.9610616],[1.7703699,52.5573411],[1.171145,52.5723589]],[[-2.4022508,55.5631737],[-2.4008775,55.9656986],[-1.7608445,55.965011],[-1.7622178,55.562479],[-2.4022508,55.5631737]],[[-6.3257432,56.3853727],[-7.0196021,56.3574652],[-7.0731605,56.7638392],[-6.3793015,56.7914485],[-6.3257432,56.3853727]],[[-2.422577,54.4430983],[-2.4257397,54.841885],[-1.7993058,54.8435404],[-1.7961431,54.4447701],[-2.422577,54.4430983]],[[-3.0270123,51.3793548],[-3.6058877,51.370168],[-3.6223672,51.7730401],[-3.0434918,51.7821458],[-3.0270123,51.3793548]],[[-3.0537915,52.1897924],[-3.0661511,52.5937352],[-2.4836401,52.600342],[-2.4712805,52.1964599],[-3.0537915,52.1897924]],[[-5.676726,51.7042466],[-5.6788616,51.731006],[-5.4635982,51.7375973],[-5.4614627,51.7108418],[-5.676726,51.7042466]],[[-5.8442675,59.1088192],[-5.8469031,59.1357806],[-5.7955763,59.1371015],[-5.7929408,59.1101412],[-5.8442675,59.1088192]],[[-8.648442,57.7786066],[-8.6659651,57.87717],[-8.4664946,57.8872093],[-8.4489714,57.7886733],[-8.648442,57.7786066]],[[-4.5271098,59.0153156],[-4.5285904,59.0331938],[-4.4762337,59.034342],[-4.4747531,59.0164644],[-4.5271098,59.0153156]],[[-7.6806151,58.2583811],[-7.6865455,58.2938023],[-7.5344535,58.3008387],[-7.5285231,58.2654246],[-7.6806151,58.2583811]],[[-6.1910235,59.080087],[-6.1954619,59.1158563],[-6.125424,59.1181472],[-6.1209857,59.0823803],[-6.1910235,59.080087]],[[-4.4266879,59.0711219],[-4.4280472,59.0886998],[-4.3762055,59.089758],[-4.3748462,59.0721806],[-4.4266879,59.0711219]]]},{"id":"AGRI-black_and_white-2.5m","name":"AGRI black-and-white 2.5m","type":"tms","template":"http://agri.openstreetmap.org/{zoom}/{x}/{y}.png","polygon":[[[112.28778,-28.784589],[112.71488,-31.13894],[114.11263,-34.178287],[113.60788,-37.39012],[117.17992,-37.451794],[119.31538,-37.42096],[121.72262,-36.708394],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.727398],[130.07031,-33.24166],[130.10913,-33.888704],[131.00214,-34.049705],[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.368294],[142.3783,-40.64702],[142.49478,-42.074874],[144.009,-44.060127],[147.23161,-44.03222],[149.05645,-42.534313],[149.52237,-40.99959],[149.9494,-40.852921],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.667706],[156.20052,-20.10109],[156.62761,-17.417627],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.256768],[152.27905,-13.4135],[151.3472,-12.391767],[149.48354,-12.05024],[146.9598,-9.992408],[135.9719,-9.992408],[130.3032,-10.33636],[128.09016,-12.164136],[125.91588,-12.315912],[124.3239,-11.860326],[122.03323,-11.974295],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.596033],[112.28778,-28.784589]]],"terms_text":"AGRI"},{"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"terms_text":"basemap.at","description":"Basemap of Austria, based on goverment data.","icon":"https://www.basemap.at/images/logo_basemap.jpg"},{"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","scaleExtent":[0,19],"polygon":[[[16.5073284,46.9929304],[16.283417,46.9929304],[16.135839,46.8713046],[15.9831722,46.8190947],[16.0493278,46.655175],[15.8610387,46.7180116],[15.7592608,46.6900933],[15.5607938,46.6796202],[15.5760605,46.6342132],[15.4793715,46.6027553],[15.4335715,46.6516819],[15.2249267,46.6342132],[15.0468154,46.6481886],[14.9908376,46.5887681],[14.9603042,46.6237293],[14.8534374,46.6027553],[14.8330818,46.5012666],[14.7516595,46.4977636],[14.6804149,46.4381781],[14.6142593,46.4381781],[14.578637,46.3785275],[14.4412369,46.4311638],[14.1613476,46.4276563],[14.1257253,46.4767409],[14.0188585,46.4767409],[13.9119917,46.5257813],[13.8254805,46.5047694],[13.4438134,46.560783],[13.3064132,46.5502848],[13.1283019,46.5887681],[12.8433237,46.6132433],[12.7262791,46.6412014],[12.5125455,46.6656529],[12.3598787,46.7040543],[12.3649676,46.7703197],[12.2886341,46.7772902],[12.2733674,46.8852187],[12.2072118,46.8747835],[12.1308784,46.9026062],[12.1156117,46.9998721],[12.2530119,47.0657733],[12.2123007,47.0934969],[11.9833004,47.0449712],[11.7339445,46.9616816],[11.6321666,47.010283],[11.5405665,46.9755722],[11.4998553,47.0068129],[11.418433,46.9651546],[11.2555884,46.9755722],[11.1130993,46.913036],[11.0418548,46.7633482],[10.8891879,46.7598621],[10.7416099,46.7842599],[10.7059877,46.8643462],[10.5787653,46.8399847],[10.4566318,46.8504267],[10.4769874,46.9269392],[10.3853873,46.9894592],[10.2327204,46.8643462],[10.1207647,46.8330223],[9.8663199,46.9408389],[9.9019422,47.0033426],[9.6831197,47.0588402],[9.6118752,47.0380354],[9.6322307,47.128131],[9.5813418,47.1662025],[9.5406306,47.2664422],[9.6067863,47.3492559],[9.6729419,47.369939],[9.6424085,47.4457079],[9.5660751,47.4801122],[9.7136531,47.5282405],[9.7848976,47.5969187],[9.8357866,47.5454185],[9.9477423,47.538548],[10.0902313,47.4491493],[10.1105869,47.3664924],[10.2428982,47.3871688],[10.1869203,47.2698953],[10.3243205,47.2975125],[10.4820763,47.4491493],[10.4311873,47.4869904],[10.4413651,47.5900549],[10.4871652,47.5522881],[10.5482319,47.5351124],[10.5991209,47.5660246],[10.7568766,47.5316766],[10.8891879,47.5454185],[10.9400769,47.4869904],[10.9960547,47.3906141],[11.2352328,47.4422662],[11.2810328,47.3975039],[11.4235219,47.5144941],[11.5761888,47.5076195],[11.6067221,47.5900549],[11.8357224,47.5866227],[12.003656,47.6243647],[12.2072118,47.6037815],[12.1614117,47.6963421],[12.2581008,47.7442718],[12.2530119,47.6792136],[12.4311232,47.7100408],[12.4921899,47.631224],[12.5685234,47.6277944],[12.6295901,47.6894913],[12.7720792,47.6689338],[12.8331459,47.5419833],[12.975635,47.4732332],[13.0417906,47.4938677],[13.0367017,47.5557226],[13.0977685,47.6415112],[13.0316128,47.7100408],[12.9043905,47.7203125],[13.0061684,47.84683],[12.9451016,47.9355501],[12.8636793,47.9594103],[12.8636793,48.0036929],[12.7517236,48.0989418],[12.8738571,48.2109733],[12.9603683,48.2109733],[13.0417906,48.2652035],[13.1842797,48.2990682],[13.2606131,48.2922971],[13.3980133,48.3565867],[13.4438134,48.417418],[13.4387245,48.5523383],[13.509969,48.5860123],[13.6117469,48.5725454],[13.7287915,48.5118999],[13.7847694,48.5725454],[13.8203916,48.6263915],[13.7949471,48.7171267],[13.850925,48.7741724],[14.0595697,48.6633774],[14.0137696,48.6331182],[14.0748364,48.5927444],[14.2173255,48.5961101],[14.3649034,48.5489696],[14.4666813,48.6499311],[14.5582815,48.5961101],[14.5989926,48.6263915],[14.7211261,48.5759124],[14.7211261,48.6868997],[14.822904,48.7271983],[14.8178151,48.777526],[14.9647227,48.7851754],[14.9893637,49.0126611],[15.1485933,48.9950306],[15.1943934,48.9315502],[15.3063491,48.9850128],[15.3928603,48.9850128],[15.4844604,48.9282069],[15.749083,48.8545973],[15.8406831,48.8880697],[16.0086166,48.7808794],[16.2070835,48.7339115],[16.3953727,48.7372678],[16.4920617,48.8110498],[16.6905286,48.7741724],[16.7057953,48.7339115],[16.8991733,48.713769],[16.9755067,48.515271],[16.8482844,48.4511817],[16.8533733,48.3464411],[16.9551512,48.2516513],[16.9907734,48.1498955],[17.0925513,48.1397088],[17.0823736,48.0241182],[17.1739737,48.0207146],[17.0823736,47.8741447],[16.9856845,47.8673174],[17.0823736,47.8092489],[17.0925513,47.7031919],[16.7414176,47.6792136],[16.7057953,47.7511153],[16.5378617,47.7545368],[16.5480395,47.7066164],[16.4208172,47.6689338],[16.573484,47.6175045],[16.670173,47.631224],[16.7108842,47.538548],[16.6599952,47.4491493],[16.5429506,47.3940591],[16.4615283,47.3940591],[16.4920617,47.276801],[16.425906,47.1973317],[16.4717061,47.1489007],[16.5480395,47.1489007],[16.476795,47.0796369],[16.527684,47.0588402],[16.5073284,46.9929304]]],"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-DOP80","name":"Bavaria DOP 80cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,18],"polygon":[[[10.1235886,50.568462],[10.1428576,50.5507804],[10.2028056,50.5574195],[10.2520485,50.5179575],[10.3269835,50.4934473],[10.4104825,50.4184762],[10.6031724,50.3310874],[10.6224414,50.2271041],[10.7252093,50.2106649],[10.7294913,50.2476451],[10.8515282,50.2435376],[10.7187863,50.3201525],[10.7123633,50.3652428],[10.8558102,50.3966441],[10.9371682,50.3966441],[10.9906932,50.3666085],[11.1277171,50.3666085],[11.1791011,50.3133169],[11.1619731,50.294172],[11.24119,50.2928042],[11.249754,50.3734364],[11.24119,50.479825],[11.358945,50.5234025],[11.4381619,50.5097889],[11.4424439,50.4893611],[11.425316,50.4771001],[11.425316,50.4416618],[11.4895459,50.4225686],[11.4916869,50.3980089],[11.5195199,50.3980089],[11.5259429,50.3761673],[11.5987369,50.4034677],[11.6372748,50.3884544],[11.7935678,50.4212045],[11.8363877,50.3925494],[11.9220277,50.4280246],[11.9862577,50.3870894],[11.9841167,50.3570478],[12.0483466,50.3310874],[12.0933076,50.3297207],[12.1297046,50.2982751],[12.1404096,50.2722826],[12.1061536,50.255859],[12.1125766,50.2353216],[12.1489736,50.236691],[12.1982166,50.2010728],[12.2239086,50.1640565],[12.2046396,50.1434795],[12.2067806,50.1077916],[12.2431775,50.0995522],[12.2774335,50.0720772],[12.4936744,49.985428],[12.4979564,49.9413559],[12.5557634,49.9220616],[12.5493404,49.8682726],[12.4808284,49.7881677],[12.4101755,49.7577484],[12.4615594,49.7065456],[12.5471994,49.6802313],[12.5878784,49.552613],[12.6542493,49.534553],[12.6628133,49.4330153],[12.7527353,49.4107323],[12.7976963,49.3466124],[12.9047462,49.3563752],[12.9968092,49.3368477],[13.0546161,49.2754251],[13.1316921,49.2195199],[13.1916401,49.1439475],[13.236601,49.1215335],[13.296549,49.1229347],[13.371484,49.0808823],[13.414304,49.0289687],[13.414304,48.9798112],[13.5791609,48.9699739],[13.6348268,48.9432629],[13.6776468,48.8869823],[13.7375948,48.8926132],[13.7846968,48.8334571],[13.8403627,48.774231],[13.8168118,48.7064584],[13.8446447,48.7008065],[13.8425037,48.6003807],[13.7654278,48.5422972],[13.7525818,48.5040106],[13.6712238,48.5054291],[13.6433908,48.5437146],[13.4571239,48.5508013],[13.4571239,48.4159838],[13.40574,48.3605338],[13.283703,48.2751083],[13.0931541,48.2694081],[12.9582712,48.1909669],[12.8769132,48.1852574],[12.7720043,48.0938188],[12.8640672,48.0136764],[12.8983232,47.9549216],[12.9454252,47.9563555],[12.9968092,47.8846147],[13.0139372,47.834337],[12.9347202,47.7321953],[13.0588981,47.7249947],[13.1188461,47.6385093],[13.0653211,47.5692178],[13.0567571,47.473792],[13.0032322,47.4520801],[12.7677223,47.5504355],[12.7698633,47.6327385],[12.7398893,47.6731207],[12.6670953,47.6702373],[12.5750324,47.621195],[12.4808284,47.6197519],[12.4144575,47.6702373],[12.2431775,47.6774455],[12.2132036,47.6918589],[12.1917936,47.6817699],[12.2132036,47.6659119],[12.2110626,47.603875],[12.1746656,47.5952129],[12.1382686,47.603875],[11.8920537,47.603875],[11.8513747,47.5793285],[11.6394158,47.5822169],[11.5944549,47.5489905],[11.5901729,47.5128508],[11.5173789,47.498388],[11.4403029,47.5041736],[11.395342,47.4752392],[11.427457,47.4448409],[11.346099,47.4433929],[11.279728,47.3955873],[11.2133571,47.3883402],[11.247613,47.4318076],[11.1020251,47.3926886],[10.9650012,47.3897897],[10.9778472,47.4361524],[10.9178992,47.4752392],[10.8707972,47.4752392],[10.8558102,47.4940484],[10.9007712,47.5142969],[10.8729382,47.5359831],[10.8108493,47.5128508],[10.6438513,47.5489905],[10.5946084,47.5547705],[10.5796214,47.5287553],[10.4618664,47.5403192],[10.4661484,47.4839212],[10.4875584,47.4781333],[10.4875584,47.4129762],[10.4597254,47.4028333],[10.4597254,47.375293],[10.4104825,47.3738431],[10.4083415,47.3433862],[10.3205605,47.2867768],[10.2820225,47.2780622],[10.2841635,47.2620819],[10.1471396,47.2620819],[10.1921006,47.3027497],[10.1942416,47.3738431],[10.1664086,47.3738431],[10.1664086,47.3462876],[10.1000376,47.3433862],[10.0614996,47.3636928],[10.0679226,47.4187712],[10.0936146,47.426014],[10.0957556,47.4419449],[9.9780007,47.485368],[9.9565907,47.5273097],[9.8945017,47.5287553],[9.8559637,47.5085124],[9.8174258,47.544655],[9.8217078,47.5764399],[9.7746058,47.5822169],[9.7382088,47.525864],[9.6739788,47.5345376],[9.5840569,47.564884],[9.6397228,47.6053186],[9.7167988,47.603875],[9.8559637,47.6760039],[9.9780007,47.6558179],[10.0293846,47.6817699],[10.1000376,47.6673537],[10.1321526,47.6760039],[10.1428576,47.7019459],[10.0614996,47.7725005],[10.1128836,47.8098988],[10.0829096,47.8530173],[10.1086016,47.9090177],[10.0764866,47.9649577],[10.1300116,48.020837],[10.1342936,48.1066872],[10.1000376,48.1281274],[10.0550766,48.2622821],[9.9694367,48.3676462],[10.0315256,48.4259299],[10.0293846,48.461436],[10.1235886,48.4770509],[10.1535626,48.4514968],[10.2349205,48.5125212],[10.3162785,48.516776],[10.2991505,48.6187835],[10.2456255,48.6682961],[10.2734585,48.7064584],[10.3698035,48.6838472],[10.4318924,48.6993935],[10.4511614,48.7276471],[10.4019185,48.7460035],[10.4404564,48.8489571],[10.4340334,48.9587289],[10.3376885,49.0205451],[10.2499075,49.0359872],[10.2499075,49.0738701],[10.2006646,49.1033147],[10.2520485,49.1327418],[10.1235886,49.1971401],[10.1193066,49.2628519],[10.1514216,49.2893915],[10.1043196,49.3452175],[10.1407166,49.3940134],[10.1086016,49.445545],[10.1107426,49.5053651],[10.0722046,49.5331635],[10.0165387,49.4761598],[9.9266167,49.478942],[9.9244757,49.5567797],[9.8987837,49.5817727],[9.8559637,49.5387213],[9.8067208,49.5567797],[9.8666687,49.6067529],[9.8538227,49.6441991],[9.8174258,49.6608327],[9.8345537,49.6899277],[9.7960158,49.7203895],[9.7574778,49.7079302],[9.7403498,49.6857723],[9.7060938,49.7162368],[9.6782608,49.7162368],[9.6825428,49.6885426],[9.6204539,49.6913127],[9.6461458,49.78955],[9.5583649,49.7743431],[9.5712109,49.7356133],[9.5069809,49.7522156],[9.4919939,49.7798735],[9.4684429,49.7605146],[9.425623,49.7784909],[9.404213,49.7646636],[9.33356,49.770195],[9.329278,49.7342295],[9.408495,49.725926],[9.427764,49.6982374],[9.414918,49.6441991],[9.380662,49.6386533],[9.359252,49.6497443],[9.339983,49.6372668],[9.31215,49.648358],[9.277894,49.626173],[9.284317,49.6081403],[9.241497,49.5748315],[9.0980501,49.5720547],[9.0659351,49.6081403],[9.1001911,49.6511305],[9.0916271,49.6926978],[9.1301651,49.7120837],[9.1387291,49.7425316],[9.1087551,49.7563653],[9.1365881,49.7909322],[9.1001911,49.78955],[9.0723581,49.8282367],[9.0359611,49.8351418],[9.0166922,50.0267091],[8.9631672,50.0308352],[8.9567442,50.0597083],[9.0017052,50.0707031],[9.0209742,50.1105378],[9.1216011,50.1228936],[9.1558571,50.1132838],[9.1965361,50.1187753],[9.1858311,50.1352462],[9.235074,50.1475956],[9.37638,50.1270115],[9.408495,50.0816953],[9.5219679,50.095432],[9.5048399,50.1421073],[9.5326729,50.1640565],[9.4898529,50.1695422],[9.4941349,50.2435376],[9.6140309,50.221625],[9.6654148,50.2353216],[9.6354408,50.2490142],[9.6675558,50.2722826],[9.7424908,50.3092151],[9.7296448,50.3584137],[9.7703238,50.4293885],[9.8688097,50.4007384],[9.9180527,50.4089259],[10.0358076,50.479825],[10.0379486,50.5111504],[10.1235886,50.568462]]]},{"id":"GRB","name":"Belgium AGIV GRB Flanders","type":"tms","template":"http://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}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"GRB Flanders © AGIV","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"AGIV","name":"Belgium AGIV Orthophoto Flanders","type":"tms","template":"http://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}","scaleExtent":[0,21],"polygon":[[[2.522393220658428,51.101723961331],[3.1260610915867457,51.34117672029327],[3.174929443042849,51.382459567439525],[3.3761520666856217,51.38784154353026],[3.410647373595811,51.33040116175589],[3.4020235468682634,51.28547573497245],[3.4911364230529203,51.256700377228974],[3.4825125963253734,51.30345118353617],[3.5773746903283947,51.323216048914524],[3.813092620881357,51.27288873325703],[3.8217164476089045,51.236906864834886],[3.9309515861578386,51.236906864834886],[4.054559769252684,51.27468708752057],[4.20116482362099,51.35194974615148],[4.169544125619984,51.38066543475199],[4.342020660170932,51.395016527087456],[4.3650175314443915,51.46491366130351],[4.5374940659953396,51.50071687469512],[4.571989372905529,51.479238319799464],[4.560490937268798,51.44879304380801],[4.638105377816725,51.45058450468522],[4.750215125274841,51.5239738914927],[4.8364533925503155,51.507874144493115],[5.080795149830825,51.49892738159079],[5.135412719105292,51.447001512638565],[5.106666630013469,51.391429175957505],[5.264770120018504,51.31782647548482],[5.264770120018504,51.28727359653538],[5.4085005654776275,51.292666758936925],[5.486115006025553,51.325012432665545],[5.5809771000285755,51.28367780302667],[5.583851708937758,51.23510703218069],[5.767826679125435,51.20449910348059],[5.8770618176743685,51.161253258857485],[5.704585283123422,50.80292546633848],[5.905807906766195,50.7865720955422],[5.9374286047672005,50.732019528192964],[5.902933297857012,50.70107817444857],[5.8138204216723555,50.69379488717487],[5.615472406938765,50.761122144578216],[5.500488050571466,50.71200098472672],[5.204403332925673,50.70289881954383],[5.164158808197117,50.67558172042608],[5.037676016193088,50.70107817444857],[4.988807664736986,50.750210783384084],[4.916942442007425,50.72656077355532],[4.790459650003396,50.766576871275696],[4.681224511454462,50.77021300246129],[4.6697260758177315,50.73565834458533],[4.287403090896464,50.67922491935501],[3.91082932379356,50.677403355240585],[3.718230526878334,50.752029520237265],[3.6549891308763196,50.71200098472672],[3.5342555566906557,50.710180693059606],[3.514133294326379,50.741116039142966],[3.45664111614273,50.74384464791457],[3.373277457776438,50.69561581502901],[3.310036061774423,50.70745012302645],[3.2899137994101473,50.7365680045137],[3.1648683118607086,50.742935129324266],[3.1318103094051106,50.77203096207303],[3.080067349039826,50.76021296163662],[2.8745328120332805,50.73929687829333],[2.8960923788521487,50.71109084772858],[2.8745328120332805,50.69561581502901],[2.796918371485353,50.70289881954383],[2.699181668573149,50.80020030189157],[2.6201299235706315,50.79747497850781],[2.5698242676599374,50.85830267681076],[2.5669496587507554,50.923581424665855],[2.6028822701155367,50.94984841176044],[2.549702005295661,50.996006093918574],[2.522393220658428,51.101723961331]]],"terms_text":"Orthophoto Flanders most recent © AGIV","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABm0lEQVQ4y6WTPUgCYRjHf5oFJVfRUZKVHYFBoBAUFLZE0FBD0NQHRENESzS019LSFNHWx1DQEhGRg0JFREM11FJuLWem4GB5HULdwdkgHprn5LO97/O8v+fj/7y2bDabpQKzFx5S6ntlgE81xvHtclHAbuSNloNT5q/uywP021cAvO4hAPYu5/hI5e6GWpsBCEfjxNSMNUALPvJ7eA3AQPcML3KIzbNhlvdEWmu+6RCcAISiCWtA3fosPztBfrYvAGgX/QCIggdR8DDe6Qbg5E0uAdjyKhhykq+uBeySi9qVCfSAB61HRBQ8RFJpRs6vALiZHMUnNpYO0Ujn+jPkJJnVfbTBNeqfFQB8YqP56H8VJqBKcuHcWsQuuXIOyUX1sN8MnPJKlnOwWS2SIScx0hkcvV3mXUzN0HcSAuBoNMBYZxsADittVXcT/XcPKE/PltqHowkTYLcMkOMoml52+wr9jnIZAJZ8XjYGe0vaUDSdsBxnulsqrUDRdMLReNHg8tYhOAs2M2HdQiSVBqChprpI7/9q5JPYKv3OfxL1n52ATYYBAAAAAElFTkSuQmCC"},{"id":"Benin_cotonou_pleiade_2016","name":"Benin: Cotonou Pleiade 2016","type":"tms","template":"http://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}","scaleExtent":[0,21],"polygon":[[[2.31953818544,6.55745092536],[2.33645249928,6.56023631702],[2.36377172444,6.56211241002],[2.36737717181,6.56067658005],[2.37777373205,6.54939665325],[2.3777926612,6.53484752744],[2.36994151563,6.4933195729],[2.37038356708,6.45527010853],[2.36958186167,6.45269435578],[2.36188103586,6.44177160245],[2.35391742884,6.40545220189],[2.3674929737,6.40149524022],[2.39525870424,6.40071623744],[2.40128040262,6.40374371884],[2.40587684694,6.40340733291],[2.42045897749,6.39382909301],[2.42485054154,6.3979366042],[2.42949152505,6.39887495342],[2.43625257397,6.39628121034],[2.43958410532,6.40041525877],[2.44439433776,6.40189359345],[2.45375647532,6.39899446003],[2.47144744127,6.3963166199],[2.48162019208,6.3910582748],[2.49453210303,6.38739776192],[2.50893162289,6.38888498676],[2.50719014059,6.39228876781],[2.50120407357,6.39162040687],[2.4963025358,6.39521449649],[2.49509997769,6.40123077776],[2.49543290813,6.40400928653],[2.49830345887,6.41022131795],[2.50191336015,6.41281720321],[2.5108701911,6.41321333458],[2.52218648559,6.40849403999],[2.53352059576,6.4051656109],[2.53809922441,6.40960941297],[2.5411100736,6.41090182623],[2.54650822333,6.41099034757],[2.54654385468,6.40651114868],[2.57638511144,6.40723702943],[2.57642074279,6.41176933466],[2.58575615684,6.41196408125],[2.58867792765,6.41095493903],[2.60877400982,6.39413560832],[2.62569890171,6.39487921149],[2.64554556441,6.39728706193],[2.65039142819,6.39339200408],[2.6536650586,6.36823275735],[2.6431181786,6.3665949733],[2.61251084779,6.3628944474],[2.56867983171,6.3607044406],[2.54682890549,6.36055393954],[2.54687344468,6.35546343647],[2.50206702036,6.35461353888],[2.47064016846,6.35595920942],[2.46777184468,6.35202842507],[2.46422652522,6.35020467258],[2.45253944198,6.35006302163],[2.4511320036,6.34813302357],[2.44737289603,6.34629155079],[2.43757427441,6.34653944174],[2.43297783009,6.33841209773],[2.43016295333,6.33706638135],[2.42244876576,6.33706638135],[2.39236031651,6.34114999999],[2.39315311407,6.34114999999],[2.3652849434,6.34445228474],[2.35386064137,6.34529777247],[2.34377474198,6.34457844399],[2.34093759563,6.34533982549],[2.31086028117,6.36567095094],[2.28434610184,6.37465215648],[2.28146887022,6.37761782314],[2.27599054995,6.39517244756],[2.27611525968,6.39819996182],[2.31528747657,6.4926104105],[2.31579967725,6.5530659484],[2.31953818544,6.55745092536]],[[1.69563043958,6.25076170066],[1.70009994721,6.24711901182],[1.70417862346,6.24697179839],[1.75874803806,6.25835802546],[1.77079143482,6.25995187823],[1.81712109941,6.27161341959],[1.84456614779,6.27656750346],[1.85767848509,6.27944518918],[1.88843363033,6.28325588467],[1.90481876292,6.28594870029],[1.90617692982,6.29435189983],[1.90083111364,6.29721233234],[1.89880903445,6.29953873942],[1.89404334121,6.30085024405],[1.89047742238,6.29969866569],[1.88747882146,6.29636150888],[1.88344050885,6.29622344016],[1.86969682855,6.29226563906],[1.8564007671,6.29198230539],[1.85206654725,6.28674503171],[1.84991419093,6.28906373821],[1.84691224958,6.29202989661],[1.8435272712,6.29332703219],[1.84040507404,6.29315437611],[1.83626738336,6.29129499924],[1.83409832485,6.28733273348],[1.83416513363,6.2851988527],[1.83229560117,6.28456355663],[1.82785949792,6.28644177291],[1.82182443779,6.2908379014],[1.81562903657,6.28997904337],[1.81211044063,6.29143113241],[1.80757635117,6.29570768815],[1.80471693522,6.29692955475],[1.80073513171,6.29709778253],[1.79775991387,6.29612383144],[1.79625448928,6.29491967121],[1.79490049792,6.28965143736],[1.79641483036,6.28608317469],[1.80097564333,6.28338261222],[1.79566657198,6.28013306439],[1.79156005874,6.28174455931],[1.78498607441,6.28122215216],[1.78092410036,6.27752986974],[1.77588226414,6.27550220232],[1.76744654171,6.27696318619],[1.75653444036,6.27496207997],[1.74833032171,6.27238985028],[1.74761769468,6.27726423691],[1.74572477914,6.27938486862],[1.73948038482,6.27984972411],[1.73680357955,6.27761398678],[1.73572127725,6.27891558552],[1.72901812928,6.27911038233],[1.72435487617,6.27422273126],[1.72449294765,6.2678607472],[1.72555966124,6.26683029328],[1.69933944056,6.26159387355],[1.69572953928,6.25725948175],[1.69563043958,6.25076170066]]],"best":true},{"id":"Bing","name":"Bing aerial imagery","type":"bing","template":"http://www.bing.com/maps/","scaleExtent":[0,22],"default":true,"description":"Satellite and aerial imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABJCAYAAABxcwvcAAAGsklEQVR4Xu2aa2wUZRSG393Z3VKhW0AjQgvhjhRMxVoFSkTSVhJEGqUkECkXQSyoiBCJicYYo+GPiAS1MQREMI2GhGI0UQilJJSCFcWqoDYol0ChEG6lLdu9et5vu01ZWpg0nZ3dMM9msrAz03SenHO+c76tDe+tDMHittijP7C4FUuSDixJOrAk6cCSpANLkg4sSTqwJOnAkqQDS5IOLEk6MEySzWaDLfrDBMUwSaFAgKag2e0JL8sQSYyi+1PcSlSguQmhUFB9bpfPeSSaNEMkiRWsHP8kKua/jFdycjHA3RsI+BH0eeXwKYmUlSjYDNlPEkmbC+ZgYWa2+u81zw3sO/kvvvrzF1SfOYXTVy6pa+Byhd/jHGMiSfAx1YJB+OVI7ZGMggfHYnvhfFQteg2fF8zGQ2kDYfP7kQjJZ5gkplSkaDNWghIxAalNaSmpWPLIBOQNGYWQ3we7/S6W1B5qYA3SbHYlyxcMwCOCEoWYSGoPZTntWkIV7phLSkQsSTqwJOnAkqQD0yWxfMd7CTddkp8dt6x0Dlnx4rWxNF2S25Wkmkp/03U1CLOXirdtFtMkUQSH3mF97sXXsxagKDsHfZJ7IuBpRkiG4JCMM21du8k9lWmSFPLwJ69eRlb/dGx9di6qZa77UoTljhiNlKQeSlbgRrMSZmYDapqkEGuRw4krDdew/qf96rPhfe/DvMxs7JlbjCNLVuH9/GcwZdRY9JSU9DU1hLdZEO7aY7kvZZokhRKlYfeJWpxvbFBzHXcNyDAR9takPOwtWordz7+ENU/PwmODhqqoCu9LeZVoh6SjZnCEmS7JJVFSW3caFSePh6Oj9XkpgML4PnHgYLyZk4vyomIcfnEVVoq8Ef0GwOlwwN/ciIAIMxJzJaE17ewObPqtGiF5cXUjLNaMElrjvhS3WXqJ0KwB6VibPwPHildjR+ECLMvJQ8YD6YamnumSmGJwOlFx4jhqzteJjFBYXCt8eK5wlEeJPMd7KHD6yAx8Om0m9kiEPTl4ONDiUdd2N93/E7sAo4Y1ZrNEE+sL95vai2q7jq/Wok0YYR6/H/17udGvZ4oYDxgSUfEhSaWcHduP1eD3+jq4NEdbb8Q0u1VXGEYNIyqykWfUgBMXktR6JkX4vCzzeVs/w+Lvv8Ef9efUOdWB33T1rYTbgTtd1XXiQpJCokESCRebGrGpuhKPblqHeTtLsfu/f3CZDSUvib4nRsSPJFCCrG7SYDqTkuGVxnFb1V68XfEDmlubyI7qVCyIK0msMSzGPk8T+qWkYt3MItV9p7tT1fm7bixpT2TM4JyWpGkonjAFh15YjhWPT4abM1z0DVGoNsJATJWkpnx+zSTpxGN6xsMon7cUJdMKMbh3X/XwfHUWPzzPIyzZuEcx7iffAdUcBgLwttxARv80lMr0XzZ7EXIGDlHLfuThO1u1mJY875LI+1nGmqMX6lRTakRQmSbpmteDVGkA1zxVgIMLX8WcseNUz0NBFNhR/Yl8E0xYv7jNsvzHMkzasgFH68/C5nSp+7sbUyRx9JgzZhwqFq9Qg6tbVrO2h+8kbfjw1EZ5LdJlf1hVgclbPsGGyj3w+qXTdjCKDAgjmCSJo8fUYaMwTib5yKTfUeQQPnYkush3tUcxYfN6vCERdPrqJTiS71G1zShBxBRJhAU5Mqh2tD3Lh2bEqQFXBLHuPLf9C8wo3YgjZ0/B5nLBLtGjJEff3M0YJimyMnUGC3Jn0cOiHF75bLggHfjru3Yif2sJymoOS1o5VO2J7AbEAsMkce+HIu4kqz3qWjlYlNlllxyuQtbGtfj4QLkq9EwtLl9GplZHdLsklTryEDv+qkF903U4tfD3abdLi/b9Du9n3cnbVoJl35bizNUrsLt6wGbXbvszjMSQPwdUc5b0QGnSEK6eOAXzM7ORqjpnRsHN4wVTK7JRduxiPd7dtwtlf9fA7/NCEznUEuvIicYQSYTRE+Iej9+H7EFDsXpSLgpHZ6pz0bLONTZgQ/V+OSrR2NwIOFzQtPAcFw8YJomovoYNYksL/4GpIzLwzhP5mChdNQnK0r7x10P46OA+1J47CyQlqesZOYb9Ul3AUEkRmE5B1hOvV4IkCYuzxmPGyDH4oLIcB07Ugr+Gw8Vu2fzU6oiYSCKRblmlEP9eku+aQ+1I8vNYLeddodtXt86gAkYKvyKySzRp7JRlICXxLIjETFJ7KIURFY+p1RGmSEo0LEk6sCTpwJKkA0uSDixJOrAk6cCSpANLkg4sSTqwJOnAkqQDS5IOLEk6sCTp4H8Lf75Du1VW7QAAAABJRU5ErkJggiAgICAgICAgICAgICAgICAgICAgICAg"},{"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","scaleExtent":[9,20],"polygon":[[[-123.3176032,49.3272567],[-123.4405258,49.3268222],[-123.440717,49.3384429],[-123.4398375,49.3430357],[-123.4401258,49.3435398],[-123.4401106,49.3439946],[-123.4406265,49.3444493],[-123.4404747,49.3455762],[-123.4397768,49.3460606],[-123.4389726,49.3461298],[-123.4372904,49.3567236],[-123.4374774,49.3710843],[-123.4335292,49.3709446],[-123.4330357,49.373725],[-123.4332717,49.3751221],[-123.4322847,49.3761001],[-123.4317482,49.3791736],[-123.4314264,49.3795927],[-123.4307826,49.3823866],[-123.4313405,49.3827358],[-123.4312118,49.3838533],[-123.4300415,49.3845883],[-123.4189858,49.3847087],[-123.4192235,49.4135198],[-123.3972532,49.4135691],[-123.3972758,49.4243473],[-123.4006929,49.4243314],[-123.4007741,49.5703491],[-123.4000812,49.570345],[-123.4010761,49.5933838],[-123.3760399,49.5932848],[-123.3769811,49.6756063],[-123.3507288,49.6756396],[-123.3507969,49.7086751],[-123.332887,49.708722],[-123.3327888,49.7256288],[-123.3007111,49.7255625],[-123.3009164,49.7375384],[-123.2885986,49.737638],[-123.2887823,49.8249207],[-123.2997955,49.8249207],[-123.3011721,49.8497814],[-123.3218218,49.850669],[-123.3273284,49.8577696],[-123.3276726,49.9758852],[-123.3008279,49.9752212],[-123.3007204,50.0997002],[-123.2501716,50.100735],[-123.25091,50.2754901],[-123.0224338,50.2755598],[-123.0224879,50.3254853],[-123.0009318,50.3254689],[-123.0007778,50.3423899],[-122.9775023,50.3423408],[-122.9774766,50.3504306],[-122.9508137,50.3504961],[-122.950795,50.3711984],[-122.9325221,50.3711521],[-122.9321048,50.399793],[-122.8874234,50.3999748],[-122.8873385,50.4256108],[-122.6620152,50.4256959],[-122.6623083,50.3994506],[-122.5990316,50.3992413],[-122.5988274,50.3755206],[-122.5724832,50.3753706],[-122.5735621,50.2493891],[-122.5990415,50.2494643],[-122.5991504,50.2265663],[-122.6185016,50.2266359],[-122.6185741,50.2244081],[-122.6490609,50.2245126],[-122.6492181,50.1993528],[-122.7308575,50.1993758],[-122.7311583,50.1244287],[-122.7490352,50.1245109],[-122.7490541,50.0903032],[-122.7687806,50.0903435],[-122.7689801,49.9494546],[-122.999047,49.9494706],[-122.9991199,49.8754553],[-122.9775894,49.8754553],[-122.9778145,49.6995098],[-122.9992362,49.6994781],[-122.9992524,49.6516526],[-123.0221525,49.6516526],[-123.0221162,49.5995096],[-123.0491898,49.5994625],[-123.0491898,49.5940523],[-123.0664647,49.5940405],[-123.0663594,49.5451868],[-123.0699906,49.5451202],[-123.0699008,49.5413153],[-123.0706835,49.5392837],[-123.0708888,49.5379931],[-123.0711454,49.5368773],[-123.0711069,49.5358115],[-123.0713764,49.532822],[-123.0716458,49.5321141],[-123.07171,49.5313896],[-123.0720308,49.5304153],[-123.0739554,49.5303486],[-123.0748023,49.5294992],[-123.0748151,49.5288079],[-123.0743403,49.5280584],[-123.073532,49.5274588],[-123.0733652,49.5270423],[-123.0732882,49.5255932],[-123.0737116,49.5249602],[-123.0736218,49.5244938],[-123.0992583,49.5244854],[-123.0991649,49.4754502],[-123.071052,49.4755252],[-123.071088,49.4663034],[-123.0739204,49.4663054],[-123.07422,49.4505028],[-123.0746319,49.4500858],[-123.074651,49.449329],[-123.0745999,49.449018],[-123.0744619,49.4486927],[-123.0743336,49.4479899],[-123.0742427,49.4477688],[-123.0743061,49.4447473],[-123.0747103,49.4447556],[-123.0746384,49.4377306],[-122.9996506,49.4377363],[-122.9996506,49.4369214],[-122.8606163,49.4415314],[-122.8102616,49.4423972],[-122.8098984,49.3766739],[-122.4036093,49.3766617],[-122.4036341,49.3771944],[-122.264739,49.3773028],[-122.263542,49.2360088],[-122.2155742,49.236139],[-122.0580956,49.235878],[-121.9538274,49.2966525],[-121.9400911,49.3045389],[-121.9235761,49.3142257],[-121.8990871,49.3225436],[-121.8883447,49.3259752],[-121.8552982,49.3363575],[-121.832697,49.3441519],[-121.7671336,49.3654361],[-121.6736683,49.3654589],[-121.6404153,49.3743775],[-121.5961976,49.3860493],[-121.5861178,49.3879193],[-121.5213684,49.3994649],[-121.5117375,49.4038378],[-121.4679302,49.4229024],[-121.4416803,49.4345607],[-121.422429,49.4345788],[-121.3462885,49.3932312],[-121.3480144,49.3412388],[-121.5135035,49.320577],[-121.6031683,49.2771727],[-121.6584065,49.1856125],[-121.679953,49.1654109],[-121.7815793,49.0702559],[-121.8076228,49.0622471],[-121.9393997,49.0636219],[-121.9725524,49.0424179],[-121.9921394,49.0332869],[-122.0035289,49.0273413],[-122.0178564,49.0241067],[-122.1108634,48.9992786],[-122.1493067,48.9995305],[-122.1492705,48.9991498],[-122.1991447,48.9996019],[-122.199181,48.9991974],[-122.234365,48.9994829],[-122.234365,49.000173],[-122.3994722,49.0012385],[-122.4521338,49.0016326],[-122.4521338,49.000883],[-122.4584089,49.0009306],[-122.4584814,48.9993124],[-122.4992458,48.9995022],[-122.4992458,48.9992906],[-122.5492618,48.9995107],[-122.5492564,48.9993206],[-122.6580785,48.9994212],[-122.6581061,48.9954007],[-122.7067604,48.9955344],[-122.7519761,48.9956392],[-122.7922063,48.9957204],[-122.7921907,48.9994331],[-123.0350417,48.9995724],[-123.0350437,49.0000958],[-123.0397091,49.0000536],[-123.0397444,49.0001812],[-123.0485506,49.0001348],[-123.0485329,49.0004712],[-123.0557122,49.000448],[-123.0556324,49.0002284],[-123.0641365,49.0001293],[-123.064158,48.9999421],[-123.074899,48.9996928],[-123.0750717,49.0006218],[-123.0899573,49.0003726],[-123.109229,48.9999421],[-123.1271193,49.0003046],[-123.1359953,48.9998741],[-123.1362716,49.0005765],[-123.153851,48.9998061],[-123.1540533,49.0006806],[-123.1710015,49.0001274],[-123.2000916,48.9996849],[-123.2003446,49.0497785],[-123.2108845,49.0497232],[-123.2112218,49.051989],[-123.2070479,49.0520857],[-123.2078911,49.0607884],[-123.2191688,49.0600978],[-123.218958,49.0612719],[-123.2251766,49.0612719],[-123.2253874,49.0622388],[-123.2297088,49.0620316],[-123.2298142,49.068592],[-123.2331869,49.0687301],[-123.2335031,49.0705945],[-123.249313,49.0702493],[-123.2497346,49.0802606],[-123.2751358,49.0803986],[-123.2751358,49.0870947],[-123.299483,49.0873018],[-123.29944,49.080253],[-123.3254508,49.0803944],[-123.3254353,49.1154662],[-123.2750966,49.1503341],[-123.275181,49.1873267],[-123.2788067,49.1871063],[-123.278891,49.1910741],[-123.3004767,49.1910741],[-123.3004186,49.2622933],[-123.3126185,49.2622416],[-123.3125958,49.2714948],[-123.3154251,49.2714727],[-123.3156628,49.2818906],[-123.3174735,49.2818832],[-123.3174961,49.2918488],[-123.3190353,49.2918488],[-123.3190692,49.298602],[-123.3202349,49.2985651],[-123.3202786,49.3019749],[-123.3222679,49.3019605],[-123.3223943,49.3118263],[-123.3254002,49.3118086],[-123.3253898,49.3201721],[-123.3192695,49.3201957],[-123.3192242,49.3246748],[-123.3179437,49.3246596],[-123.3179861,49.3254065],[-123.3176032,49.3272567]]],"terms_url":"http://imagery.paulnorman.ca/tiles/about.html","terms_text":"Copyright Province of British Columbia, City of Surrey"},{"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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":"osm-cambodia_laos_thailand_vietnam-bilingual","name":"Cambodia, Laos, Thailand, Vietnam, Myanmar bilingual","type":"tms","template":"http://{switch:a,b,c,d}.tile.osm-tools.org/osm_then/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[92.1023798,20.8135629],[93.5690546,24.0975527],[94.1733026,23.9269484],[95.1950312,26.707274],[96.7550898,27.5286657],[97.5845575,28.5805966],[98.738122,27.514051],[98.7436151,25.8799151],[97.6779413,24.7577376],[97.9635858,24.042382],[98.8205194,24.1627239],[99.5236444,22.9593356],[100.3695917,21.5051376],[101.7923212,22.4830518],[105.3628778,23.3331079],[106.8185663,22.8480137],[108.1973505,21.3619661],[107.4389505,18.8539792],[117.1453714,7.4656173],[119.6172953,5.2875389],[118.1231546,4.0502277],[117.2552347,4.3624942],[115.8654642,4.3460623],[115.5084085,3.0249771],[114.552598,1.5100953],[113.5418558,1.2574836],[112.9650736,1.5704982],[112.2454691,1.5100953],[111.67418,1.0158321],[110.4546976,0.9004918],[109.4988871,1.9218969],[103.2256937,1.1256762],[100.4626322,3.2388904],[97.6721048,8.0588831],[93.892808,15.9398659],[92.1023798,20.8135629]]],"terms_url":"http://www.osm-tools.org/","terms_text":"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{"id":"South_Africa-CapeTown-Aerial-2013","name":"City of Cape Town 2013 Aerial","type":"tms","template":"http://{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","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"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":"http://{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","scaleExtent":[1,21],"polygon":[[[18.4486565,-33.893623],[18.4485868,-33.902644],[18.4702,-33.9027665],[18.4813902,-33.8472383],[18.4492466,-33.801069],[18.4281537,-33.7356408],[18.43914,-33.7177232],[18.4071895,-33.6589917],[18.3322379,-33.5775191],[18.3324525,-33.5504487],[18.353996,-33.5505918],[18.3542535,-33.5236025],[18.3652398,-33.5236561],[18.3650252,-33.5148009],[18.3760115,-33.5147652],[18.3760545,-33.5058017],[18.4296557,-33.5059449],[18.4296986,-33.4878541],[18.4404919,-33.4878899],[18.4405991,-33.4698849],[18.4943721,-33.4700997],[18.4943292,-33.4791564],[18.5158297,-33.4791743],[18.5157439,-33.4881941],[18.5264727,-33.4883015],[18.5263225,-33.5243538],[18.5479304,-33.5244253],[18.5479519,-33.5153913],[18.5693666,-33.5154987],[18.5693666,-33.524479],[18.5801169,-33.5245327],[18.580074,-33.5425978],[18.5907814,-33.5425978],[18.5907385,-33.5606413],[18.5799453,-33.5605341],[18.5798809,-33.569617],[18.5906956,-33.569617],[18.5906526,-33.5786811],[18.6230108,-33.5787347],[18.622925,-33.5877264],[18.6659691,-33.5878872],[18.6659262,-33.614928],[18.6767194,-33.6149726],[18.6765772,-33.6510279],[18.687298,-33.6510167],[18.6873409,-33.6600365],[18.6980697,-33.6600901],[18.6980697,-33.6690733],[18.7520358,-33.6692519],[18.7520787,-33.6421924],[18.7736437,-33.642246],[18.773708,-33.6331886],[18.8274595,-33.6332958],[18.8275239,-33.6603044],[18.8166663,-33.6602866],[18.8166019,-33.6783233],[18.8058087,-33.6783055],[18.8058087,-33.7053892],[18.8273951,-33.7054428],[18.8273308,-33.7234701],[18.838124,-33.7234344],[18.8380381,-33.7413865],[18.8165161,-33.7413687],[18.8163659,-33.7955057],[18.8055941,-33.7955057],[18.8055083,-33.8135675],[18.794758,-33.8135497],[18.7947151,-33.8315364],[18.7731072,-33.8315186],[18.7731287,-33.8405194],[18.7623569,-33.8405194],[18.7622711,-33.903588],[18.7514564,-33.9035167],[18.7510809,-33.9847823],[18.7619063,-33.9848001],[18.7617776,-34.0298785],[18.772603,-34.0298963],[18.7725815,-34.0389073],[18.7940338,-34.0389406],[18.7938756,-34.0406987],[18.7984461,-34.0411855],[18.8032445,-34.0411788],[18.8034055,-34.0389206],[18.8159367,-34.038974],[18.8163444,-34.0299318],[18.8379845,-34.0316479],[18.8380006,-34.030003],[18.8484183,-34.0300074],[18.8484666,-34.0218491],[18.859925,-34.0234675],[18.8598606,-34.0210132],[18.868272,-34.0220803],[18.8681862,-34.0211733],[18.8854596,-34.0234319],[18.8851806,-34.0213156],[18.9025184,-34.021031],[18.9025828,-34.0119958],[18.9134189,-34.0119958],[18.9134833,-33.9939582],[18.9458844,-33.9940294],[18.9458629,-34.003102],[18.9674279,-34.0029953],[18.9674708,-34.0120848],[18.9782211,-34.0120848],[18.9783284,-34.0211377],[18.9891431,-34.0211377],[18.9891645,-34.039134],[19.0000167,-34.0391251],[19.0000221,-34.0571798],[19.0108368,-34.0572509],[19.0107939,-34.0841436],[19.0000007,-34.0841258],[19.0000221,-34.0931977],[18.9891538,-34.0931711],[18.9891753,-34.1021976],[18.9783177,-34.1021798],[18.9783177,-34.111232],[18.967503,-34.1112143],[18.9674923,-34.1292536],[18.9566025,-34.1292358],[18.9565596,-34.1382408],[18.9674172,-34.1383118],[18.9674172,-34.1473157],[18.9891753,-34.147298],[18.9891753,-34.165303],[18.9782748,-34.1652852],[18.9783177,-34.1742863],[18.9674172,-34.1742685],[18.9674601,-34.1833042],[18.9565596,-34.1833219],[18.9565596,-34.1923565],[18.9457449,-34.192321],[18.945702,-34.2013192],[18.9348659,-34.2013725],[18.9348873,-34.2193305],[18.9023575,-34.2193482],[18.9017567,-34.2362557],[18.8878414,-34.2373467],[18.8894185,-34.2554123],[18.8805887,-34.2553414],[18.8792744,-34.2644348],[18.8696882,-34.2644126],[18.8697097,-34.2734386],[18.8371369,-34.2734208],[18.8371155,-34.2643771],[18.848016,-34.2644037],[18.8480267,-34.237391],[18.8154861,-34.210281],[18.8156471,-34.1741265],[18.8548824,-34.1562743],[18.7617561,-34.0840547],[18.6533734,-34.077479],[18.4797433,-34.1101217],[18.4463713,-34.1342269],[18.4444508,-34.1640868],[18.4359965,-34.1640513],[18.435975,-34.1820172],[18.4468111,-34.182106],[18.4467253,-34.1911052],[18.4659299,-34.1912117],[18.4866151,-34.2453911],[18.4788904,-34.2543659],[18.4860036,-34.2543748],[18.4677109,-34.2994116],[18.4892222,-34.3445792],[18.500112,-34.3445837],[18.4999189,-34.3626174],[18.467432,-34.3625111],[18.4673676,-34.3534947],[18.3916005,-34.3170651],[18.3917722,-34.2900161],[18.3701643,-34.2808678],[18.370682,-34.2178866],[18.3492324,-34.1816178],[18.3274743,-34.1814936],[18.3276674,-34.1634565],[18.3118746,-34.1543832],[18.3114025,-34.1435331],[18.3236656,-34.1346886],[18.3499297,-34.1042053],[18.3393189,-34.0882843],[18.3612487,-34.0597219],[18.3550474,-34.0553843],[18.3427522,-34.064326],[18.3199963,-34.0644326],[18.296071,-34.045126],[18.3068213,-34.0252637],[18.3287725,-34.0191992],[18.3289227,-34.001252],[18.3397374,-34.0012698],[18.3398017,-33.9866282],[18.3628687,-33.9735145],[18.3638129,-33.9292474],[18.3726212,-33.9292741],[18.3728358,-33.917763],[18.3977267,-33.8933469],[18.4486565,-33.893623]]],"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":"CRAIG-Auvergne-2013","name":"CRAIG - Auvergne 2013 - 25 cm","type":"tms","template":"http://tiles.craig.fr/osm/tms/1.0.0/ortho_2013/webmercator/{zoom-1}/{x}/{-y}.jpeg","polygon":[[[2.9401192,44.6338837],[2.9971896,44.633931],[2.9971676,44.6473385],[3.0159744,44.6473541],[3.0159305,44.6741168],[3.0349486,44.6741326],[3.0349036,44.7015216],[3.0536338,44.7015371],[3.0535675,44.7418954],[3.0723301,44.741911],[3.0722196,44.8091687],[3.0921583,44.8091852],[3.092137,44.8221252],[3.1301398,44.8221567],[3.1300495,44.8770722],[3.1485587,44.8770875],[3.1485807,44.8636964],[3.1682313,44.8637126],[3.1682538,44.8500261],[3.2064,44.8500576],[3.2063789,44.8628393],[3.2439492,44.8628704],[3.2439263,44.8767893],[3.2631452,44.8768052],[3.2630782,44.9175197],[3.3200437,44.9175667],[3.3200227,44.9303336],[3.3390815,44.9303493],[3.3390586,44.9441978],[3.3769989,44.9442292],[3.3770218,44.9302879],[3.396031,44.9303036],[3.39612,44.8762713],[3.4148252,44.8762867],[3.4148923,44.8355255],[3.4333371,44.8355408],[3.4333819,44.8082784],[3.4525549,44.8082943],[3.4525774,44.7946344],[3.5089262,44.7946811],[3.508904,44.8081469],[3.604265,44.8082258],[3.6042213,44.8348239],[3.6236136,44.83484],[3.6235695,44.8616583],[3.6424823,44.8616739],[3.642549,44.821102],[3.6610055,44.8211172],[3.6610275,44.8077696],[3.6992999,44.8078013],[3.6992782,44.820994],[3.7361139,44.8210245],[3.7361819,44.7797075],[3.7751058,44.7797397],[3.775151,44.7522344],[3.8118352,44.7522648],[3.8118567,44.7392021],[3.8311822,44.7392181],[3.8312061,44.7246766],[3.887824,44.7247235],[3.8878019,44.7381833],[3.925626,44.7382146],[3.9256039,44.7516682],[3.9454097,44.7516846],[3.9453656,44.7784691],[3.9643737,44.7784848],[3.9643516,44.7919273],[4.0033183,44.7919596],[4.0032964,44.8052575],[4.0216937,44.8052727],[4.0216718,44.8185687],[4.0596515,44.8186001],[4.0596082,44.8449216],[4.0798132,44.8449383],[4.0797928,44.8573502],[4.173882,44.857428],[4.1738604,44.8705468],[4.1932576,44.8705628],[4.193235,44.8842744],[4.2140385,44.8842916],[4.2139961,44.9100242],[4.2324138,44.9100394],[4.2323689,44.9373093],[4.2715486,44.9373416],[4.2715273,44.9502971],[4.3288672,44.9503445],[4.3287793,45.0036659],[4.3489259,45.0036825],[4.3489038,45.0170656],[4.4060793,45.0171127],[4.4059904,45.0710024],[4.3884707,45.0709879],[4.3884482,45.0845976],[4.407943,45.0846137],[4.4079231,45.09663],[4.4843608,45.0966929],[4.4842941,45.1370472],[4.4663631,45.1370324],[4.4663413,45.1502035],[4.4864469,45.15022],[4.4864022,45.1772415],[4.5065524,45.177258],[4.5064402,45.2450058],[4.4881342,45.2449908],[4.4881106,45.2592077],[4.4698588,45.2591927],[4.469836,45.2729835],[4.4508849,45.2729679],[4.4508626,45.2864203],[4.3936753,45.2863733],[4.3936303,45.3135182],[4.3750893,45.3135029],[4.3750662,45.3274054],[4.3950734,45.3274218],[4.3950283,45.3545849],[4.3767871,45.35457],[4.3767639,45.3685486],[4.3576564,45.3685329],[4.3576335,45.3823359],[4.2814576,45.3822734],[4.2814334,45.3968834],[4.2444556,45.3968531],[4.2444325,45.4107893],[4.1481178,45.4107104],[4.1481388,45.3980659],[4.1291913,45.3980504],[4.1292145,45.3840899],[4.0902138,45.3840579],[4.0902351,45.3712093],[4.0135507,45.3711464],[4.0135259,45.3860975],[3.9170932,45.3860185],[3.9170704,45.3997355],[3.9375703,45.3997523],[3.9375481,45.4131142],[3.975277,45.4131451],[3.9752552,45.4262061],[3.9953725,45.4262226],[3.9956999,45.5209568],[3.9777821,45.5209421],[3.977693,45.5743873],[3.9581755,45.5743714],[3.9581522,45.5883658],[3.9396019,45.5883506],[3.9395781,45.6026212],[3.9202279,45.6026054],[3.9202048,45.6164603],[3.8818916,45.616429],[3.8818468,45.643276],[3.8441329,45.6432453],[3.8441098,45.6570896],[3.8261689,45.657075],[3.8261241,45.6838865],[3.8072175,45.6838711],[3.8071277,45.7375802],[3.7882101,45.7375648],[3.7881863,45.7517966],[3.7688482,45.7517809],[3.7688028,45.7789651],[3.750719,45.7789504],[3.7505822,45.8606554],[3.7696692,45.8606709],[3.7695793,45.914333],[3.751661,45.9143185],[3.7516379,45.9280879],[3.7328974,45.9280727],[3.7328527,45.9547155],[3.8101795,45.9547782],[3.8101569,45.9682278],[3.8495994,45.9682598],[3.8495098,46.0216192],[3.8318849,46.0216049],[3.8317936,46.0759058],[3.8505037,46.0759209],[3.8504583,46.1029545],[3.8324727,46.10294],[3.8323353,46.1845598],[3.8142194,46.1845452],[3.8141522,46.2244234],[3.8336864,46.2244392],[3.8336634,46.2381001],[3.8528929,46.2381156],[3.8528703,46.2514729],[3.8931424,46.2515054],[3.8931205,46.2644677],[3.9130562,46.2644838],[3.9130335,46.2779317],[3.9518926,46.2779631],[3.9518709,46.2908227],[3.971523,46.2908386],[3.9715012,46.3036947],[4.0105021,46.3037261],[4.0104784,46.3177638],[4.0298278,46.3177794],[4.029783,46.3442827],[4.0116018,46.344268],[4.0114647,46.4253437],[4.031532,46.4253598],[4.0314635,46.4657978],[4.0132435,46.4657832],[4.0132204,46.479378],[3.9943703,46.4793629],[3.9943461,46.4936113],[3.9745971,46.4935955],[3.9745735,46.5075278],[3.8775423,46.5074499],[3.8774959,46.5347758],[3.8583577,46.5347605],[3.8583347,46.5483156],[3.8186897,46.5482838],[3.8187114,46.5355316],[3.7992386,46.535516],[3.7992156,46.5490706],[3.7610377,46.5490399],[3.7609226,46.6168059],[3.7423295,46.616791],[3.7422834,46.6439624],[3.7228558,46.6439468],[3.7228098,46.6710357],[3.7038706,46.6710206],[3.7038474,46.6846709],[3.6841096,46.6846551],[3.6840631,46.711998],[3.6648359,46.7119826],[3.6647898,46.7390375],[3.6457623,46.7390222],[3.6457158,46.7663375],[3.6257542,46.7663216],[3.6257314,46.7797093],[3.5672301,46.7796626],[3.5672528,46.7663082],[3.5471462,46.7662922],[3.5471922,46.7392824],[3.5271621,46.7392664],[3.5272308,46.6988967],[3.4877399,46.6988651],[3.4877618,46.685943],[3.4679636,46.6859272],[3.4679407,46.6994059],[3.4679179,46.7127907],[3.4486497,46.7127753],[3.4486258,46.7267878],[3.350433,46.7267092],[3.3504786,46.6999004],[3.3303913,46.6998843],[3.3303448,46.7271984],[3.2327174,46.7271203],[3.2327406,46.7135148],[3.2129042,46.7134989],[3.212927,46.7001302],[3.1735446,46.7000987],[3.173498,46.7275094],[3.1541227,46.7274939],[3.1541002,46.7407271],[3.1147772,46.7406957],[3.114754,46.7542756],[3.0753432,46.7542441],[3.0752971,46.7813548],[3.05597,46.7813394],[3.055924,46.8083069],[2.99704,46.8082598],[2.9970166,46.8219593],[2.9379443,46.8219121],[2.9379675,46.8082604],[2.8986634,46.808229],[2.8986872,46.7942392],[2.878991,46.7942234],[2.8790134,46.7810427],[2.8594188,46.781027],[2.8594415,46.7677056],[2.8400446,46.7676901],[2.8400671,46.754466],[2.7414032,46.7543871],[2.741382,46.7668245],[2.7023351,46.7667932],[2.7023571,46.7538869],[2.6826621,46.7538711],[2.6826849,46.7404752],[2.6634875,46.7404599],[2.6635123,46.7258966],[2.6434164,46.7258805],[2.6434382,46.7130938],[2.6241432,46.7130784],[2.6241658,46.6998093],[2.6039699,46.6997931],[2.6039936,46.6858433],[2.5651245,46.6858122],[2.5651469,46.6726126],[2.5459278,46.6725972],[2.5459966,46.6321534],[2.5659222,46.6321694],[2.565946,46.6181104],[2.5456397,46.6180941],[2.5456862,46.5907192],[2.5664225,46.5907358],[2.5664449,46.5775417],[2.5854963,46.577557],[2.5855181,46.5647199],[2.5661318,46.5647044],[2.5661557,46.5506246],[2.468279,46.5505461],[2.4683039,46.5358205],[2.3321246,46.5357112],[2.3321701,46.5088566],[2.3126474,46.5088409],[2.3126703,46.4953444],[2.2928767,46.4953285],[2.2928996,46.4818182],[2.2748687,46.4818037],[2.2749151,46.4544154],[2.2553921,46.4543997],[2.255529,46.3734888],[2.275948,46.3735052],[2.276037,46.3208741],[2.3145615,46.3209052],[2.3145849,46.3070421],[2.3537075,46.3070737],[2.3537313,46.2929669],[2.3938428,46.2929992],[2.3938862,46.2672854],[2.4515727,46.267332],[2.451596,46.2534921],[2.4709353,46.2535077],[2.4709807,46.2265552],[2.4915062,46.2265718],[2.4915521,46.199329],[2.5108806,46.1993446],[2.5109254,46.1727799],[2.5311728,46.1727963],[2.5313772,46.051352],[2.5516349,46.0513684],[2.5516577,46.0377665],[2.5705635,46.0377818],[2.5706774,45.9699434],[2.5514356,45.9699278],[2.551458,45.9566151],[2.5322621,45.9565995],[2.5322849,45.9430066],[2.5130653,45.942991],[2.513134,45.9020279],[2.4749412,45.9019969],[2.4749633,45.8888235],[2.4361947,45.888792],[2.4362172,45.8753288],[2.417209,45.8753133],[2.4172548,45.8479368],[2.3784736,45.8479053],[2.378497,45.8339746],[2.3595157,45.8339592],[2.3595606,45.8070849],[2.3787254,45.8071005],[2.3787481,45.7935783],[2.3986981,45.7935945],[2.3987203,45.7803477],[2.4182486,45.7803636],[2.4183161,45.7400007],[2.4572171,45.7400324],[2.4572394,45.7266956],[2.4758919,45.7267107],[2.4759144,45.7132391],[2.49533,45.7132549],[2.4954204,45.6591268],[2.4576942,45.659096],[2.4577622,45.618343],[2.4391188,45.6183278],[2.4391866,45.5776619],[2.4585044,45.5776777],[2.4585496,45.5505348],[2.4780887,45.5505508],[2.4781108,45.5372464],[2.4975506,45.5372623],[2.4975949,45.5106757],[2.4785536,45.5106601],[2.4786444,45.4561337],[2.4597798,45.4561183],[2.4598701,45.401757],[2.4224876,45.4017264],[2.4224651,45.4152816],[2.4023154,45.4152651],[2.4022929,45.4288193],[2.3256006,45.4287565],[2.3256684,45.3879609],[2.3456182,45.3879773],[2.3456629,45.3611091],[2.326256,45.3610932],[2.326279,45.3472146],[2.3073819,45.3471991],[2.3074045,45.3335972],[2.2881095,45.3335813],[2.2881307,45.3208191],[2.2696332,45.3208039],[2.2696574,45.306212],[2.2506602,45.3061964],[2.2506828,45.2925147],[2.2316866,45.2924992],[2.2317086,45.2792355],[2.2130009,45.2792202],[2.213046,45.2520355],[2.1937387,45.2520197],[2.1937617,45.2381134],[2.1756091,45.2380985],[2.1757423,45.1576822],[2.1573543,45.157667],[2.1574448,45.1029478],[2.1202408,45.1029172],[2.1202629,45.0895468],[2.1006669,45.0895306],[2.1006902,45.0754441],[2.0824591,45.0754291],[2.082548,45.0215961],[2.1025534,45.0216126],[2.1025982,44.994453],[2.0457406,44.9944061],[2.0458508,44.9275321],[2.0657794,44.9275486],[2.0658912,44.8596881],[2.0856964,44.8597044],[2.0857193,44.8458126],[2.1055593,44.8458291],[2.1056029,44.8193264],[2.124743,44.8193422],[2.1247657,44.805512],[2.1435067,44.8055275],[2.143551,44.778597],[2.1256091,44.7785822],[2.1256984,44.7242739],[2.1066459,44.7242581],[2.1067116,44.6842263],[2.1263414,44.6842426],[2.1263635,44.670735],[2.14598,44.6707513],[2.146069,44.6164441],[2.1839622,44.6164756],[2.183983,44.6037819],[2.2404173,44.6038288],[2.2403728,44.6309515],[2.25948,44.6309674],[2.2594571,44.644934],[2.316678,44.6449815],[2.3167011,44.6308801],[2.3361516,44.6308963],[2.3361734,44.6175824],[2.3724238,44.6176125],[2.3724009,44.6315823],[2.4110495,44.6316144],[2.4110701,44.6190741],[2.4492173,44.6191058],[2.4491956,44.6323197],[2.5048575,44.6323659],[2.5048126,44.6597555],[2.5246119,44.6597719],[2.524567,44.6871739],[2.5422544,44.6871886],[2.5422313,44.70122],[2.5807101,44.701252],[2.5805999,44.7683374],[2.61769,44.7683681],[2.6176235,44.808838],[2.6367564,44.8088539],[2.6366899,44.8492948],[2.6733105,44.8493251],[2.6732888,44.8625164],[2.6933766,44.862533],[2.6933323,44.8894303],[2.7305201,44.8894611],[2.7304757,44.9164461],[2.7499202,44.9164622],[2.7500519,44.8364688],[2.8073346,44.8365162],[2.8073139,44.8491017],[2.8263796,44.8491175],[2.8264007,44.8362845],[2.8457039,44.8363004],[2.8457707,44.7957107],[2.8642166,44.795726],[2.8642611,44.7686452],[2.8839885,44.7686615],[2.8840323,44.7419697],[2.9020315,44.7419846],[2.9021426,44.6743192],[2.9219777,44.6743357],[2.9220221,44.6472986],[2.9400972,44.6473136],[2.9401192,44.6338837]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_France/CRAIG","terms_text":"Orthophotographie CRAIG/Sintegra/IGN 2013"},{"id":"Czech_CUZK-KM-tms","name":"Czech CUZK:KM tiles proxy","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png","scaleExtent":[13,18],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"overlay":true},{"id":"Czech_RUIAN-budovy","name":"Czech RUIAN budovy","type":"tms","template":"http://tile.poloha.net/budovy/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Czech_RUIAN-parcely","name":"Czech RUIAN parcely","type":"tms","template":"http://tile.poloha.net/parcely/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[15.0063684,49.0177392],[15.1559854,49.0013828],[15.190896,48.9424551],[15.3105895,48.9882938],[15.4053469,48.9752013],[15.5400022,48.9162426],[15.7145553,48.8670572],[15.8342488,48.880178],[15.968904,48.8178233],[16.0885976,48.7455261],[16.3978059,48.7455261],[16.4875761,48.8145394],[16.6721036,48.7784014],[16.6820781,48.7356594],[16.9015163,48.7126294],[16.9464014,48.6237005],[17.1159672,48.8375227],[17.2107246,48.880178],[17.4052266,48.8178233],[17.4800351,48.8539329],[17.5299074,48.8178233],[17.7044605,48.8670572],[17.8141796,48.9359033],[17.8840008,48.9359033],[17.9438476,49.0210099],[18.0635412,49.0340903],[18.1184007,49.0994409],[18.1981964,49.3047337],[18.3877112,49.3339917],[18.577226,49.5091747],[18.7567663,49.4994587],[18.8465365,49.5253637],[18.8764598,49.5706645],[18.7966641,49.693412],[18.64206,49.7095399],[18.5872004,49.8351543],[18.6121366,49.8833809],[18.5622643,49.9347695],[18.512392,49.9058702],[18.362775,49.9540261],[18.3278644,49.9219275],[18.2630304,49.9732751],[18.1184007,50.0053395],[18.0635412,50.075806],[17.9139242,49.9796897],[17.779269,50.0309757],[17.714435,50.1237921],[17.6047159,50.1653411],[17.7593201,50.21962],[17.7343839,50.3439092],[17.6396265,50.2802117],[17.3802905,50.2802117],[17.3503671,50.3439092],[17.2805459,50.3375433],[17.1857885,50.4075214],[16.9015163,50.4615247],[16.8666057,50.4138779],[16.9663503,50.3184404],[17.0361715,50.2323826],[16.8366823,50.21962],[16.7120015,50.1046034],[16.5823335,50.1589513],[16.5623846,50.2387626],[16.4327166,50.3375433],[16.3529209,50.3916263],[16.2781124,50.3916263],[16.2082911,50.4456477],[16.3978059,50.5344899],[16.4476782,50.5978464],[16.3529209,50.670601],[16.2382145,50.6769221],[16.2182656,50.6326561],[16.1284954,50.6832425],[16.0486997,50.6073425],[15.988853,50.7021983],[15.8741467,50.6832425],[15.8292616,50.7653291],[15.729517,50.743243],[15.450232,50.8157725],[15.3903852,50.7747914],[15.3804108,50.8598659],[15.2956278,50.8850434],[15.2956278,50.9887568],[15.1709471,51.0201394],[14.9914067,51.0013124],[15.0063684,50.8881896],[14.8417898,50.8756034],[14.7969047,50.8252246],[14.6323261,50.8567177],[14.6622495,50.9353576],[14.5724793,50.9227841],[14.6123772,50.9856174],[14.4976708,51.0483657],[14.4178751,51.0232765],[14.3081561,51.0671736],[14.2532965,51.0044508],[14.4029134,50.9322145],[14.3729901,50.897627],[14.2433221,50.9070625],[14.2084114,50.844123],[14.0338583,50.8126214],[13.9789988,50.8252246],[13.9041903,50.7968626],[13.8742669,50.740087],[13.5351352,50.7243038],[13.530148,50.6579561],[13.4703012,50.6136722],[13.3905055,50.664279],[13.3256715,50.5883483],[13.250863,50.6105074],[13.1960035,50.5059517],[13.0513738,50.5218084],[12.9665909,50.4106997],[12.8269484,50.4710483],[12.7022676,50.4138779],[12.5077656,50.401164],[12.343187,50.2547088],[12.323238,50.1845054],[12.2484296,50.2738373],[12.1736211,50.3311765],[12.0988126,50.33436],[12.1187616,50.25152],[12.2234934,50.1653411],[12.2035445,50.1237921],[12.5027784,49.9732751],[12.4778422,49.9379795],[12.5476634,49.9155052],[12.4678677,49.8029766],[12.408021,49.7611134],[12.4828294,49.6869593],[12.5327017,49.6869593],[12.5177401,49.6288466],[12.6075102,49.5415474],[12.6723442,49.4378793],[12.8119867,49.3469896],[12.9466419,49.3437405],[13.2309141,49.1288206],[13.3256715,49.1059712],[13.4353906,49.0438984],[13.4154417,48.9948387],[13.5002246,48.949006],[13.5650586,48.9882938],[13.6847522,48.8834577],[13.7445989,48.9031312],[13.8243946,48.7751149],[13.8992031,48.7751149],[14.0587945,48.676418],[14.0438328,48.6302932],[14.1435774,48.5907241],[14.3729901,48.5610269],[14.4827091,48.6500662],[14.5774665,48.607215],[14.6273389,48.6335892],[14.7071346,48.5808269],[14.7470324,48.7027561],[14.8118664,48.7389485],[14.8168536,48.794831],[14.9864195,48.7652539],[15.0063684,49.0177392]]],"terms_url":"http://poloha.net/"},{"id":"Duna_2013","name":"Danube flood orthophoto 2013","type":"tms","template":"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg","scaleExtent":[10,20],"polygon":[[[19.0773152,47.6959718],[19.0779881,47.6959835],[19.0946205,47.6944562],[19.0805603,47.595874],[19.0743376,47.5890907],[19.0795196,47.5888284],[19.07717,47.5724109],[19.0577884,47.5720924],[19.0773152,47.6959718]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fotótérkép.hu"},{"id":"Delaware2012Orthophotography","name":"Delaware 2012 Orthophotography","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/0/https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer","polygon":[[[-75.01770587603,38.45188674427],[-75.74173524589,38.4499581145],[-75.80699639658,39.73907123636],[-75.75558784863,39.80106251053],[-75.64692187603,39.8563815616],[-75.47114773904,39.84645578141],[-75.37725787603,39.81477822231],[-75.48746302671,39.6718115509],[-75.50901151986,39.43446011595],[-75.39326532808,39.27784018498],[-75.30707135548,39.01666513594],[-75.1931721774,38.82218696272],[-75.05341480753,38.80875503297],[-75.01770587603,38.45188674427]]],"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":"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.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNXltOTBucm0yd3BtY3E5czl6NmYifQ.qJJsPgCjyzMCm3YG3YWQBQ","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Premium DigitalGlobe satellite imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg=="},{"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.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOGRmNW9qZjBudmgzMnA1a294OGRtNm8ifQ.06mo-nDisy4KmqjYxEVwQw","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/DigitalGlobe","terms_text":"Terms & Feedback","default":true,"description":"Standard DigitalGlobe satellite imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAgAElEQVR4nMy9a7Bl2VEm9uU5595bt6puvd9dVa1+6k3rgRCSQLKMEDCBAHsEGptAGE948Bgz88Nhw0w4bBzjmBl7HDE2EzM4PGZgAIMNNkYEDKDBIARIAoQeLSG1uumu7uqq7nq/bt1b9738Y6/M/DL32vdWYzw6u6PrnLP2Wrkyc2V+meux95WFd31fAQR6FdRfRYuF7ujvAhSpdQsgUusLSikQ6e6hfkcpKOJ9AIBo/VBaINRfqd8jd17Lf8HqgspCy8pm6K0Km4pNCYUqimQukHrs/mn1kcuoi979QNsGo02rRNVXjTGf3e9ePRoj2bZe/Oz1a+0j41omLR53+vwqyzBqDoR9casohe6WTmrroPiHVKcA3BkgYgMsXN9csXT3itBNN+lKDp37CUSZLahKIPrGp1FGIQYLeaBIdWhSQnGmjIoqXukYYIQr4IoXCfVPl8oQnaEow/qBUoZl0KZhHKoM3QAL3S9WjwGro+P1CtHLn8a7lhMfYgXFxqtU+mx83m0JKpsWGUadSZCFEdNqHGrodk+otoj9dmSQrhK5paKx+5WQkmpLikjqG2agQrwpkmQEQHHe2AZL11c22FJxxepKsahVTCvFBpadjEe4pHtqyPpbqtu5casuitdXPs2r6XNABuOwqB7EeFMDLUX5T9G4Wg3zqarOZd0n91VcBi1HB2gWu4WjqttXMGiZPhlGqKFGUFCKCyAiHpoCDyV0CL1vdat5mGEWQ0o1GTKrDvOLO5wyZ3XFfN946OxCjK7dFa/p5WpYETn0rnQj6b/pm1LreCjkky6Dyizqt8Y3NJDaIIoAUgqhktQ2xXkWgXDvso0M4nX0vusZNeIqx8S/RnCAxpiN1cdd6Qn15WMSy9lQAv8SywKETJkMk5hjVRhns0ioChLUWfLymJu5ZCWTMWQWiFDmKNRAnaT+o4KZaTBzAsCpIJp48Win6Z71UarlKiB4lLDhU4dlRDNnrTWlmMyayypN0xWlj2Te1BOXlV55loGCB1AEnnGqx1XaharTgMd8Xex3Yd2bIgsNIkd3Zlvp+fxS4dZl6I/rNMkwcu+IA9NLkY2MG4Xxqy0FYaA6BZFwxjQRkxgzDHlpzAOuEGOOIqlOjxUx5HUfLarnwEPEMUIym8go0zQIhdsb/Ft/wTlrbsCmnl2CuShlWIYuChVjS5iizduU7443Q0YNYdXZu2o+mKZ7YVmE+CpG3/otfSlQXIZSaXCEmDYZRoZVRf9hB+w80OYTNFg296Q2yrCFd2png671henVT8rVJd9TmpQWmYqkjbU6Go5Z8b4k/LKQa23E5dGvqkDTDzwkB9rcR5WNUjPWSXFzCXqSUjq5t5FB5xYEZZZmaWTLE0udbzEGampDawrk28XLRdOSKoP4yo5Uw7ZITuUC1R8h+BTKYKtMKkkpahQgb4rLjm4QnYGqpxvcWhsaPpvEqNc7dGqELKpFSih4IspCRkT2ZVZH1IhIpVBkMqJdiFXa6mxhibhEgCqmJ5gzMYqXGgVsUqd9WB4pKFJCVGFJTIaqVNVZUwYwcKH+Fr8tcOmMp84xi8lF4FV1qfM+BzafT6LWs/FnHmiQOHXuutE2KoMvVkyTDKMSDN4N33cB1IPcpW0gCQn4N4qia/XsoqHKL7M581oPaW4c7mgWlUqxfsycKFTHeYaVOu8WSqSmZVrbhikglcGOMSz24askhfrs2nB+avMY0g3zWSyOaAPPi/uxkgyFFV89t6gMjmqdsYlYWqxjY3pQjy/eq42H9ekg5cjqJQrVtjonJcmPYEM2J5syGUYRo/qmFASAV+N1cSgSFL4PsrPCTcElTFZv6GpXCDpmbtFhlIYqMfCMzoEUDTxgEYxBEUNqyiaOOEazGMq7IzJzTK/v0DbxE6mG4sut+VI0DMg6IIONiVYW3aPxSMLqdYMszrJryhkm3hQ9LdoTYLJh6Vexwff83xYTGFegwDBdMozisPiASs9SYzWhQVPyERWJxwaDlnblcsDnC7nfZI0c/qIRuw8VQ66WECHOOF3h+s4k79h0BbTsB5UzqjnL7OimDFbdpVUM5mBIhhYIUG91jNjJ8yyk2DiE4RbltY+ongsGwRAm10a+OOFk5NMqwygyuY0TmIwlerkEetYDCxrNqLImbQQw9Gv3Hipq2NXvITwCKGqw3LqDXRRDsk4IM2jaLbfAbJM6Rxb3Tv9lfIU7ceIehyajq0vOSdiQDApMEXQKdFM0c6a0HECkjkMySbMXDvV8n1d6SC8+cTK9NuNgBbEyhTKMAAR0yrt5bOh+fqREaIeGP0Vm6Q94ECcJV0os5VyzytIJ5hl//xSU/6tteMXfB6nUsOwrRVJ14ImMt2N9eE+KVjqgJEN1Nkc1501qOqD27BtuQm2K67UgGlWSgcvVSHgu6I7E+XgloTNKINSzjnuLJUzH2WmOMKcKTRkqSEyhDJPKghOtlX0y7MR0ct1tu9OGCC8poMTJqtIA7ECf1hfycFUSlBNykpBiwI1KlIdKz42sJnSlqkngxk8TNRRXjq4C2dyuis9Xgdkv2NhNbwWkbFqxA+lSvF8bDLYLEK/meEMyIPZJ48TpikCoHf2GL5Z0KYeYg3fD6vf4CnagSGv5ry5FU59hMk1gS4qdFhkmmiJ4B13rEoh42NKczp0BPriiNWB1IWREDSYy/dI1NCq+XOdKcxRxLWuZGxn3VZXFDieaNhVXoonEjuIDqW3jwIRRNd2oUUBTA9aMpD6MHsU06q+r05ehN80Lk7ioK0/FGJ2ZHnenoMjjg6BzIZ2bBnjcuD7zZW3b0eWrLcOo1I51EIq4Y5TCDWH/x3CoaFaoAoECexYZta1G8ESp1ChSnBaZMBSS2U+L1SeH5rbkqFFvDWcoZJwqOzm+NstoZgfPDNW5K4kIWmnyGR2PBLX/kvodkqHE76IRmnL5YCwl9uX0qQ316X0orOvvalwl0Tb5uu/OB3oOzuM0TTJMzJDrgHW8q3cxQXY8CUKyxxeUcFjPxjVHhhbipggTCEgXxzR6ZMTkf912I6VSFcHHVTzb0xUjR6EYJt1xWmkjy6e5a754taSjI2ZF8QiN1yWw68sgPAg+dlL54fSMQ2Bh/iTYh6vcEIpQXulqDKzMBTWpjJnxMA5VR0L1p0SGUVjXr0ZJm8gKvh1fZNwaGbRO1IdE5uBe3ZtwgYRtas/BQFR1hOjR6xEmyZkOO5A5jRq4Cql1FdmpXx8TdT93Q04PRPlKl9HT9Eg6hMoRx/pv6KKX+lX5ewsTia9sK1wQ+lJ65rwNGRRxVX5C8yBDQwdBNp0fTZEMI5+EOsfOrA5AqeWOZiV80vhz7s36qRZVQA4n1huCYyK3C/rkc3UdTa5j6V9r74F0o6mWsiyqwNin7266VzqPHDqJrvhCxaCfD5T3mjRAtvCXCmIZg3oT72wYLcsDbPyCEWZeqzUWBSIzAGfE7K3Rl+tNpk6GkU4EAfXQevCKiOlqfqE1ehWMHSmuDFX9FAqKhdA2y6TGWb3bEKCzL6vTob/fK+m3nXy1eVB0MQdyGgE9MUmIzwos6bvzTu21TOrxNfOHfqQyPgY81lPVTqghGdhYfKmbeVZhQYPQl6krCK1DX7pnEOYEKqNUYpryhlUdIXouT9z0nS4ZRqUaQuibBSNezMq1I3o8zQzMmGX0zIwkQzUjU8VGYYLnp/xMuB/Wv02WJbZlhWnqh9SWUsJOLHcudlTSq7djnjhFrPcTplg9k0sSbcg2MqheiKSlLamepEmnokkYJ74dx9ZWdUrdrymBUlsfPQajjUyjDCPPodnAkbxYx6pGEsVSRgcgGD0vKVrHAlrGdJwtBou8LR8PSjgjOnFFdR4x46WmVR/eXidofOSsOMlqs+ogQn11ii1Eu1iY8s/urJOOJaVt6lyVX2G+jF4ylDTRHpTBQ4mnGyZ/to40nhV4er6pdAmEijpy/S2apjqxRneJttlmNvLpkmGkDGjeTOAXPiv29dmixE/YWC3C6OS0sxZFWkZNLevSbw6vsO9k2jBjJmczUOI0g0jYRDilN0pSKq8qktLU1a9uIsby1whEOpGKgJL5B3yiXWhlSu/RDwcEFd3ptGTwianSIR6pbdz3MYoISQrpP0d0j4wlTn5LvMdAp+mvH8UGRcw4vtMiw0jqAEk1om7JVIeluoE2AJ1R4vFmcOPwXu8xoheNHooCInasVxT1a8QIKzcmoLj1JxTwaEVr/6QY0jvpz4TrnBLFxoAn1CYD1K4L0Sr0DEXplmNpYqf9AtJ41qLmtpoOEK8UfJsyFK5Ao2uRjuVXsGJoSemnRd00fnEJXaJRMqrniybL4b6O+xTKMPKQxSZvFkffNa0q4GdfC+gTBNrFBzEwD0UNr1MfCqtlvoPMwUIdSesrWxpZzEGoXzVcR5Dq6IRaira2Np4XDkpdkoWQPLobXWz5Lk7soyOaMwt9NyeJ0ckjriZeMihDb9OQZeD5DhTcQDpNR28YKUrUUbhYPYy8yjvivaa3aLsplGESYAjKIFm1OUUnQVe9cwodYAhoj6gyKR2tOJjuqRL6Ux6Ll9gEUoKee5uAhMwdAhNNZY77LtqONeSbakX7oPDMRyvCBqOpwXWoBh/2F1QXLR0oLeXBb7j2ZUgGBzGmxX1wvZ4e69h0m1yk/WoCvGcUj6TY4JEKq7FqyiiIdYmG/RYnMS0y+MZcHYnOMWtoV19wCHAES14WpzbulTx54V1dUyDrM+XGcYUGFiqE7nsIlfCKF4cRNC5R9dc6XT8BqTMf1Fblstq0mlHUEYKiCVqKn6lFGPhKl6KK7CBD1FMCNdJ/0AdTEJcb7MBE3iISAZeWR4rKfyppoHnxwqmTYWTVhb1PjZWbDoyLtVXGggc5AylF4HsepFibEtpUqKTyaJgx4YYjTXXcODllXXnMZBeNS50g1GLmqW0htri/KkOvWYrMgTnlIoFPlqEHwaaugjQE/bHbLo3I/Aw5JBuojk+jGrfvrUROmQwjHizDLhGfqWcmaweWsqWOdKy7ex4JIrPRadz2KCIAPYVsf5G3MT27GySgPF7MsIMzs1wKFiyPokgH9dVXnYe0xeQfNtGMqBd0NSB6lsFCTykRmgldUSftnlmW2FblilbbY9159Dp5JznS074rR5YmUkpVpk+GiaU7EpevSs3hLa9VJvUbAajnA95JXiLzTS06chuciaAQ/bmHy196xmQQbLLAJruJbeO3lQbZ1xKL2JDtd2Y5kbJ8Wagwy2aWQQ7UAoPET4gOpXWT6SQttpJnpaOG1Uo7LK2h/lTHNvbUyLEzGCA4onPfUyLDSOoSoR67tYsMWgBbetXVFHVIB8pmTEqCed+mo0rY7ZcMT6lm+dWhk8N1VZIismFltAi3KZplvnPkUpmDszjS9M7daEN1RpIxfOf+e/f7MvSuHs8llvMKFw8EA1RJ9cN9GgyVOfdpPJMiVU9KPwHwtMhgz1T31t8pl+UVraIELM1wx+z6VCeKhtmtODkjfsbJETLn3bWUFBIjFkcBTifiUpySLCa8v7GyrixVBTt6kFDZESyVjKtQOsiuq+Kf8HEYBI5kG8YXO31DBq4fELLUPRXTiwth53rI2YbAoYTvRN/KxAGtqMwtRyAa+j28WnI6ZBgVtXjx5c2wTAp3LIsQqN5tRwzMghEkpN8MEF0jPz3rfYl3wiRp8qU2oqtL5hPVUPRepm6IzeG3OqIeAbC+WAoybr5v+xXhUVoHHMeN6Jw5jQS19Rk5bE4SJtJZBgJEPUtmTiQqG92nurrzHiJrMOaOZ4HLEPZKbFGjFqlta66vv3WsGCjD9+mSYeSTwaLwH84A+WDwD/UuX/ktwYI8ghiCZ0RzK3aDtifwJTJODNguehXIJ1pQTzFZbU+lKkaRwXfOWTAyTFYc8lyoIQPTUTLkpMYvXyWVKaspP95WBtMDkxG3RENCEsxoIfKl/h1AMSM98x/R3dpQ2uLgEA20ycOUyDCyAGHeFVFL2TdWFJqqE+QdVN9ijx3ZikKt23qAhyJiaktHd/VhCiNVopUab4kYrQKECSzT4r7ZUVRxvNLBY9jHD6sfIDAPQBqgFhkLBYMylL7uMkiYHCCDdecKvFi+rf9XfbJT9mQtbjucPzMdTgHDK2amS4aRepTzUpHJA4a3ScR6E3k2mEqH1+/dJwzCqePqSNy8oomFR+Yk8ZatU+h7trQwea7/G29NqwQpNtZTcZx4od3yGD1CXUFPBmG+8tWSgVILNzquS0wGI/BBD/oGnB4ciLrhChoN9bxIGJ6TgcSde9fldMkw4pTDowXgB4zgKJyXswKyqjLEfpqSgsJUcBeiM8bYzq2HvVUFSBAk6TfxY2RKUkQSQYyFDOE9pgJbmd14yM+bFNLFkM+1+OqQdECGnIZZCpn4FlJnKu+fHnUG7IAkMRwWHlywaLBZhbn+gMzTIEO3U615NwoxI2TjbojBZhIqUwjoyV9SoUWb0k1/g/Fk+k3kMDZjGy3XlaPqxxDEoxBm2wWmg6rxcLKUaPX7oAiokUnbSN3crLoXk82PnvQUY8qiY/IiO8rg7VWxcTLeHARKU/LqjOrV5Jfcno7fSywP85xalFIQ02VzafqrLMOoupEnGgXwZa4Y612ubLnsvbWtGkr67OrSQS4A/uggSc1OXK1BI5f7nRtHXNkofhYLdTxsblOYTZMZVNY/8yJNJOrGWnXEh9Iqz1VhFjirEcRz+j6oLoA6DkfXhgzspUX1qTzQ2CnvOvDqXToWDYSNfWjfrvLQQuh/Lub5nQFX8aCu6DpFMozsL3gqkfAjrKJbWaQCtV9CUjZ+ekbb0NStNxpn7Mr2IFLqIxX6zcNjb66wMN8RN8geLHX3I/gUioyRryy+fudTluavqY4PrETHVSStHpSf5WjLoJbFXaR2dDssNBhYcIUkl2IFg4Hpg1GoUFuXwdLWLEPob7pkGPHNXjiPEFsdmB7sIBE6XhxJGWW1zyBZNYieIL3Y6Chb2DmgfTCK+KOb3gcp0pSUFMh6ykiXVNFL5/hSxIOjWS+UpwbSE5d1RKjYkMEm1tq35mbqnKD+C53b0fEgtAzyljrONUo1ZWD0Ntm1P7pX8rJ1ROtpk2FkD1FUVFKj5/r8Q9GeD0VZiOtxxZ+NSyOH0tD+w71i/bqDM2wXBEMEbE7Eodj3NRCNsGXYpIPsIHl+DfCAaQdep3kgL3Tkn81B20YGizShWUJbvc8gwaz0nM2dTp2xy/Wpk2CEhPAlK9SQjOZaDpp23m2KZBjxfQD2HKz2JkW3n+p3YVruOBYAijqIxNQhyZmPJbgTqkEJ2YLuQDf0NbBKUYICB/TdNG7c1xXjI4cYBHmZ5QAbDVQLObMWbyNDqQgc0FJlqIah38NCAUqilx7cIb0rOxne/BxXR7szm7hRanUVbIsnq/6g1XTJMOpNSETozX3xpKuegAVNTIM8OmFS6YQNPFpA79yQLgeUAl6CtajYq6sMdL8La5J9zWQurhUjlTyWvvPgNaMBj7jxTcNT+zGwoDHvGOI+QTfrPeW7lEEZnLYWCoIe2Q1DaPN6hesVgzJLny3a1ojrWCLGp4534I/SYZtcSycDR/Bpk2ESxgHKt1uUljmw5eMS8Lpq5DQhFPUcuuydqBw2mSSFQJtIpuhiP4lPb0+/RFenYpiNEzZHYT5saAQp4tncKIFIEAB9HdpgWIiVrBbYkfH0eK7TSP0Ui9EU9fisFh+zr7qgMTKg0TEjz9WJe++wJhmc/7kEehpOXAZjV5QCjQd59DTJMCoiYW7byeKRQZ9VJV7JoPTgFC2FshakDq4RrrymP5Log0zr7wUWZv12MVRBQT0tqf/3nanniLUPjVy9B5LYUVgfZJUWZun/EL1IUYVpW//0q1R61pWfPA4MDMhg/XC0Cs5OTw1SdM+TyVL1FZ5TKToZJZ6FAIfmd5pHM99NGeKLkCKfUyLDKCjXWQUnS0UZJvn8ZCKi1yeF8F/q7ISqTIV8EMGa3UkIUVkIQ1AVipDY0i3d4whsU3iufHUeHerASXY8sNEqP/5uHpqAE5xTWhnb0shI6MaaSh6QIRkYnWmlIJgd6aEYSOnNrm04GmM4QjoVI03znFrRuuXnalyG5pyMZJ02GUaWtgSOg0UYAkuwXlAuaJybBoSplK6kt3zGvlgrWmsp5CwJPah/NYze3kIpMfIZi65cD6FkyJUvo+0e7H3mNrmfojKgEXXyEqAPSMt2WlfYM+EUTPlVVLVxc3bcWFwGm0sR+DB7irYuX1/XjuTZSULFXptpk6H7+xCS+kj0bE6gPznH3elqGT8LxUbvXbnBJuNS+fgzf7c2vRtEt9WY7D/MIXSwwNEg1u9dxGQ8/kw0Ut/SEmw7GXIdGsTm+Z4Buj1aua6kgh7thm5aHYb7A31+lWWoZ5mk37ZGBAH8fI5ZZAPLCqInZaVIHxE03bJq4nR0ky8YHD9uamhANDV6iNcNPLEMneDhXj7dG1CiFQkSOaMnhFitq6T/h8qH6lhISZ8ptS0DiBhPEmxfp3meSOsWqltiu4DIOUoy31MmQ3d0QyJvHWPwyCC6/+DWoRtpsT4o1A3FLWdMArMS6nCkUOZKoWcwFMBT6BOG2awIlcmQiKIAWilWLmgolsUiffhDV8k5JP0PKqfv/LjooAy9VSd+ei894iqx3HhSEEn+a1rkFIhTVdMjrRJSNhD5o5Q8dCJTJ4O9l8n5rwY5AG9qxGE7nI23MmDg5jI0nKSfTlhksN/FFMe2bO3DBKt3sxmZO290BPA+ksxJrmi09IBLi746nCAsDOx4tdKFIRnIEWn1PVTRFI1XbYykvmAipzyFnnwmskENJStFDdZaBgRucB+/TIkMtlOt8xld+rNXwMONVjuQXF58a96cApRugVdq/IENV0oxzo21sPpVggaNVtGmSfHKz+CAMDz7+ZhCfXTtVG5SnGq4PubqJyi5L4mpHcKXZjpV8g+mNSBDDxjS6HCEiZtaSpfRN3ZvGiL75NU0f7dv1bMZLK8IMRG4AYogczMtMoxCWKY3aWRUir4Ub9qafqClN3XrnY6YO0/xbyWke4qytthjYU7ApDIChzdsZ3Qt9BkmVvREV8vYggLExiIiV+6LB0mNoh0xJNlBAIMBGRgYepfRct7D3kztg3dzDY1zfqD8FC6i6GdddZXSUKrQQQe2ejRlMozoOB2UPR7fHBUKw14spBDEX4WMprpEjym6b/MF91xbbWoZnHKoLAi1oWXgoJjC7ROsULXQTwPS1P87A6AHi7TcJvrUlg09d5SNQiF2SIa8UsLOyZNCs5+E1NQuGG++1Cgk3y6RDwsJjHguQ3x0tzEPnQIZRuAOdFVJq5rHuRdLdf94jJeF8+MYPMvvHXVgpFbjUSOGb7LEpbzUjuobf/W/YDQWYViBDT4k3S+JRsspSR47IsD9CfqTdTMS/p14DDg1IAMqaATVkjHmCWsDcfubioSabIyBFjPMekD/oj5DZOQJ8xTJ4KddOXSIGzpPZEXLKxO8TR5PfLqB8GZNb23fGE1oaQNfFUZKbMzLo0FZe61LqBA2+9AwPpoLwdt2MsRB8zCgfXLo0DQxh4cUYbVAfboketZ8QAbA/o6CAxfP50rsg4U3HZdYbmzpuCVQBAKKN7A4ysZ1mBYZ6zTJMFIi9clmvymehXFOrl4eUD84np8s9MN5yZh6Rk1LaFxHyZvx5a35fl0WOKRE1VF1IzLkO+KEFLOcRm2lDhQMPDHBkdRoFOvbAxohfiBBgKH1sY0MUHQV7wOUOiQdFPhvT1EZhb1/G30RhAmO+H1jg4ytUB1fDSrOByN1iBDTIUN9c5+Ews7+tFMfM7aFkAKZcw6sN3NRAMdin/FZgELAoF+ov14kQZhQRfQv8Tsty4W5S7jvz2Ko0YpGsjTYQRZDsDq49of7GMG0n6QTcqawJKw0WzJA7aXKIFSoxGwxI93TdCQMo9IpJoIpgfzdHFnIAcz4VReK9PDHCUj1maVpkWEU6NUOunuMSuQU6mgl/SZGfQlMgvMIE9I+SupLUVC92FCE+kS6tB4J2clPCmODU4O2uQ7xr8CeQ28IWR09jmqdLDxA0fHYiIvRhB2DMefUtmE+MiCDsk23HBAqoGlBKfZL7SU4GhSX6aEd5V95DYNOjxwnnoQGQcE5bt6hd02LDHVjjislgyPgDVmCxApWR9iYK+2A2J0xhIN5GTIKIy7YPkh5JTbolcHbV74MJeBlIa0D8SuUxjEd0wNN3uH8NnlACgCipwNKiAZhNS5EiG1kqMoJ8z9VPjoDcbDQZ0OKO2HvT/4ouDAKq2YqOIkbe5in8XcGlIDMDW+YIhlGoCsgedfMaOmR8K6tDpojMz8zUYqYUKIMJ4O2VSXusSgWpCMADYdpT+JB6BJJ9xE1V0BFIDdye8DEcSnwwIYb6XBHSaeUAjKSGm/aRp2V+MkyqO96uaJgalDQjU4SwfXI9dCoJ4Gqv9jY9ocZEa2NITm1zdFt2mSYpGbqP7UCISBAE2RRkHSWS56wVkqKnFo/5cCo5YrUliIU9efqjmoc1N7QXdubAYPaWMfejhyOZfDl2u5XRGcfAG/o/bEM7sk6Qq7H2ZkJ9szvwu5ds9g1N4tdszOYnUwwOzPBaCwYjwJGYWNjE+ubm1hb38Dq6jrura1j6d4KFpdWsLG5GfVp6VfUc6k89PRpoOPgIqEdbEGjO/NWaMC0H9ZHGl8CNNNv/Wa0s018lWWYlIryMUWR+uyDBCQNTqGVzUkqNzRBNgWExyWpPdlO76ivsD87j2ZmMejYXMAcgJSl69zCfamm9Cg7O0vlzZ0J/pRfRXDlpXfmiAZHRLBv724cP7wfxw/tx9GD+3Dy6EGcPn4Yxw/tx7FD+3Fo317sX9iN/Xt3Y25mBrMzY0qdgOWVNSzdW8Htu8u4fmsRV27ewYXLN/D8S1dw8coNvHT1Ji5cuY5rNxexubkJc9IG6LCTmj7JgS2iV7KCoAIAACAASURBVB2oYal90bE7T4fpOx/lsYd1qo34imUPMxOvkZd/4zLsfdeHLbiQL8IP70kz7cvOHRA6NTC8TOhRyEj1d6c/RliiQ5PgZirauhKjtixsYQsRaTTKhZDAaK/ao3K6PRoJzp48gtc/cgaPnT2Bhx44jjPHD+P08UM4eeQg9u2ZDwPJ+zosp17haAj9LgW4fnsRL7x8Fc9duIKnnr+IJ595AX/8xWdx685dOOAwaKVPICrS9JH0m9tU2iGlS2qygc3loH45umhGwOVfBRlk4V0fpiBAiGn0C6UN6TGMYLcaUeC5PN8zhKUb7rbGYzA0oK/MjO5wdGo5I3kjNBqG28EZaFAyz+at3Lj7MR6P8ODJI/j6r3kcb3/Do3j07AmcPnYYxw7tw+5dc1V1ET25fxN1B0cZai8iWLq3ipev3sTT51/G7/3pl/Cbn/gczl28Qipgvesw96zYPxuo47UJGJDGK9VseESjfm7t9A3h/w3JIAvv+nBx4s5yvrhZZIGDUGJLo4b06wywuKOqeqhjsvEmYGOgMrqwg7RCzsA48qrU/PwcvvUdb8Jf+cY344nHH8Th/QvYv3c3ZibjQUPOBs9XdoTtIsVQm61ScHtxGecvXcNv/OFn8bO/9nG8ePl6xZN6CM5S4ipUAoy88hbycdYPkCJB/g4Dku4OWViKEHG+Z0qzMSvW5v9fGWqEiA9ihGO2wYu6zpv2QxHO+gopUk1VdAWK65NDo3q9T40d4XT1Slj5QcjOsz31YqUysYwAKVKxtshhxqMR5nfN4uEHjuM73/u1+ND734ljB/djZjLGaCRxIAau7VKkncq0vNVP6/fG5iZeunoTP/l//w5+9tc/jpt3lrC1teUyqYY5MrPOSA0Y1GWqn0Gr9YlS3+aSaIbyRr9AGq+/fBlsDmHi0LyhKLWC6DCcf3VuHUBB7+mAhs2PAaMxupw7Bp5SYBwwulC34bWGVA0gag9swczMBKePH8YTjz2ID37z1+Pf+trXYd+e3YP9b5WC5XurWF5Zw73VNayur2N9fQPrG5vY3Nqq41gwGo0wHo0wOzPB3OwM5udmsXd+Drvn52y1qSVnC8CGHEivT3z+K/iHP/UR/OmXn8Pi0r0eLQMVS1EKJCILoW9SbQI+vhmzhTgm8WgPT3xbGYWCWD+P+MuUQRbe+WENSKFG6LKUupFRzYkDB/OqdTHUKRHP34fK0PiO9r0mOmcmGBG0Ye67tpuZmeDRMyfwjq95HP/Ov/02fN0bHsP83GzPIDc2t3D99iIuXbuFKzdu4/L123j+pat46eoNvHz9Fq7fWsStxSXcuXsPK2vr2CrdxuRcdYQDC3tw7NB+nDh8AK86dRSvOnUUZ44fxgPHD+HBk0dDnzmNGrpa6dWl67fwz3/5d/BL//qTOH/pGspWhTx7e51RjspS8Kv3THNCOuf0Q42jVOMWpjk0NH1Dh1umy2vOwznEX54MXcrkHLgXVqE8ykUUyBGj8SI6kiudVcrGTLQH07eck21ztRyxE0uRIwKNTqK0zWQ8wmNnT+J9b38j3vf2N+IdX/M45mZnOlXWwdjcKjh38TK+8Mx5PPPiJTz74iWcu3gFL16+jsvXb2Nza6sOqLj6ydHDipnyaf2PceroATx65iSeePxBvPV1D+Mtr3kYp44dhCA6wk6rVXnecmfpHn7zDz+Hf/ZLv4Unnz6Pjc1NbDfPy7qJem4vYoTFjWTn3c+G8de+JBuSB+qQ6TCImpb/EmToJtWJ78yurdX2cva2UnwuFFFqO0QLMvLEqVWhWZAhvk28Nf9hMiePHsR3v+/r8a3vfBPe+NhZWyYFgK2tgpev3cQffu4pfPILz+Arz7+E51+6iis3bmNtfQNu3cLCpDSsfrMBasjg4Rbj0Rinjx/C6x4+jfe+7Q34wLvfgpNHD/UcY7srg8zq+gb++IvP4L/957+MP/7in3fzCqAPSjx+5lhWUMXNluogGRxf0yC1tpbNAGbk0QBLpVU31uj1kwTzfyky0KS6VjBeQtyAu0M1dAFjH9WtocvCGjOfoEIVELSZlBK9D70osZ0ftICoNyBdpZEI/uo3vR1/44Pvw+MPnsL+vbut6dZWwWeeOodf/b1P49kXL2EyGWN+bhazMzNY2D2HmZkJNje3sLh8D9duLuLFy9fwzPlLWFpejaGoxWwzYvbLRiLYv7Abj589iR/4zvfiQ+9/Z5jIA20HGUqxNja38PQLL+GH/sFP4k+/9Fy7X/2itqF2YmKk1ZzGJDbMDXPUCJNgpHFNWYMSbNlEa5L8F5RBFt75fV13Tafrp0mWbljwYzQgL4crI55NYg9XZiUpp4E6Gk5b9bEDraDI2n+tOzszwRsfPYv//Pu/A+9+y2uxe34uoO+txSV8+dxFjEcjPPTAMczNTDAajcwYdUe2VHm3tgq2trawsrqOL527gI99+s/wrz/1JJ67eAX3VtY8lRLeRaUJp90D6dRlEAC75mbxTW9/I/7e3/wQHjx5BJPJuBephybeXAYAz128gu/9u/8TvnzuooFprBdMQG0IoGHs3SNVN8A70WzxqcPPu9+ASNxLslSJMpJWuv1KZLCUycg3vI/2ru2bSh3cIgFFW2BULVUCNFnvXQyozTmE9g7oHzgcCAm98pnJGA+fPo7v+eZ34Ps/8B4cO7Q/IO2wctvLniyv0tBrdW0dn3ryafzMr/8+PvH5r+DStVudYzSvFC0BhOU7uh49cwI/8gPfiW9955vCDjj3v90ycKmT1s98+Rz+03/4k/jScxeo36jP3jywkSol7uOEWwZ4sQaZULJikXbV1oQx2Ncrk2E8d/aJH+tuCd3XyQ1beOeNlgeKE9FORGJ7neToPN2VUw07CBKVUZSuFuv3hlY6e5EgvIfLyijB1aEDC/j2b3wLfvQHvgsffN/XY+/uXY72acBaZVreQlytz/fGoxEePHUU3/7ut+LR0yewvLKKa7cWcW91NcqeE2nOvZMMgODGnbv49Jeeg4jg0TMnsXvXbBiPIV6VX/199OACjh7ch888dQ637y4bDx7FdOxKHA8ethAFKmwGJFe+ksNXsOOIyRmCITjfB0fRWD/y9cplMIfo2rulK/2eoREdpSK1vjuP/nYmwiD1jIlWAKpQjCw8iDDFMj30eHShI9Ovf+QM/ta/9234oQ99C1770OlgwEo7G8/a+gaWllewvLKGra2Cydg34vjiti0nGo1GeOTMCXz9Gx/Dnvk5vHjpOm4tLpsxdYsIrJPSBwX9rIh7d3kFf/bsi9jc2sIbHj2D+bnZZqTIcvHneDzGyaMHsbq+ji88cx6ra+s07Ix89Z9WxNFqbJSA20ArfaAUyCe2DgpFCJihZbU+20Y2bOLplcoge9/1YTrl7KFZiu49sAN5wpSdWZsbhTpgzhDcwNsZgNfJ93JG1cqwBrIuvTe/axZ/5RvejO//wHvwDW96DcZj3/jiiefa+gaeu3gFT527iOcuXsFLV2/g5p0lrK6vo2wVTCZj7J3fhRNHDuB1D5/G217/KM6eONx0qtal9xaX7uGjn3oS//1PfwRfeeElbG01ji6wXKQXB0q/eWj/An7wg+/Df/Z9H8DMZNzjY2gjj/l67sJl/J1/8vP46Cef9JQu9NtaJOEUBcjGYbOAEElq9CuAsIBiHXkDjSCmGonGF/gB4goU2d19yjDpjLjUkAR/BqAnaxTcwSoyn49V8CDElIeYM8H7/TgRroOe0uywRzim3dU5fmQ//sa/+z78tW95J04dPYTRKKJmKQVfPncRv/WJz+H3P/sULl65gTtL97C4vIJ7K6vY2NwKChYRzM/NYP/e3Thx5CDe/ZbX4nu/7Rvw6ledMnbz+j+XAcC+vbvx7e9+K/btmcff/kc/hYuXb9DgkLwWqt0INHr62Auu317ET/zSR/HQA8fwofe/c7DfIScBgAdPHcWHv/09+LNnL+D8pWuuR+WKkY9Qmz/8e7UpHj7L+CSIpjJA55jqLNq3RhDEVE/nrTDeiqeYIRLdvww+qQ4cgwinAaKzSCkyordEHATevj77Qet3ITQISqbvaixaPh6N8IZHTuO//I/+Kt7zta/H3Iw/D7WxuYVbi0v4vT/9Ev63f/X7+PzTL+Du8gpW1zfMQLbLu0Eyzc5McOb4Yfwn3/Mt+J73v2PwiHc3HtEIN7e28Nt/9AV879/9J1hbX6/jMiCk8mAIFysUAU4fO4Rf+Ad/G088/uC2c4fWZ6eXTfwX/+PP4Wd+7eNY29iMOg1RQNmrWYOBXFcqPQHiOSU7hZGE7D0SUO/nyTk48hi9hORQgL9/GWwOYcXqupa7SuycvFeXZbsJc2RSEjM0JAE5OGJp1CxUbnTEnpOq9+MhsI5lH+Ddu2bxgfe8Ff/07/x1vOW1D2My7k6grq6t49kXL+MXfvMP8KM//vP4F7/yuzh38QqWV9a6J9BQHMFMc9oHo7Ub9+bWFm7eXsLvfvqLWFlbxxOPP4g9837sO0/YGaFHoxEeOX0cm1ub3SaZOQ8hSAA1RULiSXVeCpbureL5l6/im77uDdi9a645z8m/ed4zrvz8qz/4LG4tLpsOGEwLj7fEHWAR7oO92eeV5jBSgTfJECIlCCDMJ6TSgNkkPyUH4cUIvCIZfJVJFH39OIHlqVVZ3bJsDLeBYUY2gYW53sTQ0D9utaty8nqzIYSoYApHLKAP6qmjB/G93/aN+Ps//O/jyMF9ALq5wVdeeAkf+b1P47/+iV/EL/32p3D91iKFKphCu76IuD1qV+tayIavdADYKgV/+qXnMDs7wdvf+BjGo1ETpbP+AOCxsyfx2aeexwsvX4sRwRyfQ25d7zPU8M8tFNy6s4y9e3bhra99uDf5z6thmZdSCg4fWMDl67fxqSefqRYe01MIz3dSCFPNkJGXSoMNO+g6yWDpr9ldxAZzCrbwBB5qL8bnfcoQIoS/EsVRnNE9e5p1KpJWikrfeBGI1FSJFaS8SRVXqJwhKAumX7v+X/vQA/hbf+3b8B9/9/sNpV++dgu/8rt/gh//hd/Az/76x3Hp+q3EDynUcj6JitTbKme9L2mkCgq+8Mx5vPHRB/HomROmpyGnUAPdNTeD3bvm8PHPfBkrK2vQKG1zMhFyClqWzqNTBCtr67i3soY3v+YhHD+8f9t+W1GrlIIHjh/G//HRT2B1dc3pk65rQk56IzbC6xXdjmpHrnMbyr4MsT+OGrwiFfkyPrRqKLw/GcazZ574MdeXe6kwKbZBNpYwyJyTspB6mweRBiN0EB0kC8cPAZlDVdqj8Qhve/2j+JH/4Dvxgfe8FXt378LG5ib+4HNfwT/+uV/Hz/767+NLz13A5qZuiFlCGs9MBcCIkSPPw+y5c/1eeVtb38DVW3fw/nd8DfbM72ou6ea5xWg0wt7du/Dsi5fwlRdeMn1pNOhFiGTk2bZuLS7jxJH9ePNrHsIM7WSHyD4QtUQEC7vn8fmnX8BTz79kwBdiAUf9CgQRkf2TT0KDnTibCMtA/YVnJMQNuAjZn84j2LeYzn3KMJ4788SPcZixNWFowqMUnFQ3Ln4swxzIBhru0RVRCw8Gh8LAGFmc5SN+3x0oDuZ4PMa73vQa/L2/+SG884lXY37XHNbWN/Dj//tv4B/99K/ij77w51hc7p4BiMck9DPvk+jg+X3jMa83G4YQPQB3l1fwyOkTeP0jZzB0ZYPcM78LtxaX8AefewrrG5vdWFg/bkThbA/xyyt2axsbEABve90jOHpwXz9SN/jgaDESwWQyxq987NM2HgE0tNBSOG0v4CgQeXV9mS63kUEIBHryAnGCrPXIwGHzWhqnHWQYuYeQIWpHpf4oXSN7UxocnS2lqgauxiHKCssQwlgEiELG5AqSVEvZdF5FBO/92tfjn/7of4i3vu5hzEzGOHfxCv76f/MT+B/+5a/i2QuX62QZxm9mIEwCTcleVmwUOTfWsoRKVV83F5fw23/8JDY2Nl1PZHit/H1mMsYTjz+I17zqFIoNRN+QQ5rGMoiOV1f2J196Fl+sm3YAkFe7hvjQ8jc+9iBe//Dp2Fd1SN8DIH0ofYoC5iQ8lCzSdjIYb9Q3G5ECRTU8yXRzJLoPGbrdKeqjgDbkROz1KzaprQwURnBzktpex5Jva1gtyowOkHlfbeOfKrwvgypqdD92zc3gO979Vvzc3/9hPHjyKO6trOEjH/s0PvQj/xi/+rFPY/neGsmWFElXVE5kqUKVjkYiRUZAI1FEsLm5hecuXMFzFy83c3aWiw3zsbMn8dqHTlekSvw0ZXAdaYqlBrC0vILf/8xTuHnnblhezZty/Ju/H9q3B9/wltdAB9PtncBCUdB4SuNZ1eSpcd/gt5PB9evgU8wAsy6inkr45/5kmACIa7jEiwrjWxGFwlREb8tRMwFKR3wZTMOgp02dQxMi2hvVuF3XbynAvj3z+K73fh3+qx/8IObnZnHlxm38/G/8If6X/+u3cfHqDeN9POqOJkzG3eOak/EY4/GoLsN2uXu33NgtgWo/o9Goe/HtwFXQPSnH8uvjoVtbW9jcKhiPRrh8/TYeO3sy1At0Urp2YGEPHjlzArvn57B0T8866QA0+BHSjemumFF96ovP4Pqtuzi8f6Fp+EPzChHB3vldePOrH8LMZIL1jQ0aLR8HUSQ2oIJH99bR9/BiJq2/vQyhndlFcWMPqRrJYt1XMJOyowyTYny62ZX6r62oaDoEn0DGJyFooAw0+4jo3qoi6e6yKyWTnZ1MsGtuBrvmZrF71yzm52axZ34O73zi1fjBD34zjh3ch43NLZx76Squ3LyNb3r7GzA7M8FkPMbszAQzkzFmZ2YwOzPB7GSM2dlJfVPeDEYjsTdkTMYjTCZjzTgxmYx7b9Hja6tOnu33VsH65ga2tgo2N7ewvrGJPfNzOHPiSGiXI0SeXAPAQ6eO4uC+vVhaXonoVyNj0+BCPVfgsy9ewsUrN/DY2ZO2Q5+voZO94/HIHmd97uIVQ0YDsVb/wSR4nlj/oWHubHlnGQBa+HCD4Y5C8HR6zKz2v70Mky73klCpJGq9yAdaK2YlBFmkn03UupPxCAt75nFg7x7s2zuP/Xt3Y2FP97lvzzz27ZnH3t27sGd+zl73ODc7g12z7hgPnjyKIwcW0G1uCV7zqlN4/MPfgcl4hJnJGOPxuHmmJ//mlZ+h3duh7zu1B/pG3/qdaZ062r3QLM5X4AgYUBgIA6RXrbu+voEnnzmPb3jzazAj48DXTvoQERw5sICHTx/HcxevOGhrBlnISFPKqRhnLKUjDMb2fciAQk5F9VwGW96h/rq2eYVrJxnCu125P95BbPHrIlGgK4CMBAu7d+HowX04dmgfjh06gOOH9uHoof04dnAfjhxYwMKe+e6dprMzmJvp3ms6OzOpr3Lsvs/MjDEzHlsas90xivFohAMLezB0DR20Yzr3m1e3aA0ZfMv4duJHRHDk4D7bQ2nyjLih6WkDaEgU5ASfe/p5bGxuYnam9yrfkCJlOUUEBxb24Mzxw1o5ZiqBExobA0vSQwDNjsmYZWwvg4T9IOWZ+xX2t65cv+f5xjYymIaMUK0UcjGdfUvX7cxkjGOH9uPsySM4c/wwzhw/3IXWE0dw/PB+7J3fFXL1yXhk38fjLjffbhmwtYmVr53u57o7bYy9EuTfbud5J4dp8Z7bHNi7G7tmZ2LIFgdTJwRHYwBsX/4cQcFTz18M850hPlrLrwcW9uDsySOYjEfY2ip2HCd1FxjrltSLPwNjgsL3j1KavJMMMWPRJf8IC6kTZoj4gftVrirARFOODqkdoXfNzuDgwh686oGjeNWp43jo1FGcPXkED548ipNHDmB2ZrJjemDKafweyltNrFSWDa6F6kOhP/++n4gx9LvVT67XcpydUjFuNzc7g8lkHEMz3JACbUF6ETN8wGvRs+cvY70eWmxFhBa46L3JeITv//b34G2vfwTnLl7F8y9dxbMXLuH8pWu4dWepeyv5+gbW1jewsraONe2ndq5THmXGncF5vR8ZisntfuTpkf8IizrUj0WpMC+gtL/Wn7z3a1+PwwcWcPrYITxw7BBOHz+M08cP48yJwzi0b29zgIcMaicDZlpDAzB0DQ3ekLFu53D3K8PQvfuJYENXlqNlmDOTMcZSJ/T1nJUvcCQ+C1kD2Dbc2lbW1nDt1iIOH1gIfOwEQnodObgP7z74Onzjm11nW6Xg9t1lXLxyAy9euo4XL1/H8xev4MKV67h5ZwmLy/ewuLSCxaV7uL20jJXV9ZiGsCnehwy9NKtQWp9DS/3p8QT0ehvNl2DpE+VWmPzLv/dD3RsmtjFgWPv2IO5kfFw+ZEhDqy9D9bcb0KE5wU5OkXloyTfE63ZX5qulKy7b2NzqTr3aDDClSiHWx5vOSuT38o3bvec1WjLsFN31Govg0L69OLRvL97wyBmru7VVcGtxCZeu38Kla7fw8rWb3buqbtzGtZuLuHbrDq7dWsSVG3dwa3HJeb0PGcJNjTYmg6dDfTpULgQuWk4OMhlyhmzA2Ui3SxWyoltovNPKzv2kTPy7xfeQwfHvITocaTLPuT7T2e7aLr1kvtbWN7rddYsC6AGqcOznJVjli8cBwG0zvj4/2+k51891sq7HY8HhAws4tH+vHVsppWB1bR3Xb9/F9VuLuH57EVdvLnbOcuk6Xrx8DRcud1Hm9t17KOk9UaYCRf0QZDr5exHT6qR5Rj6EahGo+02T6riTOZT7Dxla/p7bDA3CTpEgXztFnJ2Q/H6ixJCxb5d3D0XS3H/upyX30soq1jf0xWce6v1JM4I10wenVH2ad5b8LFfms+Xo243vTo6Uo7RINy964NghnDp60O5tbG7hztIy7ty91z2huHQPL1+7iaeefwlPnbuIr7zwEs6/fA0ra+uqxdq2ZjthbtAV6n7FUHbmtl9Ijx59zCGyIQylLa9kPrFT6tNCmFZakem26AwNTL7WNzaxurqOLRSs1ZcQbxVgeWWVHs6J1+bmFpZXVu0FZXyNRLB71xzinpdgftcsxqPuZQRzsxOMR6NtUVd5L6VLOe6trvOow/JnLrMg4cuc/gwwrK6ge0IwZwCtyf0QKA6loUPtW/1wO5FuM/Tw/oWwi765tYWVtXWsrq5jZW0dtxeX8PT5S3jymRfwmS8/h89+5XncvH3X9VGq3CSrRQX2HNJHbVGZqf/UexNmcMgpwlDvEAVy9FCF6Juvu2MNW9jcLPZ9a6vQvYLNzU0srazi7vIKFpdXcHf5Hu4ur2Dp3hqWV1Zwt74BY3llFYtLK1heXcPK6hpW19a7z/UN3Ftdw8raOlZWut8ra+sum2UXldeMIr3ftLTBk7lUv0mP2s7vmsVkNMbs7BhzM91G4/zcbPcsxPwc5ma6TcfFpXv2x05aaI8ez5w4138KgkHkB4XuN7L+Rept157LWvUm4zH2zncvcgCAB44dwuseOYPveu/bAHSAdv7SVXzmy+fwmafO4bNPncOFyzewvLJqY94d8c/gwU6Zogrtm0xaqZFeGUXyvdW1dayub/jn6jpW17ult7X1DaxtbGJtfR13l1dwa3EZt+8u487dZQuPd5bv4e6SGz1/bm2RAMq45s4BHXv6jsbYMW88c4g1JwbiI4hu4XD06crtfUC1mr331vLY6E0FWr/g3spaJ8Ny7MYndeg7F8d/Bh8ba9YNqQwsn+DQ/r1h7IZSvu0i8P2mta1rp1Rzp371+8xkjEdOn8DDDxzHd3/zOwAAl67dwpPPvIAvPHMeXzp3ERcuX8eNO3dx4/Zd3LyzhI3NzToOPMaw77bJzCkTMwDA0Hfp3gru3lvB0vIqFu+tVKRexfK9FdxZ6nK/29XIby8u1+W2zqiXlleweG8Fm5tbPmBsc8aYl9mkyX5zxAG6P3hIdbINBroRxYUJ50STjVnrJf+wolq31MHqoXX4Y45RyDDuLd4tndWIFKMTy6CH7F1ZtW9dfyE8OFLTEga2oblgjvhL91bx9PmXsbK6hoXd81jYM4+F3buwZ/cuzG2zHzVEL/c31G4oTcsynDhyACeOHMD73/EENje3cPXWHTz74mU88+LLePr5l3H+Ujdpv3DlBq7fWrTXiZpy1OhKweSzT53D9epJN+/cxc3FJdxedBS/W52gS1/umUOsrK13qwFZmIH0w+zNxq4OaEn12AgEvmFDuZ6kNi1lRi0C8SQtaqiMWB6QGoD9DTuzs2TN4s3cv1iQyhchUFz37vjKewymAlCfLRlQ+uCgOk3R7uihfT3D3W7Sz2WXrt/C//x/fhRfevYCFupZM3WKfXt248C+PTi4sAeH9u/FwYU9OLCwBwf3dZ+75+fCqeGhifzQ2LXmotvJMB6PcOLwARw/tB/vetOrsbm5hSs3buPFuor1wstX8ecvXsKXn7uIZy9c7pZ+TX+CyQ//d//C/tLNvfqp+TYPtCNkh0T6+J7eMsbyoLKP5IHrlZkaYsoAOOrGao6CLW2qEYUUq58aSeYF0ab8KIsbrw0OSq0X4d6QjOmaw0lMA82xHFQiiwMymLMR6706wMzMGPvTXzxqrSYNIfTS8gqev3gVTz79gvdUnXMyHmHXXHcKeb6eRub/9y/sxqmjB3HqyEGcOHIAJ+3zQO8PUjJvOaLcT5rXkmE8HlkE+bo3PIq19Q3cvHMXV27cweUbt/HM+ZdtLvLshcuYPPn0+QoqES+FJhqsbQ/UA2icr6YhDhhwrd+etLJzUH1Btt50T9Rja5nE+4AjLzt+M5WRHhk6t+nshkFRRJfEm2rX+ZZ+h7FtUwaNSBkwvO6pIwftDeHefXsPpHUtr3ZAaWouzuL6xiY2Nldwd2nF+SHHH4lgRg9wTsbd90l3LP/owX148NRRnD1+GKdPHMHZekLiwZNH7WhQyzH+IjJo+cxkjOOHD+DYof14A87gG978GnzP+9+BpXuruHTtFiaWtRRf1iuaUpQSUmyzaRo3ixfxjQAAIABJREFU71+Nygv9XU3dZy9MQvrGT8yHteLmKwp3+E5lsW8dWDVSlbm7achPRmVSGkk3ZJ/z9j02/LkAVh3pUtMj1UXvD8WYWFkGvYEAGGYcteDxV53CZNx/tqO1qtjSv6bJlhGwzhKPqGOKKsNWKd0S6upaL+159sJl/NEXnrG6CgqTyRhnTxzBI6eP49EzJ/Dw6eN49MxxPHjyKHbNzWCmOpR+smxDMgztr8zNTDA3sxeH9y/gzPHDvA/hw6UpgaOYvu5ePCcWGuyA0LTioYxIiio0mPkYeXA2TT9UYSW+/a0fDkwYqstpkW9u6byaJ54aJ01hltZ4WtRLZdBfXRKbF7B+SvdG9KpPm2/xokFI/2pqWus3ZTD+NToUVyPx/+jZE/aOqE6N2+8xuRq7OjcXl2xjzzfElUYfkX2cq/6IH6kIIDRG2NLHhQXAFja3NvH0Cy/hmfMvB3DTP3559sSR7v962vqBY4ewsHsX9u7unqNZ2L3L5i7ZCXu8JmeZqFYLGaYasw1HUlJPeRzdG5Mlcy6ztr4K2dFyHX43kRmxstukh16EsJSHw1pehrNopmmImGN2/HF/Ka3hUFHUiI35Ss9cpt9ceTbStX6cwPVkCBFWn39nLy8Fr37wFMbj+Cqa7XLzXH7j9l3cvrvkPChYBVBh4ycZlB8FsBBd718GQLC+sYnnLlzBuQuXHagAzM7O4NSRg3jgeHc49czxwzh19CCOHNiHowcXcGj/Ag7v34uD+/ZgZuILq61oUh8hFe8X1WvTpI/MJCC8DyAqAlBZVjIQF0oyUhWvFCavEIQcnD8ZsVqeoQZV+cvOwOgfUyyE9NBQO0dEUq5oH50lxzQP6PUddAJSNB3ayc+79+ZiQn1TlFaNz++aw+MPntw2rWhdOi4ra+u4dvMOVtc2+ilzYMdcnXQKFNPBMA7tJEPIOtCvs7a+gedfvornX75qdMajMQ7u24Pjhw/4w2oH9+P4kf04deQQTh/vjpEcP3QAc7MTk3li3kwdSOjUPwoLY4ZIvGsYNAOXlB5FZfqKSuxLHdTuFQRn6oFrdlCl0vqbTyxrcEgtQ7U976WHotUwLZ6K85nCSCMKKaBWtA7zGO3H+Q7LvT0ZAjsIY1kN6aEHjuHYwf1RL9I/umGt0qT17vIKrty8XfvhQdcP5c15YmDK0QJZl1GlTRkskS1qh93SewAp00X3ZWNzE9dudidrVW+j0Qi75+ewf+9uHFjYg/17d+PIgQWcPXkEj545gUdPH69HN2wuQGGPeLI0kW+kCvZ8h6ZalvoV30vQ6lVAdbyewRUKoyyvAi2ykXaV2oZbP4lWnuOE+QKK/ZGOkMax7HWAt412zAN8sAvUAIs7otJj5wwRYhsZQiqm95yH1z18Gvv2ztvYMK/6PadSnFLdubuMl6/dAlmJzeNEFBTY6RNiAvwn/XrgYExvI4MEA9CU3pSCuACCIGv9AaBgq2xhcanbU7tw5UaVoXs4TpeM4zPV2RmQjc64rUZCp1YDotZ0B2nFhgzaBpel0ElWcoYeyjIyVT7CODDZzL6RJDQ2unEeI6Ts3nPMmuYY+qV7WqQ71tQHavRsmga16e3FJBkUrNwx1WDqmIjgTa9+VXjeRctb3/U3G+O124v1XJXza9mgHaWmsbRI4M7cS69NgJ1lcAQA+I9RMr2wqNGjp/XiONgq9VaXFq6sreNmWcKIw154k0bgGjUXFEsVAvRph6XUkJiE5xDISjOBnI4oP6VUbWkOqf3U8nqv1N/FQlm9Vw0qDgClAyA0Np7Y+Ao8/LszGB/VEGIGlp2mgP4IQmBD38xnLBYVraYIhbQ/IEP3J6cQh8LsouDE4f143cOneyd0+eLUKciH7tU6V2/ewYXL16uhueydVorx7gAAu6O+oiXGG/3NkZ1kIHRKWy26vFtl6NVzeyk6DvchQ91VVxOnQWclATaw+pC4MmNOot8buaLPEYQEd8P1e0KoLoGegTD3UcO8fap35TlLQq+Od17ZoI+MdMYLyUQ278unhFSEdIaeJqeSc7nMF2s7IT2UbWSIcyR40K2g8vpHzuDsiSPB6PkzO0JO91bX1vDn5y9heWUt8FwbOI6Tgau+LA1Vsya9iYKnYEcZHAi7fhyvGHw8TbdxKWruyrfclwyjbgGDI4GPmr2WEoCuiXsa43Qtn/bKwTGYuKK2GnKeKJozEt8qtAeGiLqwNmmtWX8T6quCmNXCfLJsJX3PUQIl0kcXS7r77DgUzYo6COuF+lGnKj6UQzJwxDBIq2M/Ho3w+kfO4IFjB3tzB54zdF1K7zcA3L23iiefOe86rvKajYS3DSONmY5H3jOpsguB6oAMzIuNS0nlqjLWN4GqgeJ9yjBSm+zstASCYvHHOQlKC06hCqgEegPcFzbMNANbEo3EtFWIL1eQKrK1ps65KAGYGwlo0w1sfL3OrUOPqr5ZFmTIjlkVapNpLSM8UHWYM9HNIRmCxsRrlFJw7NB+vPGxs9i9a8544bEbWnplvheX7+GzT51ToaCbs6IvJO4hI+tL+wqwHe8FC+7LwEBFOG1dsBshfDd0DWB/PzKMNH2IhsaRwRGkQ6fIhpNyoQhM/R55LTNoTQWInVJZL73Sf4oZd3/+k5XkCMhRSRIPbiDMs94X+BvJGaEdnXQ+FBYjWBbhMSKAqOXRzolGSwYCKuekq/PomeN486tfZfc4Slj9bdKnrVJw7sIVPP/yVWjEEusXidHsFGbZSYZk0UpvQAZWgdC/+pXLSt/oEhjfnwwj3fSye+YAyl004LhrG3M65UztpKdwZYQHgCa+xYRoISz7ixpDXU9H6Rl7aJ+912RTfTkDOvkrlrbQmJXSTcqonoV+7iOMuVhbcyiWQ+tlmxr6TTJYpAECIMzNTPDE4w/ikdPHuxoS9x2Gdqf52trcwv/zx1+sf0qg81Y7cSDxyEaMcmzcpV0HBXa0fkAGjRLBFgqXw8a+k5H74zZSJ9L3J8Oo71geHYrob2ebJzMhVqTQUNKIsjN2dkSQKkQ3h/JqcGZnGkprOxFaopN68KJQtAiwS3k8Iz9ttNhGm8lEBwy1L6nRlK0z0dNVJCsLwOK89TKkHDW3kcEnri5DQcGBfXvwxOOvsjebuyo8wuT9hlxvZX0dv/XJz9NUJxp3S5zed5FoBZwCivPQkkGjhPPmNhjmPgE8HRQ1awDwimRovA9ald8NqJhnwTw2CFzHXcObejCnWb77KrVuRHNLXSoRS8tq9GDlQLIh8P/Urw52I5e39EXbG7k+X4Y2lfcQDXj+o11pWsS5USGabCKFNuGgEV5hhhxqQAaPqDwsgl2zMzha/9jk0NWaO7CTfOXcS/jzF18OVuOGmHRkTgYDJaXpsrFTe9mQDA2O3cisM71D9etYFbWzBEY7yWB/MIUn1DpGPJnjXNcGw8KPh0pbPXIOXEadsErrnt9XRDD5ya5cERLpsQ6rI/TSAmOthL6lkHzGlxhdtmveuOtM1vkUU35yRFdjdCKw/ORo2k/LMEiGgMYqcyXFfzUor8pxCtU8RiGCj/zen0Q/DIMARCOOiY+rUdwUeqkI7VU0ZGhdeQUxsGagLL3br0SGkZWXdAISDrxxvZfpO1KHkEsiY6B+MAAzbPZ0CQ5QkhCc92uY8s0Zdkrqk1Mc66c4X3n+QXOVbqC8vKA6EvHgrGj/VYNFzSTqI8ggAgjJEAx5exks1aqGvryyiguXrweDbx3VyJc6yp2le/joJ58kXfAYlF676Nhtc+63kmBNWYZ+OzpuYv+ShTVwKGQa9ynDKDqdo5c1LLRuS/870LJxpb7UUFoCcghlCNbONVJomiWRv4jilIsTHVeEuG2bWG5YXa3YOGaHHj2JYp0fOw+O6dkRAAnL0nVWZOlF1bOlQsXlM3p9GfhytQhuLS7js1953l883EgZWt9VJ3/4uadw8coNQ3WXAT5WKkO+xO+GYjLY3j5SQwaOOmHH2r51+jENWpVC9eQVy2DPf/v5cw11aoidUYqktImEN2nqvSAYTeRcWFQDSKMr8HydL4l1TAP0PcwrOBJWxzOHIhkrzHtwqgJ6qKdIo/dMhg7hnFXqm+ZMHRkfUO1HFxCcx1q3+KKFB7m2DNpvTs83NjfxR194Bn/wuafQsj1OmfLkenF5BT/9qx/r/mqr+jrLZ18jwvPVO8JiHaso+V5fBgYDyVEnoHzUFTuT9fkKZBgZmqoxJvTUfwutAESiXtUnwVSFo0PKAdWDC71tTm1fJ6i8fEaEGtGifrYmxMEoCGaF6CbZObQ627QCp/WtTuQvKj/zpewK0VKemE7sqykDUopRZXjq3EX81Ec+hqfPv2TzCb56x2oALC7dwz/7xd/CJ598uvtbEAQ6wbEkF3AGEE/SBq4TYDGWt2Swytl/xP4Z6EPi71cgw3ju7BM/1t2n80AV+UQiU+YenNL0+CRm4IOsyBqX2pQiRQXhk6USaRppUlKOEgES4pKpt1UZ6F79HlbG7N1KXl+q4/vEnzYFqV4XfMT4cLlMUTZgvCKl49T5Ox+xaMhg6gjZOHT179zFy7h+6y5OHD6AE4cPhEcqQeOxtVXw4uXr+Jlf+zh+6iO/i6s3F+l+jEw2NpR26DKzL4EXlMaL29xRLOjtKEOI9hGnK510ZF0i5r9SGcazZ77mx/pr1dy3H+y29WEVrpTGA/GBnY6eEfBjEkrRjJEQ0pboLO/mdiQQnEzPadjgA8oQErvlwVMdgwSiVT+qLIEXNQIy1vhXacjZrJ4DgsoaJsCge8RRTwaI69SONzt4bdVI8eVzF7C4dA+j0cj+Xp+I4O69FTx74TI++qnP43/95d/BL370E7h6azH0SaLqiBILOn7phLMIgVwETVUJO8p2MnTqKaCz5M6bDjnpN/wRxb+ADLLwrg97QsBGWb0cTKzhgUrYdwzj3TAlKOyd3ie5I8AGC/+Zy7O9Oy1xmNX6itq9VAvu1MWNLm8Y2Z+BSnriyNHRQd0EUjrMIzOK/n0g9k31WGCWwV72RlWHVpD2zM/h8bMncfLoQezdvQsjEaysruPyjdt49sIlXLlxp9emf20jA3xsG2xvQ/H+ZeiXF4sSodP/DzLI3nd+uKiXSB1U1DdGlAB12hrJ4xInNPi8fNsa5DD5MsPYRjI2Hq5nhtTx7nU9tjUjQsdE/MlDqjQkaa034jB0i/WobYg4mR929pL6ENdLkkEdQuc7OSVxMoXK+3W0Jt/PV8xWdrK+lNtoi+2caEpkGFlupWlHcYOgPUc73h2ioKKh/rQJTFemO5F9VIbdDzwJyFWJtADdiweKl1taBfhEzstMHvZeyzOJX7oHDcPMl0j8ZJGL0mT5WVYSoNemhE/7rsZRx8L7a8hQYH7CV4g6SrPq24/hlNAmIC031fo5khePlP25qZ9gsPZ+M2DAtMkw8omvHpKDDXLRmrpJVo2Ppedfzc0ejgAmfcmVTPpS0spwANtOk72d10Y603O0nObAfMD5FpWpVLm9n6T6rp7ZqCSbTyPCY2RdOWgoRZ9DSKg7JIMBSolyMbfS6y8QNB5baYeBQ3b02rxPsy9fhPmke2DqZBjxLrReBsRkKLb2zl6llWu4S1YDMy77qZBejUDblu6en4Hi5Vak3JEmm9oWzpMhSCmk26wMktl4pwHIiK4R0groJvGpfYRJWzXkjAHB2EkOu6cyWJ0hGTTi1YhjAKfNIkgVe0CJ+2s4oMneL7dzVsKVUkMCwG54lS9ptJkeGUZsEJwkOappaNF2FHREU4xangcZtggXmcroUBt4OJS+MwbQJXr9oARdzXHspTZkfeG4MDHnswodPKGoRo4Z2vltllezMgMP/nSJ4Gd6lQ5HnWEZQscqe/Rm78VSXpalYZyBZAk+b+lLzzG5OUeHsIAe09Te9dWXYeRnxfkWD5yGiwpQtLKRiTVkIwGDVPETMA/vpV0kt+bO2UEs3DZ5qM5BYbYAPqGvCgtTBNa19dWgX2K7JArUyTsHJxoc4fS3tHZ+yaMaMiRm0DcMbePR0wWjZrnPHg2B60iavbeb+zh7BNeigcjyVZZhZA+sFH3YBoij7J5qUSI7bzBOQuA8H9D7QgNdKqImA++jKDlWsX+cRc35M09UZkvDAHTDplRjj7vBjGaxr4D0pCc+qOe1SVEqbuCTz4glkChVfyZbX4augA2E+eFrCJGBlkeHVJNoOLj7KYPW5e3FPvI5OeHUaIpkGHnK45MSe7WistUwlmFeXSjJqFeYeYpKkuvAkbkVEUH3+Xcjj7TDd+A0TPpNaorCq1D+qXGTdqR77Hjfvoxod8mQpXv3VJXR9J9407+/YWnZgAz9yUk9n9TjcOjqt2+BMHcZVvu4ZYoCnnXwuDjie/n0yDDqA3E9xcnHFhCF5By+F/okO2U/n4uM0m8yRvfkUgMJG6pGssw59VfpSeXRAbh4XU4srZl7oL7KxCrxKww5eBAa5eClSO+beCpWmjAnvgy9tpEhCE6A1Vt14+jDbVmJQY4h2soPDRIvRgyUc8rUzJSmSIZRH+z0aAZ15GEkZkvFQ2F4loIdJYeuxHDmW5m3rEpXn8jTSpH4FpcqVLcCRsqx5ckqAuX84Z2p6njGAB/LVnqUd3LkEpATikVXIceMO9qdcxdqVitFvgzBhmXwts5PSaPfpSY0jmGyxGQUcDxy+x9q6WTyY+muBj8bSYsCzqzrhXL4/sR6emQYmYOQcbgxeJ+F7nX0S2SG0qSAZBziszNoWLRQSwZKUOu5XnRKdx4xJdxXmK20+6dMnV+jwxGnR7w4+oQFCHJKks9JSjLqjo+SdToIpwj6ccJVV4F4HqcGzYygzcsxW6uKeGkvPa5tnKw7gW7YlimUYWQHs2gC2f0U9+aS7EGSddSfnkrRKc2wkqRtiyPngMfb7jN5dukZJykqfzJaqYeR43j+LlE7pCyWU11TyztkUf4k6YT4VDpCO8wZxer9cO4/TnDaMqSXSLcdKJup81hCUTYV7TLS7J89S22SVca6hh4QpKM2UyLDyCaAhGoWtdWrq12bQwf6bipuk25kVp3bNKJFXCHKB9zo1CyovvZTFRnStJQLFnpE1pd2OsH07SIWqUhxhctKFD7jYWG+VGm1rPmcQP5kUGmBYJaBnN9eJbrttSOEwgBAuwkAwydw+238+1A/UlNaspYpk2Hkh+L8hqgRBEsmYyCn6qVHhraApjO9E7mZDzVgRszIpwkTbrBuOWRzNeMnnpnnpT6xRhLaSFVeId2oE0qgDQpWZPQilrPynxf2JUcKa9SnpU4ZNLIM9V7J/ISmTMRXu3rPtKkzcmBlfhpPrTUW1Y1YbyndWGg4/BTJMPLB6AtnL/yundFH/eFOwKsoXWrug2pr6dxLBhKOFDm8VAYcgVUa1l5sZ4oxhvt89jqngGPyAQYYPhBRJ+Gqssq2ilM3pHmDReS4gBDbJhn0HqWhyp8al+MJuWvpq98E1ZdahzRDAv+2QdpUAFwGSXQk6WMKZRjp5JiXVwv8vKt2K/U/fdS01MGueKhD2+vb1u7tVjXk4J1uhsW15cZS21jgaOSEdLPjtyrY5kDk9IUjmTmR9+yrSTFSeSxhmYLXeuWKhj6YfVm7moYgDQOjgW3JoHpJ9UX7MwNk+FWLK15U25q5FWpnLQaiQSvnb1atvAY1TZ8Mo0Lhmu+pA9dxJaE0lVD6tOWkS4QmLLsMG664ExYVg+rzfEJpVdpstqGNKcLr2nKfVa/OXVxn1jfDjdCufTEx3cs5pbPoxQ5Z6VOaVFjvjBxAGqZ+2aAMpIP4PfEY6jAd5bPEtnQ7PNuMHZ43UBwhWqEmp8VgutMjg0WIGF7IK9A9UdYZCB/m00+NHYnxEn92/JPVUUrTY01XXRKtojQkF6KBVKLg4yRKHqwSx8eBpy4jFopwDf3QIMRxrjOErCceRIoUEgioCsQdcxsZ+srrX1E1HImpr9C5ddQzSl15LLbMLNZHWrk2WmysDgzTKcNI/+Qup0w6kewMxjfqWnwra4yiKm+Qga2D6hjzbNQhIhWrFx80UufSB4eIweI0CURq18X7yqgf9eMRxin0v/NtUn4+PCbWJ0dJoZsS6Vk72UaGoCzXRY7oTJPz8HzFAauglG7yCqAxMXRUolMwPxseMMHITo8MI5vsMnBXBpSvYuV0GK3S7wZJHOXcfvu6oY6CcZtxZqOQpAmmp07AkYQjG9NmRxOqJ+keOUtuG8INaZ1lCJEqy0eOkHQReSR+cvssQy+0UIqoPGT1bYfG2yI1Oy+SQQ01vI/Op0yGkWJZv/9quGZjxFhGf/7FyMWD3HuegNux0NnbqNRWsTrjCs8dIJXB67mjMZ/Jbf11GgiC6rJrP1eMUSkpe7i/ThqnqW29fS8dHpLBFNO/WnPdXv/tW7X9tgR27OM+mnsfUyTDyHKtXkbgnuqhWqB/UcgdO4U3wF5UYHMPEQtzQ0YeURscluBHLPiVNAiRgXcTzJmFf+lddRzqmxkr4C2K+qFPfUGzgEQXJkNRGYJeOCrRfaNSXJdofbZl4J+hot7OixP5fhaiAPpXfuIDPdSwRSxfZaDcbqd7UyTDyGy6xNwtrrnX/9TwhDNkQi/O7UTHPjtCsf6sNqFlYcfQlIjyQDu3xDKaE6V0g/rxA2POo5FgpUt9eo11ojYYDLfYBqbzofG2epVFLD7Z2v3T26dQApbfOgAMyWBOJ6y3TgZzzPqdj9X4+LWBkN+20t9ENCEgZAeFv4S5l/atPbolCwPHlMgwKsoYI3fp0LeYkVUjpLxfghYQDCdczC8bgCElQruwEgX+SuWFfppOVdHqSPpViAePKODfgEU+fe5bakTU5xFC+0pc9zNURYVDS0CvtMMQutd1LBu9yqIbzaAMKndWeon9BTMIE1KKioUYsy7UuTMltgPlk7CWh88c3HvMupgmGUZ+uyJxPezn3ldXmUKaZDxUBdCsXbysJwl5Ru+YRagXVKYe2peJwkQ8KdtwVCYn+koT7Y6MMfNrRdnT4Ue9A9s+QMZXdv4knySerYwHtSGDB2d3mn5dQmNKN4kSySD1e0VPbpuNtuHh0rvHqzmpPYHCNMlgDwj5J0UGSlWK9B6D91QmpFDJc5MCwmSyxHuxjMOnCuk04+50oseRzOYR3taOzRty1MhgPBYbmJzvhoUndQApoW04tsL8soxGW0zXxlKhz21kMI9VGYTq9v3X9BjvV4sUP30A8Pur3LRMa73VNuILfKuPLv5cQyyfFhlGvPrJ3sfnZYxudtzgbKkD4QpKx+nzA0XZd1TwwDS/GS/xF5mk7/l+YtvzTD3OrTx2zm/pSuWHWGPBPatUvjj9IX55/AokGjojo0YmH/tBGQIjVq30avicqCGDkabTvazf1C/z3Z8gS39MVTai1V4B+urLMLIxyGHdEnTUQXdDgTLFzpRzn9IoS6L3lki9IUkJNxJNnZJGQtwytovfKxF19DxVNGydJHuIVbRnRYfgxtHABYFOyp2Os6X0uG+xl8RRbLUIUoZlYGUG3fWPOEt2cKptB90kPeSTwJEswnTROgLhiyA+pp7uiP0OIz0lMtgjpIbY8AeEzNtoMHSVKfiOcafeGG/oIb2wgSYShGsHCY0KVb3CivKcQkTSyV49d099atBUxw/KLvXV9d0cysqMx65zRhxhGXJqkMjXaG68ijk1Db7mWNRID1cOykBlgDuu/1Fyr6JL4FRUAaAkGUrQLe/1BJtlYGrEq3gpcjIM9g/0TYMM9gipnbMvjq0a/jWtKghtA7Phh9lrCfeLMaJIR+FTktIs0hUimw2PQhQz6CxQqKTwSeVhqY8iRH5bnK5tW58JvdzAC2zDwuErKqm4bv25AR0hqPK6n7r61ZIh9A2jSSHVVNOEHU7vlI7Ee3xwktmIz4oM6QI12+WTywJ7g+MUymCvoTE1K2IHhE+MS/qtdRJzIapYLTfEsJipEhsaI7ZNAJqYolyfBKayMHD0vSPbNzSxZdgqYxhEOsKiiOad+sA7tQbfJTp5SAPEfIrl78tQNSTOQRSD9F5S1NK6xI85KYFBCfe3RUIirpNnH/+Ox5gu8inUaZFhxMQ19+sMVKB5NvtrHo+wmx0koe9sq5xLsiezzWRbEnVEQkvVhgDIzmAhqdTB6fkq7Ub7SlmIOGTc4diKtlH0Vk9uIYiSUx4LfWeaNrJebH1W5lsyeF+esxu4qPxA1HUoZ3oMZE48qCQgZ+038xNcodIiHmMqGQFqGmTo/iwvR3Nul4zfUL0o02R42og0YdEfjUuRlzqwsJmUYZs7ahw0qdZjHbbbXNMeT8NKz4Yg8F3mzJykMnW60hdEeOhLqm8RINNpKUM7zn3D+m7JED5hovedJl09FhppGBPnf6O1Zrqe2DR5HWJsimQILyrrP93mZHSeoTN1oxzy/xIZY2NiSRh586AnZ9Bowmv25oyDSkhtmB/ro708GAT2H1BnD8c8ihoB/F4ICyURtUbkyH1c8T5y2yjD4HPLqPdS1OKoblPbUs+ahXrOEO/0lsRPUVswFbgd9PdvSuRtSmWoq0zFBTLmnctufGvn1ZBtkqROot89QfQ5hKU0HkGMSY6tnJ9ZyiJ2G7kPXaWy1aoS2+g/hfowRdO8g/0k1XVeSKYc9gt9N5kI6tgvRcm5XJZB1XZCegi+lWTwP+rooqsMAoqkBeDHWXn+pqPJRqlvLCygKEg8VyKw6Sq/OKDqy1fk9GEp51X0r7IKpk6GLkLwhM5GoO5MGxp6CtQL/SL2F4aCZOAyuLcWmCFH1CZn7IVMMcDtbepYm7RRJCkKFFcQs1qYT5atpO8MGLWwt8gAikzipS67OgjrhfpRpyo+lEMycEg1SDNAYSCKffC6u7DDa101ahfZjbvQbnA+0h/GTMdDghq6evVeAI/pkGGkNlk4nDCK2US2BEYYGYOQ2lFvgPvCxnSL2ZJoJKatQny5glSRfpCM6Tn8EIBZvW5DzGu68fU6tw49qtI0ejibAAAPLklEQVT+QfDDvIMrMNQ0LXcy5AzT0zy/OSRD0Jh4DU8DyNCC3qMJ9mWEj40LBd1dF15MCDSYlvIVYDveCxY8HTKMNH2IhsaRAfATl36aKXUdhCIw9XvktcygNRUXXg3fynrplf5TzLjz/KevJNrhpKgkiQd3KOZZ7wt8+ZUR2tFJKs/hUBvLIjxGBBC1PNo50WjJQEDlnOhmoTcXMC1mV0gdSXsByLq+xPpFYjQ7hVl2kiFZtHU+PTJ0f1IrhTXfnVWi3oHmdYqvDvYuoNoJb7xZKlQAn+gQc6a/Tml9hGV/UWPQlx+UnrH3DtPxp8mm+nIGdJKnR1SMpPItJdSz0M99hDEXa2sOxXJovWxTQ79JBos0QAAERdigx8LlML0BCmJO2NsI/A/q0MqdDK3zR73HozmI5Xr6YMpkGPUdi3aJRX872zyZCbEihYZwvoi7ELUjglQhutoX3Vex1bsLtQtb9lIP6RWKFgF2KY9n5KfX3GuUFJOJHtjRvgSIRy369ApbuUaXrAxNMStwhvmcxHotGeLhNTYqOhIjzqeQXlVvvDmGql9ewYl/W8+qNMXpfZd0XolTQB3zKZNhxALYLYV4MxBJ+S0JXMddw5t6MKdZth1fnUaIceXTVyHicprWZweJSuT/qV9Fg0YuXz3b2xu5Pl+GNpX3EA14/qNdaVqk8hqPGeKVXy8S4is41IAMBgzEei9t0DKhe0Qvr7roWFv6HCavaohJRzofs4ip5ArJJj3WzGGmSIaRFuQDUCV0VEKua4Nh4cdDpa0eOQcuo05YpXXP79uJSL1HduWKkEiPdVgdoXcS01groW8pJJ/xJUaX7Zp3rTuTdT7FlJ8c0dUYnQgsPzma9tMyDJIhoLHK3G9RVcLEEzQaoEnvdk8IBgMrjomPq5F2gXupSAkp0rTIMLJyerO0phyKUXG9l+k7UodlMBIZA/WDAZhhs6dLcICShOC8X8OUP3zCTkl9copj/RTnK88/aK7SDZSXF8CfIixe1rGi/VcNFjWTqI8ggwi6Z4cdAUMqsI0MlmqJIObw/s1X1Yzh6JfJh0OUtu+Rql/s2G1z7reSYE3TIkPYqealVGtYaN2W/negZeNKfamhtATkEMoQrJ1rpNA0SyJ/EcUpFyc6rghhe69iuWF1tWLjmB169CSKdX7sPDimZ0cAJCxL11mRpRdVz5YKFZfP6PVl4MvV4o4nUKPIYNXRlp6sheqproVk0H9IhnyJ3w3FZLC9faQpkmHiUaNSFI8DOhcofL8hvEkj8WvrWQdeDSrWl/fd2ktwQcmJeFakfFIKZ80CD37Dj434RBqsNK8I88gWzeA0kY7/dOVIvS8gWYkey+9Bri2D9tvTFzlS2Ak2Nm2EQj9uiMR/CQ3pa8oWuIvWGCo9oBFFpkeGkaFpNcaMnvpvoRWAwBjx75NgqsLRIeWAapT6MJL1qEjI0SX8pRk67Be14RCqyJBy8xBXhegm2Tm0FlKoZ1MaAbRO5C90+v82dyYLEtsgEBX9//9MDlYVDyRPcov70tO2xCYo0GJPTrkkbgFPyUQ6nddVhzVKjDl+Vz8DX1LtaXFxh/yY17cL4M/S5kp/NZ/8mg6/CqQ4oqs9tQTU9PrvDcjbeLog2PTmc9KmWB2Dm2xvKHS5mtWnvrBkyr4MHAsR1V6TbLwKRjk5WhZ70CvH/MKlEJEpuBTbQYIrUhynWmN/0cE/O3xq9a9xmjGafTycXcnFJR6Ct9lrE8b8Uxlf9JvbO1Csxed0+M0I08pA8S53laOGFM9rFUlqDz37XkLebaxY5aAyqsoe193JvLfa0qcM1VYMbC3dHI2zeF4yjZ0Z9uL1MfdvDt3DewSb20nf0pXjoINqbbf7poNsCnvwhHKAVr1qRDaWaCVbHEa9gTPgXWis/1PozEVaJ3gF5PiaDj/WbtpRTgsRQKutb5cEJc4ZHEa7ll1Wja+cnenx+K3gW4sBk2ZQ9I/SwsyBICtWHbDbQS1BBwhLltyBqQzolB6xn61eGxwe5fSKmKTh+dm8iXyct3ke5AZ3HTj5rmdXJvyGZe43Rjk603vLtBScTfj4Ze0p0Ede5s8m/DUdfhpc+9UlO5tQTx24rswitK3BCwptNF24v3EghiIHn2j853HfZPZhxshG4f4D5ZNLTtCIPhqrbRQWw0IefxXdPpHM835DvQ0Kl//HduLt8nzr6R/NCfdIuNSrPtzslO6v3qtQr1+FiZBN9pr6NLe4BslXdPjFduZCTKWdaAOm493K+CVpzzCMUq9QtbKkDHPsXgakI59Y63kJVSKPhv+uiVxdsz5EDZdfkLdZRYftIBcn7JRT+mPwuKPd+8SlT7Zv/60susei+F10EDiMKGmlu2guOdoMxmo2TzA3J83EUIWrglVNSj9WAubnm+cU7kM6/Co96ZDc8iCnWmqTLJDOtjYtmUytVqFGwS6QD7Ixq8zE0JU9UaBv8GTr5785P8kaGGU3yuGDfUSjxvHRw/66AwiJHE3TCY9yGU0xb6ll6p5p3nQwoGTXi9LGwa8RtIwFiqv3vc21dveT5qlfSxHT9mt9ToffPJO+aW8QroERAgejSo2VD49sNTY+dHRaS7hcRtBqTTxn1dsJRykrs9DIROcFBMmEbacxoLNlxwBMRFeG9AXc5CRr82iTtu3Ix8se6ETQw/ekg9u86aCMtzOOAU7dOkil50/kdwlA635e92pZsNHoCAB8hldyxaXPd3T40SHaHN22V2pRPySdwHl+OtGqtmHm6DrRYXeodBhnMDbQBb0zKS2t5hT2og+8rx0XhnA1o9LgBbIaArP1q9vU13PgRwgpMCTecy0q2bLOuw6NsXTv0VxcXPJSl4tzNpLZYt7lyxGY7M7sIIkAgrdB+4gOvzorzlscOKWLDVDa2V0nsYtuULBp1b/XcoQfZRf0Vu08A8Tp9irDDg6k2VyrJvTbYG2KQFub14V+9n5DlaUgfwIcNOaEPxTAkxgi6qLDEGadjqE+lT1LMXSbPA8ascpGc2nzr+41zpXBdekls/zPOvy8BJnacFurj3JFqrPEDN7mnEDgOR/Q/cBA50bU4eC3pYhWikwUUM0/ZcI1b3St5ZWM3M7el2yJZp1XQ3rYiQf1qjUMJXWbnDwjNkAit/2s26nDc4EOQnn4eUPktW4R3UpN0Chwr1MGt0/1D3/Nc3J8XuFLOvjNfUazFELCGS7O8i5rKRUT9ZLCIyvFbLMKmW8ZceE+f1/qSB++WyzD4uyySxSuQtW38qaOep82aCVeS8fPxXLk8P92MOpLX/LabwVxWfaiwzk52c+jHBK+fc7+NxAmy7bax54jC1TVwXEpxK/r39HhdwLxPsW5NzrOg2ZATv69eJ+/z3quC4rfcMaK5NyJhI6qTDYlB79NL7aMBcBZbVlYultFoF5l4kZ4sq5lIqDRTF5Ceq+gyLfnhHnIxc3INx2a4gCsY9WN2Yd9acSmxxttyYNB4mLEy3WWTNdK6UM6/E6wCwAW0WgHBvllpUKeJ9EANsGO33e5JbyrKp8VqkjLjBZnMtizAgbjeHlyq4CaP5itFHgWgMeyRQ91JzNXLARhOLsGArOCYdtq6XmKsrmzFuSuTHnXofqWPDlG/ylNMI5tskQyApzK3N793fapXeUyQ52NxKJACVt2QQ1/Tqy/o4Pf/k3nKGconol7D/3swqBMakjGFD+DQWnRqRYOCqjlufZmAwdP2Aj/Kc1u2ucp05LXdJhxDuJZ6NMWIBCU0K9IxnDqR47jwOQrnK5mnyK8bdWIz3G60JwIev0UZqtpRF09yuPdp8hWEGjDNj+ow88HszCBfH7WyU6P8wIVSrh/VinVn6nu7eR425FfIt67z4jsPJwThprfRCtFGAKn6vfo1oGxqKdCU9cfZJF8MWwCOUUnsMM8UWzfD6639wnOXYd25Hy9BNB005Ix26XpKmLZafba/tJneGVva/RYsfqJ4q/o8PMEEKjmrK2o3n7tgG70y1XKJ8vJ3Jx9LtmirxCxxltLKbfNvbBKJUO2Mm3UgokjyrW08yimt4s4U8FwyWvZlZ94mJRLRtvXrs8JzG+Cyg0Epw4Ifr9K9M/Pv0LoMgCITQOYeYar96m/3/jELmnhLR/T4eeNDoSa3ox9rDZN5EuOaQ60XUvlDB4YO/URb6PtumYMplzfoG2ZstnM8oyn6rDUF+4UrY8O8SVsoyCMRnshWcHpo06kBuY2teSItAaeLp0maEwd9r2c8rSuJFKrXXM3ycHIxEp55lNu2fB5fNRnXM61jGojqXxFh18NxqmcnpXPzQxf+0cFAVdRntK8BtVr6eQygYSZYqaXLUAhsLSh9Xo/G8YCn3IezJFwrN9aBgw+8ESbtM/WNf40nMIQ8wZn5L6A0PsOHXQPZajkk3MVniBc8zS/FdVLrVuZEU1+b5BeDbBKhxh0Ytjjgzr8NDnm8qqe/6otdD18EX7UNPdgbzzU0B686+k33dqO3KKz3DDLWuUsu48Tx6UmxM1H3m1gz4EQ9MlM5iAqzrWa1DMVjzfXnRa11XijYQ3mqevT0ghycTAM7E0H2WW0D/GzAxJ+5XFZl3Zfu1uin3u8ZINbzX9tumVtZvqeDr9EuuY9BfAeVyilUkL0seWkJUIry5Ch40YFYUoNtOd8QrQ2bbpt62NDVFsv97n5Du4sm5k34Sawa59Ws6KcJZ2zFwNy00eZlLQ7kWOtMUzntVcdYIP+95CxtSEdyZm9L24XygpgCjznp6Y/db+1ZFm8SPc7OjhD9PSCqFjp//6YCoQmm3LHEDz7z0d+eB1KmkM0rboMWikaMS+uC1KFwKdI5Bys7ONTwLOXERMZ7mIfDEIf5z1DmHbiICJTRCMgE0QF5h86nMY7P900zMTg1Zib0eGUWnlMLzOHeYyVa9OisxYwfFOHn/7zCksmTSQfh6mNupvcEo0oKn2bDvQOtLHwdOqWkdLt+oNGCi49OAQBs2gCRDbrLF4T9bt9KsMUhfNv3obx5+GxME9mycDN6PTcL/7QoRmrbDEzOmmyDp+fPmAblMZNrgBaiLejEo+B+Wx4wwST/Y4OP092CdxbAMmVvo7DaJv+M0hRKFf+e9oGjJpz2zmnU8SwBOkpCJhJmNlIm4EWaBfjHoJl9m3pBlanDi1TTf0QCMMWXUbIM/tPHY7UghJRMkzz/YXGfyI1g3cNh3rr+B+Yf0yHfwAjBO4Lyccm/wAAAABJRU5ErkJggg=="},{"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}","scaleExtent":[0,22],"terms_url":"https://wiki.openstreetmap.org/wiki/Esri","terms_text":"Terms & Feedback","default":true,"description":"Esri world imagery.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAB0CAYAAADAUH2QAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAActpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgSW1hZ2VSZWFkeTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KKS7NPQAAQABJREFUeAHtXQd8VFX2PjOTXkgICSRBIKH3DipFQEBB7H3tvfe197q49ooV1866u4oiFqwIWOhN6b0FSO9tZt7/+27eGV/iIAkk6P53zu/3ze3t3HNue/e9EQlRiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ48P+TA67/xmZZlvWbertcLuu/sS2hOv+5OfAbQfszVddWBK0jTac9WFWpJKooAXtIeYKxKuRXHw6owNUnbpPHccwMbhSmCkFT3ayD1llN+pECCuGwq59f/ULKQlaFqL4cqCtk9U3XqPFsxVAloOm0ax2dptqd9XDOHPRX5VCTSqIwfiFlcbIvZA/GgWCCFixek/g5FIMK4QFUMVgvoq5b/V0lJSWuuLg4RDHkVA6nQqhdTZ1JaPoA4w4pSg0T/+y/DnlhVS30G/uvSekPURBHQ1UpqAiqDGrfkxlQEqTR+qsC0FQlUAWg2wmNo34ajwxnWIj+ZBxQeUH/sK8CBH/KT5MqigpYoNCmtNgNZZlsmIJuVQb1oxnmiGP8q6qqaLrBKHd1dbUrPDxcYMJLBHY/oMLuNL0IppugnYqh4VQItRvzQIxKKDNE9eQAZIb9zT4T2Llk6ABQXrbAPxcm/T2ws/8anQ6YgtjKYQQdrTCCDtOpGOG2P00qRxgUIgINN24Iv9ZVR3ma6geryYvpyExVCprUIKepdjJUlcM5m6iiaDmIFqI/ggN1lOMu1OF8oDXAfs8BpgL3QEZymkpJnAKGspqG2FDkTKWgAKtdTSpAAJgRorxebyQUIgyEIEMMj8vKykoCWuzcuTMBZhzieqKjo6tTUlLKW7Vqlde3b98dHo+HCqBKQOUgqupA/WkyrioKzQDA+JCSgCF/BHFAJf9povz3gRP2UI+18B+FuNspZzDNbLOHuA32Dkhgg1PWI4HdOFUEp3KoskQgGwMIezQUIwoC74ZyMPeY9evXZ3z//fc9gN7ffvtth7Vr1ybZ8atHjhxZ1q5du5KYmJjSqKioyk6dOm3u3bv3bDCo2ufzUeirUH4lFKaCgLsSUFPtVBxVIKZhZwSA9L7GZjjyD1H9OEC54WD1V4DKwX5i31B2SBy82H+dgKeBk4FGJxbYJORQDiqGUzlopwZQMSKB6PLy8hgqBuxh+fn5rT/88MNDp06dOvzjjz/uynjHHntsARQia9CgQbsyMzPzWrZsWQYlInMo1GSULpFoUvjLbdBeCYWhYtCvDMpSZtvppj+hM4zOKMyHnWNml5CSgBMHkCg7IBgWZWUR0AtgX9DtJPYT5YZ92gtpNiBNo+5HmkRB2EBUWGcJmgqnYkRBMeKhGPRzr1q1qus777xz1IMPPng43HGXXHLJzmOOOWZt//79c9LT072WJbEbNqxPhAI1W7p0afz27dujKyurwyorK6UCELfbn9gsvhqaVtGmbZviDu3b56alpe1G2p2RkZHZyLMEKMdMVe52u0ugKHSTsaowOruo4jmVxBtSEnDqABHkxyyVYLZBkYuBFoAqg7MWHBxVhsegj75GmjCYVKZGoboaud+Z/o5y6IwRhUJiKioq4qAcgucZqU888cQp99xzD6fRMJjrLrzwwmVt2pA3kgL0BpJeeen5hEsvv8rdrl2GPPPM09K3Ty+pKC+RysoqqaqskPy8PFm9aqUs/PEHueOOr5mWZB05fnzhkWPHbh84cOA6KNuq2NjYLPhHYFaJhlkMRaGCkg9UYo5GBGeeWkxGu0JKAqYcYNLZvT7FckVAatR9Y6MqiK0cFDCdMWiyDCoHFSMKI3gclkex2De4P//888OuuOKKKzdu3Jhy+eWXb/3Xv95LuvLKK3di090N7WyHwSEGaQyVuuJpWqUlJYK9iCRlDJCqqFjxWF5JCvdIUmeX9D/cLReFW/JUdamVvXOba9mSxa4333w78YYbbkhE2h5HHnnkyOOPP34lzPlYqq2BXzhOyqIwo0TYJwKqJByVqCS1KKQktdjRlA6w2iyzsmEuREFHA1z+cknuJA5iHOC2AMvsgEZVEJ2e7Lz3z0BjVCF0RKabjaJycK/RDLMG7XGPPvromTfffPNfunXrVvHRRx99GQ9KS2s9YtfO7VbLVqnuar8la7cVysJ1edacDUXy065yWbZktsvzn1vM5sDMuie/KJKQjB0EZDkKRcaHyZCW0XJEZoIc2jlJurdtZjWL8MrObRutTz/93HX9X28y7U1t1ar6pptvXnzqqad+e9BBB61GfbBKqyzCUqwQdi69SgGOSFQSdozuR9ghnEkatROQZ4jqcICyBD77YB6MoJ/sYC5/OQCT2AdUDtIViPsC4jbq8ooZN5qCoHKsOBVDlYNmQDkwczTDzBGNpU3za6655vpJkyYNv+qqqzb/7W9/WwLdyCwqLOw2YfyY8Bff+Lfke5tZr3y7Qd5cW+ySSiw9I1DNKI94IiLEt22FtJ75uMRsXinWIAwsI67EPJMoPijJLkQtrcJPGeSZ6ZpHyB0DU+SUQ9tQWaQgZ6f14YcfWZdceplh8uDBg8uuvfbaL88444yvUNccKEkplKQA9mJAlYTTvCoJFcXYQ0oCTjQxOZTkFBT1BsBlcV26H31xDz0RH9bGHbwaRUFYMdRPlUMVRJUjxlaOWMwgKRdffPGt2Iz3nThx4spbb711G9L1BVKKsHQ6ZsIYa33fa1zbPW3R2ipJjYuSGKzWKv0uyfH6YWLQiIRs528V+QwnexvniPSEkoy7BqxrJm7LL/EulzRDlHAMMFleS8oLMOhU+OSMPnFy6zGdpFdGkmTt2GY9P+kl/0MPPcgZTrC8W4u6vNu2bduVWHJVRERE5MO7CKCScBPvnEmoIJxFqCwhamIOcOAFr/0w26GoswHKCwc4LpH/ibAlMJtEOZhvYykIBc252Y3AJjwa+4xoKEcCZo4YzBxJ55133l1vv/123yeffPKX6667jkI4AIjelltlPT5trTx12WUuOekM6dDjMPF6S6XYXSkuyGp4dJ64wyvEb0VKSX4HqbQSxJ+/TfxfviCy/BOR4ReL1WccxBbK4ALvwrDlASJgbxUeJpHRcbIua7fISw/K3165Xa4573iJDRNr5syZvlGjRqEKEjZs2LAiLPsmH3LIIT9hJqnATJIHfyoJl1ycRQizxFKTHQd7iJqYA1COPR7dUoFQPKcOLrkanfZbQewKctaggqiicJ/BmSMeypFA+/XXX3/TU089NeLhiRNX33LrrRQ8Kod79qqt/sOm/ewWq0haffWWRHTOkOhBfcVlbZHIuC3ijtyEuSBHvJXVUlWyVQrWXAMki79ki/jWYfDYMBvZBCc2LrxVolTFjpb41m2lRfYy2bTqa+l57v3y7p0XSq+O6YKn8t5bbrnF/+abb0YkJib6YE7G8fKXdZTEOZNw5qCihJZawdneJL62nFEZdFBSxWjSmXy/FASVZnpVCioJwaUVT5/iMIs0xywSAcU4Fwpy5o033rj57488koM5sz/CXe8snmadtegBV9e4WGkZWykrpmyWaJzCtjslU/yVkVJdEillO8OkaK1fchZWSvncFUj2K7ladhJXcob4V2Gp5ceeut+JIu0HmZnE5fdKeHW5VO22JLPNPGlmzZZd22IkvihF1q7bbDK5+aZb5OSTTpLEFonVL0x6wY+ZjXWXGTNmPHvEEUd8aytJLrycexJuFAMzCUaufe4gm3/koRNwmg0oR0SDxh4d/6hy2TAn2fWgoGv7tb37zFNn/o1hZ8X2mdBANk6XVlQOHudyIxWH/UYiTqwivvnmmxGjR4++d/y4cfn/ef/9dbga0g/hYW8s/I913opTXIfFjxAfsnHHhEnuD1mya1aBtD81U3KX5cnG94vFyuYzvnKJ6YwDq979xd38dHE1aytWVLz4wmOk2h0upavnScU7N4h0HYMDwZuhnokS5a+SiqoIObLTSunRcar4/blSVu6T8iqfbJpVJrOfWo58a2j8IeMkrXuad9rHn7iKCgs8LVq0qPjiiy8e7tmz52IoOa+y6J6E+xHnpl33I/We3h1CIfVVLqQhb/2Ir6OnXfOGGciHgxmyqd+DNDv+XuvpaFMwPlDGWPdAWH3z1dYhvipRIA8No+nki10X+sFqBnBjd8ZviH2fFcQunAynUugsQuXg0or7jviioqJ0jMSPz507t+WWLVvm4eFfT4THvr34I+vsn493jY4/Sqo81eJx+8RXUCFZs7Jk3csbEYXUTFoNL5LUQ5HgoPPFFTtcvFYX8foSpRrjS7XXJ1VeL2BJJewFc96Tqk8fFxl5ucQMOV3KKsJlfOdfZFCvG6XKl4kNfjyGfb943R6c6fpl3mtbpGxmuGTe00zSKvpL8xVx8tzL2PjXHOl6xo4du+ODDz54AC9lbcMdsUI8J6GScD+ix786i1SjM/Y64im/EJfpAgT/g+BoB7QC4gD2CRUxC9iI+NthGkLcfVIUpDMC5qwn/NKQaQZAMxZgHJa7C9gMbEF8I5DB0iPcEMIQ7VfhV/9gJuPCn/sJwwO4+XCrO4BTGbPq4FJ2LbACcTj4NIicdYHdbO6ZgdO/QRkiMhm+r2Qai8RkLMG8OJtEonFcYnmee+65k6AcrSZPnrwGytEGfrFzNi70QzncYxKPFJ8Hq5X8Mslekiu/PLYawSS3dD2nlbQdliVRLS6GSE+Q6or22H9HQzm8EHIoFHw96BO3m/CJCw8KEwZNkNy1cyVy5gtSljZQevVvLQO6ThbL3xnporFWgXrgNMyLGcQV5pYep7aW6e8tFdfsHGl+foZcdurNcu31V8rjzz3hfvH5F31ffvll+rPPPnvcbbfd9jIOGGKhIFQMXV6x87TdbnRArRESYbWInQUPSpIKxmC4TwBGAl2A5kAwykPapQiYDvDEZgcjwW+Pm1aGOwlxA88GYM9A2GnAeKAHkAwEo0J4rkL8r2D+B+XqSVEgLyZCuJ4wjYLzbIAKRrlwEgfQSchjMUwYLlwbsjrBfiWAI0jzfgeMWjQBrk8Rz5QH81q4+wBUIA7GVFyCeXMJ/ADyLQMQ1aLfyUBL2DfB/Bj+fJ4Co36KjDQB2icFYWHIQQVEFYXKEYHZIwazh3vhwoV93njjjaNYUmJSc45ScZtyt8s5C25xD2k+XHwV1ZKzJEtWPrVavKV+SR4YJ5kj0mT+49sl4+BESW5/t5RmjxC3NxocqRJ/WDUUCjOHL0yq/X6Ylnhw9Iun4OLCS1Phic3Ff8TFUJI5Iu/9Ww47pa1ERRVJSUUL9Eo1OhPnAKyM24VnJpZEJkTI0Oc7y1eXb5ENGVMxdCfLK6NflEnPPO8P84T5n3vmOc+LL744Zvz48T/hGv1CzCJUkkrkQOVgW7nccfLAZA+/WgReBYQKdvLjZmBErUg1DuZHkJSnSbCPsnEn0j8N+8Po6EpnvvALShoHJvN5ADgX4GzhpGDlJiDCwTZuQ/p/wX4nyl0Pu1M52X6mp8KfD+yJZiJgMdLzuJbCPhHgakOJMzD5p+2mEjjpDDhYRjCi0jwKUDlJw4AOAJWf7cgBIBQm76B9hLA9Ehu4L8SGqHDQpKIRfI+DG93of/zjHyesWbOGdl+428Op1PXkkldkk3uxuNe7ZPET82T5Qys538iQu7vK6Lt6S/dxGZI6qEzyVpwirqIJEuOJkrjoaomNcktsZLjERIQBbonBjBEV7sbDc9pdEhkWLjuqwsTbpoe0PgYy4P9cCtZPw+PvZHCdCysXFMQedsgi1NiLB4rNOyZI10tiJfOhjvLGxlfkxXmv4ZTY7bnz9jt9GZmZVVgWhr388svHIQXrzw7l6RyVg21lu518gLM2QRh0BEyH/QOEfgKMsGNxNiEoYHatAnykgNCPYRqPs8y9wHzk1QXCxpGY9QhKjrIPQYTFwBUAlUPzq2+5bOfpwHLkeTLK5WhMPydxdiVxANH8aeoyyYQj3UvwewogLxmmisH2KmA1S1maSpzRSM78OZuTeBxPXimxrzYCzG8ZQL7tM9VtaH0zcgoG82BlwsvKyihAMm/evJ7PP//8kOHDh1O7LQusmLtzmfXMxvtkwHeZMue6WVLwY4n0vbaDHPviIOk8sqXExUH4w0olrSsWwcty8OC8WuKiXFCAcImlYkApiGhbOaKhHNFQEr8rSsLCXDI+dZ1cPnCqnH72BlZBvnjVL0V5FWY55YMoUBr8mPiMqQoDtrY7/CBwc530WdRdbt/xqCzfvlrw8lX4pEnPmw54/fXX+3333Xd9MXu4MIuwYzmFUzDZZrbdAJ1PngQIblUOCuh84ASAxVNw2KGaB/0oKAoVMMZh3oxHMB7r1AuYjfx77klJHGUPRNxvgbYA0zIPzY95s870Y5ksn3btW43HejAt2/5v5H2hPRMwvZLaNY3TZJwCpLsU5iWAlsWBhjysxTe4SRU1RuCX8Ug06+ZNt5PWwJEJ/AiQV7+exsDRUNKG1TsdGqoMVAZrpcPxBJozRuSUKVPGwXRdc+01m7DrdH0672t55vMXXPKEyIJnF0r6uGQZ+8pA6X7MQZLQIlzCvOESac2SCPexktLuRdk8e5K4K4olPiYSyoHZIwLKYVAze1BJqBy4YygdErbLcd1elqFdLpXk2EmS3KZCxl/XTrJX75aNSwu48IdioPfR9T5YsDoDYKKC3mq/RCRFSt87u8mOF/KkZOcaeXv9fygQnjGjx7hP/8vpOIwrF2zWR8OPoy8HALZRZxHywskPODkiBJRjPJxzgHSAQsa42qEUFHXTj3xUXtJN/jIO60Oim8rJfFKAGSjnIFtJmM4Q/Lgv4OzCkfSfAOvMNEzr7G9VCPpp+bQb1sDUcrWOTjeCa5GGOT3px7TMbywwESDRT+vLOAxXwGoUVWekYPkyDknD1CTfufzDskQmA5uAl+DeBH8Y+3YCqJ2FvOpNbKATplOx9+Dyyp2bm5uO5x6DcN8qd+iQoWG9Dx7ieemRZ9gIppGeN3aS9sNTJTbODcXw4QTLgyVSoYRbw7CXOE5ateGSEXNpznZJa30Q5mEfhNwtXgh1tc+FLQQXTDiN8oVLq9id0rP1gxIR8RNOqgbjuNiFJ+8+6TIiWT57arMsmrZdWvdvIR48Nuc5E3YrYtgEuwVQWXzVliT1aiFLZZX0XNZTHkl+ynXm9pOld+sukWeffXbpP6f8Mxob9l6rV69u36VLl2WYRSIxm5BvKlTIKcAPp3L0gf+HAPnD5QQFlEReEEzPtHOAhcAugMS1c09gOIDxxRAFSIWb+XCpQaXjkmUCOt+5CTV8hv+1QAfAWTachpifCukO2LMB5t8SaGXbGYfkjHs+ynrdVkLuJ7ROWmZNippf9WP6qwEOMGw3y2W7SbRrPOOBH9ZXFUT96muiSkYZ2CaC/YEqN3xzrgWyk/aFyBgFG8l82HEunFp1gxl/3HHHrUxKSkot99W09aCOB0nalSmS2i0BQzA21zhNCsfSKJIK4l6AB4PTJczTUlqlkYciu1cvlu4DDhFfVLgZ+asxBXjAS7fLgyUVzrHCoiQl5gdw/FvJzh4tlWX5UpiLh4mlPinOr5bkLpGy6cdSmfP6RmnWOkYiEsLFg3ezwrA598SHi4vvaWFWspBneItI6XpbFymcWISHjTny5ZbvqCCeQQMHeVokJ1etXLkyAq/99oWC/GIriC4PlAc0eYTCEYyjN5cj7wDkiY7esBoBocn4/wHuQ/yf6VGXkEc7+HHfcDPA+BQqFWrOYnQfhXinIg9uoj2w8xVhKgvLPwsgMa2TNB/uS+4A5gL5AAW1BcDN8DXAEYBTOS5A3lQO5yYdUfZKlA2ipmNrt4OJWTaFhG1i+TrjwdpwQh1RxYDiUju03IZnhhT7oiBGGOzSaCfCIDiYQMIj5s+fz3Wf9OnTx4dXZhMWL1gsaWGtXanXpUlKl3hx48qI2wOh9IRJuAv3pTxfiOV9ASP7AOzwKySqeZIM/csVsmDaGzL6lHNxEsXjXb9Y7kjMEnikXVomJTnZkrdtq2zPmiWFW/BO5vQFUl2u+ziW/istnrLzV4fDltAjWpL7JEl8hwSJzoiX+E7Ncfi/RVpuaCtT0j6zzik+1YX3UsKuvPKKqvvvuz9iwYIFPS644II4TB4c4VRBdASkcJEPJArgfUAPwDl6s6MIxrsHHXc/TEMUOlh0JGUcHhtvhnkLwmbDnAqwryiwWo52POPwKFY37VyWsQ86AySNT7sqB9flw5GGe0Ql5seZhAcJnyDPG2E+CpDORty37XqyDg0l5k2wLmwrZ8y3gB+A7QAHEfKUsyLrXbOM+FWp4FV/Ql33pY5BC2iQgoBB7MS68OAGbBiemrPhcT/88EOHc845p/LHH3+MP+WUU8gQK9+b78qMa4MVNWYO8CHM7QUKoCRLsMT5u1jV4yU23A8/zMN4XaRLv4Pl+ymTpDw3S9J7DZDCggLJ3pUlm9askJXzZssP7z7jaExzyTykVNK7pUmztGjc3wqX6BYRUCqRmc+vlexfKuTIv/eQ6JRIKS3ySklulZTihm/e+mLZ8F4WllrsH1S8fzOpSqiS+AURsrDrh65V+XdKSvyAMFyJZ+fJL7/80gb3tlJSU1MLsJzkYMD2sn0q2NyUl4JHHeDHkZ/EOEoUTvJ7MuLdb/OS4WbU10g0GQYwjKP1dNivg/05hjmI4RS6/gBH+88B5k8FyQRYL1UIWGvRy3ZddbRmPiSmYZl8+PkYyuUSLw/2gHLArnEZXymYn4bRZDh5RboNeTxcY/3NbxZ8qDy6NGo0Qf9NSfX0aJCC2HmSiQo2mptC5uPatWsXP8nTavPWLR5c+kt9Y8rbMufn+a5XHnparBwskdLxTgcuIbolEYLZBU+0/you73Ac4YZheYXnGsgWe2/p2KOvKWr9ou8lDJuFH7/8WD6a9Dfjx5/Ow4+U9H4TJL3LdklKf00i4wfjti/2JtAw7kO4Kfdjlup+dGv57pf18LOkeacEicET9OYoA3tzaYNnIV3O90lpXpUUbsPDysU5UrKoSCq/wmy/G8oV/p0MP2OAp3u37myrf9asWc3x5mM6FGQ9Hhw6FUSVhPFIFwFcb+tMQz92NHmEnOUWgGQ20zXW2r+2EHKpZAQE7udhPwexuPxRoWd5VAbmezJABVFBZfkkdde4fv1l3WqRXSbjc29h2gK/exmJbhDL3RNp24OFM09VjrOQzzuMhDxZb4Y568h8WJYXcPrD+zekZar5mwiN4cFKNoRMA5BATTbcgxE1DBLj2rZtW/KyZcsSTj/z9IpPPvw4LLlDury0kstjnNvt9iJRllSWn4v3yIfixCpJosMSJS6SuwA83UY/R0ZFYV8ShiHMkrbd+sg/7r/epOVP254DZOgJ50lq1/4S2SJNqtxx4op6UzyeQlyNj4DQV+Lho2WUgadVmJ4kpXuiSb9qRpY0795cLPhxL+NF/2PYxj4kTKIPipCw1nESP6ClpBzZTtb+bZGkVqbL3Wf+VZLyIuWMM89wH3XUUd5PP/00YtOmTamHHnqoG8ssM7ojc1UOmhXodK79jzeF/ioUdFK4GOd9dHyuHa/aFhKG75EQJxxpuEafBlBBnIKjwjEM8biGN7MdTG7iSRpe4/r190rEZ110KUOBZZsYn/mbmwHwM/2MeEZRf03eIBuVmMsnzlrvIE/KHPOn//6Q8kHN/clrj2kbqiDOjAzz4IG2YucMysnJSYbhPuWkU8o7dO4Yty53k/wQMc2KlRauwq2LpEXBA1KefwKObSOEjxNdrip0DM6W3HiWgRPi0vwc+fnLmfLl609J1vqVzFJGnHCmDD/uDGnVsSfeHEyQMgz/xXhjsKJyFx72fY08emF49ppeJaeoauC++PGkPRqv37Y/OkU2TM+WojMrJa5dHJTJb+JwCYZFOxTLJ9VUGKSLbBsnSUNbS35VmaTcNtrq3a2vKx7HbZ27djEKgg9McBPJ/ZYHSkKBVwXhsoRPtw+FX1eAxDAlwx843qUH4lLg60sqSN/YCZgXm0r+axkdYO+IfH+BSdpWY5hwjUsvpqWwc4/CB47cY3yKdJuAWjMEwhiXZeyPcjAtlaME0GUVp6P9yRNZHThqqIIElAJVVLsKihuf5DFPLfE8hEwJyy0r4nNMV3O84pc1D9cPBx4qsQlQCBdffgoDcLIUHo27VmXyy/yv5LvXn5Bda5ea1h884VSZ+8m/pMfBI6TPYUdKQTFeoCqvxOyDg19cN8EVRahFLuJGcfRDL9Y8LSfnoRuIgwpGeiR9ULJRkOy1RRLVJs4swSgJNeBMAgmggiCRF9dQojDTFNy/SbKPL3N17NUNihvubp+ZaYSnsLCQa3LoRi3lIB+UuB8gMT4FjEQBJY84undGXckbrv3pXx9iWm6me9uRWZ6mpZ1NZj92AlRBlsFOJTkIYLizjsyP9csAnge4byLT0UOyAODp1loIcWAZhnDmz1G/oYLN+CzvC6TdiHy4rDS8hN/+krZJzf3NL2j6hiqIZuLsIH5EmpX0YP9BAeIIaUaf3SU4wcNquNmwlrLt02wpzyuS2MTWRnglKoIRJWv1Eln52VuyasYUk/fQ0y+Xw085X+Lx1wZUkNmfTpWuhx2FC4lQJI7+FGYszX1+LKvwZqFYZZCWcAg57ltBDrCANhLBfQdX8HHt4k2+O5fkScshqbjPhQuL6CIus3AR2M6PEsN8ETUlCtdbk2Vzzo+yBYcEaQcluWPj40x7oSBcxpi2YVnJL0Cy3c4OopCSlD+0azgVYzI9GoE0T2alQtiODgghL4vmw+Ta9gaAgs56O4ltoKCyntyvDLEBwxy5rkP6ObB/BnyD/KigzLuhR7xaz5+YHkRlaaiSmYRBfpTHagaJsv9erHBDiY3WhjOtul18zdZ42Arir0Y/oGsiO5uJRcp2rOJBllh4HbYsP1uWT3tNpl53lFGOLqNPlvOemy7jLr9LWmR0wU3eVBl/6W2yfNZnsm3zJqmGzlVAsqsgxVW+aihLMzwJPwy9/z0UpRLgUgl3fbFkqzLKAxMPAcPxpDx9XIrsmIFNODbkfvPQkQriUA7Yzb4EebuaRYmrLa73ZHXFO+5mr+uKisBGCeT3+8kvwnxZnibgpDSno46dcZmPgoKioJ/anabTn/ZgpP4pdqC674d7LUDl4J6E+TqJSmJmBphcxhFUGvYhl2CXA9OAn6EYtwLRHP1h1ndQZT2UP9tgbyrSMpok/31REGdFalWOa3MGlpSUGX93RQYeXFwlkRlbTJp8vNhUXV4qOasWyvePXCLL3njQ+I+88Tk5/KqHJK3nYPMxkvzCInxnwSVt+3BJj7fzl8yXskov3vvgux9+KEjNbd6qsmOlvHwi/JLgFw3FwN8hWHlQAigiFcaLGQUPA1v04dYBL5hvL4MUYOaAqHAmopLUALMHwunv5+aoMyxLT8ZN4iSTrubbcpC0yEhGC0oQHLY5Jmjgr56MoyDvFfRTu9N0+tP+e2S0GRF4CsWRvhD2Y4CNAJWE+aoiqBLBy/hT6An2H8PYTs48VKoMYCKwEPn2Qb76vAVeeyWtsx4e7DVBAyJo3s62NCB5/aKSKQ0lVkgrZUwoBhfmzIcMle3bd5jKh/GjhWuPFFf3XRLRY4uU/LBUNsU8K3lfvcFo0mbs2dLzmPOlVbuO4sO7HUXYZ0TipCkcyyCrAs8kWneUWJxY/TTtHckcMh5vHcbjjUC8m25mEcwmVbF4cn4ilGkUPsBbAX8fBL4U11hWS7OkaVAUXlPBfa72NcusgvVFEte7hVESnnQZ5cA7IpQGLq+gd3hC7xJPK3jM8eGuF2uJzUNVTf/im8C8RIdTXp+2V/nAZSXkp+ZY1iQK/sOiAmmCR2mwL/Pk8s2uLTSwZqSnkqxGnQYg7EHgAoB7HyVnXZhW07PvqChOZWHcbsAs5Dcc+S6DaQZD+JH21iYV5prYjfO7tzIbpRRlyv5kBl5hwQ/ZwpqcU7nk5+eZfGOjIHHFLaS48FQ8sWbI5oBydLzw79Ll9JskslWGlOJCYBk+IVoBKS3HKRVPqorKkBVenR18+lWyc+UC2bJuJZTAhXC8NgtUAJX4ikkVTqEq/UlS7k2Xoso02VWcKT+tOVw2bTgDG/pyKS9G30ZHSEzPWNk9d7dUFOL6u8eDvQivq+CgACe2OHSHsnBm8WMZ5ZIydx9MNztxIdL0qx8KYtqD14WL0Qi21Qk2TKlILXswKVQcSRoTKvRm/6flOpQkH/Yr4c9N/p3ADwD3FM66sH1sE2cYM8jBJKmyYMNolmnNYL6F7uY+h0qjgq8mvA4YHZAyzbDfgCaRiSRWzikkZKovOTmZx3myY0cWwv2S1hybaG+u7P5snhTOQKLoBLHK8yXzmsmS3HsI5nA8qCsrw7sdrAY211gWUUjDIaQsAM/cJbnbQGYpa376RuIyepnZgw/6qvC/OlVuP77PW4Yn4zuxv9gtJdnb8R2sXeLO3ikrsgpkW/Im8fHUC1NF1dYy8Rfia40vrZAYPDT0JEaJJzlaXIlYfcTjdhiOmf2Ru8RXPlR2l2LPmjxfEvi1RlQsOzvbKAhmEGxOarXbhPPHpm1qcZjkE5vDaehNgHlwxFdewrpfRN5TOb60cwkIuK0krDusLu5HHiIg4J1h9gMOBjjD9ABaACoPFH7nDAGnWaZx2UVFOxN4DWAc+v2RRN42GSlDGlKAKgbT0M4OMbAFSKZ++JHr6ScfE18ZZOFVfPnQfDoVsSKx/4OC+NxhUl6Jp94Y/S28DMXkHLnxYhWeqANYbvE9dTeWTeHJbaTNsGNl+b+fldbDjpe4Nl2kpCBPinZvk9wNKyR33VLJmYO9ZBWX3L8SuVa0DusGjH2uxHhxmW9UV0nxnFyDX2OilzvhMuPAdhLWaaNER+JWR3WZjOwXbzWLi3ZZfq8fX5Mnn3wZGRnZMLnGpwARbLdT0H+Gm2QUqsYa+OUo/CQEdUXAp5EtqBcVgXUKkLoRRmFmOJ9Sr4GdeI8REcZFZX9gPHAWwFMV5lO3HSqMJyHsNYA8+KNI+a5mk9RjfxQkoBy2wAhu72ZzI5uXs8uTm5fvXzR3Nhi6Ba/TjpRd/c6X8K2LpfrzpyR3yde4HNhSovAuhzt6A66IcGUWBSVJwwzCY+CWEFJ8HK4co3xEoqQPPVG2Qgk2zv1KEnbtkE3fT5fd35m+DTAlvOcYXGXpKlZSW6mOiBcrFk/RXfGSmr5SUto/I6U728i6G36QuHGpknw0PuJQgL1MEW7/biuVyjX5Uj5lpcmrWcLdIoUR0vWKI1yxEOnCghLfP6e8GzVixIhcvFZPBeH+Q5ciygPtpEUI5j6Fyx4VMAoV45PXJwArwC+GN3TkpYAzTy0L1lq0xwdwtnLwOQas5jDBzCpIzTS8C7YL9s8IhD8C83VgNFB3JlEF6YZ4PNUqRxzSnupUE/pf/NtQBSEjlBlq596DAmB17NhxF65iFMycObMF/h3KGj1mjIy94F75MrIP7ky1kyL7FnLpzHfEfdpSXDMvxU1e9DpmFD+eS7ndxRjioBS46e3ydUaWHVFYN7zUVHM4tPpdHqbUEHsqYeQ5Etm+n7hTMsUXjQ/E4Yl8OWYiC3sZs1+GLOwoP1hi/adJ+EFfSXivdClbkYMFAvJMx81iLL3CsdCoxh2t6uIiKf3lSNm+LF/aZn0gL056Xg4eNFDwPrppL/68Zzv+OqEAG3QKKdvrnEF4/EmBWQlzPsKGA6ogsJolFs2zEP53xOO1FD40Y5y9EuLyIiSXaBzt653Ojh94doG0ag+M/PAjKwkqDfPeBr/TYOdsmAoEawfWzvjsTM0zExiB9tF+oEiVtUnLqzuF1rewgHIgAYXDKAheVc3p3LnzFmYye/b3VqtWqXL7DVfBlSAJ5RUS2wnXPY5iqE/yluOjbt4O2FNkAm2A9nD3wca7I/87TazohbgWcodkzT9elr99KtLU7EXDUztI6ml3S8Yd06TF0VdLVM9R4k9qI5V4f728CkfBFRW4HYxBHBt4lx8m/hh3w6ox2OB3kNj+1eLfUiXlOTjxwmXFqgocGXux1MM1e1+z7uJrNUYSxp4vWw65Tfp2dkvv3n18uMVrOoL/L4JKlOPErhozCEd/ChlBXlCIOMKT3q4xav0yjHG7ArfbIfwaiqaxvWobCGccKgePVrsAzahUMH83nebCeIjP/hkKpNt2LvUCBD8z88Dk0ot/W8e7X7mIMM+OFEyJKTfOOphBJJDpgbEckDIbpCBkJtpOhtFUuw9XS7x4NZUCUNq9e3ezVvngo2mukqICq3c7DDQtwmQjnmM0S10tMQN5JB8tOz/LkrK8UvF68LwCH3mrwseqq2B6cau3GrcxdiwLl+8ebiff34+vsi9HFv1xkREr4+qd2yW6+3BxtepgTrxK8H5IWRlOq7AZ5zEvpiAAzQLwUSAsbPDNLW8U8k7GpcSa5lYWVmEfhFMr1MSLZ39ef6FU5XfHA5wwScLeR/I91sln3SH9+/ernj17NjfU/gEDBnDNXo0/3OFI7pxBlB/0I00BNgKcnckTJeX1fRDCc22BpPDyRacw26Q94EYcLouoHCOQCWemt5gZ/Ew62vdEzNOONxJxZgN8nzwWflQCLS8wCsOP6y8qhy790u28A3HgZp+TygBzIGNcqJJt/hFGk5atndaQhqliqEkB8WJUpeD4hg4dugR/ruldumi+Z+nyX6wkvJ/xKF57FRy3xuK7PZ72XSWibwvxbSyWPHw9sRq8rcLxbRWWRl4cuRZnV8rK99bLDzfMl7y5G6XlCLcMfKi3DL67l3Q9jw94KyRn0WdSXFIqZZgxKrBMKucpFZdVwfoJChAWjhMsz26xEmv6vDIfT94hunrdpBoDsrcyBQcDbinB7HVI1xhXbEy0bN26reqll16KuPDCCzdi+bgZhbOtbGfdGYS8oNBSwIphvwtQUqFiRzI96XXEfQRIpBADHL1pKowb4ckA15UzAT7MORbujwFE3fNTbYSzHlSsMUjzJcCyhwAL4DeAYUwPmLrZ+TFToxxwX4G4PD5kuFNGtC1rELcI8XQWUX9EP2CkitGkZTsbX9+WsUJOcJTk64TcaVtYiqzBl9LXMrPp0z81o+sxg1vjYDMMr8S2F3c8PuMzFm7QzvfXS9luXDqMwLeu0A85y/Nl/p0LZNNb+HB123DpeXdP6X5VL0mCgvlx5Jo0IB6vzSZI8UdPSGnWRinHrQc+OOT76kGJ/Y99T1hMHp517BB/LJfOnIXKjYLwFi+kCDNYuDRHXj78TcIwvH573eh2iOWuXrx0qcl4woQJ3HwX4Vu9VRgI2E4z+cA07YPJeASFErJj3nngTEIBMkIHk0R+q5LcBDuvcTwNnAAMAHoBBwNnAC8zHLgVIBk+wzwamEoPlMPyavUh3fDnVfpRiPIpwJlM68sl3o8IewroD5jlFuLDamaV7jCfRxxCSQWRbsMPmF/YgZxdSc44NT5N/6t1adKSajG3PiWRmYingkFTO64ayyx2RBH+4mwmTHn44b+51q1bJ11aJ8idQxJwhb29xOWfKJ5e6yXiMHzobUul5PyYJRXFXtyV2iorb1ss3q1VknZupvS4b7AkDm5plKes3I/nJbiv2zxaOl2XzqylcuFHeBCIW8FG5vbEK/QblMAdha/DYz/iDY8wN3z9JZhBUHNMPGYW8eMBeAqWdvjnHjn34FSre9tE+XnlusppH34Y0759+8KRI0cuQZFeLK94alMFUOjZbicfzCkR/FRYLoad6SiETKNEnrPC5BVHimuAD4AFABXxJ+AdgOlbAYzHcqhsBN3HQZD/A+DvUMyexJQJt9nAw+Rx7XSAAsz4VBJVFPpdC3DJthRxvwa+gp11XQxw9iCxjtoWupkP0/Ik73WAxHr9UeSsW5PVocEKYteEzFPhCCgIRlcKkHXiiSd+j1F3G+yed6e8x3DrgtEZuDcagevsY3AB9xaJPqIzvPHU7J0s2fDkYtn50lrTG+3u7Sstj8vESTy+7A7F4BIK/xKCPUoYNtoFWKKNw5vLJ4v1w7t4MI8+xUfjcLRj8qr9Az/TxXifHV9N4TLO60FzByWJf2MR7oTxLRLc1cLSLgX7kdX4h6oeHWPlyP6pLn4WaPLkV8OAcPxN3I/NmzffhqfplXb76s4g5IPygqO63oXi0+qxAAWfSkIBIy9I7FwKLNPRXxtAP5L606Sf9pMKBdPwWcSFAIn7FhRtyo6C+yUgBuBeQfOE1dhZFtMzT84ohwOjgR6A1tNwDm4lxtd8rkc5WSiPysr6kbT+Na4D86tlKk+apFRlfEMzJ2MIVpIgA/miNi70VnhxHLrr9NNP/xh+cs/dd7qXLFliZbaKlzeOSpOCPJ8kbRkqhdb94hlzNqaCMqleiA84DGkurZ85VKJ6J+MkC8dFldhXQI7471Lcn1RiJVHh3S15ZQPQpSfU9Aj/QKcoB+KBflUlockrUYZ94B1a6MNGvRpvBVfj1V5JicWTiKKansWdL+gGPjmEAosq5Jlj2/Gf3qSyyscRH88+RhZD2efAXolPnFLYcCxmZg+dQbT9lE5TIsJ1E81NMionIwHOEBQwChV5pYpC/qvgBfKCHzud/s7+YRqmpT/xMDAJIJn9BISWMwjreAawA6CSsJ+YTuunedOteWqd6Me8GYfEcLaVfqS7kD/fCmQ52oaakOC/Wmbw0MbxbdIynB1Q7+qCOayUKglNZWQV/iqAgmSdddZZX1944YWctt333f+AH1dCrLMO7yiXDU6UtTjw6rB5t/jmLrJ7Ilfc3B8051EtpBHdVYWlEZWDqMDmvsoql9LKfpKTm4xbjh1EjrwOk/0qfFzy8xqFQEFGBvC1FAnDSRlnFko/LlJ6i7DPKMBeB19atHC8S3IVoyCss9pHRMgOPNp49ZiB1uH9WjKofNeunYW0XHLJxd/gyyab7dmDMwJnDyoPBUrbz7bTXovAI+4PeMxaCnC0vwjYClDYqCisCIVP86LbCebLMMZh/kzDtOuBY5EnP37AEykYNcoJk7MXhXcO4nCT/RGgSkihZ34E82ZZ9GM4QTvLqVsmGIl3pUX+gnwfZHmwM20wUp6oqfHUDJamPn7Mj6T50tQ81TQRGvuHDN9XYiXJaDKXdnYkhYdfI8RHTqKL8PfLb+OYtPuHUz+IeP3NI32XXXqJ+55Tero+v+M9Wf/qOeZ7mFuOu19c2xZK5ZcfSXZijDQ/Pk34QWo3TqVgmF7D/Vq8p14gZYVjsDTCu+i4dW51G4OTeuxVv8V+sm1vkUzMLJWQ4dI8PP7ejbXbNrwDvBnmdvGvnIFqkZabXxcuIVo3zpLWvdvLuvQN5juFnXvhu1Y+vz87Nyfv2GOPTce/TO3ALPgtElTiGLsYJkdmKgjbyXazzYqgnQSB4smW2RfAPhl2ziSXAWcB3QEKX31pNSK+DPBrgXwLkHyvNXMxI4RRSTh7UaiPh/14mFcDo4CG9jeYY46tn0Z+2XsqE3G0HWrCqxY1tNxaieGItj24BFRi+0mcJam0TUL7lTE7ArUiU2gSXP+ywvFYaiVhNol89dVXT8Mfd54LP3wZZLYMHz7MPfHhB+X2277G15b+Im069pOtu7eK619n4VZguURf0kdi8a1eN/YBEGMzCTBrtydLCrdeLyW7u+JeVTn2FShqKwT+jUvxwP0w3CQ6Bi+ZrsBd1X+gKAfFdoQoYsZptxE1wyXIjYVizd4p7U/vLxvKFkn/mHEyNK6jfP/jLOl7yOCqnOzdMm3atAh8X/gZPD3/CU/Oi7A5h9YJZ5USQDfqVBIqCz+RQ0XZI4FP5DNnE47OWA2aDywMhZVCC82WDKAFoJ1NZcwFtgHcw4BZMhvpWTbTm4eHtO+JEIczjh4cMA3vWh0OHAyAKeYLjjw6Zr+x/pwh2c4tAGf+2cAslMk2By0TeSLYnICBweYuF/nBtjoHDNbjR8TbofHhbhAh3TAkSAM4AKtisAzmzRXLV8ifJ3emPnA3GrEx+0yoECtLBlNJWFlqOJUEC31phqfOzbGxjbvpppuufeyxxyDF4l24aJG7f79+7qUbcqXvW+twclQqXZLiZPW2NbjYeLZhbeTVfSTqkFZ4Eo6TK7ABrQbKpWjT1VJdeBBKgWziNq/gjzxl+mPYrM9F1ja1Q/93RVF4kCjNsByLxNINX5CXzH/hzivKmFciaU+uk6zH8T8kbU6U6aPvtzokpbkKiwrzr7ryKg/+ZLTZK6+8Mv2iiy56D8pRCuXgPoLX2DmLsDM4i1DQCTOboH5OgYB3cLL5xRmFaQMEf/KtGUCTfcJ8ixHPKATshhCPvA48v7C9f9dgmiDlsQwwxvQV+40KQuFjmTQDhPQMp+Qxzm8I4Qjae/vrG+83BfzBHmT4PhOZhoaTcRxNyXQVGgoRhYmK48Z/oU/mN6Xef//9jgP6969es3at9OnY0b3mIo+c9sZKWby1WDq27iy5F70m+a9cIJXPLsXLJf0kHJ/iwUqeax90UTSeiGNvgT2DVBXgRayZ+PLt3cjeQRNux1dtx0JVUSz3ImazjrTVcOf1wf58AT5QlyCbpEDOTr3VenDM9a62zVuy3gVfzPiiCsrR6uqrr/4FyvEx/HhfiorBdlBQKThGIWBqmwMjNPz2SraQkWcsk4JHosAzbyribwhxtY8Yr5Zi/SZyEA+mscvjYMZyWWfWH0z8LQWpG/t2j4S8kMQMlDqyB4vbIKWumwHyJ69Y96C0L3wJmlEQzz0WGiRuUC+boexEKgMbQhOSbJYLsVhq8Y88o3fs2NH+/PPPvwP//ZeOsOp58+aHDRo00JVXUiWPf7RK/jYLx+vJsdLJ96HsfPnv+L4uJqLru0hYP0TH931dVnPxbrtCrI24ePr9C7is/T3GwDbYrF9bowj/vhkHleNwYfsGKBFWKnhvvebKiSXJeJ89CX+nsKbNa9iGvC2xz7aSddnLJTU5Bc9SKgvwRzle/C118kknnbQVf/rzJE7htmL2K8LsV4ANejH2IFx+UEmoIBRSMxCgY35XeBCvXmTzkH2h/aEzEodntdcrr/pEcpTH6M4ym6S8+tTpzxpHmbNf9bM1nEpCqJJEQfhicP2dSpIIJYnCH9J0vvTSS2/+/PPPWyMe/jRzuvuYoyeYkefTBVvl/A93yO6wZcjlaun0Ynsp2L5Zsi/vJHIIluf4pyiZkYED00eRFHTMXVhJH4plUxLGRMjr9++I4O/X8HI74p+GDy5Ykoac8eqbbKhA+C5LLhjjkdTSWfLmFU/KxqqdvsLi4uI7br/dheskCXhuswv7pSfw5cQNqHcp6p2PUrisonLoBp2KQaUwitIUwou8Q/Qn4oBO8/tVpXvvvVfTO0dBfW+bph9KEo5/jy06/PDDf4aidFmxYkXylCnvSnhElL9Ht66uPh3TXBcdnCYd8CWRj7GyyWv/lZTNghwuwPvszfDm3y+4KjL1Y3H3mSDRJz4g7syBWElF4itulXiHPUziU9pJcuF6iZn3gZS37i3+5AwpLijHFscvA1tFyePHpcutx+FqfGG1PPfWS1b/AQNKr736msipU6fGnXzyydufAbVu3Xod/gSoAidwVA7dkFM5uASiYnBpYpQkpBzgxP8ANcoMQj45llrOmUQ37Wbjbs8kkfimVMv77rvv3Iceeuhwps3s0Mn73DNPu8eOGeWGwkhOSbF8s+FHmfHzLPn0xX/JztlrBfOERB1zi+zoeTQKw9SA72A1w3MOPg2vwJuJfrwLImuX408FLjHru8yrp8ixB/eVw7vGydCeafjEqRkLvJMmTZIrr7yS7TYeV1111ZKJEydOxr/ZbsfMUY6Zg6dVnDm496ByEDpz0DQX/WCGKMSBhnEASsL3FyKAGCAeSAT4b6NtAX5VsB+U4zCY44ET3nvvvRfwN20crbnOtk46+VQv9ii+0uJibmStZatX4N82a8Jq4oyw0v/6sTXg4fmW3DjTkiu+suSab4w97Z7Z1sUvL7EuvO1Jk9fAYaOt7Tt3MRtctfJ6ly1bXnnXXXdzH8FZwMLbjz5MGh8h/FzgOCjvETB5UbAn0B5IB1oACUAcEAXwmnijDSqoR4j+1zgAAdqTkrRBWCegN5RkCECBPCorK+sKjOCf4P9EOGIb4e7dv5/vueef8553xtlmWQOl8eMUzLrqsvNN+Atvf2xt3V1i7S6osnbmV1rZxV6rhM+UbUJ+Rglu+usNvhkzvqi49LLLOQuYtDRxSrVs8eLF9yL6icDRqMsomAMB3mbNBOoqRzT8QsrxvybMaG+TjIYQJm68nUst3bhzycUTLj4ZjcGoHY+9O/0i1q5d22X69OkjZsyYMRhIgV+A7r//fv+wYUMlOyfXevjB+2Txsl9ck1+ZJEeOO8rlxotRZaX4bm9JiZVfUIiPWldaeCBpPfzww6wDYQjvqFRjr7EMm/HvRo0atQiehTip4nssupzSJRWPqLnn4HKKikYl1SUWlSxEfzIONOV+sEkUhPwLoiQUVh4BE1QS7kuiIKN8qBgDQaV/BD6A3fqnn37qgf9Z74Wn2R2+nzMnJS8/n8rWYEpPS/OOGTt22yGHHLIMH11YhLcd1yATbr59UM5yKCdPqOoqhm7IqRgG6ACeWoXof5ADTaYg5KVDSTiDEDqzGGWAW2eUSChKDJ5c81iYysC4MVj6JOHjD6nbt29vjSVW6u7du1vgT3oS8D8ksYjLY+RwmHgR0G1Bwapx+lSOmaIIFwx34w3ALT169NjYtWvXrciL+xyzwYZiVEIxqBTcj3C20BlDZw2zrIN/YObgCAVqUl6hvBDtIwf+K2cQbautJKogajoVRZWFswoVhbNKFBoNXTHKwrhMR2Uysw8Uh3HCgTB8UNoFBfED1XigV4kr9yr8OhP4oUh82akCSsS9SF2l4OxAOBVDlQPVME+iz0H4UwAVjXX5/05cSv7ZBoS6dWIfxQGLgaPQTzzYYX816jJ4n5YuqFC9ya44K+0Ehd65vufoToGmEJfbyy0qAJWGSkGEYbZAUJj52wEognagM18/4lhIx1u05usjiF8FRWPeVAI1aWeZdRVD66TKomWsRtzJAJWPdQ/RH88B9hXlYyvQqErhbJoKgNOvSez2EoXCRVAx1a6mLq1oUiE4UtOuoFvhghIwnak/lAAHubxyZPEbXRRuQjfWZmllu512VQIyupZiUKnhZ4j1buxRSfMOmX9+DhwwBVFWQOBUIWhS4J1utasiOE0No8l6K3T0oKnCrqYqi9PUMKcZUJZgymDXmXUJ0Z+PAxzBOPA1CR1wBdFWOBTFqSSsjyqA0wymHJqVmrWWWvCkAtRVGo2jyvG7iqEZh8z/XQ78YQpClnP5AkOVIpgSaHgws26vqfCbrJl9EKhiBMxgM0bdjEPu/10OUPD+FGQrS91Zo65isK7OOqudykAKZjpnEoYbd0gxDL9CP3vhgArYXqIduGBbUVigKkswJWF43bo7lYP23yCkFGRbiBrCgbpC1pC0BySuQ2FYnirL75WtisFXdVVpfi9+KCzEgT1ygEeoTUIQbM4A3IBTSCnYKqy08xVMPtgx5cMeOIVwpOOrodxEk/QESfOh6Qw3kfhjK5SJD7uWra+Zmnjw1oMBLrdIWicm0TCto7MdNbF/jc82aDjDTBpa4M882b5apyx2fKYh1aqfM01NsPndY1tNBjXlKH80PwYFXnO182Uc5uXsh1o8dJavfeJIywHH2U+BvnOkq5uf8pKvCCBagFdaB9ZTee/kpbaDJsF8mZ5xg7XD8NgOD8ZbZ3nI4g8mu6INrkXddHBrY4PmFSQ+GRiUNC5MFabfxKtbXl133QTBwuH3e3Wod9l1ywrmDla+M97v1cUZj/Zgcevr58xL06ipYXDvrS/3yJs91U/z3lt43bo40+3NvsfO3FvCPYWTEdB2jgZ9EWckwKsdbDy1mDMCP23Dz6RBov4AAAufSURBVLTwn1Ivtv3fgpvx2FEdYJwCLIDfV3CnwX4yoEeyzIdPUDci/GOYhhAPzpolFexj4TkB4Gdt1gAfIGwt/LVu7eF3AtAd4NP1b4GPEacccYbCPhyYBjf/DWog7IcBfIpOYvm8aMlP2cxDeB/YD7f9P2E5sLMd/ErJOQD/RFO/Rki+sE7HA4cCzAfvGMs/EWcnwlrCfhpQt61bEP4h/AOEuPyMEOOxrCNgjAFaAfz4wwyEfQHTEMJZlzMAjvq8PUAiDzcjHt+JgWFG6FT4/QXABwJMnfj0lfHOB3hN5x3E4+d1KOxnAYnAi0AycC7APvuS4TDZVvJlMPBvuNfDzTYPAXhhlLKnvJyF8MUIJ69HALwnxzJY5jKEzYPJdvJqyZkAHyRrO3gFKRdx3kV4a9iHAky3FGgLrEbYboTB+BMsuVERMxLAfBXYE52JgFg7kN955fsWbDSZcK3t/5TtPtV21zU+tcPNd2lpJyHSM3Ujwn1HTWit/OtGu9VOP9UOONF2v1I3ou2+yQ5/0hH+H0c5g2z/BQ6/4fDb4oiv1q/svI5RjzrmN3Y4hYZtVB6nwE6BDEbPMy4JgYcGiwA/zZdCxnh8qY1UBlDZ6HcaPUAUeA5e9NO2UQjpPg8gvWy7zYfe4P7a+FrWSNufQhyMLrPDXw4WCL+77HC+sxOM1tnhGQj8K8AvQFL+3gLa2GGGd7Q3hMw6siEJ9hYXWmpGNcQjsz4AegMTgR+B+wCOZhz5OXqTOBJzxFBKtS1LbDPdNt+ESQHk9XiOahx5SX6Ajef9K46iVwPsuHOAdkBH4FmAHXkRDCpeAXADwDqNAzKAlwASR0PSqhpDOKqTqGQ/AyyffJsJkDSc9uNQRj+0hxfo2tIDRDvLZns/A5j+EeBtIBPgTKbCzBGQNAV4F+CISeH9BSAhGzMSsq1Ukn8DHHFnAI8B+OSLHAFMBK5AnJmoC+NovozHfqEA6+wFq5mxaG4FNgEUKtaTdE2NYUb89rCvB861/e6xzU62OZumoz9T4KwCNtAfRDfpZmANEAOwHV8DJOXlFbB/B3CQegC4wDa1b76AexLANkQCmwASy6LcuADOViw3C2Cd/DT/dIROOhogPe6sHNx/Mb6W9U+YfJNPX3f91vYfw/iwP2u7TafAzldfydQAwa2zz5123GkwKVgBgpuv/3KqJQ0JBDgs8OdrwjuAAqA5g2AuB0gUcLrZKQGCex7Apch3AOkfDIR5i3FZ1m22+wPbbWaqQAYOC8IftuNcaqfhzFq3rVRO5n+pHZdKV4vg/6gd9ioDYL/Jdt9YK2JNGNdWFChDsM+043I2GWnbuRwmXcJIMEuB1YDWRWeGq+HXDegPjAG4ZOWMqf2zAXYqNxWN+QR4CTvrobw2igT3OIBkZmGYVHrSfXb6SNhN3rabb7Ma0P2nJlTUCCjMuwHS9awwTI6KNO+g5x6IjO1qx/vEjkPGKu2CRZcAZIgRIpjDAI3HPN4HDrbzUUX91HbrX53xVVrtwEzYuZRYYcehUu0ElDTvz+1wKhTDqVQjgUqgGmgOqJDyX6HCgRIb2vkRcLNsUw87v//ATdJyaM8BzAwAM6AssCtfJthpo+BnBA7mmQDpLTvspRqnxe/rbgJoLgA4m7MvnDx8DW7SKOBjIB84BiA9AKj9OkfaOSY0+M8cO14agnMdUbSNH9jhrRBGPpL4x0IceDTOhXYcHSzVn3Fp5z7QtINmY5IZARozQ0deXtueaZucmkmcBkkdagz5J0yuIdn5nNavBPKAHQDpoBpDFsKsBKhgK4EcgMQ1B4Wam1Z21CD4cQTm9ExQQZiHUSiYOt2z7TwK5eivoxAFkaOpxqGbAl0KcOq2AM4sswESlwTMdwXymYl8psDOmY6DQTuAxLy4bGTb1gCFiGdGbJYNNzvWuGHVNItgrwDY1tVANkBi+Rpf426nH8iE1Vilp22yPJIZsWGWAT6A5e0E+LoxiWndxlZTHq3nA0cDDwNfAqShwDCgGmBbSWxXBsAlzJMAw9jHnHFPBjYCJPZBElAELAdIiYBRIJjkZRrAcCpuDyALuAR8mg6TpG1eCjv7hEtFysE24L+HHB3OzqTgkPqyBTCpCDS/BUjaefRrYXx+nVLpLgaUyUwaIPgbwVIzEAAL/DiKbwVIzOd4Y7OsuXXiJagb4TryPkM/uMfaad7QOE4TYUPt8M/s+Afb7jyYHHm52U0BOHpyZiG6aR6wc9RXfnC24shOofgNwb/uUkhHba7XA4R4HQGWTTKKAnMdwNktsLSBXRXCpIXbDJYwTwKUuJTKZASYy9UT5vNaIOwZQGDWdfifbce/z06v/A+k1bh2uPL6daTjzMwZl/ygErF8zrhc6nFAo2LUIvgZWajl2QgOw5RGyKduFqws6myWWRmwlwO7AG6WOCWygW0AjmjsOHibI7gBcJM2md+azWUc7EWIcztM5svRnqNM4G8AkJajFwt8DEYX4GmACslRaznCObX/BDvTDYb9LZiTga7APXDz+JLrc1XWTbCT1N0BcRgeZYN/Yvkm7DqimZEafnMR7xP4TwBIa4Ey+FPQvoJ9HPAG7BNhciS/C+A3gEfBpKK2ACgUd8NkONvKUf5l5MGBgkqix7sfwp8j+kT4kUecYTnqco9DoeL/sXOpwtmLsxxn5K0A+4CzU12ybA8ORpypI4EpiKuD00q4qXCcHV4DlJg3+2UTPVAe3wZl/gPpBml65SX3KMpLysHPiD8FZgZA2gE32/oR7GcANwF3AM0BzjCs2x0Ip+yQP+TTK0jDZTeMP8FRLir0u4SK6qjYBnYSR3Ljx4SwtwNImwAPQAbT/3KA9Ijt3tMRLwWeHcg0OvJR8OsS17TaUYzL/YCOrs64VCyGv2d7Hm+7n3VGctgpnIz/kO13Ld0kuEc74n1X42v828F/riNMrbNg4R5ljHrUMQvgjrHzDswi8OO+4dU6cenkAHSbo9xBdpzZdh5MRxieO+K57fBkhHEZSOrtCL+rxst6346ne8xzbP8XbH/t+y9s/5G2v+5tbO+A8ZYd/rTtc5ntHm+7OQtzNdDTdgcz2thpAjJGd2NQLSY1RobMAy0wmgyTa8kxQA48KAhO/7Hwz67j3xl+FOi58F+P+Bm2m6MGRzjOFBw1diP8R5iGHPlyBOUozdF4HTAd8bjcYeezcFjNhnc83O2APIAP1VbAZL2HwGgNfG2n6w97B6AcYPkEBWMlwlcjfh/Yudbmg67tMJkHyzoc4GywHv7cDJtRHybTHg30ArwAj7i/gcl0bWEMAqoBjopaFnn0PdwBQlx41YyUsB+GgEMAziKbAdZ9E0xDCE+GZTSgdQmkrYlR+xfxWX/GZyFfaVkwKYTDANZ5E9zaJvJnMLAQ/msc8UfAjzzgQ2GuANi2DKAuLznDs68HIKwjQF7y2RgHwFEA+/JrgPwiX8kbgrLAwZEz7HdIQ/d/D5FRwWpbX3/EY0ftNyEfj2bitKsfTZYF1Kov/Zxx6trrhtdNr/HVH2agHhqmZt281P/3TOaredeNx7KChe8pft306tb4atbXX+OpWTe9+quJ8Fq83lt8TXcgzFpC0dgF2g2lYHA0otYb+h1/Moowlwsd8WoS/vpbKz/1RnyWxTZx9KVp8oEZIMTRMjROIC9Heh/qC2cgbiC9bdH6aV4mvkZy5BPIm2HwZ50MP2Aq77UsDWNUJ9XKwxlAu7MsOH/TZmeZzj6om4/Tbedp9ovq78inFk/hrzyo6699oe3TeJqlmnvkJfI2y2dEVNlhnnXpd/lTN3LIHeJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAiAMhDoQ4EOJAY3Hg/wB3cRq/m/+84QAAAABJRU5ErkJggg=="},{"id":"maaamet.ee-orto","name":"Estonia Ortho (Maaamet)","type":"tms","template":"http://kaart.maakaart.ee/orto/{zoom}/{x}/{y}.jpeg","scaleExtent":[14,20],"polygon":[[[21.6940073,57.5025466],[21.6940073,59.8274564],[28.2110546,59.8274564],[28.2110546,57.5025466],[21.6940073,57.5025466]]],"terms_text":"Maa-Ameti ortofoto"},{"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","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://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","scaleExtent":[0,17],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"http://www.fomi.hu/","terms_text":"Földmérési és Távérzékelési Intézet"},{"id":"FR-BAN","name":"FR-BAN","type":"tms","template":"http://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"https://wiki.openstreetmap.org/wiki/WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)","terms_text":"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL","description":"French address registry or Base Adresses Nationale"},{"id":"FR-Cadastre","name":"FR-Cadastre","type":"tms","template":"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png","scaleExtent":[12,20],"polygon":[[[8.3247852,49.0891892],[6.1566882,49.6167369],[4.8666714,50.2126152],[2.4937064,51.1761675],[1.3121526,50.9324682],[1.2659981,50.1877492],[0.1121369,49.8258592],[-0.3494075,49.4312336],[-1.0232625,49.4852345],[-1.3278818,49.7901162],[-2.1032765,49.7901162],[-1.6232703,48.7420657],[-3.1002126,48.9728514],[-5.1125465,48.6811558],[-5.3525496,48.4367783],[-4.5984193,47.7194959],[-2.555398,47.0232784],[-2.4738077,46.6638823],[-1.6676954,46.1055717],[-1.334807,45.5141125],[-1.4914604,44.1627003],[-1.9940567,43.3708146],[-0.956228,42.7364747],[2.2029487,42.2841894],[3.2342502,42.5444129],[3.2407774,43.1140543],[4.0436261,43.3280964],[6.4325902,42.808345],[7.6270723,43.5934102],[7.8163619,44.1720643],[7.0396221,44.41967],[7.268075,45.4958141],[7.1244761,46.2140775],[6.5631347,46.771283],[7.6571492,47.59128],[7.6527839,47.5941813],[7.6224698,47.5776739],[7.6047297,47.578221],[7.5877054,47.5901532],[7.521558,47.65161],[7.503992,47.70235],[7.520958,47.77685],[7.557124,47.84839],[7.549463,47.879205],[7.574615,47.93028],[7.613179,47.96804],[7.611904,47.9871],[7.5612401,48.0383618],[7.574915,48.1258],[7.595338,48.15977],[7.633047,48.19717],[7.662748,48.22473],[7.684659,48.30305],[7.763463,48.49158],[7.8004602,48.5125977],[7.799582,48.5878],[7.834088,48.64439],[7.9121073,48.6889897],[7.9672295,48.7571585],[8.020692,48.78879],[8.043024,48.7956],[8.0864658,48.8130551],[8.1364418,48.8978239],[8.1970586,48.96021],[8.2816129,48.9948995],[8.2996723,49.025966],[8.3124269,49.0599642],[8.3247852,49.0891892]],[[9.3609615,43.1345098],[8.4393174,42.48439],[8.4836272,41.8175373],[8.8469677,41.3768281],[9.2058772,41.3136241],[9.48946,41.5461776],[9.6356823,42.1994563],[9.6046655,42.901254],[9.3609615,43.1345098]]],"terms_url":"http://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 : 2015","description":"French land registry","icon":"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{"id":"Freemap.sk-Car","name":"Freemap.sk Car","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/A/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Cyclo","name":"Freemap.sk Cyclo","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/C/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Hiking","name":"Freemap.sk Hiking","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/T/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Freemap.sk-Ski","name":"Freemap.sk Ski","type":"tms","template":"http://t{switch:1,2,3,4}.freemap.sk/K/{zoom}/{x}/{y}.jpeg","scaleExtent":[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":"http://www.freemap.sk/index.php?c=core.download&filename=/JOSM/freemap.png"},{"id":"Geoportal-PL-aerial_image","name":"Geoportal.gov.pl (Orthophotomap)","type":"tms","template":"http://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}","scaleExtent":[6,24],"polygon":[[[15.9751041,54.3709213],[16.311164,54.5561775],[17.1391878,54.7845723],[18.3448458,54.9022727],[19.6613689,54.4737213],[20.2815206,54.4213456],[21.4663914,54.3406369],[22.7759855,54.3769755],[22.8625989,54.4233613],[23.2956657,54.2678633],[23.5347186,54.0955258],[23.5208604,53.9775182],[23.7183389,53.4629603],[23.9296755,53.1856735],[23.9296755,52.6887269],[23.732197,52.6067497],[23.5658994,52.5878101],[23.2090523,52.3302642],[23.1951942,52.2370089],[23.5035377,52.1860596],[23.6906226,52.0030113],[23.5970802,51.739903],[23.6629063,51.3888562],[23.9366046,50.9827781],[24.1687284,50.8604752],[24.0197534,50.8035823],[24.1098313,50.6610467],[24.0578633,50.4188439],[23.6178674,50.3083403],[22.6824431,49.5163532],[22.7378756,49.2094935],[22.9041733,49.0780441],[22.8625989,48.9940062],[22.6096878,49.0371785],[22.0761495,49.2004392],[21.8474902,49.3721872],[21.3763135,49.4488281],[21.1026153,49.3721872],[20.9120659,49.3022043],[20.6452967,49.3902311],[20.1845136,49.3315641],[20.1186875,49.2004392],[19.9419962,49.1302123],[19.765305,49.2117568],[19.7479823,49.3992506],[19.6024718,49.4150307],[19.5089294,49.5815389],[19.4292451,49.5905232],[19.2317666,49.4150307],[18.9961783,49.387976],[18.9338167,49.4916048],[18.8368097,49.4938552],[18.8021643,49.6623381],[18.6427958,49.7094091],[18.521537,49.8994693],[18.0815412,50.0109209],[17.8875272,49.9886512],[17.7385522,50.0687739],[17.6068999,50.1709584],[17.7454813,50.2153184],[17.710836,50.3017019],[17.4163505,50.2640668],[16.9486384,50.4453265],[16.8932058,50.4033889],[17.0006064,50.3105529],[17.017929,50.2241854],[16.8135215,50.186489],[16.6402948,50.0976742],[16.4324227,50.2862087],[16.1968344,50.4276731],[16.4220291,50.5885165],[16.3388803,50.6632429],[16.2280152,50.6368824],[16.0547884,50.6127057],[15.5732181,50.7641544],[15.2683391,50.8976368],[15.2440873,50.980597],[15.0292862,51.0133036],[15.0015699,50.8582883],[14.8110205,50.8735944],[14.956531,51.0721176],[15.0188926,51.2914636],[14.9392083,51.4601459],[14.7209426,51.5571799],[14.7521234,51.6260562],[14.5996839,51.8427626],[14.70362,52.0733396],[14.5581095,52.2497371],[14.5165351,52.425436],[14.6031485,52.5878101],[14.1146491,52.8208272],[14.152759,52.9733951],[14.3502374,53.0734212],[14.4229927,53.2665624],[14.1977979,53.8734759],[14.2220497,53.9958517],[15.9751041,54.3709213]]],"terms_text":"Copyright © Główny Urząd Geodezji i Kartografii.","best":true,"icon":"http://i.imgur.com/aFlvMpM.png"},{"id":"IBGE_DF_Addresses","name":"IBGE Distrito Federal","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g","scaleExtent":[0,20],"polygon":[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],"description":"Addresses data from IBGE","overlay":true},{"id":"IBGE_Setores_Rurais","name":"IBGE Mapa de Setores Rurais","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,14],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"IBGE_Setores_Urbanos","name":"IBGE Mapa de Setores Urbanos","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,19],"polygon":[[[-29.3325,2.335959],[-28.72472,2.031551],[-27.76041,-8.937033],[-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.838943],[-66.52331,-9.985873],[-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.669083],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.587397],[-73.29207,-9.454149],[-73.0625,-9.017267],[-73.61432,-8.40982],[-74.09056,-7.527548],[-74.03652,-7.27885],[-73.84718,-7.238285],[-73.78618,-6.774872],[-73.22362,-6.430106],[-73.33719,-6.029736],[-72.93016,-5.038711],[-71.93973,-4.425027],[-70.96802,-4.248294],[-70.79598,-4.064931],[-70.02393,-4.167345],[-69.51025,-1.134089],[-69.70776,-0.567619],[-70.13645,-0.226161],[-70.14083,0.5844],[-69.26594,0.806502],[-69.34226,0.968924],[-69.92481,1.015705],[-69.92343,1.773851],[-68.38511,1.82943],[-68.24848,2.119808],[-67.94571,1.948424],[-67.37696,2.327468],[-67.05751,1.858336],[-67.00579,1.291603],[-66.79967,1.314684],[-66.28683,0.857709],[-65.67671,1.111146],[-65.42494,0.966549],[-65.15671,1.24203],[-64.27483,1.601591],[-64.0486,2.065137],[-63.47236,2.279358],[-64.13446,2.433909],[-64.10005,2.723778],[-64.32628,3.118275],[-64.28142,3.541983],[-64.88451,4.117671],[-64.88064,4.342461],[-64.13653,4.223152],[-63.95465,4.021316],[-63.17706,4.048301],[-62.96093,3.763658],[-62.82024,4.106019],[-62.49922,4.270815],[-61.91181,4.26284],[-61.35393,4.630097],[-61.04904,4.623115],[-60.70452,4.969851],[-60.78709,5.296764],[-60.22457,5.371207],[-59.89857,5.107541],[-59.97549,4.603025],[-59.59676,4.439875],[-59.41942,3.96994],[-59.71017,3.542008],[-59.88955,2.72301],[-59.63006,2.316332],[-59.63382,1.966581],[-59.18812,1.478079],[-58.80545,1.320732],[-58.35933,1.689932],[-57.6,1.803907],[-57.39854,2.065119],[-57.12392,2.128758],[-56.02925,1.949445],[-56.23884,2.263348],[-55.98195,2.628657],[-55.64816,2.519953],[-54.93958,2.682515],[-54.24988,2.25056],[-53.73937,2.473731],[-52.98578,2.280494],[-52.65712,2.564069],[-52.41739,3.22121],[-51.73983,4.119158],[-51.7246,4.556867],[-51.0112,5.522895],[-43.48209,5.335832],[-29.3325,2.335959]]]},{"id":"Haiti-Drone","name":"Imagerie Drone (Haiti)","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}","polygon":[[[-72.1547401,19.6878969],[-72.162234,19.689011],[-72.164995,19.6932445],[-72.1657838,19.6979977],[-72.161603,19.7035677],[-72.1487449,19.7028993],[-72.1477194,19.7026765],[-72.1485082,19.7001514],[-72.1436963,19.7011169],[-72.1410143,19.7000029],[-72.139476,19.6973664],[-72.1382533,19.6927617],[-72.1386872,19.6923161],[-72.1380561,19.6896423],[-72.1385294,19.6894938],[-72.1388055,19.6901251],[-72.1388844,19.6876741],[-72.1378195,19.6872656],[-72.13778,19.6850003],[-72.1369517,19.6855945],[-72.136794,19.6840719],[-72.135729,19.6835148],[-72.1355713,19.6740817],[-72.1366362,19.6708133],[-72.1487843,19.6710733],[-72.1534779,19.6763843],[-72.1530835,19.6769414],[-72.1533251,19.6769768],[-72.1532807,19.6796525],[-72.1523834,19.6797175],[-72.1522749,19.6803488],[-72.1519101,19.6803395],[-72.1518608,19.6805067],[-72.1528173,19.6806552],[-72.1522299,19.6833011],[-72.1507801,19.6831499],[-72.1504457,19.6847862],[-72.1508591,19.6843492],[-72.1530087,19.6849898],[-72.1546258,19.6854354],[-72.1543103,19.6870694],[-72.1547244,19.6868466],[-72.1548501,19.6877564],[-72.1545814,19.6877982],[-72.1547401,19.6878969]],[[-72.1310601,19.6718929],[-72.1259842,19.6772765],[-72.1255379,19.6776179],[-72.1216891,19.6776442],[-72.1149677,19.672602],[-72.1152745,19.6687152],[-72.1198205,19.6627535],[-72.1227768,19.6625696],[-72.1248965,19.662701],[-72.1285779,19.6645394],[-72.1308091,19.6661677],[-72.1316737,19.668794],[-72.1315621,19.671],[-72.1310601,19.6718929]],[[-71.845795,19.6709758],[-71.8429354,19.6759525],[-71.8410027,19.6759525],[-71.8380249,19.6755254],[-71.8378671,19.6745041],[-71.8390504,19.6743927],[-71.8390109,19.6741141],[-71.8398392,19.673947],[-71.8389123,19.6736127],[-71.8380249,19.67209],[-71.8380052,19.6726285],[-71.8376699,19.6727214],[-71.8376305,19.672545],[-71.8354414,19.6732135],[-71.835333,19.6729999],[-71.8331242,19.6734642],[-71.8326706,19.6716815],[-71.8321579,19.67209],[-71.8307183,19.6694902],[-71.8306009,19.6697594],[-71.8302174,19.6698907],[-71.8291833,19.6672095],[-71.8290749,19.6672095],[-71.8289122,19.6667916],[-71.8289516,19.6666199],[-71.8288333,19.6663506],[-71.8285572,19.6664759],[-71.8288678,19.6672466],[-71.8287593,19.6674138],[-71.8277979,19.6678177],[-71.8277112,19.6678586],[-71.8278263,19.6679637],[-71.8271831,19.6681212],[-71.8271761,19.6680917],[-71.8264405,19.6683921],[-71.8264074,19.6683231],[-71.8261954,19.6684253],[-71.8261806,19.6683556],[-71.8258946,19.6684206],[-71.8258897,19.6686574],[-71.8251551,19.6687549],[-71.8254509,19.6691588],[-71.8229332,19.6695739],[-71.822713,19.6696658],[-71.8227688,19.6697577],[-71.8201751,19.6709855],[-71.8198474,19.6704537],[-71.8197985,19.6706014],[-71.8194674,19.6707557],[-71.8182472,19.6713433],[-71.8181426,19.6711431],[-71.8175813,19.6714254],[-71.816959,19.6707672],[-71.8176388,19.6718965],[-71.8171403,19.6720376],[-71.8158225,19.6718045],[-71.8138354,19.6711874],[-71.8123259,19.6706982],[-71.8121759,19.6704258],[-71.8124304,19.6701467],[-71.8119184,19.6700141],[-71.8118765,19.6705828],[-71.811169,19.6703483],[-71.8095938,19.6698516],[-71.8077992,19.6692829],[-71.8056028,19.668612],[-71.8051443,19.6668942],[-71.8051196,19.6652322],[-71.8052315,19.661979],[-71.8065603,19.6523921],[-71.8073412,19.6482946],[-71.8099686,19.6468292],[-71.8147517,19.6454502],[-71.8147726,19.6455619],[-71.8150027,19.6455093],[-71.8149469,19.6453846],[-71.8159928,19.6450234],[-71.8158882,19.6448855],[-71.8165854,19.6446097],[-71.8190119,19.643802],[-71.8211524,19.643454],[-71.8221564,19.6433292],[-71.8269046,19.643211],[-71.8280481,19.6432241],[-71.8304466,19.6440778],[-71.8306419,19.6448592],[-71.8295263,19.6450365],[-71.8296064,19.6456111],[-71.8299411,19.6455651],[-71.8303699,19.6451744],[-71.830471,19.6453452],[-71.8308092,19.6451974],[-71.8310184,19.6451088],[-71.8312519,19.6458541],[-71.8311125,19.6458245],[-71.831367,19.6465862],[-71.8328939,19.646189],[-71.8344566,19.6457062],[-71.8344664,19.6463052],[-71.834215,19.6461938],[-71.8342002,19.6465513],[-71.8346702,19.6463],[-71.8349118,19.6463905],[-71.8347984,19.6462187],[-71.8354393,19.6458496],[-71.8355034,19.6458032],[-71.8364747,19.6461328],[-71.8376382,19.6472658],[-71.8379143,19.647888],[-71.8390483,19.6508039],[-71.8456942,19.6696203],[-71.845795,19.6709758]],[[-72.098878,18.54843],[-72.096993,18.5501994],[-72.0972888,18.5503209],[-72.0968451,18.5503489],[-72.0955632,18.551854],[-72.0956428,18.5526742],[-72.0959914,18.5533748],[-72.0962145,18.553203],[-72.0962842,18.5535665],[-72.0964446,18.5535533],[-72.0965352,18.5539764],[-72.0965056,18.554173],[-72.0966085,18.5541747],[-72.0965178,18.5542127],[-72.0968769,18.5546588],[-72.0979018,18.5552141],[-72.1006211,18.5555875],[-72.1014926,18.5556206],[-72.1024339,18.5555016],[-72.103417,18.5543515],[-72.1034798,18.5516215],[-72.1030789,18.5516149],[-72.1033752,18.5515224],[-72.1035042,18.5515224],[-72.1035239,18.5502417],[-72.1028701,18.5503062],[-72.1029015,18.55025],[-72.1028457,18.5501773],[-72.1035081,18.5500252],[-72.103491,18.5497396],[-72.1035181,18.5497361],[-72.1035398,18.5489039],[-72.1034317,18.5487056],[-72.102717,18.5481437],[-72.1025601,18.5481536],[-72.10229,18.5482751],[-72.1022891,18.5482569],[-72.1025201,18.5481396],[-72.1023388,18.5481321],[-72.0999082,18.5480901],[-72.09907,18.5483799],[-72.098878,18.54843]],[[-72.2542503,18.568262],[-72.2560252,18.5717765],[-72.2557886,18.5748049],[-72.2535009,18.5755526],[-72.2522782,18.5755526],[-72.2499906,18.5740945],[-72.2473874,18.5698323],[-72.2460069,18.566729],[-72.2458492,18.5629527],[-72.2479396,18.5625414],[-72.2501483,18.5628031],[-72.2519232,18.5650839],[-72.2542503,18.568262]],[[-72.303145,18.5332749],[-72.3031275,18.5331799],[-72.3048311,18.5311081],[-72.3097397,18.5311081],[-72.3164332,18.5324302],[-72.3234056,18.5366083],[-72.3261388,18.5387765],[-72.3261946,18.5426371],[-72.3170468,18.5540596],[-72.3130864,18.5540596],[-72.2987511,18.5453342],[-72.2988627,18.5407333],[-72.2962969,18.5404689],[-72.2954602,18.5395169],[-72.2961853,18.5338582],[-72.2971893,18.5332235],[-72.3007034,18.5332764],[-72.3022652,18.5342284],[-72.3028486,18.5335189],[-72.303104,18.5333361],[-72.303181,18.5334007],[-72.3035793,18.5335614],[-72.3030793,18.5346463],[-72.303715,18.5339873],[-72.3045286,18.5344052],[-72.3044015,18.5345097],[-72.3062747,18.5352571],[-72.3063107,18.5352741],[-72.3061219,18.5357628],[-72.3061219,18.5358196],[-72.30637,18.5358928],[-72.3062726,18.5354869],[-72.3066688,18.5350891],[-72.3061963,18.5349706],[-72.3058869,18.5349385],[-72.3055373,18.5346833],[-72.3054864,18.534613],[-72.3055585,18.5345065],[-72.3046749,18.5342293],[-72.3047617,18.5338817],[-72.3043252,18.5337511],[-72.3042595,18.5336346],[-72.303145,18.5332749]],[[-72.2981405,18.477502],[-72.2935652,18.4948587],[-72.2922242,18.4964297],[-72.2931708,18.4972526],[-72.2892266,18.5057058],[-72.2878067,18.5080996],[-72.2850458,18.5119893],[-72.2840203,18.5113161],[-72.2808649,18.515879],[-72.2773151,18.5175994],[-72.2723454,18.5175246],[-72.2662714,18.5144578],[-72.2665869,18.5066783],[-72.2692643,18.5046154],[-72.2661965,18.5029756],[-72.2688181,18.4965222],[-72.2691528,18.4959403],[-72.2702684,18.4961519],[-72.2702684,18.4955964],[-72.2690691,18.49557],[-72.2692922,18.4937714],[-72.2736988,18.4859951],[-72.2746749,18.4850429],[-72.2751769,18.483403],[-72.2765435,18.4813398],[-72.2773523,18.4814985],[-72.2783006,18.4809694],[-72.2778544,18.4807049],[-72.2771013,18.480123],[-72.2789978,18.4775836],[-72.279723,18.4772927],[-72.2806433,18.4776365],[-72.2813685,18.4771604],[-72.2808386,18.4769752],[-72.2812848,18.4758378],[-72.2823167,18.4751765],[-72.2851615,18.4750971],[-72.2849941,18.4763668],[-72.2854404,18.4769752],[-72.286277,18.4756262],[-72.2869325,18.4754675],[-72.2865978,18.4751897],[-72.2865978,18.4750046],[-72.2909765,18.4747268],[-72.2946579,18.4749384],[-72.2973911,18.476843],[-72.2981405,18.477502]],[[-72.3466657,18.5222375],[-72.346833,18.5244325],[-72.3475303,18.5277645],[-72.3455501,18.5291131],[-72.3403069,18.5292189],[-72.3383267,18.5280289],[-72.3369043,18.530118],[-72.3338086,18.5296684],[-72.3289279,18.5270769],[-72.328649,18.5253316],[-72.3292068,18.5232689],[-72.330406,18.5220524],[-72.3321631,18.5221847],[-72.3322467,18.5191963],[-72.3369183,18.5183633],[-72.3382012,18.5184691],[-72.3381454,18.5181782],[-72.3411993,18.5177947],[-72.3454943,18.5171997],[-72.3492595,18.517279],[-72.3504308,18.5188922],[-72.3503472,18.5206112],[-72.3496778,18.5220392],[-72.3466657,18.5222375]],[[-72.3303078,18.5486462],[-72.3429687,18.5508149],[-72.3433236,18.5530585],[-72.3413121,18.5614341],[-72.3390639,18.5613593],[-72.3384723,18.5638271],[-72.3375257,18.5654348],[-72.3348436,18.5650609],[-72.3311755,18.5638271],[-72.3312149,18.5616211],[-72.3232082,18.5606863],[-72.3212361,18.559602],[-72.3208023,18.5587046],[-72.3208811,18.557882],[-72.3259493,18.5580274],[-72.3266186,18.5581993],[-72.3259214,18.5577498],[-72.3250986,18.5573797],[-72.3233767,18.552263],[-72.3245994,18.5478507],[-72.3288986,18.5483742],[-72.329979,18.5489548],[-72.3303078,18.5486462]],[[-72.3231383,18.5269828],[-72.3223434,18.528067],[-72.3209629,18.5279745],[-72.3207816,18.5271282],[-72.3208513,18.5253697],[-72.3214649,18.5249598],[-72.3225666,18.5248937],[-72.3228454,18.52533],[-72.3232359,18.5264804],[-72.3231383,18.5269828]],[[-72.2160832,18.6457752],[-72.2159649,18.6553795],[-72.2030279,18.6558279],[-72.1947057,18.6553421],[-72.1922208,18.6545573],[-72.1920631,18.6521283],[-72.193483,18.6477559],[-72.201253,18.6385249],[-72.2069327,18.6388239],[-72.2120996,18.6424117],[-72.2118068,18.6430591],[-72.2121693,18.6426892],[-72.2127968,18.6427552],[-72.2134662,18.6431252],[-72.2135638,18.6437462],[-72.2154176,18.6443947],[-72.2158909,18.6450301],[-72.2160832,18.6457752]],[[-72.2867654,18.6482017],[-72.2900977,18.6527446],[-72.28981,18.6536532],[-72.2900738,18.6542664],[-72.290721,18.6537667],[-72.2910327,18.6544709],[-72.2912485,18.654221],[-72.29168,18.6558905],[-72.2912245,18.656606],[-72.2922673,18.65597],[-72.2926869,18.6567536],[-72.2930705,18.6567309],[-72.2941253,18.6581846],[-72.2960192,18.6608421],[-72.2959713,18.6619096],[-72.2932862,18.664567],[-72.2906731,18.6659979],[-72.2895943,18.6661342],[-72.2895943,18.6665657],[-72.2877004,18.6664749],[-72.2875805,18.6676559],[-72.2831214,18.6697227],[-72.2796453,18.6696546],[-72.2784311,18.6690787],[-72.2783972,18.6687736],[-72.277736,18.6691671],[-72.2774394,18.669143],[-72.2770071,18.6683159],[-72.2765575,18.6681125],[-72.2765385,18.6680583],[-72.2752319,18.6685239],[-72.2749292,18.6674649],[-72.2746416,18.6674309],[-72.2734668,18.6682145],[-72.2732271,18.6682712],[-72.2726757,18.6671583],[-72.2719147,18.6674288],[-72.2718808,18.6673405],[-72.2688149,18.6681868],[-72.2688269,18.6671761],[-72.2690786,18.6668241],[-72.2688149,18.66679],[-72.2681077,18.6670739],[-72.2676282,18.6673805],[-72.2675563,18.6666878],[-72.266861,18.666949],[-72.2655904,18.6673578],[-72.2654466,18.6670058],[-72.2647514,18.6674146],[-72.2629893,18.6681868],[-72.2628455,18.6681754],[-72.2626537,18.6676076],[-72.2623001,18.6677098],[-72.2624799,18.6679199],[-72.2624799,18.6682322],[-72.262306,18.6682606],[-72.2620963,18.6679654],[-72.2622761,18.6689193],[-72.2601484,18.6688966],[-72.2542749,18.6687944],[-72.2505388,18.6683476],[-72.2504371,18.669536],[-72.2477926,18.6698893],[-72.2415204,18.669793],[-72.2414187,18.6741933],[-72.2389167,18.6739759],[-72.2387249,18.6734649],[-72.2383653,18.6733059],[-72.2387009,18.6739532],[-72.2375502,18.6738964],[-72.2374183,18.6735103],[-72.237742,18.67334],[-72.2375142,18.6732605],[-72.236843,18.6734876],[-72.2364354,18.6724088],[-72.2355124,18.6726019],[-72.2354045,18.6724202],[-72.2353027,18.6729028],[-72.2345475,18.6726871],[-72.2343077,18.6724599],[-72.2342358,18.6734706],[-72.2334087,18.6734592],[-72.2332889,18.6733003],[-72.2327375,18.6732889],[-72.2327135,18.6735047],[-72.227703,18.6725281],[-72.2265283,18.6716537],[-72.226804,18.6715742],[-72.2274993,18.6715855],[-72.2274873,18.6714493],[-72.2272899,18.6714623],[-72.2272814,18.6712977],[-72.2272094,18.671358],[-72.2261785,18.6713693],[-72.2256032,18.670881],[-72.2255073,18.6694502],[-72.2261066,18.6696886],[-72.2261785,18.6695949],[-72.2259837,18.6695495],[-72.225777,18.6691379],[-72.2253335,18.6694643],[-72.2249739,18.66947],[-72.2245783,18.6678802],[-72.2235525,18.6677046],[-72.2235907,18.6675921],[-72.2224634,18.6676283],[-72.2223659,18.667022],[-72.2223277,18.6670943],[-72.2219209,18.667026],[-72.2208105,18.6669015],[-72.220809,18.6665325],[-72.2208705,18.6663593],[-72.2206023,18.6668107],[-72.2203895,18.6666361],[-72.2184341,18.6650535],[-72.21829,18.6640979],[-72.2183493,18.6608376],[-72.2187223,18.6606541],[-72.2186894,18.660603],[-72.2187253,18.6604525],[-72.2189771,18.6603247],[-72.2187823,18.6601998],[-72.2186984,18.6602367],[-72.2185815,18.6600352],[-72.2186085,18.6600039],[-72.2187823,18.6601345],[-72.218995,18.6600181],[-72.2189111,18.6599131],[-72.2189681,18.6597938],[-72.2183807,18.6595837],[-72.2184728,18.6539662],[-72.2201001,18.6511554],[-72.225796,18.6469472],[-72.2283048,18.6457265],[-72.2379335,18.645855],[-72.237764,18.6446985],[-72.2400355,18.6432529],[-72.2455958,18.6433493],[-72.2482742,18.6450358],[-72.2487488,18.6436705],[-72.2511067,18.6429775],[-72.2512385,18.6433409],[-72.2512625,18.6431592],[-72.2514843,18.6431365],[-72.2513284,18.6429718],[-72.2533602,18.6423471],[-72.253516,18.6426765],[-72.2539535,18.6425402],[-72.2541453,18.642932],[-72.2543851,18.6428696],[-72.2543791,18.6427503],[-72.2564168,18.6423244],[-72.2566925,18.6431365],[-72.2568783,18.6428582],[-72.2568184,18.6425288],[-72.258843,18.6420991],[-72.258885,18.6422467],[-72.2592626,18.6422297],[-72.2596461,18.6424057],[-72.2592206,18.6406907],[-72.2599545,18.6404815],[-72.2601156,18.6406341],[-72.2601156,18.6399393],[-72.2615268,18.6394669],[-72.2626056,18.6391034],[-72.2654465,18.6387286],[-72.2719433,18.6386832],[-72.272201,18.6388649],[-72.2730341,18.6394158],[-72.273166,18.6412558],[-72.2738732,18.6410286],[-72.2742208,18.6416079],[-72.2752187,18.6416987],[-72.2754524,18.6415738],[-72.2755513,18.6416874],[-72.2755394,18.6417527],[-72.2764713,18.6418634],[-72.276753,18.6418975],[-72.2762953,18.6426002],[-72.2774226,18.6429978],[-72.277982,18.6427247],[-72.2785796,18.6431303],[-72.2785669,18.6432307],[-72.2789017,18.6433471],[-72.279851,18.6439655],[-72.2858703,18.6469651],[-72.2867654,18.6482017]],[[-72.5557247,18.5305893],[-72.5555866,18.5367036],[-72.554995,18.537975],[-72.5488026,18.537919],[-72.5486646,18.5372832],[-72.548842,18.5306267],[-72.5493745,18.5301031],[-72.555133,18.5301218],[-72.5557247,18.5305893]],[[-72.6235278,18.5079877],[-72.6234441,18.5095217],[-72.6226074,18.5104341],[-72.6204878,18.511849],[-72.6183403,18.5107514],[-72.6162207,18.5083183],[-72.6162625,18.506467],[-72.618661,18.5044438],[-72.6204041,18.5044967],[-72.6228305,18.506996],[-72.6235278,18.5079877]]]},{"id":"osmim-imagicode-S2A_R119_N09_20160327T050917","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[79.01779174804685,8.827572266651268],[79.01401519775389,9.64678471986339],[80.17642021179198,9.650423231331946],[80.17727851867674,8.831304063493132],[79.01779174804685,8.827572266651268]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80700162014211LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[-152.70872943147867,62.30357443926811],[-152.70838610872474,62.58153176976553],[-152.00835101350992,63.54645538851267],[-148.99432055696695,63.53329945446586],[-148.99432055696695,62.30357443926811],[-152.70872943147867,62.30357443926811]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral2","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-aral1","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170417T140051","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R067_S40_20170127T140051","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81190582014075LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[114.35999506049737,2.028456548619032],[113.5344754987298,2.030000532161949],[113.53619211249934,3.070767124420059],[114.76511591010677,3.067510236472651],[114.76254098945248,2.088156161702156],[114.35999506049737,2.028456548619032]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81250592016107LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[104.00154570197358,-0.000078769115171],[104.00137404059662,1.45099139170518],[104.91014937018647,1.451162998032411],[104.91014937018647,-0.000078769115171],[104.00154570197358,-0.000078769115171]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing Islands in OSM (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80770232017156LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81800982013291LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[3.246529403113632,-54.47046993167111],[3.246529403113632,-54.375391687979096],[3.463852706336288,-54.375391687979096],[3.463852706336288,-54.47046993167111],[3.246529403113632,-54.47046993167111]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R065_N47_20160929T102022","name":"imagico.de OSM images for mapping: Cental 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","scaleExtent":[0,13],"polygon":[[[10.559062957763668,45.95484945195885],[7.473964691162107,45.95532682303484],[7.555847167968747,46.27080015119853],[8.05469512939453,47.66469371011084],[11.752452850341793,47.664809318453564],[11.752452850341793,46.813336457338615],[11.38423919677734,45.955088138010865],[10.559062957763668,45.95484945195885]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82050982015344LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-34.17701089820909,-55.29692751183208],[-35.19599283180284,-55.282851769908206],[-35.16663873634385,-54.7209735214882],[-34.12516916236925,-54.73465315976587],[-34.14010370216417,-55.29692751183208],[-34.17701089820909,-55.29692751183208]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R086_N60_20160831T213532","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0040712016264110KF","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-72.7594470977783,-15.68684010813036],[-72.7594470977783,-15.49570157136026],[-72.74434089660643,-15.426295586903299],[-72.41286277770995,-15.426295586903299],[-72.41286277770995,-15.652957427428944],[-72.42410659790038,-15.686674840407827],[-72.7594470977783,-15.68684010813036]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R022_N06_20151221T103009","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[1.839749701876779,6.257803795151386],[1.839749701876779,7.114271792431897],[2.549397834200998,7.114271792431897],[2.549397834200998,6.489052510574106],[2.497813590426584,6.258059752887941],[1.839749701876779,6.257803795151386]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R040_N01_20160311T164128","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-92.05216379429558,1.321295617717369],[-92.05216379429558,1.72181118585353],[-91.74849481846549,1.72181118585353],[-91.74849481846549,1.321295617717369],[-92.05216379429558,1.321295617717369]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80360072014245LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,11],"polygon":[[[-84.34798733886554,74.38945823827667],[-84.34798733886554,75.89030323920836],[-79.14870755370929,75.89030323920836],[-79.14870755370929,74.38945823827667],[-84.34798733886554,74.38945823827667]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Coastline mostly mapped meanwhile (false color IR)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82160152013239LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[-13.047005598725303,64.2110895294821],[-15.164963667572959,64.22408122727819],[-15.168053572358117,64.81572800422087],[-13.043572371186242,64.80359943673454],[-13.047005598725303,64.2110895294821]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing islets and inaccurate coast (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-78.531997745432,-1.805085317123331],[-78.531997745432,-1.608105565001241],[-78.33561713019762,-1.608105565001241],[-78.33561713019762,-1.805085317123331],[-78.531997745432,-1.805085317123331]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R009_S61_20160109","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-56.13476090727487,-61.63471600102006],[-56.13476090727487,-61.199363166283845],[-55.83263688383738,-60.84015069906498],[-53.72343354521433,-60.83981613078141],[-53.72343354521433,-61.63471600102006],[-56.13476090727487,-61.63471600102006]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-enderby","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100502015347LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-24.758781955967567,14.748140156641956],[-24.758781955967567,15.092493544965103],[-24.267057941685337,15.092493544965103],[-24.267057941685337,14.748140156641956],[-24.758781955967567,14.748140156641956]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-greenland","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R047_S54_20160411T044330","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[73.06896521028185,-53.270590689700434],[73.06896521028185,-52.875489636268725],[73.67338491853381,-52.87673289134188],[74.08863378938341,-52.94950473139763],[74.08863378938341,-53.270590689700434],[73.06896521028185,-53.270590689700434]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82280982013259LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[-69.85679747431641,-55.55949231551995],[-72.26520659296875,-55.149427383391455],[-72.26520659296875,-54.51089432315929],[-72.08530546992188,-54.17909103768387],[-69.49115874140625,-54.17889010631196],[-69.49150206416016,-55.28378528847367],[-69.62230803339844,-55.55910398108892],[-69.85679747431641,-55.55949231551995]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20151008","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_kangerlussuaq_20160518","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R021_N44_20160807T083013","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[35.932588577270494,44.96236872935039],[35.932588577270494,45.559256426515695],[37.369909286499016,45.559256426515695],[37.369909286499016,44.96236872935039],[35.932588577270494,44.96236872935039]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar2","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[-79.05174500251786,81.91484289044183],[-79.05174500251786,83.43338556749623],[-73.60389956385866,83.80224987787145],[-26.424486898081835,83.80224987787145],[-21.492998879371186,83.50352415480617],[-16.888354121159868,83.15094632775453],[-16.888354121159868,81.91484289044183],[-79.05174500251786,81.91484289044183]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-28.210747081406492,-56.72108048139938],[-28.210747081406492,-56.624975043089115],[-27.96956284678735,-56.624975043089115],[-27.96956284678735,-56.72108048139938],[-28.210747081406492,-56.72108048139938]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81991002015286LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-27.992928409215843,-56.73479060902333],[-28.227761172887714,-56.732624892496354],[-28.2241562839717,-56.600752537318456],[-27.969754123327167,-56.60283135691063],[-27.97318735086623,-56.73479060902333],[-27.992928409215843,-56.73479060902333]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ls_polar","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[-85.76109385682587,81.39333391115835],[-89.83015512094161,82.14951616258433],[-89.83152841195212,82.24404688557661],[-84.99342418195555,82.73098798225534],[-79.95207288240479,83.13107965605444],[-74.55641250214465,83.46266728201661],[-69.35850602739671,83.70450775086888],[-28.207840897721187,83.70450775086888],[-23.06623935440381,83.46532469372944],[-17.96583654140148,83.15518123848051],[-17.96720983241198,82.72386035102944],[-22.781968115230015,81.44190408358111],[-85.76109385682587,81.39333391115835]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S02_20160613T075613","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[37.20665931701659,-0.266846645776291],[37.20665931701659,-0.011930465612033],[37.5655174255371,-0.011930465612033],[37.5655174255371,-0.266846645776291],[37.20665931701659,-0.266846645776291]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R092_S05_20160802T075556","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[37.24768638610839,-3.229213650135676],[37.24768638610839,-2.968155849006605],[37.61581420898436,-2.968155849006605],[37.61581420898436,-3.229213650135676],[37.24768638610839,-3.229213650135676]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80940622015159LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[150.38853376619625,-2.800534349432724],[150.38853376619625,-2.383396178206425],[150.83348005525875,-2.383396178206425],[150.83348005525875,-2.800534349432724],[150.38853376619625,-2.800534349432724]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2016","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-northsea_s2_2017","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ural_s2_2016","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[59.198977223476454,64.8920468958533],[59.198977223476454,66.91656046303187],[60.733286610683486,68.44289182710118],[67.7329509173241,68.44327026354412],[67.7329509173241,67.748828729217],[64.21646761043934,64.9195663902952],[59.198977223476454,64.8920468958533]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ndvina","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[-81.62923243782096,82.45969864814401],[-83.03136255954291,82.47985512217643],[-83.03136255954291,83.05876272004272],[-72.80309111332822,83.09567468670448],[-65.65785798568925,83.03232446260982],[-65.8116665788654,82.45969864814401],[-81.62923243782096,82.45969864814401]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-nellesmere_ast_2016","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[-78.89729497133754,82.17577067162792],[-82.64500613899595,82.19425721404356],[-82.64500613899595,83.08067098163464],[-66.58986093522367,83.08497116318647],[-63.78010752773773,82.98907949583335],[-63.78010752773773,82.72198178031782],[-65.0092029821365,82.17577067162792],[-78.89729497133754,82.17577067162792]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00vis","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66770140276793],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81960222015233LGN00ir","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[7.63567991501593,53.28027339774928],[7.63567991501593,53.66810821588294],[8.49433012253546,55.502457780526],[9.207754805152648,55.48106268908912],[9.207754805152648,53.28027339774928],[7.63567991501593,53.28027339774928]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-ngreenland_ast","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[-52.49221819430999,82.48971755550389],[-52.49221819430999,82.94294978186194],[-49.28695697579964,83.47311821807558],[-44.52850362441216,83.7321400994933],[-29.525299334683975,83.7321400994933],[-25.263977329098022,83.58271128961059],[-21.183929736898254,83.39775984253468],[-21.183929736898254,82.74312310369845],[-23.404541300879075,82.48971755550389],[-52.49221819430999,82.48971755550389]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A1350972013086110KF","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[73.22790413350113,-53.20333324999222],[73.22790413350113,-53.01072925838941],[73.2594898268605,-52.94943913810479],[73.78992348164566,-52.94943913810479],[73.78992348164566,-53.06048282358537],[73.71782570332533,-53.20333324999222],[73.22790413350113,-53.20333324999222]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R111_N09_20160604T154554","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-80.01653561766223,8.848981570244637],[-80.01653561766223,9.41480707574399],[-79.46859250242785,9.41480707574399],[-79.46859250242785,8.848981570244637],[-80.01653561766223,8.848981570244637]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-EO1A0120532016364110KF","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-79.62538719177245,8.770827350748924],[-79.68684196472167,8.821974500616129],[-79.6866703033447,8.93705081902936],[-79.65362548828124,9.0929436313527],[-79.268159866333,9.0929436313527],[-79.32832717895505,8.770827350748924],[-79.62538719177245,8.770827350748924]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N68_20160930T081002","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81511242016033LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[-53.20921946177197,-84.12524693598144],[-60.615377881406225,-83.78609327915953],[-60.615377881406225,-82.29968785439104],[-48.72405102147429,-82.29987186164387],[-44.52178052933989,-82.43683433550413],[-44.51354078327688,-84.12524693598144],[-53.20921946177197,-84.12524693598144]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R136_N41_20150831T093006","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[19.112325688609005,42.1531576323006],[19.08425905347717,43.08073531915633],[20.63298799634826,43.09602978090892],[20.637880345591427,42.167791043253985],[19.112325688609005,42.1531576323006]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142622_03746_20110415_17533956","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,15],"polygon":[[[-51.238571767352376,68.79971882076842],[-51.243335370562825,68.85302612951142],[-51.151668195269856,68.85302612951142],[-51.14038145973519,68.80116208175376],[-51.238571767352376,68.79971882076842]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81510432015030LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[67.96839858817646,22.36264542957619],[67.86231185721942,22.38391650007107],[67.86231185721942,24.886930816927297],[71.48986007499286,24.886930816927297],[71.48986007499286,22.36264542957619],[67.96839858817646,22.36264542957619]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R093_N41_20150828T092005","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[23.808114560320394,41.584878805945024],[22.992379697039144,41.6019534981177],[23.011863263323328,42.29983747360261],[23.99402383156063,42.283393175568236],[23.965613873674886,41.584878805945024],[23.808114560320394,41.584878805945024]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81730602015040LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[29.766296776846374,0.206886934953159],[29.766296776846374,0.509176367154027],[30.034603509024116,0.509176367154027],[30.034603509024116,0.206886934953159],[29.766296776846374,0.206886934953159]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R078_N01_20160702T082522","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[29.8051357269287,0.235862065771959],[29.8051357269287,0.467085433008179],[30.02503395080565,0.467085433008179],[30.02503395080565,0.235862065771959],[29.8051357269287,0.235862065771959]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80611072014036LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-180,-67.4263452007858],[-180,-67.32544337276457],[-179.8247337341308,-67.3253771978419],[-179.8247337341308,-67.4263452007858],[-180,-67.4263452007858]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82100972015347LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-42.12874872458635,-53.72050213468143],[-42.14625818503558,-53.45782244664258],[-41.67573435080706,-53.445862233424414],[-41.6558216310805,-53.70871763480476],[-42.12874872458635,-53.72050213468143]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Missing in other image sources (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81130622013270LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[120.84382442048364,-3.595452324350203],[120.84382442048364,-3.159848173206955],[120.98184016755395,-2.514681686347053],[122.62618449738794,-2.514681686347053],[122.62618449738794,-3.002148034113534],[122.5007000308352,-3.595452324350203],[120.84382442048364,-3.595452324350203]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80281222016035LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,10],"polygon":[[[156.96951345925345,-84.50097988272655],[154.50857596843485,-84.46255082580927],[154.50857596843485,-82.60681485793681],[175.46774337070775,-82.58504749645738],[177.00582930246938,-83.52806548607914],[177.00582930246938,-84.19262083779002],[171.93838547371908,-84.34632646581997],[166.83798266071676,-84.44370142483508],[161.67028858819987,-84.50045345467909],[156.96951345925345,-84.50097988272655]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81030632015286LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R088_S05_20160812T011732","name":"imagico.de OSM images for mapping: 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","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-s2sval","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,15],"polygon":[[[-68.93976917529807,76.51132557714853],[-68.93976917529807,76.54990046497333],[-68.76634826923117,76.55175699880375],[-68.50992908740743,76.55175699880375],[-68.50743999744161,76.51611959755911],[-68.67897262836203,76.51193618208278],[-68.93976917529807,76.51132557714853]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Icebridge DMS image - alignment might be poor","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule2_2015.09.25","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,17],"polygon":[[[-68.74291885235837,76.52635852412212],[-68.74446380475094,76.52840070669755],[-68.74806869366695,76.54938731810256],[-68.7461482320123,76.56016657973251],[-68.72275936940244,76.56022393334496],[-68.72017371991207,76.5577475347327],[-68.71853220799495,76.5292079974043],[-68.71977675297786,76.52636602351234],[-68.74291885235837,76.52635852412212]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.10.06","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,16],"polygon":[[[-68.81923965911197,76.52510098413808],[-68.82651380996036,76.54176603738404],[-68.77344898680974,76.5439032956252],[-68.7021022270136,76.54544610909097],[-68.59176687697696,76.54560088014632],[-68.59183124999333,76.52793072237704],[-68.65970186690618,76.52510098413808],[-68.81923965911197,76.52510098413808]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-dms_thule_2015.09.25","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,16],"polygon":[[[-68.7777130980429,76.50687742381471],[-68.77661875676482,76.57064446843503],[-68.68115357350676,76.57065443536027],[-68.67630413960784,76.55384487076157],[-68.67619685124725,76.5307435998188],[-68.6852305312094,76.50688243050337],[-68.7777130980429,76.50687742381471]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R094_N79_20160812T105622","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,12],"polygon":[[[78.45885691499899,80.72643412860921],[78.45885691499899,80.9098976404357],[80.48892435884663,80.9098976404357],[80.48892435884663,80.72643412860921],[78.45885691499899,80.72643412860921]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC80910682014358LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[153.0613810625655,-11.789228234021259],[153.0613810625655,-11.288690822294749],[153.10927458673538,-11.072292520575749],[154.41201277643268,-11.072292520575749],[154.41201277643268,-11.789228234021259],[153.0613810625655,-11.789228234021259]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC82330892016031LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[-72.8669610523419,-41.51741123877955],[-72.8669610523419,-41.045274923011036],[-72.23181395761533,-41.045274923011036],[-71.87510161630674,-41.10829439141359],[-72.00007109872861,-41.51741123877955],[-72.8669610523419,-41.51741123877955]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R089_N52_20160623T024048","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[126.36143429881301,51.375528375017275],[126.34804471141064,52.33932231282816],[128.60762341624462,52.340895519845674],[128.6117432892915,51.375528375017275],[126.36143429881301,51.375528375017275]]],"terms_url":"http://maps.imagico.de/#osmim","terms_text":"imagico.de OSM images for mapping","description":"Recent image showing newest features (true color)","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-LC81490352013282LGN00","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,13],"polygon":[[[75.98364343730569,34.97850982318471],[73.96164407817483,35.36957188964085],[74.44281091777444,37.09391400468158],[76.50600900737405,36.7026732100855],[75.98364343730569,34.97850982318471]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"osmim-imagicode-S2A_R039_S15_20160510T145731","name":"imagico.de OSM images for mapping: 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","scaleExtent":[0,14],"polygon":[[[-71.18070648306262,-14.4978507264954],[-71.17976234548938,-13.710292880050797],[-70.5563740550841,-13.71262765059222],[-70.5563740550841,-14.4978507264954],[-71.18070648306262,-14.4978507264954]]],"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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAADWElEQVQ4y13TS2gcdQDH8e/szGQ372Tz2irGpoS0KSapoqjRQ4knD0WweLRCCXiQXuJFMR6EYMVC0IsPyKVFsJpWbQ0KQmL14KPWirGmZjdmk+w7mX1kZ2d2dv7/mfFUsX5Pv8Pv+lH4X6/NvTPc239gOlXyp7ZzlaEg8EGYyVaZWY7dc+/CuTde+fu/f+XOeP3iLT2bTMxN9NVm1PZhbfKBGC/OXsDzHJr1EEf6ilSMLZFrxObHJk/OfvDqCQmgArz3TUJfXZm/3K53nZ4YPRw69czjXPrqR+LJHJ4rUFXA3qG33Va3cpknU2vxY1pz9yWzlPZVgL6xobNGXp7u6T9Geq/O+U+usHRtE6du0aJncSyXtnCOcqVC0ZTIhnM44itNhpFeVs5+kRxe//OP22VDar4ncRwHz85TKtY40H2D4n6KwNMRgUPIC9ES0mj2NNwK4rfE2qhWyBnT1YrUQkqA3hwmpIYw63law4JcaR/hR9GVAh2tOmEUHunpwKkJVm10VdOntbptP+VJiaIoKIDv7zPQbVDxJIPRPkRkh8CN0KFrjHdGiXW3kkuXSRYEakid0qQrDkrhEgQ+tZpNtVTmoQdNrGgB6XjUpEJzSxvCgnhOZ+RQFKtcZV8IpO8NhXxfIoWLY9tUS0XePxXHMNrY3BxkOx+lXVX54dc+VjdaiHabXPg6RcMSWFULT3poEGxJ0eit1Wq06w4FMURPl8NObo9MvgnTaOGF402M399DrDNEPJHnl99rZIoWvudvaeGwtux53sOPjffy9pn7CHdKnn5WJ/5XnudnrjF2tJ/F61mGBiIc7fe4mXT5ds0lu1tE8f1lbSDWu5DZyb98fMLVwp0dgINv5Bjpcfj50yloUsAo8Ob8T/iVBociLrtlC9+tCwgW1O8++7A09dxLbUvfrzzRpV7nSCyK0qRDOEwjlUYr7iH2DPx6hXevpLi5YXNjfRsCcQ4aiwrAlxuB/tHCx5fTyaUTg/1pJke6eHR0GF9AKZtnv1BlYSWFWYBEepdyuXwV5EmQ8l9Mn9929asXF+c21xMz5b1NreHewvNcHAc0qRGpQyqfFZZZnQc5C1LepfFOZ946P5xJbkybRmbKzm8f3C3b2GZlyzYLy9WqteD5jbs4/wOHuM2qT5aWEQAAAABJRU5ErkJggg=="},{"id":"IPR-orotofoto-last-tms","name":"IPR ortofoto LAST (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,18],"polygon":[[[14.81231552124,49.93089301941],[14.18754582291,49.87687266984],[14.12025456314,50.19881542327],[14.74502426147,50.25247461226],[14.81231552124,49.93089301941]]]},{"id":"IPR-orotofoto-vege-tms","name":"IPR ortofoto Low-Vegetation (tmsproxy)","type":"tms","template":"http://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg","scaleExtent":[1,20],"polygon":[[[14.30454236984,49.99538124382],[14.3160436821,49.94205148763],[14.3499983888,49.94508261663],[14.35383872175,49.92726356386],[14.42385321818,49.93351545169],[14.4200902288,49.95097343212],[14.48865449494,49.95709281879],[14.48479036398,49.9750111737],[14.55385989188,49.98117257481],[14.55011770159,49.99851689993],[14.58455395868,50.0015874108],[14.58829614897,49.98424419323],[14.69168128485,49.99346468175],[14.67633637226,50.06452744171],[14.71278864961,50.06777324036],[14.70115373952,50.12158114828],[14.66470146217,50.11833899243],[14.6610031918,50.13543086714],[14.62755290441,50.13245658485],[14.61965341283,50.16894659259],[14.58542741996,50.16590546732],[14.58162921725,50.18344165464],[14.40776267983,50.167995553],[14.41156088254,50.15045369625],[14.37764851321,50.14743927281],[14.37379555571,50.16523508727],[14.33892816423,50.16213672855],[14.34278112173,50.14433976066],[14.27367931007,50.13819641038],[14.27749028245,50.12058459573],[14.20879964298,50.11447476994],[14.21288816219,50.09557069695],[14.24656290855,50.09856724424],[14.25417384067,50.06335893014],[14.21987061144,50.0603042129],[14.22369648177,50.04259477081],[14.257999711,50.04565061557],[14.26952647673,49.99225864496],[14.30454236984,49.99538124382]]]},{"id":"bartholomew_qi1940","name":"Ireland Bartholomew Quarter-Inch 1940","type":"tms","template":"http://geo.nls.uk/maps/ireland/bartholomew/{zoom}/{x}/{-y}.png","scaleExtent":[5,13],"polygon":[[[-8.8312773,55.3963337],[-7.3221271,55.398605],[-7.2891331,55.4333162],[-7.2368042,55.4530757],[-7.18881,55.4497995],[-7.1528144,55.3968384],[-6.90561,55.394903],[-6.9047153,55.3842114],[-5.8485282,55.3922956],[-5.8378629,55.248676],[-5.3614762,55.2507024],[-5.3899172,53.8466464],[-5.8734141,53.8487436],[-5.8983,52.8256258],[-6.0191742,52.8256258],[-6.0262844,51.7712367],[-8.1131422,51.7712367],[-8.1273627,51.3268839],[-10.6052842,51.3091083],[-10.6271879,52.0328254],[-10.6469845,52.0322454],[-10.6469845,52.0440365],[-10.6271879,52.0448095],[-10.6290733,52.0745627],[-10.6699234,52.0743695],[-10.6702376,52.0876941],[-10.6312729,52.0898179],[-10.6393128,52.4147202],[-10.3137689,52.4185533],[-10.3166401,53.3341342],[-10.3699669,53.3330727],[-10.385965,54.3534472],[-8.8163777,54.3586265],[-8.8173427,54.6595721],[-8.8413398,54.6616284],[-8.8422286,54.6929749],[-8.8315632,54.7145436],[-8.8151208,54.7145436],[-8.8312773,55.3963337]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"GSGS3906","name":"Ireland British War Office 1:25k GSGS 3906","type":"tms","template":"http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-10.71,51.32],[-10.71,55.46],[-5.37,55.46],[-5.37,51.32],[-10.71,51.32]]],"terms_url":"http://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin","terms_text":"Glucksman Map Library, Trinity College Dublin","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAB3RJTUUH3gQOFR0YB1KT3QAAAAlwSFlzAAAewQAAHsEBw2lUUwAAAARnQU1BAACxjwv8YQUAAAS/SURBVHjandN7TFNXHAfwzrn/lm3ZHy7LYrJkybK5zMw9fCEoPjbeChoHTtBVRF7l1ZZSaG8flCtvsFVpoZZHC5Y6jDM+UScDaxF5lIfSAaMIlVKBS8EZN4d+d9voZpbMFX/JN7nnnvM7n5xzcxmM5wrPlX1yFmP2adgmXKHc78bsU+j9ZRT3HzzE+D0n7tjuYdo5h38X47/q+UWD1nE0tw/gktEC66gdN/tG0Dc4hnEHhdG7DujOdqGHxi4ae2AZti8ccJXZYoOxawRPnjzGwcpmzM8//ntOe86MickZTEw7ka+99nJAZ/8YWjqs7ufc6ibM/fbQ/fzHo0eoOduJ8UkKljt2nLhk9hj4/Wlm6VA9A2NUa/ew6wNQE1OzVGvPEGUZvkvZHVNUo2mA6ugfpvoGrNT8/Dz1tMfd/yJgKZ13h6zjzFbzvbwO8wDZaR4kzeZbZG/fIHnTbCOvdzrI9h472dnVT97oociO23NkW+9M3pDVsc/V69rjRYA7Su11/dvbfkRJvDeOcMORuj8CpelLkJO6BVs4vQhj3QD5fTQS2PXYndQAblw2yrUt9c/6/xeoqzulK+VEoCTtawgSM5HCr0Nsmg48ngJhYiukonNIybeg8MQEFIZBFBWIoa4z1XoMaOrbtbHci2BtW4RachnOlO/GZW0SjuZEY2eWGYVEFfYJ+kDo/4ThdDPExadQcbxb5zmgb6/xYZlAxPtDmByFS2U+EHM5yBOyEZZ8HkzeZaQmyxFZROGkgUQIMQSNvkPrMXBM31YdFqNDJK8ZHE4FYgSt2Jl0GpKUGAhFjTiQ2QJDgRBGdSTIvEJ8IXDSQJvngEbfWrWacGJDzn1sJ34FkSqFQbgWTcUrcLWIATlnBzYSE8hOOIBQzk9YK56jgRs1CzlBVXD6bcijCYSwTYjhXUFD7nrUlHyFc6pPUCL4BpskUwhn6iGPSMYG3igN3KxeCKDZyulGddReBKV3YbNkGidkIWhQLMeFiuUoE3ths8iOfXFnoQ5nwTt9xHVFVZ5f0XGjxks0A++sIWyNqYM0TYp6qS9+UHxOn+BjqMQfwF8wgg2x5+ErccCboKA5bloAUGc8tk40i2CmGuGhgQhjX0MZwUY5uRJVuX6QcpPhm2TErlBfBLAa4S2epYHrlZ5fke4K6SVyIjRejz1REfhO2Ab2wavgZJ8EU9gEUek1MDMvIIa5DUFpzVhHzECtbRR4DJRrDP5f8h04ILwAmTQLAkEWCgsLIJVIIcwS4uhRBSQSCfi8FGzP6sbKjLsoV+tWewwolUfe+pR1y7GD1YDd4cGIi4uFgM/HulWr4LdpI5ITE5EQH49dOwMRmtmND/ebLMoy+WueA2VyBmO9opSTcx6HimWQHypGBicF+6MjwdzzLSQEH6UlBSjKFyNS1AnGMm6Csuwww2NApVK6hkv2JMptmTkGiPNqEcc+jFiuGsy0SrD4lciQ1kJW3ICAqJIWeu1ilUq1EEDlHr/6vr/XxozBuQD6jw6UUXRm6DgRQCeQfIA1iaZ+BuP191xrXwpw1RtL16zwSfi5PVg2hZAcyp0gqQOr9548TU+/82zdywGvLH429eZnO8rPBNMbB4ps+MhPpvyna9ELgb8ASvKZeuq+E9sAAAAASUVORK5CYII="},{"id":"GSGS4136","name":"Ireland British War Office One-Inch 1941-43 GSGS 4136","type":"tms","template":"http://geo.nls.uk/maps/ireland/gsgs4136/{zoom}/{x}/{-y}.png","scaleExtent":[5,15],"polygon":[[[-10.0847426,51.4147902],[-10.0906535,51.5064103],[-10.4564222,51.5003961],[-10.5005905,52.3043019],[-10.0837522,52.312741],[-10.0840973,52.3404698],[-10.055802,52.3408915],[-10.0768509,52.7628238],[-9.7780248,52.7684611],[-9.7818205,52.8577261],[-9.6337877,52.8596012],[-9.6449626,53.1294502],[-10.0919663,53.1227152],[-10.1051422,53.3912913],[-10.4052593,53.3866349],[-10.4530828,54.193502],[-10.2998523,54.1974988],[-10.3149801,54.4669592],[-8.9276095,54.4853897],[-8.9339534,54.7546562],[-8.7773069,54.755501],[-8.7826749,55.0252208],[-8.9402974,55.0238221],[-8.9451773,55.2934155],[-7.528039,55.2970274],[-7.525599,55.3874955],[-7.0541955,55.3841691],[-7.0556595,55.2939712],[-6.3241545,55.2859128],[-6.3217146,55.3253556],[-6.1035807,55.3223016],[-6.1045566,55.2828557],[-5.7985836,55.2772968],[-5.8117595,55.0087135],[-5.656577,55.0056351],[-5.6721928,54.7355021],[-5.3618278,54.729585],[-5.3964755,54.1917889],[-5.855679,54.2017807],[-5.9220464,52.8524504],[-6.070885,52.8551025],[-6.1030927,52.1373337],[-6.8331336,52.1463183],[-6.8355736,52.0578908],[-7.5641506,52.0617913],[-7.5661026,51.7921593],[-8.147305,51.792763],[-8.146329,51.7033331],[-8.2912636,51.7027283],[-8.2897996,51.5227274],[-9.1174397,51.516958],[-9.1179277,51.4625685],[-9.3692452,51.4616564],[-9.3672933,51.4254613],[-10.0847426,51.4147902]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"gsi.go.jp","name":"Japan GSI ortho Imagery","type":"tms","template":"http://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg","scaleExtent":[12,19],"polygon":[[[141.85546875,44.64911632343077],[140.2294921875,43.96909818325174],[138.955078125,41.80407814427237],[139.482421875,40.17887331434696],[138.8671875,38.30718056188316],[136.31835937499997,37.19533058280065],[132.1435546875,35.137879119634185],[128.935546875,33.35806161277885],[129.5068359375,32.47269502206151],[129.77050781249997,31.690781806136822],[130.2099609375,30.90222470517144],[131.220703125,30.78903675126116],[131.66015625,32.32427558887655],[132.71484375,32.879587173066305],[133.76953125,33.17434155100208],[136.7578125,33.87041555094183],[139.306640625,35.06597313798418],[140.888671875,35.17380831799959],[141.15234374999997,36.56260003738548],[142.11914062499997,39.9434364619742],[141.767578125,42.68243539838623],[141.85546875,44.64911632343077]]]},{"id":"Aargau-AGIS-2011","name":"Kanton Aargau 25cm (AGIS 2011)","type":"tms","template":"http://tiles.poole.ch/AGIS/OF2011/{zoom}/{x}/{y}.png","endDate":"2011-01-01T00:00:00.000Z","startDate":"2011-01-01T00:00:00.000Z","scaleExtent":[14,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2011"},{"id":"Aargau-AGIS-2014","name":"Kanton Aargau 25cm (AGIS 2014)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2014-01-01T00:00:00.000Z","startDate":"2014-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2014"},{"id":"Aargau-AGIS-2016","name":"Kanton Aargau 25cm (AGIS 2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","endDate":"2016-01-01T00:00:00.000Z","startDate":"2016-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[8.222923278808594,47.604774168947614],[8.244209289550781,47.613569753973955],[8.294334411621094,47.60986653003798],[8.300857543945312,47.58625231278527],[8.329353332519531,47.569808674020344],[8.382568359375,47.56702895728551],[8.398017883300781,47.57490443821351],[8.424797058105469,47.56795554592218],[8.415184020996094,47.54663986006874],[8.389778137207031,47.5262428287156],[8.372268676757812,47.51233121261258],[8.358535766601562,47.503286684046664],[8.36402893066406,47.48078455918],[8.371238708496094,47.481016589036074],[8.373985290527344,47.47011007802331],[8.368148803710938,47.46825342516445],[8.387031555175781,47.44852243794931],[8.380851745605469,47.447593738482304],[8.384284973144531,47.4355191531953],[8.376388549804688,47.431803338643334],[8.377761840820312,47.42808726171425],[8.389434814453125,47.42739046807988],[8.391494750976562,47.41902822496511],[8.380165100097656,47.40462347023052],[8.364715576171875,47.4016026187529],[8.367118835449219,47.39881398671558],[8.380851745605469,47.39788440990287],[8.39424133300781,47.39439835079049],[8.399734497070312,47.372314620566925],[8.40728759765625,47.37068703239024],[8.404197692871094,47.34417352612498],[8.416213989257812,47.33416935720614],[8.414497375488281,47.32602502961836],[8.452606201171875,47.33254059215931],[8.444023132324219,47.31927592106609],[8.427543640136719,47.29925625338924],[8.390121459960938,47.28854494625744],[8.41175079345703,47.247076403108416],[8.393898010253906,47.227728840642065],[8.404884338378906,47.194845099780174],[8.401451110839844,47.17757880776958],[8.409690856933594,47.17314466448546],[8.412437438964844,47.13976002139446],[8.379478454589844,47.13929295458033],[8.361968994140625,47.14559801038333],[8.342742919921875,47.177112073280966],[8.3056640625,47.24987305653909],[8.295021057128906,47.26268916206698],[8.300514221191406,47.26991141830738],[8.278884887695312,47.28225686421767],[8.259315490722656,47.285983225286174],[8.243522644042969,47.280859411143915],[8.240432739257812,47.27130916053537],[8.228759765625,47.27270686584952],[8.219146728515625,47.25336866567523],[8.204727172851562,47.245444953748034],[8.203353881835938,47.22679624955806],[8.180007934570312,47.22143353240336],[8.171768188476562,47.2279619858493],[8.155975341796875,47.23961793870555],[8.175888061523436,47.24218190428504],[8.17657470703125,47.25406775981567],[8.136062622070312,47.24730946320093],[8.12164306640625,47.24218190428504],[8.10791015625,47.2447457457832],[8.097267150878906,47.259427174956194],[8.077354431152344,47.2603591917818],[8.059844970703125,47.25569894358661],[8.062591552734375,47.24614415248379],[8.016586303710938,47.242881146090085],[8.015899658203125,47.258961160390896],[7.997016906738281,47.2796948387185],[7.951698303222655,47.274337475394645],[7.960968017578125,47.25430078914495],[7.933845520019531,47.237053849043896],[7.911529541015624,47.24381345414034],[7.859344482421875,47.23425651880584],[7.83977508544922,47.23425651880584],[7.826042175292968,47.24427960201268],[7.828102111816407,47.25966018070071],[7.82398223876953,47.26548499105541],[7.8408050537109375,47.273405704663965],[7.848701477050781,47.28551744450745],[7.860374450683594,47.30461109337307],[7.871704101562499,47.31136207506936],[7.8888702392578125,47.31136207506936],[7.897453308105469,47.31904317780638],[7.895393371582031,47.327653995607086],[7.908439636230469,47.340451266106996],[7.9259490966796875,47.332773275955894],[7.94757843017578,47.331609846720866],[7.94757843017578,47.316715688820764],[8.007316589355467,47.33905535093827],[8.004913330078125,47.34533667855891],[8.011093139648438,47.35719936945847],[8.024139404296875,47.36719917429931],[8.032722473144531,47.38393878966209],[8.026885986328125,47.39602520707679],[8.010749816894531,47.3955603961201],[8.004570007324219,47.40671472747142],[7.975730895996094,47.41507892620099],[7.9657745361328125,47.42181578692778],[7.985343933105469,47.425764580393924],[7.971954345703124,47.46105827584221],[7.957534790039062,47.457344265054225],[7.940711975097656,47.46221885041022],[7.946891784667968,47.48403288391224],[7.907066345214844,47.48588897929538],[7.8936767578125,47.50653361720931],[7.873420715332031,47.51325876844644],[7.875480651855468,47.52253342509336],[7.865180969238281,47.51975120023913],[7.856254577636718,47.533660849056794],[7.833251953125,47.5325018525392],[7.834281921386719,47.51465007145751],[7.789649963378906,47.49377665301097],[7.789649963378906,47.518128167602484],[7.7515411376953125,47.52461999690649],[7.731285095214843,47.53203824675999],[7.708969116210937,47.54015075619555],[7.740898132324219,47.54362716173679],[7.761497497558593,47.54895720250044],[7.781410217285156,47.55289644950155],[7.797546386718749,47.55915229204993],[7.805442810058593,47.56563904359584],[7.814369201660155,47.575136052077276],[7.819175720214843,47.58648387645128],[7.8325653076171875,47.586715439092906],[7.843208312988281,47.581620824334166],[7.859344482421875,47.58602074809481],[7.8847503662109375,47.58764167941513],[7.903633117675781,47.58092606572345],[7.911872863769532,47.56749225365282],[7.90740966796875,47.55776216936179],[7.917709350585938,47.545712894408624],[7.929382324218749,47.54640812019053],[7.941741943359374,47.54432241518175],[7.9520416259765625,47.54965238525127],[7.9561614990234375,47.55683540041267],[7.9767608642578125,47.55544521625339],[7.997360229492187,47.556603705614094],[8.019676208496094,47.54965238525127],[8.049888610839844,47.55637200979099],[8.058815002441406,47.56285910557121],[8.072891235351562,47.56355410390809],[8.086967468261719,47.557067094186735],[8.100700378417969,47.56216409801383],[8.105506896972656,47.57976811421671],[8.113059997558594,47.583473468887405],[8.133659362792969,47.58301031389572],[8.138809204101562,47.59042030203756],[8.15185546875,47.59551406038282],[8.166275024414062,47.5941249027327],[8.177261352539062,47.6017648134425],[8.193740844726562,47.616346999837226],[8.2012939453125,47.62120682516921],[8.219490051269531,47.61958693358351],[8.223953247070312,47.61102381568743],[8.222923278808594,47.604774168947614]]],"terms_text":"AGIS OF2016","best":true},{"id":"Basel-Landschaft-2015","name":"Kanton Basel-Landschaft 10cm (2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[18,21],"polygon":[[[7.370281219482422,47.413684985326796],[7.357578277587891,47.41507892620101],[7.357921600341797,47.41827323486739],[7.353544235229492,47.4196089792119],[7.344875335693359,47.42402250214274],[7.339725494384765,47.42971307765559],[7.332687377929687,47.430235650685475],[7.32685089111328,47.4319194618196],[7.325280543317693,47.43489176778178],[7.33050406703179,47.44175856152086],[7.338990092194756,47.44109169292469],[7.344964876980962,47.43607806019703],[7.352656881264292,47.43435807026775],[7.38119797480828,47.432081698142134],[7.375988960266113,47.414309359238985],[7.378145456314087,47.41399717320828],[7.382040023803711,47.41330745332341],[7.388391494750976,47.41397539271845],[7.413708184603623,47.410929293287566],[7.420743520414262,47.411098781635985],[7.427483310496426,47.41448047082256],[7.438105529405026,47.412739349590474],[7.448396898794484,47.41507114537187],[7.455576414208223,47.42792319548619],[7.45061852232364,47.43534476535272],[7.437842682352891,47.446323188615104],[7.425422575234655,47.443283894442736],[7.420904049355535,47.44594415975335],[7.422417620777747,47.45071647996838],[7.428795928789581,47.45387944195848],[7.430028776685507,47.459491697398036],[7.445765194338128,47.46197276972992],[7.44717015944249,47.456958090215814],[7.456512189239691,47.44925575541638],[7.492356675875099,47.458972279610066],[7.530679075390223,47.46118857622267],[7.527445320030451,47.473906165741866],[7.536326693749955,47.48383279861684],[7.536231113003725,47.49105266753894],[7.532603895549507,47.490968962664795],[7.531789123586811,47.49739885661967],[7.520038351186771,47.49678264400428],[7.512226152318425,47.49891674929323],[7.509348758631863,47.508884893812876],[7.499082452238831,47.51627805213703],[7.497870355425969,47.52124757864722],[7.502278119030558,47.514906577969604],[7.517459288006065,47.51728104695845],[7.522200236749534,47.514091442409054],[7.530955756497733,47.52904526885427],[7.519353655277215,47.53471778813415],[7.510751927105658,47.528989768842564],[7.50229842095598,47.52840455858729],[7.4980383403841,47.536152181750076],[7.505454651706732,47.54438188661593],[7.516758242758337,47.545408295649786],[7.527317399933993,47.552778846515565],[7.554658254426867,47.564368052237306],[7.5645783501094,47.55703599040843],[7.561243624111692,47.55172275211291],[7.558752685660356,47.55235329499035],[7.555882119169953,47.54433555917895],[7.564785321950861,47.54568625396918],[7.587263056821628,47.54190064304111],[7.582688476068778,47.53246814131337],[7.589482524394103,47.5279230654027],[7.590248428005343,47.51978966346127],[7.594781326929009,47.51929395578897],[7.613780785019665,47.53925099543145],[7.622303281783164,47.53977428916004],[7.622854488041502,47.550040256825795],[7.617740918118178,47.554366555487356],[7.617617220103555,47.558648485827725],[7.632727781497729,47.5614887674157],[7.639973682410965,47.55816478484801],[7.648995462809379,47.548295861439875],[7.661308760240334,47.544832242956765],[7.665860164458853,47.53745814872834],[7.674674254363578,47.5337535789565],[7.694938989531916,47.532496041115465],[7.71346844906592,47.53978344629896],[7.715956243413761,47.53582195507857],[7.723622825374551,47.536754165368905],[7.727157067196862,47.53293048764033],[7.733221863174538,47.53275465944404],[7.737974130690588,47.52732498381306],[7.749022330706917,47.5249849998809],[7.757861753102653,47.52605097450287],[7.787633628417415,47.52011695778467],[7.790143521321244,47.51864117486466],[7.788870069574476,47.50682929074843],[7.792799480290271,47.500684271209245],[7.786625359342518,47.49312139201968],[7.798890147748131,47.49565149600841],[7.798162871694108,47.49939947973339],[7.799400121334925,47.497477088945935],[7.807418124234862,47.4971384859743],[7.814709929059118,47.504801278976316],[7.831976267472122,47.51473657456054],[7.833207588232065,47.53382387257594],[7.846527268275818,47.53266095290337],[7.852330295179702,47.53523506225097],[7.862569292788096,47.52692027402488],[7.86395674074442,47.519309183202445],[7.876658649367283,47.52269034821798],[7.87567113137545,47.51319304945735],[7.893993798731052,47.50605656803392],[7.904769180395594,47.49217505264052],[7.904821911502771,47.48490926161113],[7.93328835504665,47.48140776210853],[7.947015241408695,47.48488995686335],[7.940027875634228,47.462021295570224],[7.948854362289874,47.46377967418039],[7.957614193951437,47.45880646812721],[7.957849013566705,47.451279351685564],[7.946784554043733,47.44319336966537],[7.950032053627354,47.431716361052416],[7.96183169437885,47.421834282667845],[7.956570351591289,47.41968057428149],[7.955037646053525,47.415605646331336],[7.948388855309641,47.4162657867356],[7.934927870271696,47.41176694218953],[7.936722434714782,47.408057452805856],[7.932661510641391,47.40527495151619],[7.909737672400531,47.398520997340924],[7.890221593189976,47.407141074214024],[7.883331964118422,47.40609724771633],[7.883443085719068,47.4012049891245],[7.877702761222016,47.401257097623],[7.869136696167237,47.3955142728722],[7.879434713089799,47.38799354849815],[7.878812180597903,47.38351047538804],[7.862650230995195,47.38198499163919],[7.840119046365023,47.374763282921705],[7.830547227518145,47.36512144155488],[7.80216648325237,47.36109584064414],[7.796366151294341,47.3534705803715],[7.793560892325092,47.33905227137494],[7.78528803737905,47.3378822997136],[7.768963133383802,47.33891408469915],[7.766419194330703,47.342734660857005],[7.751518928544542,47.3443274446774],[7.734153146629586,47.35776074638933],[7.727913718160677,47.36885889855421],[7.701953574259492,47.37244716296033],[7.644203220263186,47.36720838530677],[7.641761060331779,47.38046937860509],[7.635580022356337,47.38059279713257],[7.633316986492583,47.38291397270416],[7.633305398225418,47.38533959871929],[7.637251158279386,47.38606854199808],[7.63272275093214,47.41003108104519],[7.664054730400831,47.41001995588381],[7.679802017668389,47.41751395224505],[7.686578998003315,47.43366406703297],[7.682972441800632,47.43872228466388],[7.684853783500164,47.447843589969715],[7.692273418589347,47.45421309996921],[7.698831030331891,47.45585888435835],[7.699930658071183,47.46190517358485],[7.709877972706822,47.469384739707586],[7.699760966314013,47.48063247960835],[7.668326578902932,47.48634665620256],[7.666120855554305,47.49686816039971],[7.65217109717027,47.49581439933043],[7.648646287658441,47.49183004211102],[7.655389581170213,47.49020559719241],[7.650513795302598,47.48826095607083],[7.655925875394832,47.48739459757455],[7.644422678687097,47.485637798180356],[7.640965961473804,47.482734093980326],[7.607299799570857,47.48939839412024],[7.608850381582776,47.48352506892989],[7.605631268762133,47.47935909729055],[7.608148977008936,47.475213682276376],[7.604494899927722,47.47044546774548],[7.618872436050056,47.4674530520825],[7.626072253389216,47.462913883669614],[7.62217338539308,47.46195224188912],[7.616464591762502,47.445234574416695],[7.615798850305441,47.432747890966844],[7.592069133423196,47.43271179535717],[7.581206884670679,47.42878068945942],[7.578423275099778,47.434906655087865],[7.568904367023134,47.43689695884281],[7.56829539909203,47.42233486107083],[7.58074128785892,47.414703988151935],[7.525235194936931,47.41163289737562],[7.531172340312734,47.40352507464003],[7.518616677418122,47.38822295597742],[7.511295677347134,47.38974369796625],[7.502255661148456,47.384806980223004],[7.492327480628366,47.385231761698726],[7.478410241257615,47.39055778320416],[7.47746817801916,47.401277162725364],[7.464484018734026,47.40251498235377],[7.460919593518167,47.40068414452088],[7.450020783333588,47.40392739156406],[7.44951323519806,47.39975827367453],[7.443401098004909,47.40231427489849],[7.441311347159463,47.40017886074712],[7.443566657511773,47.38890284041263],[7.437324174770898,47.3808884773088],[7.411692544769116,47.38057235919037],[7.416276198506335,47.384788794341716],[7.414494030814171,47.39429988358522],[7.398935569419335,47.39683906243558],[7.395920463999715,47.40338304393273],[7.388693876865087,47.403019088497395],[7.384054886906365,47.4123601395877],[7.379679679870605,47.4128137535428],[7.375844120979309,47.41401169352981],[7.370281219482422,47.413684985326796]]],"terms_url":"http://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p1.pdf","terms_text":"Geodaten des Kantons Basel-Landschaft 2015","best":true},{"id":"KTBASELSTADT2015","name":"Kanton Basel-Stadt 2015","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[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":"Solothurn-sogis2014-tms","name":"Kanton Solothurn 25cm (SOGIS 2014-2015)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[15,19],"polygon":[[[7.3404127,47.2175697],[7.4154818,47.2402115],[7.4173645,47.2537956],[7.4658424,47.2646513],[7.4946766,47.2882287],[7.5328638,47.294534],[7.5483333,47.3163566],[7.5709479,47.3263111],[7.5604584,47.342492],[7.5388991,47.3476266],[7.5396485,47.3601134],[7.5217459,47.3651488],[7.5237238,47.3720704],[7.4634937,47.3702566],[7.4361035,47.3781317],[7.4434011,47.4023143],[7.4774682,47.4012772],[7.4792364,47.3897076],[7.5022557,47.384807],[7.5213659,47.3912021],[7.5311724,47.4035251],[7.5252352,47.4116329],[7.5807413,47.414704],[7.5682954,47.4223349],[7.5689044,47.436897],[7.5812069,47.4287807],[7.6157989,47.4327479],[7.6260723,47.4629139],[7.6044949,47.4704455],[7.6072998,47.4893984],[7.640966,47.4827341],[7.6559259,47.4873946],[7.6521711,47.4958144],[7.6661209,47.4968682],[7.6683266,47.4863467],[7.699761,47.4806325],[7.709878,47.4693848],[7.6848538,47.4478436],[7.6798021,47.417514],[7.6327228,47.4100311],[7.633317,47.382914],[7.6417611,47.3804694],[7.6442033,47.3672084],[7.7279138,47.3688589],[7.751519,47.3443275],[7.7935609,47.3390523],[7.8021665,47.3610959],[7.8788122,47.3835105],[7.8691367,47.3955143],[7.883332,47.4060973],[7.9097377,47.398521],[7.9550377,47.4156057],[7.9618317,47.4218343],[7.9467846,47.4431934],[7.9682836,47.4628082],[7.9872707,47.4287435],[7.9854653,47.4227641],[7.9827035,47.4283325],[7.9631993,47.4223547],[8.0072617,47.4065858],[8.0100022,47.395418],[8.0265612,47.3956224],[8.0313669,47.3836856],[8.0038366,47.3453146],[8.0051906,47.3367516],[7.9479701,47.3171432],[7.9478307,47.3325169],[7.9192088,47.3339507],[7.9078055,47.341719],[7.889098,47.3114878],[7.8611018,47.3061239],[7.8418057,47.2744707],[7.8166423,47.2616706],[7.8028241,47.2684079],[7.7861469,47.256098],[7.7746009,47.267869],[7.7568187,47.258095],[7.7326672,47.2591133],[7.684769,47.2939919],[7.6482742,47.2819898],[7.5801066,47.2763483],[7.5936981,47.2662199],[7.5959384,47.245569],[7.6261802,47.2263143],[7.6405558,47.2297944],[7.6484666,47.2189525],[7.6472258,47.2017823],[7.6715278,47.1949714],[7.6711002,47.1845216],[7.6779881,47.1819259],[7.6728612,47.1683945],[7.6600808,47.1684026],[7.6451021,47.1489207],[7.6155322,47.1565739],[7.5861404,47.1475453],[7.5810534,47.16013],[7.5634674,47.1683541],[7.5257686,47.162205],[7.5203336,47.1588879],[7.5297508,47.1487369],[7.5097234,47.1255457],[7.4613252,47.1082327],[7.4750945,47.0867101],[7.454461,47.074927],[7.4354156,47.0801664],[7.4340002,47.1005003],[7.3820271,47.0957398],[7.3704914,47.1209312],[7.4401788,47.1237276],[7.4217922,47.1358605],[7.447783,47.1550805],[7.4728074,47.1525609],[7.4970383,47.1700873],[7.4804964,47.171738],[7.4708545,47.181324],[7.4757226,47.1906485],[7.4497638,47.1895691],[7.4476258,47.1810839],[7.4332849,47.1847269],[7.4118135,47.1624212],[7.3842442,47.1601249],[7.3821749,47.1651186],[7.391911,47.1662739],[7.3835137,47.1803011],[7.3654609,47.1944525],[7.3544799,47.1915316],[7.3404127,47.2175697]],[[7.420816,47.4803666],[7.4349836,47.4981011],[7.4707584,47.480734],[7.487277,47.4820136],[7.5116652,47.5026958],[7.5317892,47.4973989],[7.5366964,47.4850517],[7.5274454,47.4739062],[7.5306791,47.4611886],[7.4565122,47.4492558],[7.445214,47.4623781],[7.4557367,47.4733767],[7.420816,47.4803666]],[[7.3759458,47.4140995],[7.3821514,47.4330266],[7.4209041,47.4459442],[7.4378427,47.4463232],[7.4555765,47.4279232],[7.4437574,47.413444],[7.3759458,47.4140995]],[[7.6744234,47.1539707],[7.6853662,47.1662986],[7.7007985,47.1617746],[7.6901531,47.1525567],[7.6744234,47.1539707]]],"terms_text":"Orthofoto WMS Solothurn","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAIVBMVEX///+LKCbMAABycnL+/v7v7+9sbGz39/fz8/Pw8PD8/Pz60siYAAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIGAsXN84mS+sAAAA4SURBVAjXY2AUBAMBBkYlMCCXwcwABgZYGCwGIJo5AMQGAjYgLgYxLICY05iBwRisjsvY2IGBAQAGpQmjMKkg/wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOC0yNFQxMToyMzo1NS0wNDowMLEFqzIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDgtMjRUMTE6MjM6NTUtMDQ6MDDAWBOOAAAAAElFTkSuQmCC"},{"id":"KTZUERICH2015","name":"Kanton Zürich 2015  10cm","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[8.807601928710938,47.66608099332474],[8.808631896972656,47.65475043477393],[8.830604553222656,47.648506014952225],[8.805885314941406,47.597597727711346],[8.749580383300781,47.61565270219988],[8.751983642578125,47.59505101193038],[8.807945251464844,47.585789182379905],[8.811721801757812,47.57467282332527],[8.840904235839844,47.57467282332527],[8.854637145996094,47.56216409801383],[8.8330078125,47.55382328811835],[8.845024108886719,47.53458802782819],[8.899612426757812,47.52786561031842],[8.895835876464844,47.491224888201955],[8.902702331542969,47.48588897929538],[8.887252807617188,47.475911695481756],[8.911285400390625,47.43969913094723],[8.934288024902344,47.43807362350206],[8.935317993164062,47.43017758727173],[8.917121887207031,47.42808726171425],[8.909912109375,47.404855836246135],[8.944587707519531,47.38905261221537],[8.945274353027344,47.379521907289295],[8.963127136230469,47.357664518690434],[8.973083496093748,47.35580389715929],[8.989906311035156,47.31857768821123],[8.973426818847656,47.30367985581531],[8.9593505859375,47.300653220457775],[8.941154479980469,47.2873805430142],[8.950080871582031,47.28458587064588],[8.940467834472656,47.259194168186234],[8.876266479492188,47.24847474828181],[8.876609802246092,47.243114224640834],[8.850173950195312,47.23961793870555],[8.849830627441406,47.247076403108416],[8.825111389160156,47.24824169331652],[8.800048828125,47.24031721435106],[8.804855346679688,47.23425651880584],[8.815155029296875,47.217702626593784],[8.793525695800781,47.21886856286133],[8.71490478515625,47.20021050593422],[8.685722351074219,47.18154588528182],[8.697395324707031,47.163108130899104],[8.660659790039062,47.15633823511178],[8.6572265625,47.16684287656919],[8.618087768554688,47.172444502751944],[8.622550964355469,47.17991241867412],[8.607101440429688,47.201376826785406],[8.595085144042969,47.19834433924206],[8.575859069824219,47.21513747655813],[8.541183471679688,47.2186353776589],[8.471488952636719,47.2053421258966],[8.441619873046875,47.22120035848172],[8.417243957519531,47.22120035848172],[8.383941650390625,47.292270864380086],[8.422050476074219,47.302282968719936],[8.442306518554688,47.32439601339355],[8.413810729980469,47.32299967378833],[8.408660888671875,47.33067908487908],[8.378448486328125,47.39718721653071],[8.360939025878906,47.39695481668995],[8.359222412109375,47.4053205652024],[8.379135131835938,47.40764414848437],[8.377418518066406,47.41624051540972],[8.384284973144531,47.42274494145051],[8.372611999511719,47.42808726171425],[8.372955322265625,47.437376962080776],[8.379478454589844,47.45037978769006],[8.36402893066406,47.46198673754625],[8.352012634277344,47.5079250985124],[8.373985290527344,47.517200697839414],[8.392181396484375,47.5366741201253],[8.417587280273436,47.56610235225701],[8.430290222167967,47.5693453981427],[8.491744995117188,47.581620824334166],[8.487625122070312,47.58648387645128],[8.463935852050781,47.58301031389572],[8.453292846679688,47.60315376826432],[8.479385375976562,47.617504142079596],[8.505821228027344,47.61958693358351],[8.513717651367188,47.635783590864854],[8.542213439941406,47.632776019724375],[8.545646667480469,47.627685889602006],[8.564186096191406,47.6256034207548],[8.566932678222656,47.61935551640258],[8.576202392578125,47.613569753973955],[8.564872741699219,47.60037582174319],[8.535346984863281,47.586715439092906],[8.550109863281248,47.5714301073211],[8.555259704589844,47.55498181333744],[8.581008911132812,47.59551406038282],[8.598861694335936,47.61449551898437],[8.59130859375,47.64642437575518],[8.609848022460938,47.65521295468833],[8.620834350585938,47.646886969413],[8.618431091308594,47.65660048985082],[8.602981567382812,47.666312203609145],[8.610877990722656,47.67856488312544],[8.62323760986328,47.67856488312544],[8.621864318847656,47.69312564683551],[8.64898681640625,47.697516190510555],[8.667526245117188,47.68665469810477],[8.671646118164062,47.67602211074509],[8.692245483398438,47.65197522925437],[8.734817504882812,47.64526787368664],[8.777389526367188,47.65313158281113],[8.785629272460938,47.667930646923494],[8.807601928710938,47.66608099332474]]],"terms_text":"Kanton Zürich OF 2015","best":true},{"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","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"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","scaleExtent":[9,20],"polygon":[[[-119.5867318,49.7928087],[-119.5465655,49.7928097],[-119.5465661,49.8013837],[-119.5343374,49.8013841],[-119.5343376,49.8047321],[-119.5296211,49.8047322],[-119.5296216,49.8119555],[-119.5104463,49.811956],[-119.5115683,49.8744325],[-119.5108946,49.8744904],[-119.5114111,49.8843312],[-119.5114115,49.9221763],[-119.49386,49.9223477],[-119.4940505,49.9313031],[-119.4803936,49.9317529],[-119.4804572,49.9407474],[-119.4666732,49.9409927],[-119.4692775,49.9913717],[-119.4551337,49.9916078],[-119.4556736,50.0121242],[-119.4416673,50.0123895],[-119.4417308,50.0136345],[-119.4221492,50.0140377],[-119.4221042,50.0119306],[-119.4121303,50.012165],[-119.4126082,50.0216913],[-119.4123387,50.0216913],[-119.4124772,50.0250773],[-119.4120917,50.0250821],[-119.4121954,50.0270769],[-119.4126083,50.0270718],[-119.4128328,50.0321946],[-119.3936313,50.0326418],[-119.393529,50.0307781],[-119.3795727,50.0310116],[-119.3795377,50.0287584],[-119.3735764,50.0288621],[-119.371544,49.9793618],[-119.3573506,49.9793618],[-119.3548353,49.9256081],[-119.3268079,49.9257238],[-119.3256573,49.8804068],[-119.3138893,49.8806528],[-119.3137097,49.8771651],[-119.3132156,49.877223],[-119.3131482,49.8749652],[-119.312452,49.8749073],[-119.3122275,49.87236],[-119.3117558,49.872331],[-119.3115986,49.8696098],[-119.3112169,49.8694217],[-119.3109199,49.8632417],[-119.3103721,49.8632724],[-119.3095139,49.8512388],[-119.3106368,49.8512316],[-119.3103859,49.8462564],[-119.3245344,49.8459957],[-119.3246018,49.8450689],[-119.3367018,49.844875],[-119.3367467,49.8435136],[-119.337937,49.8434702],[-119.3378023,49.8382055],[-119.3383637,49.8381041],[-119.3383749,49.8351202],[-119.3390936,49.8351058],[-119.3388016,49.8321217],[-119.3391497,49.8320565],[-119.3391722,49.8293331],[-119.3394641,49.8293331],[-119.3395879,49.8267878],[-119.3500053,49.8265829],[-119.3493701,49.8180588],[-119.4046964,49.8163785],[-119.4045694,49.8099022],[-119.4101592,49.8099022],[-119.4102862,49.8072787],[-119.4319467,49.8069098],[-119.4322643,49.7907965],[-119.4459847,49.7905504],[-119.445286,49.7820201],[-119.4967376,49.7811587],[-119.4966105,49.7784927],[-119.5418371,49.7775082],[-119.5415892,49.7718277],[-119.5560296,49.7714941],[-119.5561194,49.7718422],[-119.5715704,49.7715086],[-119.5716153,49.7717262],[-119.5819235,49.7714941],[-119.5820133,49.7717697],[-119.5922991,49.7715231],[-119.592344,49.7718132],[-119.6003839,49.7715957],[-119.6011924,49.7839081],[-119.5864365,49.7843863],[-119.5867318,49.7928087]]],"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","scaleExtent":[5,14],"polygon":[[[-60.8550011,6.1765004],[-60.4762612,7.9188291],[-62.161689,8.2778675],[-62.5322549,6.5375488],[-60.8550011,6.1765004]]],"description":"Recent Landsat imagery"},{"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","scaleExtent":[5,13],"polygon":[[[-121.9355512,47.7820648],[-121.5720582,48.6410125],[-121.2015461,49.4846247],[-121.8375516,49.6023246],[-122.4767046,49.7161735],[-123.118912,49.8268824],[-123.760228,49.9335836],[-124.0887706,49.0870469],[-124.4128889,48.2252567],[-123.792772,48.1197334],[-123.1727942,48.0109592],[-122.553553,47.8982299],[-121.9355512,47.7820648]]],"description":"Recent lower-resolution landsat imagery for southwest British Columbia"},{"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","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"http://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data","terms_text":"Sourced from LINZ CC-BY 3.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","scaleExtent":[0,21],"polygon":[[[167.2503662109375,-47.21956811231548],[167.244873046875,-47.28016067076474],[167.5030517578125,-47.37975438400816],[168.2501220703125,-47.15610477504402],[168.7445068359375,-46.79629898997744],[169.3267822265625,-46.75491661928188],[169.78271484375,-46.604167162931844],[170.4254150390625,-46.11132565729794],[170.804443359375,-45.95114968669139],[170.9527587890625,-45.440862671781744],[171.309814453125,-44.91035917458493],[171.40869140625,-44.39061697878681],[172.562255859375,-43.92954993561458],[172.90283203125,-43.96909818325171],[173.1610107421875,-43.90976594390799],[173.2598876953125,-43.69567969789881],[172.9742431640625,-43.53660274231031],[172.760009765625,-43.37710501700071],[173.1500244140625,-43.17714134663171],[173.704833984375,-42.63395872267314],[174.36401367187497,-41.78360106648077],[174.320068359375,-41.409775832009544],[174.84741210937497,-41.52914198872309],[175.0726318359375,-41.70572851523751],[175.506591796875,-41.672911819602085],[176.2261962890625,-41.10832999732831],[176.8304443359375,-40.42604212826493],[177.17102050781247,-39.67337039176559],[177.0391845703125,-39.39375459224347],[177.4456787109375,-39.18117526158747],[177.60498046875,-39.3300485529424],[177.978515625,-39.368279149160124],[178.3355712890625,-38.65977773071253],[178.7091064453125,-37.74465712069938],[178.626708984375,-37.54457732085582],[178.3135986328125,-37.43125050179357],[177.6214599609375,-37.37888785004525],[177.0391845703125,-37.39634613318924],[176.561279296875,-37.37015718405751],[176.3360595703125,-37.05956083025124],[176.0064697265625,-36.29741818650809],[175.6768798828125,-36.05354012833974],[174.671630859375,-35.1782983520012],[173.1939697265625,-34.28445325435288],[172.6776123046875,-34.234512362369856],[172.386474609375,-34.40237742424137],[172.4798583984375,-34.71903991764788],[172.9852294921875,-35.32184842037683],[173.56201171875,-36.142310873529986],[174.30908203125,-37.077093191754415],[174.5562744140625,-38.052416771864834],[174.4793701171875,-38.655488159952995],[174.3255615234375,-38.865374851611634],[173.7982177734375,-38.95940879245421],[173.60595703125,-39.232253141714885],[173.6993408203125,-39.56335316582929],[174.5892333984375,-39.95606977009003],[174.9847412109375,-40.216635475391215],[174.9847412109375,-40.49291502689579],[174.7210693359375,-40.805493843894155],[174.1497802734375,-40.65147128144056],[173.2818603515625,-40.43440488077009],[172.5897216796875,-40.350730565917885],[172.0843505859375,-40.534676780615406],[171.7657470703125,-40.826280356677124],[171.57348632812497,-41.3974150664646],[171.2823486328125,-41.652392884268124],[170.8758544921875,-42.53284428171312],[170.35400390625,-42.87193842444846],[168.277587890625,-43.92954993561458],[167.6239013671875,-44.47691085722324],[166.55273437499997,-45.38687734827038],[166.27258300781247,-45.916765867649],[166.4813232421875,-46.22545288226937],[167.6788330078125,-46.471916320870406],[167.2503662109375,-47.21956811231548]]],"terms_url":"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps/","terms_text":"Sourced from the LINZ Data Service and licensed by LINZ for re-use under the Creative Commons Attribution 3.0 New Zealand licence."},{"id":"ORT10LT","name":"Lithuania - NŽT ORT10LT","type":"tms","template":"http://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg","endDate":"2016-01-01T00:00:00.000Z","startDate":"2010-01-01T00:00:00.000Z","scaleExtent":[4,18],"polygon":[[[26.2138385,55.850748],[26.3858298,55.7045315],[26.6303618,55.6806692],[26.6205349,55.5689227],[26.5242191,55.5099228],[26.5541476,55.388833],[26.4399286,55.3479351],[26.7919694,55.3212027],[26.8291304,55.2763488],[26.7434625,55.2539863],[26.6764846,55.158828],[26.4611191,55.1285624],[26.3577434,55.1505399],[26.2296342,55.1073177],[26.2713814,55.0775905],[26.2085126,54.997414],[26.0619117,54.9416094],[25.8578176,54.9276001],[25.7429827,54.8150641],[25.7626083,54.5769013],[25.5319352,54.3418175],[25.6771618,54.3238109],[25.7857293,54.2336242],[25.7858844,54.1550594],[25.5550843,54.1461918],[25.5109462,54.1750267],[25.5896725,54.2285838],[25.5136246,54.3078472],[25.2689287,54.2744706],[25.0705963,54.1336282],[24.9573726,54.1720575],[24.8133801,54.144862],[24.7790172,54.0999054],[24.8712786,54.034904],[24.819568,53.9977218],[24.6845912,53.9621091],[24.697865,54.0171421],[24.6259068,54.0105048],[24.4342619,53.9014424],[24.3520594,53.8967893],[24.2016059,53.9700069],[23.9683341,53.9266977],[23.9130177,53.9696842],[23.7781192,53.8989169],[23.7097655,53.9394502],[23.5370435,53.9430702],[23.4822428,53.9893848],[23.5273356,54.0473482],[23.4858579,54.1532339],[23.3867851,54.224838],[23.0421216,54.3159745],[23.0102115,54.3827959],[22.8546899,54.4104029],[22.7919963,54.3633227],[22.7023421,54.4528985],[22.6838586,54.585972],[22.7489713,54.6319792],[22.7429727,54.7268221],[22.8866837,54.8135001],[22.8204005,54.9119829],[22.6424041,54.9713362],[22.5892361,55.070243],[22.080597,55.0244812],[22.0324081,55.084098],[21.9130671,55.0816838],[21.6491949,55.1808113],[21.5015124,55.1868198],[21.3843708,55.2936996],[21.2709829,55.2450059],[21.0983616,55.2563884],[20.9421741,55.282453],[21.0863466,55.5618266],[21.0399547,55.8363584],[21.0640261,56.0699542],[21.2047804,56.0811668],[21.2307958,56.1623302],[21.5021038,56.2954952],[21.7235874,56.3138211],[21.8356623,56.37162],[21.9695397,56.3766515],[22.0153001,56.4242811],[22.4372717,56.406405],[22.6800028,56.3515884],[22.9191739,56.3790184],[22.9466759,56.4146477],[23.0932498,56.3046383],[23.1703443,56.3667721],[23.3064522,56.3830535],[23.5571715,56.3338187],[23.7647953,56.3733238],[23.7666897,56.3238079],[24.0189971,56.3297615],[24.1214631,56.2488984],[24.2857421,56.3006367],[24.4541496,56.2581579],[24.5794651,56.2882389],[24.6284061,56.3753322],[24.9023767,56.4805317],[25.1277405,56.2059091],[25.5771398,56.182414],[25.6731232,56.1493667],[26.2138385,55.850748]]],"terms_url":"http://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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw","scaleExtent":[0,16],"overzoom":false,"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Shows major features to help orient you.","overlay":true},{"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}","polygon":[[[-51.10903142008701,-23.392750890870328],[-51.110147219037096,-23.39111628244602],[-51.111981850003126,-23.389599820448623],[-51.11358044657587,-23.38976722295012],[-51.120999436701226,-23.38592675938185],[-51.12224934611127,-23.385109415587607],[-51.12483499560139,-23.383504255873166],[-51.12538216624037,-23.38186953335707],[-51.12482426676533,-23.37770385409619],[-51.12445948633935,-23.375054689723584],[-51.124373655650885,-23.372297138974446],[-51.12244246516032,-23.37032742475139],[-51.12302182230749,-23.366427304263887],[-51.128557901713755,-23.36548180323493],[-51.12832186732048,-23.358843408308623],[-51.12477062258506,-23.35475580404945],[-51.12703440699343,-23.35091432623551],[-51.12411616358548,-23.34679692655685],[-51.12025378260435,-23.347811512977742],[-51.1176466754421,-23.33969460448754],[-51.11264703783877,-23.341290443649072],[-51.109396200513004,-23.33488726938344],[-51.10756156954697,-23.334089313725826],[-51.10485790286019,-23.333980949007543],[-51.10252974543546,-23.334187827029368],[-51.09986899409291,-23.331015661953632],[-51.09801290545476,-23.329360589233605],[-51.09998701128955,-23.32830645478855],[-51.10322711977927,-23.325321337105603],[-51.10472915682748,-23.323193291476684],[-51.104664783811145,-23.321291814470847],[-51.10514758143378,-23.318444474199904],[-51.1063599399084,-23.3157547161216],[-51.10660670313775,-23.31467091543279],[-51.11050127062705,-23.311665785493048],[-51.111584883068964,-23.30842411016493],[-51.099504213666904,-23.309468549142686],[-51.09740136179941,-23.308631027972474],[-51.09511611971892,-23.307448636164267],[-51.09201548609798,-23.3049360186679],[-51.09036324534495,-23.3037141796735],[-51.09204767260616,-23.29874787986134],[-51.09269140276969,-23.297496421894902],[-51.09407542262125,-23.292953629109174],[-51.10073802981369,-23.293318240761657],[-51.10101697955121,-23.28870632248831],[-51.10068438563339,-23.28837126237015],[-51.10084531817427,-23.28777997775132],[-51.09937546763423,-23.28663682004102],[-51.09631774935752,-23.277914991984613],[-51.10285161051725,-23.273016720553397],[-51.10835550341534,-23.27033590016574],[-51.11309764895328,-23.268404099092194],[-51.13160489115448,-23.265338785827712],[-51.13188384089201,-23.262007272160396],[-51.1317336371872,-23.255058136908826],[-51.13290308031759,-23.254683563301587],[-51.132956724497895,-23.250750476893938],[-51.13473771128364,-23.2512729236245],[-51.13533852610292,-23.25133206840842],[-51.13516686472599,-23.24359373640034],[-51.13534925493897,-23.24117849627157],[-51.137516479822814,-23.24219388826517],[-51.13884685549409,-23.243495156026544],[-51.14108918223035,-23.24521044413634],[-51.1471724322756,-23.243179698340864],[-51.14761231455401,-23.23828015040167],[-51.149082165094036,-23.235884531292832],[-51.14976881060179,-23.236811236789336],[-51.15138886484666,-23.23853646924079],[-51.15289090189487,-23.238842079520833],[-51.15383503946804,-23.238950521710013],[-51.15820167574391,-23.238142132361276],[-51.16045473131624,-23.238161849232945],[-51.160347442955654,-23.24658068718069],[-51.15912435564498,-23.2478326235554],[-51.16131303820094,-23.247773477219496],[-51.166591625541805,-23.245939927797],[-51.17193458589902,-23.245821633420345],[-51.17205260309565,-23.249557713480034],[-51.174241285651625,-23.248404370116877],[-51.17514250788055,-23.2493211310392],[-51.176859121649926,-23.248157927934038],[-51.179466228812196,-23.251686936561047],[-51.18135450395853,-23.253806268366073],[-51.18273852381009,-23.253628837227893],[-51.18378994974384,-23.253264116924615],[-51.18495939287424,-23.253303546194683],[-51.18626831087339,-23.252150235227905],[-51.18665454897149,-23.247477745146526],[-51.191182117788244,-23.249143693933142],[-51.19141815218154,-23.252859966234126],[-51.19369266542598,-23.252781107419985],[-51.1938428691308,-23.26073575534214],[-51.20096681627374,-23.26054847664639],[-51.20126722368338,-23.24259807127726],[-51.209936123218775,-23.242775517090898],[-51.21090171846407,-23.26988252079656],[-51.21968863519614,-23.27221839365197],[-51.225965004290465,-23.2745345140599],[-51.22934458764894,-23.27860487489667],[-51.234515886629225,-23.28160089636689],[-51.23497722657975,-23.283246708422755],[-51.235073786104266,-23.285444377831148],[-51.23371122392482,-23.285897704227196],[-51.232155542696304,-23.28801649191402],[-51.22870085748543,-23.292293383844925],[-51.227402668322334,-23.294599300809004],[-51.22679112466699,-23.295476327114592],[-51.225600223864475,-23.29657013833941],[-51.22392652543933,-23.297210654251764],[-51.220482569064515,-23.30072850975029],[-51.21863720926242,-23.301300029310937],[-51.21668456109974,-23.30211788923888],[-51.21423838647836,-23.30441378240661],[-51.210966091480465,-23.306965823153238],[-51.22328279527583,-23.318296686707587],[-51.224387865389886,-23.31459209321986],[-51.22521398576639,-23.312887551432937],[-51.22511742624187,-23.312582111000477],[-51.22521398576639,-23.312513140483127],[-51.2255251220121,-23.312532846348883],[-51.22595427545445,-23.312385052284572],[-51.22616885217561,-23.31183328632629],[-51.22935531648505,-23.314887676277397],[-51.22802494081377,-23.31661189768144],[-51.227885465945,-23.31901591762422],[-51.22767088922384,-23.320227763653186],[-51.22723100694544,-23.321508564518947],[-51.2273919394863,-23.322227778055023],[-51.22725246461755,-23.322848466059934],[-51.230331640566384,-23.325577488448165],[-51.23046038659909,-23.326710459617892],[-51.229537706698046,-23.32789268010374],[-51.229162197436,-23.330503379743732],[-51.229290943468705,-23.33178408156439],[-51.22681258233914,-23.334473515196468],[-51.2260186484708,-23.336571826694826],[-51.22473118814376,-23.33839427691611],[-51.22210262330938,-23.340226553005806],[-51.22257469209598,-23.34196029634743],[-51.22380850824271,-23.343388647432523],[-51.22384069475089,-23.345309509145306],[-51.22440932306201,-23.347003784611864],[-51.2245380690947,-23.348294177581966],[-51.22404454263601,-23.34968305981433],[-51.22350810083308,-23.35010661675208],[-51.22381923707877,-23.35076657486812],[-51.22304676088255,-23.35174173085325],[-51.22259614976809,-23.35296312824164],[-51.22586844476598,-23.35480505304304],[-51.22650144609346,-23.36705763453823],[-51.22354028734128,-23.369145582171885],[-51.22366903337377,-23.37968330666716],[-51.220375280703756,-23.381633186264455],[-51.216469984378406,-23.38170212087667],[-51.21416328462579,-23.379949201028825],[-51.2092816642191,-23.37395167630701],[-51.20738266023672,-23.368141007697016],[-51.20628831895872,-23.36723491438801],[-51.20472190889416,-23.366269721227162],[-51.198230963078665,-23.366683376299132],[-51.19297383340994,-23.366506095711998],[-51.18986247095292,-23.3654424072124],[-51.18806002649507,-23.36464463523902],[-51.18718026193825,-23.3645264463904],[-51.18579624208668,-23.363738518041337],[-51.183038931219606,-23.36359078095478],[-51.18071077379488,-23.3637582163071],[-51.179069261877906,-23.361581540240305],[-51.177642326682125,-23.35836078207346],[-51.16683838877106,-23.356262814974126],[-51.166141014427254,-23.358538073547532],[-51.16475699457568,-23.360389770338585],[-51.16076586756186,-23.359217688669915],[-51.15983245882475,-23.36660458495632],[-51.162042599052846,-23.36861374957437],[-51.16276143106877,-23.374158492021696],[-51.158448438973174,-23.37580315788644],[-51.155047397942575,-23.376305417047273],[-51.15396378550066,-23.37903334042617],[-51.15298746141932,-23.381052164536694],[-51.15118501696147,-23.382076336717283],[-51.149167995782435,-23.382509637949354],[-51.14721534761976,-23.382155118864866],[-51.14517686876862,-23.382588419839323],[-51.14410398516276,-23.38376029492248],[-51.14512322458833,-23.388083341091015],[-51.141797285410156,-23.389402876058366],[-51.14030597719799,-23.38880219385971],[-51.14068148646006,-23.391608636504017],[-51.14127157244328,-23.393538646762796],[-51.14093897852546,-23.394434713394368],[-51.140456180902824,-23.39536031431835],[-51.13939402613302,-23.395104297688697],[-51.13738773379004,-23.393154616350518],[-51.13608954462695,-23.389796764546077],[-51.13428710016909,-23.389757375749994],[-51.132162790629465,-23.390072485790583],[-51.13172290835106,-23.39285920758337],[-51.12259266886514,-23.38864463742227],[-51.12228153261944,-23.391657871809155],[-51.11882684740854,-23.393174310244916],[-51.115683298443365,-23.393351555162592],[-51.10903142008701,-23.392750890870328]],[[-51.13829432042955,-23.41600741009485],[-51.133310776080314,-23.418665600378624],[-51.132087688769644,-23.416440600302334],[-51.13002238782791,-23.418291487939495],[-51.12868664773901,-23.419010176689888],[-51.12824140104259,-23.42102839134528],[-51.12696466955051,-23.421860280620358],[-51.12532852205271,-23.422692164660027],[-51.1244541219139,-23.420969322085504],[-51.1215144208339,-23.424109801147612],[-51.12063465627703,-23.423268081315832],[-51.11970661195797,-23.423120410617486],[-51.11977098497433,-23.42156985833077],[-51.1188000253111,-23.421545246243184],[-51.11643431696008,-23.420836416154565],[-51.11942766222045,-23.419167696990424],[-51.11787198099193,-23.416775337218567],[-51.116546969738685,-23.41730697646229],[-51.115699391690086,-23.415702207051474],[-51.115120034542905,-23.413088261827834],[-51.119078975048524,-23.411114231305813],[-51.119599323597356,-23.41169512115064],[-51.12052200349841,-23.41489489238112],[-51.12147686990764,-23.417139608782644],[-51.12308619531643,-23.418626220171642],[-51.12754939111684,-23.41653905242448],[-51.12803218873949,-23.417395582795194],[-51.13119719537679,-23.415574218468866],[-51.13080022844262,-23.414766903017576],[-51.13278506311348,-23.41264029239725],[-51.13521514448077,-23.411055157619415],[-51.13585887464424,-23.410956701416854],[-51.13682446988958,-23.411188073376714],[-51.137205343569626,-23.411576974270133],[-51.13730190309418,-23.41324086645236],[-51.137430649126884,-23.414707830961888],[-51.13829432042955,-23.41600741009485]],[[-51.18929065852,-23.61469318354],[-51.18868716149,-23.61385268133],[-51.18817754178,-23.61338573333],[-51.18731118826,-23.61301708899],[-51.18628926663,-23.61314488581],[-51.18401743559,-23.61395590119],[-51.18348904042,-23.61396573165],[-51.18183143525,-23.61283522407],[-51.18140496401,-23.61344471632],[-51.18062980561,-23.61313505529],[-51.18001021533,-23.61409352754],[-51.17865838198,-23.61328742827],[-51.18064589886,-23.61060367181],[-51.17972321896,-23.61018095058],[-51.18061639456,-23.60849005203],[-51.1821157494,-23.60850479833],[-51.18260927586,-23.60775273479],[-51.18319936184,-23.60804274673],[-51.18415154605,-23.60627808786],[-51.18511177687,-23.60666149766],[-51.18649043231,-23.60469528171],[-51.18902243762,-23.60610112912],[-51.18821241049,-23.60741848294],[-51.18918873458,-23.60801816947],[-51.188899056,-23.60953211999],[-51.18962325244,-23.60992535103],[-51.1911896625,-23.6111935131],[-51.1901489654,-23.61244691705],[-51.19054056792,-23.6127565797],[-51.19029380469,-23.61377895281],[-51.18929065852,-23.61469318354]],[[-51.08005769639,-23.52984412096],[-51.07962317853,-23.52205317842],[-51.08468182473,-23.52194496764],[-51.08581908135,-23.52404030606],[-51.0858941832,-23.52703569673],[-51.08579494147,-23.52777346722],[-51.08530141501,-23.52806365581],[-51.08513511805,-23.52856533627],[-51.08512438922,-23.52981952906],[-51.08470864682,-23.53023759067],[-51.08343459754,-23.53023759067],[-51.08329512267,-23.52978018202],[-51.08005769639,-23.52984412096]]],"terms_url":"http://siglon.londrina.pr.gov.br/","terms_text":"Prefeitura do Londrinas, PR"},{"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}","scaleExtent":[0,19],"polygon":[[[140.9948644,-28.952966],[148.9611382,-28.8997729],[148.9870097,-28.4862285],[151.013609,-28.4786485],[151.1084711,-28.7032909],[151.8759917,-28.683118],[151.9334839,-28.4078753],[152.25544,-28.2332683],[153.0660798,-28.2104723],[153.1408196,-28.1090981],[153.4735137,-28.1164808],[153.3576523,-27.693606],[159.4938303,-27.699252],[159.4856997,-37.8474137],[149.5256879,-37.8281502],[149.9159578,-37.4869999],[148.0485886,-36.8131741],[147.9680996,-36.1567945],[146.7147701,-36.2866613],[145.3004625,-36.1567945],[144.5300673,-36.1475101],[142.8397973,-35.0254303],[142.356863,-34.7802471],[141.9774146,-34.4016159],[140.9950258,-34.1371824],[140.9948644,-28.952966]]],"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}","scaleExtent":[0,21],"polygon":[[[140.9868688,-28.9887829],[148.9951472,-28.9727491],[148.9966717,-28.4915066],[151.0029027,-28.4930697],[151.0029027,-28.7261663],[151.4915093,-28.7323921],[151.4918687,-28.7155337],[151.9228213,-28.719635],[151.9251607,-28.4897139],[151.9955886,-28.4898718],[151.9989947,-28.1192742],[152.4967606,-28.122091],[152.4968241,-28.1146398],[153.0044563,-28.1154389],[153.0044563,-28.120397],[153.5038629,-28.119345],[153.5039264,-28.1227063],[153.5919395,-28.1223619],[153.5926582,-28.1776872],[153.6111186,-28.1757867],[153.6113881,-28.1825173],[153.7426846,-28.2162084],[153.7787253,-28.710911],[152.6237954,-32.5877239],[152.3123961,-32.6328837],[151.4141942,-33.5790388],[150.8929925,-35.2648721],[150.4620695,-35.7777256],[150.0156501,-37.5103569],[149.9918121,-37.5126787],[149.519778,-37.5130704],[149.5199577,-37.5216919],[149.4462958,-37.5353701],[149.063344,-37.5357975],[148.9836635,-37.5217631],[148.9816872,-37.5191982],[148.9863847,-37.2584972],[148.4875376,-37.265846],[148.4824774,-37.0092669],[147.994386,-37.014339],[147.988288,-36.5332184],[147.9529707,-36.5260725],[147.9486513,-36.0685992],[147.5034997,-36.0716798],[147.5047701,-36.2651047],[146.4919996,-36.266129],[146.4922536,-36.2565],[145.9929826,-36.2534267],[145.9965866,-36.0188147],[145.9831568,-36.0187058],[145.9624506,-36.0219026],[145.946236,-36.0120936],[145.9454275,-36.0060259],[145.5041534,-36.0013564],[145.5037941,-36.0109125],[145.0072008,-36.0036213],[145.0035404,-36.1520424],[144.4860806,-36.1423149],[144.4874127,-36.0137522],[143.9874676,-36.0024134],[143.9932853,-35.5723753],[143.4971691,-35.5837101],[143.4917967,-35.4065648],[143.4613438,-35.3674934],[143.4585591,-35.3555888],[143.4897755,-35.3396522],[143.4895509,-35.332214],[143.4316994,-35.2570613],[143.2505542,-35.2606556],[143.2438356,-35.0132729],[142.9933305,-35.0177207],[142.9919767,-34.7961882],[142.4971375,-34.8032323],[142.4973172,-34.8007613],[142.4211401,-34.8017571],[142.4209155,-34.7838306],[142.2330892,-34.7859191],[142.2307707,-34.7807542],[142.2269959,-34.5061271],[141.9975302,-34.5083733],[141.9945959,-34.2526687],[141.4982345,-34.2556921],[141.498171,-34.2522794],[140.9945397,-34.2528411],[140.9868688,-28.9887829]]],"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_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}","scaleExtent":[0,16],"polygon":[[[140.9988422,-28.9992444],[148.9502438,-28.9993736],[148.9498845,-28.9665265],[148.9998308,-28.9665265],[149.0000917,-28.8165829],[149.1000729,-28.8165829],[149.0997046,-28.7488533],[148.9998504,-28.7497444],[148.9998169,-28.5000304],[151.0000514,-28.5005192],[151.0005904,-28.7325849],[151.0239466,-28.7327424],[151.0241262,-28.7418794],[151.0329297,-28.7418794],[151.033828,-28.7505431],[151.999984,-28.7495314],[151.999984,-28.7164478],[152.0334014,-28.7166053],[152.0332217,-28.683196],[152.0000739,-28.6833537],[151.9998769,-28.6416273],[151.9829886,-28.6413908],[151.9831683,-28.624912],[151.9331321,-28.6247543],[151.9334122,-28.500071],[151.9998875,-28.5002289],[151.9998556,-28.3749591],[152.2499739,-28.3750718],[152.2499356,-28.2500066],[152.9997192,-28.2498563],[152.9998989,-28.2832447],[153.1165002,-28.2834029],[153.11659,-28.2498563],[153.1666262,-28.2500146],[153.166716,-28.2331582],[153.2499898,-28.2332373],[153.2500265,-28.1249689],[153.6249628,-28.1250833],[153.6248398,-28.4999134],[153.7497955,-28.4999924],[153.7495877,-28.7497976],[153.6248117,-28.7501127],[153.6249745,-28.9999333],[153.4997672,-29.0000612],[153.4998417,-29.4995077],[153.3747962,-29.500055],[153.3754111,-29.8750302],[153.4999113,-29.8751403],[153.4999113,-30.0000922],[153.2498947,-29.9997621],[153.250025,-30.1917704],[153.2748185,-30.1916151],[153.2748185,-30.2168467],[153.2166077,-30.2166139],[153.2166077,-30.250065],[153.250025,-30.250065],[153.2497502,-30.3751935],[153.1243608,-30.3749743],[153.1246457,-30.6250359],[153.0331676,-30.6250482],[153.0333884,-30.8750837],[153.1249214,-30.8750291],[153.1249344,-31.1250505],[153.0082433,-31.1249736],[153.0082914,-31.2499759],[153.0000019,-31.250003],[152.9999392,-31.6249919],[152.8749386,-31.6250491],[152.8749572,-31.749954],[152.7832899,-31.7500034],[152.7831966,-31.8748579],[152.749914,-31.8750105],[152.7500397,-32.0000207],[152.6249044,-31.9999446],[152.6249078,-32.5000047],[152.4999757,-32.4999569],[152.5000336,-32.5666443],[152.4166699,-32.5663415],[152.4167598,-32.6249954],[152.3498477,-32.624991],[152.3498477,-32.6332294],[152.2830786,-32.6332218],[152.2832583,-32.6249755],[152.2494816,-32.6249755],[152.2498101,-32.874906],[151.8745693,-32.8750443],[151.8748535,-33.0000091],[151.7497706,-33.0001533],[151.7504669,-33.2500398],[151.6252418,-33.2497393],[151.6250828,-33.3751621],[151.499585,-33.3751442],[151.5003127,-33.6249385],[151.3741466,-33.6243658],[151.3727902,-34.001962],[151.2477819,-34.0011194],[151.2477819,-34.2493114],[150.9957327,-34.2501515],[151.0008143,-34.62483],[150.8717407,-34.6265026],[150.872757,-35.1242738],[150.7670589,-35.1234425],[150.7690916,-35.2463774],[150.6257894,-35.2496974],[150.6280314,-35.3751485],[150.4999742,-35.3751485],[150.4959088,-35.6275034],[150.3719169,-35.6250251],[150.3749658,-35.7537957],[150.2672351,-35.7513213],[150.2652024,-35.8741232],[150.2479249,-35.870829],[150.2458922,-36.374885],[150.1229166,-36.374885],[150.1259656,-36.6224345],[150.0253491,-36.6240658],[150.0283981,-36.7471337],[149.9928266,-36.7495768],[150.0040062,-37.1224477],[150.0588879,-37.1273097],[150.0568553,-37.37809],[149.9979083,-37.3732441],[149.9999409,-37.4830073],[149.987745,-37.4846202],[149.9857123,-37.5080043],[148.0684571,-36.80624],[147.9930603,-36.1379955],[147.8148345,-36.0055567],[147.3893924,-36.0113701],[147.3822059,-36.1310306],[146.9972549,-36.1275479],[146.9886311,-36.2528271],[146.4956356,-36.2447132],[146.5042595,-36.126387],[145.0011817,-36.0079505],[145.0154103,-36.2542074],[144.5072465,-36.2476506],[144.4991158,-36.0211037],[143.9965422,-35.9810531],[143.3382568,-35.2331794],[142.4097581,-34.7669434],[142.0361436,-34.3758837],[140.9965216,-34.1385805],[140.9988422,-28.9992444]]],"terms_url":"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services","terms_text":"© Land and Property Information 2017"},{"id":"Mapbox","name":"Mapbox Satellite","type":"tms","template":"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmap/cj8gojt0i1eau2rnn7q4mdgu7/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJhNVlHd29ZIn0.ti6wATGDWOmCnCYen-Ip7Q","scaleExtent":[0,22],"terms_url":"http://www.mapbox.com/about/maps/","terms_text":"Terms & Feedback","default":true,"description":"Satellite and aerial imagery.","icon":"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgODAuNDcgMjAuMDIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDgwLjQ3IDIwLjAyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe29wYWNpdHk6MC42O2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30uc3Qxe29wYWNpdHk6MC42O2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fTwvc3R5bGU+PGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTc5LjI5LDEzLjYxYzAsMC4xMS0wLjA5LDAuMi0wLjIsMC4yaC0xLjUzYy0wLjEyLDAtMC4yMy0wLjA2LTAuMjktMC4xNmwtMS4zNy0yLjI4bC0xLjM3LDIuMjhjLTAuMDYsMC4xLTAuMTcsMC4xNi0wLjI5LDAuMTZoLTEuNTNjLTAuMDQsMC0wLjA4LTAuMDEtMC4xMS0wLjAzYy0wLjA5LTAuMDYtMC4xMi0wLjE4LTAuMDYtMC4yN2MwLDAsMCwwLDAsMGwyLjMxLTMuNWwtMi4yOC0zLjQ3Yy0wLjAyLTAuMDMtMC4wMy0wLjA3LTAuMDMtMC4xMWMwLTAuMTEsMC4wOS0wLjIsMC4yLTAuMmgxLjUzYzAuMTIsMCwwLjIzLDAuMDYsMC4yOSwwLjE2bDEuMzQsMi4yNWwxLjMzLTIuMjRjMC4wNi0wLjEsMC4xNy0wLjE2LDAuMjktMC4xNmgxLjUzYzAuMDQsMCwwLjA4LDAuMDEsMC4xMSwwLjAzYzAuMDksMC4wNiwwLjEyLDAuMTgsMC4wNiwwLjI3YzAsMCwwLDAsMCwwTDc2Ljk2LDEwbDIuMzEsMy41Qzc5LjI4LDEzLjUzLDc5LjI5LDEzLjU3LDc5LjI5LDEzLjYxeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02My4wOSw5LjE2Yy0wLjM3LTEuNzktMS44Ny0zLjEyLTMuNjYtMy4xMmMtMC45OCwwLTEuOTMsMC40LTIuNiwxLjEyVjMuMzdjMC0wLjEyLTAuMS0wLjIyLTAuMjItMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjIsMC4xLTAuMjIsMC4yMnYxMC4yMWMwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMnYtMC43YzAuNjgsMC43MSwxLjYyLDEuMTIsMi42LDEuMTJjMS43OSwwLDMuMjktMS4zNCwzLjY2LTMuMTNDNjMuMjEsMTAuMyw2My4yMSw5LjcyLDYzLjA5LDkuMTZMNjMuMDksOS4xNnogTTU5LjEyLDEyLjQxYy0xLjI2LDAtMi4yOC0xLjA2LTIuMy0yLjM2VjkuOTljMC4wMi0xLjMxLDEuMDQtMi4zNiwyLjMtMi4zNnMyLjMsMS4wNywyLjMsMi4zOVM2MC4zOSwxMi40MSw1OS4xMiwxMi40MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNjguMjYsNi4wNGMtMS44OS0wLjAxLTMuNTQsMS4yOS0zLjk2LDMuMTNjLTAuMTIsMC41Ni0wLjEyLDEuMTMsMCwxLjY5YzAuNDIsMS44NSwyLjA3LDMuMTYsMy45NywzLjE0YzIuMjQsMCw0LjA2LTEuNzgsNC4wNi0zLjk5UzcwLjUxLDYuMDQsNjguMjYsNi4wNHogTTY4LjI0LDEyLjQyYy0xLjI3LDAtMi4zLTEuMDctMi4zLTIuMzlzMS4wMy0yLjQsMi4zLTIuNHMyLjMsMS4wNywyLjMsMi4zOVM2OS41MSwxMi40MSw2OC4yNCwxMi40Mkw2OC4yNCwxMi40MnoiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNTkuMTIsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNjAuMzksNy42Myw1OS4xMiw3LjYzeiBNNTkuMTIsMTEuMjNjLTAuNiwwLTEuMDktMC41My0xLjExLTEuMTlWMTBjMC4wMS0wLjY2LDAuNTEtMS4xOSwxLjExLTEuMTlzMS4xMSwwLjU0LDEuMTEsMS4yMVM1OS43NCwxMS4yMyw1OS4xMiwxMS4yM3oiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNNjguMjQsNy42M2MtMS4yNywwLTIuMywxLjA3LTIuMywyLjM5czEuMDMsMi4zOSwyLjMsMi4zOXMyLjMtMS4wNywyLjMtMi4zOVM2OS41MSw3LjYzLDY4LjI0LDcuNjN6IE02OC4yNCwxMS4yM2MtMC42MSwwLTEuMTEtMC41NC0xLjExLTEuMjFzMC41LTEuMiwxLjExLTEuMnMxLjExLDAuNTQsMS4xMSwxLjIxUzY4Ljg1LDExLjIzLDY4LjI0LDExLjIzeiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00My41Niw2LjI0aC0xLjMzYy0wLjEyLDAtMC4yMiwwLjEtMC4yMiwwLjIydjAuN2MtMC42OC0wLjcxLTEuNjItMS4xMi0yLjYtMS4xMmMtMi4wNywwLTMuNzUsMS43OC0zLjc1LDMuOTlzMS42OSwzLjk5LDMuNzUsMy45OWMwLjk5LDAsMS45My0wLjQxLDIuNi0xLjEzdjAuN2MwLDAuMTIsMC4xLDAuMjIsMC4yMiwwLjIyaDEuMzNjMC4xMiwwLDAuMjItMC4xLDAuMjItMC4yMlY2LjQ0YzAtMC4xMS0wLjA5LTAuMjEtMC4yMS0wLjIxQzQzLjU3LDYuMjQsNDMuNTcsNi4yNCw0My41Niw2LjI0eiBNNDIuMDIsMTAuMDVjLTAuMDEsMS4zMS0xLjA0LDIuMzYtMi4zLDIuMzZzLTIuMy0xLjA3LTIuMy0yLjM5czEuMDMtMi40LDIuMjktMi40YzEuMjcsMCwyLjI4LDEuMDYsMi4zLDIuMzZMNDIuMDIsMTAuMDV6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTM5LjcyLDcuNjNjLTEuMjcsMC0yLjMsMS4wNy0yLjMsMi4zOXMxLjAzLDIuMzksMi4zLDIuMzlzMi4yOC0xLjA2LDIuMy0yLjM2VjkuOTlDNDIsOC42OCw0MC45OCw3LjYzLDM5LjcyLDcuNjN6IE0zOC42MiwxMC4wMmMwLTAuNjcsMC41LTEuMjEsMS4xMS0xLjIxYzAuNjEsMCwxLjA5LDAuNTMsMS4xMSwxLjE5djAuMDRjLTAuMDEsMC42NS0wLjUsMS4xOC0xLjExLDEuMThTMzguNjIsMTAuNjgsMzguNjIsMTAuMDJ6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTQ5LjkxLDYuMDRjLTAuOTgsMC0xLjkzLDAuNC0yLjYsMS4xMlY2LjQ1YzAtMC4xMi0wLjEtMC4yMi0wLjIyLTAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLDAuMS0wLjIyLDAuMjJ2MTAuMjFjMCwwLjEyLDAuMSwwLjIyLDAuMjIsMC4yMmgxLjMzYzAuMTIsMCwwLjIyLTAuMSwwLjIyLTAuMjJ2LTMuNzhjMC42OCwwLjcxLDEuNjIsMS4xMiwyLjYxLDEuMTJjMi4wNywwLDMuNzUtMS43OCwzLjc1LTMuOTlTNTEuOTgsNi4wNCw0OS45MSw2LjA0eiBNNDkuNiwxMi40MmMtMS4yNiwwLTIuMjgtMS4wNi0yLjMtMi4zNlY5Ljk5YzAuMDItMS4zMSwxLjA0LTIuMzcsMi4yOS0yLjM3YzEuMjYsMCwyLjMsMS4wNywyLjMsMi4zOVM1MC44NiwxMi40MSw0OS42LDEyLjQyTDQ5LjYsMTIuNDJ6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTQ5LjYsNy42M2MtMS4yNiwwLTIuMjgsMS4wNi0yLjMsMi4zNnYwLjA2YzAuMDIsMS4zMSwxLjA0LDIuMzYsMi4zLDIuMzZzMi4zLTEuMDcsMi4zLTIuMzlTNTAuODYsNy42Myw0OS42LDcuNjN6IE00OS42LDExLjIzYy0wLjYsMC0xLjA5LTAuNTMtMS4xMS0xLjE5VjEwQzQ4LjUsOS4zNCw0OSw4LjgxLDQ5LjYsOC44MWMwLjYsMCwxLjExLDAuNTUsMS4xMSwxLjIxUzUwLjIxLDExLjIzLDQ5LjYsMTEuMjN6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTM0LjM2LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzRjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWOS4yNGMwLTAuOTMtMC43LTEuNjMtMS41NC0xLjYzYy0wLjc2LDAtMS4zOSwwLjY3LTEuNTEsMS41NGwwLjAxLDQuNDRjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuODEsMC0xLjQ3LDAuNzUtMS41MiwxLjcxdjQuMjdjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ0YzAuMDEtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMSwwLjEsMC4yMiwwLjIxdjAuNjNjMC40OC0wLjY1LDEuMjQtMS4wNCwyLjA2LTEuMDVoMC4wM2MxLjA0LDAsMS45OSwwLjU3LDIuNDgsMS40OGMwLjQzLTAuOSwxLjMzLTEuNDgsMi4zMi0xLjQ5YzEuNTQsMCwyLjc5LDEuMTksMi43NiwyLjY1TDM0LjM2LDEzLjU5eiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik04MC4zMiwxMi45N2wtMC4wNy0wLjEyTDc4LjM4LDEwbDEuODUtMi44MWMwLjQyLTAuNjQsMC4yNS0xLjQ5LTAuMzktMS45MmMtMC4wMS0wLjAxLTAuMDItMC4wMS0wLjAzLTAuMDJjLTAuMjItMC4xNC0wLjQ4LTAuMjEtMC43NC0wLjIxaC0xLjUzYy0wLjUzLDAtMS4wMywwLjI4LTEuMywwLjc0bC0wLjMyLDAuNTNsLTAuMzItMC41M2MtMC4yOC0wLjQ2LTAuNzctMC43NC0xLjMxLTAuNzRoLTEuNTNjLTAuNTcsMC0xLjA4LDAuMzUtMS4yOSwwLjg4Yy0yLjA5LTEuNTgtNS4wMy0xLjQtNi45MSwwLjQzYy0wLjMzLDAuMzItMC42MiwwLjY5LTAuODUsMS4wOWMtMC44NS0xLjU1LTIuNDUtMi42LTQuMjgtMi42Yy0wLjQ4LDAtMC45NiwwLjA3LTEuNDEsMC4yMlYzLjM3YzAtMC43OC0wLjYzLTEuNDEtMS40LTEuNDFoLTEuMzNjLTAuNzcsMC0xLjQsMC42My0xLjQsMS40djMuNTdjLTAuOS0xLjMtMi4zOC0yLjA4LTMuOTctMi4wOWMtMC43LDAtMS4zOSwwLjE1LTIuMDIsMC40NWMtMC4yMy0wLjE2LTAuNTEtMC4yNS0wLjgtMC4yNWgtMS4zM2MtMC40MywwLTAuODMsMC4yLTEuMSwwLjUzYy0wLjAyLTAuMDMtMC4wNC0wLjA1LTAuMDctMC4wOGMtMC4yNy0wLjI5LTAuNjUtMC40NS0xLjA0LTAuNDVoLTEuMzJjLTAuMjksMC0wLjU3LDAuMDktMC44LDAuMjVDNDAuOCw1LDQwLjEyLDQuODUsMzkuNDIsNC44NWMtMS43NCwwLTMuMjcsMC45NS00LjE2LDIuMzhjLTAuMTktMC40NC0wLjQ2LTAuODUtMC43OS0xLjE5Yy0wLjc2LTAuNzctMS44LTEuMTktMi44OC0xLjE5aC0wLjAxYy0wLjg1LDAuMDEtMS42NywwLjMxLTIuMzQsMC44NGMtMC43LTAuNTQtMS41Ni0wLjg0LTIuNDUtMC44NGgtMC4wM2MtMC4yOCwwLTAuNTUsMC4wMy0wLjgyLDAuMWMtMC4yNywwLjA2LTAuNTMsMC4xNS0wLjc4LDAuMjdjLTAuMi0wLjExLTAuNDMtMC4xNy0wLjY3LTAuMTdoLTEuMzNjLTAuNzgsMC0xLjQsMC42My0xLjQsMS40djcuMTRjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zM2MwLjc4LDAsMS40MS0wLjYzLDEuNDEtMS40MWMwLDAsMCwwLDAsMFY5LjM1YzAuMDMtMC4zNCwwLjIyLTAuNTYsMC4zNC0wLjU2YzAuMTcsMCwwLjM2LDAuMTcsMC4zNiwwLjQ1djQuMzVjMCwwLjc4LDAuNjMsMS40LDEuNCwxLjRoMS4zNGMwLjc4LDAsMS40LTAuNjMsMS40LTEuNGwtMC4wMS00LjM1YzAuMDYtMC4zLDAuMjQtMC40NSwwLjMzLTAuNDVjMC4xNywwLDAuMzYsMC4xNywwLjM2LDAuNDV2NC4zNWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjM0YzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0wLjM2YzAuOTEsMS4yMywyLjM0LDEuOTYsMy44NywxLjk2YzAuNywwLDEuMzktMC4xNSwyLjAyLTAuNDVjMC4yMywwLjE2LDAuNTEsMC4yNSwwLjgsMC4yNWgxLjMyYzAuMjksMCwwLjU3LTAuMDksMC44LTAuMjV2MS45MWMwLDAuNzgsMC42MywxLjQsMS40LDEuNGgxLjMzYzAuNzgsMCwxLjQtMC42MywxLjQtMS40di0xLjY5YzAuNDYsMC4xNCwwLjk0LDAuMjIsMS40MiwwLjIxYzEuNjIsMCwzLjA3LTAuODMsMy45Ny0yLjF2MC41YzAsMC43OCwwLjYzLDEuNCwxLjQsMS40aDEuMzNjMC4yOSwwLDAuNTctMC4wOSwwLjgtMC4yNWMwLjYzLDAuMywxLjMyLDAuNDUsMi4wMiwwLjQ1YzEuODMsMCwzLjQzLTEuMDUsNC4yOC0yLjZjMS40NywyLjUyLDQuNzEsMy4zNiw3LjIyLDEuODljMC4xNy0wLjEsMC4zNC0wLjIxLDAuNS0wLjM0YzAuMjEsMC41MiwwLjcyLDAuODcsMS4yOSwwLjg2aDEuNTNjMC41MywwLDEuMDMtMC4yOCwxLjMtMC43NGwwLjM1LTAuNThsMC4zNSwwLjU4YzAuMjgsMC40NiwwLjc3LDAuNzQsMS4zMSwwLjc0aDEuNTJjMC43NywwLDEuMzktMC42MywxLjM4LTEuMzlDODAuNDcsMTMuMzgsODAuNDIsMTMuMTcsODAuMzIsMTIuOTdMODAuMzIsMTIuOTd6IE0zNC4xNSwxMy44MWgtMS4zNGMtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY5LjI0YzAtMC45My0wLjctMS42My0xLjU0LTEuNjNjLTAuNzYsMC0xLjM5LDAuNjctMS41MSwxLjU0bDAuMDEsNC40NGMwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjM0Yy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjkuMjRjMC0wLjkzLTAuNy0xLjYzLTEuNTQtMS42M2MtMC44MSwwLTEuNDcsMC43NS0xLjUyLDEuNzF2NC4yN2MwLDAuMTItMC4xLDAuMjItMC4yMiwwLjIyaC0xLjMzYy0wLjEyLDAtMC4yMi0wLjEtMC4yMi0wLjIyVjYuNDRjMC4wMS0wLjEyLDAuMS0wLjIxLDAuMjItMC4yMWgxLjMzYzAuMTIsMCwwLjIxLDAuMSwwLjIyLDAuMjF2MC42M2MwLjQ4LTAuNjUsMS4yNC0xLjA0LDIuMDYtMS4wNWgwLjAzYzEuMDQsMCwxLjk5LDAuNTcsMi40OCwxLjQ4YzAuNDMtMC45LDEuMzMtMS40OCwyLjMyLTEuNDljMS41NCwwLDIuNzksMS4xOSwyLjc2LDIuNjVsMC4wMSw0LjkxQzM0LjM3LDEzLjcsMzQuMjcsMTMuOCwzNC4xNSwxMy44MUMzNC4xNSwxMy44MSwzNC4xNSwxMy44MSwzNC4xNSwxMy44MXogTTQzLjc4LDEzLjU5YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJ2LTAuNzFDNDEuMzQsMTMuNiw0MC40LDE0LDM5LjQyLDE0Yy0yLjA3LDAtMy43NS0xLjc4LTMuNzUtMy45OXMxLjY5LTMuOTksMy43NS0zLjk5YzAuOTgsMCwxLjkyLDAuNDEsMi42LDEuMTJ2LTAuN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMS0wLjAxLDAuMjEsMC4wOCwwLjIyLDAuMmMwLDAuMDEsMCwwLjAxLDAsMC4wMlYxMy41OXogTTQ5LjkxLDE0Yy0wLjk4LDAtMS45Mi0wLjQxLTIuNi0xLjEydjMuNzhjMCwwLjEyLTAuMSwwLjIyLTAuMjIsMC4yMmgtMS4zM2MtMC4xMiwwLTAuMjItMC4xLTAuMjItMC4yMlY2LjQ1YzAtMC4xMiwwLjEtMC4yMSwwLjIyLTAuMjFoMS4zM2MwLjEyLDAsMC4yMiwwLjEsMC4yMiwwLjIydjAuN2MwLjY4LTAuNzIsMS42Mi0xLjEyLDIuNi0xLjEyYzIuMDcsMCwzLjc1LDEuNzcsMy43NSwzLjk4UzUxLjk4LDE0LDQ5LjkxLDE0eiBNNjMuMDksMTAuODdDNjIuNzIsMTIuNjUsNjEuMjIsMTQsNTkuNDMsMTRjLTAuOTgsMC0xLjkyLTAuNDEtMi42LTEuMTJ2MC43YzAsMC4xMi0wLjEsMC4yMi0wLjIyLDAuMjJoLTEuMzNjLTAuMTIsMC0wLjIyLTAuMS0wLjIyLTAuMjJWMy4zN2MwLTAuMTIsMC4xLTAuMjIsMC4yMi0wLjIyaDEuMzNjMC4xMiwwLDAuMjIsMC4xLDAuMjIsMC4yMnYzLjc4YzAuNjgtMC43MSwxLjYyLTEuMTIsMi42LTEuMTFjMS43OSwwLDMuMjksMS4zMywzLjY2LDMuMTJDNjMuMjEsOS43Myw2My4yMSwxMC4zMSw2My4wOSwxMC44N0w2My4wOSwxMC44N0w2My4wOSwxMC44N3ogTTY4LjI2LDE0LjAxYy0xLjksMC4wMS0zLjU1LTEuMjktMy45Ny0zLjE0Yy0wLjEyLTAuNTYtMC4xMi0xLjEzLDAtMS42OWMwLjQyLTEuODUsMi4wNy0zLjE1LDMuOTctMy4xNGMyLjI1LDAsNC4wNiwxLjc4LDQuMDYsMy45OVM3MC41LDE0LjAxLDY4LjI2LDE0LjAxTDY4LjI2LDE0LjAxeiBNNzkuMDksMTMuODFoLTEuNTNjLTAuMTIsMC0wLjIzLTAuMDYtMC4yOS0wLjE2bC0xLjM3LTIuMjhsLTEuMzcsMi4yOGMtMC4wNiwwLjEtMC4xNywwLjE2LTAuMjksMC4xNmgtMS41M2MtMC4wNCwwLTAuMDgtMC4wMS0wLjExLTAuMDNjLTAuMDktMC4wNi0wLjEyLTAuMTgtMC4wNi0wLjI3YzAsMCwwLDAsMCwwbDIuMzEtMy41bC0yLjI4LTMuNDdjLTAuMDItMC4wMy0wLjAzLTAuMDctMC4wMy0wLjExYzAtMC4xMSwwLjA5LTAuMiwwLjItMC4yaDEuNTNjMC4xMiwwLDAuMjMsMC4wNiwwLjI5LDAuMTZsMS4zNCwyLjI1bDEuMzQtMi4yNWMwLjA2LTAuMSwwLjE3LTAuMTYsMC4yOS0wLjE2aDEuNTNjMC4wNCwwLDAuMDgsMC4wMSwwLjExLDAuMDNjMC4wOSwwLjA2LDAuMTIsMC4xOCwwLjA2LDAuMjdjMCwwLDAsMCwwLDBMNzYuOTYsMTBsMi4zMSwzLjVjMC4wMiwwLjAzLDAuMDMsMC4wNywwLjAzLDAuMTFDNzkuMjksMTMuNzIsNzkuMiwxMy44MSw3OS4wOSwxMy44MUM3OS4wOSwxMy44MSw3OS4wOSwxMy44MSw3OS4wOSwxMy44MUw3OS4wOSwxMy44MXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTAsMS4yMWMtNC44NywwLTguODEsMy45NS04LjgxLDguODFzMy45NSw4LjgxLDguODEsOC44MXM4LjgxLTMuOTUsOC44MS04LjgxQzE4LjgxLDUuMTUsMTQuODcsMS4yMSwxMCwxLjIxeiBNMTQuMTgsMTIuMTljLTEuODQsMS44NC00LjU1LDIuMi02LjM4LDIuMmMtMC42NywwLTEuMzQtMC4wNS0yLTAuMTVjMCwwLTAuOTctNS4zNywyLjA0LTguMzljMC43OS0wLjc5LDEuODYtMS4yMiwyLjk4LTEuMjJjMS4yMSwwLDIuMzcsMC40OSwzLjIzLDEuMzVDMTUuOCw3LjczLDE1Ljg1LDEwLjUsMTQuMTgsMTIuMTl6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTEwLDAuMDJjLTUuNTIsMC0xMCw0LjQ4LTEwLDEwczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMEMxOS45OSw0LjUsMTUuNTIsMC4wMiwxMCwwLjAyeiBNMTAsMTguODNjLTQuODcsMC04LjgxLTMuOTUtOC44MS04LjgxUzUuMTMsMS4yLDEwLDEuMnM4LjgxLDMuOTUsOC44MSw4LjgxQzE4LjgxLDE0Ljg5LDE0Ljg3LDE4LjgzLDEwLDE4LjgzeiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNC4wNCw1Ljk4Yy0xLjc1LTEuNzUtNC41My0xLjgxLTYuMi0wLjE0QzQuODMsOC44Niw1LjgsMTQuMjMsNS44LDE0LjIzczUuMzcsMC45Nyw4LjM5LTIuMDRDMTUuODUsMTAuNSwxNS44LDcuNzMsMTQuMDQsNS45OHogTTExLjg4LDkuODdsLTAuODcsMS43OGwtMC44Ni0xLjc4TDguMzgsOS4wMWwxLjc3LTAuODZsMC44Ni0xLjc4bDAuODcsMS43OGwxLjc3LDAuODZMMTEuODgsOS44N3oiLz48cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjEzLjY1LDkuMDEgMTEuODgsOS44NyAxMS4wMSwxMS42NSAxMC4xNSw5Ljg3IDguMzgsOS4wMSAxMC4xNSw4LjE1IDExLjAxLDYuMzcgMTEuODgsOC4xNSAiLz48L2c+PC9zdmc+"},{"id":"geodata.md.gov-MD_SixInchImagery","name":"MD Latest 6 Inch Aerial Imagery","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer","endDate":"2016-01-01T00:00:00.000Z","startDate":"2013-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"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_ColorBasemap","name":"MD Transportation Basemap","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/MD_ColorBasemap/http://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer","polygon":[[[-76.234131,37.920368],[-76.598053,38.158317],[-76.940002,38.270532],[-77.038193,38.413786],[-77.23526,38.33627],[-77.312164,38.410558],[-77.262726,38.566422],[-77.042999,38.713376],[-77.049866,38.793697],[-76.92627,38.892503],[-77.040939,38.984499],[-77.12162,38.925229],[-77.150116,38.955137],[-77.252426,38.975425],[-77.259293,39.024252],[-77.34581,39.054918],[-77.461853,39.070379],[-77.537384,39.139647],[-77.474213,39.224807],[-77.572746,39.304284],[-77.723465,39.328986],[-77.777023,39.463234],[-77.861481,39.516225],[-77.840881,39.608862],[-77.956238,39.59299],[-78.166351,39.695564],[-78.270035,39.621557],[-78.338699,39.640066],[-78.466415,39.523641],[-78.662796,39.540058],[-78.798752,39.606217],[-78.9814,39.446799],[-79.06723,39.476486],[-79.485054,39.199536],[-79.485569,39.72158],[-75.788359,39.721811],[-75.690994,38.460579],[-75.049238,38.458159],[-75.049839,38.402218],[-75.081511,38.323208],[-75.097733,38.309066],[-75.186996,38.097551],[-75.23798,38.022402],[-75.61821,37.989669],[-75.863686,37.909534],[-76.234131,37.920368]]],"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":"geodata.state.nj.us-Infrared2015","name":"NJ 2015 Aerial Imagery (Infrared)","type":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Infrared2015/http://geodata.state.nj.us/imagerywms/Infrared2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"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":"tms","template":"http://whoots.mapwarper.net/tms/{zoom}/{x}/{y}/Natural2015/http://geodata.state.nj.us/imagerywms/Natural2015","endDate":"2015-05-03T00:00:00.000Z","startDate":"2015-03-29T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[-74.86599,40.085427],[-74.840927,40.107225],[-74.822903,40.130329],[-74.788055,40.124685],[-74.726086,40.149488],[-74.729176,40.16392],[-74.763336,40.191725],[-74.775524,40.214276],[-74.844017,40.247957],[-74.868393,40.291573],[-74.944611,40.33817],[-74.967098,40.395195],[-75.002632,40.406046],[-75.026836,40.402516],[-75.06134,40.416502],[-75.074215,40.455046],[-75.069065,40.536503],[-75.102367,40.567024],[-75.135927,40.573609],[-75.16777,40.559069],[-75.197639,40.573674],[-75.203733,40.618318],[-75.205064,40.691312],[-75.198326,40.753889],[-75.172405,40.780671],[-75.1367,40.777292],[-75.090179,40.822383],[-75.100994,40.839269],[-75.096874,40.850956],[-75.068464,40.850372],[-75.057049,40.867574],[-75.13773,40.973094],[-75.135155,40.994411],[-75.039024,41.03819],[-74.981518,41.112598],[-74.905472,41.170384],[-74.84024,41.278645],[-74.798012,41.322685],[-74.757156,41.347691],[-74.695702,41.360576],[-74.041054,41.059088],[-74.041051,41.059087],[-74.04105,41.059087],[-74.04105,41.059086],[-74.041049,41.059086],[-73.890266,40.998039],[-73.933406,40.882078],[-73.933407,40.882077],[-73.933408,40.882076],[-73.933408,40.882075],[-74.011459,40.75558],[-74.024543,40.709436],[-74.066048,40.651732],[-74.152222,40.638967],[-74.183121,40.644568],[-74.200459,40.631281],[-74.199257,40.598444],[-74.21505,40.558026],[-74.246807,40.548113],[-74.24715,40.519541],[-74.267578,40.489651],[-74.26054,40.469282],[-74.199257,40.445641],[-74.181061,40.460401],[-74.136429,40.459095],[-73.997555,40.413496],[-74.026566,40.47777],[-74.003906,40.484037],[-73.977814,40.452042],[-73.964767,40.33189],[-74.088364,39.756824],[-74.356842,39.383406],[-74.609528,39.215231],[-74.776382,38.998909],[-74.863586,38.931639],[-74.931221,38.920688],[-74.980316,38.930304],[-74.960747,39.00798],[-74.905472,39.100226],[-74.899979,39.164141],[-75.101166,39.201398],[-75.135498,39.171062],[-75.425949,39.378099],[-75.475044,39.43195],[-75.543365,39.457403],[-75.552292,39.482845],[-75.538902,39.541911],[-75.519676,39.56997],[-75.571175,39.608069],[-75.577698,39.625524],[-75.539932,39.656456],[-75.472984,39.747454],[-75.466253,39.750761],[-75.466252,39.750762],[-75.466252,39.750763],[-75.466251,39.750764],[-75.466251,39.750765],[-75.46625,39.750767],[-75.466249,39.750768],[-75.466249,39.750769],[-75.465088,39.764478],[-75.415041,39.801786],[-75.324669,39.858891],[-75.246048,39.864689],[-75.143738,39.900255],[-75.142365,39.957912],[-75.07061,39.987117],[-75.056534,40.008683],[-74.935341,40.072555],[-74.86599,40.085427]]],"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":"NLS-Bartholomew-hfinch-hist","name":"NLS - Bartholomew Half Inch, 1897-1907","type":"tms","template":"http://geo.nls.uk/mapdata2/bartholomew/great_britain/{zoom}/{x}/{-y}.png","scaleExtent":[0,15],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-7th_Series","name":"NLS - OS 1-inch 7th Series 1955-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/seventh/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-1st_Series","name":"NLS - OS 1:25k 1st Series 1937-61","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25000/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-4.7157244,54.6796556],[-4.6850662,54.6800268],[-4.6835779,54.6623245],[-4.7148782,54.6615818],[-4.7157244,54.6796556]],[[-3.7085748,58.3371151],[-3.5405937,58.3380684],[-3.5315137,58.1608002],[-3.3608086,58.1622372],[-3.3653486,58.252173],[-3.1610473,58.2536063],[-3.1610473,58.3261509],[-3.0275704,58.3271045],[-3.0366505,58.6139001],[-3.0021463,58.614373],[-3.0030543,58.7036341],[-3.4180129,58.7003322],[-3.4171049,58.6290293],[-3.7240109,58.6266658],[-3.7231029,58.606806],[-4.2361262,58.5992374],[-4.2334022,58.5092347],[-3.88836,58.5144516],[-3.8829119,58.4261327],[-3.7158389,58.4270836],[-3.7085748,58.3371151]],[[-6.46676,49.9943621],[-6.1889102,50.004868],[-6.1789222,49.8967815],[-6.3169391,49.8915171],[-6.312399,49.8200979],[-6.4504159,49.8159968],[-6.46676,49.9943621]],[[-5.6453263,50.2029809],[-5.7801329,50.2014076],[-5.7637888,50.0197267],[-5.3479221,50.0290604],[-5.3388421,49.9414854],[-5.024672,49.9473287],[-5.0355681,50.0383923],[-5.0010639,50.0453901],[-4.9974319,50.1304478],[-4.855783,50.13394],[-4.861231,50.206057],[-4.6546085,50.2140172],[-4.6558926,50.3018616],[-4.5184924,50.3026818],[-4.51464,50.325642],[-4.2488284,50.3264618],[-4.2488284,50.3100631],[-4.10886,50.3141633],[-4.1062917,50.2411267],[-3.9648088,50.2432047],[-3.9640778,50.2254158],[-3.8522287,50.2273626],[-3.8503757,50.1552563],[-3.6921809,50.1572487],[-3.5414602,50.1602198],[-3.5465781,50.3226814],[-3.4068012,50.3241013],[-3.4165761,50.5892711],[-3.2746691,50.5962721],[-3.2749172,50.6106323],[-2.9971742,50.613972],[-2.9896008,50.688537],[-2.7120266,50.690565],[-2.710908,50.6195964],[-2.5695473,50.6157538],[-2.5651019,50.5134083],[-2.4014463,50.513379],[-2.3940583,50.6160348],[-2.2894123,50.6147436],[-2.2876184,50.6008549],[-2.1477855,50.6048506],[-2.1451013,50.5325437],[-1.9335117,50.5347477],[-1.9362139,50.6170445],[-1.8573025,50.6228094],[-1.8554865,50.709139],[-1.6066929,50.709139],[-1.6085089,50.6239615],[-1.4450678,50.6228094],[-1.4432518,50.5317039],[-1.1545059,50.5293951],[-1.1472419,50.6170485],[-1.011041,50.6205051],[-1.011041,50.7056889],[-0.704135,50.7045388],[-0.700503,50.7769401],[-0.5860943,50.7723465],[-0.5879103,50.7907181],[-0.0149586,50.7798108],[-0.0185906,50.7625836],[0.0967261,50.7620093],[0.0921861,50.6913106],[0.3046595,50.6890096],[0.3101075,50.7757917],[0.5511831,50.7726336],[0.5529991,50.8432096],[0.695556,50.8403428],[0.696464,50.8592608],[0.9852099,50.8523824],[0.9906579,50.9417226],[1.0160821,50.9411504],[1.0215301,51.0303204],[1.2812198,51.0240383],[1.2848518,51.0948044],[1.4277848,51.0948044],[1.4386809,51.2882859],[1.4713691,51.2871502],[1.4804492,51.3994534],[1.1590151,51.4073836],[1.1590151,51.3869889],[1.0191822,51.3903886],[1.0228142,51.4798247],[0.8793493,51.4843484],[0.8829813,51.5566675],[1.0264462,51.5544092],[1.0373423,51.7493319],[1.2607117,51.7482076],[1.2661598,51.8279642],[1.3351682,51.8335756],[1.3478803,51.9199021],[1.4840812,51.9199021],[1.4986093,52.0038271],[1.6438902,52.0027092],[1.6656823,52.270221],[1.7310588,52.270221],[1.7528509,52.4465637],[1.8254914,52.4476705],[1.8345714,52.624408],[1.7690346,52.6291402],[1.7741711,52.717904],[1.6996925,52.721793],[1.706113,52.8103687],[1.559724,52.8165777],[1.5648605,52.9034116],[1.4184715,52.9103818],[1.4223238,52.9281894],[1.3439928,52.9289635],[1.3491293,53.0001194],[0.4515789,53.022589],[0.4497629,52.9351139],[0.3789384,52.9351139],[0.3716744,52.846365],[0.2227614,52.8496552],[0.2336575,52.9329248],[0.3062979,52.9351139],[0.308114,53.022589],[0.3807544,53.0236813],[0.3993708,53.2933729],[0.3248922,53.2987454],[0.3274604,53.3853782],[0.2504136,53.38691],[0.2581183,53.4748924],[0.1862079,53.4779494],[0.1913443,53.6548777],[0.1502527,53.6594436],[0.1528209,53.7666003],[0.0012954,53.7734308],[0.0025796,53.8424326],[-0.0282392,53.841675],[-0.0226575,53.9311501],[-0.1406983,53.9322193],[-0.1416063,54.0219323],[-0.1706625,54.0235326],[-0.1679384,54.0949482],[-0.0126694,54.0912206],[-0.0099454,54.1811226],[-0.1615824,54.1837795],[-0.1606744,54.2029038],[-0.2405789,54.2034349],[-0.2378549,54.2936234],[-0.3894919,54.2941533],[-0.3857497,54.3837321],[-0.461638,54.3856364],[-0.4571122,54.4939066],[-0.6105651,54.4965434],[-0.6096571,54.5676704],[-0.7667421,54.569776],[-0.7640181,54.5887213],[-0.9192871,54.5908258],[-0.9148116,54.6608348],[-1.1485204,54.6634343],[-1.1472363,54.7528316],[-1.2268514,54.7532021],[-1.2265398,54.8429879],[-1.2991803,54.8435107],[-1.2991803,54.9333391],[-1.3454886,54.9354258],[-1.3436726,55.0234878],[-1.3772688,55.0255698],[-1.3754528,55.1310877],[-1.4997441,55.1315727],[-1.4969272,55.2928323],[-1.5296721,55.2942946],[-1.5258198,55.6523803],[-1.7659492,55.6545537],[-1.7620968,55.7435626],[-1.9688392,55.7435626],[-1.9698023,55.8334505],[-2.0019051,55.8336308],[-2.0015841,55.9235526],[-2.1604851,55.9240613],[-2.1613931,55.9413549],[-2.3202942,55.9408463],[-2.3212022,56.0145126],[-2.5627317,56.0124824],[-2.5645477,56.1022207],[-2.9658863,56.0991822],[-2.9667943,56.1710304],[-2.4828272,56.1755797],[-2.4882752,56.2856078],[-2.5645477,56.2835918],[-2.5681798,56.3742075],[-2.7261728,56.3732019],[-2.7316208,56.4425301],[-2.6190281,56.4425301],[-2.6153961,56.5317671],[-2.453771,56.5347715],[-2.4534686,56.6420248],[-2.4062523,56.6440218],[-2.3953562,56.7297964],[-2.2936596,56.7337811],[-2.2972916,56.807423],[-2.1629067,56.8113995],[-2.1592747,56.9958425],[-1.9922016,57.0017771],[-2.0067297,57.2737477],[-1.9195612,57.2757112],[-1.9304572,57.3482876],[-1.8106005,57.3443682],[-1.7997044,57.4402728],[-1.6616875,57.4285429],[-1.6689516,57.5398256],[-1.7452241,57.5398256],[-1.7524881,57.6313302],[-1.8287606,57.6332746],[-1.8287606,57.7187255],[-3.1768526,57.7171219],[-3.1794208,57.734264],[-3.5134082,57.7292105],[-3.5129542,57.7112683],[-3.7635638,57.7076303],[-3.7598539,57.635713],[-3.8420372,57.6343382],[-3.8458895,57.6178365],[-3.9794374,57.6157733],[-3.9794374,57.686544],[-3.8150708,57.689976],[-3.817639,57.7968899],[-3.6853753,57.7989429],[-3.6892276,57.8891567],[-3.9383458,57.8877915],[-3.9421981,57.9750592],[-3.6943641,57.9784638],[-3.6969323,58.0695865],[-4.0372226,58.0641528],[-4.0346543,57.9730163],[-4.2003051,57.9702923],[-4.1832772,57.7012869],[-4.518752,57.6951111],[-4.5122925,57.6050682],[-4.6789116,57.6016628],[-4.666022,57.4218334],[-3.6677696,57.4394729],[-3.671282,57.5295384],[-3.3384979,57.5331943],[-3.3330498,57.4438859],[-2.8336466,57.4485275],[-2.8236396,56.9992706],[-2.3305398,57.0006693],[-2.3298977,56.9113932],[-2.6579889,56.9092901],[-2.6559637,56.8198406],[-2.8216747,56.8188467],[-2.8184967,56.7295397],[-3.1449248,56.7265508],[-3.1435628,56.6362749],[-3.4679089,56.6350265],[-3.474265,56.7238108],[-3.8011471,56.7188284],[-3.785711,56.4493026],[-3.946428,56.4457896],[-3.9428873,56.2659777],[-4.423146,56.2588459],[-4.4141572,56.0815506],[-4.8944159,56.0708008],[-4.8791072,55.8896994],[-5.1994158,55.8821374],[-5.1852906,55.7023791],[-5.0273445,55.7067203],[-5.0222081,55.6879046],[-4.897649,55.6907999],[-4.8880181,55.6002822],[-4.7339244,55.6046348],[-4.7275038,55.5342082],[-4.773732,55.5334815],[-4.7685955,55.4447227],[-4.8494947,55.4418092],[-4.8405059,55.3506535],[-4.8700405,55.3513836],[-4.8649041,55.2629462],[-4.9920314,55.2592875],[-4.9907473,55.1691779],[-5.0600894,55.1655105],[-5.0575212,55.0751884],[-5.2141831,55.0722477],[-5.1991766,54.8020337],[-5.0466316,54.8062205],[-5.0502636,54.7244996],[-4.9703591,54.7203043],[-4.9776232,54.6215905],[-4.796022,54.6342056],[-4.796022,54.7307917],[-4.8977186,54.7265971],[-4.9086147,54.8145928],[-4.8069181,54.8166856],[-4.8105501,54.7915648],[-4.6943253,54.7978465],[-4.6761652,54.7244996],[-4.5744686,54.7244996],[-4.5599405,54.6426135],[-4.3093309,54.6384098],[-4.3333262,54.8229889],[-4.2626999,54.8274274],[-4.2549952,54.7348587],[-3.8338058,54.7400481],[-3.836374,54.8141105],[-3.7118149,54.8133706],[-3.7143831,54.8318654],[-3.5346072,54.8355633],[-3.5271039,54.9066228],[-3.4808758,54.9084684],[-3.4776655,54.7457328],[-3.5874573,54.744621],[-3.5836049,54.6546166],[-3.7107322,54.6531308],[-3.6991752,54.4550407],[-3.5746161,54.4572801],[-3.5759002,54.3863042],[-3.539945,54.3855564],[-3.5386609,54.297224],[-3.46033,54.2957252],[-3.4590458,54.2079507],[-3.3807149,54.2102037],[-3.381999,54.1169788],[-3.302878,54.1160656],[-3.300154,54.0276224],[-3.1013007,54.0292224],[-3.093596,53.6062158],[-3.2065981,53.6016441],[-3.2091663,53.4917753],[-3.2451215,53.4887193],[-3.2348486,53.4045934],[-3.5276266,53.3999999],[-3.5343966,53.328481],[-3.6488053,53.3252272],[-3.6527308,53.3057716],[-3.7271873,53.3046865],[-3.7315003,53.3945257],[-3.9108315,53.3912769],[-3.9071995,53.3023804],[-3.9521457,53.3015665],[-3.9566724,53.3912183],[-4.1081979,53.3889209],[-4.1081979,53.4072967],[-4.2622916,53.4065312],[-4.2635757,53.4753707],[-4.638537,53.4677274],[-4.6346847,53.3812621],[-4.7091633,53.3774321],[-4.7001745,53.1954965],[-4.5499332,53.1962658],[-4.5435126,53.1092488],[-4.3919871,53.1100196],[-4.3855666,53.0236002],[-4.6115707,53.0205105],[-4.603866,52.9284932],[-4.7566756,52.9261709],[-4.7476868,52.8370555],[-4.8208813,52.8331768],[-4.8208813,52.7446476],[-4.3701572,52.7539749],[-4.3765778,52.8401583],[-4.2314728,52.8455875],[-4.2237682,52.7586379],[-4.1056297,52.7570836],[-4.1015192,52.6714874],[-4.1487355,52.6703862],[-4.1305754,52.4008596],[-4.1995838,52.3986435],[-4.2050319,52.3110195],[-4.3466808,52.303247],[-4.3484968,52.2365693],[-4.4901457,52.2332328],[-4.4883297,52.2098702],[-4.6572188,52.2098702],[-4.6590348,52.1385939],[-4.7788916,52.13525],[-4.7807076,52.1162967],[-4.9259885,52.1140663],[-4.9187245,52.0392855],[-5.2365265,52.0314653],[-5.2347105,51.9442339],[-5.3473032,51.9408755],[-5.3473032,51.9195995],[-5.4925842,51.9162392],[-5.4853201,51.8265386],[-5.1983903,51.8321501],[-5.1893102,51.7625177],[-5.335825,51.7589528],[-5.3281204,51.6686495],[-5.1836575,51.6730296],[-5.1836575,51.6539134],[-5.0674452,51.6578966],[-5.0603825,51.5677905],[-4.5974594,51.5809588],[-4.60388,51.6726314],[-4.345773,51.6726314],[-4.3355001,51.4962964],[-3.9528341,51.5106841],[-3.9425611,51.5905333],[-3.8809237,51.5953198],[-3.8706508,51.5074872],[-3.7679216,51.4978952],[-3.7550805,51.4242895],[-3.5855774,51.41468],[-3.5778727,51.3329177],[-3.0796364,51.3329177],[-3.0770682,51.2494018],[-3.7216935,51.2381477],[-3.7216935,51.2558315],[-3.8706508,51.2558315],[-3.8680825,51.2365398],[-4.2944084,51.2252825],[-4.289272,51.0496352],[-4.5692089,51.0431767],[-4.5624122,50.9497388],[-4.5905604,50.9520269],[-4.5896524,50.8627065],[-4.6296046,50.8592677],[-4.6226411,50.7691513],[-4.6952816,50.7680028],[-4.6934655,50.6967379],[-4.8342064,50.6938621],[-4.8296664,50.6046231],[-4.9676833,50.6000126],[-4.9685913,50.5821427],[-5.1084242,50.5786832],[-5.1029762,50.4892254],[-5.1311244,50.48807],[-5.1274923,50.4163798],[-5.2664172,50.4117509],[-5.2609692,50.3034214],[-5.5124868,50.2976214],[-5.5061308,50.2256428],[-5.6468717,50.2209953],[-5.6453263,50.2029809]],[[-5.1336607,55.2630226],[-5.1021999,55.2639372],[-5.0999527,55.2458239],[-5.1322161,55.2446343],[-5.1336607,55.2630226]],[[-5.6431878,55.5095745],[-5.4861028,55.5126594],[-5.4715747,55.3348829],[-5.6277517,55.3302345],[-5.6431878,55.5095745]],[[-4.7213517,51.2180246],[-4.5804201,51.2212417],[-4.5746416,51.1306736],[-4.7174993,51.1280545],[-4.7213517,51.2180246]],[[-5.1608796,55.4153626],[-5.0045387,55.4190069],[-5.0184798,55.6153521],[-5.1755648,55.6138137],[-5.1608796,55.4153626]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-25inch-hist","name":"NLS - OS 25-inch (Scotland), 1892-1905","type":"tms","template":"http://geo.nls.uk/mapdata2/os/25_inch/scotland_1/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLS-OS-6inch-Scotland-hist","name":"NLS - OS 6-inch Scotland 1842-82","type":"tms","template":"http://geo.nls.uk/maps/os/six_inch/{zoom}/{x}/{-y}.png","scaleExtent":[5,16],"polygon":[[[-5.2112173,54.8018593],[-5.0642752,54.8026508],[-5.0560354,54.6305176],[-4.3158316,54.6297227],[-4.3117117,54.7448258],[-3.8530325,54.7464112],[-3.8530325,54.8034424],[-3.5522818,54.8034424],[-3.5522818,54.8374644],[-3.468511,54.8406277],[-3.4657644,54.8983158],[-3.3847403,54.8991055],[-3.3888601,54.9559214],[-3.0920786,54.9539468],[-3.0392359,54.9923274],[-3.0212713,55.0493881],[-2.9591232,55.0463283],[-2.9202807,55.0666294],[-2.7857081,55.068652],[-2.7852225,55.0914426],[-2.7337562,55.0922761],[-2.737616,55.151204],[-2.7648395,55.1510672],[-2.7013114,55.1722505],[-2.6635459,55.2192808],[-2.6460364,55.2188891],[-2.629042,55.2233933],[-2.6317886,55.2287781],[-2.6235488,55.2446345],[-2.6197723,55.2454663],[-2.6099017,55.2454174],[-2.6099876,55.2486466],[-2.6408121,55.2590039],[-2.6247896,55.2615631],[-2.6045186,55.2823081],[-2.5693176,55.296132],[-2.5479542,55.3121617],[-2.5091116,55.3234891],[-2.4780376,55.3494471],[-2.4421083,55.3533118],[-2.4052079,55.3439256],[-2.3726772,55.3447539],[-2.3221819,55.3687665],[-2.3241241,55.3999337],[-2.2576062,55.425015],[-2.1985547,55.4273529],[-2.1484296,55.4717466],[-2.1944348,55.484199],[-2.2040479,55.529306],[-2.2960584,55.6379722],[-2.2177808,55.6379722],[-2.1059266,55.7452498],[-1.9716874,55.7462161],[-1.9697453,55.9190951],[-2.1201694,55.9207115],[-2.1242893,55.9776133],[-2.3440159,55.9783817],[-2.3440159,56.0390349],[-2.5046909,56.0413363],[-2.500571,56.1003588],[-2.8823459,56.0957629],[-2.8823459,56.1722898],[-2.4126804,56.1692316],[-2.4181736,56.2334017],[-2.5857151,56.2303484],[-2.5719822,56.3416356],[-2.7257908,56.3462022],[-2.7312839,56.4343808],[-2.6928318,56.4343808],[-2.6928318,56.4859769],[-2.5307834,56.4935587],[-2.5307834,56.570806],[-2.5302878,56.6047947],[-2.3732428,56.6044452],[-2.3684363,56.7398824],[-2.3292975,56.7398824],[-2.3292975,56.7888065],[-2.3145346,56.7891826],[-2.3148779,56.7967036],[-2.171369,56.7967036],[-2.1703979,56.9710595],[-2.0101725,56.9694716],[-2.0101725,57.0846832],[-2.0817687,57.085349],[-2.0488097,57.1259963],[-2.0409133,57.126369],[-2.0383434,57.2411129],[-1.878118,57.2421638],[-1.8771469,57.2978175],[-1.9868771,57.2983422],[-1.9082209,57.3560063],[-1.8752048,57.3560063],[-1.8761758,57.3769527],[-1.8120857,57.4120111],[-1.7120661,57.4120111],[-1.7034646,57.6441388],[-1.8666032,57.6451781],[-1.8646611,57.7033351],[-3.1204292,57.7064705],[-3.1218025,57.7504652],[-3.4445259,57.7526635],[-3.4472724,57.7138067],[-3.5145637,57.7094052],[-3.5118171,57.6939956],[-3.7645027,57.6917938],[-3.7672492,57.6344975],[-3.842378,57.6288312],[-3.8438346,57.5965825],[-3.9414265,57.5916386],[-3.9404554,57.6537782],[-3.8894746,57.6529989],[-3.8826772,57.7676408],[-3.7224517,57.766087],[-3.7195385,57.8819201],[-3.9146888,57.8853352],[-3.916062,57.9546243],[-3.745774,57.9538956],[-3.7471473,58.0688409],[-3.5837256,58.0695672],[-3.5837256,58.1116689],[-3.4560096,58.1138452],[-3.4544646,58.228503],[-3.4379851,58.2283222],[-3.4243233,58.2427725],[-3.412307,58.2438567],[-3.3735115,58.2695057],[-3.3063919,58.2862038],[-3.1229154,58.2859395],[-3.123602,58.3443661],[-2.9574338,58.3447264],[-2.951254,58.6422011],[-2.8812162,58.6429157],[-2.8851004,58.8112825],[-2.7180775,58.8142997],[-2.7161354,58.8715749],[-2.556881,58.8775984],[-2.5544533,58.9923453],[-2.5567617,59.0483775],[-2.391893,59.0485996],[-2.3918002,59.1106996],[-2.4733695,59.1106996],[-2.5591563,59.1783028],[-2.5630406,59.2210646],[-2.3921334,59.224046],[-2.3911409,59.2740075],[-2.3639512,59.2745036],[-2.3658933,59.285417],[-2.3911409,59.284921],[-2.3911409,59.3379505],[-2.2221759,59.3381981],[-2.2233897,59.395965],[-2.3758467,59.396583],[-2.3899271,59.4026383],[-2.4008516,59.3962122],[-2.5637882,59.3952604],[-2.5637882,59.3385811],[-2.7320164,59.3375306],[-2.7333896,59.3952604],[-3.0726511,59.3931174],[-3.0703404,59.3354759],[-3.0753186,59.3355634],[-3.0749753,59.3292593],[-3.0698254,59.3289091],[-3.069801,59.2196159],[-3.2363384,59.2166341],[-3.2336751,59.1606496],[-3.4032766,59.1588895],[-3.394086,58.9279316],[-3.5664497,58.9259268],[-3.5611089,58.8679885],[-3.392508,58.8699339],[-3.3894734,58.8698711],[-3.3891093,58.8684905],[-3.3912942,58.868616],[-3.3884161,58.7543084],[-3.2238208,58.7555677],[-3.2189655,58.691289],[-3.4634113,58.6905753],[-3.4551716,58.6341518],[-3.787508,58.6341518],[-3.7861347,58.5769211],[-3.9028645,58.5733411],[-3.9028645,58.6477304],[-4.0690327,58.6491594],[-4.0690327,58.5912376],[-4.7364521,58.5933845],[-4.7364521,58.6505884],[-5.0715351,58.6520173],[-5.0654779,58.5325854],[-5.2332047,58.5316087],[-5.2283494,58.4719947],[-5.2424298,58.4719947],[-5.2366034,58.4089731],[-5.2283494,58.4094818],[-5.2210664,58.3005859],[-5.5657939,58.2959933],[-5.5580254,58.2372573],[-5.4146722,58.2401326],[-5.4141866,58.2267768],[-5.3885749,58.2272242],[-5.382714,58.1198615],[-5.51043,58.1191362],[-5.5114011,58.006214],[-5.6745397,58.0041559],[-5.6716266,57.9449366],[-5.6716266,57.8887166],[-5.8347652,57.8856193],[-5.8277052,57.5988958],[-6.0384259,57.5986357],[-6.0389115,57.6459559],[-6.1981658,57.6456961],[-6.2076123,57.7600132],[-6.537067,57.7544033],[-6.5312406,57.6402392],[-6.7002056,57.6360809],[-6.6807844,57.5236293],[-6.8516915,57.5152857],[-6.8361545,57.3385811],[-6.6730158,57.3438213],[-6.674958,57.2850883],[-6.5098772,57.2850883],[-6.4982244,57.1757637],[-6.3506228,57.1820797],[-6.3312015,57.1251969],[-6.1797156,57.1230884],[-6.1719471,57.0682265],[-6.4593819,57.059779],[-6.4564687,57.1093806],[-6.6671895,57.1062165],[-6.6730158,57.002708],[-6.5021087,57.0048233],[-6.4836097,56.8917522],[-6.3266104,56.8894062],[-6.3156645,56.7799312],[-6.2146739,56.775675],[-6.2146739,56.7234965],[-6.6866107,56.7224309],[-6.6769001,56.6114413],[-6.8419809,56.607166],[-6.8400387,56.5483307],[-7.1546633,56.5461895],[-7.1488369,56.4872592],[-6.9915246,56.490476],[-6.9876404,56.4325329],[-6.6827265,56.4314591],[-6.6769001,56.5472601],[-6.5292985,56.5504717],[-6.5234721,56.4379018],[-6.3661598,56.4368281],[-6.3642177,56.3766524],[-6.5273563,56.3712749],[-6.5171745,56.2428427],[-6.4869621,56.247421],[-6.4869621,56.1893882],[-6.3001945,56.1985572],[-6.3029411,56.2581017],[-5.9019401,56.256576],[-5.8964469,56.0960466],[-6.0282829,56.0883855],[-6.0392692,56.1557502],[-6.3853385,56.1542205],[-6.3606193,55.96099],[-6.2123039,55.9640647],[-6.2047508,55.9202269],[-6.5185478,55.9129158],[-6.5061881,55.7501763],[-6.6764762,55.7409005],[-6.6599967,55.6263176],[-6.3551261,55.6232161],[-6.3578727,55.5689002],[-6.0392692,55.5720059],[-6.0310294,55.6247669],[-5.7398917,55.6309694],[-5.7371452,55.4569279],[-5.8964469,55.4600426],[-5.8964469,55.2789864],[-5.4350211,55.2821151],[-5.4405143,55.4506979],[-5.2867057,55.4569279],[-5.3086784,55.4070602],[-4.9735954,55.4008223],[-4.9845817,55.2038242],[-5.1493766,55.2038242],[-5.1411369,55.037337],[-5.2152946,55.0341891],[-5.2112173,54.8018593]],[[-2.1646559,60.1622059],[-1.9930299,60.1609801],[-1.9946862,60.1035151],[-2.1663122,60.104743],[-2.1646559,60.1622059]],[[-1.5360658,59.8570831],[-1.3653566,59.8559841],[-1.366847,59.7975565],[-1.190628,59.7964199],[-1.1862046,59.9695391],[-1.0078652,59.9683948],[-1.0041233,60.114145],[-0.8360832,60.1130715],[-0.834574,60.1716772],[-1.0074262,60.1727795],[-1.0052165,60.2583924],[-0.8299659,60.2572778],[-0.826979,60.3726551],[-0.6507514,60.3715381],[-0.6477198,60.4882292],[-0.9984896,60.4904445],[-0.9970279,60.546555],[-0.6425288,60.5443201],[-0.6394896,60.6606792],[-0.8148133,60.6617806],[-0.8132987,60.7196112],[-0.6383298,60.7185141],[-0.635467,60.8275393],[-0.797568,60.8285523],[-0.9941426,60.8297807],[-0.9954966,60.7782667],[-1.1670282,60.7793403],[-1.1700357,60.6646181],[-1.5222599,60.6668304],[-1.5237866,60.6084426],[-1.6975673,60.609536],[-1.7021271,60.4345249],[-1.5260578,60.4334111],[-1.5275203,60.3770719],[-1.8751127,60.3792746],[-1.8781372,60.2624647],[-1.7019645,60.2613443],[-1.7049134,60.1470532],[-1.528659,60.1459283],[-1.5360658,59.8570831]],[[-0.9847667,60.8943762],[-0.9860347,60.8361105],[-0.8078362,60.8351904],[-0.8065683,60.8934578],[-0.9847667,60.8943762]],[[-7.7696901,56.8788231],[-7.7614504,56.7608274],[-7.6009049,56.7641903],[-7.5972473,56.819332],[-7.4479894,56.8203948],[-7.4489319,56.8794098],[-7.2841369,56.8794098],[-7.2813904,57.0471152],[-7.1303283,57.0515969],[-7.1330749,57.511801],[-6.96828,57.5147514],[-6.9765198,57.6854668],[-6.8062317,57.6913392],[-6.8089782,57.8041985],[-6.6496765,57.8071252],[-6.6441833,57.8612267],[-6.3200866,57.8626878],[-6.3200866,58.1551617],[-6.1607849,58.1522633],[-6.1552917,58.20874],[-5.9850036,58.2101869],[-5.9904968,58.2680163],[-6.1497986,58.2665717],[-6.1415588,58.5557514],[-6.3173401,58.5557514],[-6.3091003,58.4983923],[-6.4876282,58.4955218],[-6.4876282,58.4423768],[-6.6606628,58.4395018],[-6.6469299,58.3819525],[-6.8117248,58.3805125],[-6.8117248,58.3286357],[-6.9792663,58.3286357],[-6.9710266,58.2694608],[-7.1413147,58.2680163],[-7.1403816,58.0358742],[-7.3020636,58.0351031],[-7.3030347,57.9774797],[-7.1379539,57.9777372],[-7.1413526,57.9202792],[-7.1398961,57.8640206],[-7.3020636,57.862471],[-7.298484,57.7442293],[-7.4509193,57.7456951],[-7.4550392,57.6899522],[-7.6186131,57.6906048],[-7.6198341,57.7456951],[-7.7901222,57.7442293],[-7.7873756,57.6855477],[-7.6222332,57.6853817],[-7.6173779,57.5712602],[-7.788285,57.5709998],[-7.7892561,57.512109],[-7.7038025,57.5115874],[-7.6999183,57.4546902],[-7.5367796,57.4552126],[-7.5348375,57.5126306],[-7.4581235,57.5131521],[-7.4552103,57.2824165],[-7.6115515,57.2845158],[-7.6144647,57.2272651],[-7.451326,57.2256881],[-7.451326,57.1103873],[-7.6164068,57.1088053],[-7.603783,56.8792358],[-7.7696901,56.8788231]],[[-1.7106618,59.5626284],[-1.5417509,59.562215],[-1.5423082,59.5037224],[-1.7112191,59.5041365],[-1.7106618,59.5626284]]],"terms_url":"http://geo.nls.uk/maps/","terms_text":"National Library of Scotland Historic Maps","icon":"http://nls.tileserver.com/nls70-nq8.png"},{"id":"NLSC-EMAP5","name":"NLSC General Map with Contour line","type":"tms","template":"http://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}","startDate":"2015-01-01T00:00:00.000Z","scaleExtent":[0,15],"polygon":[[[120.4570579,26.3970586],[120.44256,26.3708009],[120.44713,26.3531513],[120.4673009,26.3405831],[120.4978723,26.3340866],[120.5141036,26.3401594],[120.5341168,26.3641649],[120.5297045,26.3842128],[120.4956661,26.4015754],[120.4570579,26.3970586]],[[119.9007221,25.9858609],[119.8960071,25.9648902],[119.9131301,25.9470399],[119.9503542,25.9278478],[119.9905563,25.9260623],[120.0198392,25.9363284],[120.0277804,25.9557423],[120.0275322,25.9845224],[119.9989937,26.0010288],[119.9404278,26.0028131],[119.9007221,25.9858609]],[[122.089,24.5485],[121.709,23.4541],[121.717,22.698],[121.818,21.95],[121.803,21.8735],[121.759,21.8087],[121.694,21.7653],[120.861,21.5631],[120.815,21.5576],[120.739,21.5728],[120.661,21.6296],[120.202,22.1809],[119.27,23.0542],[119.153,23.2049],[119.128,23.2485],[119.103,23.4],[119.118,23.4765],[119.137,23.512],[119.361,23.8885],[119.406,23.9407],[120.968,25.2284],[121.408,25.4687],[121.989,25.8147],[122.065,25.8299],[122.141,25.8147],[122.216,25.7663],[122.26,25.7015],[122.297,25.48],[122.196,24.9696],[122.089,24.5485]],[[116.6855033,20.8547596],[116.6309071,20.8149565],[116.5941695,20.7600846],[116.5797214,20.6967501],[116.5893056,20.6325865],[116.621766,20.5753367],[116.6731874,20.5319171],[116.7373678,20.5075783],[116.8065659,20.5052653],[116.8724354,20.5252581],[116.9270316,20.5651373],[116.9637692,20.6200797],[116.9782173,20.6834462],[116.9686331,20.7475883],[116.9361727,20.8047732],[116.8847512,20.8481147],[116.8205709,20.872399],[116.7513728,20.8747063],[116.6855033,20.8547596]],[[118.2261504,24.4563345],[118.2936439,24.4538527],[118.2851467,24.4751026],[118.3097372,24.4916821],[118.3767709,24.4729348],[118.4100947,24.5332285],[118.4479031,24.5284069],[118.4746394,24.4599272],[118.512992,24.4315479],[118.5065839,24.4202318],[118.4811625,24.4332439],[118.4610567,24.4089192],[118.426145,24.3970385],[118.3970055,24.4284184],[118.3765564,24.4258395],[118.3397565,24.3814628],[118.3031926,24.3705764],[118.2574234,24.4139213],[118.1381276,24.3724838],[118.1617342,24.4022433],[118.2094226,24.4139604],[118.1895784,24.4352201],[118.2176338,24.430205],[118.2261504,24.4563345]],[[120.2234496,26.30045],[120.2550843,26.3100412],[120.269888,26.3368716],[120.2591889,26.3652192],[120.2292544,26.3784823],[120.1976197,26.3688968],[120.182816,26.3420738],[120.1935151,26.3137205],[120.2234496,26.30045]],[[119.4374461,25.0047541],[119.4342024,24.9886249],[119.4541901,24.9722553],[119.4827444,24.9718376],[119.4898402,24.9937882],[119.4715877,25.0069239],[119.4374461,25.0047541]],[[119.8869914,26.180381],[119.893227,26.1203128],[119.9285109,26.1080224],[119.9779388,26.1223611],[120.0366775,26.151728],[120.1098054,26.2134921],[120.119269,26.2713663],[120.0629175,26.3172592],[119.9923706,26.3164881],[119.9467732,26.2898799],[119.9020362,26.2439761],[119.8869914,26.180381]]],"terms_url":"http://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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAxJJREFUOI3tlF9oW2UYxn9f4nKW2ixfjJGYMnuctRUZ5mhEpjdJEEaHtmsZaKHq0qt6ZdtZL3Zhk3ilIKS9Ui806UStE7Edjln8kwzEwaB6IshsmJIqK1ttZ7Qlzel2eryQhqZrsDC8EHyuvu993+/53j+8D/yPfxtip4GqH1X1owLkdHI3RSwbkbFu1yAPdx4t3hpSS6YLAM05i/vCqcmzZwpj9T6pIZYOZNArNADhsQj3RVNjtyS1DcKtiHlPIb96PTn67nJiq8++cRgJicTpQ7Yz0oHc7cQZeakzPbTyqr9iKXUr0lfbqOx7LHJgbXrux5/X9M0+G0C8SySeeWTPQPSLxu4jn1vd4tE7m4euDNclrCEvt6E+25/e6H+VuKen57vEe1b8I29b8cKyo6j6Uece6I/VK387jC70crgjMFBDPDEx8aA5aOPkG+f7FhcX9YhGZLIUBSD7VAtSsZOKNpGKNgFU710tbiJ7G0lFm9DucCL2R7uCXjTpQFZbMV6wMu+EbWnpQOIJVKcvFTuDIR+az4nmc1Zt6h4HuV9XGHjIx1D2EvrCKtLnUgE+Pig+kQ6kDeDFc9YQwJdP2rLuBlfzRjklw7yh7JJh0vfZL6Tb70IqdqRSnT/5JfQTBcZfDom4HaBiUjn5k/Xh0VYRe85ztZ11QX53K4ZQyPxwFcO0yP+2Ste9bi6XrxPbfxuvnV9g6uIfPK/dTskwURbOFfPTM2PSIeTT99Bzw4KMhERi5ICIl667OOHuYNzdQV5p/ccBxi89kUmm5vveDou06kLddvNSibasbvZGXvj9fYJGgbldAaYaI+SVVoq7ApxtCNXEH7ZyhL8+Nho00YJeoT3+6Xp0W2KtBU07NpzNlHulem2ecHmGzpUcmlGg+dp83aynitbkK99ayfwSel2tiLUTo3M4lSn3ys12ub5MsFL4O4GGWZq/fyszfvrPsfwSNZtnpw70i+jMfjPdf//MfXf7UYtrASqWQkUoeNzLtHumS0buzePJD4zjV1a5vPX9jmRT9aNGNCKbZXMn0vnfwl+e9BTflqrxKAAAAABJRU5ErkJggg=="},{"id":"MAPNIK","name":"OpenStreetMap (Standard)","type":"tms","template":"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors, CC-BY-SA","default":true,"description":"The default OpenStreetMap layer.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGb0lEQVR4Xq3MS2xcVx3H8e855z7m3vH1jMdjO43zshIrtpM0SZ3WFEcRVFFKoRWPBYtAHwgWCFUsQN100QeCsqAhCESrirRASdWWIkoUqgKFJm3UZ5o2oW2akrR5uXbi2ON4PPfOfZ17iERW2bCAz1/f3V8/cfDC02UEj4OxKHjdFMUfmUzOlAeXZFZuuVIKN8zi1dPh7Hcn5091G2EOB5b//NplA28/9tAT4bq111jD64ZKHR2VQWPEbULI0aHqZz7NZeLNmSeVMOJu4AfGgNEGLsR/95YuetcRzprcFJvaaVxrpm2mmqfp8FxKSYk8ck+0pt1nykFp0A/k9Tnt/lq3T2dHEOmi2DxSu+EdAAFwcPqp640xe42h26Qa2hqnXsFVHs04pNFuYgvbtOWCmD3aMj2VNaLi1+jwyxgpCKOQRCdMN6ZMd5Bmw1cPfG+5O/7LeX0ECyBppx9Zrn0c6BbNHJNr4qhFYWtsJCWpSFUm3ntxips2bxe+p1BKIJQECpRbkCQ2wu0XzbnIeemvhzYCVNR6JMDm5bdNF9qcwhiKbpvMg2KujZDmUgX1jgqT719gy+iX6QxsPM9F2YqclHbRRpUEXmCRZTGFlZGKxSMbR6+uA0gu863OzLc7cVUZN6jgKI8kicl0ykzjAiW5lGrVAWUwokApSa3UTY/XR2B3UlDgVy1sB8od7tgt2++4AcACOHL+uRW2bW8QQiCxcUoS6XssyBbnF6Y5+8kci8vjlJwqjnQwWpDlgtRYZDpHmxJzWUyk26gOYXxK0g+8G4bXX/snC0DZcmVh9EoQ5DpDSIVJYmIiGvkCurAQpkLU9kkTEEJeCjxbURSCZgTkfVjOApoM6Qtc3109Nj7uWO9M70EbPQT4YMhNjrWQEdHmTPs8SgfUisUgDLoAgcGyEjJtEaeaVlKQ5gVSGYwBhETaEmVJcemQaZ44aRpvyLIEnedGoNHNkNTTeI5DT2kRljeJziVhnKNlE1GaJFfnuRi3SXMDxmA7IUqCI20qdifkxfED+/dlanzb1cYL3BFhsTXPU4Ep0FGKUVALegCb1oLN7FlNpd5HIUNQLYxIsO0EKcByWljuAmXbp7fcIwgVb7xyaNeep3YfUnt272PLjaP1em/lZqmEk4cJQoMKfBxVIcwjlAp47okX6ap3XaoP221CIREyx7La2E6O7/h0eTXK+Bw+8uHrP7znvocXLe6flwCHXj06kab5hJAS6dhQFOgiJ2qXsKLVuHqAgdVD7HrwXibPTKJzFyMMAgECHGXTJTqxE4t3T5xMD7y29+mFRjgpLSUlYJ793T9ORWF0Lk1StCzQNqTTAle30flbzJ/bx6n3Xsa2Fb9/5Eccfu19wnlNFBniWJA3JecbDfa/8y5nJg7bW7ZeuyYKZwyF0QIAkC988Ogzfof6SppapHGZqgNTExPsfngfgaXpqyWk9QF6lwWk7YJlK1fQaTysqk8sE6LwIq4OEMql1DH3/O03PnBHUCk3JMCeA7/q6u1a0ltiNZ1eL719cPrcWR752d+Yn2lx/HSDY40qY2Pb2PapjYxv3YBX1syZ88weP3bp90Omw3PMOxNUe9FTn9gn5uemQqfk5BbAisHBlVo7g7PFx9TdgDMnZvjtzheI51qkWY5xYWxTLxXfJ5IVevIZ6gMDxCYnPjWDXZ0nSiOkEmYqO5l8cGT6FSD6+NhRJMCF1sWV88VkX6f3n/FHd+xl9uwsrTDEOIbPfWEj120eorw0JEzLhGWfop3ixxKrP0CTIQSAEVmhw5/f94uXAANg3b/r+1YrnV1T86ucPDzBrp3PcvHcHGmaUekL+OKtm9m0ailOUEe4FrXyWaKFblM4HmUvElNzF4jTxFiOhRRSJO34JHCOy6RU0i60uepfx07nO+593FycapAkCbX+Kl+/cxvXfXYIU3GjN/Yf2vPPg2/9JVxoNYNqQ+hcilznlKWDcpSwlCWiZrtx/O3Tf+AKClj88I9v/9aD99/aHBkaLlYNDTXuvPubH/3kN3e9vP3bn78HGAP6gSXA6K3fufnOXz+/888vHH3i9O4XH3j1roe+8dDo1pGvAeuAClfa/+aTQH35Yztuenz7l4aPLB9c81O/3H3L5VHFlUACZaAH6AQc/pv1o9cEiwbWbRlev+mrazeOblg3usnj/6nWV2fVyFp71fCa0sDgkOKyq5av4H/xb0Ky8po5hQEuAAAAAElFTkSuQmCC"},{"id":"OpenStreetMap-turistautak","name":"OpenStreetMap (turistautak)","type":"tms","template":"http://{switch:h,i,j}.tile.openstreetmap.hu/turistautak/{zoom}/{x}/{y}.png","scaleExtent":[0,18],"polygon":[[[16.1139147,46.8691038],[16.1789749,46.90662],[16.2000429,46.9415079],[16.2217547,46.9355441],[16.2462784,46.9463851],[16.2553226,46.9642125],[16.2764694,46.9626082],[16.290583,47.0139849],[16.3016199,46.9992329],[16.3414618,46.9965225],[16.3505162,47.0106313],[16.3734016,46.9985929],[16.412765,47.00475],[16.4332705,46.9927417],[16.4478119,47.003893],[16.479997,46.9941169],[16.5121988,47.0011695],[16.4635584,47.0322699],[16.4478586,47.0227481],[16.439123,47.029663],[16.445673,47.038872],[16.520323,47.056103],[16.473213,47.0736169],[16.4637199,47.09392],[16.500798,47.110058],[16.500035,47.123295],[16.5295349,47.1287419],[16.5171609,47.1496938],[16.454951,47.1425878],[16.4648728,47.1683349],[16.4555643,47.1875584],[16.4305559,47.1847022],[16.4195013,47.1949147],[16.4189215,47.2107114],[16.4371293,47.2097043],[16.4426335,47.2337117],[16.4313127,47.2527554],[16.4671512,47.2531652],[16.4892319,47.2798885],[16.4646338,47.3338455],[16.4337002,47.3528101],[16.458513,47.3670496],[16.4454619,47.4070195],[16.4831657,47.4093628],[16.4963821,47.3892659],[16.5170941,47.4100218],[16.5749054,47.4054243],[16.5807291,47.4191699],[16.661847,47.455595],[16.6706419,47.47422],[16.6523395,47.500342],[16.6895619,47.510161],[16.7147797,47.540199],[16.663545,47.567733],[16.673199,47.6049544],[16.6595343,47.6061018],[16.652758,47.622852],[16.6314207,47.6283176],[16.5739108,47.619667],[16.5147382,47.6461964],[16.4967504,47.6393149],[16.425464,47.6621679],[16.4437449,47.674205],[16.4480507,47.6964725],[16.4746984,47.6811576],[16.4872245,47.6979767],[16.5521729,47.7225519],[16.5363779,47.736785],[16.5479799,47.751544],[16.6095193,47.7603722],[16.6344148,47.7590843],[16.65729,47.7414879],[16.7209405,47.7353565],[16.7534062,47.6828165],[16.8301587,47.681058],[16.8394284,47.7045139],[16.8668943,47.7211462],[16.876679,47.6876452],[17.0937421,47.7077706],[17.0706562,47.7285366],[17.0516019,47.7938499],[17.0749479,47.8084997],[17.047139,47.8285635],[17.0519452,47.8377691],[17.0105513,47.8581765],[17.0163878,47.8673325],[17.0857537,47.8746239],[17.113171,47.9271605],[17.0917133,47.9342916],[17.1183782,47.9601083],[17.094657,47.9708775],[17.2010289,48.019992],[17.241769,48.0224651],[17.257955,47.998655],[17.334651,47.993125],[17.4029929,47.947849],[17.4539199,47.8852579],[17.5267369,47.865509],[17.5675779,47.8151289],[17.608402,47.8218859],[17.7085789,47.756678],[17.7798739,47.739487],[17.8660959,47.74575],[17.9001292,47.7392633],[17.946867,47.744668],[17.9708709,47.7578392],[18.0044103,47.7463402],[18.0380583,47.7576812],[18.2958774,47.7314616],[18.4540681,47.7651226],[18.4931553,47.7527552],[18.5590761,47.7659963],[18.6460866,47.7590921],[18.7260691,47.7890411],[18.7411784,47.8138245],[18.7920013,47.8230869],[18.8485417,47.8167221],[18.855876,47.826077],[18.828014,47.834291],[18.8135749,47.85555],[18.76353,47.8716049],[18.756858,47.896838],[18.776746,47.955092],[18.7552499,47.9763469],[18.8157429,47.993442],[18.819998,48.039676],[18.833268,48.048239],[18.8749364,48.0470707],[18.886674,48.058682],[18.9089819,48.051139],[18.9439039,48.058865],[18.9816099,48.0536009],[19.0148639,48.078179],[19.0585249,48.0573529],[19.0843619,48.072781],[19.107402,48.065596],[19.1352889,48.074146],[19.2413679,48.0536529],[19.2557819,48.0715559],[19.3031119,48.088711],[19.3865969,48.091914],[19.400018,48.082304],[19.454053,48.101436],[19.467354,48.083933],[19.4944199,48.109906],[19.492377,48.1396639],[19.5128219,48.154663],[19.504518,48.173443],[19.528967,48.190358],[19.526044,48.20313],[19.577502,48.2160149],[19.6308263,48.2500725],[19.6445239,48.2391719],[19.669857,48.239212],[19.691219,48.203894],[19.721125,48.201473],[19.74618,48.2165119],[19.7871629,48.19253],[19.7987329,48.19482],[19.8052829,48.183733],[19.782415,48.165039],[19.794812,48.153529],[19.821331,48.169081],[19.8452819,48.162742],[19.8551729,48.178431],[19.8601309,48.169409],[19.898745,48.1663119],[19.9145359,48.146863],[19.898298,48.1249019],[19.937383,48.131118],[19.9743939,48.1660049],[19.988706,48.1621679],[20.029038,48.1776849],[20.049449,48.1671999],[20.0729859,48.179606],[20.0700369,48.1917019],[20.1340909,48.225182],[20.1331879,48.253982],[20.206162,48.250979],[20.2038299,48.261906],[20.228466,48.262779],[20.2349469,48.279933],[20.286858,48.26164],[20.3257109,48.272794],[20.3374649,48.301667],[20.3656579,48.316606],[20.384077,48.3511809],[20.4098349,48.365857],[20.402532,48.382565],[20.4205349,48.403858],[20.416228,48.418536],[20.507929,48.489363],[20.5065069,48.534415],[20.537471,48.527878],[20.5464939,48.544292],[20.586595,48.535759],[20.6538739,48.561413],[20.836359,48.58284],[20.8378,48.57421],[20.8504359,48.5816329],[20.8453301,48.5665046],[20.8681549,48.551818],[20.922323,48.559453],[20.9346349,48.538341],[20.955882,48.533963],[20.9561979,48.521666],[20.9815849,48.5177669],[21.0151139,48.532313],[21.0663209,48.525894],[21.1174479,48.4910549],[21.1608749,48.521499],[21.179634,48.518232],[21.221061,48.537497],[21.305488,48.5222489],[21.313377,48.550841],[21.326875,48.554129],[21.319384,48.561201],[21.4154499,48.558951],[21.4226649,48.578821],[21.4406099,48.585104],[21.514091,48.551065],[21.5420199,48.508395],[21.6139329,48.509416],[21.6201879,48.469826],[21.663549,48.417961],[21.6645609,48.392164],[21.7017409,48.380695],[21.711871,48.357617],[21.8174139,48.332787],[21.8352029,48.3346409],[21.837213,48.363253],[21.8842979,48.356047],[21.8848429,48.367539],[21.897883,48.36256],[21.8997959,48.3702229],[21.9281859,48.3615969],[21.9268059,48.370899],[21.949198,48.378728],[21.994463,48.377323],[22.0213259,48.392749],[22.0546049,48.377528],[22.0764859,48.387241],[22.086743,48.371564],[22.1359089,48.380519],[22.131056,48.3912329],[22.152768,48.3962409],[22.1561913,48.4093076],[22.2125722,48.4256468],[22.2371405,48.4100396],[22.2654858,48.4098675],[22.2398761,48.3870055],[22.2675722,48.3611612],[22.3178106,48.3545437],[22.3132861,48.3250712],[22.3372944,48.3079113],[22.3384267,48.2792074],[22.3847547,48.2339632],[22.4006407,48.249198],[22.4328384,48.2525166],[22.456386,48.2423109],[22.4899029,48.2534237],[22.4972201,48.2395546],[22.5161491,48.237965],[22.5311088,48.2094282],[22.5711442,48.1961428],[22.5616362,48.1816066],[22.5982449,48.144756],[22.5902763,48.1073414],[22.6754492,48.091997],[22.7347192,48.119848],[22.7576242,48.1200599],[22.7703914,48.1090162],[22.772319,48.1218742],[22.8027688,48.1221112],[22.8025285,48.1070813],[22.8254256,48.1175119],[22.8364365,48.080249],[22.8611284,48.0750312],[22.8677955,48.0524256],[22.8820424,48.0548053],[22.8659692,48.0113165],[22.835562,47.9905988],[22.8407599,47.9813636],[22.8725729,47.9752683],[22.8697274,47.9659593],[22.8915652,47.9672446],[22.897435,47.9540629],[22.8473299,47.9077579],[22.7928135,47.8908586],[22.7586924,47.8941446],[22.77775,47.8422508],[22.7136344,47.8360928],[22.6801938,47.7877527],[22.6111171,47.7717455],[22.5490018,47.7722246],[22.4812121,47.8108886],[22.4513078,47.803389],[22.4313319,47.7398119],[22.3566167,47.7486206],[22.3177714,47.7660887],[22.3176236,47.7433657],[22.2851369,47.7292757],[22.264325,47.7310675],[22.2589955,47.6979057],[22.2306796,47.693196],[22.1796501,47.5916115],[22.1289245,47.5978984],[22.0942787,47.5583628],[22.0782587,47.5621299],[22.0534529,47.5474795],[22.0712176,47.5380742],[22.0617872,47.5288029],[22.0451278,47.5398919],[22.0367222,47.5326653],[22.0071886,47.48362],[22.0327909,47.4508372],[22.0238835,47.3908631],[22.0119849,47.3758016],[21.9627373,47.381053],[21.9382461,47.3725317],[21.8777922,47.2857763],[21.8872845,47.2730473],[21.8534909,47.2397622],[21.8580662,47.1873597],[21.8124804,47.1667511],[21.7924092,47.1059751],[21.7268258,47.0983882],[21.6976037,47.057915],[21.6504151,47.0408303],[21.6888701,47.0019977],[21.6678744,46.9712337],[21.6814917,46.9652089],[21.6381964,46.9330487],[21.5984455,46.9274708],[21.6142857,46.8867275],[21.6016694,46.8668202],[21.520328,46.8373749],[21.5186086,46.8000703],[21.4831761,46.7650246],[21.5263389,46.7393249],[21.529369,46.7209721],[21.4923253,46.6859652],[21.4728438,46.6959075],[21.4299047,46.693937],[21.4309553,46.6781367],[21.4546661,46.660863],[21.4162375,46.6426231],[21.4097959,46.6218052],[21.3657038,46.6379501],[21.3300499,46.6318155],[21.3139733,46.617666],[21.3012351,46.5908672],[21.3207905,46.5828562],[21.2743045,46.5407362],[21.2600254,46.5021583],[21.2744188,46.4767333],[21.2964506,46.4762973],[21.3174343,46.4507288],[21.2895176,46.4154784],[21.2963256,46.4069601],[21.2250116,46.4136899],[21.2064214,46.4033825],[21.1992563,46.3479034],[21.1762269,46.3357664],[21.180497,46.3044494],[21.1155437,46.3018529],[21.1030549,46.2624637],[21.0708792,46.2539014],[21.0660827,46.2429394],[21.0366237,46.2480392],[21.0246723,46.2665329],[20.960817,46.2623039],[20.9465849,46.2793024],[20.9250701,46.2766191],[20.9218133,46.2618129],[20.8732713,46.2877555],[20.7756538,46.2759602],[20.7490474,46.2508489],[20.7618619,46.204563],[20.727401,46.2077485],[20.7341052,46.1939355],[20.7140487,46.1660531],[20.6843592,46.1447802],[20.6549178,46.1497739],[20.6394471,46.1267602],[20.5450486,46.1790935],[20.5014839,46.190334],[20.4949436,46.1709908],[20.4592293,46.1428837],[20.3975133,46.1574709],[20.3685325,46.1528554],[20.3557074,46.1696256],[20.2968136,46.1521542],[20.2549024,46.1158522],[20.2484757,46.1300956],[20.2330132,46.1241668],[20.1817362,46.1601137],[20.1364966,46.1449476],[20.1009667,46.1772756],[20.0636156,46.1437275],[20.0346142,46.1458888],[20.0158072,46.1768354],[19.9354075,46.1764243],[19.8533469,46.1500005],[19.8179747,46.1281652],[19.7585403,46.1479754],[19.6982054,46.1879317],[19.6827672,46.1800388],[19.661508,46.1904394],[19.6317396,46.1692993],[19.5676482,46.179106],[19.5604013,46.1665762],[19.5026585,46.1424492],[19.5271208,46.1210269],[19.4645033,46.0953827],[19.4665828,46.0820437],[19.4160037,46.0460453],[19.3803957,46.0358749],[19.3640923,46.0522965],[19.2819012,46.0148048],[19.2965348,45.9881173],[19.2856472,45.9968981],[19.1479857,45.9963445],[19.1338422,46.0370993],[19.104873,46.0401673],[19.0660427,46.0001999],[19.0796791,45.9636376],[19.0059803,45.9590674],[19.0092745,45.9236559],[18.9061334,45.9353801],[18.8794572,45.9166827],[18.8647137,45.9208493],[18.8685629,45.9113361],[18.8276792,45.9051714],[18.8220041,45.9145893],[18.8075092,45.9036055],[18.809247,45.8796189],[18.7956242,45.8784488],[18.7048857,45.9181883],[18.6700246,45.9108439],[18.6596602,45.9168934],[18.6651348,45.899279],[18.6412808,45.8890396],[18.6550179,45.8742393],[18.6277704,45.8733782],[18.6148449,45.8531438],[18.6236656,45.8398531],[18.5732391,45.8137578],[18.5749849,45.8004344],[18.559716,45.8037961],[18.5223504,45.7826858],[18.4906706,45.7947167],[18.4821905,45.7655032],[18.4562828,45.7695229],[18.4450763,45.7605195],[18.446853,45.737128],[18.40763,45.7397119],[18.3918949,45.7616983],[18.3642257,45.7729364],[18.3394214,45.7471605],[18.2968157,45.7612196],[18.2440473,45.7612305],[18.2307311,45.7790328],[18.1908702,45.7878759],[18.1681939,45.7762712],[18.1246514,45.7896277],[18.1068067,45.7708256],[18.0818922,45.7645205],[17.9958808,45.7957311],[17.9302095,45.7863301],[17.9066757,45.7925692],[17.8653145,45.7670064],[17.8262748,45.8099957],[17.8089784,45.8040989],[17.7809054,45.8174884],[17.7603399,45.811923],[17.7408624,45.8295975],[17.6632915,45.8381849],[17.6276211,45.8979446],[17.5700676,45.9358204],[17.4378254,45.9503823],[17.4258964,45.9272681],[17.4108059,45.9399665],[17.392149,45.9302149],[17.3828713,45.9475733],[17.3476208,45.9423413],[17.3438769,45.9605329],[17.3537711,45.9525011],[17.3905375,45.9581914],[17.387423,45.9661823],[17.3583539,45.9642737],[17.3754852,45.9686921],[17.3751895,45.9881054],[17.3635685,45.9915442],[17.3567202,45.9735836],[17.3339583,45.9960781],[17.3319847,45.9728948],[17.3129974,45.9665347],[17.323647,45.9887776],[17.2987653,45.9838652],[17.3041996,46.0021128],[17.2579726,46.0110256],[17.29632,46.0285169],[17.2541514,46.030005],[17.270955,46.0567055],[17.2324767,46.0592034],[17.2525145,46.0664725],[17.2313144,46.0790345],[17.2019916,46.0765488],[17.2331299,46.0989644],[17.2104017,46.1001693],[17.2129734,46.113855],[17.175927,46.1084583],[17.1743424,46.1287608],[17.1865197,46.1332308],[17.1810983,46.1505485],[17.1562307,46.1585819],[17.1592857,46.1696818],[17.1261012,46.1684495],[17.1227409,46.1789791],[17.0752482,46.1889531],[17.0661614,46.2022984],[16.9735401,46.2251982],[16.973954,46.2431113],[16.9504085,46.2415285],[16.8862356,46.2814598],[16.8713682,46.3252767],[16.8802109,46.3356966],[16.8615374,46.3452401],[16.8656232,46.3556489],[16.8521959,46.3517189],[16.8498589,46.3626245],[16.8352859,46.3638195],[16.8376499,46.3748032],[16.8261732,46.3670994],[16.7933444,46.387385],[16.7592072,46.3776563],[16.7298672,46.40149],[16.7182119,46.3898704],[16.6772872,46.4494536],[16.6631785,46.4486958],[16.6663732,46.4582995],[16.6187915,46.4619875],[16.604468,46.4760773],[16.5235997,46.5053761],[16.5325768,46.5314027],[16.5176728,46.5363516],[16.5084107,46.5652692],[16.4829969,46.5660383],[16.4834008,46.5786011],[16.4455713,46.610952],[16.4248583,46.6131645],[16.385941,46.6442485],[16.3915424,46.6637257],[16.4198454,46.6584771],[16.4286335,46.6939737],[16.3689211,46.7040082],[16.3798266,46.7153869],[16.3710856,46.7222945],[16.3570587,46.7142387],[16.3185954,46.7541449],[16.3305417,46.7752119],[16.3121626,46.7780033],[16.3127666,46.797314],[16.3406373,46.8051851],[16.3508404,46.8300552],[16.3403309,46.8468762],[16.3015007,46.8595142],[16.2913867,46.8728341],[16.2332296,46.8766702],[16.1560866,46.8537074],[16.126571,46.8569079],[16.1139147,46.8691038]]],"terms_url":"https://www.openstreetmap.org/","terms_text":"© OpenStreetMap contributors"},{"id":"osm-gps","name":"OpenStreetMap GPS traces","type":"tms","template":"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png","scaleExtent":[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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAGb0lEQVR4Xq3MS2xcVx3H8e855z7m3vH1jMdjO43zshIrtpM0SZ3WFEcRVFFKoRWPBYtAHwgWCFUsQN100QeCsqAhCESrirRASdWWIkoUqgKFJm3UZ5o2oW2akrR5uXbi2ON4PPfOfZ17iERW2bCAz1/f3V8/cfDC02UEj4OxKHjdFMUfmUzOlAeXZFZuuVIKN8zi1dPh7Hcn5091G2EOB5b//NplA28/9tAT4bq111jD64ZKHR2VQWPEbULI0aHqZz7NZeLNmSeVMOJu4AfGgNEGLsR/95YuetcRzprcFJvaaVxrpm2mmqfp8FxKSYk8ck+0pt1nykFp0A/k9Tnt/lq3T2dHEOmi2DxSu+EdAAFwcPqp640xe42h26Qa2hqnXsFVHs04pNFuYgvbtOWCmD3aMj2VNaLi1+jwyxgpCKOQRCdMN6ZMd5Bmw1cPfG+5O/7LeX0ECyBppx9Zrn0c6BbNHJNr4qhFYWtsJCWpSFUm3ntxips2bxe+p1BKIJQECpRbkCQ2wu0XzbnIeemvhzYCVNR6JMDm5bdNF9qcwhiKbpvMg2KujZDmUgX1jgqT719gy+iX6QxsPM9F2YqclHbRRpUEXmCRZTGFlZGKxSMbR6+uA0gu863OzLc7cVUZN6jgKI8kicl0ykzjAiW5lGrVAWUwokApSa3UTY/XR2B3UlDgVy1sB8od7tgt2++4AcACOHL+uRW2bW8QQiCxcUoS6XssyBbnF6Y5+8kci8vjlJwqjnQwWpDlgtRYZDpHmxJzWUyk26gOYXxK0g+8G4bXX/snC0DZcmVh9EoQ5DpDSIVJYmIiGvkCurAQpkLU9kkTEEJeCjxbURSCZgTkfVjOApoM6Qtc3109Nj7uWO9M70EbPQT4YMhNjrWQEdHmTPs8SgfUisUgDLoAgcGyEjJtEaeaVlKQ5gVSGYwBhETaEmVJcemQaZ44aRpvyLIEnedGoNHNkNTTeI5DT2kRljeJziVhnKNlE1GaJFfnuRi3SXMDxmA7IUqCI20qdifkxfED+/dlanzb1cYL3BFhsTXPU4Ep0FGKUVALegCb1oLN7FlNpd5HIUNQLYxIsO0EKcByWljuAmXbp7fcIwgVb7xyaNeep3YfUnt272PLjaP1em/lZqmEk4cJQoMKfBxVIcwjlAp47okX6ap3XaoP221CIREyx7La2E6O7/h0eTXK+Bw+8uHrP7znvocXLe6flwCHXj06kab5hJAS6dhQFOgiJ2qXsKLVuHqAgdVD7HrwXibPTKJzFyMMAgECHGXTJTqxE4t3T5xMD7y29+mFRjgpLSUlYJ793T9ORWF0Lk1StCzQNqTTAle30flbzJ/bx6n3Xsa2Fb9/5Eccfu19wnlNFBniWJA3JecbDfa/8y5nJg7bW7ZeuyYKZwyF0QIAkC988Ogzfof6SppapHGZqgNTExPsfngfgaXpqyWk9QF6lwWk7YJlK1fQaTysqk8sE6LwIq4OEMql1DH3/O03PnBHUCk3JMCeA7/q6u1a0ltiNZ1eL719cPrcWR752d+Yn2lx/HSDY40qY2Pb2PapjYxv3YBX1syZ88weP3bp90Omw3PMOxNUe9FTn9gn5uemQqfk5BbAisHBlVo7g7PFx9TdgDMnZvjtzheI51qkWY5xYWxTLxXfJ5IVevIZ6gMDxCYnPjWDXZ0nSiOkEmYqO5l8cGT6FSD6+NhRJMCF1sWV88VkX6f3n/FHd+xl9uwsrTDEOIbPfWEj120eorw0JEzLhGWfop3ixxKrP0CTIQSAEVmhw5/f94uXAANg3b/r+1YrnV1T86ucPDzBrp3PcvHcHGmaUekL+OKtm9m0ailOUEe4FrXyWaKFblM4HmUvElNzF4jTxFiOhRRSJO34JHCOy6RU0i60uepfx07nO+593FycapAkCbX+Kl+/cxvXfXYIU3GjN/Yf2vPPg2/9JVxoNYNqQ+hcilznlKWDcpSwlCWiZrtx/O3Tf+AKClj88I9v/9aD99/aHBkaLlYNDTXuvPubH/3kN3e9vP3bn78HGAP6gSXA6K3fufnOXz+/888vHH3i9O4XH3j1roe+8dDo1pGvAeuAClfa/+aTQH35Yztuenz7l4aPLB9c81O/3H3L5VHFlUACZaAH6AQc/pv1o9cEiwbWbRlev+mrazeOblg3usnj/6nWV2fVyFp71fCa0sDgkOKyq5av4H/xb0Ky8po5hQEuAAAAAElFTkSuQmCC","overlay":true},{"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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":"OS-historic-25k-OSM_Limited","name":"OS 1:25k historic (OSM)","type":"tms","template":"http://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg","scaleExtent":[6,17],"polygon":[[[-6.4585407,49.9044128],[-6.3872009,49.9841116],[-6.2296827,49.9896159],[-6.2171269,49.8680087],[-6.4551164,49.8591793],[-6.4585407,49.9044128]],[[-1.4495137,60.8634056],[-0.7167114,60.8545122],[-0.7349744,60.4359756],[-0.6938826,60.4168218],[-0.7258429,60.3942735],[-0.7395401,60.0484714],[-0.9267357,60.0461918],[-0.9381501,59.8266157],[-1.4586452,59.831205],[-1.4455187,60.0535999],[-1.463211,60.0535999],[-1.4643524,60.0630002],[-1.5716475,60.0638546],[-1.5693646,60.1790005],[-1.643558,60.1807033],[-1.643558,60.1892162],[-1.8216221,60.1894999],[-1.8204807,60.3615507],[-1.8415973,60.3697345],[-1.8216221,60.3832755],[-1.8179852,60.5934321],[-1.453168,60.5934321],[-1.4495137,60.8634056]],[[-4.9089213,54.4242078],[-4.282598,54.4429861],[-4.2535417,54.029769],[-4.8766366,54.0221831],[-4.9089213,54.4242078]],[[-5.8667408,59.1444603],[-5.7759966,59.1470945],[-5.7720016,59.1014052],[-5.8621751,59.0990605],[-5.8667408,59.1444603]],[[-1.7065887,59.5703599],[-1.5579165,59.5693481],[-1.5564897,59.4965695],[-1.7054472,59.4975834],[-1.7065887,59.5703599]],[[-7.6865827,58.2940975],[-7.5330594,58.3006957],[-7.5256401,58.2646905],[-7.6797341,58.2577853],[-7.6865827,58.2940975]],[[-4.5338281,59.0359871],[-4.481322,59.0371616],[-4.4796099,59.0186583],[-4.5332574,59.0180707],[-4.5338281,59.0359871]],[[-8.6710698,57.8769896],[-8.4673234,57.8897332],[-8.4467775,57.7907],[-8.6510947,57.7779213],[-8.6710698,57.8769896]],[[-5.2395519,50.3530581],[-5.7920073,50.3384899],[-5.760047,49.9317027],[-4.6551363,49.9581461],[-4.677965,50.2860073],[-4.244219,50.2801723],[-4.2487848,50.2042525],[-3.3812929,50.2042525],[-3.4223846,50.5188201],[-3.1164796,50.5246258],[-3.1210453,50.6579592],[-2.6736357,50.6619495],[-2.5953453,50.6394325],[-2.5905026,50.5728419],[-2.4791203,50.5733545],[-2.4758919,50.5066704],[-2.3967943,50.5056438],[-2.401637,50.5723293],[-1.0400296,50.5718167],[-1.0335726,50.7059289],[-0.549302,50.7038843],[-0.5460736,50.7886618],[-0.0924734,50.7856002],[-0.0876307,50.7181949],[0.4789659,50.7120623],[0.487037,50.8182467],[0.9761503,50.8049868],[0.9922927,51.0126311],[1.4491213,51.0004424],[1.4781775,51.4090372],[1.0229632,51.4271576],[1.035877,51.7640881],[1.6105448,51.7500992],[1.646058,52.1560003],[1.7267698,52.1540195],[1.749369,52.4481811],[1.7870672,52.4811624],[1.759102,52.522505],[1.7933451,52.9602749],[0.3798147,52.9958468],[0.3895238,53.2511239],[0.3478614,53.2511239],[0.3238912,53.282186],[0.3461492,53.6538501],[0.128487,53.6575466],[0.116582,53.6674703],[0.1350586,54.0655731],[-0.0609831,54.065908],[-0.0414249,54.4709448],[-0.5662701,54.4771794],[-0.5592078,54.6565127],[-1.1665638,54.6623485],[-1.1637389,54.842611],[-1.3316194,54.843909],[-1.3257065,55.2470842],[-1.529453,55.2487108],[-1.524178,55.6540122],[-1.7638798,55.6540122],[-1.7733693,55.9719116],[-2.1607858,55.9682981],[-2.1543289,56.0621387],[-2.4578051,56.0585337],[-2.4190635,56.641717],[-2.0962164,56.641717],[-2.0833025,57.0021322],[-1.9283359,57.0126802],[-1.9180966,57.3590895],[-1.7502161,57.3625721],[-1.7695869,57.7608634],[-3.6937554,57.7574187],[-3.7066693,57.9806386],[-3.5969013,57.9772149],[-3.6033582,58.1207277],[-3.0222335,58.1309566],[-3.0286905,58.5410788],[-2.8478961,58.530968],[-2.86081,58.8430508],[-2.679624,58.8414991],[-2.6841897,58.885175],[-2.6339665,58.9052239],[-2.679624,58.9335083],[-2.6887555,59.0229231],[-2.3668703,59.0229231],[-2.3702946,59.2652861],[-2.3429001,59.2821989],[-2.3714361,59.2996861],[-2.3737189,59.3707083],[-2.3429001,59.385825],[-2.3725775,59.400354],[-2.3714361,59.4259098],[-3.0734196,59.4230067],[-3.0711368,59.3433649],[-3.103097,59.3311405],[-3.0745611,59.3136695],[-3.0722782,59.232603],[-3.3850319,59.1484167],[-3.3747589,58.9352753],[-3.5653789,58.9323303],[-3.554829,58.69759],[-5.2808579,58.6667732],[-5.2534159,58.3514125],[-5.5068508,58.3437887],[-5.4761804,58.0323557],[-5.8974958,58.0212436],[-5.8522972,57.6171758],[-6.1396311,57.6137174],[-6.1541592,57.7423183],[-6.2913692,57.7380102],[-6.3365678,58.1398784],[-6.1121891,58.1466944],[-6.1473778,58.5106285],[-6.2934817,58.5416182],[-6.8413713,58.2977321],[-7.0057382,58.2929331],[-7.1016189,58.2064403],[-7.2573132,58.1793148],[-7.2531092,58.1004928],[-7.4070698,58.0905566],[-7.391347,57.7911354],[-7.790991,57.7733151],[-7.7624215,57.5444165],[-7.698501,57.1453194],[-7.7943817,57.1304547],[-7.716764,56.7368628],[-7.0122067,56.7654359],[-6.979922,56.5453858],[-7.0638622,56.5453858],[-7.0444914,56.3562587],[-6.500676,56.3812917],[-6.4491433,55.9793649],[-6.563287,55.9691456],[-6.5393742,55.7030135],[-6.5595521,55.6907321],[-6.5345315,55.6761713],[-6.5216176,55.5704434],[-5.8912587,55.5923416],[-5.8560127,55.2320733],[-5.2293639,55.2515958],[-5.1837064,54.6254139],[-3.6655956,54.6518373],[-3.6496155,54.4320023],[-3.5400375,54.4306744],[-3.530906,54.0290181],[-3.0697656,54.030359],[-3.0675737,53.8221388],[-3.0804876,53.7739911],[-3.0619239,53.7477488],[-3.0611168,53.6737049],[-3.2144691,53.6708361],[-3.2057699,53.4226163],[-3.2799632,53.355224],[-3.2896655,53.3608441],[-3.3327547,53.364931],[-3.3761293,53.3540318],[-4.0888976,53.3433102],[-4.0945474,53.4612036],[-4.697412,53.4448624],[-4.6882805,53.3318598],[-4.7202407,53.2895771],[-4.6837148,53.2486184],[-4.6768661,53.1542644],[-4.8480816,53.1446807],[-4.8178336,52.7440299],[-4.2545751,52.7558939],[-4.228876,52.254876],[-4.2607571,52.2536408],[-4.2724603,52.2432637],[-4.8136263,52.230095],[-4.8079191,52.1138892],[-5.3889104,52.0991668],[-5.3717888,51.9129667],[-5.4208706,51.9101502],[-5.414022,51.8453218],[-5.3683645,51.8474373],[-5.3466772,51.5595332],[-4.773676,51.5758518],[-4.7656859,51.4885146],[-4.1915432,51.4970427],[-4.1869775,51.4344663],[-3.6151177,51.4444274],[-3.6105519,51.3746543],[-3.1494115,51.3789292],[-3.1494115,51.2919281],[-4.3038735,51.2745907],[-4.2861169,51.0508721],[-4.8543277,51.0366633],[-4.8372201,50.7212787],[-5.2618345,50.7082694],[-5.2395519,50.3530581]],[[-2.1502671,60.171318],[-2.0030218,60.1696146],[-2.0013096,60.0997023],[-2.148555,60.1011247],[-2.1502671,60.171318]],[[-6.2086011,59.1163488],[-6.1229934,59.1166418],[-6.121852,59.0714985],[-6.2097426,59.0714985],[-6.2086011,59.1163488]],[[-4.4159559,59.0889036],[-4.4212022,59.0770848],[-4.3971904,59.0779143],[-4.3913388,59.0897328],[-4.4159559,59.0889036]]]},{"id":"OS-New_Popular_Edition-historic","name":"OS New Popular Edition historic","type":"tms","template":"http://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png","polygon":[[[-5.8,49.8],[-5.8,55.8],[1.9,55.8],[1.9,49.8],[-5.8,49.8]]]},{"id":"OS-OpenData_Locator","name":"OS OpenData Locator","type":"tms","template":"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png","polygon":[[[-9,49.8],[-9,61.1],[1.9,61.1],[1.9,49.8],[-9,49.8]]],"overlay":true},{"id":"OS-OpenData_StreetView","name":"OS OpenData StreetView","type":"tms","template":"http://os.openstreetmap.org/sv/{zoom}/{x}/{y}.png","scaleExtent":[1,18],"polygon":[[[-5.8292886,50.0229734],[-5.8292886,50.254819],[-5.373356,50.254819],[-5.373356,50.3530588],[-5.1756021,50.3530588],[-5.1756021,50.5925406],[-4.9970743,50.5925406],[-4.9970743,50.6935617],[-4.7965738,50.6935617],[-4.7965738,50.7822112],[-4.6949503,50.7822112],[-4.6949503,50.9607371],[-4.6043131,50.9607371],[-4.6043131,51.0692066],[-4.3792215,51.0692066],[-4.3792215,51.2521782],[-3.9039346,51.2521782],[-3.9039346,51.2916998],[-3.7171671,51.2916998],[-3.7171671,51.2453014],[-3.1486246,51.2453014],[-3.1486246,51.362067],[-3.7446329,51.362067],[-3.7446329,51.4340386],[-3.8297769,51.4340386],[-3.8297769,51.5298246],[-4.0852091,51.5298246],[-4.0852091,51.4939284],[-4.3792215,51.4939284],[-4.3792215,51.5427168],[-5.1444195,51.5427168],[-5.1444195,51.6296003],[-5.7387103,51.6296003],[-5.7387103,51.774037],[-5.5095393,51.774037],[-5.5095393,51.9802596],[-5.198799,51.9802596],[-5.198799,52.0973358],[-4.8880588,52.0973358],[-4.8880588,52.1831557],[-4.4957492,52.1831557],[-4.4957492,52.2925739],[-4.3015365,52.2925739],[-4.3015365,52.3685318],[-4.1811246,52.3685318],[-4.1811246,52.7933685],[-4.4413696,52.7933685],[-4.4413696,52.7369614],[-4.8569847,52.7369614],[-4.8569847,52.9317255],[-4.7288044,52.9317255],[-4.7288044,53.5038599],[-4.1578191,53.5038599],[-4.1578191,53.4113498],[-3.3110518,53.4113498],[-3.3110518,53.5038599],[-3.2333667,53.5038599],[-3.2333667,54.0159169],[-3.3926211,54.0159169],[-3.3926211,54.1980953],[-3.559644,54.1980953],[-3.559644,54.433732],[-3.7188984,54.433732],[-3.7188984,54.721897],[-4.3015365,54.721897],[-4.3015365,54.6140739],[-5.0473132,54.6140739],[-5.0473132,54.7532915],[-5.2298731,54.7532915],[-5.2298731,55.2190799],[-5.6532567,55.2190799],[-5.6532567,55.250088],[-5.8979647,55.250088],[-5.8979647,55.4822462],[-6.5933212,55.4822462],[-6.5933212,56.3013441],[-7.1727691,56.3013441],[-7.1727691,56.5601822],[-6.8171722,56.5601822],[-6.8171722,56.6991713],[-6.5315276,56.6991713],[-6.5315276,56.9066964],[-6.811679,56.9066964],[-6.811679,57.3716613],[-6.8721038,57.3716613],[-6.8721038,57.5518893],[-7.0973235,57.5518893],[-7.0973235,57.2411085],[-7.1742278,57.2411085],[-7.1742278,56.9066964],[-7.3719817,56.9066964],[-7.3719817,56.8075885],[-7.5202972,56.8075885],[-7.5202972,56.7142479],[-7.8306806,56.7142479],[-7.8306806,56.8994605],[-7.6494061,56.8994605],[-7.6494061,57.4739617],[-7.8306806,57.4739617],[-7.8306806,57.7915584],[-7.4736249,57.7915584],[-7.4736249,58.086063],[-7.1879804,58.086063],[-7.1879804,58.367197],[-6.8034589,58.367197],[-6.8034589,58.4155786],[-6.638664,58.4155786],[-6.638664,58.4673277],[-6.5178143,58.4673277],[-6.5178143,58.5625632],[-6.0536224,58.5625632],[-6.0536224,58.1568843],[-6.1470062,58.1568843],[-6.1470062,58.1105865],[-6.2799798,58.1105865],[-6.2799798,57.7122664],[-6.1591302,57.7122664],[-6.1591302,57.6667563],[-5.9339104,57.6667563],[-5.9339104,57.8892524],[-5.80643,57.8892524],[-5.80643,57.9621767],[-5.6141692,57.9621767],[-5.6141692,58.0911236],[-5.490819,58.0911236],[-5.490819,58.3733281],[-5.3199118,58.3733281],[-5.3199118,58.75015],[-3.5719977,58.75015],[-3.5719977,59.2091788],[-3.1944501,59.2091788],[-3.1944501,59.4759216],[-2.243583,59.4759216],[-2.243583,59.1388749],[-2.4611012,59.1388749],[-2.4611012,58.8185938],[-2.7407675,58.8185938],[-2.7407675,58.5804743],[-2.9116746,58.5804743],[-2.9116746,58.1157523],[-3.4865441,58.1157523],[-3.4865441,57.740386],[-1.7153245,57.740386],[-1.7153245,57.2225558],[-1.9794538,57.2225558],[-1.9794538,56.8760742],[-2.1658979,56.8760742],[-2.1658979,56.6333186],[-2.3601106,56.6333186],[-2.3601106,56.0477521],[-1.9794538,56.0477521],[-1.9794538,55.8650949],[-1.4745008,55.8650949],[-1.4745008,55.2499926],[-1.3221997,55.2499926],[-1.3221997,54.8221737],[-1.0550014,54.8221737],[-1.0550014,54.6746628],[-0.6618765,54.6746628],[-0.6618765,54.5527463],[-0.3247617,54.5527463],[-0.3247617,54.2865195],[0.0092841,54.2865195],[0.0092841,53.7938518],[0.2081962,53.7938518],[0.2081962,53.5217726],[0.4163548,53.5217726],[0.4163548,53.0298851],[1.4273388,53.0298851],[1.4273388,52.92021],[1.8333912,52.92021],[1.8333912,52.042488],[1.5235504,52.042488],[1.5235504,51.8261335],[1.2697049,51.8261335],[1.2697049,51.6967453],[1.116651,51.6967453],[1.116651,51.440346],[1.5235504,51.440346],[1.5235504,51.3331831],[1.4507565,51.3331831],[1.4507565,51.0207553],[1.0699883,51.0207553],[1.0699883,50.9008416],[0.7788126,50.9008416],[0.7788126,50.729843],[-0.7255952,50.729843],[-0.7255952,50.7038437],[-1.0074383,50.7038437],[-1.0074383,50.5736307],[-2.3625252,50.5736307],[-2.3625252,50.4846421],[-2.4987805,50.4846421],[-2.4987805,50.5736307],[-3.4096378,50.5736307],[-3.4096378,50.2057837],[-3.6922446,50.2057837],[-3.6922446,50.1347737],[-5.005468,50.1347737],[-5.005468,49.9474456],[-5.2839506,49.9474456],[-5.2839506,50.0229734],[-5.8292886,50.0229734]],[[-6.4580707,49.8673563],[-6.4580707,49.9499935],[-6.3978807,49.9499935],[-6.3978807,50.0053797],[-6.1799606,50.0053797],[-6.1799606,49.9168614],[-6.2540201,49.9168614],[-6.2540201,49.8673563],[-6.4580707,49.8673563]],[[-5.8343165,49.932156],[-5.8343165,49.9754641],[-5.7683254,49.9754641],[-5.7683254,49.932156],[-5.8343165,49.932156]],[[-1.9483797,60.6885737],[-1.9483797,60.3058841],[-1.7543149,60.3058841],[-1.7543149,60.1284428],[-1.5754914,60.1284428],[-1.5754914,59.797917],[-1.0316959,59.797917],[-1.0316959,60.0354518],[-0.6626918,60.0354518],[-0.6626918,60.9103862],[-1.1034395,60.9103862],[-1.1034395,60.8040022],[-1.3506319,60.8040022],[-1.3506319,60.6885737],[-1.9483797,60.6885737]],[[-2.203381,60.1968568],[-2.203381,60.0929443],[-1.9864011,60.0929443],[-1.9864011,60.1968568],[-2.203381,60.1968568]],[[-1.7543149,59.5698289],[-1.7543149,59.4639383],[-1.5373349,59.4639383],[-1.5373349,59.5698289],[-1.7543149,59.5698289]],[[-4.5585981,59.1370518],[-4.5585981,58.9569099],[-4.2867004,58.9569099],[-4.2867004,59.1370518],[-4.5585981,59.1370518]],[[-6.2787732,59.2025744],[-6.2787732,59.0227769],[-5.6650612,59.0227769],[-5.6650612,59.2025744],[-6.2787732,59.2025744]],[[-8.7163482,57.9440556],[-8.7163482,57.7305936],[-8.3592926,57.7305936],[-8.3592926,57.9440556],[-8.7163482,57.9440556]],[[-7.6077005,50.4021026],[-7.6077005,50.2688657],[-7.3907205,50.2688657],[-7.3907205,50.4021026],[-7.6077005,50.4021026]],[[-7.7304303,58.3579902],[-7.7304303,58.248313],[-7.5134503,58.248313],[-7.5134503,58.3579902],[-7.7304303,58.3579902]]]},{"id":"OS-Scottish_Popular-historic","name":"OS Scottish Popular historic","type":"tms","template":"http://ooc.openstreetmap.org/npescotland/tiles/{zoom}/{x}/{y}.jpg","scaleExtent":[6,15],"polygon":[[[-7.8,54.5],[-7.8,61.1],[-1.1,61.1],[-1.1,54.5],[-7.8,54.5]]]},{"id":"Pangasinan_Bulacan_HiRes","name":"Pangasinán/Bulacan (Philippines HiRes)","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png","scaleExtent":[12,19],"polygon":[[[120.336593,15.985768],[120.445995,15.984],[120.446134,15.974459],[120.476464,15.974592],[120.594247,15.946832],[120.598064,16.090795],[120.596537,16.197999],[120.368537,16.218527],[120.347576,16.042308],[120.336593,15.985768]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{"id":"Actueel_ortho25_WMTS","name":"PDOK Luchtfoto Beeldmateriaal 25cm","type":"tms","template":"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=2016_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}","scaleExtent":[0,18],"polygon":[[[3.1437689,51.3598403],[3.1575018,51.2411346],[3.3387762,51.1154412],[3.9128119,51.0585083],[4.6571356,51.2806657],[4.8933416,51.2634825],[5.1789862,51.1257851],[5.3849798,51.1309561],[5.5442816,51.056782],[5.4206854,50.8595581],[5.4673773,50.7032633],[5.6568914,50.6192567],[6.1485296,50.6214349],[6.3023382,50.8578243],[6.2995916,50.9543819],[6.2638861,51.0183545],[6.3723761,51.0925902],[6.4012152,51.2011393],[6.3737494,51.2510206],[6.4451605,51.3158713],[6.4204413,51.5496009],[6.343537,51.6792182],[6.796723,51.7642909],[7.046662,51.9102418],[7.0713812,52.0455856],[7.2718817,52.1704147],[7.3075872,52.3855111],[7.2059637,52.5319494],[7.282868,52.614576],[7.2993475,52.7785318],[7.4421698,52.9782705],[7.43393,53.2831352],[7.0439154,53.5515877],[6.7829901,53.6363531],[6.2391668,53.5401639],[5.6871039,53.5124077],[5.173493,53.4388477],[4.8164373,53.2338445],[4.6516424,53.0658312],[4.5417791,52.4859784],[4.3220526,52.1956753],[4.08104,52.0136897],[4.0219885,52.0162253],[3.9368445,51.9637937],[3.9519507,51.8807927],[3.844834,51.8494157],[3.6237341,51.7075226],[3.6553198,51.6606936],[3.6333471,51.6274583],[3.5468298,51.622343],[3.3957678,51.5609145],[3.3820349,51.5173524],[3.4987646,51.4326715],[3.3298498,51.3855587],[3.1437689,51.3598403]]],"terms_url":"http://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":"Landsdekkende dataset 25cm resolutie kleuren luchtfotos van de meest recente jaargang.","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABpCAMAAAD/V6aFAAABQVBMVEVHcEzFxcUIjtE3quLGxsYMlNMxseXFxcXFxcXGxsY3qeC82+c4qeA4quEcod3FxcXGxsbGxsbKysrHx8cGkdLGxsYPl9fExMTGxsbGxsbGxsYGjtDGxsYLlNXFxcXKysrGxsY3qeDFxcXGxsbFxcXGxsY3qeHGxsbIyMjGxsbGxsbFxcXFxcXFxcXGxsYBi883quHExMTGxsbGxsYgpdkYntoeqtXGxsYko93FxcXFxcUio97GxsYDjdAcn9rGxsbGxsbGxsYQmdjGxsYCjdAAis0IktM1qODGxsbHx8fGxsY3quHFxcUco93GxsbGxsbFxcUmotw3q+E4quE3quE3quACjtEKl9XGxsbFxcUZoNkBi883qeHGxsYAis44quEAic0AiM08rOIcnNk6q+IspN4Mk9QFj9EXmdclodzGxsbX17u1AAAAXnRSTlMA7d4ItK8KTHw//QHerC31nSgFHsszjQ5Bw23d6qMYFFmUZtVH78rkCTn4uIZUdvqAFKxPDUAEozao2iLQ5V39lLF/y+z+wd1he76y+hGNgC1uQO7BUNR6mYRR96TdoavfmwAABLhJREFUeF7s08Fqg0AQBuApCC0IBBtCYpBVbMQmNoF4CfGykV5aKKbXAn2B//0foOLspQF0xhQokO80/2l2WH66xnNx18vz6S+c0K+ha8TukQn62RWNFxzfeY2J0K96pLH2zSSf81hjwIHGevsG7nncYkhC45gDgNKdlWOA/Uo7MemsnwBkAYcGQtmcVJINWi8cZhZCR1JZWrSiKacSUkvSeEBnx2llIWQ/Vbegk8UcQ0i9asqTgJ05biF2Jrn1BJ2J0R6DKmzJGmSq371eWOgsSKK8+M4COrmoOimckHPwAR2PBPbRRQUaKKU0zK/hRHy72UDHTmmYqT1nx2tnhadz8ulfuLn5YazseRMEwjhuJDCIOhkXw8DiagchJkQGInZoHKxWk7Y5nkO09ft/gTb3Sjg4nt/4T7jf5XnhIlcR8SRzbUxaeO/XBFQCGxasd7QToLeyMBglvZZ4AUSw9VjyCcTCvTI1Z0TNciIAlydziwZ+ihZe+jUZVUekPNlbNPS3LEwQrXHVoblozdZas7KqmmU7rXstjm7N7sCSaW7TPO//yM4vOYiaJV9EADOfJUcgVoDK/ix9/NaQ5gQEQOzQh+hPOECTgdJkLPBnfRoQqzPa4DUBJZLImAD76ow9vEZP7yrhzVr11kxM2gTr0HfXgxa1t12jVucDr5mqu8MlZkkKLZbHrYao2eg7DEOkSh8Ke55c2zTPskZRI0VOgNYEMulqukl1SlAWb6s1884/GjyKDt4GKDY5UVxZEl9MjXhjTKojTjOnIKGpfNPAQNTMBLegzn4xVPBPDrNhk8XwddzOGbeg/trT+DxyPAOni/ivXfNbbRSIwvgpLCQiYIyIRmAT1hS1RCEJICmCgjdtKKmXe+ML+P4PsCmzG6Y96zczFO/yu3WGzxnPmTl/JCV37gTFXKb4m6e9zk2JQPWBp5cirfMHY1YoJOi+5MqOkHFrY5kXoLL8WsV4c4XMk6lK7QKZiI326QPPMZWJwafx+UtnojL8aCqzAFZWDYyjeJIYbdgVUIkuB04hvllsoJL4bueO79kclOFbA5mSEHkN5hwMZI4ECP9vs2fx9F1fxfGQX47YUiyc+UVfprWBSjIw5OLTVl/mAlT6QYYfA12NDDhZSLhIZRThAOuHAfBKOviJss5rx98ubGfwTQ+gZ2PSFdriY7EShrMDiyn12hmQx71wK3i1qLCjQUWmKqc6P9UyVmhhwrUYmI0NDH0C3LnjzTTZCicPjnhYh+NLNZbofyiim4IYZi2fnU733hm5ACrT0A5fbSti6AQryWm++9HXUhCRPquXzDnABWwCupJ20VlcBsq4Y0YM5aRyTzfC07+uUlcrD3KOpR01hGexI/ZI1/Nhk+cWjbBsoYqMbYm77TjWSkcpU24cnKYJCDMNl7NKaZR3YO8oA+T0Hu6EcnbqLi3D8YmDTyg2Qz3raUYQ7/NynLZtFzYpKT7vW50TgAdSDWkye5Z9bEMq1rKxvfmkS9DcwsEqIzUROC4BNrmXjxOyjn8FpEHagn9PMEEXht2S9NiyvGwaSmYAEyD9N3Zumma6BdkbyXH2NB2nm8xvmpB9L1WOJiRzWHI+CRHLbafh0l+p1Hb2B2WwRgDiX0fTAAAAAElFTkSuQmCC"},{"id":"PNOA-Spain-TMS","name":"PNOA Spain","type":"tms","template":"http://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}","polygon":[[[-17.8846298,28.4460601],[-17.8939535,28.5225529],[-18.0212548,28.7481927],[-18.0224091,28.8038375],[-17.9424017,28.8726124],[-17.8911792,28.8737099],[-17.8903302,28.8515102],[-17.7675902,28.8537764],[-17.7669837,28.8312183],[-17.7412714,28.8319975],[-17.7394926,28.7642235],[-17.7139824,28.7649677],[-17.7129312,28.7303731],[-17.7574427,28.6931782],[-17.7570788,28.6741254],[-17.7457913,28.6743524],[-17.7457266,28.6165627],[-17.7519687,28.5833675],[-17.7622536,28.5591958],[-17.7833086,28.541667],[-17.7831575,28.4936643],[-17.808611,28.4925024],[-17.8060072,28.4468974],[-17.8846298,28.4460601]],[[-18.1661033,27.7851643],[-18.163494,27.6949247],[-18.0889827,27.6963366],[-18.0873398,27.6738724],[-18.0364092,27.6753701],[-18.0350079,27.6302571],[-17.9589987,27.6323976],[-17.8603269,27.7926025],[-17.8630328,27.8368793],[-17.8884015,27.8364947],[-17.8891263,27.8590536],[-17.9906491,27.8567467],[-18.0386803,27.7655831],[-18.1146412,27.7637873],[-18.1154627,27.7863613],[-18.1661033,27.7851643]],[[-17.36038,28.0639801],[-17.3629657,28.1757247],[-17.3375583,28.1763688],[-17.3384577,28.2213012],[-17.1857883,28.2238767],[-17.0820788,28.1351849],[-17.0808422,28.0679977],[-17.1315446,28.0668073],[-17.1563337,28.0214628],[-17.2321063,28.0203711],[-17.2319938,27.9980388],[-17.2576823,27.9978403],[-17.257851,28.0199741],[-17.3086658,28.0192298],[-17.36038,28.0639801]],[[-16.9278171,28.3275779],[-16.9286591,28.3721879],[-16.8776666,28.3729288],[-16.8780707,28.3954191],[-16.5214259,28.4226146],[-16.4457117,28.491135],[-16.4462506,28.535972],[-16.4205859,28.5362679],[-16.4209227,28.5588419],[-16.3443329,28.5597589],[-16.3446023,28.5822095],[-16.1912541,28.5837179],[-16.1916246,28.6068435],[-16.1279344,28.6078193],[-16.1277997,28.5921762],[-16.0995079,28.5925015],[-16.0993395,28.5163822],[-16.1648148,28.5161158],[-16.1647474,28.4938583],[-16.2385755,28.4484704],[-16.2653516,28.4476116],[-16.2658569,28.4030038],[-16.3167484,28.4017594],[-16.3163105,28.380189],[-16.3420763,28.3795075],[-16.3408301,28.2892963],[-16.415837,28.1976134],[-16.415096,28.1311312],[-16.5153297,28.0164796],[-16.6168433,28.01532],[-16.6168096,27.9930469],[-16.7184243,27.9919168],[-16.7190979,28.0371426],[-16.7446952,28.0367859],[-16.7453351,28.0818146],[-16.7706967,28.0816065],[-16.8223966,28.1259036],[-16.8231712,28.1708652],[-16.8487012,28.1707464],[-16.8502842,28.260791],[-16.8756457,28.2605537],[-16.8760836,28.2832162],[-16.9015125,28.2827713],[-16.9023882,28.3279337],[-16.9278171,28.3275779]],[[-15.8537427,27.9008901],[-15.8542032,27.9901812],[-15.828953,27.9906555],[-15.8291065,28.035578],[-15.7782992,28.0363232],[-15.7532793,28.0814298],[-15.7278756,28.0815652],[-15.7282593,28.1718567],[-15.4989741,28.1728039],[-15.4987438,28.1504075],[-15.4497785,28.1507459],[-15.4501622,28.1961425],[-15.3972827,28.1961425],[-15.3964385,28.0383554],[-15.3710348,28.0380167],[-15.3706511,28.0153212],[-15.3457847,28.0153212],[-15.3454777,27.9254406],[-15.3708046,27.9252372],[-15.3705743,27.8352137],[-15.395978,27.8347387],[-15.4209979,27.7879673],[-15.4718052,27.7893932],[-15.471882,27.7666454],[-15.522766,27.7667813],[-15.5477092,27.7216112],[-15.6236132,27.7213395],[-15.6241504,27.741991],[-15.7007451,27.7433495],[-15.801669,27.8110501],[-15.8537427,27.9008901]],[[-14.5215621,28.0467778],[-14.5224358,28.1184131],[-14.4157526,28.1156076],[-14.2168794,28.2278805],[-14.2153651,28.33903],[-14.1641672,28.4528287],[-14.1115132,28.4747955],[-14.0335806,28.7226671],[-13.9565217,28.7449351],[-13.9561722,28.7665857],[-13.8290221,28.7664325],[-13.8289639,28.7879765],[-13.8000741,28.7879255],[-13.8012972,28.7189894],[-13.827566,28.719347],[-13.8278572,28.6517968],[-13.8025786,28.651899],[-13.8033941,28.5384172],[-13.8288474,28.5384684],[-13.8315061,28.3970177],[-13.9158189,28.2241438],[-13.9856445,28.2235696],[-14.0369588,28.1795787],[-14.1387139,28.1799894],[-14.1386556,28.1579103],[-14.2153651,28.1578076],[-14.2147244,28.1118888],[-14.2913173,28.0452356],[-14.3319673,28.0368713],[-14.4457846,28.0469834],[-14.4466583,28.0657961],[-14.4962835,28.0682631],[-14.495934,28.0458525],[-14.5215621,28.0467778]],[[-13.800662,28.8456579],[-13.8009273,28.8231121],[-13.775688,28.8230539],[-13.69729,28.8898184],[-13.69729,28.9127744],[-13.6072498,28.9117991],[-13.4388551,29.0002417],[-13.4374559,29.1351289],[-13.4117005,29.1349931],[-13.4105556,29.2229789],[-13.4592801,29.255586],[-13.4597392,29.2942023],[-13.5091254,29.2945638],[-13.5100581,29.3163453],[-13.5635382,29.3172941],[-13.5640564,29.2713764],[-13.5389228,29.2711956],[-13.5389747,29.2500375],[-13.5661293,29.2501279],[-13.5665956,29.2030039],[-13.5156549,29.2022349],[-13.5156549,29.1820579],[-13.5398038,29.1827819],[-13.5408921,29.137528],[-13.65782,29.1368528],[-13.713222,29.0935079],[-13.7663353,29.0934533],[-13.8502463,29.0165937],[-13.8518224,28.983425],[-13.8524443,28.914861],[-13.9013122,28.89245],[-13.9024005,28.8469779],[-13.800662,28.8456579]],[[1.6479916,38.9990693],[1.7321668,38.9993635],[1.7314703,39.0441733],[1.6489512,39.0431944],[1.6481552,39.1276358],[1.3948608,39.1265691],[1.3954412,39.0864199],[1.2281145,39.0852615],[1.2291095,39.0028958],[1.1448657,39.0018003],[1.1452803,38.8319988],[1.3113632,38.8331615],[1.3121924,38.7906483],[1.3946949,38.7916178],[1.3951924,38.7529597],[1.3112803,38.7519251],[1.3125919,38.6238804],[1.6489036,38.6251112],[1.6480745,38.7111504],[1.58456,38.7101152],[1.5811604,38.7005387],[1.5491544,38.7002798],[1.5197188,38.7092094],[1.50355,38.7253185],[1.4813282,38.9155064],[1.5518906,38.9254411],[1.5667328,38.9566554],[1.6487378,38.9583318],[1.6479916,38.9990693]],[[2.5450749,39.4166673],[2.43933,39.4161122],[2.438714,39.4846853],[2.439022,39.4993424],[2.3122308,39.4993424],[2.3119228,39.5417911],[2.2290722,39.5409994],[2.2283536,39.6260571],[2.3460076,39.6270851],[2.9270445,39.9601558],[3.1456647,39.9600498],[3.1460753,40.0019797],[3.2313899,40.0019797],[3.2312872,39.8329231],[3.1482313,39.8331596],[3.1484366,39.7935717],[3.4814817,39.7931773],[3.4803472,39.5959027],[3.3150618,39.4784606],[3.3146179,39.3785504],[3.0830178,39.2499355],[2.9798608,39.2501482],[2.9790395,39.3334971],[2.7287424,39.3334177],[2.7288451,39.4581361],[2.6456865,39.4577397],[2.6453785,39.4996593],[2.5452802,39.4994216],[2.5450749,39.4166673]],[[3.8120402,40.0434431],[3.729082,40.0437979],[3.7286185,39.9584155],[3.8126633,39.9576011],[3.8122771,39.9164393],[3.9608975,39.9159813],[4.1938142,39.791308],[4.3150279,39.7905799],[4.3159934,39.8329294],[4.3987393,39.8320396],[4.3973664,39.9185834],[4.3158003,39.9193274],[4.3161865,40.0433985],[4.2318959,40.0443594],[4.2324752,40.0847793],[4.1491501,40.086109],[4.1490623,40.1255157],[4.0627981,40.1272166],[4.0624217,40.0849941],[3.8128687,40.085294],[3.8120402,40.0434431]],[[-8.8910646,41.8228891],[-9.1092038,42.5751065],[-9.0365469,42.730656],[-9.0883419,42.7269569],[-9.1466113,42.7750272],[-9.2185488,42.9016271],[-9.2760988,42.8605106],[-9.3099094,42.9311297],[-9.2789763,42.9821991],[-9.3099094,43.0600377],[-9.2523594,43.1041725],[-9.2314975,43.1703151],[-9.1473307,43.210176],[-9.06748,43.1991644],[-9.0336694,43.2426748],[-8.99842,43.2447709],[-8.9998588,43.2955793],[-8.9372732,43.3055265],[-8.92936,43.326986],[-8.8638969,43.3290792],[-8.8761263,43.3740655],[-8.8221732,43.3735426],[-8.785485,43.3191358],[-8.7063538,43.305003],[-8.6099575,43.3296025],[-8.5509688,43.3233227],[-8.5243519,43.3364048],[-8.5250713,43.3646525],[-8.45745,43.3918416],[-8.3610538,43.4111803],[-8.3603344,43.4634161],[-8.3344369,43.5797394],[-8.2776063,43.5708796],[-8.0646713,43.7239184],[-7.9992081,43.7233986],[-7.9171994,43.7826357],[-7.8560525,43.7914643],[-7.83591,43.7374337],[-7.6628443,43.809819],[-7.3188932,43.6782695],[-7.1997467,43.5830817],[-6.2488228,43.6075032],[-6.1229322,43.5790105],[-5.8520425,43.6798953],[-5.6036334,43.5708672],[-5.2855347,43.5619084],[-5.1787525,43.4991591],[-4.9089869,43.4836655],[-4.6156167,43.4192021],[-4.1839917,43.4249168],[-3.8029478,43.5195394],[-3.7400025,43.4869277],[-3.5612827,43.5423572],[-3.1083013,43.3816347],[-2.9385737,43.4624573],[-2.7452417,43.4755094],[-2.3046245,43.3170625],[-1.9854018,43.3563045],[-1.8552841,43.3972545],[-1.769802,43.3964383],[-1.7700492,43.3760501],[-1.7100474,43.3756908],[-1.7113451,43.3312527],[-1.7225915,43.3131806],[-1.6890375,43.3129108],[-1.6881106,43.3341294],[-1.6446695,43.3337248],[-1.6449785,43.3133155],[-1.6029903,43.3129528],[-1.6034352,43.2926624],[-1.5635905,43.2921227],[-1.5630468,43.3133844],[-1.4779905,43.3128355],[-1.3667723,43.2761368],[-1.3568809,43.2381533],[-1.3703692,43.1712972],[-1.4423067,43.0833554],[-1.4198262,43.0603647],[-1.3730668,43.051166],[-1.3640746,43.1115893],[-1.3020285,43.135217],[-1.2354864,43.1332484],[-1.2795481,43.0774443],[-1.1923239,43.0649635],[-1.0061856,43.0077821],[-0.942341,42.9748951],[-0.7562028,42.9821318],[-0.7148387,42.9610774],[-0.6968543,42.9031405],[-0.5511809,42.8220693],[-0.5044215,42.8484456],[-0.4288871,42.8200906],[-0.3164848,42.8655842],[-0.1456332,42.810856],[-0.0314324,42.7124874],[0.1861785,42.7540985],[0.3021777,42.7177729],[0.3642238,42.7428729],[0.4487504,42.7144695],[0.6276949,42.7223973],[0.6411832,42.8576747],[0.7149192,42.882718],[0.9675996,42.8181119],[1.108777,42.7989808],[1.1753192,42.7342872],[1.3632559,42.7415521],[1.4113736,42.7093914],[1.4806054,42.7103407],[1.4813006,42.5010664],[1.6443591,42.5020345],[1.6432777,42.5424539],[1.730407,42.5434214],[1.7316429,42.5011803],[2.0638621,42.5016359],[2.0645572,42.4590247],[2.3969309,42.4599364],[2.3976786,42.4178363],[2.4804823,42.4179732],[2.4809767,42.3759441],[2.6447922,42.3762636],[2.6444832,42.4592447],[2.8113266,42.4596094],[2.8112648,42.5010358],[3.063878,42.5008535],[3.063878,42.4591535],[3.2307832,42.4593359],[3.2304935,42.3764363],[3.3141469,42.3760369],[3.3141243,42.3339864],[3.397855,42.3340435],[3.3973912,42.290094],[3.3138923,42.2908368],[3.3139695,42.2070151],[3.1475896,42.2073012],[3.1475896,42.1260612],[3.2305478,42.1260039],[3.2466753,41.9529359],[3.1945206,41.8558943],[3.060537,41.7647419],[2.7835777,41.6371796],[2.26293,41.4271601],[2.1649151,41.2989297],[1.86008,41.2232228],[1.3763003,41.116273],[1.1793714,41.0464585],[1.0858526,41.048493],[0.758537,40.8195599],[0.9114042,40.733761],[0.8781331,40.6751363],[0.6650182,40.5358666],[0.5580112,40.5502166],[0.433919,40.3757589],[0.2675635,40.1919192],[0.1641534,40.0647234],[0.0751307,40.0144671],[0.010387,39.8952188],[-0.0939224,39.8116904],[-0.1847435,39.6311716],[-0.2908513,39.5036254],[-0.2863552,39.333431],[-0.1856427,39.1774612],[-0.2135185,39.1558487],[-0.1110076,38.9722246],[0.0094878,38.8826835],[0.1218901,38.872183],[0.2342925,38.798636],[0.2558737,38.7264162],[0.0958128,38.6133825],[-0.0022021,38.6070586],[-0.0570544,38.5269073],[-0.2719677,38.4762395],[-0.379874,38.3931234],[-0.3834708,38.3381297],[-0.4509122,38.3310763],[-0.5048654,38.2830943],[-0.4823849,38.1948095],[-0.429331,38.1658287],[-0.4545091,38.148859],[-0.5839966,38.1721913],[-0.6136708,38.1198599],[-0.6370505,37.9612228],[-0.6811123,37.9456238],[-0.7323677,37.8810656],[-0.7215771,37.7830562],[-0.688306,37.7340026],[-0.6641461,37.6231485],[-0.7193941,37.5878413],[-0.9196258,37.5375806],[-1.1107098,37.5164093],[-1.3383246,37.5286671],[-1.4408917,37.3903714],[-1.6766966,37.2765189],[-1.8540816,36.9122889],[-2.0683486,36.6929117],[-2.2158766,36.6619233],[-2.3721861,36.7801753],[-2.6812926,36.6591056],[-2.9201476,36.6675585],[-3.09402,36.712625],[-3.4610839,36.6548788],[-3.7280395,36.6929117],[-4.3743529,36.6633322],[-4.6571151,36.4404171],[-4.9188018,36.4531321],[-5.1699508,36.3513541],[-5.2841094,36.1970201],[-5.2680911,36.1241812],[-5.3524784,36.1224654],[-5.3516094,36.0401413],[-5.4365759,36.0388921],[-5.4353207,36.0034384],[-5.6888562,36.0036518],[-5.6899635,36.0405317],[-5.85506,36.0385595],[-5.8566821,36.1242077],[-5.9384817,36.1221487],[-5.9400265,36.1655625],[-5.9983445,36.1645024],[-6.0357297,36.1780957],[-6.0775178,36.2224132],[-6.1506113,36.2864561],[-6.231541,36.3770075],[-6.3358504,36.5310643],[-6.3214629,36.5816265],[-6.404191,36.6234958],[-6.4743301,36.7489673],[-6.4158808,36.7993866],[-6.490516,36.9173818],[-6.6298949,37.0194012],[-6.8744824,37.1083766],[-7.0426363,37.1850699],[-7.2647434,37.1843535],[-7.3753473,37.1535419],[-7.408316,37.1682196],[-7.4202886,37.2118318],[-7.4249231,37.2350505],[-7.4380543,37.2451969],[-7.4459717,37.3326142],[-7.4480958,37.3909382],[-7.4696271,37.4075829],[-7.4647029,37.4530494],[-7.5019723,37.516411],[-7.5191587,37.5229203],[-7.5219588,37.5723727],[-7.4501271,37.6695835],[-7.4249019,37.7599222],[-7.316662,37.839974],[-7.268329,37.988952],[-7.1536786,38.0155235],[-7.1177098,38.0553626],[-7.0142997,38.0243785],[-6.9963153,38.1075633],[-6.9614706,38.201254],[-7.080617,38.1570753],[-7.3402665,38.4402363],[-7.2638329,38.7380741],[-7.0435243,38.8729667],[-7.0615086,38.907962],[-6.9693387,39.0198308],[-7.0008114,39.0887867],[-7.1536786,39.0957658],[-7.1525545,39.1602899],[-7.2447245,39.1968854],[-7.2559647,39.2813308],[-7.3368944,39.3535074],[-7.3279022,39.4559917],[-7.5144901,39.5886496],[-7.5527069,39.6795427],[-7.0502684,39.6752171],[-6.9951913,39.8195433],[-6.9221297,39.8790868],[-6.886161,40.0229854],[-7.0412762,40.1347927],[-7.0176717,40.266146],[-6.8086034,40.3450071],[-6.8681766,40.4451649],[-6.8535643,40.6066433],[-6.837828,40.8757589],[-6.9536024,41.0370445],[-6.8018592,41.0395879],[-6.7681385,41.138706],[-6.6411239,41.2655616],[-6.5624422,41.2630269],[-6.217367,41.5791017],[-6.3162811,41.644652],[-6.5152332,41.6412921],[-6.5871707,41.6883151],[-6.5478299,41.8559743],[-6.6298836,41.9112057],[-7.1334461,41.9404756],[-7.1682909,41.8718791],[-7.4256922,41.7847727],[-7.9539833,41.8459271],[-8.130455,41.7805819],[-8.2518495,41.9078597],[-8.1293309,42.0348842],[-8.2484774,42.1008034],[-8.3676239,42.0557521],[-8.6070409,42.0340493],[-8.8910646,41.8228891]]],"terms_text":"PNOA","best":true},{"id":"Geodatastyrelsen_Denmark","name":"SDFE aerial imagery","type":"tms","template":"http://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg","scaleExtent":[0,21],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://download.kortforsyningen.dk/content/vilkaar-og-betingelser","terms_text":"Geodatastyrelsen og Danske Kommuner","best":true,"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAABGlBMVEX///+y4OQAAAAKCgrL6ezI6exHs8AdorE/sL0FBQX+/v78/v4RERH5/PzS7fC64+chpLLt+Pm95Og+Pj4mprQYGBgAkaLM6u3D5+oAlabc8fMVn671+/wAjp/Y7/EmJiY4ODg4rbsgICBgYGBLtcHk5OT29vYyMjJqamoNnKtISEhYu8aamppMTEzy+vpycnLg8/S/5emjo6NSUlJfvsgsLCzs7Oxsw81NtsKsrKyu3uPo9vd+ytODzdXk9PaEhISBgYFVVVWe193P7O95yNGPj4/x8fGk2uB7e3vd3d3Hx8cuqbfW1tZnwctRuMOxsbG7u7vQ0NB2dnYAl6dzxs+14eWW1NtRUVGZ1dxwxc6r3eKx3+ON0NiR0tk4C4avAAAG00lEQVR4XtzY5Y4qSxQF4JVqV9zdXcfd3Y/Lve//GrcDdTPQyjDnNMl8PyBAUnuxa1c3Ae8S3l9fP/+KFVG24rm4IZfraFiBRCqX+jyRiscD8F1yUp5K5Xbhs36K1qcJ4ofwVzVuChCFr4a0/swmJOCn/dxnk/g6/FSKmwOkovBTMGUJ0FLgI8EmgAYfRa0BMvBTxzIDcRF+2s1ZjuE3+KplDvBZw58la5rbklfzLUjlDuAim8Ub7ekJlmXP8n04qc7fjEpwFF4v3d2Vtk/fEKJ/xrETHKfDiThJQOvfwUmilBGCBiETXHhKQkmWTUwZETQ4OMjFUxPx3BacfGsFo1Qw87hw/cQrllPgQD5v5eLxXOvBubmnreiMxRIoHK1PcTpcpNMynOUz0TmZf+AtzSXmsFwfy3oUonOCQe+1ZLr/r7g8lpTORE0yP+Clz5kDsAkZy/lhCSDw8HLIJUxYTsNyHoSoSfDOc62hJcDyQ9ARombB0FsCUFz2jwUIRvvwELLpgILlbNlsgedaWesQ6ljSlXUIH+FJtxzDIZYUEoLmY3gFTyFTC1hWwbIeMuYRgDc5z81PwB6Wppla0PqKRZxx7Ez9NN5Bb80maJ1jMTrHsrT93CHe5UwQopSQOcCiQmfclN7HO2XXhYwgBIVMRkzgDbKHw/xwT8MfsHe6zvOdgzw+posCVmsgYbU+MVitJsFqvXSxMkexQrkJ3BpPG1iFcXutdwHct9e+V7AyzxWs1oBgta4ZrNRLhBljhS7IRoREsDI3ZADckmv4bKfSUNWNyhhjBoZKEbefIjG13Lu4hA+eGMJE1tYiDJEaMRia5RiRCmvf2zFCfDiUR6TwTAewwkhHwIvKFHcwUTshDSxNUWR4e5mduVqEFNtSbAcU0CUDLEDLmmuFdC45SnJpBR6+q3XMOJbU4tzGn0h1eEiedx63O1u7M7X6XCA8EQjn4S7WxCy5wpg79ARXXEfk+WqV58Xqb1B7RvnRVDiQhLNuQ2We3K+E9bJaHtzA0Y8SX92eqor7tP0BWt49gVyLkUJFevb4RdRo9Ai5gIOrEi0/k0Ax6s8K6LBVV9VbbBKPAFpsALlHdmBrSOtT1dJvAHpgNO+rAjvH5B64JEeuAeQa6QJolGFrnd+eU+UB0Aa8CuRhZ6MNQ6Po3oExuZk83sNGurRtIo6wFxiZhEf2O3A97UPNNUCkAEONjGHjVDQH4A8wtAYIKLC6ZI5hqElNtwD30/nblGwDfOHNAaod5MPWAFlY1WMDGFAhdZcAJ6oGw4391aBjDVBdOADaZUxbUHEO8EIP4LW06TmDNIDtFsDODj2BTVJzDFCIYULtwc6+NcA6+tYASdgqTFugqUWnAGM6e8fkFnaurEP4LxC2HMM0bD2RI1qmax+gzkyjbZIebGXpdehVSQfSAfMOyLAXoc0vMpu2AXpk+n6Dfm51zpsa8AjDKDxffwgHdWmDfsOIXYAx7dAx6cJBVjRdinUYtPmbkQ5Hz/QnV5dcWANsMg16EtpwlKA3Q1r/F801+j9COBzIw0WTfrk2ubcEKDKXMFyqMbhI8CJNUOXFX6DkfDgQNgQCyRBcRabzXY+VzQEG9A7YkG7gpr8virxBFB+GeKUd6mwike7DQ72sTta/ldrzf9HskCYMWKM5XIR2z3/+/HI1xFLqtemEX9boazrwm9NnhX78gR2XN1wVIgr+qqONoqtGW8bHdh0ruCoXZfxV3d6Jq7WKjI+tSRhXUlnBX7XTHLi7/q89u1txFIbiAH6EzZV0xd6shNJHKM1VIFoBd6BXuYshn+//GluWma5qN1od4sD09wDJnyTnHEF45OXl5eXp/nw6IkIQPsAn2BX+8nZxWf7E9oUx7MYwlMJaieZUa005b+Yuhg2zyV+WsRzWqbgW76iYt9jR2OSOmXUJ3qj4h9ITTMuNTTos28FynosuWsG0liU9rIDFzlz08T1MqY1NeixbXguSij5dwRTEkgGDYaGd0GKAlzAhux/A+jsouRjiCMLSdhxgDwsdHwQgXz0APAhAYl4BEDYK8DPqI8SjMlzRC9WCMkztIADLPrMRkTmjyA4PYLlmQSuGopvAmt+BsY1Y0zAUSlj1h9EBZib4GMeh/U/GeXnj3TUQ4XIfx5rrA8yDrWH2hpmkhv85OqneSRcolPbjg4Q2MFuKSXtTnCGwv+pwvwLFiNSlqnyWw1PS8K/c3EvV5UqIy0jVI68QVe7VgK8hJjQOkEFMTCq16R1cxwGa9FsFMFtfAfGjAC3EVI6rAMOmr1A2EFfpVI/DEBnqDyMC0f3ojuMCNlArJ6VSUjqJYRs1MUpd92dY4Q9//EnbIq9ZogAAAABJRU5ErkJggg=="},{"id":"Slovakia-Historic-Maps","name":"Slovakia Historic Maps","type":"tms","template":"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png","scaleExtent":[0,12],"polygon":[[[16.8196949,47.4927236],[16.8196949,49.5030322],[22.8388318,49.5030322],[22.8388318,47.4927236],[16.8196949,47.4927236]]]},{"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","startDate":"2017-03-01T00:00:00.000Z","polygon":[[[18.79273330201,47.37078533804],[18.791936169,47.37048036201],[18.79139114593,47.37063268281],[18.7901097,47.3717614],[18.7891647,47.3734529],[18.78721506824,47.37566027041],[18.7860339,47.37764910001],[18.7849824,47.3790513],[18.783695,47.3803226],[18.782665,47.3819499],[18.781399,47.3836789],[18.7793426,47.3871257],[18.776657,47.3893959],[18.764716,47.396699],[18.7616966,47.3996569],[18.7563102,47.4032821],[18.7583737,47.4065272],[18.75879657883,47.40776342073],[18.76199554897,47.41217224817],[18.7630394973,47.41315137445],[18.7659298,47.4147108],[18.7704058,47.4176575],[18.77247285488,47.41808545272],[18.7724806,47.4202978],[18.8086021,47.4404108],[18.8174212,47.435389],[18.8209188,47.4357228],[18.8280427,47.4375516],[18.8302099,47.4352584],[18.8358533,47.4375371],[18.8404882,47.4334586],[18.847655,47.4357228],[18.8510024,47.4328054],[18.8689996,47.4396086],[18.87361350924,47.43597176329],[18.87499181607,47.43342149293],[18.87386045593,47.43248349864],[18.8760377,47.4279677],[18.8605023,47.4230028],[18.8662101,47.4179794],[18.8724328,47.4108645],[18.8662959,47.4077278],[18.8696433,47.4047072],[18.86776892261,47.40207457802],[18.86509430105,47.40052438512],[18.87081279074,47.3983820654],[18.86772375423,47.39699336542],[18.86992005424,47.39655168559],[18.87648610191,47.39477958954],[18.87748924808,47.39494663392],[18.87866942005,47.39462343887],[18.88358322696,47.3899604942],[18.88290731029,47.3896699544],[18.88538567142,47.38530440107],[18.87747851924,47.38339390377],[18.88181296901,47.37604910406],[18.87914148883,47.37392756692],[18.88638345317,47.36922645965],[18.88205973224,47.36772957402],[18.87973157482,47.36640704749],[18.8746997507,47.36252284243],[18.87282220439,47.36136733615],[18.87027947025,47.36062605465],[18.86687842922,47.3585329683],[18.86234013156,47.35637438604],[18.85566679554,47.35199153827],[18.84873596744,47.34728120653],[18.83192388134,47.3384118486],[18.82497159557,47.34257772442],[18.81619540767,47.34925116493],[18.8107880743,47.35356882392],[18.80823461132,47.35599644336],[18.80645362453,47.35854023611],[18.80707589702,47.359019909],[18.80634633617,47.36021180457],[18.80465118007,47.36175250772],[18.80381433086,47.36335130305],[18.80054616504,47.36544732015],[18.79988097721,47.36617355102],[18.79416204336,47.36974865444],[18.79273330201,47.37078533804]],[[18.91871480064,47.4093812629],[18.91826418952,47.40997664498],[18.9206674488,47.41155945729],[18.92509845809,47.41372304121],[18.93473295288,47.41916790937],[18.94063381271,47.42241278301],[18.94981769638,47.41937843296],[18.95154503898,47.41749820965],[18.95689872818,47.41922598493],[18.95770339088,47.41877589767],[18.95755318717,47.41435467478],[18.9621129425,47.40506817222],[18.96266011314,47.40117592194],[18.96316436843,47.39903360927],[18.95446328239,47.3967314338],[18.95275739746,47.39526437993],[18.95201710777,47.39362297422],[18.95119098739,47.39356487042],[18.94692091064,47.39798783856],[18.94410995559,47.3984526281],[18.94161013679,47.39868502134],[18.93735078887,47.39633199249],[18.93617061691,47.39682584676],[18.93122462348,47.39999947627],[18.93120316581,47.40023186269],[18.92923978881,47.40204734624],[18.92561344223,47.40604845111],[18.92465857582,47.40635342305],[18.92293123321,47.40925782918],[18.91871480064,47.4093812629]]],"terms_url":"http://fototerkep.hu/","terms_text":"Fototerkep.hu","best":true},{"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","scaleExtent":[1,22],"polygon":[[[17.8396817,-32.7983384],[17.8893509,-32.6972835],[18.00364,-32.6982187],[18.0991679,-32.7485251],[18.2898747,-32.5526645],[18.2930182,-32.0487089],[18.105455,-31.6454966],[17.8529257,-31.3443951],[17.5480046,-30.902171],[17.4044506,-30.6374731],[17.2493704,-30.3991663],[16.9936977,-29.6543552],[16.7987996,-29.19437],[16.5494139,-28.8415949],[16.4498691,-28.691876],[16.4491046,-28.5515766],[16.6002551,-28.4825663],[16.7514057,-28.4486958],[16.7462192,-28.2458973],[16.8855148,-28.04729],[16.9929502,-28.0244005],[17.0529659,-28.0257086],[17.1007562,-28.0338839],[17.2011527,-28.0930546],[17.2026346,-28.2328424],[17.2474611,-28.2338215],[17.2507953,-28.198892],[17.3511919,-28.1975861],[17.3515624,-28.2442655],[17.4015754,-28.2452446],[17.4149122,-28.3489751],[17.4008345,-28.547997],[17.4526999,-28.5489733],[17.4512071,-28.6495106],[17.4983599,-28.6872054],[17.6028204,-28.6830048],[17.6499732,-28.6967928],[17.6525928,-28.7381457],[17.801386,-28.7381457],[17.9994276,-28.7560602],[18.0002748,-28.7956172],[18.1574507,-28.8718055],[18.5063811,-28.8718055],[18.6153564,-28.8295875],[18.9087513,-28.8277516],[19.1046973,-28.9488548],[19.1969071,-28.9378513],[19.243012,-28.8516164],[19.2314858,-28.802963],[19.2587296,-28.7009928],[19.4431493,-28.6973163],[19.5500289,-28.4958332],[19.6967264,-28.4939914],[19.698822,-28.4479358],[19.8507587,-28.4433291],[19.8497109,-28.4027818],[19.9953605,-28.399095],[19.9893671,-24.7497859],[20.2916682,-24.9192346],[20.4724562,-25.1501701],[20.6532441,-25.4529449],[20.733265,-25.6801957],[20.8281046,-25.8963498],[20.8429232,-26.215851],[20.6502804,-26.4840868],[20.6532441,-26.8204869],[21.0889134,-26.846933],[21.6727695,-26.8389998],[21.7765003,-26.6696268],[21.9721069,-26.6431395],[22.2803355,-26.3274702],[22.5707817,-26.1333967],[22.7752795,-25.6775246],[23.0005235,-25.2761948],[23.4658301,-25.2735148],[23.883717,-25.597366],[24.2364017,-25.613402],[24.603905,-25.7896563],[25.110704,-25.7389432],[25.5078447,-25.6855376],[25.6441766,-25.4823781],[25.8419267,-24.7805437],[25.846641,-24.7538456],[26.3928487,-24.6332894],[26.4739066,-24.5653312],[26.5089966,-24.4842437],[26.5861946,-24.4075775],[26.7300635,-24.3014458],[26.8567384,-24.2499463],[26.8574402,-24.1026901],[26.9215471,-23.8990957],[26.931831,-23.8461891],[26.9714827,-23.6994344],[27.0006074,-23.6367644],[27.0578041,-23.6052574],[27.1360547,-23.5203437],[27.3339623,-23.3973792],[27.5144057,-23.3593929],[27.5958145,-23.2085465],[27.8098634,-23.0994957],[27.8828506,-23.0620496],[27.9382928,-22.9496487],[28.0407556,-22.8255118],[28.2056786,-22.6552861],[28.3397223,-22.5639374],[28.4906093,-22.560697],[28.6108769,-22.5400248],[28.828175,-22.4550173],[28.9285324,-22.4232328],[28.9594116,-22.3090081],[29.0162574,-22.208335],[29.2324117,-22.1693453],[29.3531213,-22.1842926],[29.6548952,-22.1186426],[29.7777102,-22.1361956],[29.9292989,-22.1849425],[30.1166795,-22.2830348],[30.2563377,-22.2914767],[30.3033582,-22.3395204],[30.5061784,-22.3057617],[30.8374279,-22.284983],[31.0058599,-22.3077095],[31.1834152,-22.3232913],[31.2930586,-22.3674647],[31.5680579,-23.1903385],[31.5568311,-23.4430809],[31.6931122,-23.6175209],[31.7119696,-23.741136],[31.7774743,-23.8800628],[31.8886337,-23.9481098],[31.9144386,-24.1746736],[31.9948307,-24.3040878],[32.0166656,-24.4405988],[32.0077331,-24.6536578],[32.019643,-24.9140701],[32.035523,-25.0849767],[32.019643,-25.3821442],[31.9928457,-25.4493771],[31.9997931,-25.5165725],[32.0057481,-25.6078978],[32.0057481,-25.6624806],[31.9362735,-25.8403721],[31.9809357,-25.9546537],[31.8687838,-26.0037251],[31.4162062,-25.7277683],[31.3229117,-25.7438611],[31.2504595,-25.8296526],[31.1393001,-25.9162746],[31.1164727,-25.9912361],[30.9656135,-26.2665756],[30.8921689,-26.3279703],[30.8534616,-26.4035568],[30.8226943,-26.4488849],[30.8022583,-26.5240694],[30.8038369,-26.8082089],[30.9020939,-26.7807451],[30.9100338,-26.8489495],[30.9824859,-26.9082627],[30.976531,-27.0029222],[31.0034434,-27.0441587],[31.1543322,-27.1980416],[31.5015607,-27.311117],[31.9700183,-27.311117],[31.9700183,-27.120472],[31.9769658,-27.050664],[32.0002464,-26.7983892],[32.1069826,-26.7984645],[32.3114546,-26.8479493],[32.899986,-26.8516059],[32.886091,-26.9816971],[32.709427,-27.4785436],[32.6240724,-27.7775144],[32.5813951,-28.07479],[32.5387178,-28.2288046],[32.4275584,-28.5021568],[32.3640388,-28.5945699],[32.0702603,-28.8469827],[31.9878832,-28.9069497],[31.7764818,-28.969487],[31.4638459,-29.2859343],[31.359634,-29.3854348],[31.1680825,-29.6307408],[31.064863,-29.7893535],[31.0534493,-29.8470469],[31.0669933,-29.8640319],[31.0455459,-29.9502017],[30.9518556,-30.0033946],[30.8651833,-30.1024093],[30.7244725,-30.392502],[30.3556256,-30.9308873],[30.0972364,-31.2458274],[29.8673136,-31.4304296],[29.7409393,-31.5014699],[29.481312,-31.6978686],[28.8943171,-32.2898903],[28.5497137,-32.5894641],[28.1436499,-32.8320732],[28.0748735,-32.941689],[27.8450942,-33.082869],[27.3757956,-33.3860685],[26.8805407,-33.6458951],[26.5916871,-33.7480756],[26.4527308,-33.7935795],[26.206754,-33.7548943],[26.0077897,-33.7223961],[25.8055494,-33.7524272],[25.7511073,-33.8006512],[25.6529079,-33.8543597],[25.6529079,-33.9469768],[25.7195789,-34.0040115],[25.7202807,-34.0511235],[25.5508915,-34.063151],[25.3504571,-34.0502627],[25.2810609,-34.0020322],[25.0476316,-33.9994588],[24.954724,-34.0043594],[24.9496586,-34.1010363],[24.8770358,-34.1506456],[24.8762914,-34.2005281],[24.8532574,-34.2189562],[24.7645287,-34.2017946],[24.5001356,-34.2003254],[24.3486733,-34.1163824],[24.1988819,-34.1019039],[23.9963377,-34.0514443],[23.8017509,-34.0524332],[23.7493589,-34.0111855],[23.4973536,-34.009014],[23.4155191,-34.0434586],[23.4154284,-34.1140433],[22.9000853,-34.0993009],[22.8412418,-34.0547911],[22.6470321,-34.0502627],[22.6459843,-34.0072768],[22.570016,-34.0064081],[22.5050499,-34.0645866],[22.2519968,-34.0645866],[22.2221334,-34.1014701],[22.1621197,-34.1057019],[22.1712431,-34.1521766],[22.1576913,-34.2180897],[22.0015632,-34.2172232],[21.9496952,-34.3220009],[21.8611528,-34.4007145],[21.5614708,-34.4020114],[21.5468011,-34.3661242],[21.501744,-34.3669892],[21.5006961,-34.4020114],[21.4194886,-34.4465247],[21.1978706,-34.4478208],[21.0988193,-34.3991325],[21.0033746,-34.3753872],[20.893192,-34.3997115],[20.8976647,-34.4854003],[20.7446802,-34.4828092],[20.5042011,-34.486264],[20.2527197,-34.701477],[20.0803502,-34.8361855],[19.9923317,-34.8379056],[19.899074,-34.8275845],[19.8938348,-34.7936018],[19.5972963,-34.7961833],[19.3929677,-34.642015],[19.2877095,-34.6404784],[19.2861377,-34.5986563],[19.3474363,-34.5244458],[19.3285256,-34.4534372],[19.098001,-34.449981],[19.0725583,-34.3802371],[19.0023531,-34.3525593],[18.9520568,-34.3949373],[18.7975006,-34.3936403],[18.7984174,-34.1016376],[18.501748,-34.1015292],[18.4999545,-34.3616945],[18.4477325,-34.3620007],[18.4479944,-34.3522691],[18.3974362,-34.3514041],[18.3971742,-34.3022959],[18.3565705,-34.3005647],[18.3479258,-34.2020436],[18.2972095,-34.1950274],[18.2951139,-33.9937138],[18.3374474,-33.9914079],[18.3476638,-33.8492427],[18.3479258,-33.781555],[18.4124718,-33.7448849],[18.3615477,-33.6501624],[18.2992013,-33.585591],[18.2166839,-33.448872],[18.1389858,-33.3974083],[17.9473472,-33.1602647],[17.8855247,-33.0575732],[17.8485884,-32.9668505],[17.8396817,-32.8507302],[17.8396817,-32.7983384]]],"best":true},{"id":"South-Tyrol-Orthofoto2011","name":"South Tyrol Orthofoto 2011","type":"tms","template":"http://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","scaleExtent":[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":"http://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":"http://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","scaleExtent":[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":"http://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":"http://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","scaleExtent":[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":"http://geoservices.buergernetz.bz.it/geokatalog/","terms_text":"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano","description":"Topographical basemap of South Tyrol"},{"id":"Bern-bern2016-tms","name":"Stadt Bern 10cm (2016)","type":"tms","template":"http://mapproxy.osm.ch:8080/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[8,21],"polygon":[[[7.2943145,46.9237564],[7.2982665,46.9274715],[7.3061586,46.9309487],[7.3043338,46.9362344],[7.3068603,46.9403709],[7.3246431,46.9432765],[7.3284525,46.946409],[7.3414051,46.9460797],[7.3438454,46.9473713],[7.3434554,46.9487937],[7.3513567,46.9485481],[7.3505628,46.950213],[7.3530901,46.9519266],[7.3582028,46.9511773],[7.3685031,46.9566244],[7.3715097,46.9607339],[7.37503,46.959835],[7.3785111,46.9614686],[7.3806232,46.9654741],[7.3832097,46.9663014],[7.3937998,46.9669268],[7.4000528,46.9691779],[7.4082922,46.9686857],[7.4281713,46.9738041],[7.4327053,46.972689],[7.4353602,46.9684345],[7.4378522,46.9684302],[7.4412474,46.9767865],[7.4456893,46.9747939],[7.4483835,46.9756393],[7.4477006,46.9790125],[7.4440468,46.9780682],[7.4412738,46.9798224],[7.4506732,46.9901527],[7.4522112,46.9896803],[7.454649,46.9778182],[7.4680382,46.9758258],[7.4707923,46.969998],[7.4701907,46.9674116],[7.4781618,46.9711823],[7.4845237,46.9701571],[7.4861275,46.9679018],[7.4857945,46.9646828],[7.4784708,46.9629043],[7.4802865,46.9606768],[7.4789304,46.9587841],[7.4797786,46.9566019],[7.4770135,46.9544586],[7.4840504,46.9499938],[7.4833925,46.9451977],[7.4955563,46.9396169],[7.4935119,46.9376594],[7.4908036,46.9387617],[7.4894997,46.9368667],[7.4766667,46.9369496],[7.4781093,46.9362489],[7.4746986,46.9339187],[7.4753537,46.9329898],[7.4691047,46.9292427],[7.4707683,46.9255044],[7.4585674,46.934836],[7.4476373,46.9304297],[7.435418,46.9349668],[7.4338022,46.9331237],[7.4376403,46.9307415],[7.4146941,46.9368183],[7.413844,46.9315682],[7.4070798,46.9303824],[7.408065,46.9256296],[7.4021268,46.9241992],[7.4014835,46.9211927],[7.3875736,46.9304506],[7.3823129,46.927282],[7.3800187,46.9298929],[7.3808694,46.9324085],[7.3748669,46.9314306],[7.3748901,46.9327104],[7.368066,46.9323929],[7.3683058,46.930426],[7.3604074,46.9285884],[7.3605592,46.9272018],[7.338783,46.9245357],[7.3393683,46.9196675],[7.3274574,46.9190326],[7.3269178,46.9235974],[7.324374,46.9251891],[7.3082264,46.9222857],[7.2943145,46.9237564]]],"terms_text":"Orthophoto 2016, Vermessungsamt Stadt Bern ","best":true},{"id":"Uster-2008","name":"Stadt Uster Orthophoto 2008 10cm","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.6,47.31],[8.6,47.39],[8.77,47.39],[8.77,47.31],[8.6,47.31]]],"terms_text":"Stadt Uster Vermessung Orthophoto 2008"},{"id":"Zuerich-zh_luftbild2011-tms","name":"Stadt Zürich Luftbild 2011","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4441,47.3141],[8.4441,47.4411],[8.6284,47.4411],[8.6284,47.3141],[8.4441,47.3141]]],"terms_text":"Stadt Zürich Luftbild 2011"},{"id":"Zuerich-city_map","name":"Stadtplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"stamen-terrain-background","name":"Stamen Terrain","type":"tms","template":"http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{zoom}/{x}/{y}.jpg","scaleExtent":[4,18],"terms_url":"http://maps.stamen.com/#terrain","terms_text":"Map tiles by Stamen Design, under CC BY 3.0"},{"id":"Stevns_Denmark","name":"Stevns","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/stevns/2009/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[12.0913942,55.3491574],[12.0943104,55.3842256],[12.1573875,55.3833103],[12.1587287,55.4013326],[12.1903468,55.400558],[12.1931411,55.4364665],[12.2564251,55.4347995],[12.2547073,55.4168882],[12.3822489,55.4134349],[12.3795942,55.3954143],[12.4109213,55.3946958],[12.409403,55.3766417],[12.4407807,55.375779],[12.4394142,55.3578314],[12.4707413,55.3569971],[12.4629475,55.2672214],[12.4315633,55.2681491],[12.430045,55.2502103],[12.3672011,55.2519673],[12.3656858,55.2340267],[12.2714604,55.2366031],[12.2744467,55.272476],[12.2115654,55.2741475],[12.2130078,55.2920322],[12.1815665,55.2928638],[12.183141,55.3107091],[12.2144897,55.3100981],[12.2159927,55.3279764],[12.1214458,55.3303379],[12.1229489,55.3483291],[12.0913942,55.3491574]]],"terms_text":"Stevns Kommune"},{"id":"Surrey-Air_Survey","name":"Surrey Air Survey","type":"tms","template":"http://gravitystorm.dev.openstreetmap.org/surrey/{zoom}/{x}/{y}.png","endDate":"2009-01-01T00:00:00.000Z","startDate":"2007-01-01T00:00:00.000Z","scaleExtent":[8,19],"polygon":[[[-0.752478,51.0821941],[-0.7595183,51.0856254],[-0.8014342,51.1457917],[-0.8398864,51.1440686],[-0.8357665,51.1802397],[-0.8529549,51.2011266],[-0.8522683,51.2096231],[-0.8495217,51.217903],[-0.8266907,51.2403696],[-0.8120995,51.2469248],[-0.7736474,51.2459577],[-0.7544213,51.2381127],[-0.754078,51.233921],[-0.7446366,51.2333836],[-0.7430693,51.2847178],[-0.751503,51.3069524],[-0.7664376,51.3121032],[-0.7820588,51.3270157],[-0.7815438,51.3388135],[-0.7374268,51.3720456],[-0.7192307,51.3769748],[-0.6795769,51.3847961],[-0.6807786,51.3901523],[-0.6531411,51.3917591],[-0.6301385,51.3905808],[-0.6291085,51.3970074],[-0.6234437,51.3977572],[-0.613144,51.4295552],[-0.6002471,51.4459121],[-0.5867081,51.4445365],[-0.5762368,51.453202],[-0.5626755,51.4523462],[-0.547741,51.4469972],[-0.5372697,51.4448575],[-0.537098,51.4526671],[-0.5439644,51.4545926],[-0.5405312,51.4698865],[-0.5309182,51.4760881],[-0.5091172,51.4744843],[-0.5086022,51.4695657],[-0.4900628,51.4682825],[-0.4526406,51.4606894],[-0.4486924,51.4429316],[-0.4414826,51.4418616],[-0.4418259,51.4369394],[-0.4112702,51.4380095],[-0.4014855,51.4279498],[-0.3807145,51.4262372],[-0.3805428,51.4161749],[-0.3491288,51.4138195],[-0.3274994,51.4037544],[-0.3039818,51.3990424],[-0.3019219,51.3754747],[-0.309475,51.369688],[-0.3111916,51.3529669],[-0.2955704,51.3541462],[-0.2923089,51.3673303],[-0.2850991,51.3680805],[-0.2787476,51.3771891],[-0.2655297,51.3837247],[-0.2411538,51.3847961],[-0.2123147,51.3628288],[-0.2107697,51.3498578],[-0.190857,51.3502867],[-0.1542931,51.3338802],[-0.1496583,51.3057719],[-0.1074296,51.2966491],[-0.0887185,51.3099571],[-0.0878602,51.3220811],[-0.0652009,51.3215448],[-0.0641709,51.3264793],[-0.0519829,51.3263721],[-0.0528412,51.334631],[-0.0330779,51.3430876],[0.0019187,51.3376339],[0.0118751,51.3281956],[0.013935,51.2994398],[0.0202865,51.2994398],[0.0240631,51.3072743],[0.0331611,51.3086694],[0.0455207,51.30545],[0.0523872,51.2877392],[0.0616569,51.2577764],[0.0640602,51.2415518],[0.0462074,51.2126342],[0.0407142,51.2109136],[0.0448341,51.1989753],[0.0494689,51.1997283],[0.0558204,51.1944573],[0.0611419,51.1790713],[0.0623435,51.1542061],[0.0577087,51.1417146],[0.0204582,51.1365447],[-0.0446015,51.1336364],[-0.1566964,51.1352522],[-0.1572114,51.1290043],[-0.2287942,51.1183379],[-0.2473336,51.1183379],[-0.2500802,51.1211394],[-0.299347,51.1137042],[-0.3221779,51.1119799],[-0.3223496,51.1058367],[-0.3596001,51.1019563],[-0.3589135,51.1113333],[-0.3863793,51.1117644],[-0.3869014,51.1062516],[-0.4281001,51.0947174],[-0.4856784,51.0951554],[-0.487135,51.0872266],[-0.5297404,51.0865404],[-0.5302259,51.0789914],[-0.61046,51.076551],[-0.6099745,51.080669],[-0.6577994,51.0792202],[-0.6582849,51.0743394],[-0.6836539,51.0707547],[-0.6997979,51.070831],[-0.7296581,51.0744919],[-0.752478,51.0821941]]]},{"id":"Szeged_2011","name":"Szeged orthophoto 2011","type":"tms","template":"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png","scaleExtent":[10,22],"polygon":[[[20.1459914,46.2281144],[20.1332261,46.2290431],[20.1258373,46.2298686],[20.122329,46.2309893],[20.1208484,46.2317537],[20.1189709,46.2335126],[20.1131237,46.2413638],[20.1120293,46.2433005],[20.1115733,46.2449996],[20.1111871,46.247092],[20.1112944,46.2487725],[20.1115948,46.2509686],[20.1122171,46.2528047],[20.1129949,46.2542681],[20.1135421,46.2553549],[20.1147705,46.2567977],[20.1352251,46.2768529],[20.1366386,46.2775055],[20.1378939,46.2780301],[20.1393932,46.2783508],[20.1408818,46.2784583],[20.1611494,46.278159],[20.1621093,46.2781579],[20.1635894,46.277702],[20.1661777,46.2761484],[20.1687795,46.2738569],[20.1696108,46.2714413],[20.1695895,46.2704465],[20.1700871,46.2704418],[20.1739897,46.2643295],[20.1766182,46.2582878],[20.1947983,46.25492],[20.1858719,46.2448077],[20.1846595,46.2453122],[20.1780371,46.2383112],[20.1781766,46.2377101],[20.1795258,46.2370961],[20.1725666,46.2300241],[20.1698349,46.2350404],[20.1687701,46.2362946],[20.1670262,46.2378475],[20.1659431,46.2387342],[20.1654408,46.2389988],[20.1654837,46.2389988],[20.1635177,46.2401383],[20.1602051,46.2412003],[20.1592684,46.241531],[20.1592684,46.2415751],[20.1583504,46.2418505],[20.1549473,46.2422869],[20.1510796,46.2351538],[20.1493804,46.232459],[20.1459914,46.2281144]]],"terms_url":"http://www.geo.u-szeged.hu/","terms_text":"SZTE TFGT - University of Szeged","best":true},{"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","scaleExtent":[0,20],"polygon":[[[-99.9985439,34.5601834],[-95.55654502453,33.99257450647],[-93.89679027134,33.61039304449],[-93.98468089634,32.04103124103],[-93.41613841587,31.02505269211],[-93.74531484297,29.57268254375],[-96.50492070332,28.23158511753],[-97.36942054453,26.95467452634],[-97.04866958924,25.80530249434],[-99.0734177889,26.32559221139],[-100.76599193149,29.02531904433],[-102.3315436893,29.8433892263],[-103.13354564242,28.88112103669],[-104.2887874222,29.28831477845],[-104.7269783935,29.94815782859],[-104.72696778796,30.23535241761],[-106.53450082091,31.78456647831],[-106.75767043939,31.78457253947],[-106.75766067978,32.04385536686],[-106.61848436611,32.04385159755],[-103.11949492759,32.04375683439],[-103.09544343487,36.50045758762],[-103.05798056071,36.54268645422],[-100.00042146824,36.54222227302],[-99.9985439,34.5601834]]],"terms_url":"https://tnris.org/maps-and-data/online-mapping-services/"},{"id":"tf-landscape","name":"Thunderforest Landscape","type":"tms","template":"https://{switch:a,b,c}.tile.thunderforest.com/landscape/{zoom}/{x}/{y}.png","scaleExtent":[0,22],"terms_url":"http://www.thunderforest.com/terms/","terms_text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},{"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","scaleExtent":[0,22],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-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":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABLCAMAAAAf8MQEAAAAAXNSR0IArs4c6QAAAt9QTFRF////q6ytVFplAAAB0owMmWYJRS4EZWx3o6OjYmNl7JoE/agGdE0GBgUA9aQOzIkMKhwCFA0BJBQBNBUAdHV15OXpUlVYGhECkWEJ5ZkOsXYKbkoH/64Qu30LgVYImpqbSTEEa0gG8qIOVTkFEgwBHhQCqnEKMSEE/80So20Kck0HCQYB/7IOMzM0uru+Q0tYRCQA/8ER/9oT/+EUlGMJflUI3ZQN/7kQ/60PaUYGZUMG/7EQ/8oSJhkCil0IOiYDMB8CfH1+yYYM4pcOiFsI2ZIN1Y4N/8URIRYCi4uLa3B5NSQD/74RzooM7qAO/7YQ6+vsiloD+6gP/aoP6p0OrnQLnWkKm2kJWz0FUjYFMSED/9QTjV4JdHZ69ff77J4ODAkBX0AGAAEL+fr7S1BVBQIAtXkLhVkIPikExIMMTjUEFhYXysrLxcXF+qcPwYEM1pENHSIqPSkDLR4Dck0I/qoQRzAEe1MH/+gVWzQAg4SFJCQlelIIDgkBYUEGQiwESElLLSADSi0B/9ESDAIArrS9v4ALTDIEDAwMxsvVklsAHRMBjmAJP0JHAAETdEUAhVcISVRlxoUMd1AI/7sOz9HW1IoChFkHomwK/+UUYj4D96UQZjYAGiQ4OURXg4eMk5mm/6wJwH8M3uHmp3AK/90UNDtJLhQAFxABGQ0Bg1gIglUEJjNJl14FsnMBlmUJ0YcA2drbi5WmFQIAi1MAa2trbHaHW1tck5KS8fL0fEoAOxwAJCw7/7YFUiwAgU0AJQwA6ZcCJy9BDRcrsLCx/8oU2t3j7/H2ChEfu73DAAAA1NXXAAAGWmJtEx42qWoAVDkEzIQAa0YEo2QAAw4lfIGNhY2bdnyIm2QCp6y2eoWXLTA5w34AjZKbRE1hdn+RrHEFxoAAu8DGY26BAQocnZ+kvHkB5JQB/8QOhIqVORcATCYA24wA+6YK8JsCJQYAn6Wu0YsMnai8hY+hU2B4tSvHUAAACMpJREFUWMO1mP9TFPcZx2nfd9do7xutySG3dznuzuOOQ8PCwd65C2eFY69h6ya7CMuXBDRzcNDksOJhUwkYz5IYLFaKDco41qqNEztmnMwk1aaNbZN0MtpYG5O06ZdfajWTpJl2pn9An4WxxS9HhZl+fgBm9/P6fJ7P87yf5/ksBQX/j/E50DAY9Z/4wuLQe+8jxlFYVOwE44LZvRK4fxE0UAJ4jb5VAVtpMIRwuQNYfdf4AxVsFRtBdU00hmJeqEVdHOvwlbvFMTciBpRI+Bo20EEgVzcAd0U/9HAgpMhqzcZwK6CF29pLw52wqc0mPPLoXdD6zqu0Lo5d3yKDQRws6oH1XZuAzY/dheWmysyACSFRllaVJlsAPlMOxB1xxPA/PLDmG/BstUr127IZUzIqbkHNkAN1omzXTdqeRiG+tQC9A0/CJBfpcwetoVR9R6Kp0/dUWuiKAz79aWv+/XfO+jsZ634asK30AKSWGIaJ4HZhDo/kENv9UJ5TN40lakK9ydFamvgMsToPsAPgurdRDPQlWlBU+Owd+T3PiUILbWGvNgHjsPSjv2+EoLJKcP4e3RB91O4FvnMHej84toxeGyabBmwDGN+O70HzFfP0yMbCC4SAUYDWmdp9u34O4PtsDI5Jrvr5Mne1PIyw3eEaD/T1kT1sJQ4msRFwYogM6ANuM39iX/AQDgXZ5JxgOZu/xj+JtK21jk7ct7EqiRkfRsIRwNMP5+Fb6B8cFYubpawv1uCtslVSlsHLS05vO1iWLDY3lg/C20+OYIF2IHOL+ccg8TKbjZaJuaJqOHs6arR6JSqFGFg3TQNlW8rjsJrQDwm9FoycmIv+ih3ACh3/0QucxCckZkCKztoeEiSecEkoMWKMnG7LJuAdRRoyRANkfdKNzNRNxxTsibWIqYzqCoTpYXuQEeowkPG3wwRXW5VpAwKmMFxuFAWRQjc7TdufrmRnrdj8XE4TONYFWZ4k9iXydkDowTQnMZ0mlPKdnMeKuMmPlSrSHTRjYwA49phZrMQZ3Qq2R5YVhn1KDFJ4kNAVMoi1ckYN1rGFEbfEdgv2dE0EouQARy9FoOKBFXAU60X02NEOcw3NVQV6czCTHG94CbBwIqdGpZFOuFGbA59ubx4eFYm14ZEClEntN05e8MoJN+rlDLmKzErANxwv1fOjbEyWZlAMirVs92IwGlo/QMapqVcL8MWDNGHvLH52ohOeRjnDFgPFlXDSU8/W0XEqM8nK7RYh7Ca8uhnJDm+jx5jE6Ln9FKkAUvaD53T8CaDzRE8Hh0ZPMAq+3oxefqMJRoajpG335ygBrblxnAxuiCD94m7fdjxesAbdghdJHV/2c8jBcc0yXtUiaJCmqK4OdoqbMCC6KfMwSllirQFacj1j8KeQntRt3nnoYN/c2Ze9PtrB+4GwVeCc9TwH11DEmFMQiDbDjG46ETZQs1rZ0S7BCL/mmqXO/+JLc5p79s1YM47XFrfqxUhkfWVubHAIAd2xiZawNQuxT49kLob29iJKWnLRbMG+94nH9V+OSbcBdm0wRXNKmnPF6ouUGV3f1PGUrKsgJIdR18UgPBLTO0aVpr01L18KzU4NTc7C7tI2ItLTQoikYTXPxvU4EOwZPlkNC6uhpQso7EXQq/36psrOhtHkKBn0wYO3d+qaonlvXEDWAj/6EqK+zo7XUEa1IDXW6xAaNl38zXxcgik+UtpmxKqKX94DE2ewUkK/E49SW4NdFB06f2a2DDcLZs1VFrv0zs34KLzr0hFYfovVGFYZxoz7cBprSRHoEeM6eXbN/fcgIAvlI/EILuO/3WoZHTUONY3Y8+lEEGAURYnYZYx4U0X4Lorm6tcOPUbANjzdNIKjeGsezrqTiAyhtgpolBElfEuTEKqxj44QN2rpJdXPXg/owvK7cX2td6/Mv8XkfjgUqd1KSUJvZnFV1mSqkW6kZutmrpky8Kbe/948178/xaiiw4zCetP2QjtkJZORIj0Ry0mEbaU011pt6V7obnBJUrkQbgyOZaVgnZX+Mpav6ySbPP9J7TzdbYrhRa3Jjlg1ySzV0BKZJnUHOlnomyvU32Ilnrfz4h9gisVYTSkqu1BtmN2rl0qHik4KhLvDI5QrM9xC2/+exyRrRS8LbWiY6G7VYxwMIkR4WWWTOKOoDB7Mi/8BDZDkLXpLHtyme8EWccOZ8AVyJPtck0ixmLk0sdCVxs7yzRjWW2wf07+3z0ZZ7YGLcEZO8KQERXz5lfz4xGmJb4wX+Xyo9ett3I2v6yHrgka9S9VxaaHtJ96lLicaSTU9VYZG24k/oWD16r+8vAsBSZkb5c0LOO8ClgciHMcxYhqXL5/CH+cer97K6xpmIryiqsG/5udfO+8KScqMKrXiytWrf7ux6jVRt5zr4fSfFxdw3ubGEZuiKswUblGUDgbKyQge+aVTsCc446SdGEH74GZFkd9ln6GcVtl1eAFclHyMzPNad2rzvAVwSlLUzFopS0tfX8B5+1nOx/cG3M8EPzo0b9oeXCeTtGyUlJMfP4Bz/EqXjeMMgotjH56fzuD6tspRNRpVy/F+Pse9LnBBF8sFj7O8N7j8zHzv5VrAz6iGAT748Yd58Cv7xOo6p1RnGJaCYJ+c/+rwiTaQ+6ZbZSEv/m0IljdlH0JO/fr451uu+BGKmllWrl/M/w3xCfYJWuq0Gdd+9cYt6VQoU+wMvPJpfs8f+fyDmz/efceylGI4ync+OlPx48V/TuKnnKpEmSwF7tzEEvCfZenkdQlS3WdYNP0e5BlFifbLC8om7zg7UcHyKlPPqNHs3/GPRfOP4vQ/ZTWqMusZ4csfLv7wB64Osnrf8qjiUvCCf73AKiov+fjMYr/k53x/jVNVmTUW18SxFPwzWcnKnDIsn1oSvlzqoc+FrNzF7l4K/hF9PNazHNtbWbEU/Px1tLjlkYSx45Ol/R+lQpROYoDjtKXhn0qyBQPeNiwNPxeUUFupYYn4q37/ha8eOfKTs7e9+TeLgDxdoqv76wAAAABJRU5ErkJggg==","overlay":true},{"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","scaleExtent":[0,20],"polygon":[[[5.961753,50.17631],[6.026268,50.18496],[6.033182,50.16395],[6.060695,50.15536],[6.07668,50.15913],[6.078237,50.17255],[6.101762,50.17199],[6.122501,50.16437],[6.120101,50.15594],[6.127695,50.14993],[6.113228,50.13739],[6.123691,50.13719],[6.140929,50.1305],[6.135554,50.11899],[6.138082,50.10263],[6.131085,50.09964],[6.135473,50.09119],[6.121939,50.09059],[6.126335,50.07817],[6.131858,50.07348],[6.121171,50.064],[6.114444,50.06139],[6.115631,50.05817],[6.123611,50.06323],[6.136608,50.04178],[6.130343,50.02975],[6.148207,50.02307],[6.13868,50.01572],[6.135938,50.01485],[6.131384,50.01905],[6.130243,50.01819],[6.139343,50.01116],[6.151702,50.01058],[6.145464,49.99689],[6.139657,49.9994],[6.138524,49.99829],[6.142178,49.99535],[6.150227,49.99518],[6.156247,49.98867],[6.173045,49.98589],[6.17348,49.98344],[6.170353,49.98376],[6.165487,49.97115],[6.171512,49.96298],[6.176298,49.962],[6.179954,49.95386],[6.183393,49.9548],[6.179829,49.96307],[6.183312,49.9686],[6.192774,49.97158],[6.199783,49.95352],[6.207066,49.95672],[6.212689,49.9514],[6.225023,49.95039],[6.22044,49.94369],[6.228241,49.93726],[6.22635,49.92766],[6.219133,49.92354],[6.229862,49.92125],[6.236032,49.91355],[6.231867,49.91064],[6.227694,49.91062],[6.232286,49.9072],[6.23381,49.90028],[6.246919,49.89535],[6.257809,49.88724],[6.263008,49.88101],[6.276455,49.87725],[6.281126,49.87957],[6.291661,49.87548],[6.297699,49.86673],[6.309889,49.87107],[6.315324,49.8673],[6.314651,49.86057],[6.323611,49.85188],[6.321577,49.8409],[6.327406,49.83673],[6.336561,49.83998],[6.339366,49.8507],[6.364651,49.85164],[6.402203,49.82098],[6.426434,49.81629],[6.428071,49.81186],[6.43097,49.81129],[6.441608,49.81547],[6.443442,49.81233],[6.45366,49.81275],[6.464538,49.81975],[6.47057,49.82385],[6.496805,49.81277],[6.50669,49.80993],[6.511554,49.80238],[6.51485,49.80513],[6.519604,49.81446],[6.529808,49.81048],[6.532249,49.80686],[6.530829,49.80116],[6.506225,49.78899],[6.519171,49.78344],[6.511055,49.77422],[6.520563,49.76818],[6.520516,49.76134],[6.503734,49.75086],[6.502627,49.73298],[6.507266,49.72938],[6.518092,49.7242],[6.516417,49.72129],[6.511763,49.72016],[6.504791,49.725],[6.498913,49.72639],[6.495576,49.72443],[6.507122,49.71655],[6.507884,49.71215],[6.504598,49.71227],[6.427139,49.66237],[6.439899,49.66025],[6.442511,49.65591],[6.421781,49.61809],[6.398978,49.60094],[6.379408,49.59526],[6.375507,49.58809],[6.384426,49.5801],[6.381188,49.57509],[6.369093,49.5783],[6.357913,49.57166],[6.384902,49.55817],[6.380095,49.54856],[6.358555,49.53296],[6.359322,49.52481],[6.370763,49.50545],[6.370562,49.45732],[6.333403,49.46493],[6.321894,49.47244],[6.295034,49.47928],[6.287889,49.48379],[6.271912,49.49995],[6.241327,49.50693],[6.196692,49.50331],[6.173373,49.50577],[6.160858,49.50085],[6.167099,49.49006],[6.140179,49.48525],[6.129367,49.48803],[6.127247,49.47081],[6.101403,49.46726],[6.104826,49.45076],[6.081667,49.45417],[6.077222,49.46139],[6.059167,49.46306],[6.052222,49.46028],[6.044213,49.44553],[6.025294,49.44703],[6.021545,49.45127],[6.01574,49.44885],[5.994123,49.45301],[5.976569,49.44885],[5.977725,49.45955],[5.972317,49.46087],[5.968912,49.48202],[5.9616,49.49026],[5.915781,49.49835],[5.890334,49.4948],[5.863321,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.831868,49.52639],[5.84308,49.53081],[5.835622,49.54114],[5.816251,49.53325],[5.805201,49.54272],[5.859432,49.57158],[5.868663,49.587],[5.862888,49.58525],[5.851102,49.58379],[5.847116,49.58961],[5.845652,49.5981],[5.869401,49.6106],[5.881819,49.63815],[5.899978,49.63907],[5.899339,49.66239],[5.856561,49.67628],[5.856283,49.68211],[5.875703,49.71118],[5.864811,49.72331],[5.843249,49.71822],[5.82191,49.72128],[5.824894,49.73767],[5.820728,49.74878],[5.786264,49.79079],[5.765172,49.78961],[5.750937,49.79094],[5.741591,49.82126],[5.745814,49.82435],[5.737197,49.83353],[5.740531,49.84142],[5.747012,49.84048],[5.746237,49.84783],[5.753989,49.84878],[5.740663,49.85152],[5.752288,49.85922],[5.749545,49.87554],[5.775668,49.87438],[5.775053,49.88057],[5.734598,49.89341],[5.733033,49.90285],[5.757834,49.91737],[5.760393,49.93252],[5.770728,49.93711],[5.768783,49.94239],[5.768802,49.96104],[5.786724,49.96816],[5.80524,49.96677],[5.806521,49.97321],[5.831293,49.97995],[5.834616,49.98656],[5.818057,49.99936],[5.815606,50.01437],[5.847923,50.02809],[5.861889,50.04581],[5.850872,50.0563],[5.857809,50.07186],[5.880997,50.08069],[5.891965,50.12041],[5.952856,50.13384],[5.961753,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":"Toulouse-Orthophotoplan-2007","name":"Toulouse - Orthophotoplan 2007","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2007/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1919978,43.6328791],[1.2015377,43.6329729],[1.2011107,43.6554932],[1.2227985,43.6557029],[1.2226231,43.6653353],[1.2275341,43.6653849],[1.2275417,43.6656387],[1.2337568,43.6656883],[1.2337644,43.6650153],[1.2351218,43.6650319],[1.2350913,43.6670729],[1.2443566,43.6671556],[1.2441584,43.6743925],[1.2493973,43.6744256],[1.2493973,43.6746628],[1.2555666,43.6747234],[1.2555742,43.6744532],[1.2569545,43.6744697],[1.2568782,43.678529],[1.2874873,43.6788257],[1.2870803,43.7013229],[1.3088219,43.7014632],[1.3086493,43.7127673],[1.3303262,43.7129544],[1.3300242,43.7305221],[1.3367106,43.7305845],[1.3367322,43.7312235],[1.3734338,43.7310456],[1.3735848,43.7245772],[1.4604504,43.7252947],[1.4607783,43.7028034],[1.4824875,43.7029516],[1.4829828,43.6692071],[1.5046832,43.6693616],[1.5048383,43.6581174],[1.5265475,43.6582656],[1.5266945,43.6470298],[1.548368,43.6471633],[1.5485357,43.6359385],[1.5702172,43.636082],[1.5705123,43.6135777],[1.5488166,43.6134276],[1.549097,43.5909479],[1.5707695,43.5910694],[1.5709373,43.5798341],[1.5793714,43.5798894],[1.5794782,43.5737682],[1.5809119,43.5737792],[1.5810859,43.5573794],[1.5712334,43.5573131],[1.5716504,43.5235497],[1.3984804,43.5222618],[1.3986509,43.5110113],[1.3120959,43.5102543],[1.3118968,43.5215192],[1.2902569,43.5213126],[1.2898637,43.5438168],[1.311517,43.5440133],[1.3113271,43.5552596],[1.3036924,43.5551924],[1.3036117,43.5595099],[1.2955449,43.5594317],[1.2955449,43.5595489],[1.2895595,43.5594473],[1.2892899,43.5775366],[1.2675698,43.5773647],[1.2673973,43.5886141],[1.25355,43.5885047],[1.2533774,43.5956282],[1.2518029,43.5956282],[1.2518029,43.5949409],[1.2350437,43.5947847],[1.2350437,43.5945972],[1.2239572,43.5945972],[1.2239357,43.5994708],[1.2139708,43.599299],[1.2138845,43.6046408],[1.2020647,43.6044846],[1.2019464,43.61048],[1.1924294,43.6103695],[1.1919978,43.6328791]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2011","name":"Toulouse - Orthophotoplan 2011","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_ortho2011/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2013","name":"Toulouse - Orthophotoplan 2013","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2013/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Toulouse-Orthophotoplan-2015","name":"Toulouse - Orthophotoplan 2015","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/toulouse_2015/{zoom}/{x}/{y}","scaleExtent":[0,22],"polygon":[[[1.1135067,43.6867566],[1.1351836,43.6870842],[1.1348907,43.6983471],[1.1782867,43.6990338],[1.1779903,43.7102786],[1.1996591,43.7106144],[1.1993387,43.7218722],[1.2427356,43.7225269],[1.2424336,43.7337491],[1.2641536,43.734092],[1.2638301,43.7453588],[1.2855285,43.7456548],[1.2852481,43.756935],[1.306925,43.757231],[1.3066446,43.7684779],[1.3283431,43.7687894],[1.3280842,43.780034],[1.4367275,43.7815757],[1.4373098,43.7591004],[1.4590083,43.7593653],[1.4593318,43.7481479],[1.4810303,43.7483972],[1.4813322,43.7371777],[1.5030307,43.7374115],[1.5035915,43.7149664],[1.5253115,43.7151846],[1.5256135,43.7040057],[1.5472688,43.7042552],[1.5475708,43.6930431],[1.5692045,43.6932926],[1.5695712,43.6820316],[1.5912049,43.6822656],[1.5917441,43.6597998],[1.613421,43.6600339],[1.613723,43.6488291],[1.6353783,43.6490788],[1.6384146,43.5140731],[1.2921649,43.5094658],[1.2918629,43.5206966],[1.2702076,43.5203994],[1.2698841,43.5316437],[1.2482288,43.531331],[1.2476048,43.5537788],[1.2259628,43.5534914],[1.2256819,43.564716],[1.2039835,43.564419],[1.2033148,43.5869049],[1.1816164,43.5865611],[1.1810237,43.6090368],[1.1592821,43.6086932],[1.1589585,43.6199523],[1.1372601,43.6196244],[1.1365933,43.642094],[1.1149055,43.6417629],[1.1135067,43.6867566]]],"terms_url":"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData","terms_text":"ToulouseMetropole"},{"id":"Tours-Orthophoto-2008_2010","name":"Tours - Orthophotos 2008-2010","type":"tms","template":"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}","endDate":"2011-01-01T00:00:00.000Z","startDate":"2008-01-01T00:00:00.000Z","scaleExtent":[0,20],"polygon":[[[0.5457462,47.465264],[0.54585,47.4608163],[0.5392188,47.4606983],[0.5393484,47.456243],[0.5327959,47.4561003],[0.5329011,47.451565],[0.52619,47.4514013],[0.5265854,47.4424884],[0.5000941,47.4420739],[0.5002357,47.4375835],[0.4936014,47.4374324],[0.4937,47.4329285],[0.4606141,47.4324593],[0.4607248,47.4279827],[0.4541016,47.4278125],[0.454932,47.4053921],[0.4615431,47.4054476],[0.4619097,47.3964924],[0.4684346,47.3966005],[0.4691319,47.3786415],[0.4757125,47.3787609],[0.4762116,47.3652018],[0.4828297,47.3653499],[0.4829611,47.3608321],[0.4763543,47.360743],[0.476654,47.3517263],[0.4700497,47.3516186],[0.4701971,47.3471313],[0.4637503,47.3470104],[0.4571425,47.3424146],[0.4572922,47.3379061],[0.4506741,47.3378081],[0.4508379,47.3333051],[0.4442212,47.3332032],[0.4443809,47.328711],[0.4311392,47.3284977],[0.4316262,47.3150004],[0.4382432,47.3151136],[0.4383815,47.3106174],[0.4714487,47.3111374],[0.4713096,47.3156565],[0.477888,47.3157542],[0.4780733,47.3112802],[0.4846826,47.3113639],[0.4848576,47.3068686],[0.4914359,47.3069803],[0.491745,47.2979733],[0.4851578,47.2978722],[0.4854269,47.2888744],[0.4788485,47.2887697],[0.4791574,47.2797818],[0.4857769,47.2799005],[0.4859107,47.2753885],[0.492539,47.2755029],[0.4926669,47.2710127],[0.4992986,47.2711066],[0.4994296,47.2666116],[0.5192658,47.2669245],[0.5194225,47.2624231],[0.5260186,47.2625205],[0.5258735,47.2670183],[0.5456972,47.2673383],[0.5455537,47.2718283],[0.5587737,47.2720366],[0.5586259,47.2765185],[0.5652252,47.2766278],[0.5650848,47.2811206],[0.5716753,47.2812285],[0.5715223,47.2857217],[0.5781436,47.2858299],[0.5779914,47.2903294],[0.5846023,47.2904263],[0.5843076,47.2994231],[0.597499,47.2996094],[0.5976637,47.2951375],[0.6571596,47.2960036],[0.6572988,47.2915091],[0.6705019,47.2917186],[0.6703475,47.2962082],[0.6836175,47.2963688],[0.6834322,47.3008929],[0.690062,47.3009558],[0.6899241,47.3054703],[0.7362019,47.3061157],[0.7360848,47.3106063],[0.7559022,47.3108935],[0.7557718,47.315392],[0.7623755,47.3154716],[0.7622314,47.3199941],[0.7754911,47.3201546],[0.77497,47.3388218],[0.7745786,47.351628],[0.7680363,47.3515901],[0.767589,47.3605298],[0.7742443,47.3606238],[0.7733465,47.3921266],[0.7667434,47.3920195],[0.7664411,47.4010837],[0.7730647,47.4011115],[0.7728868,47.4101297],[0.7661849,47.4100226],[0.7660267,47.4145044],[0.7527613,47.4143038],[0.7529788,47.4098086],[0.7462373,47.4097016],[0.7459424,47.4232208],[0.7392324,47.4231451],[0.738869,47.4366116],[0.7323267,47.4365171],[0.7321869,47.4410556],[0.7255048,47.44098],[0.7254209,47.4453479],[0.7318793,47.4454803],[0.7318514,47.4501126],[0.7384496,47.450226],[0.7383098,47.454631],[0.7449359,47.4547444],[0.7443209,47.4771985],[0.7310685,47.4769717],[0.7309008,47.4815445],[0.7176205,47.4812611],[0.7177883,47.4768394],[0.69777,47.4764993],[0.6980496,47.4719827],[0.6914514,47.4718882],[0.6917309,47.4630241],[0.6851048,47.4629295],[0.684937,47.4673524],[0.678255,47.4673335],[0.6779754,47.4762158],[0.6714051,47.4761592],[0.6710417,47.4881952],[0.6577334,47.4879685],[0.6578173,47.48504],[0.6511911,47.4848322],[0.6514707,47.4758568],[0.6448166,47.4757245],[0.6449284,47.4712646],[0.6117976,47.4707543],[0.6118815,47.4663129],[0.6052833,47.4661239],[0.6054231,47.4616631],[0.5988808,47.4615497],[0.5990206,47.4570886],[0.572488,47.4566916],[0.5721805,47.4656513],[0.5457462,47.465264]]],"terms_url":"http://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","scaleExtent":[0,22],"polygon":[[[0.427093505859375,47.26199018174824],[0.427093505859375,47.50096732311069],[0.814361572265625,47.50096732311069],[0.814361572265625,47.26199018174824],[0.427093505859375,47.26199018174824]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Tours/Orthophoto","terms_text":"Orthophoto Tour(s)plus 2013"},{"id":"US_Forest_Service_roads","name":"U.S. Forest Service roads","type":"tms","template":"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png","scaleExtent":[0,19],"polygon":[[[-124.7617886,48.4130148],[-124.6059492,45.90245],[-124.9934269,40.0557614],[-122.5369737,36.8566086],[-119.9775867,33.0064099],[-117.675935,32.4630223],[-114.8612307,32.4799891],[-111.0089311,31.336015],[-108.1992687,31.3260016],[-108.1871123,31.7755116],[-106.5307225,31.7820947],[-106.4842052,31.7464455],[-106.429317,31.7520583],[-106.2868855,31.5613291],[-106.205248,31.446704],[-105.0205259,30.5360988],[-104.5881916,29.6997856],[-103.2518856,28.8908685],[-102.7173632,29.3920567],[-102.1513983,29.7475702],[-101.2552871,29.4810523],[-100.0062436,28.0082173],[-99.2351068,26.4475962],[-98.0109067,25.9928035],[-97.435024,25.8266009],[-96.9555259,25.9821589],[-96.8061741,27.7978168],[-95.5563349,28.5876066],[-93.7405308,29.4742093],[-90.9028456,28.8564513],[-88.0156706,28.9944338],[-88.0162494,30.0038862],[-86.0277506,30.0047454],[-84.0187909,28.9961781],[-81.9971976,25.9826768],[-81.9966618,25.0134917],[-84.0165592,25.0125783],[-84.0160068,24.0052745],[-80.0199985,24.007096],[-79.8901116,26.8550713],[-80.0245309,32.0161282],[-75.4147385,35.0531894],[-74.0211163,39.5727927],[-72.002019,40.9912464],[-69.8797398,40.9920457],[-69.8489304,43.2619916],[-66.9452845,44.7104937],[-67.7596632,47.0990024],[-69.2505131,47.5122328],[-70.4614886,46.2176574],[-71.412273,45.254878],[-72.0222508,45.0059846],[-75.0798841,44.9802854],[-76.9023061,43.8024568],[-78.7623935,43.6249578],[-79.15798,43.4462589],[-79.0060087,42.8005317],[-82.662475,41.6889458],[-82.1761642,43.588535],[-83.2813977,46.138853],[-87.5064535,48.0142702],[-88.3492194,48.2963271],[-89.4353148,47.9837822],[-93.9981078,49.0067142],[-95.1105379,49.412004],[-96.0131199,49.0060547],[-123.3228926,49.0042878],[-123.2275233,48.1849927],[-124.7617886,48.4130148]],[[-160.5787616,22.5062947],[-160.5782192,21.4984647],[-158.7470604,21.2439843],[-157.5083185,20.995803],[-155.9961942,18.7790194],[-154.6217803,18.7586966],[-154.6890176,19.8805722],[-156.2927622,21.2225888],[-157.5047384,21.9984962],[-159.0093692,22.5070181],[-160.5787616,22.5062947]],[[-167.1571546,68.721974],[-164.8553982,67.0255078],[-168.002195,66.0017503],[-169.0087448,66.001546],[-169.0075381,64.9987675],[-172.5143281,63.8767267],[-173.8197023,59.74014],[-162.5018149,58.0005815],[-160.0159024,58.0012389],[-160.0149725,57.000035],[-160.5054788,56.9999017],[-165.8092575,54.824847],[-178.000097,52.2446469],[-177.9992996,51.2554252],[-171.4689067,51.8215329],[-162.40251,53.956664],[-159.0075717,55.002502],[-158.0190709,55.0027849],[-151.9963213,55.9991902],[-151.500341,57.9987853],[-151.5012894,58.9919816],[-138.5159989,58.9953194],[-138.5150471,57.9986434],[-133.9948193,54.0031685],[-130.0044418,54.0043387],[-130.0070826,57.0000507],[-131.975877,56.9995156],[-135.1229873,59.756601],[-138.0071813,59.991805],[-139.1715881,60.4127229],[-140.9874011,61.0118551],[-140.9683975,69.9535069],[-156.176891,71.5633329],[-160.413634,70.7397728],[-163.0218273,69.9707435],[-164.9717003,68.994689],[-167.1571546,68.721974]]]},{"id":"Zuerich-zh_uebersichtsplan-tms","name":"Übersichtsplan Zürich","type":"tms","template":"http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw","scaleExtent":[0,21],"polygon":[[[8.4482,47.321],[8.4482,47.4339],[8.6248,47.4339],[8.6248,47.321],[8.4482,47.321]]],"terms_text":"Stadt Zürich Open Government Data"},{"id":"USGS-Large_Scale","name":"USGS Large Scale Imagery","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg","scaleExtent":[12,20],"polygon":[[[-123.2549305,48.7529029],[-123.2549305,48.5592263],[-123.192224,48.5592263],[-123.192224,48.4348366],[-122.9419646,48.4348366],[-122.9419646,48.3720812],[-122.8806229,48.3720812],[-122.8806229,48.3094763],[-122.8167566,48.3094763],[-122.8167566,48.1904587],[-123.0041133,48.1904587],[-123.0041133,48.1275918],[-123.058416,48.1275918],[-123.058416,48.190514],[-123.254113,48.190514],[-123.254113,48.1274982],[-123.3706593,48.1274982],[-123.3706593,48.1908403],[-124.0582632,48.1908403],[-124.0582632,48.253442],[-124.1815163,48.253442],[-124.1815163,48.3164666],[-124.4319117,48.3164666],[-124.4319117,48.3782613],[-124.5564618,48.3782613],[-124.5564618,48.4408305],[-124.7555107,48.4408305],[-124.7555107,48.1914986],[-124.8185282,48.1914986],[-124.8185282,48.1228381],[-124.7552951,48.1228381],[-124.7552951,47.5535253],[-124.3812108,47.5535253],[-124.3812108,47.1218696],[-124.1928897,47.1218696],[-124.1928897,43.7569431],[-124.4443382,43.7569431],[-124.4443382,43.1425556],[-124.6398855,43.1425556],[-124.6398855,42.6194503],[-124.4438525,42.6194503],[-124.4438525,39.8080662],[-123.8815685,39.8080662],[-123.8815685,39.1102825],[-123.75805,39.1102825],[-123.75805,38.4968799],[-123.2702803,38.4968799],[-123.2702803,37.9331905],[-122.8148084,37.9331905],[-122.8148084,37.8019606],[-122.5664316,37.8019606],[-122.5664316,36.9319611],[-121.8784026,36.9319611],[-121.8784026,36.6897596],[-122.0034748,36.6897596],[-122.0034748,36.4341056],[-121.9414159,36.4341056],[-121.9414159,35.9297636],[-121.5040977,35.9297636],[-121.5040977,35.8100273],[-121.3790276,35.8100273],[-121.3790276,35.4239164],[-120.9426515,35.4239164],[-120.9426515,35.1849683],[-120.8171978,35.1849683],[-120.8171978,35.1219894],[-120.6918447,35.1219894],[-120.6918447,34.4966794],[-120.5045898,34.4966794],[-120.5045898,34.4339651],[-120.0078775,34.4339651],[-120.0078775,34.3682626],[-119.5283517,34.3682626],[-119.5283517,34.0576434],[-119.0060985,34.0576434],[-119.0060985,33.9975267],[-118.5046259,33.9975267],[-118.5046259,33.8694631],[-118.4413209,33.8694631],[-118.4413209,33.6865253],[-118.066912,33.6865253],[-118.066912,33.3063832],[-117.5030045,33.3063832],[-117.5030045,33.0500337],[-117.3188195,33.0500337],[-117.3188195,32.6205888],[-117.1917023,32.6205888],[-117.1917023,32.4974566],[-116.746496,32.4974566],[-116.746496,32.5609161],[-115.9970138,32.5609161],[-115.9970138,32.6264942],[-114.8808125,32.6264942],[-114.8808125,32.4340796],[-114.6294474,32.4340796],[-114.6294474,32.3731636],[-114.4447437,32.3731636],[-114.4447437,32.3075418],[-114.2557628,32.3075418],[-114.2557628,32.2444561],[-114.0680274,32.2444561],[-114.0680274,32.1829113],[-113.8166499,32.1829113],[-113.8166499,32.1207622],[-113.6307421,32.1207622],[-113.6307421,32.0565099],[-113.4417495,32.0565099],[-113.4417495,31.9984372],[-113.2546027,31.9984372],[-113.2546027,31.9325434],[-113.068072,31.9325434],[-113.068072,31.8718062],[-112.8161105,31.8718062],[-112.8161105,31.8104171],[-112.6308756,31.8104171],[-112.6308756,31.7464723],[-112.4418918,31.7464723],[-112.4418918,31.6856001],[-112.257192,31.6856001],[-112.257192,31.6210352],[-112.0033787,31.6210352],[-112.0033787,31.559584],[-111.815619,31.559584],[-111.815619,31.4970238],[-111.6278586,31.4970238],[-111.6278586,31.4339867],[-111.4418978,31.4339867],[-111.4418978,31.3733859],[-111.2559708,31.3733859],[-111.2559708,31.3113225],[-108.1845822,31.3113225],[-108.1845822,31.7459502],[-106.5065055,31.7459502],[-106.5065055,31.6842308],[-106.3797265,31.6842308],[-106.3797265,31.621752],[-106.317434,31.621752],[-106.317434,31.4968167],[-106.2551769,31.4968167],[-106.2551769,31.4344889],[-106.1924698,31.4344889],[-106.1924698,31.3721296],[-106.0039212,31.3721296],[-106.0039212,31.309328],[-105.9416582,31.309328],[-105.9416582,31.2457547],[-105.8798174,31.2457547],[-105.8798174,31.1836194],[-105.8162349,31.1836194],[-105.8162349,31.1207155],[-105.6921198,31.1207155],[-105.6921198,31.0584835],[-105.6302881,31.0584835],[-105.6302881,30.9328271],[-105.5044418,30.9328271],[-105.5044418,30.8715864],[-105.4412973,30.8715864],[-105.4412973,30.808463],[-105.3781497,30.808463],[-105.3781497,30.7471828],[-105.1904658,30.7471828],[-105.1904658,30.6843231],[-105.1286244,30.6843231],[-105.1286244,30.6199737],[-105.0036504,30.6199737],[-105.0036504,30.5589058],[-104.9417962,30.5589058],[-104.9417962,30.4963236],[-104.8782018,30.4963236],[-104.8782018,30.3098261],[-104.8155257,30.3098261],[-104.8155257,30.2478305],[-104.7536079,30.2478305],[-104.7536079,29.9353916],[-104.690949,29.9353916],[-104.690949,29.8090156],[-104.6291301,29.8090156],[-104.6291301,29.6843577],[-104.5659869,29.6843577],[-104.5659869,29.6223459],[-104.5037188,29.6223459],[-104.5037188,29.5595436],[-104.4410072,29.5595436],[-104.4410072,29.4974832],[-104.2537551,29.4974832],[-104.2537551,29.3716718],[-104.1291984,29.3716718],[-104.1291984,29.3091621],[-104.0688737,29.3091621],[-104.0688737,29.2467276],[-103.8187309,29.2467276],[-103.8187309,29.1843076],[-103.755736,29.1843076],[-103.755736,29.1223174],[-103.5667542,29.1223174],[-103.5667542,29.0598119],[-103.5049819,29.0598119],[-103.5049819,28.9967506],[-103.3165753,28.9967506],[-103.3165753,28.9346923],[-103.0597572,28.9346923],[-103.0597572,29.0592965],[-102.9979694,29.0592965],[-102.9979694,29.1212855],[-102.9331397,29.1212855],[-102.9331397,29.1848575],[-102.8095989,29.1848575],[-102.8095989,29.2526154],[-102.8701345,29.2526154],[-102.8701345,29.308096],[-102.8096681,29.308096],[-102.8096681,29.3715484],[-102.7475655,29.3715484],[-102.7475655,29.5581899],[-102.684554,29.5581899],[-102.684554,29.6847655],[-102.4967764,29.6847655],[-102.4967764,29.7457694],[-102.3086647,29.7457694],[-102.3086647,29.8086627],[-102.1909323,29.8086627],[-102.1909323,29.7460097],[-101.5049914,29.7460097],[-101.5049914,29.6846777],[-101.3805796,29.6846777],[-101.3805796,29.5594459],[-101.3175057,29.5594459],[-101.3175057,29.4958934],[-101.1910075,29.4958934],[-101.1910075,29.4326115],[-101.067501,29.4326115],[-101.067501,29.308808],[-100.9418897,29.308808],[-100.9418897,29.2456231],[-100.8167271,29.2456231],[-100.8167271,29.1190449],[-100.7522672,29.1190449],[-100.7522672,29.0578214],[-100.6925358,29.0578214],[-100.6925358,28.8720431],[-100.6290158,28.8720431],[-100.6290158,28.8095363],[-100.5679901,28.8095363],[-100.5679901,28.622554],[-100.5040411,28.622554],[-100.5040411,28.5583804],[-100.4421832,28.5583804],[-100.4421832,28.4968266],[-100.379434,28.4968266],[-100.379434,28.3092865],[-100.3171942,28.3092865],[-100.3171942,28.1835681],[-100.254483,28.1835681],[-100.254483,28.1213885],[-100.1282282,28.1213885],[-100.1282282,28.059215],[-100.0659537,28.059215],[-100.0659537,27.9966087],[-100.0023855,27.9966087],[-100.0023855,27.9332152],[-99.9426497,27.9332152],[-99.9426497,27.7454658],[-99.816851,27.7454658],[-99.816851,27.6834301],[-99.7541346,27.6834301],[-99.7541346,27.6221543],[-99.6291629,27.6221543],[-99.6291629,27.5588977],[-99.5672838,27.5588977],[-99.5672838,27.4353752],[-99.5041798,27.4353752],[-99.5041798,27.3774021],[-99.5671796,27.3774021],[-99.5671796,27.2463726],[-99.504975,27.2463726],[-99.504975,26.9965649],[-99.4427427,26.9965649],[-99.4427427,26.872803],[-99.3800633,26.872803],[-99.3800633,26.8068179],[-99.3190684,26.8068179],[-99.3190684,26.7473614],[-99.2537541,26.7473614],[-99.2537541,26.6210068],[-99.1910617,26.6210068],[-99.1910617,26.4956737],[-99.1300639,26.4956737],[-99.1300639,26.3713808],[-99.0029473,26.3713808],[-99.0029473,26.3093836],[-98.816572,26.3093836],[-98.816572,26.2457762],[-98.6920082,26.2457762],[-98.6920082,26.1837096],[-98.4440896,26.1837096],[-98.4440896,26.1217217],[-98.3823181,26.1217217],[-98.3823181,26.0596488],[-98.2532707,26.0596488],[-98.2532707,25.9986871],[-98.0109084,25.9986871],[-98.0109084,25.9932255],[-97.6932319,25.9932255],[-97.6932319,25.9334103],[-97.6313904,25.9334103],[-97.6313904,25.8695893],[-97.5046779,25.8695893],[-97.5046779,25.8073488],[-97.3083401,25.8073488],[-97.3083401,25.8731159],[-97.2456326,25.8731159],[-97.2456326,25.9353731],[-97.1138939,25.9353731],[-97.1138939,27.6809179],[-97.0571035,27.6809179],[-97.0571035,27.8108242],[-95.5810766,27.8108242],[-95.5810766,28.7468827],[-94.271041,28.7468827],[-94.271041,29.5594076],[-92.5029947,29.5594076],[-92.5029947,29.4974754],[-91.8776216,29.4974754],[-91.8776216,29.3727013],[-91.378418,29.3727013],[-91.378418,29.2468326],[-91.3153953,29.2468326],[-91.3153953,29.1844301],[-91.1294702,29.1844301],[-91.1294702,29.1232559],[-91.0052632,29.1232559],[-91.0052632,28.9968437],[-89.4500159,28.9968437],[-89.4500159,28.8677422],[-88.8104309,28.8677422],[-88.8104309,30.1841864],[-85.8791527,30.1841864],[-85.8791527,29.5455038],[-84.8368083,29.5455038],[-84.8368083,29.6225158],[-84.7482786,29.6225158],[-84.7482786,29.683624],[-84.685894,29.683624],[-84.685894,29.7468386],[-83.6296975,29.7468386],[-83.6296975,29.4324361],[-83.3174937,29.4324361],[-83.3174937,29.0579442],[-82.879659,29.0579442],[-82.879659,27.7453529],[-82.8182822,27.7453529],[-82.8182822,26.9290868],[-82.3796782,26.9290868],[-82.3796782,26.3694183],[-81.8777106,26.3694183],[-81.8777106,25.805971],[-81.5036862,25.805971],[-81.5036862,25.7474753],[-81.4405462,25.7474753],[-81.4405462,25.6851489],[-81.3155883,25.6851489],[-81.3155883,25.5600985],[-81.2538534,25.5600985],[-81.2538534,25.4342361],[-81.1902012,25.4342361],[-81.1902012,25.1234341],[-81.1288133,25.1234341],[-81.1288133,25.0619389],[-81.0649231,25.0619389],[-81.0649231,24.8157807],[-81.6289469,24.8157807],[-81.6289469,24.7538367],[-81.6907173,24.7538367],[-81.6907173,24.6899374],[-81.8173189,24.6899374],[-81.8173189,24.6279161],[-82.1910041,24.6279161],[-82.1910041,24.496294],[-81.6216596,24.496294],[-81.6216596,24.559484],[-81.372006,24.559484],[-81.372006,24.6220687],[-81.0593278,24.6220687],[-81.0593278,24.684826],[-80.9347147,24.684826],[-80.9347147,24.7474828],[-80.7471081,24.7474828],[-80.7471081,24.8100618],[-80.3629898,24.8100618],[-80.3629898,25.1175858],[-80.122344,25.1175858],[-80.122344,25.7472357],[-80.0588458,25.7472357],[-80.0588458,26.3708251],[-79.995837,26.3708251],[-79.995837,26.9398003],[-80.0587265,26.9398003],[-80.0587265,27.1277466],[-80.1226251,27.1277466],[-80.1226251,27.2534279],[-80.1846956,27.2534279],[-80.1846956,27.3781229],[-80.246175,27.3781229],[-80.246175,27.5658729],[-80.3094768,27.5658729],[-80.3094768,27.7530311],[-80.3721485,27.7530311],[-80.3721485,27.8774451],[-80.4351457,27.8774451],[-80.4351457,28.0033366],[-80.4966078,28.0033366],[-80.4966078,28.1277326],[-80.5587159,28.1277326],[-80.5587159,28.3723509],[-80.4966335,28.3723509],[-80.4966335,29.5160326],[-81.1213644,29.5160326],[-81.1213644,31.6846966],[-80.6018723,31.6846966],[-80.6018723,32.2475309],[-79.4921024,32.2475309],[-79.4921024,32.9970261],[-79.1116488,32.9970261],[-79.1116488,33.3729457],[-78.6153621,33.3729457],[-78.6153621,33.8097638],[-77.9316963,33.8097638],[-77.9316963,33.8718243],[-77.8692252,33.8718243],[-77.8692252,34.0552454],[-77.6826392,34.0552454],[-77.6826392,34.2974598],[-77.2453509,34.2974598],[-77.2453509,34.5598585],[-76.4973277,34.5598585],[-76.4973277,34.622796],[-76.4337602,34.622796],[-76.4337602,34.6849285],[-76.373212,34.6849285],[-76.373212,34.7467674],[-76.3059364,34.7467674],[-76.3059364,34.808551],[-76.2468017,34.808551],[-76.2468017,34.8728418],[-76.1825922,34.8728418],[-76.1825922,34.9335332],[-76.120814,34.9335332],[-76.120814,34.9952359],[-75.9979015,34.9952359],[-75.9979015,35.0578182],[-75.870338,35.0578182],[-75.870338,35.1219097],[-75.7462194,35.1219097],[-75.7462194,35.1818911],[-75.4929694,35.1818911],[-75.4929694,35.3082988],[-75.4325662,35.3082988],[-75.4325662,35.7542495],[-75.4969907,35.7542495],[-75.4969907,37.8105602],[-75.3082972,37.8105602],[-75.3082972,37.8720088],[-75.245601,37.8720088],[-75.245601,37.9954849],[-75.1828751,37.9954849],[-75.1828751,38.0585079],[-75.1184793,38.0585079],[-75.1184793,38.2469091],[-75.0592098,38.2469091],[-75.0592098,38.3704316],[-74.9948111,38.3704316],[-74.9948111,38.8718417],[-74.4878252,38.8718417],[-74.4878252,39.3089428],[-74.1766317,39.3089428],[-74.1766317,39.6224653],[-74.0567045,39.6224653],[-74.0567045,39.933178],[-73.9959035,39.933178],[-73.9959035,40.1854852],[-73.9341593,40.1854852],[-73.9341593,40.4959486],[-73.8723024,40.4959486],[-73.8723024,40.5527135],[-71.8074506,40.5527135],[-71.8074506,41.3088005],[-70.882512,41.3088005],[-70.882512,41.184978],[-70.7461947,41.184978],[-70.7461947,41.3091865],[-70.4337553,41.3091865],[-70.4337553,41.4963885],[-69.9334281,41.4963885],[-69.9334281,41.6230802],[-69.869857,41.6230802],[-69.869857,41.8776895],[-69.935791,41.8776895],[-69.935791,42.0032342],[-69.9975823,42.0032342],[-69.9975823,42.0650191],[-70.0606103,42.0650191],[-70.0606103,42.1294348],[-70.5572884,42.1294348],[-70.5572884,43.2487079],[-70.4974097,43.2487079],[-70.4974097,43.3092194],[-70.3704249,43.3092194],[-70.3704249,43.371963],[-70.3085701,43.371963],[-70.3085701,43.4969879],[-70.183921,43.4969879],[-70.183921,43.6223531],[-70.057583,43.6223531],[-70.057583,43.6850173],[-69.7455247,43.6850173],[-69.7455247,43.7476571],[-69.2472845,43.7476571],[-69.2472845,43.8107035],[-69.0560701,43.8107035],[-69.0560701,43.8717247],[-68.9950522,43.8717247],[-68.9950522,43.9982022],[-68.4963672,43.9982022],[-68.4963672,44.0597368],[-68.3081038,44.0597368],[-68.3081038,44.122137],[-68.1851802,44.122137],[-68.1851802,44.3081382],[-67.9956019,44.3081382],[-67.9956019,44.3727489],[-67.8103041,44.3727489],[-67.8103041,44.435178],[-67.4965289,44.435178],[-67.4965289,44.4968776],[-67.37102,44.4968776],[-67.37102,44.5600642],[-67.1848753,44.5600642],[-67.1848753,44.6213345],[-67.1221208,44.6213345],[-67.1221208,44.6867918],[-67.059365,44.6867918],[-67.059365,44.7473657],[-66.9311098,44.7473657],[-66.9311098,44.9406566],[-66.994683,44.9406566],[-66.994683,45.0024514],[-67.0595847,45.0024514],[-67.0595847,45.1273377],[-67.1201974,45.1273377],[-67.1201974,45.1910115],[-67.2469811,45.1910115],[-67.2469811,45.253442],[-67.3177546,45.253442],[-67.3177546,45.1898369],[-67.370749,45.1898369],[-67.370749,45.2534001],[-67.4326888,45.2534001],[-67.4326888,45.3083409],[-67.3708571,45.3083409],[-67.3708571,45.4396986],[-67.4305573,45.4396986],[-67.4305573,45.4950095],[-67.37099,45.4950095],[-67.37099,45.6264543],[-67.6214982,45.6264543],[-67.6214982,45.6896133],[-67.683828,45.6896133],[-67.683828,45.753259],[-67.7462097,45.753259],[-67.7462097,47.1268165],[-67.8700141,47.1268165],[-67.8700141,47.1900278],[-67.9323803,47.1900278],[-67.9323803,47.2539678],[-67.9959387,47.2539678],[-67.9959387,47.3149737],[-68.1206676,47.3149737],[-68.1206676,47.3780823],[-68.4423175,47.3780823],[-68.4423175,47.3166082],[-68.6314305,47.3166082],[-68.6314305,47.2544676],[-68.9978037,47.2544676],[-68.9978037,47.439895],[-69.0607223,47.439895],[-69.0607223,47.5047558],[-69.2538122,47.5047558],[-69.2538122,47.4398084],[-69.3179284,47.4398084],[-69.3179284,47.378601],[-69.4438546,47.378601],[-69.4438546,47.3156274],[-69.5038204,47.3156274],[-69.5038204,47.2525839],[-69.5667838,47.2525839],[-69.5667838,47.1910884],[-69.6303478,47.1910884],[-69.6303478,47.128701],[-69.6933103,47.128701],[-69.6933103,47.0654307],[-69.7557063,47.0654307],[-69.7557063,47.0042751],[-69.8180391,47.0042751],[-69.8180391,46.9415344],[-69.8804023,46.9415344],[-69.8804023,46.8792519],[-69.9421674,46.8792519],[-69.9421674,46.8177399],[-70.0063088,46.8177399],[-70.0063088,46.6920295],[-70.0704265,46.6920295],[-70.0704265,46.4425926],[-70.1945902,46.4425926],[-70.1945902,46.3785887],[-70.2562047,46.3785887],[-70.2562047,46.3152628],[-70.3203651,46.3152628],[-70.3203651,46.0651209],[-70.3814988,46.0651209],[-70.3814988,45.93552],[-70.3201618,45.93552],[-70.3201618,45.879479],[-70.4493131,45.879479],[-70.4493131,45.7538713],[-70.5070021,45.7538713],[-70.5070021,45.6916912],[-70.6316642,45.6916912],[-70.6316642,45.6291619],[-70.7575538,45.6291619],[-70.7575538,45.4414685],[-70.8809878,45.4414685],[-70.8809878,45.3780612],[-71.13328,45.3780612],[-71.13328,45.3151452],[-71.3830282,45.3151452],[-71.3830282,45.253416],[-71.5076448,45.253416],[-71.5076448,45.0655726],[-73.9418929,45.0655726],[-73.9418929,45.0031242],[-74.7469725,45.0031242],[-74.7469725,45.0649003],[-74.8800964,45.0649003],[-74.8800964,45.0029023],[-75.0662455,45.0029023],[-75.0662455,44.9415167],[-75.2539363,44.9415167],[-75.2539363,44.8776043],[-75.3789648,44.8776043],[-75.3789648,44.8153462],[-75.4431283,44.8153462],[-75.4431283,44.7536053],[-75.5666566,44.7536053],[-75.5666566,44.6909879],[-75.6290205,44.6909879],[-75.6290205,44.6284958],[-75.7540484,44.6284958],[-75.7540484,44.566385],[-75.817312,44.566385],[-75.817312,44.5028932],[-75.8799549,44.5028932],[-75.8799549,44.3784946],[-76.1300319,44.3784946],[-76.1300319,44.3159227],[-76.1926961,44.3159227],[-76.1926961,44.2534378],[-76.3182619,44.2534378],[-76.3182619,44.1916726],[-76.3792975,44.1916726],[-76.3792975,44.0653733],[-76.4427584,44.0653733],[-76.4427584,43.9963825],[-76.317027,43.9963825],[-76.317027,43.9414581],[-76.5076611,43.9414581],[-76.5076611,43.8723335],[-76.3829974,43.8723335],[-76.3829974,43.8091872],[-76.2534102,43.8091872],[-76.2534102,43.5665222],[-76.5064833,43.5665222],[-76.5064833,43.5033881],[-76.6331208,43.5033881],[-76.6331208,43.4432252],[-76.6951085,43.4432252],[-76.6951085,43.3786858],[-76.8177798,43.3786858],[-76.8177798,43.318066],[-77.682,43.318066],[-77.682,43.3789376],[-78.0565883,43.3789376],[-78.0565883,43.4396918],[-78.4389748,43.4396918],[-78.4389748,43.3794382],[-78.8803396,43.3794382],[-78.8803396,43.3149724],[-79.1298858,43.3149724],[-79.1298858,43.2429286],[-79.0669615,43.2429286],[-79.0669615,43.1299931],[-79.1298858,43.1299931],[-79.1298858,43.0577305],[-79.071264,43.0577305],[-79.071264,42.9294906],[-78.943264,42.9294906],[-78.943264,42.7542165],[-79.069439,42.7542165],[-79.069439,42.6941622],[-79.133439,42.6941622],[-79.133439,42.6296973],[-79.1947499,42.6296973],[-79.1947499,42.5663538],[-79.3786827,42.5663538],[-79.3786827,42.5033425],[-79.4442961,42.5033425],[-79.4442961,42.4410614],[-79.5679936,42.4410614],[-79.5679936,42.3775264],[-79.6906154,42.3775264],[-79.6906154,42.3171086],[-79.8164642,42.3171086],[-79.8164642,42.2534481],[-80.0052373,42.2534481],[-80.0052373,42.1909188],[-80.1916829,42.1909188],[-80.1916829,42.1272555],[-80.3167992,42.1272555],[-80.3167992,42.0669857],[-80.5063234,42.0669857],[-80.5063234,42.0034331],[-80.6930471,42.0034331],[-80.6930471,41.9415141],[-80.9440403,41.9415141],[-80.9440403,41.8781193],[-81.1942729,41.8781193],[-81.1942729,41.8166455],[-81.3190089,41.8166455],[-81.3190089,41.7545453],[-81.4418435,41.7545453],[-81.4418435,41.690965],[-81.5053523,41.690965],[-81.5053523,41.6301643],[-82.7470081,41.6301643],[-82.7470081,41.7536942],[-82.8839135,41.7536942],[-82.8839135,41.5656075],[-82.9957195,41.5656075],[-82.9957195,41.6270375],[-83.1257796,41.6270375],[-83.1257796,41.6878411],[-83.2474733,41.6878411],[-83.2474733,41.7536942],[-83.3737305,41.7536942],[-83.3737305,41.809276],[-83.3106019,41.809276],[-83.3106019,41.8716064],[-83.2474733,41.8716064],[-83.2474733,41.9361393],[-83.1843447,41.9361393],[-83.1843447,41.9960851],[-83.1207681,41.9960851],[-83.1207681,42.2464812],[-83.0589194,42.2464812],[-83.0589194,42.3089555],[-82.8685328,42.3089555],[-82.8685328,42.3717652],[-82.8072219,42.3717652],[-82.8072219,42.558553],[-82.7553745,42.558553],[-82.7553745,42.4954945],[-82.5599041,42.4954945],[-82.5599041,42.558553],[-82.4967755,42.558553],[-82.4967755,42.6833607],[-82.4328863,42.6833607],[-82.4328863,42.9342196],[-82.3700552,42.9342196],[-82.3700552,43.0648071],[-82.4328863,43.0648071],[-82.4328863,43.1917566],[-82.4947464,43.1917566],[-82.4947464,43.5034627],[-82.557133,43.5034627],[-82.557133,43.8160901],[-82.6197884,43.8160901],[-82.6197884,43.9422098],[-82.6839499,43.9422098],[-82.6839499,44.0022641],[-82.7465346,44.0022641],[-82.7465346,44.0670545],[-82.8708696,44.0670545],[-82.8708696,44.1291935],[-83.008517,44.1291935],[-83.008517,44.0664786],[-83.1336086,44.0664786],[-83.1336086,44.0053949],[-83.2414522,44.0053949],[-83.2414522,44.9962034],[-83.1806112,44.9962034],[-83.1806112,45.067302],[-83.2455172,45.067302],[-83.2455172,45.1287382],[-83.3065878,45.1287382],[-83.3065878,45.2551509],[-83.3706087,45.2551509],[-83.3706087,45.3165923],[-83.4325644,45.3165923],[-83.4325644,45.3792105],[-83.6178415,45.3792105],[-83.6178415,45.4419665],[-83.8084291,45.4419665],[-83.8084291,45.5036189],[-84.0550718,45.5036189],[-84.0550718,45.5647907],[-84.1235181,45.5647907],[-84.1235181,45.6287845],[-84.1807534,45.6287845],[-84.1807534,45.6914688],[-84.3111554,45.6914688],[-84.3111554,45.9337076],[-83.8209974,45.9337076],[-83.8209974,45.8725113],[-83.4968086,45.8725113],[-83.4968086,45.9337076],[-83.4338066,45.9337076],[-83.4338066,46.0016863],[-83.4962697,46.0016863],[-83.4962697,46.0668178],[-83.5599956,46.0668178],[-83.5599956,46.1261576],[-83.9954558,46.1261576],[-83.9954558,46.1931747],[-84.0591816,46.1931747],[-84.0591816,46.3814972],[-84.1152614,46.3814972],[-84.1152614,46.4953584],[-84.0591816,46.4953584],[-84.0591816,46.5682653],[-84.2579545,46.5682653],[-84.2579545,46.5051232],[-84.3071879,46.5051232],[-84.3071879,46.5682653],[-84.4415364,46.5682653],[-84.4415364,46.504525],[-84.9965729,46.504525],[-84.9965729,46.6842882],[-84.9298158,46.6842882],[-84.9298158,46.818077],[-85.3165894,46.818077],[-85.3165894,46.7535825],[-87.5562645,46.7535825],[-87.5562645,47.4407371],[-87.6825361,47.4407371],[-87.6825361,47.5035554],[-88.2560738,47.5035554],[-88.2560738,47.4433716],[-88.4417419,47.4433716],[-88.4417419,47.3789949],[-88.50683,47.3789949],[-88.50683,47.3153881],[-88.6312821,47.3153881],[-88.6312821,47.2539782],[-88.7569636,47.2539782],[-88.7569636,47.1934682],[-88.8838253,47.1934682],[-88.8838253,47.1284735],[-88.9434208,47.1284735],[-88.9434208,47.0662127],[-89.0708726,47.0662127],[-89.0708726,47.0026826],[-89.2565553,47.0026826],[-89.2565553,46.9410806],[-90.3677669,46.9410806],[-90.3677669,47.6844827],[-90.3069978,47.6844827],[-90.3069978,47.7460174],[-89.994859,47.7460174],[-89.994859,47.8082719],[-89.8048615,47.8082719],[-89.8048615,47.8700562],[-89.6797699,47.8700562],[-89.6797699,47.9339637],[-89.4933757,47.9339637],[-89.4933757,47.9957956],[-89.4284697,47.9957956],[-89.4284697,48.0656377],[-89.9932739,48.0656377],[-89.9932739,48.1282966],[-90.7455933,48.1282966],[-90.7455933,48.1893056],[-90.8087291,48.1893056],[-90.8087291,48.2522065],[-91.067763,48.2522065],[-91.067763,48.1916658],[-91.1946247,48.1916658],[-91.1946247,48.1279027],[-91.6814196,48.1279027],[-91.6814196,48.2525994],[-91.9321927,48.2525994],[-91.9321927,48.3142454],[-91.9929683,48.3142454],[-91.9929683,48.3780845],[-92.3189383,48.3780845],[-92.3189383,48.2529081],[-92.3732233,48.2529081],[-92.3732233,48.3153385],[-92.4322288,48.3153385],[-92.4322288,48.4411448],[-92.4977248,48.4411448],[-92.4977248,48.501781],[-92.5679413,48.501781],[-92.5679413,48.439579],[-92.6210462,48.439579],[-92.6210462,48.5650783],[-92.8086835,48.5650783],[-92.8086835,48.6286865],[-92.8086835,48.6267365],[-92.933185,48.6267365],[-92.933185,48.6922145],[-93.0051716,48.6922145],[-93.0051716,48.6282965],[-93.1225924,48.6282965],[-93.1225924,48.6922145],[-93.3190806,48.6922145],[-93.3190806,48.6267365],[-93.5049477,48.6267365],[-93.5049477,48.5635164],[-93.7474601,48.5635164],[-93.7474601,48.6267365],[-93.8135461,48.6267365],[-93.8135461,48.6898775],[-94.2453121,48.6898775],[-94.2453121,48.7554327],[-94.6183171,48.7554327],[-94.6183171,48.941036],[-94.6809018,48.941036],[-94.6809018,49.0029737],[-94.7441532,49.0029737],[-94.7441532,49.2536079],[-94.8084069,49.2536079],[-94.8084069,49.3784134],[-95.1192391,49.3784134],[-95.1192391,49.4425264],[-95.1934341,49.4425264],[-95.1934341,49.0035292],[-96.87069,49.0035292],[-96.87069,49.0656063],[-99.0049312,49.0656063],[-99.0049312,49.0050714],[-109.3699257,49.0050714],[-109.3699257,49.0668231],[-109.5058746,49.0668231],[-109.5058746,49.0050714],[-114.1830014,49.0050714],[-114.1830014,49.0687317],[-114.7578709,49.0687317],[-114.7578709,49.0050714],[-115.433731,49.0050714],[-115.433731,49.0671412],[-116.5062706,49.0671412],[-116.5062706,49.0050714],[-117.3089504,49.0050714],[-117.3089504,49.0659803],[-119.882945,49.0659803],[-119.882945,49.0050714],[-120.1208555,49.0050714],[-120.1208555,49.0678367],[-121.4451636,49.0678367],[-121.4451636,49.0050714],[-121.9311808,49.0050714],[-121.9311808,49.0656099],[-122.817484,49.0656099],[-122.817484,49.0029143],[-122.8795155,49.0029143],[-122.8795155,48.9347018],[-122.8174629,48.9347018],[-122.8174629,48.8101998],[-122.7538859,48.8101998],[-122.7538859,48.7533758],[-122.8712937,48.7533758],[-122.8712937,48.8153948],[-123.0055391,48.8153948],[-123.0055391,48.7529529],[-123.1296926,48.7529529],[-123.1296926,48.6902201],[-123.1838197,48.6902201],[-123.1838197,48.7529029],[-123.2549305,48.7529029]],[[-122.9341743,37.7521547],[-122.9347457,37.6842013],[-123.0679013,37.6849023],[-123.0673747,37.7475251],[-123.1292603,37.7478506],[-123.1286894,37.815685],[-123.0590687,37.8153192],[-123.0595947,37.7528143],[-122.9341743,37.7521547]],[[-71.6299464,41.2540893],[-71.4966465,41.2541393],[-71.4965596,41.122965],[-71.6298594,41.1229149],[-71.6299464,41.2540893]],[[-70.3184265,41.3775196],[-70.3183384,41.2448243],[-70.1906612,41.2448722],[-70.1906239,41.1886019],[-69.9336025,41.1886984],[-69.933729,41.3791941],[-69.9950664,41.3791712],[-69.995109,41.443159],[-70.0707828,41.4431307],[-70.0706972,41.3144915],[-70.2461667,41.3144258],[-70.2462087,41.3775467],[-70.3184265,41.3775196]],[[-68.9403374,43.9404062],[-68.6856948,43.9404977],[-68.6856475,43.8721797],[-68.7465405,43.8721577],[-68.7464976,43.8102529],[-68.8090782,43.8102304],[-68.8090343,43.746728],[-68.8773094,43.7467034],[-68.8773544,43.8117826],[-68.9402483,43.8117599],[-68.9403374,43.9404062]],[[-123.1291466,49.0645144],[-122.9954224,49.0645144],[-122.9954224,48.9343243],[-123.1291466,48.9343243],[-123.1291466,49.0645144]],[[-82.9407144,24.7535913],[-82.8719398,24.7535913],[-82.8719398,24.6905653],[-82.7446233,24.6905653],[-82.7446233,24.6214593],[-82.8088038,24.6214593],[-82.8088038,24.5594908],[-82.9407144,24.5594908],[-82.9407144,24.7535913]]],"icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAA2CAYAAACCwNb3AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAcppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGFpbnQuTkVUIHYzLjMwPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgofPyfmAABAAElEQVR4AeW9B4AURfY/Xt3TEzdHYMk5I7KICKILhwE8DCe7eieiomRByRmGjKCAIHhgjl+PNUc4UVZEggKSdsmwsMuyOU0O3f3/vJqZZcPMgnfeHf5/BbMz3V3hVdVL9erVa6HNhEciCxS7VtBJKvsDJlWUxCjFa8tdk+6oD/zU1ZOMhyttYXYmK1EhMlbgfnudQWgd161y8+jRnhDZgt6+ZdIkY0nU71N/ijlFyjBneAMNTX/3lSZH8k51u1RR0i3KFHZTvrUy9qy13NWvVbtebkWJ0agq0yusdH9+zv5u0Ym4YgfCw0wHY6Lj93zw5Iw8fz2C2WymjxKo91q/U8xmwGOugufhDUuaFpcV9XJ53T0kSUo+VFooJIaHxSXGxifbnE4lwWASL5cUHRA1YmmEVn/Crsjfx2gjD26f+dzFQJu16wzcv4ZvAWU1AXhUVRWGvrSwvdNj73uxorhNpGTofryiSDIJGm2HpOZ9y1wOKdxoYnar9ezlyuKzbSITbSqTf0mMitvfuVW7febBwyp5mykpEtuxQ2aCUIMOhEaTH/qkQHEOEgShHE801wDg9ZNFELwiY4lhXmFWxbqPVzIgFquGWARoYCJ6zRsz/YS9eLmLqYUCE6SanVDQcZHZFK/S0RQZ0a998p2bhz+zK3XLFk16WppcM2+tK3+bzab9dXqx4lmuoH7G6yc8BHQ8+euXPUq3sNiI/sm33vniX54MVr/AUlNFlp4uY+LFQatn/i2nrDDV7XGnWEQlslRRmFslcFSmEUQmW0DSCtEDkkYjaMIjQP4K00sSixAEZnSzypjwyB/ijNEv7pix8jvKVpv46F49qQY8dzw3+eFiS8UTZV5H3wqmGB3AFpfHwzSihsn4ZjYrANMIzOtVWUSEwACHiH9hBItXsbUMiz5q0Bs3Z8x68U3gG8Etms1mhs81EW31+Xj2/15u8ePJQ0MdLucjFtndzY4JLGcKk71eJogiU1VUSeMjAEhZVpnBIIh6I3IoLAxwxSoahju5kTrjBze37v76xuHjj9M4ABaCqQoeSRZZnKLX6ZnL24CJAo29L+HndZcCsAUAAzKoJgNTLe5wfivPUgdqS14ev2cTvOF2o1b02uwNGQawdhIxcEzxMlmnZS7Fq6/9POS1v02rIKN+CVTmRP0BMK7QFq9f9TJFr2Gq7KlbPzghZhP/0+XUF+c/0Hn248suM1eHMsDE3G7MiwAABUUEshHXlAVZNRjCNRgS0Dv+qEx1uj2YTgFI62Iuqk9kkTkO75A4Z+WQ3gvHfZPcptPYDY88fSGllkQI2jcqj7aIWAmeboDnEuAplQGLB/3i8DBFgzyyCiIBxmvDIjWEWVoUdCqKrLhloKnMLCB2C+ik0F7SO8yl7d1yxrBpf14zd/6Xk5Z8CGRk1RE/KCy4mboltYpZ3WoeN/Orw7tm54tyhMXtBAFgFDAk6LpK40NEIAJ+ozFSQ2oApgMPMbser0Izb0MZG7IC6CaS4J5qObFv8i2Lx5n3zNu4mIgjNRVtod8EC8ZTcDMvuqUyD2c/CrCOPsSKrrdPADb/N6bPrQHsXoFh1pCSImqTEItISuL38Ac4RdOH/tII1voncJYjYAyIO0uU8dqSv01JEWWR1w9YatVN17x+jLEqY9xFQvZqyYeMKk1wj/mjVu68fPrjLE9lhzK73Su4vV5R0CjAP8J9AKZKQF2S9JJTVQQXUNCFqaLfdI+eUz4BhVBEofIlDoey11Yw6LvMX44OXD+vawbUJSKSahDU/AkuCrygcVP7LRy7cmfB6Y+PeiwdSh12r+hRILUFFXjI4ZH97eFbAxgg4RRmg5Sja9As2uDwiETAohe6sNPpzVbtHQ8VZ6cPWDZpM4idIz4RSU0grlz5iCNdNn/9bpOOsx//6ainbPlppyXCYnd60EMZRKFidDSB8aE2MRoamx8eECvzKIpI8ND4YCwlEWJGVETF63B7TtnKxJ/txYtuXTx+16a8/SYiDhAK56KiqoCSiFOAygHSH+OjchkAWAXZi5HHyISUIIFhJlGPAaREncVFrQ/q5GPgyxMo9tu+r1a/jyHVrRMzRjdbTRu2MdNbOa3Abge5qSAMkRaGErQoTO5vSxy7feWADCAXj+w+4ayIyL6UvWfEO2vbE5EQ4gWpVWBmM2+uzYxhG391l00rsNkUjax4UQ1xDvpw6glSNuQtVEhcAcQrSBr0Ldda6f3eljdyyJrZu8+rqoFU2QBSVq8kQBxzvtjS+Lv9Px077i7vU2FzeCTONJgWCE9S6zfBQ51DGXw4zmslUaPKDrd7l62g73tvvfVPah+wUBbQXSCBewV+Xu/fYAHgCYpXlURje8HA+sY32U0wpw5sRZ2qJ/072F9PtVWPfnv9yaNGaVFc6b1o/OwigzLW5XC4RfB+dIS4YNBEtykLvmX6gMNx1SFoZtykjJhcHRiJ+4xiDTt5/uR7lDc9jasRVF31RDih3r746XVnRPdYq9XhAa8lFSWkFYeLs2rw0PxcQazqVft+Q0hLQEqJWR2ub0rO9Rr13OS36AmQ0pfhyl/BDyP7cu/WLT9WXI4CIC6wE60XyB0KYYn7EQw0NvTxDeeVSmv/ghILDsJ0zOlxHbQW9U1Z9sxMypMCY8CVfpCAv84TAQiAsQT0irHGMKlnWMLOlHY9222d9+LnGF0xMJjXeTeqgZelObB5s2fYaytuyLWVLbVUWsHSBHDF0HMBJIdAgaKmyiIYhEbVajRQHkRonRwhqlVe5yfK6Zhbdp/3WJL/+tKSxygDIUEgI36T2iU//PKSBy54LROY3eEFonGJEchT+5sQELCAW3lFgoVggiYlKqqCZTDRVfAEBGfIqpdtDvdhW3HavS/MHoacih8GXigA213PTZ+RLTj7QP11oz19KMLw4wcWBjLDarIKHhLG0A5kiJlQRblE0Yii1upwsNPlhdOe/eSN6AxI2dB6aPB+/c/ukjLrRSdVrSS1l6K8rWIbzPxm6soX9hNEWFQxsznkZPzPgL5Kw+lZmTzHpYL853NVF1mDvNDdSaIETdBPyIwgJphMrLFoLHeJ4gmnwJwGr9zIpnrbX3TbgZIYI6gdwSog8QrVRJPnsLELxbljcPkWkKBK6hJCULn9F08ty3ZZAI8kAJEJ7+okugkVX1Z1oqa9IYpFSYZLxbLnrB4EHmEQOhaqzuhsu4X0GBkaJBkT6iQiEp0gSYXWCnZe0ax87cSJz57s0AFrelriMJYBK+XML9+L2fLj19MrXDbAI0qygppqQRTQr/AE+CFqWmjDWEPJdKlYkc/qYTvQKkrHE15rtBPGDqjaCqmstesg4GA6BCEJHouWxR7OPDwCt1Zf9wTCRRwZDmVFig8Ll9rronZ1btd95Oa/jT5BnRq1aZQ26XKSbE5Pp8s/VjKnu4dvfqHdj2cPDmQON1iqJjRxQGUgztwjIrG8fVKLme2bdP/IPGRIMXV4h6pKmzetGCiez1ybrdrai2ReCWGy53q3W2aXHRW9xr2zoc3GR8efMUP6ZkA4E4H0mDd6WKantAMQ2wOWGxQejp/YTGBaQXNrRMN9PVp0WnRrcv+daZ07WwmeV7Zvb7Dn3C99ThfmLdxrKejqcblBJCwokcCiAQOf4AGDaPRO+ktpKP5a/4ULNSn4kQFt4fDpQ8PKtUoscwIeFfDUIg5k4wnEoej1Ok0PU/zOlo2bzRvcJeXQsN69+R7H6q1bY7cf3fH40aILz+W4HbQmA20HrwmcRayElatMqHwQFfsIhNokkiUqp8/1kgJSA7JY6qCPltvEN5n15eRlq34CgKS7D/lrkmrub/Zt6AUsQfUC/5/u3W+v/1LZpbuLNaThk/SAhTRIIh3aq8hi1/D40sE33d5zyb3Dz1fLJvQHp8X11nFbNqTsPPLz6WPW0nDsitCOSR10AoSwP4leu8Sky2X5t6HcmQw/cVCdHtU93eXlZlsxlEhGHV4Rmy3Jxrivds3f+OddKLeOCvvaU0cOHFiA35/Qp8u8EVuOqRWpqkcmGIMyZEgGsczlZOWSnbj2ayBUhaX6YL9YVDiwFGZrvi4LNbywNGNRpmkhmf6xZ8HGh/egkvfxQaL+q5PvvrsU36v/vHZ2sT3/3FslDrsCI1ZQgqXRYW4vc0ieHpM/fb2pCAEKoSzTfhN2d1RYKtB5iPI6I0vN/ZcStc23m2A4iQsPl26LarL7js59uhFxEAijNm3SHkg6RcThXfPrjugR61bcAAoH+MHVgf8S2GjmGkat1iTLLvdtFtlDa6ughekmdhOUOKhVLWOT5hBxtDA/biCu72+Q97vJpFTjxrTx+S1ik9ZqDUZSF4Lit695US2DmeNs8eVmNDbG2BKukt29fOZNpR5nV5j98TS4moaMqEKR2jJ95Z9vuYsQGnsUZh2pRfhJ1dNuvTho3QS+1zPqnqFPddSGV0Ifk3xlqUTNhA5AiiisyGG/cdimpY3wVGHpTF51eFsYiLkP9AcMTjWDUrXiGAQY6BVNG63JPbB///H0KNVcAx5mVvlYSV8+u+ztFrqwnxnUMN/WSLWK/D99kkWQKwXFcPLsmTaiVhCiI8LDWJTRqDcYjRLp+DDaY59FhewTvFho1ZrSupX+nncg/kCrEKeiIHU0xSm3xbecuXPu+r7rh43JIqlh3mGWuBsIdswnvb2+Z/rnW07+cPEILfBY8ujRQTnUFfiC4uCVx/+1X1fALHDbmnOFiMvwugAAYiIAKRrbHs0aNfyccjzOWriBhJhLv8AHc7jlFt9eUKwx8uNGfPtBqWaBqVkvYQd251miKbwjPfnm4Bd8YByCc+glEYxegCG2ZpGqKzzwag0G1jKu4Wvmu/5S2NmcqktPM7uxzggUUQm2byaud9Gzib0HV0YbIzYzgx5snv7XTT6kZF6HRjWWlFfcHMhx+Kefm5TarTGcJEMxP5IeOokl6iP+uWHgYyUshUnp5hrwMLNgVoA7vI/Nw+K+MWFfHAyAxq9O4p3ARnIxNkTPFeVqxJYxCa8PiG258e5mXV9INias6qgJ/6CjIfJiQ/jTKFBtZOw0wJ6GvTj/ZNSp8ve5QdDjQ7wLi9Bw7W3RTffendy32yfPLnmOWiDCOHDKJzWIWw1dM3fZtuO//LLbXZJ41mUnNypGUoW+r+uETmKfkLqLPn0RD4W4DXFIrA5JItRJWhp94EDTsJiKOwbegVUvYwsWLKjTz/TULXzCW7VsfSFaZ6gAvRHL5WzdP7ZcRPGGaaihKlR63MStGXszmyOuxW4Dt5ZDwsIBVGVNM1HPGic2+YiKduqUGhTp6VkCK/IhocC2x3DvHp+ptDY8PpgE1QmI7R7XjVSWUqGlvJlghHWa1jscPfjtGn+wZlc1ko5l2yy/0IPkdj5CqJEJF60GlnFYPFpxN8QSRkbl/hTBYVHVaK2O9WzV8SZp9+z1L9eubMOOHeGf/rqtTwerdVShtvLBLNkmwRUFLEmEiST4RNau47dck+kSSp7CtDqpoSxYbghLmLdtzpoXd6ISkhqtBg5UzP3TSIdlE7as63X7kgmvHnaWdK2wV3r0hjCtEXtP5b+lwesk78nLeczicQFryD2i/kRbfY3j24dERtTBicZ8d1pph1mPncL1TbASkYcBV5+q187VL1XQFNtt8NPgyUPqzKtb3msDoy2KYlfA7+JVvRzNE0hbjBT1l4Y9dv+B1x6fxNJTU0OCnsJSlAwstVtFJOWcLy30YIqx5Q3vD/ytqpegpiswYbvi1f5QcM4VeJZVVuAppi6AcOpwhECmQHHsi9OtgOdEtcf+n6n4TmftW7TzZlcUsSK53KtIZDEOUrOqeuxeWSorq9BLJAYzs4tE9mYGLXb5BIzv35+sEbSj+M9Rb6+92XQua062UDmk2GmHSijC2hp60whlri0BLr9hwItFkBRpNIpNmWFr1+ZtR30wfm4OVZICuzwGWD2QtpnDdf+auQt2HP3VfMyONZfMPEbRoDqAFxoRmiClIL5Y/P51+kfr8cCRgSboCr7UBhXrDzwUWYndEvvl1+mReG6vnSdwHdh1LrDZ5YjYKKY4XXpy3KudYMORnGDMsaIp6pz/4eG9+9s7ZW9DqHtggcH1fWCgQlt8UcawrP5CSyIu0EzovQ7zArPKzIyVll7OpU6YwsM0vt29uv3FxolUqZfYPbFN+37lhwlrC0g6/0WIL/RO8GIN1zYirttl5MnIMAfN2TkrSyU7p+xwZju8biZEROrDMa5ByANbRbIUGxnGEqIidFImTI1UI9QWcep7mzpl5meHaXUaTaw+qqilLuGSefgT+/D43j+vmzv0QkHeO0edZQb4FcENglwgqOS/lrA5S3tbCqzUUhuN0ZNgjHp69/yXNtPOQDJMt61iBip+T1p15JurO2deOPvmpwWnejJs5EgaiXQSER1VI/SRLNotlnOsCeKL9a9B9x8sVW3M4JKtMYq+tWsoTABnAIoI3suy0/TrmaMDANn7PTfztZbPelcNVJ+aJbBBbbq+ZxO9hyEGHGguCIUAqWUlXK8z7uT7SKijwFYebyfsBcLj75VFUrX6AQtOF8CZk6kH+G1zCtxSMqrlqPXTj9w3J9/pjck5+LzV6w6DixgEGCRILajgOgDlmpliJOPeQC1hBqNY7oF/F19ehaQUDbwzWaFUOYg299Y+8EQ51kA1PHKpPtzjI7/m0w25D/T7y7LOTIgig5RaXZoFGobjI9xOw+Ni476Q0jYt7X+5KO+xtnOHJ+tVsVO54hG14DqwbFX8qjMU9l024ecoKfyDLycu+XDjkR+/e/3Dd77b7yi+UXV7PXzjhtTKkLAHWrzyzRUBAIbdGikcA9CM6bcP7N570rqHxx5DLhFOa0JR1kY1fbRPavRbOnHCP7N+eeECc2NmvF6dRivCIQ6dVaRWkdGsbXiDtU927vViGvsHRiGDS5orrV2HvzBWWHLwdHO/uyt/PLWvCEgZidUC+lRN9fCDTrNKfodFLuzwFufM26+q6T0FwROQFv5svi+fmiW8P3H+SzXu13NBKizt5oczqYeH89N6fI4g7eJFibWIiLOSKTUF/yDh66ndx6CxX0P8a2Z9Gas/C7jkd4lvarPmnYTnLVc2gnJ7SDVohKL3hNcerj/00wzUM+vdkn1kLq9S1fx1cwJh6ZnuT9Iz51Rvr77f0i/ZJ5df0Mk3K9hdhTM9VQKbGlZUWimKuZ1RTHC2jWKlj7SfOfzEt//8buT+RZt79F487h8XvZa0vLJyGdwc2g55btafiIZASVho4D9O2TRmOkfTsPgpe+etfzmLveWXGmUkNUiXVB9at7j1iaLzmw/biwZUum1ctQNBCm7sBxhNRrGLLvJs15btR77+2JQd26hp4kpXLCl057pNosYne59o2dLZc9HYo8xjaa14sLdHDpNBEje5Kqr3nNveYeayKaQp3E9uNVwF9e9+VyumEvGc2x4jhtbHcVQCxwBo4VqU5fN2/i7/vNbJFVUSI6FmUxXhjsysLvtBai+hU2aojNXA8f0kWKnN+mDKwPNUrDexrpFhemK9OnY6fvzyubI8puJQmIA9iBCsmPxVXV52Xq2Y2X3+qIOHFm1OB+1K5hSzAslB+FQjEQFa8trVCwvBOiQpSZZK3A6rip1VLHHsilZnitPpJZOXlUZodBcahkcVV7isF42SvvsFe2nDS56SH/ssHL9+97wND/35hZn5Lpd7YokHqijWAzjAQ6ZhLqQDfJATBawMWPPBWwfre0HRRhtNYpKo294uvuXITyeZswG5iMETMy5jrTHaJwFSVkwcvzc3a/UFwaNDx2F4kDRwV1YVDXbT4U6UHNVk7UvTV81sKwguNipZyzbtJ6K+5smqMVr/44sG+oi9Ea6y+y0uaDb1SGLghuR0ueTtpefu67vw6S3PjJjxWFrTpo5giOD3SbuqND2wGZ1PSefqVK+Yhk22l+fysxN1MArZCDTMLzOCITpNOv86KBV3iV6vnjLqEnLQQumbCSiexJl3pFXcMO/Jg2Cof1Khc+BuHYODPy9QTFQqvR4x2162ZfDKaU9/PX3VBjPWI34JSTK7Cj8y+KG6DH/R0F+kR4pGYmfovU6vM7XWhh3pG9vs2ZQuPTpmLX+rx/dz1t15YNHrT+2a/3LPnOf/0aR1XEIXtOKcuOkF85dTVjzTPizhTzeYYs4nhIdpZQ3cjqHPYQwhJEio0F4VllmgDxCHGGnSa1vrwktuDEscn7X0rTuIOAh4UqkweOAYGd5H317Vsvu8kd8eqix66YLHphPdMihE1Higk5hMBm1yWMLJGxu2uHHbjOcnEXGQmwkrgwfvdUMcVXMQetRrZenYqPFXTRRoBIoXi5HQFELFyKcJ29vyT47C1FWbF2U++eoLf4KG4+Vckk42htorCA0NVrU+xDHpjB3JggUOFxQILtowuZGilrU2RIZC1Ppa+k3PiGlSAb3W8EGEXgeEAlaFSIS/tHdHG9zlXhc7UJn3Um/z6A9mbX8rjtRHFFNRX9B1VYgqq25LDqZGNtaHsWbayAV7zBsWna16xAdKYljNsEzfJtT/jZpPa+jpw7ZsCB+1aUXU5tEzv9+Wn991yRsr/tpEY32yzGnvbmFeg42GGDMaBmNIGCY0wRBxLjLC9O7tbZL/bv7LcBxJZQIAxiBnqOl+C9WdK6eN3Z15ZM1Z1a7HVr8Hbj4i7II43SSL7SJjWfuoRi+Pnbpi0mAQBhEWierNo7lzXQDl/K1e6cB//1dQ3KoJRrUsgyZM0D8//JljtywY8yFTHEMVl0Im0KDuJlQJ7ygdlsLRwV/chS0rsj3b+5jHru/TqtuS54ePLSS1hBAh4xq5NQfMLwTyLGXw5MOGNqFi0OQbXnj3gpmaAmMeNOfvcRN94IAM7nD723n7P55nEYVmIF5iuJxwgrVBzyBJ1AKrRS4yeh4q2Lat/4DlExd8N/PFTWAuJEWwxk2tcqEPVkfte1JnQ/SeyPCoWdtmrNxBD8nsa2gUA3WHU54HxMGwMNQ+vH6i2KTUIjRt1VkzPm08d0qj/Hc1bGjD16v0eeL1F5rm5l+68bylNAq2W2+rqDhvUmzMkXfGzj1LAFID5AZQBIL3D4A6/r2Xmu8/dXTzLxW5d5ZhrQFB5KFVlwdrDZPJKNxgiM7u1qrjqE2PPvvtF9Oe4wiAatQAEvQyjx5ThrPHp1/44O/cq9d/VBJ5rvsU3i9OZesZ69C8zYKi07ahZ9RyrQYjgEMM1cioZjf8RKKVVFE+VVEinjLpJ1hP7XtyyJqZyx59dvmKNB8iCECE3+T+X+ay+4REzeaqrgIAgUszA/uXmHFVXdf4g3N9c1qa+5aF4xYVOYteddnh9EgUUE8FEDOURVIdHs95wZnocAovd5r72JN3rZw5b9v0FVuhfgIJmcbcGQ4oQdYntauW9izeNInfhIhO7TQOHJ1vyCk7zp83rP1403155cUDxywa3T+3olS4ALNsg2MHNL0WjKqINoXtjo+I/eT9cfO2+yvVvDFiSg5+04enbP/3u+PmCeQ/FNdIJ6ePNnOzMj26Z83MUd9m7nvxlGw3wFTn1SFCCYIS0FxoEnRGlhzXbMP8KSun9REErmunpJhZRiYWhiCCOV+81XjfsV83HXCX3lMhO5fzpmLO0SSHYoE8y/X1pxNUS7P0xoipWXesmjolX/C8YLU5vHBO1F6tE9gE1GgkEBPU0CPuUlOmbFuSPWfEiLSXFi3d8vT81/k6JCUFC9WUoAvVK+PgEyFwhvSLqCtP6v7CBhi0AoPBRyB+4VM32+90hzNBMxPhgPhaz3kj0341Vtwpk886HW6qJ3FdDJIY/otKfrlVzteKPa2Vl77pYR71TZQhZtqOmc9hd8PMGKmlCzL4WfZQ1VFPObcpyuqME2a+CB7DXl7+4PS3lq3K8dpb5sOTEvv/IEuYfoG6uR4Hy1UdQEND94YVheNaz3jkwI3N2i77cLz5Y2pk5OZVD2c7Cg98+8yq09UaVbPNbzqzcWMLDu289vy0O3LKC6fvK7pwW7EDm4+QGhKOCUOzwqLIIPUNS8xp3bTF8DefmJaxdeoq7tJ+6nJSldS4dcnEB9L3fPfqKa89FuCzSFjEuF/zH2EfpNqg8J8+dUj8dtrzq29bMrHPLjX/QdnhcsMnTcdtXQHWXbscroHSeEqIICmywysf1ZS3ys8/8doN80c80alhm7n/N272D+aMjGtSu7Bg5LUFaYbf4mAgCzaKoePVI0Fo7ZCZWQ/UoVrw3Td37lyDs5uZ798dXe8YVrb/i1/O6rzNNR4VuyOqtj5JQrWhT3QYEschVTmnsoLl6G2Dmjosg25fOuHNbm1vnL4+bUQRqvcHhPAFafBBceWvBDEjcGpKT+eesVu3f7Pup0vHHz1vh/OGLHi02PsENKBHURuF8C4NdAa3Tqu7iGNblXbVo4nQSD1OluR9NHDZM1+2a9Pur0qlO8dl83zUY8EoS5Sg2WbXas7FR0brC4sKaQvjxkXzRtxazjwdc3G4B34/Xh1UCjc6gnMBmg7RcayhKfr5V2asmUuLcFprkJvJZh/hKrTo+ipj55oTtuJHi5028liwa416k12mg2Z/3ARjBk4ICWzn3HVDsbj8PEuqHFJpteE0G05Q1Yu2vj5jt500H5hbBLnIalOKdK5biy4ey+i9ZPwbKd37TFnx50fKSK0Adwpp0OC+v/UtvfkIKwzno5hJbwiVk86zh1xMX8sM+c/1UGsc/4Gf/JTh8rS0oj8tnX2zq+LCz7kaWzOsKMBEmO5qjfmf4ywahggHanJUm5RjcT+e/2vZ0LQX5y/b8syi5fWYzBkRCK9j+N+X3PfuZ+9vOuCqaICzwrIRZ3dcGHEEsdA2NUWwhobIH2D23ZwQ3XDv3U8MvZwmwMSINPOnbYk/HdjXqMBe8UR5acXrI/9y34jPM/akZJ069tkptXJhCaQCKyghxzjf1o0b1wocbMCJsOTSubUia2g0MhgKDndq1PaZd0ZN/6HtzLVVUiMg1R57ZdmT2zJ+WHPEUxkBdUzWI96RCwEt3NiCbaLXm3IJGNi2ySzzR0sgDuKafPd3r3nTvbctfvrVXTrvk16ckQC3plOG9bDsK72l/ShIHg04midPsUn5gvxE5U9bBz+wes7oTyYv/QxmMOCvr50rpa7tF5kkmUarKbBUuAut5eepVBbcN6pKQxUCN1ZaTXlwZoHKegC9wQFDL6iryvl/kJ9XpaKYUlt1OZj+zOIVuE3qMsfNDEhZ8q74bvSygtQNK2/OKTq/e6+jqKUKtRwqH/yPr96On1AomomKmETek4IlvKTo7LIBSyfe36lt14dfSht5nqtcteKqSbM+fitu/5nDz+/KPfn4ORu5/Ekeg06rcXghNySdlGyIq+zStO2Et0bOfNvfF/b6CL5sIS4ij+17F1ml6PPs6i1bjF9+uyNxDWIv4brfk68+f1tW7pkxFcw5yCZqoitxZsapk5heo9HpoB800Ohko1b/U1xY5GvfTF/1Nvdf8G3wMPNobsVQEOol8suff1z//cXjw3Os5RSSB3suGhGxq3CQQW+41ZhwuXPrlp9tYh8wMzZ2zGj4j5iAuLRW4ESyc95LT93/wsyzZ8oLlx2zlUp04g4UIiGCC+fj9fXPhwiQ97QtBX09izkaOMtzP+23ZMKyH+eun1O9nbr1hK6elAjEWRDOuu2Vq1aNJrcnhrquEEhmKgqnMxxxHGqL1CULDuzLExO8xsT1JY0Gu9RqKxQhAqkBDBmNUrBeSx8/PX+Hqnaas3jsO2c05UMLrdhEhusRtttCBpWoDgLGByYQHOpgGqXYavV+77T1unyo8vi9G+c/+Pm4RV8hL8frQBlp+6+73vmV2Qd5Ky0eHRzRPJD2cFoTm4RHiV0iGnwx4OYBo6b3vyefCsICpUlvlKcyn4WLryM3wcIFWzPLcbnEyWlpJFUuBCp/7ampO/F7J4VsuVSc0+d0fk4UNnLcjQzhUuPwuLJ2DRofWfXw6LOB/HQQ6tTly8RNgf2M3bl6zpD3f9y2+bTqaqg6XF69Ros4UAhvBXWsdUQ06xjd5I3RUyY8PURIslOwL5TjMAXq+6N9A354CkLb6i9oPp2yYvnYd9ftMJ469topT0WnChvWajh1CM5MQRSumqCjE4LpcAZdPldRouaHu2YPWD65+/ezVt9D7eDDibFmRVfwveZ9UCcQy4v16A0RCfFpc99rN+eBRw5hDwuWspqRJ+HcVMps8NaSVSdgDaWK1a4ePADTqnoN2KmEJ2rwlAG8IC+B/ohLhxypd6+c9vhlofiVw+4KCYGvEL0E0SYhRYOXrnkXIfywPBF0Gq/gOe4p0dsvyV8O37hkztvj5i7j6igObFEJKctaZvLCUcQAlcopexDkFYsKfYKla6M2z7w1bvYbW9kL1Z0HuQVqxpa3m2XmZD3icrvuenH+iKRchxXAwUQ873FNpNZ4IiI8Ymuflh2/Nj/wRDY1snRI2iV8VW250kXASY4lM23KELMmg2V4A/FwZ3y7JerggT2vZpZeHHrJSctv0aMXtBqXjHPbBkg1Y3Rej2YdR78yYsqXX05dzhehOCTDiQqZ/9CJ1C10wEseAi8Pm7gXBNN10Mpp888qebNPq07ovbKMdSGc2eDeU4PHBu82XK/BVrSqHdFDvpdzB6csfebrjDkvDiYi4RuLaWm+gldh9tDO4KSlyCYj9tJFIYEKBbNiIZPE1Wevl/ZzrglZqS70Gu6nAAIMgK5DJVov+ImbbZ2+6s2ZH723M/zEnjVnbaX35mNdCkqDFVDEfirWZVdJxGiwwajVCpJ8wVIu7C45v/S+tXNLPnt2ySZS6UhqSVhky3YEFHTKLm3DiEjWJTzhq3v63jZy0m0PkhjVpGAR73MD2UxqqHD3qqkrth3NmHpCtotONyxcZP3wi9IyWthLlrZRrvIhRaXFnsHPT3uvS8sb5q18cFjulPdevivfXlnx3sgZVd6aHP4DzJNxwHeufNn2j+P2Hz847ssdX0/K9FTGMI9X1mKMPThgROuNZmGRrH1kwlsjn3jq6bREBAhIYVLquC2qz3fHzKv7/82fzQe4SgGCIcI3j3tn9btJF86vPucoH5Jjo/Nh/LQnnWa/Kpl4oJoBaXSy0+k6oi0e9Kflk5d9N2v1bLawPxA4gYsNEIB/WRx8BGmaaVnghprsUOA++z9MnLjRPhlxVjz4yDn8vO/B9eb7z5fkrTzqKGvr4dFL+Lhdk7SFMqiBe6ByprhArbRY/566aUlm+ui5PHayZCcvKZwN6KpPqOjQoOmU9AmLXtvOXqwuNThnfnjtopt7zB/x+iHZ1km1Yv0lYi1AthOSjdxNhoYPo4x4rBVOh/qrYtX+Klsfz6soSRu6fuHQTs27Hs7c/dkbty8a34BpNf+AC8HppOg4I4hMLrNaYnCm//Z/7PzqT5dke2yx3Y44DdgSod10FQxBpxe6aSPzOzdpNeb9MXM/+3bGmurw+dQqEO/143Ly+2BPBklF9KvzwjTtxkcnn0Gt9963zjywSenltSfcFZ0RmhQaCc7ngC1x/K2nWTLjgtnoSysq5FOKOCv15cXb08fO+56fB4I6gRMOJLfqT5heLwxhdrfPalilEtQsRZIJxAbrSbUNT0gWEo1XJeaaVdV/RW4kFLIUah77aIL5U+T+9J4XZs44W3pp9gmPLRJ+fDIPrH0NahckLTRYrbdQcUsnLpx5B5vj7chrWmokGSJv0IfvfvCuB//ybG8ejUKE1PA7D/qkBiLNLd1bcHJWtgciTIbfuUarBdVp+cFlrhH4OoKR4T+gClIgEgrn6DmkFphckvC1Z89Xz0Ak3pVsfup5l1dYVuq1shOWQkhthZXhAIsVh16YCxJJ0DgwjIicx3TwKGZNEDmxbUTCG08O/NuzPIxLQGrAJR4iUDZ/9UbDvYcyE7cKwhGuMlw3fln1T+41P0V/MsF2Aojw2UTzdpTtAheKMZfUklUnZWc4XHMowNtVTcKQJPD706o5TguLz7+4CvUkY8eML2midXAf8SKuFlA4GLHxe+BBFAe4POCvH6QTWEHpcWCHifAWwsGrqhyqh/xJiUyqbv0uPwJrIOCsRAzlqykrnpvx7aa/h/34y+JKg3fCaUsZ9tkgTXhc4/qbBJFI4ADu0zpnixFznhqH3C+Kt7boOPnHBS/3JeIgvcvvPOgl58GHNiy6CQh9ZJ+tYFa2rVLVyFxs6UAc9XaTBpPy4DyYTo/gecdLCuT91twX+yG85gHzq1MHt+/doYGsec5jd2RX2KzYDoEQQCER0TjC4F/SQGeUmkv6gt7h8R8MaNejz46560YQcXD4xqXSbj93bhyx6flbv96/98KhoouPUtevHrSBcv0xkx8RZEIE6sH3s9b9/b6eKR1vj2i4tQGiTMLED74U+nRfoNeQJBKcEr3FXluPxzYvuxf3udyINYSDrZGtKpCz5jesRGBeAuYVgbK9tEaulbDBR3ewu5kt2Oz5WK6cZF7PGRUfGKpPJUo6B2EN6g/RQq36fuMlEQcxSFK7nrtjdMWBRa9O7JnU9s52hqhTEtatiLZIx06v2jZUUcnpdLIKr2Pq6t1bjNJrY2f/RLBwCrxMLue+g0p9lk1YvDv35FzspmMIFbdGo4H7Awb3NyZEH8f+oFa9VF4h2yLkpZ3mjtCuTHtyIaqZad7/xaIjew/0PF5woV3bqPi2JoMp+uDFcwd6tOhwqVF82+/XwCrGFyxwCUjBgqO6S/zN5vGL/3n2wNxcyBpJ8ZJ9+o8RtKHa+BVlZdXLaKplrfoZQARSu1Y+ODIXDwYNXTt39LGCi38/4ayEoiSA3YS25BCG4AAWy4HX65niy3/DJY+Ugqg2dh8NEImEwCNAi0PCDO/jqAs3LfqRytd89Bh9V6XUVMmTnu6Om/vUykK5YhpzQJSEiP9VVeZf/QFpi60Cj5ksdBlm8f/GzPkW6+aOt+CIRo7WOu5SZbkKAvDFC6vbA94qtCB4bOJMupY1+Xrnz0MkMpvBzYRczjkn+duLi5KPFWW/ftBa3M1ps9ELnOigAm1b/MuJFonQlcVyq022GGUziETIWvK62dyTnzTbiYp3Hq9W+6nA79TOukH9BgjffHxUzsjwwXf/i/OSzxbmvH7IXdLN5bLDumXQGplG4hQSKPdH+b6dAxpiqup04grWVqld9M6MdPVDWF0e2bRid/7JA9vKBU+j+iIrUq1YGsAM5mVFtoqe606f1k9s29Z1oPjiL6JWNxjnu9HOlaYCUPjuCMyBRfqlcgRg4CnoKoQTSqAcvjnqFLuslZIWR0mrPbiGn799bFApCIRgUOg4BNQ6gnV86npzznfOzOWl2LCGeZdi/gStm/qJMkIRwv5UOiz9xfSsoiri6L/kmYV78k/sP+Io6+a0O0lqgJiuvgBEnVdNBBAAE+FnJJ9V7AtwqOUNKjRwxqgoWMa6Ba0AxyMpvhJO4nuf3vJKy9uXPrNx36XT+4+6Ld1cDic24TUKLO6snP37QRsCKBH4DgpP/TeDDnh9RTIQ+A7Pqcmrf8gIUStxh0QgQpsJg/TvjZ55tH+rzilttOEUdoFiYoXsCp1hg64NhwRP84O7PmtJ1eKkOL0bCqWCF+N3cfANbkEsUdUnURlirPRdK9G9K5+YGICCcx2wEwWvuVbpmpdU5Fo+NUv5rzbDTEvShLYS0ieYVwxo1nF+NNR4jA9FwgiZoKpifBAFWfX2kGit8bfNS7tn5Z5/42d7QXebDS7nElRaQf23pEaw1olIMAmiy2b37NPkPX7nc5Oj/zlj9QMDVky596aFY17D+ZGPEsKj9uBo6fksp4PdGRkTVVZp61rutQ/YdvCH4Rc1Xi2kBkUFR9xYbI5gbZpoDGdt9XFlpCemJA1RM5gvnkCw9q/lHhkayKx8LXmr5yGWdfWEajHdsF7z/QEwibWI6j4EngEkAPm9GnUAkzGXWq0olCgLRw9Cz6DvcuSrgWtn1n/jIiL55Gnzqd6Lxj11TnG9objJgy5Inb4GCBAKuCbZ7I4WuHWiS2xjZ0nZRTCbGlX7cgf+whAFWwA5rnamW4G3dwUe+79rVuB/gREd5GCcVGrlDnH57BtrIg7lZ3+Bl/bE4Kg1SYE6c4Ib8C9XI+OMph3fzVo7EqJDxKfGVIBA6Fplo5j2wwmLFicvHH3zAcVzD/kB4m7QJQNwVCPDYKSJ0PaUbl3y9LifL5zYcAaWDZCMb61BC7n/UIK8hfFWoy2ptLh2qMr9nec9+eH3M18YetO8kbkXZfsbZxi8hUsraFfU/ZOlXEch9UsU7E86ET9Kg/NdoqD14ugu0+lYG0OEvY0xcdrWGS9spAHM8KuJQUEn9KtHvvsWoSJzgHMUl5f+Zo3SAGdnpKBNX7kJZRV7RuRgSvfKnY5bj7jKWuG1TGQjD56gDDSTTCwtuX+DA2zzeUw4hfas0xCIBIPE2J55G97qPPexRVleN+LKIpJ5ED8ljkHQsophPTx2+TwflUK7dT+PhYH8fE8wGDSAugIuPjDdc/z4TwTq49INbR+6kCsdt+b1KhDgz1pXePqgo/HWSayBq7KI38g01yEifzfUlCQzmKeZdUxq8Xz+ecs9l9xWKFLBw/7AmwTzIbGLzkpRPF5e9MQZOqiEN3lh3khqhGrE39a//4VFJIX613vwcpZMV9mDPcwjd/6y+JU3zy17W4h0CevaGcLcsUadsViUNSWykwMk0EsYdVpjpM4gtdSFFSXrY1endElu5ScOAqoO0lSH1IAOh8LBqsKQrOWke1rKTL6yQXXs6tUylpnB270hvmkPFUwJ3Cfo+Pluko6psHCNBHs231OoBFMCG1PcuE+vcKvx0eMcP0OM0MTwSPKgbUNlOnXqFLR+PFLJ2Q6zjoA08lcM71oEstXgplS+eiKmHkhNo+Id0UAYVINRCJ7AYwQVOnyUwdSL5zD7+h489793N1/nhFIp4IAqXoCqIKx9rbHh1yoYOliA1ePlpx3gbhSy0YwFCzjTS+7Z+xDOGkFQQqUMabOjakgLRegddLocHA0rKQVnmkPW/7s/ICLBTGjheerOclb26zZ/REG3xq0HvTt6zjPPvP/KsovFF+9xOO39LtrKowvwuq4GEVHaaJ3xAhag27u167ADgZqtXJmCWY9t2nTVoA2t4hsJ53LLKaYT73zwDgmKBpRr0uop/OU3Ph37KkSS7hu1M+UF8fQLa7ag+AVkBFfAe5FdjspThbknqH2OoDAaYY7hN11XHaLlMuQtK8a7MbIunee21fqhSUGBDHbSZb+gMdI5bh6lBvdqJgKQqsZ5f/h7mjgRNUhqdlxbcKYc0Ef7H9fpB6S6KEPquF3ODrtV1cgPstHaCERZs4Xf5wqijS8HaHyoldq10k0ZDKe5MTI+Cw/9a7La2fg1H0r8eqh7ivvzrZ9CXcqPxsE0eudMnXqxVgbfUtQ4nUmQaNr4CAVqCFr9f+amv0kdPCDcR9zOxPILzgN9Fo5b+OLfRprR4uv+D2+8hP/1/dlFXzgaPApHgzdvR8zVa5ggMOpDfJVIfAkDEGxGcVuwwD3/QllRO2oiA//qTT7kUO5fY47+Je9kJ4prC4wOKqi45QRrw0amiNIR9/3Z+slYM8P+hYBXwBKjCJp8BISYtTDcwr2/LTL9WL9pOIPX0ys6MelnRylhVFDMpeawtmHxiD/buXFzdhDXdHio3exHT4OIbyLswK06ayJflEcBUditjd9/86XmyHPCvHChYPbRGy5/j+QbjFvatBf3HbFpSq2kVeM100GrhkkWBILJbEMv2uHnXkIQbGCIvz+zT8L5IWgIcAIJQhzUDM708mPPyISQo//jxBEVG4rQl+WLeCPREVfpgi6zHzvdc+GYBzft3+9XdfxAwhpBrhHUB4aIkGSloOO35i1b6F7QlEKMGinCqM+MxFtNMSoSDUCwzBhEDb1yGd9/mfX16wlkwIC+H3KMkn0RDuFt40q1aBTivMSyA3NRowkgO2IPSyxSMh4fktTTTg8dbtchAZEKMflB4eEVgPhLsHgqtpT2oOsQC2OeFfDyvkIjuJXhveWc/fqe1P5LiyGN1+Vx4A3gVVb1MFF/hHbBOcrVLoFrwAnTiOi9iDXz8ZKcAZTli0Z5dQipZtGMwGXQcQk8DHwjEx+L4akTynASMAcEi0f0ysa6CTdpa14pl12RedkXOlCO1PT0oPNFhEzP9/16qElhZWUsFSUtJljC6l2maPQOj/tQ0MqCFfpP3wMCYSgkuHm5PMecFW3Ouys+XP/JhsNweFz9wJpZt9C5FRioPP5QqcqYj19OTF236HacXPxoy77PJhB8FBCsNpxAcD64bz4x/TT0+CxCALDsegZc9FwQnBG7Dx2ZSXWZM83YK6r5imIsxoWAtyflKagsm0NvJSIVhK6DJVotR2v1LCoi6rvAc63eeDYacaZI+wqVyIXEA4vKZUvpPWiXv9MwxbebXh3hBP/7OJS/vrK0W7a17EZy90WTQeEB4cCipLJYU1jhpEcmFKJtni9WF5YR53vJVV29ww8gHVByIMig02mfSrewsQwX9Jrj489KX8Kg2K4+AiJuHbqbV4r4c/WHkybeGJVNBAKLatCS/CZWdQVwIMipLHiUKkn/cbZUm6nRfG2ryNTT82MXztxXqgMsGFZOYHSzVvLXy8K1xmNBB7BW/v/aJV75RWtMLXRLuQTvCD/mKG2zszRn0vZLp3d//vN35xtPf+hAzLSH9yZNf/jA97/sOrszNzPjsOj4S5bbRtybZYQIXk3uB/Qca4vPyfqFQGBBCYTyYDYlJ4KeHyvNm4wACGlw0nf73TxwHI8jEqlogagvrN/ipz/YZy1qDsswArkER0i+GFQUbQNZ8uD1YB9SO5RwqOknHU0TEL86tvue+v6Cm5GpxXvBa2/xp+emrKC7GT5rHRblgMcHk8r3i/DsRE72y/mw+kGK0JH2oNXiPrR6iUVrTfs7C4IbUhlUythNbTvsivEiGJ8iY0svODrzPuKN58dsxS0HrJg0F8V8rj90pJc8Hoh4fYyKcKsKLpMGr3XnumRQkKh5X6q2hovQGX7G62qIf3CcDWSp/o3BgTu6W71QUTT2kb8v/RNbf8ZlDph6q83XnjXpjmkfvdn3YvHleRVWKxlTeJ+r13Xlt8pM0JQVJu64rgiEAKSRIFcJkDh2lkTFipfFWxAFPdNRHnEJGzdlzHtznuLpccphDS9wO1wqkDkSHq28cyGCNgTeDdGzWYdPuujCIUA9eD1l8ImikDv08tgSBKc4XHD2H7eteHbtpC2bunLQzKR9MPXVzN2xaX9fPLinedSBXZb8h+AsSJEx6hlw+LDptaxpZOzHLzz41AU/ArHnJy/PbKIPzwVq0e5CSKIlkCrsDnVXSc7UWxaPfRMB9rp8rZ7WgzgU+mQiEMbjr6xKgTXwp1/txX1w9loOtuinMaJe005iks7EmkQlfkb3Elhn1JMirfjr2OxYbfg38KCj29Co6iaaH6ynJBzgUg+V5i0euOzZdUu3v98AjIT7x2UQ8UI1RTYO1/gPXupx7+qZY6DQPKa4oL4GMUbUbcV3J8Jg3BpLQW7grhR8ttAIuiTh5brnnFZ2MPvkt/esnTV75idvtOA10Pig9LKdWxIeXDd37PeHf9px1mM3IrQSef8FrRIMEuSoSs2Z3jage999QsKUh74v0sj9/ZPsE4c++K6rvxLUAnSqKtAHNAR6fRwhntZk95qt6z5eyBHPNznBYKe+yX0Wj3t3t6XgERy2h5EodJA2ag97SWAlBrGLFg6zsnwEQZmsOrjdRGh17bJdlZGF8GeiDSdIFDJ2BE2+ejxq5+hEcUCnXt3XPzzmMLn3kAcDIRJUyJe/Ljo/RnDBxwPSM2gluEnrJqhM2JKWhFZaE4LySWdtslxA+Y1MbOiU1FZn8R4hsIqQxEF5dZAsbq9L7B3bpHj+hKmtB8e1rSQVJC09jcfRunet+bb9+ad+wJtwZRy58xlwqGCtBM4KR2xVjQg3io0UbWUDY9SvFYr7V6siu6IlSR+nDbuxyF7RDIH/WuYqTlYJB0BIWcxfcCmLccI5VlXzQPOuOz6ZuHgAmuPz1WbWsENnPNYbcN4YAx3axwwMT4HTK+LDG9gNYhh6JByrVBWLgak6k6jpeEaxhyEQBqQ2XpRbj68aYrZ4FBxd7W2Ie3Wv+eWR9XC9WiPyP76EqkEUzwmYSxlc0Y2gbCAIrBC7dJSX9Wpxw7SKrN1Dsf+ih0U3pGMftYfAU4KMwADH7IUaqGbd+MEwLCaYFXtyOIUGwgDKhiYOIDUoWPHow8J07WKTniPiYCkpEsyRfPFvhpWsSXzT5zuWFIw5rpRCm9AGNTtSdyAR0Bp6ixNLODSlwXv2WmMzqzUXuXQ+H/sEeG0zAtGERiIaKwT/9iZGRunaxCetJOJIgUqEfhDHl+mo6efPmnfetuTpr/KY6x7EbHaj/qAGEOLcdGbVYoOEZ/bIU17r7UzS3q7DNuM5sk/jKAOFMgUDASvD3i7WUqGIg/pXJ01oI0FdklvGN3qlqOTSSxWynWRJyCDpdJ6Dv+DJ6ZIP0wuftNquPoMiTQI24nEaAJoBnVkOKQRADKrX69a20UWpXTp1WkaOstedilVnoH6nGyAOHj5m7aOjL7dNaDw8zmAir28EsRHoBfNBk9/KIUka8F2EUBUgRohD60Ss8viE+wi2TmHUR3vl4FQuptPoeoc12IVXyfFFP/zKuOpC8JDE2/z4xLOtYxqtZGFGrKvx7okQsFAb9AgfmmewdpFWPTiAgLe9QBUFZ8TpwtCTT8QBu78b9kJdB130j+8+vWAV1ZlRzfuAog3SvQG9+o7qKoWDAas6vAKOjpEETaS/gGphmwPrx7gITo/HbXN5ELDBQ9cUGIHGDnSNmAzBJUfQiunm+jNEtMK3U1ZtaC6a9oMh6DDmQdyIr9TgU5ugmmt0FCgaY0MbrwwLKgoJIeClMqH5KbYAEB9b9SThxUM3JDWf/WrahPMpYB7/zxAIDSNHBizYP528bEvzsKhHm0RGwZKIE/kCYixhgK4Mdc1f4DqE7JQP465qwFZD4QyfASAi+LniCQ8z6nuExf3ytznDSWVgZp/J+Eo7/veZfDn9uRm3GhJ2MYNWh/pdYHFX8tQEhV8RYoIYiJY4TIAP9uvQRQAPqaZuvL5Y110fc/yhB1MHU0V+eHid/mswkRTJfOdf82IiYnonavRWnP/Q0viEgolapdcSEHFiCOk95siPw3S4Jq5OY3ctKZAL39Q9nih8Kv24qUWnv7ZkRhvsckRt9RIJ5UebPnhovgBHfeeXiHEAaCjTqhIRYdI1lcI2fPTMUjKGiBlgHv9PEQgNHsMxTbJqHZy/6d1bGnV4uEtYvJsjJikx8CMkXfa3DgrnzlizwHwKIw/eCI5VYKzRpO0Z1vC9d+ZvvnW00JMfDQVCVk0+hwWEEEDS2X+bNLCPMXGXZNDrQV2kTnnAmTlQ/rzX/EXw4AMKIjzBG4NVWYwIN+l6hifu6nfL0BvHd+5v9UeBqQ0PmEiGl8Zn54y1x/u17NI7OSKxGOs8Hb3MFdVymLiZ+JqhCZ6RKqNxJsIjKQ5tjd5hSBKpSqWjnfEUcPHXnpp8pkNis16djNEWhcQ3TmOhLCFvgK6CNxLiLuBH23yeiS68cE7VNDCaNLfFNH5u37xNT/NimEj6Js85qMkYJ+43r0IK/RE+ONgGONEDwE79AAP9DYmHxAenTB8/9x+De/yp9Y2aqNcaSHpZi4BgOJkHDz+qlN7XwieBVDBZDwLAAl3l31joYmowqWgfSEPSWaZhhk4RH2bSdtZFHu+X2PovGbPXDiMzKl+U1wqPEwCXiIaIZDDOZOxesLFfL0P83Jb6CNiltDgKJotQc0gl8xAsvE0IDz3ZwgELfQgeIswqeOh99/QuEQlPSAAABIhJREFUFsyoAkfPCKNR294YVXp7fPMZ+82b+q0fPNhFxJFeT5BvGh8iko+enp85avioNnfEtni1rSlaNtL4oDmMD8AhPBE8/jHwQhVD9wkWvlikBSP/0D16FoAdY4l+0FILwRAUkC7qQi9pgWCQwmFhdHvy+dj43aoywMUJlm+mLs964JYBHfuaEr6J0Rs1IBS8AjAAB/PBgTkhIwSNCW8X3/Sb5g/w0Dhy/Ab8ZMgQFaz66DRmn+jGx3sltkj5asrzpAaT2yn4k09JEBpMfXh/UZiYTO95I/L9IyVSHARYLYxljpWWtR/OYBhIkhDX2gfiTjQBlP+BF8ztLlhynwJtPISXlTYrAc7RC0KxJ4BxwbTjBaY+nkeoh3HSG4ACWMFiP8EEjpSEo9haSfy2QXjMa/+cvhrvg0PCglzdsYMW8yhUfyIiwYcT+rBXV7e5XHBxWrGjckiB19moDIo03j7na5eYGSIucpgIDqIfHWChPUo8o32DCKCpzqtURmr1P7eNa7y13w09XqWX0RAE1dupH6KaMWsnf7y53dEzJ54stVTcU+yyd7Tg2Hk52saaH21DDmCjlCtHBEd1PKLxo6SH6Zhgx3hFYDx1GJFoBbYGrbbEIGnOmzTaIxjLHexSwacZG9OtICggKf76U0q1uRq4fGqKxVU5qcRh718seCNssJB7uOEW40FjQ/yN4OBCAL9xBoT/xj0sZFgcjOp6D7sUExa5Jykq+s2vJj33FW8GTNNvog40y4R2sx59tMLjbo8KsJFDS8s/TsILtIkzhWPBujV3zf/9gNnHxlkdNabeDpkJMVkGymVwQvlaVfVvrF3Y8UxxTle9TroJQVs6ny4rEpITmnaxed0Son+Q/0/5wdLLZzvFNihzOpyHGsfEH+/cqtORVUOfOB1oLKXahAbuXcM3TL8p2HDzwfJFXp7p9Y82984pyE02GAwdL1sqWoAgjE1jEjva3E5IDXQeEF22lJ0oV7zWznFJlYUVJXtjImMPtWrY6Ai8B3zcGA0TF+aS8xqAqJ6FTMAChQfyw0TPiIArKgpvvVRe3DbMaOyxJ/+idHN847Y2xRtd5nLIThAzaSi01xRvCNOEa3Xlh8vyT/dq0EK+WFr4c+voBLsqSQdbN2ha1LB9m7Pm3oO5N261dgkPq4gjcJ/PFbm0+4O6jXn77cQzuYdvvVxZ1DnCFHbDibKimBtiGrSGq3i0TfaQBiCGSTpvZtGlY4mRMSoOph/DnsnJxlHxh3t0v/EwXi1e9RoPf1AMPzUHWgStX/n5B/9VTSz+Kz2pTSi16/i6pCSy4OJFURerEfo06+po6YvuVzubCMIQM6pZhmpnuJbrq8Hy3oULMVZvEcLBMBaeoBMfad4Nv4IkmG1TOiOuGbl6X4MUC1JD1S2CCQTLXV2qblb7cV5VDR/s+sp4/vIlpfDSZaEczxJMBrVHpy7iw7feE2q8AjVwxpDCUsiQQkhahzgCGembq6wb0wVYyTlTq/6M4Nh98agRb9RV7JUaoX2zcIXM2dXzVP2GhE8dx1/5QZI7aJv/H+y6kJy2/hwbAAAAAElFTkSuQmCC"},{"id":"USGS-Scanned_Topographic","name":"USGS Topographic Maps","type":"tms","template":"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png","scaleExtent":[0,16],"polygon":[[[-55.9959409871,52.00107125754],[-112.02896100663,52.00107125754],[-112.03994733476,56.01308253302],[-120.0049439862,56.00592357111],[-120.01711631014,60.01202439709],[-132.00196823895,60.00239237126],[-132.01208445818,63.00193292546],[-133.96882922149,63.00050478005],[-133.97240257168,63.9922484722],[-141.04429430438,63.98726254018],[-141.06879354491,69.92045693283],[-156.24893170976,71.51583202984],[-160.44570905351,70.83527373985],[-167.08145124101,68.42906280103],[-164.08218366288,67.03913532024],[-169.01504499101,65.68268604273],[-166.57608014726,64.50777504773],[-161.82998639726,64.0500622981],[-165.08193952226,63.26030016403],[-168.02627545976,59.7862264253],[-162.53311139726,59.73089435789],[-162.35733014726,58.55904663221],[-157.83096295976,58.31752983705],[-158.00674420976,57.52404350658],[-168.22402936601,53.51022153947],[-166.55410749101,53.14277307072],[-158.77578717851,54.88541314654],[-158.68240338944,55.7496444805],[-156.55105573319,56.00847621073],[-156.15554792069,56.7746616888],[-154.70535260819,56.14336689443],[-152.07412702226,57.37034511851],[-151.62918073319,58.22653323066],[-152.00820905351,58.98055685754],[-145.98770124101,60.24740887373],[-140.38467389726,59.48634241018],[-136.53945905351,57.80610084736],[-133.79287702226,54.83482554482],[-133.33145124101,53.14277307072],[-131.46377545976,51.69838238021],[-128.52493268632,51.74602265442],[-129.79385358476,50.90159054062],[-124.56436139726,47.49785657441],[-124.03701764726,45.48627362525],[-124.69619733476,42.90428451679],[-124.49844342851,40.3414647251],[-122.80654889726,37.53929308709],[-119.99404889726,33.37084692374],[-117.24746686601,32.54119524801],[-111.13906842851,31.19770451575],[-106.70059186601,31.23528720858],[-103.20693952226,28.64618215851],[-101.84463483476,29.81580068657],[-99.20791608476,26.28743998885],[-96.79092389726,25.75431753335],[-96.92275983476,27.96911213371],[-93.47305280351,29.68226300815],[-88.94668561601,28.87732407469],[-88.61709577226,30.17736083469],[-86.20010358476,30.3671253082],[-84.96963483476,29.43379356715],[-84.09072858476,30.06332630046],[-82.97012311601,28.95425748047],[-82.97012311601,27.26823750278],[-81.25625592851,25.07956298739],[-82.09121686601,24.5610471236],[-80.06973249101,24.76073298597],[-79.85000592851,27.11188091684],[-81.27822858476,30.70777424386],[-78.99307233476,33.20554049136],[-75.03799420976,35.59830000028],[-75.85098249101,37.2425160052],[-73.74160749101,40.4585957587],[-69.89639264726,41.60224497127],[-70.68740827226,43.17628724449],[-66.93008405351,44.69516042167],[-66.53457624101,43.08006996122],[-64.20547467851,43.35229243812],[-59.50332624101,45.73220792131],[-59.51431256913,46.24761804024],[-60.00320417069,46.25901313529],[-59.99221784257,47.24505773341],[-59.00894147538,47.23759898478],[-58.99795514726,47.50266941922],[-56.51504499101,47.50266941922],[-56.52603131913,46.74770404019],[-53.99917585038,46.74770404019],[-53.97720319413,46.48358117386],[-52.49404889726,46.46354265729],[-52.50503522538,48.75360583388],[-52.99667340898,48.75451123442],[-53.01315290116,49.99551104004],[-55.00167829179,50.00610367548],[-55.03738385819,53.74720613495],[-56.00418073319,53.73421061801],[-55.9959409871,52.00107125754]],[[-59.50126630448,43.7495431608],[-60.50239545487,43.7495431608],[-60.50239545487,43.99999882251],[-59.99839765214,43.99999882251],[-59.99839765214,44.2494016836],[-59.50126630448,44.2494016836],[-59.50126630448,43.7495431608]],[[-155.95024091386,20.49523373356],[-157.3267518687,20.49153389084],[-157.32902509355,21.23181053727],[-155.95251413871,21.23549220541],[-155.95024091386,20.49523373356]],[[-157.64488202714,21.24845058596],[-158.28534362719,21.24673774522],[-158.28689557694,21.7499618541],[-157.6464339769,21.75166877943],[-157.64488202714,21.24845058596]],[[-156.12602216386,20.32469602374],[-154.7461696274,20.3284088686],[-154.74174482011,18.87578125335],[-156.12159735656,18.87203473488],[-156.12602216386,20.32469602374]],[[-159.29077130937,22.24504086823],[-159.2892966564,21.76857042389],[-160.28916841131,21.76590592196],[-160.29064306428,22.24238530626],[-159.29077130937,22.24504086823]]],"terms_url":"https://caltopo.com/","terms_text":"© Caltopo","icon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAA2CAYAAACCwNb3AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAcppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGFpbnQuTkVUIHYzLjMwPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgofPyfmAABAAElEQVR4AeW9B4AURfY/Xt3TEzdHYMk5I7KICKILhwE8DCe7eieiomRByRmGjKCAIHhgjl+PNUc4UVZEggKSdsmwsMuyOU0O3f3/vJqZZcPMgnfeHf5/BbMz3V3hVdVL9erVa6HNhEciCxS7VtBJKvsDJlWUxCjFa8tdk+6oD/zU1ZOMhyttYXYmK1EhMlbgfnudQWgd161y8+jRnhDZgt6+ZdIkY0nU71N/ijlFyjBneAMNTX/3lSZH8k51u1RR0i3KFHZTvrUy9qy13NWvVbtebkWJ0agq0yusdH9+zv5u0Ym4YgfCw0wHY6Lj93zw5Iw8fz2C2WymjxKo91q/U8xmwGOugufhDUuaFpcV9XJ53T0kSUo+VFooJIaHxSXGxifbnE4lwWASL5cUHRA1YmmEVn/Crsjfx2gjD26f+dzFQJu16wzcv4ZvAWU1AXhUVRWGvrSwvdNj73uxorhNpGTofryiSDIJGm2HpOZ9y1wOKdxoYnar9ezlyuKzbSITbSqTf0mMitvfuVW7febBwyp5mykpEtuxQ2aCUIMOhEaTH/qkQHEOEgShHE801wDg9ZNFELwiY4lhXmFWxbqPVzIgFquGWARoYCJ6zRsz/YS9eLmLqYUCE6SanVDQcZHZFK/S0RQZ0a998p2bhz+zK3XLFk16WppcM2+tK3+bzab9dXqx4lmuoH7G6yc8BHQ8+euXPUq3sNiI/sm33vniX54MVr/AUlNFlp4uY+LFQatn/i2nrDDV7XGnWEQlslRRmFslcFSmEUQmW0DSCtEDkkYjaMIjQP4K00sSixAEZnSzypjwyB/ijNEv7pix8jvKVpv46F49qQY8dzw3+eFiS8UTZV5H3wqmGB3AFpfHwzSihsn4ZjYrANMIzOtVWUSEwACHiH9hBItXsbUMiz5q0Bs3Z8x68U3gG8Etms1mhs81EW31+Xj2/15u8ePJQ0MdLucjFtndzY4JLGcKk71eJogiU1VUSeMjAEhZVpnBIIh6I3IoLAxwxSoahju5kTrjBze37v76xuHjj9M4ABaCqQoeSRZZnKLX6ZnL24CJAo29L+HndZcCsAUAAzKoJgNTLe5wfivPUgdqS14ev2cTvOF2o1b02uwNGQawdhIxcEzxMlmnZS7Fq6/9POS1v02rIKN+CVTmRP0BMK7QFq9f9TJFr2Gq7KlbPzghZhP/0+XUF+c/0Hn248suM1eHMsDE3G7MiwAABUUEshHXlAVZNRjCNRgS0Dv+qEx1uj2YTgFI62Iuqk9kkTkO75A4Z+WQ3gvHfZPcptPYDY88fSGllkQI2jcqj7aIWAmeboDnEuAplQGLB/3i8DBFgzyyCiIBxmvDIjWEWVoUdCqKrLhloKnMLCB2C+ik0F7SO8yl7d1yxrBpf14zd/6Xk5Z8CGRk1RE/KCy4mboltYpZ3WoeN/Orw7tm54tyhMXtBAFgFDAk6LpK40NEIAJ+ozFSQ2oApgMPMbser0Izb0MZG7IC6CaS4J5qObFv8i2Lx5n3zNu4mIgjNRVtod8EC8ZTcDMvuqUyD2c/CrCOPsSKrrdPADb/N6bPrQHsXoFh1pCSImqTEItISuL38Ac4RdOH/tII1voncJYjYAyIO0uU8dqSv01JEWWR1w9YatVN17x+jLEqY9xFQvZqyYeMKk1wj/mjVu68fPrjLE9lhzK73Su4vV5R0CjAP8J9AKZKQF2S9JJTVQQXUNCFqaLfdI+eUz4BhVBEofIlDoey11Yw6LvMX44OXD+vawbUJSKSahDU/AkuCrygcVP7LRy7cmfB6Y+PeiwdSh12r+hRILUFFXjI4ZH97eFbAxgg4RRmg5Sja9As2uDwiETAohe6sNPpzVbtHQ8VZ6cPWDZpM4idIz4RSU0grlz5iCNdNn/9bpOOsx//6ainbPlppyXCYnd60EMZRKFidDSB8aE2MRoamx8eECvzKIpI8ND4YCwlEWJGVETF63B7TtnKxJ/txYtuXTx+16a8/SYiDhAK56KiqoCSiFOAygHSH+OjchkAWAXZi5HHyISUIIFhJlGPAaREncVFrQ/q5GPgyxMo9tu+r1a/jyHVrRMzRjdbTRu2MdNbOa3Abge5qSAMkRaGErQoTO5vSxy7feWADCAXj+w+4ayIyL6UvWfEO2vbE5EQ4gWpVWBmM2+uzYxhG391l00rsNkUjax4UQ1xDvpw6glSNuQtVEhcAcQrSBr0Ldda6f3eljdyyJrZu8+rqoFU2QBSVq8kQBxzvtjS+Lv9Px077i7vU2FzeCTONJgWCE9S6zfBQ51DGXw4zmslUaPKDrd7l62g73tvvfVPah+wUBbQXSCBewV+Xu/fYAHgCYpXlURje8HA+sY32U0wpw5sRZ2qJ/072F9PtVWPfnv9yaNGaVFc6b1o/OwigzLW5XC4RfB+dIS4YNBEtykLvmX6gMNx1SFoZtykjJhcHRiJ+4xiDTt5/uR7lDc9jasRVF31RDih3r746XVnRPdYq9XhAa8lFSWkFYeLs2rw0PxcQazqVft+Q0hLQEqJWR2ub0rO9Rr13OS36AmQ0pfhyl/BDyP7cu/WLT9WXI4CIC6wE60XyB0KYYn7EQw0NvTxDeeVSmv/ghILDsJ0zOlxHbQW9U1Z9sxMypMCY8CVfpCAv84TAQiAsQT0irHGMKlnWMLOlHY9222d9+LnGF0xMJjXeTeqgZelObB5s2fYaytuyLWVLbVUWsHSBHDF0HMBJIdAgaKmyiIYhEbVajRQHkRonRwhqlVe5yfK6Zhbdp/3WJL/+tKSxygDIUEgI36T2iU//PKSBy54LROY3eEFonGJEchT+5sQELCAW3lFgoVggiYlKqqCZTDRVfAEBGfIqpdtDvdhW3HavS/MHoacih8GXigA213PTZ+RLTj7QP11oz19KMLw4wcWBjLDarIKHhLG0A5kiJlQRblE0Yii1upwsNPlhdOe/eSN6AxI2dB6aPB+/c/ukjLrRSdVrSS1l6K8rWIbzPxm6soX9hNEWFQxsznkZPzPgL5Kw+lZmTzHpYL853NVF1mDvNDdSaIETdBPyIwgJphMrLFoLHeJ4gmnwJwGr9zIpnrbX3TbgZIYI6gdwSog8QrVRJPnsLELxbljcPkWkKBK6hJCULn9F08ty3ZZAI8kAJEJ7+okugkVX1Z1oqa9IYpFSYZLxbLnrB4EHmEQOhaqzuhsu4X0GBkaJBkT6iQiEp0gSYXWCnZe0ax87cSJz57s0AFrelriMJYBK+XML9+L2fLj19MrXDbAI0qygppqQRTQr/AE+CFqWmjDWEPJdKlYkc/qYTvQKkrHE15rtBPGDqjaCqmstesg4GA6BCEJHouWxR7OPDwCt1Zf9wTCRRwZDmVFig8Ll9rronZ1btd95Oa/jT5BnRq1aZQ26XKSbE5Pp8s/VjKnu4dvfqHdj2cPDmQON1iqJjRxQGUgztwjIrG8fVKLme2bdP/IPGRIMXV4h6pKmzetGCiez1ybrdrai2ReCWGy53q3W2aXHRW9xr2zoc3GR8efMUP6ZkA4E4H0mDd6WKantAMQ2wOWGxQejp/YTGBaQXNrRMN9PVp0WnRrcv+daZ07WwmeV7Zvb7Dn3C99ThfmLdxrKejqcblBJCwokcCiAQOf4AGDaPRO+ktpKP5a/4ULNSn4kQFt4fDpQ8PKtUoscwIeFfDUIg5k4wnEoej1Ok0PU/zOlo2bzRvcJeXQsN69+R7H6q1bY7cf3fH40aILz+W4HbQmA20HrwmcRayElatMqHwQFfsIhNokkiUqp8/1kgJSA7JY6qCPltvEN5n15eRlq34CgKS7D/lrkmrub/Zt6AUsQfUC/5/u3W+v/1LZpbuLNaThk/SAhTRIIh3aq8hi1/D40sE33d5zyb3Dz1fLJvQHp8X11nFbNqTsPPLz6WPW0nDsitCOSR10AoSwP4leu8Sky2X5t6HcmQw/cVCdHtU93eXlZlsxlEhGHV4Rmy3Jxrivds3f+OddKLeOCvvaU0cOHFiA35/Qp8u8EVuOqRWpqkcmGIMyZEgGsczlZOWSnbj2ayBUhaX6YL9YVDiwFGZrvi4LNbywNGNRpmkhmf6xZ8HGh/egkvfxQaL+q5PvvrsU36v/vHZ2sT3/3FslDrsCI1ZQgqXRYW4vc0ieHpM/fb2pCAEKoSzTfhN2d1RYKtB5iPI6I0vN/ZcStc23m2A4iQsPl26LarL7js59uhFxEAijNm3SHkg6RcThXfPrjugR61bcAAoH+MHVgf8S2GjmGkat1iTLLvdtFtlDa6ughekmdhOUOKhVLWOT5hBxtDA/biCu72+Q97vJpFTjxrTx+S1ik9ZqDUZSF4Lit695US2DmeNs8eVmNDbG2BKukt29fOZNpR5nV5j98TS4moaMqEKR2jJ95Z9vuYsQGnsUZh2pRfhJ1dNuvTho3QS+1zPqnqFPddSGV0Ifk3xlqUTNhA5AiiisyGG/cdimpY3wVGHpTF51eFsYiLkP9AcMTjWDUrXiGAQY6BVNG63JPbB///H0KNVcAx5mVvlYSV8+u+ztFrqwnxnUMN/WSLWK/D99kkWQKwXFcPLsmTaiVhCiI8LDWJTRqDcYjRLp+DDaY59FhewTvFho1ZrSupX+nncg/kCrEKeiIHU0xSm3xbecuXPu+r7rh43JIqlh3mGWuBsIdswnvb2+Z/rnW07+cPEILfBY8ujRQTnUFfiC4uCVx/+1X1fALHDbmnOFiMvwugAAYiIAKRrbHs0aNfyccjzOWriBhJhLv8AHc7jlFt9eUKwx8uNGfPtBqWaBqVkvYQd251miKbwjPfnm4Bd8YByCc+glEYxegCG2ZpGqKzzwag0G1jKu4Wvmu/5S2NmcqktPM7uxzggUUQm2byaud9Gzib0HV0YbIzYzgx5snv7XTT6kZF6HRjWWlFfcHMhx+Kefm5TarTGcJEMxP5IeOokl6iP+uWHgYyUshUnp5hrwMLNgVoA7vI/Nw+K+MWFfHAyAxq9O4p3ARnIxNkTPFeVqxJYxCa8PiG258e5mXV9INias6qgJ/6CjIfJiQ/jTKFBtZOw0wJ6GvTj/ZNSp8ve5QdDjQ7wLi9Bw7W3RTffendy32yfPLnmOWiDCOHDKJzWIWw1dM3fZtuO//LLbXZJ41mUnNypGUoW+r+uETmKfkLqLPn0RD4W4DXFIrA5JItRJWhp94EDTsJiKOwbegVUvYwsWLKjTz/TULXzCW7VsfSFaZ6gAvRHL5WzdP7ZcRPGGaaihKlR63MStGXszmyOuxW4Dt5ZDwsIBVGVNM1HPGic2+YiKduqUGhTp6VkCK/IhocC2x3DvHp+ptDY8PpgE1QmI7R7XjVSWUqGlvJlghHWa1jscPfjtGn+wZlc1ko5l2yy/0IPkdj5CqJEJF60GlnFYPFpxN8QSRkbl/hTBYVHVaK2O9WzV8SZp9+z1L9eubMOOHeGf/rqtTwerdVShtvLBLNkmwRUFLEmEiST4RNau47dck+kSSp7CtDqpoSxYbghLmLdtzpoXd6ISkhqtBg5UzP3TSIdlE7as63X7kgmvHnaWdK2wV3r0hjCtEXtP5b+lwesk78nLeczicQFryD2i/kRbfY3j24dERtTBicZ8d1pph1mPncL1TbASkYcBV5+q187VL1XQFNtt8NPgyUPqzKtb3msDoy2KYlfA7+JVvRzNE0hbjBT1l4Y9dv+B1x6fxNJTU0OCnsJSlAwstVtFJOWcLy30YIqx5Q3vD/ytqpegpiswYbvi1f5QcM4VeJZVVuAppi6AcOpwhECmQHHsi9OtgOdEtcf+n6n4TmftW7TzZlcUsSK53KtIZDEOUrOqeuxeWSorq9BLJAYzs4tE9mYGLXb5BIzv35+sEbSj+M9Rb6+92XQua062UDmk2GmHSijC2hp60whlri0BLr9hwItFkBRpNIpNmWFr1+ZtR30wfm4OVZICuzwGWD2QtpnDdf+auQt2HP3VfMyONZfMPEbRoDqAFxoRmiClIL5Y/P51+kfr8cCRgSboCr7UBhXrDzwUWYndEvvl1+mReG6vnSdwHdh1LrDZ5YjYKKY4XXpy3KudYMORnGDMsaIp6pz/4eG9+9s7ZW9DqHtggcH1fWCgQlt8UcawrP5CSyIu0EzovQ7zArPKzIyVll7OpU6YwsM0vt29uv3FxolUqZfYPbFN+37lhwlrC0g6/0WIL/RO8GIN1zYirttl5MnIMAfN2TkrSyU7p+xwZju8biZEROrDMa5ByANbRbIUGxnGEqIidFImTI1UI9QWcep7mzpl5meHaXUaTaw+qqilLuGSefgT+/D43j+vmzv0QkHeO0edZQb4FcENglwgqOS/lrA5S3tbCqzUUhuN0ZNgjHp69/yXNtPOQDJMt61iBip+T1p15JurO2deOPvmpwWnejJs5EgaiXQSER1VI/SRLNotlnOsCeKL9a9B9x8sVW3M4JKtMYq+tWsoTABnAIoI3suy0/TrmaMDANn7PTfztZbPelcNVJ+aJbBBbbq+ZxO9hyEGHGguCIUAqWUlXK8z7uT7SKijwFYebyfsBcLj75VFUrX6AQtOF8CZk6kH+G1zCtxSMqrlqPXTj9w3J9/pjck5+LzV6w6DixgEGCRILajgOgDlmpliJOPeQC1hBqNY7oF/F19ehaQUDbwzWaFUOYg299Y+8EQ51kA1PHKpPtzjI7/m0w25D/T7y7LOTIgig5RaXZoFGobjI9xOw+Ni476Q0jYt7X+5KO+xtnOHJ+tVsVO54hG14DqwbFX8qjMU9l024ecoKfyDLycu+XDjkR+/e/3Dd77b7yi+UXV7PXzjhtTKkLAHWrzyzRUBAIbdGikcA9CM6bcP7N570rqHxx5DLhFOa0JR1kY1fbRPavRbOnHCP7N+eeECc2NmvF6dRivCIQ6dVaRWkdGsbXiDtU927vViGvsHRiGDS5orrV2HvzBWWHLwdHO/uyt/PLWvCEgZidUC+lRN9fCDTrNKfodFLuzwFufM26+q6T0FwROQFv5svi+fmiW8P3H+SzXu13NBKizt5oczqYeH89N6fI4g7eJFibWIiLOSKTUF/yDh66ndx6CxX0P8a2Z9Gas/C7jkd4lvarPmnYTnLVc2gnJ7SDVohKL3hNcerj/00wzUM+vdkn1kLq9S1fx1cwJh6ZnuT9Iz51Rvr77f0i/ZJ5df0Mk3K9hdhTM9VQKbGlZUWimKuZ1RTHC2jWKlj7SfOfzEt//8buT+RZt79F487h8XvZa0vLJyGdwc2g55btafiIZASVho4D9O2TRmOkfTsPgpe+etfzmLveWXGmUkNUiXVB9at7j1iaLzmw/biwZUum1ctQNBCm7sBxhNRrGLLvJs15btR77+2JQd26hp4kpXLCl057pNosYne59o2dLZc9HYo8xjaa14sLdHDpNBEje5Kqr3nNveYeayKaQp3E9uNVwF9e9+VyumEvGc2x4jhtbHcVQCxwBo4VqU5fN2/i7/vNbJFVUSI6FmUxXhjsysLvtBai+hU2aojNXA8f0kWKnN+mDKwPNUrDexrpFhemK9OnY6fvzyubI8puJQmIA9iBCsmPxVXV52Xq2Y2X3+qIOHFm1OB+1K5hSzAslB+FQjEQFa8trVCwvBOiQpSZZK3A6rip1VLHHsilZnitPpJZOXlUZodBcahkcVV7isF42SvvsFe2nDS56SH/ssHL9+97wND/35hZn5Lpd7YokHqijWAzjAQ6ZhLqQDfJATBawMWPPBWwfre0HRRhtNYpKo294uvuXITyeZswG5iMETMy5jrTHaJwFSVkwcvzc3a/UFwaNDx2F4kDRwV1YVDXbT4U6UHNVk7UvTV81sKwguNipZyzbtJ6K+5smqMVr/44sG+oi9Ea6y+y0uaDb1SGLghuR0ueTtpefu67vw6S3PjJjxWFrTpo5giOD3SbuqND2wGZ1PSefqVK+Yhk22l+fysxN1MArZCDTMLzOCITpNOv86KBV3iV6vnjLqEnLQQumbCSiexJl3pFXcMO/Jg2Cof1Khc+BuHYODPy9QTFQqvR4x2162ZfDKaU9/PX3VBjPWI34JSTK7Cj8y+KG6DH/R0F+kR4pGYmfovU6vM7XWhh3pG9vs2ZQuPTpmLX+rx/dz1t15YNHrT+2a/3LPnOf/0aR1XEIXtOKcuOkF85dTVjzTPizhTzeYYs4nhIdpZQ3cjqHPYQwhJEio0F4VllmgDxCHGGnSa1vrwktuDEscn7X0rTuIOAh4UqkweOAYGd5H317Vsvu8kd8eqix66YLHphPdMihE1Higk5hMBm1yWMLJGxu2uHHbjOcnEXGQmwkrgwfvdUMcVXMQetRrZenYqPFXTRRoBIoXi5HQFELFyKcJ29vyT47C1FWbF2U++eoLf4KG4+Vckk42htorCA0NVrU+xDHpjB3JggUOFxQILtowuZGilrU2RIZC1Ppa+k3PiGlSAb3W8EGEXgeEAlaFSIS/tHdHG9zlXhc7UJn3Um/z6A9mbX8rjtRHFFNRX9B1VYgqq25LDqZGNtaHsWbayAV7zBsWna16xAdKYljNsEzfJtT/jZpPa+jpw7ZsCB+1aUXU5tEzv9+Wn991yRsr/tpEY32yzGnvbmFeg42GGDMaBmNIGCY0wRBxLjLC9O7tbZL/bv7LcBxJZQIAxiBnqOl+C9WdK6eN3Z15ZM1Z1a7HVr8Hbj4i7II43SSL7SJjWfuoRi+Pnbpi0mAQBhEWierNo7lzXQDl/K1e6cB//1dQ3KoJRrUsgyZM0D8//JljtywY8yFTHEMVl0Im0KDuJlQJ7ygdlsLRwV/chS0rsj3b+5jHru/TqtuS54ePLSS1hBAh4xq5NQfMLwTyLGXw5MOGNqFi0OQbXnj3gpmaAmMeNOfvcRN94IAM7nD723n7P55nEYVmIF5iuJxwgrVBzyBJ1AKrRS4yeh4q2Lat/4DlExd8N/PFTWAuJEWwxk2tcqEPVkfte1JnQ/SeyPCoWdtmrNxBD8nsa2gUA3WHU54HxMGwMNQ+vH6i2KTUIjRt1VkzPm08d0qj/Hc1bGjD16v0eeL1F5rm5l+68bylNAq2W2+rqDhvUmzMkXfGzj1LAFID5AZQBIL3D4A6/r2Xmu8/dXTzLxW5d5ZhrQFB5KFVlwdrDZPJKNxgiM7u1qrjqE2PPvvtF9Oe4wiAatQAEvQyjx5ThrPHp1/44O/cq9d/VBJ5rvsU3i9OZesZ69C8zYKi07ahZ9RyrQYjgEMM1cioZjf8RKKVVFE+VVEinjLpJ1hP7XtyyJqZyx59dvmKNB8iCECE3+T+X+ay+4REzeaqrgIAgUszA/uXmHFVXdf4g3N9c1qa+5aF4xYVOYteddnh9EgUUE8FEDOURVIdHs95wZnocAovd5r72JN3rZw5b9v0FVuhfgIJmcbcGQ4oQdYntauW9izeNInfhIhO7TQOHJ1vyCk7zp83rP1403155cUDxywa3T+3olS4ALNsg2MHNL0WjKqINoXtjo+I/eT9cfO2+yvVvDFiSg5+04enbP/3u+PmCeQ/FNdIJ6ePNnOzMj26Z83MUd9m7nvxlGw3wFTn1SFCCYIS0FxoEnRGlhzXbMP8KSun9REErmunpJhZRiYWhiCCOV+81XjfsV83HXCX3lMhO5fzpmLO0SSHYoE8y/X1pxNUS7P0xoipWXesmjolX/C8YLU5vHBO1F6tE9gE1GgkEBPU0CPuUlOmbFuSPWfEiLSXFi3d8vT81/k6JCUFC9WUoAvVK+PgEyFwhvSLqCtP6v7CBhi0AoPBRyB+4VM32+90hzNBMxPhgPhaz3kj0341Vtwpk886HW6qJ3FdDJIY/otKfrlVzteKPa2Vl77pYR71TZQhZtqOmc9hd8PMGKmlCzL4WfZQ1VFPObcpyuqME2a+CB7DXl7+4PS3lq3K8dpb5sOTEvv/IEuYfoG6uR4Hy1UdQEND94YVheNaz3jkwI3N2i77cLz5Y2pk5OZVD2c7Cg98+8yq09UaVbPNbzqzcWMLDu289vy0O3LKC6fvK7pwW7EDm4+QGhKOCUOzwqLIIPUNS8xp3bTF8DefmJaxdeoq7tJ+6nJSldS4dcnEB9L3fPfqKa89FuCzSFjEuF/zH2EfpNqg8J8+dUj8dtrzq29bMrHPLjX/QdnhcsMnTcdtXQHWXbscroHSeEqIICmywysf1ZS3ys8/8doN80c80alhm7n/N272D+aMjGtSu7Bg5LUFaYbf4mAgCzaKoePVI0Fo7ZCZWQ/UoVrw3Td37lyDs5uZ798dXe8YVrb/i1/O6rzNNR4VuyOqtj5JQrWhT3QYEschVTmnsoLl6G2Dmjosg25fOuHNbm1vnL4+bUQRqvcHhPAFafBBceWvBDEjcGpKT+eesVu3f7Pup0vHHz1vh/OGLHi02PsENKBHURuF8C4NdAa3Tqu7iGNblXbVo4nQSD1OluR9NHDZM1+2a9Pur0qlO8dl83zUY8EoS5Sg2WbXas7FR0brC4sKaQvjxkXzRtxazjwdc3G4B34/Xh1UCjc6gnMBmg7RcayhKfr5V2asmUuLcFprkJvJZh/hKrTo+ipj55oTtuJHi5028liwa416k12mg2Z/3ARjBk4ICWzn3HVDsbj8PEuqHFJpteE0G05Q1Yu2vj5jt500H5hbBLnIalOKdK5biy4ey+i9ZPwbKd37TFnx50fKSK0Adwpp0OC+v/UtvfkIKwzno5hJbwiVk86zh1xMX8sM+c/1UGsc/4Gf/JTh8rS0oj8tnX2zq+LCz7kaWzOsKMBEmO5qjfmf4ywahggHanJUm5RjcT+e/2vZ0LQX5y/b8syi5fWYzBkRCK9j+N+X3PfuZ+9vOuCqaICzwrIRZ3dcGHEEsdA2NUWwhobIH2D23ZwQ3XDv3U8MvZwmwMSINPOnbYk/HdjXqMBe8UR5acXrI/9y34jPM/akZJ069tkptXJhCaQCKyghxzjf1o0b1wocbMCJsOTSubUia2g0MhgKDndq1PaZd0ZN/6HtzLVVUiMg1R57ZdmT2zJ+WHPEUxkBdUzWI96RCwEt3NiCbaLXm3IJGNi2ySzzR0sgDuKafPd3r3nTvbctfvrVXTrvk16ckQC3plOG9bDsK72l/ShIHg04midPsUn5gvxE5U9bBz+wes7oTyYv/QxmMOCvr50rpa7tF5kkmUarKbBUuAut5eepVBbcN6pKQxUCN1ZaTXlwZoHKegC9wQFDL6iryvl/kJ9XpaKYUlt1OZj+zOIVuE3qMsfNDEhZ8q74bvSygtQNK2/OKTq/e6+jqKUKtRwqH/yPr96On1AomomKmETek4IlvKTo7LIBSyfe36lt14dfSht5nqtcteKqSbM+fitu/5nDz+/KPfn4ORu5/Ekeg06rcXghNySdlGyIq+zStO2Et0bOfNvfF/b6CL5sIS4ij+17F1ml6PPs6i1bjF9+uyNxDWIv4brfk68+f1tW7pkxFcw5yCZqoitxZsapk5heo9HpoB800Ohko1b/U1xY5GvfTF/1Nvdf8G3wMPNobsVQEOol8suff1z//cXjw3Os5RSSB3suGhGxq3CQQW+41ZhwuXPrlp9tYh8wMzZ2zGj4j5iAuLRW4ESyc95LT93/wsyzZ8oLlx2zlUp04g4UIiGCC+fj9fXPhwiQ97QtBX09izkaOMtzP+23ZMKyH+eun1O9nbr1hK6elAjEWRDOuu2Vq1aNJrcnhrquEEhmKgqnMxxxHGqL1CULDuzLExO8xsT1JY0Gu9RqKxQhAqkBDBmNUrBeSx8/PX+Hqnaas3jsO2c05UMLrdhEhusRtttCBpWoDgLGByYQHOpgGqXYavV+77T1unyo8vi9G+c/+Pm4RV8hL8frQBlp+6+73vmV2Qd5Ky0eHRzRPJD2cFoTm4RHiV0iGnwx4OYBo6b3vyefCsICpUlvlKcyn4WLryM3wcIFWzPLcbnEyWlpJFUuBCp/7ampO/F7J4VsuVSc0+d0fk4UNnLcjQzhUuPwuLJ2DRofWfXw6LOB/HQQ6tTly8RNgf2M3bl6zpD3f9y2+bTqaqg6XF69Ros4UAhvBXWsdUQ06xjd5I3RUyY8PURIslOwL5TjMAXq+6N9A354CkLb6i9oPp2yYvnYd9ftMJ469topT0WnChvWajh1CM5MQRSumqCjE4LpcAZdPldRouaHu2YPWD65+/ezVt9D7eDDibFmRVfwveZ9UCcQy4v16A0RCfFpc99rN+eBRw5hDwuWspqRJ+HcVMps8NaSVSdgDaWK1a4ePADTqnoN2KmEJ2rwlAG8IC+B/ohLhxypd6+c9vhlofiVw+4KCYGvEL0E0SYhRYOXrnkXIfywPBF0Gq/gOe4p0dsvyV8O37hkztvj5i7j6igObFEJKctaZvLCUcQAlcopexDkFYsKfYKla6M2z7w1bvYbW9kL1Z0HuQVqxpa3m2XmZD3icrvuenH+iKRchxXAwUQ873FNpNZ4IiI8Ymuflh2/Nj/wRDY1snRI2iV8VW250kXASY4lM23KELMmg2V4A/FwZ3y7JerggT2vZpZeHHrJSctv0aMXtBqXjHPbBkg1Y3Rej2YdR78yYsqXX05dzhehOCTDiQqZ/9CJ1C10wEseAi8Pm7gXBNN10Mpp888qebNPq07ovbKMdSGc2eDeU4PHBu82XK/BVrSqHdFDvpdzB6csfebrjDkvDiYi4RuLaWm+gldh9tDO4KSlyCYj9tJFIYEKBbNiIZPE1Wevl/ZzrglZqS70Gu6nAAIMgK5DJVov+ImbbZ2+6s2ZH723M/zEnjVnbaX35mNdCkqDFVDEfirWZVdJxGiwwajVCpJ8wVIu7C45v/S+tXNLPnt2ySZS6UhqSVhky3YEFHTKLm3DiEjWJTzhq3v63jZy0m0PkhjVpGAR73MD2UxqqHD3qqkrth3NmHpCtotONyxcZP3wi9IyWthLlrZRrvIhRaXFnsHPT3uvS8sb5q18cFjulPdevivfXlnx3sgZVd6aHP4DzJNxwHeufNn2j+P2Hz847ssdX0/K9FTGMI9X1mKMPThgROuNZmGRrH1kwlsjn3jq6bREBAhIYVLquC2qz3fHzKv7/82fzQe4SgGCIcI3j3tn9btJF86vPucoH5Jjo/Nh/LQnnWa/Kpl4oJoBaXSy0+k6oi0e9Kflk5d9N2v1bLawPxA4gYsNEIB/WRx8BGmaaVnghprsUOA++z9MnLjRPhlxVjz4yDn8vO/B9eb7z5fkrTzqKGvr4dFL+Lhdk7SFMqiBe6ByprhArbRY/566aUlm+ui5PHayZCcvKZwN6KpPqOjQoOmU9AmLXtvOXqwuNThnfnjtopt7zB/x+iHZ1km1Yv0lYi1AthOSjdxNhoYPo4x4rBVOh/qrYtX+Klsfz6soSRu6fuHQTs27Hs7c/dkbty8a34BpNf+AC8HppOg4I4hMLrNaYnCm//Z/7PzqT5dke2yx3Y44DdgSod10FQxBpxe6aSPzOzdpNeb9MXM/+3bGmurw+dQqEO/143Ly+2BPBklF9KvzwjTtxkcnn0Gt9963zjywSenltSfcFZ0RmhQaCc7ngC1x/K2nWTLjgtnoSysq5FOKOCv15cXb08fO+56fB4I6gRMOJLfqT5heLwxhdrfPalilEtQsRZIJxAbrSbUNT0gWEo1XJeaaVdV/RW4kFLIUah77aIL5U+T+9J4XZs44W3pp9gmPLRJ+fDIPrH0NahckLTRYrbdQcUsnLpx5B5vj7chrWmokGSJv0IfvfvCuB//ybG8ejUKE1PA7D/qkBiLNLd1bcHJWtgciTIbfuUarBdVp+cFlrhH4OoKR4T+gClIgEgrn6DmkFphckvC1Z89Xz0Ak3pVsfup5l1dYVuq1shOWQkhthZXhAIsVh16YCxJJ0DgwjIicx3TwKGZNEDmxbUTCG08O/NuzPIxLQGrAJR4iUDZ/9UbDvYcyE7cKwhGuMlw3fln1T+41P0V/MsF2Aojw2UTzdpTtAheKMZfUklUnZWc4XHMowNtVTcKQJPD706o5TguLz7+4CvUkY8eML2midXAf8SKuFlA4GLHxe+BBFAe4POCvH6QTWEHpcWCHifAWwsGrqhyqh/xJiUyqbv0uPwJrIOCsRAzlqykrnpvx7aa/h/34y+JKg3fCaUsZ9tkgTXhc4/qbBJFI4ADu0zpnixFznhqH3C+Kt7boOPnHBS/3JeIgvcvvPOgl58GHNiy6CQh9ZJ+tYFa2rVLVyFxs6UAc9XaTBpPy4DyYTo/gecdLCuT91twX+yG85gHzq1MHt+/doYGsec5jd2RX2KzYDoEQQCER0TjC4F/SQGeUmkv6gt7h8R8MaNejz46560YQcXD4xqXSbj93bhyx6flbv96/98KhoouPUtevHrSBcv0xkx8RZEIE6sH3s9b9/b6eKR1vj2i4tQGiTMLED74U+nRfoNeQJBKcEr3FXluPxzYvuxf3udyINYSDrZGtKpCz5jesRGBeAuYVgbK9tEaulbDBR3ewu5kt2Oz5WK6cZF7PGRUfGKpPJUo6B2EN6g/RQq36fuMlEQcxSFK7nrtjdMWBRa9O7JnU9s52hqhTEtatiLZIx06v2jZUUcnpdLIKr2Pq6t1bjNJrY2f/RLBwCrxMLue+g0p9lk1YvDv35FzspmMIFbdGo4H7Awb3NyZEH8f+oFa9VF4h2yLkpZ3mjtCuTHtyIaqZad7/xaIjew/0PF5woV3bqPi2JoMp+uDFcwd6tOhwqVF82+/XwCrGFyxwCUjBgqO6S/zN5vGL/3n2wNxcyBpJ8ZJ9+o8RtKHa+BVlZdXLaKplrfoZQARSu1Y+ODIXDwYNXTt39LGCi38/4ayEoiSA3YS25BCG4AAWy4HX65niy3/DJY+Ugqg2dh8NEImEwCNAi0PCDO/jqAs3LfqRytd89Bh9V6XUVMmTnu6Om/vUykK5YhpzQJSEiP9VVeZf/QFpi60Cj5ksdBlm8f/GzPkW6+aOt+CIRo7WOu5SZbkKAvDFC6vbA94qtCB4bOJMupY1+Xrnz0MkMpvBzYRczjkn+duLi5KPFWW/ftBa3M1ps9ELnOigAm1b/MuJFonQlcVyq022GGUziETIWvK62dyTnzTbiYp3Hq9W+6nA79TOukH9BgjffHxUzsjwwXf/i/OSzxbmvH7IXdLN5bLDumXQGplG4hQSKPdH+b6dAxpiqup04grWVqld9M6MdPVDWF0e2bRid/7JA9vKBU+j+iIrUq1YGsAM5mVFtoqe606f1k9s29Z1oPjiL6JWNxjnu9HOlaYCUPjuCMyBRfqlcgRg4CnoKoQTSqAcvjnqFLuslZIWR0mrPbiGn799bFApCIRgUOg4BNQ6gnV86npzznfOzOWl2LCGeZdi/gStm/qJMkIRwv5UOiz9xfSsoiri6L/kmYV78k/sP+Io6+a0O0lqgJiuvgBEnVdNBBAAE+FnJJ9V7AtwqOUNKjRwxqgoWMa6Ba0AxyMpvhJO4nuf3vJKy9uXPrNx36XT+4+6Ld1cDic24TUKLO6snP37QRsCKBH4DgpP/TeDDnh9RTIQ+A7Pqcmrf8gIUStxh0QgQpsJg/TvjZ55tH+rzilttOEUdoFiYoXsCp1hg64NhwRP84O7PmtJ1eKkOL0bCqWCF+N3cfANbkEsUdUnURlirPRdK9G9K5+YGICCcx2wEwWvuVbpmpdU5Fo+NUv5rzbDTEvShLYS0ieYVwxo1nF+NNR4jA9FwgiZoKpifBAFWfX2kGit8bfNS7tn5Z5/42d7QXebDS7nElRaQf23pEaw1olIMAmiy2b37NPkPX7nc5Oj/zlj9QMDVky596aFY17D+ZGPEsKj9uBo6fksp4PdGRkTVVZp61rutQ/YdvCH4Rc1Xi2kBkUFR9xYbI5gbZpoDGdt9XFlpCemJA1RM5gvnkCw9q/lHhkayKx8LXmr5yGWdfWEajHdsF7z/QEwibWI6j4EngEkAPm9GnUAkzGXWq0olCgLRw9Cz6DvcuSrgWtn1n/jIiL55Gnzqd6Lxj11TnG9objJgy5Inb4GCBAKuCbZ7I4WuHWiS2xjZ0nZRTCbGlX7cgf+whAFWwA5rnamW4G3dwUe+79rVuB/gREd5GCcVGrlDnH57BtrIg7lZ3+Bl/bE4Kg1SYE6c4Ib8C9XI+OMph3fzVo7EqJDxKfGVIBA6Fplo5j2wwmLFicvHH3zAcVzD/kB4m7QJQNwVCPDYKSJ0PaUbl3y9LifL5zYcAaWDZCMb61BC7n/UIK8hfFWoy2ptLh2qMr9nec9+eH3M18YetO8kbkXZfsbZxi8hUsraFfU/ZOlXEch9UsU7E86ET9Kg/NdoqD14ugu0+lYG0OEvY0xcdrWGS9spAHM8KuJQUEn9KtHvvsWoSJzgHMUl5f+Zo3SAGdnpKBNX7kJZRV7RuRgSvfKnY5bj7jKWuG1TGQjD56gDDSTTCwtuX+DA2zzeUw4hfas0xCIBIPE2J55G97qPPexRVleN+LKIpJ5ED8ljkHQsophPTx2+TwflUK7dT+PhYH8fE8wGDSAugIuPjDdc/z4TwTq49INbR+6kCsdt+b1KhDgz1pXePqgo/HWSayBq7KI38g01yEifzfUlCQzmKeZdUxq8Xz+ecs9l9xWKFLBw/7AmwTzIbGLzkpRPF5e9MQZOqiEN3lh3khqhGrE39a//4VFJIX613vwcpZMV9mDPcwjd/6y+JU3zy17W4h0CevaGcLcsUadsViUNSWykwMk0EsYdVpjpM4gtdSFFSXrY1endElu5ScOAqoO0lSH1IAOh8LBqsKQrOWke1rKTL6yQXXs6tUylpnB270hvmkPFUwJ3Cfo+Pluko6psHCNBHs231OoBFMCG1PcuE+vcKvx0eMcP0OM0MTwSPKgbUNlOnXqFLR+PFLJ2Q6zjoA08lcM71oEstXgplS+eiKmHkhNo+Id0UAYVINRCJ7AYwQVOnyUwdSL5zD7+h489793N1/nhFIp4IAqXoCqIKx9rbHh1yoYOliA1ePlpx3gbhSy0YwFCzjTS+7Z+xDOGkFQQqUMabOjakgLRegddLocHA0rKQVnmkPW/7s/ICLBTGjheerOclb26zZ/REG3xq0HvTt6zjPPvP/KsovFF+9xOO39LtrKowvwuq4GEVHaaJ3xAhag27u167ADgZqtXJmCWY9t2nTVoA2t4hsJ53LLKaYT73zwDgmKBpRr0uop/OU3Ph37KkSS7hu1M+UF8fQLa7ag+AVkBFfAe5FdjspThbknqH2OoDAaYY7hN11XHaLlMuQtK8a7MbIunee21fqhSUGBDHbSZb+gMdI5bh6lBvdqJgKQqsZ5f/h7mjgRNUhqdlxbcKYc0Ef7H9fpB6S6KEPquF3ODrtV1cgPstHaCERZs4Xf5wqijS8HaHyoldq10k0ZDKe5MTI+Cw/9a7La2fg1H0r8eqh7ivvzrZ9CXcqPxsE0eudMnXqxVgbfUtQ4nUmQaNr4CAVqCFr9f+amv0kdPCDcR9zOxPILzgN9Fo5b+OLfRprR4uv+D2+8hP/1/dlFXzgaPApHgzdvR8zVa5ggMOpDfJVIfAkDEGxGcVuwwD3/QllRO2oiA//qTT7kUO5fY47+Je9kJ4prC4wOKqi45QRrw0amiNIR9/3Z+slYM8P+hYBXwBKjCJp8BISYtTDcwr2/LTL9WL9pOIPX0ys6MelnRylhVFDMpeawtmHxiD/buXFzdhDXdHio3exHT4OIbyLswK06ayJflEcBUditjd9/86XmyHPCvHChYPbRGy5/j+QbjFvatBf3HbFpSq2kVeM100GrhkkWBILJbEMv2uHnXkIQbGCIvz+zT8L5IWgIcAIJQhzUDM708mPPyISQo//jxBEVG4rQl+WLeCPREVfpgi6zHzvdc+GYBzft3+9XdfxAwhpBrhHUB4aIkGSloOO35i1b6F7QlEKMGinCqM+MxFtNMSoSDUCwzBhEDb1yGd9/mfX16wlkwIC+H3KMkn0RDuFt40q1aBTivMSyA3NRowkgO2IPSyxSMh4fktTTTg8dbtchAZEKMflB4eEVgPhLsHgqtpT2oOsQC2OeFfDyvkIjuJXhveWc/fqe1P5LiyGN1+Vx4A3gVVb1MFF/hHbBOcrVLoFrwAnTiOi9iDXz8ZKcAZTli0Z5dQipZtGMwGXQcQk8DHwjEx+L4akTynASMAcEi0f0ysa6CTdpa14pl12RedkXOlCO1PT0oPNFhEzP9/16qElhZWUsFSUtJljC6l2maPQOj/tQ0MqCFfpP3wMCYSgkuHm5PMecFW3Ouys+XP/JhsNweFz9wJpZt9C5FRioPP5QqcqYj19OTF236HacXPxoy77PJhB8FBCsNpxAcD64bz4x/TT0+CxCALDsegZc9FwQnBG7Dx2ZSXWZM83YK6r5imIsxoWAtyflKagsm0NvJSIVhK6DJVotR2v1LCoi6rvAc63eeDYacaZI+wqVyIXEA4vKZUvpPWiXv9MwxbebXh3hBP/7OJS/vrK0W7a17EZy90WTQeEB4cCipLJYU1jhpEcmFKJtni9WF5YR53vJVV29ww8gHVByIMig02mfSrewsQwX9Jrj489KX8Kg2K4+AiJuHbqbV4r4c/WHkybeGJVNBAKLatCS/CZWdQVwIMipLHiUKkn/cbZUm6nRfG2ryNTT82MXztxXqgMsGFZOYHSzVvLXy8K1xmNBB7BW/v/aJV75RWtMLXRLuQTvCD/mKG2zszRn0vZLp3d//vN35xtPf+hAzLSH9yZNf/jA97/sOrszNzPjsOj4S5bbRtybZYQIXk3uB/Qca4vPyfqFQGBBCYTyYDYlJ4KeHyvNm4wACGlw0nf73TxwHI8jEqlogagvrN/ipz/YZy1qDsswArkER0i+GFQUbQNZ8uD1YB9SO5RwqOknHU0TEL86tvue+v6Cm5GpxXvBa2/xp+emrKC7GT5rHRblgMcHk8r3i/DsRE72y/mw+kGK0JH2oNXiPrR6iUVrTfs7C4IbUhlUythNbTvsivEiGJ8iY0svODrzPuKN58dsxS0HrJg0F8V8rj90pJc8Hoh4fYyKcKsKLpMGr3XnumRQkKh5X6q2hovQGX7G62qIf3CcDWSp/o3BgTu6W71QUTT2kb8v/RNbf8ZlDph6q83XnjXpjmkfvdn3YvHleRVWKxlTeJ+r13Xlt8pM0JQVJu64rgiEAKSRIFcJkDh2lkTFipfFWxAFPdNRHnEJGzdlzHtznuLpccphDS9wO1wqkDkSHq28cyGCNgTeDdGzWYdPuujCIUA9eD1l8ImikDv08tgSBKc4XHD2H7eteHbtpC2bunLQzKR9MPXVzN2xaX9fPLinedSBXZb8h+AsSJEx6hlw+LDptaxpZOzHLzz41AU/ArHnJy/PbKIPzwVq0e5CSKIlkCrsDnVXSc7UWxaPfRMB9rp8rZ7WgzgU+mQiEMbjr6xKgTXwp1/txX1w9loOtuinMaJe005iks7EmkQlfkb3Elhn1JMirfjr2OxYbfg38KCj29Co6iaaH6ynJBzgUg+V5i0euOzZdUu3v98AjIT7x2UQ8UI1RTYO1/gPXupx7+qZY6DQPKa4oL4GMUbUbcV3J8Jg3BpLQW7grhR8ttAIuiTh5brnnFZ2MPvkt/esnTV75idvtOA10Pig9LKdWxIeXDd37PeHf9px1mM3IrQSef8FrRIMEuSoSs2Z3jage999QsKUh74v0sj9/ZPsE4c++K6rvxLUAnSqKtAHNAR6fRwhntZk95qt6z5eyBHPNznBYKe+yX0Wj3t3t6XgERy2h5EodJA2ag97SWAlBrGLFg6zsnwEQZmsOrjdRGh17bJdlZGF8GeiDSdIFDJ2BE2+ejxq5+hEcUCnXt3XPzzmMLn3kAcDIRJUyJe/Ljo/RnDBxwPSM2gluEnrJqhM2JKWhFZaE4LySWdtslxA+Y1MbOiU1FZn8R4hsIqQxEF5dZAsbq9L7B3bpHj+hKmtB8e1rSQVJC09jcfRunet+bb9+ad+wJtwZRy58xlwqGCtBM4KR2xVjQg3io0UbWUDY9SvFYr7V6siu6IlSR+nDbuxyF7RDIH/WuYqTlYJB0BIWcxfcCmLccI5VlXzQPOuOz6ZuHgAmuPz1WbWsENnPNYbcN4YAx3axwwMT4HTK+LDG9gNYhh6JByrVBWLgak6k6jpeEaxhyEQBqQ2XpRbj68aYrZ4FBxd7W2Ie3Wv+eWR9XC9WiPyP76EqkEUzwmYSxlc0Y2gbCAIrBC7dJSX9Wpxw7SKrN1Dsf+ih0U3pGMftYfAU4KMwADH7IUaqGbd+MEwLCaYFXtyOIUGwgDKhiYOIDUoWPHow8J07WKTniPiYCkpEsyRfPFvhpWsSXzT5zuWFIw5rpRCm9AGNTtSdyAR0Bp6ixNLODSlwXv2WmMzqzUXuXQ+H/sEeG0zAtGERiIaKwT/9iZGRunaxCetJOJIgUqEfhDHl+mo6efPmnfetuTpr/KY6x7EbHaj/qAGEOLcdGbVYoOEZ/bIU17r7UzS3q7DNuM5sk/jKAOFMgUDASvD3i7WUqGIg/pXJ01oI0FdklvGN3qlqOTSSxWynWRJyCDpdJ6Dv+DJ6ZIP0wuftNquPoMiTQI24nEaAJoBnVkOKQRADKrX69a20UWpXTp1WkaOstedilVnoH6nGyAOHj5m7aOjL7dNaDw8zmAir28EsRHoBfNBk9/KIUka8F2EUBUgRohD60Ss8viE+wi2TmHUR3vl4FQuptPoeoc12IVXyfFFP/zKuOpC8JDE2/z4xLOtYxqtZGFGrKvx7okQsFAb9AgfmmewdpFWPTiAgLe9QBUFZ8TpwtCTT8QBu78b9kJdB130j+8+vWAV1ZlRzfuAog3SvQG9+o7qKoWDAas6vAKOjpEETaS/gGphmwPrx7gITo/HbXN5ELDBQ9cUGIHGDnSNmAzBJUfQiunm+jNEtMK3U1ZtaC6a9oMh6DDmQdyIr9TgU5ugmmt0FCgaY0MbrwwLKgoJIeClMqH5KbYAEB9b9SThxUM3JDWf/WrahPMpYB7/zxAIDSNHBizYP528bEvzsKhHm0RGwZKIE/kCYixhgK4Mdc1f4DqE7JQP465qwFZD4QyfASAi+LniCQ8z6nuExf3ytznDSWVgZp/J+Eo7/veZfDn9uRm3GhJ2MYNWh/pdYHFX8tQEhV8RYoIYiJY4TIAP9uvQRQAPqaZuvL5Y110fc/yhB1MHU0V+eHid/mswkRTJfOdf82IiYnonavRWnP/Q0viEgolapdcSEHFiCOk95siPw3S4Jq5OY3ctKZAL39Q9nih8Kv24qUWnv7ZkRhvsckRt9RIJ5UebPnhovgBHfeeXiHEAaCjTqhIRYdI1lcI2fPTMUjKGiBlgHv9PEQgNHsMxTbJqHZy/6d1bGnV4uEtYvJsjJikx8CMkXfa3DgrnzlizwHwKIw/eCI5VYKzRpO0Z1vC9d+ZvvnW00JMfDQVCVk0+hwWEEEDS2X+bNLCPMXGXZNDrQV2kTnnAmTlQ/rzX/EXw4AMKIjzBG4NVWYwIN+l6hifu6nfL0BvHd+5v9UeBqQ0PmEiGl8Zn54y1x/u17NI7OSKxGOs8Hb3MFdVymLiZ+JqhCZ6RKqNxJsIjKQ5tjd5hSBKpSqWjnfEUcPHXnpp8pkNis16djNEWhcQ3TmOhLCFvgK6CNxLiLuBH23yeiS68cE7VNDCaNLfFNH5u37xNT/NimEj6Js85qMkYJ+43r0IK/RE+ONgGONEDwE79AAP9DYmHxAenTB8/9x+De/yp9Y2aqNcaSHpZi4BgOJkHDz+qlN7XwieBVDBZDwLAAl3l31joYmowqWgfSEPSWaZhhk4RH2bSdtZFHu+X2PovGbPXDiMzKl+U1wqPEwCXiIaIZDDOZOxesLFfL0P83Jb6CNiltDgKJotQc0gl8xAsvE0IDz3ZwgELfQgeIswqeOh99/QuEQlPSAAABIhJREFUFsyoAkfPCKNR294YVXp7fPMZ+82b+q0fPNhFxJFeT5BvGh8iko+enp85avioNnfEtni1rSlaNtL4oDmMD8AhPBE8/jHwQhVD9wkWvlikBSP/0D16FoAdY4l+0FILwRAUkC7qQi9pgWCQwmFhdHvy+dj43aoywMUJlm+mLs964JYBHfuaEr6J0Rs1IBS8AjAAB/PBgTkhIwSNCW8X3/Sb5g/w0Dhy/Ab8ZMgQFaz66DRmn+jGx3sltkj5asrzpAaT2yn4k09JEBpMfXh/UZiYTO95I/L9IyVSHARYLYxljpWWtR/OYBhIkhDX2gfiTjQBlP+BF8ztLlhynwJtPISXlTYrAc7RC0KxJ4BxwbTjBaY+nkeoh3HSG4ACWMFiP8EEjpSEo9haSfy2QXjMa/+cvhrvg0PCglzdsYMW8yhUfyIiwYcT+rBXV7e5XHBxWrGjckiB19moDIo03j7na5eYGSIucpgIDqIfHWChPUo8o32DCKCpzqtURmr1P7eNa7y13w09XqWX0RAE1dupH6KaMWsnf7y53dEzJ54stVTcU+yyd7Tg2Hk52saaH21DDmCjlCtHBEd1PKLxo6SH6Zhgx3hFYDx1GJFoBbYGrbbEIGnOmzTaIxjLHexSwacZG9OtICggKf76U0q1uRq4fGqKxVU5qcRh718seCNssJB7uOEW40FjQ/yN4OBCAL9xBoT/xj0sZFgcjOp6D7sUExa5Jykq+s2vJj33FW8GTNNvog40y4R2sx59tMLjbo8KsJFDS8s/TsILtIkzhWPBujV3zf/9gNnHxlkdNabeDpkJMVkGymVwQvlaVfVvrF3Y8UxxTle9TroJQVs6ny4rEpITmnaxed0Son+Q/0/5wdLLZzvFNihzOpyHGsfEH+/cqtORVUOfOB1oLKXahAbuXcM3TL8p2HDzwfJFXp7p9Y82984pyE02GAwdL1sqWoAgjE1jEjva3E5IDXQeEF22lJ0oV7zWznFJlYUVJXtjImMPtWrY6Ai8B3zcGA0TF+aS8xqAqJ6FTMAChQfyw0TPiIArKgpvvVRe3DbMaOyxJ/+idHN847Y2xRtd5nLIThAzaSi01xRvCNOEa3Xlh8vyT/dq0EK+WFr4c+voBLsqSQdbN2ha1LB9m7Pm3oO5N261dgkPq4gjcJ/PFbm0+4O6jXn77cQzuYdvvVxZ1DnCFHbDibKimBtiGrSGq3i0TfaQBiCGSTpvZtGlY4mRMSoOph/DnsnJxlHxh3t0v/EwXi1e9RoPf1AMPzUHWgStX/n5B/9VTSz+Kz2pTSi16/i6pCSy4OJFURerEfo06+po6YvuVzubCMIQM6pZhmpnuJbrq8Hy3oULMVZvEcLBMBaeoBMfad4Nv4IkmG1TOiOuGbl6X4MUC1JD1S2CCQTLXV2qblb7cV5VDR/s+sp4/vIlpfDSZaEczxJMBrVHpy7iw7feE2q8AjVwxpDCUsiQQkhahzgCGembq6wb0wVYyTlTq/6M4Nh98agRb9RV7JUaoX2zcIXM2dXzVP2GhE8dx1/5QZI7aJv/H+y6kJy2/hwbAAAAAElFTkSuQmCC"},{"id":"sjcgis.org-General_Basemap_WM","name":"Vector Streetmap for San Juan County WA","type":"tms","template":"http://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}","scaleExtent":[0,19],"polygon":[[[-123.274024,48.692975],[-123.007726,48.767256],[-123.007619,48.831577],[-122.783495,48.758416],[-122.693402,48.658522],[-122.767451,48.603606],[-122.744842,48.387083],[-123.248221,48.283531],[-123.114524,48.422614],[-123.219035,48.548575],[-123.274024,48.692975]]],"best":true,"description":"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{"id":"Vejmidte_Denmark","name":"Vejmidte","type":"tms","template":"http://{switch:a,b,c}.tile.openstreetmap.dk/danmark/vejmidte/{zoom}/{x}/{y}.png","scaleExtent":[0,20],"polygon":[[[8.3743941,54.9551655],[8.3683809,55.4042149],[8.2103997,55.4039795],[8.2087314,55.4937345],[8.0502655,55.4924731],[8.0185123,56.7501399],[8.1819161,56.7509948],[8.1763274,57.0208898],[8.3413329,57.0219872],[8.3392467,57.1119574],[8.5054433,57.1123212],[8.5033923,57.2020499],[9.3316304,57.2027636],[9.3319079,57.2924835],[9.4978864,57.2919578],[9.4988593,57.3820608],[9.6649749,57.3811615],[9.6687295,57.5605591],[9.8351961,57.5596265],[9.8374896,57.6493322],[10.1725726,57.6462818],[10.1754245,57.7367768],[10.5118282,57.7330269],[10.5152095,57.8228945],[10.6834853,57.8207722],[10.6751613,57.6412021],[10.5077045,57.6433097],[10.5039992,57.5535088],[10.671038,57.5514113],[10.6507805,57.1024538],[10.4857673,57.1045138],[10.4786236,56.9249051],[10.3143981,56.9267573],[10.3112341,56.8369269],[10.4750295,56.83509],[10.4649016,56.5656681],[10.9524239,56.5589761],[10.9479249,56.4692243],[11.1099335,56.4664675],[11.1052639,56.376833],[10.9429901,56.3795284],[10.9341235,56.1994768],[10.7719685,56.2020244],[10.7694751,56.1120103],[10.6079695,56.1150259],[10.4466742,56.116717],[10.2865948,56.118675],[10.2831527,56.0281851],[10.4439274,56.0270388],[10.4417713,55.7579243],[10.4334961,55.6693533],[10.743814,55.6646861],[10.743814,55.5712253],[10.8969041,55.5712253],[10.9051793,55.3953852],[11.0613726,55.3812841],[11.0593038,55.1124061],[11.0458567,55.0318621],[11.2030844,55.0247474],[11.2030844,55.117139],[11.0593038,55.1124061],[11.0613726,55.3812841],[11.0789572,55.5712253],[10.8969041,55.5712253],[10.9258671,55.6670198],[10.743814,55.6646861],[10.7562267,55.7579243],[10.4417713,55.7579243],[10.4439274,56.0270388],[10.4466742,56.116717],[10.6079695,56.1150259],[10.6052053,56.0247462],[10.9258671,56.0201215],[10.9197132,55.9309388],[11.0802782,55.92792],[11.0858066,56.0178284],[11.7265047,56.005058],[11.7319981,56.0952142],[12.0540333,56.0871256],[12.0608477,56.1762576],[12.7023469,56.1594405],[12.6611131,55.7114318],[12.9792318,55.7014026],[12.9612912,55.5217294],[12.3268659,55.5412096],[12.3206071,55.4513655],[12.4778226,55.447067],[12.4702432,55.3570479],[12.6269738,55.3523837],[12.6200898,55.2632576],[12.4627339,55.26722],[12.4552949,55.1778223],[12.2987046,55.1822303],[12.2897344,55.0923641],[12.6048608,55.0832904],[12.5872011,54.9036285],[12.2766618,54.9119031],[12.2610181,54.7331602],[12.1070691,54.7378161],[12.0858621,54.4681655],[11.7794953,54.4753579],[11.7837381,54.5654783],[11.1658525,54.5782155],[11.1706443,54.6686508],[10.8617173,54.6733956],[10.8651245,54.7634667],[10.7713646,54.7643888],[10.7707276,54.7372807],[10.7551428,54.7375776],[10.7544039,54.7195666],[10.7389074,54.7197588],[10.7384368,54.7108482],[10.7074486,54.7113045],[10.7041094,54.6756741],[10.5510973,54.6781698],[10.5547184,54.7670245],[10.2423994,54.7705935],[10.2459845,54.8604673],[10.0902268,54.8622134],[10.0873731,54.7723851],[9.1555798,54.7769557],[9.1562752,54.8675369],[8.5321973,54.8663765],[8.531432,54.95516],[8.3743941,54.9551655]],[[11.4577738,56.819554],[11.7849181,56.8127385],[11.7716715,56.6332796],[11.4459621,56.6401087],[11.4577738,56.819554]],[[11.3274736,57.3612962],[11.3161808,57.1818004],[11.1508692,57.1847276],[11.1456628,57.094962],[10.8157703,57.1001693],[10.8290599,57.3695272],[11.3274736,57.3612962]],[[11.5843266,56.2777928],[11.5782882,56.1880397],[11.7392309,56.1845765],[11.7456428,56.2743186],[11.5843266,56.2777928]],[[14.6825922,55.3639405],[14.8395247,55.3565231],[14.8263755,55.2671261],[15.1393406,55.2517359],[15.1532015,55.3410836],[15.309925,55.3330556],[15.295719,55.2437356],[15.1393406,55.2517359],[15.1255631,55.1623802],[15.2815819,55.1544167],[15.2535578,54.9757646],[14.6317464,55.0062496],[14.6825922,55.3639405]]],"terms_url":"http://wiki.openstreetmap.org/wiki/Vejmidte","terms_text":"Danish municipalities"},{"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","scaleExtent":[12,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"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-gp","name":"Vienna: Mehrzweckkarte (general purpose)","type":"tms","template":"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"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","scaleExtent":[10,19],"polygon":[[[16.17,48.1],[16.17,48.33],[16.58,48.33],[16.58,48.1],[16.17,48.1]]],"terms_url":"https://data.wien.gv.at/","terms_text":"Stadt Wien","icon":"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"}];
23190
23191 var presets = {"aerialway":{"fields":["aerialway"],"geometry":["point","vertex","line"],"tags":{"aerialway":"*"},"terms":["ski lift","funifor","funitel"],"searchable":false,"name":"Aerialway"},"aeroway":{"icon":"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"},"highway":{"fields":["name","highway"],"geometry":["point","vertex","line","area"],"tags":{"highway":"*"},"searchable":false,"name":"Highway"},"place":{"fields":["name","place"],"geometry":["point","vertex","area"],"tags":{"place":"*"},"searchable":false,"name":"Place"},"power":{"geometry":["point","vertex","line","area"],"tags":{"power":"*"},"fields":["power"],"searchable":false,"name":"Power"},"railway":{"fields":["railway"],"geometry":["point","vertex","line","area"],"tags":{"railway":"*"},"searchable":false,"name":"Railway"},"roundabout":{"geometry":["vertex","line"],"fields":["name"],"tags":{"junction":"roundabout"},"name":"Roundabout","searchable":false},"waterway":{"fields":["name","waterway"],"geometry":["point","vertex","line","area"],"tags":{"waterway":"*"},"searchable":false,"name":"Waterway"},"address":{"fields":["address"],"geometry":["point","vertex","area"],"tags":{"addr:*":"*"},"addTags":{},"removeTags":{},"reference":{"key":"addr"},"name":"Address","matchScore":0.15},"advertising/billboard":{"fields":["parallel_direction","lit"],"geometry":["point","vertex","line"],"tags":{"advertising":"billboard"},"name":"Billboard"},"aerialway/cable_car":{"geometry":["line"],"terms":["tramway","ropeway"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"cable_car"},"name":"Cable Car"},"aerialway/chair_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"chair_lift"},"name":"Chair Lift"},"aerialway/drag_lift":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"drag_lift"},"name":"Drag Lift"},"aerialway/gondola":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"gondola"},"name":"Gondola"},"aerialway/goods":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"goods"},"name":"Goods Aerialway"},"aerialway/magic_carpet":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration","aerialway/heating"],"tags":{"aerialway":"magic_carpet"},"name":"Magic Carpet Lift"},"aerialway/mixed_lift":{"geometry":["line"],"fields":["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],"tags":{"aerialway":"mixed_lift"},"name":"Mixed Lift"},"aerialway/platter":{"geometry":["line"],"terms":["button lift","poma lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"platter"},"name":"Platter Lift"},"aerialway/pylon":{"geometry":["point","vertex"],"fields":["ref"],"tags":{"aerialway":"pylon"},"name":"Aerialway Pylon"},"aerialway/rope_tow":{"geometry":["line"],"terms":["handle tow","bugel lift"],"fields":["name","aerialway/capacity","aerialway/duration"],"tags":{"aerialway":"rope_tow"},"name":"Rope Tow Lift"},"aerialway/station":{"icon":"aerialway","geometry":["point","vertex","area"],"fields":["aerialway/access","aerialway/summer/access","elevation","building_area"],"tags":{"aerialway":"station"},"name":"Aerialway Station"},"aerialway/t-bar":{"geometry":["line"],"fields":["name","aerialway/capacity","aerialway/duration"],"terms":["tbar"],"tags":{"aerialway":"t-bar"},"name":"T-bar Lift"},"aeroway/aerodrome":{"icon":"airport","geometry":["point","area"],"fields":["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],"terms":["airplane","airport","aerodrome"],"tags":{"aeroway":"aerodrome"},"name":"Airport"},"aeroway/apron":{"icon":"airport","geometry":["area"],"terms":["ramp"],"fields":["ref","surface"],"tags":{"aeroway":"apron"},"name":"Apron"},"aeroway/gate":{"icon":"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":"heliport","geometry":["point","area"],"fields":["ref"],"terms":["helicopter","helipad","heliport"],"tags":{"aeroway":"helipad"},"name":"Helipad"},"aeroway/runway":{"geometry":["line","area"],"terms":["landing strip"],"fields":["ref_runway","surface","length","width"],"tags":{"aeroway":"runway"},"name":"Runway"},"aeroway/taxiway":{"geometry":["line"],"fields":["ref_taxiway","surface"],"tags":{"aeroway":"taxiway"},"name":"Taxiway"},"aeroway/terminal":{"icon":"airport","geometry":["point","area"],"terms":["airport","aerodrome"],"fields":["name","operator","building_area"],"tags":{"aeroway":"terminal"},"name":"Airport Terminal"},"amenity/coworking_space":{"icon":"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/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"tags":{"amenity":"nursing_home"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home","searchable":false},"amenity/register_office":{"icon":"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/swimming_pool":{"icon":"swimming","geometry":["point","vertex","area"],"tags":{"amenity":"swimming_pool"},"reference":{"key":"leisure","value":"swimming_pool"},"name":"Swimming Pool","searchable":false},"amenity/animal_boarding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_boarding"],"geometry":["point","area"],"terms":["boarding","cat","dog","horse","kitten","pet boarding","pet care","pet hotel","puppy","reptile"],"tags":{"amenity":"animal_boarding"},"name":"Animal Boarding Facility"},"amenity/animal_breeding":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_breeding"],"geometry":["point","area"],"terms":["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],"tags":{"amenity":"animal_breeding"},"name":"Animal Breeding Facility"},"amenity/animal_shelter":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours","animal_shelter"],"geometry":["point","area"],"terms":["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],"tags":{"amenity":"animal_shelter"},"name":"Animal Shelter"},"amenity/arts_centre":{"icon":"theatre","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"arts_centre"},"name":"Arts Center"},"amenity/atm":{"icon":"bank","fields":["operator","currency_multi","drive_through"],"geometry":["point","vertex"],"terms":["money","cash","machine"],"tags":{"amenity":"atm"},"name":"ATM"},"amenity/bank":{"icon":"bank","fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],"tags":{"amenity":"bank"},"name":"Bank"},"amenity/bar":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["dive","beer","bier","booze"],"tags":{"amenity":"bar"},"name":"Bar"},"amenity/bbq":{"icon":"bbq","fields":["covered","fuel"],"geometry":["point"],"terms":["bbq","grill"],"tags":{"amenity":"bbq"},"name":"Barbecue/Grill"},"amenity/bench":{"icon":"poi-bench","fields":["backrest"],"geometry":["point","vertex","line"],"terms":["seat"],"tags":{"amenity":"bench"},"name":"Bench"},"amenity/bicycle_parking":{"icon":"bicycle","fields":["bicycle_parking","capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_parking"},"name":"Bicycle Parking"},"amenity/bicycle_rental":{"icon":"bicycle","fields":["capacity","network","operator"],"geometry":["point","vertex","area"],"terms":["bike"],"tags":{"amenity":"bicycle_rental"},"name":"Bicycle Rental"},"amenity/bicycle_repair_station":{"icon":"bicycle","fields":["operator","brand","opening_hours","fee","service/bicycle"],"geometry":["point","vertex"],"terms":["bike","repair","chain","pump"],"tags":{"amenity":"bicycle_repair_station"},"name":"Bicycle Repair Tool Stand"},"amenity/biergarten":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"biergarten"},"terms":["beer","bier","booze"],"name":"Beer Garden"},"amenity/boat_rental":{"fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"boat_rental"},"name":"Boat Rental"},"amenity/bureau_de_change":{"icon":"bank","fields":["name","operator","currency_multi"],"geometry":["point","vertex"],"terms":["bureau de change","money changer"],"tags":{"amenity":"bureau_de_change"},"name":"Currency Exchange"},"amenity/bus_station":{"icon":"bus","fields":["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"amenity":"bus_station"},"name":"Bus Station"},"amenity/cafe":{"icon":"cafe","fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bistro","coffee","tea"],"tags":{"amenity":"cafe"},"name":"Cafe"},"amenity/car_rental":{"icon":"car","fields":["name","operator"],"geometry":["point","area"],"tags":{"amenity":"car_rental"},"name":"Car Rental"},"amenity/car_sharing":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","area"],"tags":{"amenity":"car_sharing"},"name":"Car Sharing"},"amenity/car_wash":{"icon":"car","fields":["address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"car_wash"},"name":"Car Wash"},"amenity/casino":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","roulette","craps","poker","blackjack"],"tags":{"amenity":"casino"},"name":"Casino"},"amenity/charging_station":{"icon":"car","fields":["operator","capacity"],"geometry":["point"],"tags":{"amenity":"charging_station"},"terms":["EV","Electric Vehicle","Supercharger"],"name":"Charging Station"},"amenity/childcare":{"icon":"school","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["daycare","orphanage","playgroup"],"tags":{"amenity":"childcare"},"name":"Nursery/Childcare"},"amenity/cinema":{"icon":"cinema","fields":["name","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["drive-in","film","flick","movie","theater","picture","show","screen"],"tags":{"amenity":"cinema"},"name":"Cinema"},"amenity/clinic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medical","urgentcare"],"tags":{"amenity":"clinic"},"addTags":{"amenity":"clinic","healthcare":"clinic"},"removeTags":{"amenity":"clinic","healthcare":"clinic"},"reference":{"key":"amenity","value":"clinic"},"name":"Clinic"},"amenity/clinic/abortion":{"icon":"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":"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":"poi-clock","fields":["name","support","display","visibility","date"],"geometry":["point","vertex"],"tags":{"amenity":"clock"},"name":"Clock"},"amenity/college":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["university"],"tags":{"amenity":"college"},"name":"College Grounds"},"amenity/community_centre":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["event","hall"],"tags":{"amenity":"community_centre"},"name":"Community Center"},"amenity/compressed_air":{"icon":"car","geometry":["point","area"],"tags":{"amenity":"compressed_air"},"name":"Compressed Air"},"amenity/courthouse":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"courthouse"},"name":"Courthouse"},"amenity/crematorium":{"icon":"cemetery","fields":["name","website","phone","opening_hours","wheelchair"],"geometry":["area","point"],"tags":{"amenity":"crematorium"},"terms":["cemetery","funeral"],"name":"Crematorium"},"amenity/dentist":{"icon":"dentist","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["tooth","teeth"],"tags":{"amenity":"dentist"},"addTags":{"amenity":"dentist","healthcare":"dentist"},"removeTags":{"amenity":"dentist","healthcare":"dentist"},"reference":{"key":"amenity","value":"dentist"},"name":"Dentist"},"amenity/doctors":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["medic*","physician"],"tags":{"amenity":"doctors"},"addTags":{"amenity":"doctors","healthcare":"doctor"},"removeTags":{"amenity":"doctors","healthcare":"doctor"},"reference":{"key":"amenity","value":"doctors"},"name":"Doctor"},"amenity/dojo":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["martial arts","dojang"],"tags":{"amenity":"dojo"},"name":"Dojo / Martial Arts Academy"},"amenity/drinking_water":{"icon":"drinking-water","geometry":["point"],"tags":{"amenity":"drinking_water"},"terms":["fountain","potable"],"name":"Drinking Water"},"amenity/driving_school":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"driving_school"},"name":"Driving School"},"amenity/embassy":{"icon":"embassy","fields":["name","country","address","building_area"],"geometry":["point","area"],"tags":{"amenity":"embassy"},"name":"Embassy"},"amenity/fast_food":{"icon":"fast-food","fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"fast_food"},"terms":["restaurant","takeaway"],"name":"Fast Food"},"amenity/ferry_terminal":{"icon":"ferry","fields":["name","network","operator","address","building_area"],"geometry":["point","vertex","area"],"terms":[],"tags":{"amenity":"ferry_terminal"},"name":"Ferry Terminal"},"amenity/fire_station":{"icon":"fire-station","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"fire_station"},"name":"Fire Station"},"amenity/food_court":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["fast food","restaurant","food"],"tags":{"amenity":"food_court"},"name":"Food Court"},"amenity/fountain":{"icon":"poi-fountain","geometry":["point","area"],"tags":{"amenity":"fountain"},"name":"Fountain"},"amenity/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],"tags":{"amenity":"fuel"},"name":"Gas Station"},"amenity/grave_yard":{"icon":"cemetery","fields":["religion","denomination"],"geometry":["point","area"],"tags":{"amenity":"grave_yard"},"name":"Graveyard"},"amenity/grit_bin":{"fields":["access_simple"],"geometry":["point","vertex"],"tags":{"amenity":"grit_bin"},"terms":["salt","sand"],"name":"Grit Bin"},"amenity/hospital":{"icon":"hospital","fields":["name","operator","healthcare/speciality","address","emergency"],"geometry":["point","area"],"terms":["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],"tags":{"amenity":"hospital"},"addTags":{"amenity":"hospital","healthcare":"hospital"},"removeTags":{"amenity":"hospital","healthcare":"hospital"},"reference":{"key":"amenity","value":"hospital"},"name":"Hospital Grounds"},"amenity/hunting_stand":{"icon":"poi-binoculars","geometry":["point","vertex","area"],"terms":["game","gun","lookout","rifle","shoot*","wild","watch"],"tags":{"amenity":"hunting_stand"},"name":"Hunting Stand"},"amenity/ice_cream":{"icon":"ice-cream","fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"geometry":["point","area"],"terms":["gelato","sorbet","sherbet","frozen","yogurt"],"tags":{"amenity":"ice_cream"},"name":"Ice Cream Shop"},"amenity/internet_cafe":{"icon":"poi-mast","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],"tags":{"amenity":"internet_cafe"},"name":"Internet Cafe"},"amenity/kindergarten":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["kindergarden","pre-school"],"tags":{"amenity":"kindergarten"},"name":"Preschool/Kindergarten Grounds"},"amenity/library":{"icon":"library","fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["book"],"tags":{"amenity":"library"},"name":"Library"},"amenity/marketplace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"marketplace"},"name":"Marketplace"},"amenity/motorcycle_parking":{"icon":"scooter","fields":["capacity","operator","covered","access_simple"],"geometry":["point","vertex","area"],"tags":{"amenity":"motorcycle_parking"},"name":"Motorcycle Parking"},"amenity/nightclub":{"icon":"bar","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"tags":{"amenity":"nightclub"},"terms":["disco*","night club","dancing","dance club"],"name":"Nightclub"},"amenity/parking_entrance":{"icon":"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":"parking","fields":["operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay","address"],"geometry":["point","vertex","area"],"tags":{"amenity":"parking"},"terms":[],"name":"Car Parking"},"amenity/pavilion":{"icon":"shelter","fields":["bin","bench"],"geometry":["point","vertex","area"],"tags":{"amenity":"shelter","shelter_type":"pavilion"},"name":"Pavilion"},"amenity/pharmacy":{"icon":"pharmacy","fields":["name","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"tags":{"amenity":"pharmacy"},"addTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"removeTags":{"amenity":"pharmacy","healthcare":"pharmacy"},"reference":{"key":"amenity","value":"pharmacy"},"terms":["drug*","med*","prescription"],"name":"Pharmacy"},"amenity/place_of_worship":{"icon":"place-of-worship","fields":["name","religion","denomination","address","building_area","service_times"],"geometry":["point","area"],"terms":["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],"tags":{"amenity":"place_of_worship"},"name":"Place of Worship"},"amenity/place_of_worship/buddhist":{"icon":"buddhism","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],"tags":{"amenity":"place_of_worship","religion":"buddhist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Buddhist Temple"},"amenity/place_of_worship/christian":{"icon":"religious-christian","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],"tags":{"amenity":"place_of_worship","religion":"christian"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Church"},"amenity/place_of_worship/hindu":{"icon":"poi-hinduist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["garbhargriha","mandu","puja","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":"religious-jewish","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["jewish"],"tags":{"amenity":"place_of_worship","religion":"jewish"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Synagogue"},"amenity/place_of_worship/muslim":{"icon":"religious-muslim","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["muslim"],"tags":{"amenity":"place_of_worship","religion":"muslim"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Mosque"},"amenity/place_of_worship/shinto":{"icon":"poi-shintoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["kami","torii"],"tags":{"amenity":"place_of_worship","religion":"shinto"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Shinto Shrine"},"amenity/place_of_worship/sikh":{"icon":"poi-sikhist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["gurudwara","temple"],"tags":{"amenity":"place_of_worship","religion":"sikh"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Sikh Temple"},"amenity/place_of_worship/taoist":{"icon":"poi-taoist","fields":["name","denomination","building_area","address","service_times"],"geometry":["point","area"],"terms":["daoist","monastery","temple"],"tags":{"amenity":"place_of_worship","religion":"taoist"},"reference":{"key":"amenity","value":"place_of_worship"},"name":"Taoist Temple"},"amenity/planetarium":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["museum","astronomy","observatory"],"tags":{"amenity":"planetarium"},"name":"Planetarium"},"amenity/police":{"icon":"police","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],"tags":{"amenity":"police"},"name":"Police"},"amenity/post_box":{"icon":"post","fields":["operator","collection_times","drive_through","ref"],"geometry":["point","vertex"],"tags":{"amenity":"post_box"},"terms":["letter","post"],"name":"Mailbox"},"amenity/post_office":{"icon":"post","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["letter","mail"],"tags":{"amenity":"post_office"},"name":"Post Office"},"amenity/prison":{"icon":"prison","fields":["name","operator","address"],"geometry":["point","area"],"terms":["cell","jail"],"tags":{"amenity":"prison"},"name":"Prison Grounds"},"amenity/pub":{"icon":"beer","fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"geometry":["point","area"],"tags":{"amenity":"pub"},"terms":["alcohol","drink","dive","beer","bier","booze"],"name":"Pub"},"amenity/public_bath":{"icon":"water","fields":["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"amenity":"public_bath"},"terms":["onsen","foot bath","hot springs"],"name":"Public Bath"},"amenity/public_bookcase":{"icon":"library","fields":["name","operator","capacity","website"],"geometry":["point","area"],"terms":["library","bookcrossing"],"tags":{"amenity":"public_bookcase"},"name":"Public Bookcase"},"amenity/ranger_station":{"fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],"tags":{"amenity":"ranger_station"},"name":"Ranger Station"},"amenity/recycling_centre":{"icon":"waste-basket","fields":["name","operator","address","opening_hours","recycling_accepts"],"geometry":["point","area"],"terms":["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],"tags":{"amenity":"recycling","recycling_type":"centre"},"name":"Recycling Center"},"amenity/recycling":{"icon":"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"},"amenity/restaurant":{"icon":"restaurant","fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"geometry":["point","area"],"terms":["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],"tags":{"amenity":"restaurant"},"name":"Restaurant"},"amenity/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"amenity":"sanitary_dump_station"},"name":"RV Toilet Disposal"},"amenity/school":{"icon":"school","fields":["name","operator","address"],"geometry":["point","area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"amenity":"school"},"name":"School Grounds"},"amenity/scrapyard":{"icon":"car","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],"tags":{"amenity":"scrapyard"},"reference":{"key":"industrial","value":"scrap_yard"},"name":"Scrap Yard"},"amenity/shelter":{"icon":"shelter","fields":["name","shelter_type","bin"],"geometry":["point","vertex","area"],"terms":["lean-to","gazebo","picnic"],"tags":{"amenity":"shelter"},"name":"Shelter"},"amenity/shower":{"icon":"water","fields":["operator","opening_hours","fee","supervised","building_area"],"geometry":["point","vertex","area"],"terms":["rain closet"],"tags":{"amenity":"shower"},"name":"Shower"},"amenity/social_facility":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility"},"name":"Social Facility"},"amenity/social_facility/food_bank":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],"geometry":["point","area"],"terms":[],"tags":{"amenity":"social_facility","social_facility":"food_bank"},"reference":{"key":"social_facility","value":"food_bank"},"name":"Food Bank"},"amenity/social_facility/group_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["old","senior","living","care home","assisted living"],"tags":{"amenity":"social_facility","social_facility":"group_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"group_home"},"name":"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{"icon":"poi-social-facility","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["houseless","unhoused","displaced"],"tags":{"amenity":"social_facility","social_facility":"shelter","social_facility:for":"homeless"},"reference":{"key":"social_facility","value":"shelter"},"name":"Homeless Shelter"},"amenity/social_facility/nursing_home":{"icon":"wheelchair","fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"geometry":["point","area"],"terms":["elderly","living","nursing","old","senior","assisted living"],"tags":{"amenity":"social_facility","social_facility":"nursing_home","social_facility:for":"senior"},"reference":{"key":"social_facility","value":"nursing_home"},"name":"Nursing Home"},"amenity/studio":{"icon":"karaoke","fields":["name","studio","address","building_area"],"geometry":["point","area"],"terms":["recording","radio","television"],"tags":{"amenity":"studio"},"name":"Studio"},"amenity/taxi":{"icon":"car","fields":["name","operator","capacity"],"geometry":["point","vertex","area"],"terms":["cab"],"tags":{"amenity":"taxi"},"name":"Taxi Stand"},"amenity/telephone":{"icon":"telephone","geometry":["point","vertex"],"tags":{"amenity":"telephone"},"terms":["phone"],"name":"Telephone"},"amenity/theatre":{"icon":"theatre","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["theatre","performance","play","musical"],"tags":{"amenity":"theatre"},"name":"Theater"},"amenity/toilets":{"icon":"toilet","fields":["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],"geometry":["point","vertex","area"],"terms":["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],"tags":{"amenity":"toilets"},"name":"Toilets"},"amenity/townhall":{"icon":"town-hall","fields":["name","operator","address","building_area"],"geometry":["point","area"],"terms":["village","city","government","courthouse","municipal"],"tags":{"amenity":"townhall"},"name":"Town Hall"},"amenity/university":{"icon":"college","fields":["name","operator","address","internet_access","internet_access/ssid"],"geometry":["point","area"],"terms":["college"],"tags":{"amenity":"university"},"name":"University Grounds"},"amenity/vending_machine":{"icon":"poi-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":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["cigarette"],"tags":{"amenity":"vending_machine","vending":"cigarettes"},"reference":{"key":"vending","value":"cigarettes"},"name":"Cigarette Vending Machine"},"amenity/vending_machine/condoms":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom"],"tags":{"amenity":"vending_machine","vending":"condoms"},"reference":{"key":"vending","value":"condoms"},"name":"Condom Vending Machine"},"amenity/vending_machine/drinks":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["drink","soda","beverage","juice","pop"],"tags":{"amenity":"vending_machine","vending":"drinks"},"reference":{"key":"vending","value":"drinks"},"name":"Drink Vending Machine"},"amenity/vending_machine/excrement_bags":{"icon":"poi-vending-machine","fields":["operator","fee","payment_multi","currency_multi"],"geometry":["point"],"terms":["excrement bags","poop","dog","animal"],"tags":{"amenity":"vending_machine","vending":"excrement_bags"},"reference":{"key":"vending","value":"excrement_bags"},"name":"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],"tags":{"amenity":"vending_machine","vending":"feminine_hygiene"},"reference":{"key":"vending","value":"feminine_hygiene"},"name":"Feminine Hygiene Vending Machine"},"amenity/vending_machine/newspapers":{"icon":"poi-vending-machine","fields":["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":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parcel","mail","pickup"],"tags":{"amenity":"vending_machine","vending":"parcel_pickup;parcel_mail_in"},"reference":{"key":"vending","value":"parcel_pickup;parcel_mail_in"},"name":"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["parking","ticket"],"tags":{"amenity":"vending_machine","vending":"parking_tickets"},"reference":{"key":"vending","value":"parking_tickets"},"matchScore":0.94,"name":"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["bus","train","ferry","rail","ticket","transportation"],"tags":{"amenity":"vending_machine","vending":"public_transport_tickets"},"reference":{"key":"vending","value":"public_transport_tickets"},"name":"Transit Ticket Vending Machine"},"amenity/vending_machine/sweets":{"icon":"poi-vending-machine","fields":["operator","payment_multi","currency_multi"],"geometry":["point"],"terms":["candy","gum","chip","pretzel","cookie","cracker"],"tags":{"amenity":"vending_machine","vending":"sweets"},"reference":{"key":"vending","value":"sweets"},"name":"Snack Vending Machine"},"amenity/veterinary":{"icon":"veterinary","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pet clinic","veterinarian","animal hospital","pet doctor"],"tags":{"amenity":"veterinary"},"name":"Veterinary"},"amenity/waste_basket":{"icon":"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":"waste-basket","fields":["collection_times"],"geometry":["point","vertex","area"],"tags":{"amenity":"waste_disposal"},"terms":["garbage","rubbish","litter","trash"],"name":"Garbage Dumpster"},"amenity/waste_transfer_station":{"icon":"waste-basket","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["dump","garbage","recycling","rubbish","scrap","trash"],"tags":{"amenity":"waste_transfer_station"},"name":"Waste Transfer Station"},"amenity/waste/dog_excrement":{"icon":"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":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"water_point"},"name":"RV Drinking Water"},"amenity/watering_place":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"amenity":"watering_place"},"name":"Animal Watering Place"},"area":{"fields":["name"],"geometry":["area"],"tags":{"area":"yes"},"name":"Area","matchScore":0.1},"area/highway":{"fields":["name","area/highway"],"geometry":["area"],"tags":{"area:highway":"*"},"name":"Road Surface"},"attraction/amusement_ride":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","carnival ride"],"tags":{"attraction":"amusement_ride"},"name":"Amusement Ride"},"attraction/animal":{"icon":"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":"amusement-park","fields":["name","operator","height","opening_hours"],"geometry":["point"],"terms":["ferris wheel","theme park","amusement ride"],"tags":{"attraction":"big_wheel"},"name":"Big Wheel"},"attraction/bumper_car":{"icon":"car","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","dodgem cars","autoscooter"],"tags":{"attraction":"bumper_car"},"name":"Bumper Car"},"attraction/bungee_jumping":{"icon":"pitch","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","bungy jumping","jumping platform"],"tags":{"attraction":"bungee_jumping"},"name":"Bungee Jumping"},"attraction/carousel":{"icon":"horse-riding","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],"tags":{"attraction":"carousel"},"name":"Carousel"},"attraction/dark_ride":{"icon":"rail-metro","fields":["name","operator","opening_hours"],"geometry":["point","line","area"],"terms":["theme park","ghost train"],"tags":{"attraction":"dark_ride"},"name":"Dark Ride"},"attraction/drop_tower":{"icon":"poi-tower","fields":["name","operator","height","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride","gondola","tower","big drop"],"tags":{"attraction":"drop_tower"},"name":"Drop Tower"},"attraction/pirate_ship":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point"],"terms":["theme park","carnival ride","amusement ride"],"tags":{"attraction":"pirate_ship"},"name":"Pirate Ship"},"attraction/river_rafting":{"icon":"ferry","fields":["name","operator","opening_hours"],"geometry":["point","line"],"terms":["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],"tags":{"attraction":"river_rafting"},"name":"River Rafting"},"attraction/roller_coaster":{"icon":"amusement-park","fields":["name","operator","opening_hours"],"geometry":["point","area"],"terms":["theme park","amusement ride"],"tags":{"attraction":"roller_coaster"},"name":"Roller Coaster"},"attraction/train":{"icon":"rail","fields":["name","operator","fee","opening_hours"],"geometry":["point","line"],"terms":["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],"tags":{"attraction":"train"},"name":"Tourist Train"},"attraction/water_slide":{"icon":"swimming","fields":["name","operator","opening_hours"],"geometry":["line","area"],"terms":["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],"tags":{"attraction":"water_slide"},"name":"Water Slide"},"barrier":{"icon":"roadblock","geometry":["point","vertex","line","area"],"tags":{"barrier":"*"},"fields":["barrier"],"name":"Barrier","matchScore":0.4},"barrier/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"barrier":"entrance"},"name":"Entrance","searchable":false},"barrier/block":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"block"},"name":"Block"},"barrier/bollard":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"bollard"},"name":"Bollard"},"barrier/border_control":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"border_control"},"name":"Border Control"},"barrier/cattle_grid":{"icon":"barrier","geometry":["vertex"],"tags":{"barrier":"cattle_grid"},"name":"Cattle Grid"},"barrier/city_wall":{"icon":"barrier","fields":["height"],"geometry":["line","area"],"tags":{"barrier":"city_wall"},"name":"City Wall"},"barrier/cycle_barrier":{"icon":"roadblock","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"cycle_barrier"},"name":"Cycle Barrier"},"barrier/ditch":{"icon":"roadblock","geometry":["line","area"],"tags":{"barrier":"ditch"},"name":"Trench","matchScore":0.25},"barrier/fence":{"icon":"fence","fields":["fence_type","height"],"geometry":["line"],"tags":{"barrier":"fence"},"name":"Fence","matchScore":0.25},"barrier/gate":{"icon":"barrier","fields":["access"],"geometry":["point","vertex","line"],"tags":{"barrier":"gate"},"name":"Gate"},"barrier/hedge":{"fields":["height"],"geometry":["line","area"],"tags":{"barrier":"hedge"},"name":"Hedge","matchScore":0.25},"barrier/kissing_gate":{"icon":"barrier","fields":["access"],"geometry":["vertex"],"tags":{"barrier":"kissing_gate"},"name":"Kissing Gate"},"barrier/lift_gate":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"lift_gate"},"name":"Lift Gate"},"barrier/retaining_wall":{"geometry":["line","area"],"tags":{"barrier":"retaining_wall"},"name":"Retaining Wall"},"barrier/stile":{"icon":"roadblock","fields":["access"],"geometry":["point","vertex"],"tags":{"barrier":"stile"},"name":"Stile"},"barrier/toll_booth":{"icon":"roadblock","fields":["access","building_area"],"geometry":["vertex","area"],"tags":{"barrier":"toll_booth"},"name":"Toll Booth"},"barrier/wall":{"icon":"barrier","fields":["wall","height"],"geometry":["line","area"],"tags":{"barrier":"wall"},"name":"Wall","matchScore":0.25},"boundary/administrative":{"name":"Administrative Boundary","geometry":["line"],"tags":{"boundary":"administrative"},"fields":["name","admin_level"]},"building":{"icon":"home","fields":["name","building","levels","address"],"geometry":["point","area"],"tags":{"building":"*"},"matchScore":0.6,"terms":[],"name":"Building"},"building/bunker":{"fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"bunker"},"matchScore":0.5,"name":"Bunker","searchable":false},"building/entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"building":"entrance"},"name":"Entrance/Exit","searchable":false},"building/train_station":{"icon":"building","fields":["name","address","levels"],"geometry":["point","vertex","area"],"tags":{"building":"train_station"},"matchScore":0.5,"name":"Train Station","searchable":false},"building/apartments":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"apartments"},"matchScore":0.5,"name":"Apartments"},"building/barn":{"icon":"farm","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"barn"},"matchScore":0.5,"name":"Barn"},"building/cabin":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cabin"},"matchScore":0.5,"name":"Cabin"},"building/cathedral":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"cathedral"},"matchScore":0.5,"name":"Cathedral Building"},"building/chapel":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"chapel"},"matchScore":0.5,"name":"Chapel Building"},"building/church":{"icon":"place-of-worship","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"church"},"matchScore":0.5,"name":"Church Building"},"building/college":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["university"],"tags":{"building":"college"},"matchScore":0.5,"name":"College Building"},"building/commercial":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"commercial"},"matchScore":0.5,"name":"Commercial Building"},"building/construction":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"construction"},"matchScore":0.5,"name":"Building Under Construction"},"building/detached":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"detached"},"terms":["home","single","family","residence","dwelling"],"matchScore":0.5,"name":"Detached House"},"building/dormitory":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"dormitory"},"matchScore":0.5,"name":"Dormitory"},"building/garage":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garage"},"matchScore":0.5,"name":"Garage"},"building/garages":{"icon":"warehouse","fields":["name","capacity"],"geometry":["area"],"tags":{"building":"garages"},"matchScore":0.5,"name":"Garages"},"building/greenhouse":{"icon":"garden-center","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"greenhouse"},"matchScore":0.5,"name":"Greenhouse"},"building/hospital":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"hospital"},"matchScore":0.5,"name":"Hospital Building"},"building/hotel":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"hotel"},"matchScore":0.5,"name":"Hotel Building"},"building/house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"house"},"terms":["home","family","residence","dwelling"],"matchScore":0.5,"name":"House"},"building/hut":{"geometry":["area"],"fields":["name"],"tags":{"building":"hut"},"matchScore":0.5,"name":"Hut"},"building/industrial":{"icon":"industry","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"industrial"},"matchScore":0.5,"name":"Industrial Building"},"building/kindergarten":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["kindergarden","pre-school"],"tags":{"building":"kindergarten"},"matchScore":0.5,"name":"Preschool/Kindergarten Building"},"building/public":{"icon":"building","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"public"},"matchScore":0.5,"name":"Public Building"},"building/residential":{"icon":"residential-community","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"residential"},"matchScore":0.5,"name":"Residential Building"},"building/retail":{"icon":"commercial","fields":["name","address","levels","smoking"],"geometry":["area"],"tags":{"building":"retail"},"matchScore":0.5,"name":"Retail Building"},"building/roof":{"icon":"shelter","fields":["name","address"],"geometry":["area"],"tags":{"building":"roof"},"matchScore":0.5,"name":"Roof"},"building/school":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["academy","elementary school","middle school","high school"],"tags":{"building":"school"},"matchScore":0.5,"name":"School Building"},"building/semidetached_house":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"semidetached_house"},"terms":["home","double","duplex","twin","family","residence","dwelling"],"matchScore":0.5,"name":"Semi-Detached House"},"building/shed":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"shed"},"matchScore":0.5,"name":"Shed"},"building/stable":{"icon":"horse-riding","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"stable"},"matchScore":0.5,"name":"Stable"},"building/static_caravan":{"icon":"home","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"static_caravan"},"matchScore":0.5,"name":"Static Mobile Home"},"building/terrace":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"terrace"},"terms":["home","terrace","brownstone","family","residence","dwelling"],"matchScore":0.5,"name":"Row Houses"},"building/university":{"icon":"building","fields":["name","address","levels"],"geometry":["area"],"terms":["college"],"tags":{"building":"university"},"matchScore":0.5,"name":"University Building"},"building/warehouse":{"icon":"warehouse","fields":["name","address","levels"],"geometry":["area"],"tags":{"building":"warehouse"},"matchScore":0.5,"name":"Warehouse"},"camp_site/camp_pitch":{"icon":"campsite","fields":["name","ref"],"geometry":["point","area"],"terms":["tent","rv"],"tags":{"camp_site":"camp_pitch"},"name":"Camp Pitch"},"club":{"icon":"heart","fields":["name","club","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"club":"*"},"terms":["social"],"name":"Club"},"craft":{"icon":"poi-tool","fields":["name","craft","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"*"},"terms":[],"name":"Craft"},"craft/jeweler":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"jeweler"},"reference":{"key":"shop","value":"jewelry"},"name":"Jeweler","searchable":false},"craft/locksmith":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"locksmith"},"reference":{"key":"shop","value":"locksmith"},"name":"Locksmith","searchable":false},"craft/optician":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"optician"},"reference":{"key":"shop","value":"optician"},"name":"Optician","searchable":false},"craft/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"craft":"tailor"},"reference":{"key":"shop","value":"tailor"},"name":"Tailor","searchable":false},"craft/basket_maker":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"basket_maker"},"name":"Basket Maker"},"craft/beekeeper":{"icon":"farm","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"beekeeper"},"name":"Beekeeper"},"craft/blacksmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"blacksmith"},"name":"Blacksmith"},"craft/boatbuilder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"boatbuilder"},"name":"Boat Builder"},"craft/bookbinder":{"icon":"library","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["book repair"],"tags":{"craft":"bookbinder"},"name":"Bookbinder"},"craft/brewery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beer","beverage","bier","booze","cider"],"tags":{"craft":"brewery"},"name":"Brewery"},"craft/carpenter":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["woodworker"],"tags":{"craft":"carpenter"},"name":"Carpenter"},"craft/carpet_layer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"carpet_layer"},"name":"Carpet Layer"},"craft/caterer":{"icon":"restaurant","fields":["name","cuisine","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"caterer"},"name":"Caterer"},"craft/clockmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"clockmaker"},"name":"Clockmaker"},"craft/confectionery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet","candy"],"tags":{"craft":"confectionery"},"name":"Candy Maker"},"craft/distillery":{"icon":"poi-storage-tank","fields":["name","operator","address","building_area","opening_hours","product"],"geometry":["point","area"],"terms":["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],"tags":{"craft":"distillery"},"name":"Distillery"},"craft/dressmaker":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["seamstress"],"tags":{"craft":"dressmaker"},"name":"Dressmaker"},"craft/electrician":{"icon":"poi-power","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["power","wire"],"tags":{"craft":"electrician"},"name":"Electrician"},"craft/electronics_repair":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"electronics_repair"},"name":"Electronics Repair Shop"},"craft/gardener":{"icon":"garden","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscaper","grounds keeper"],"tags":{"craft":"gardener"},"name":"Gardener"},"craft/glaziery":{"icon":"fire-station","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass","stained-glass","window"],"tags":{"craft":"glaziery"},"name":"Glaziery"},"craft/handicraft":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"handicraft"},"name":"Handicraft"},"craft/hvac":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["heat*","vent*","air conditioning"],"tags":{"craft":"hvac"},"name":"HVAC"},"craft/insulator":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"insulation"},"name":"Insulator"},"craft/key_cutter":{"icon":"marker-stroked","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"key_cutter"},"name":"Key Cutter"},"craft/metal_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"metal_construction"},"name":"Metal Construction"},"craft/painter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"painter"},"name":"Painter"},"craft/photographer":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"photographer"},"name":"Photographer"},"craft/photographic_laboratory":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["film"],"tags":{"craft":"photographic_laboratory"},"name":"Photographic Laboratory"},"craft/plasterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"plasterer"},"name":"Plasterer"},"craft/plumber":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["pipe"],"tags":{"craft":"plumber"},"name":"Plumber"},"craft/pottery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ceramic"],"tags":{"craft":"pottery"},"name":"Pottery"},"craft/rigger":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"rigger"},"name":"Rigger"},"craft/roofer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"roofer"},"name":"Roofer"},"craft/saddler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"saddler"},"name":"Saddler"},"craft/sailmaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sailmaker"},"name":"Sailmaker"},"craft/sawmill":{"icon":"logging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lumber"],"tags":{"craft":"sawmill"},"name":"Sawmill"},"craft/scaffolder":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"scaffolder"},"name":"Scaffolder"},"craft/sculpter":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sculpter"},"name":"Sculpter"},"craft/shoemaker":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cobbler"],"tags":{"craft":"shoemaker"},"name":"Shoemaker"},"craft/stonemason":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["masonry"],"tags":{"craft":"stonemason"},"name":"Stonemason"},"craft/sweep":{"icon":"poi-chimney","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"sweep"},"name":"Chimney Sweep"},"craft/tiler":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tiler"},"name":"Tiler"},"craft/tinsmith":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"tinsmith"},"name":"Tinsmith"},"craft/upholsterer":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"upholsterer"},"name":"Upholsterer"},"craft/watchmaker":{"icon":"poi-clock","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"watchmaker"},"name":"Watchmaker"},"craft/window_construction":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["glass"],"tags":{"craft":"window_construction"},"name":"Window Construction"},"craft/winery":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"craft":"winery"},"name":"Winery"},"embankment":{"geometry":["line"],"tags":{"embankment":"yes"},"name":"Embankment","matchScore":0.2},"emergency/designated":{"fields":[],"geometry":["line"],"tags":{"emergency":"designated"},"terms":[],"name":"Emergency Access Designated","searchable":false,"matchScore":0.01},"emergency/destination":{"fields":[],"geometry":["line"],"tags":{"emergency":"destination"},"terms":[],"name":"Emergency Access Destination","searchable":false,"matchScore":0.01},"emergency/no":{"fields":[],"geometry":["line"],"tags":{"emergency":"no"},"terms":[],"name":"Emergency Access No","searchable":false,"matchScore":0.01},"emergency/official":{"fields":[],"geometry":["line"],"tags":{"emergency":"official"},"terms":[],"name":"Emergency Access Official","searchable":false,"matchScore":0.01},"emergency/private":{"fields":[],"geometry":["line"],"tags":{"emergency":"private"},"terms":[],"name":"Emergency Access Private","searchable":false,"matchScore":0.01},"emergency/yes":{"fields":[],"geometry":["line"],"tags":{"emergency":"yes"},"terms":[],"name":"Emergency Access Yes","searchable":false,"matchScore":0.01},"emergency/ambulance_station":{"icon":"hospital","fields":["name","operator","building_area","address"],"geometry":["point","area"],"terms":["EMS","EMT","rescue"],"tags":{"emergency":"ambulance_station"},"name":"Ambulance Station"},"emergency/defibrillator":{"icon":"defibrillator","fields":["ref","access","opening_hours","indoor","phone"],"geometry":["point","vertex"],"terms":["AED"],"tags":{"emergency":"defibrillator"},"name":"Defibrillator"},"emergency/fire_hydrant":{"icon":"poi-fire-hydrant","fields":["fire_hydrant/type","fire_hydrant/position","ref","operator"],"geometry":["point","vertex"],"terms":["fire plug"],"tags":{"emergency":"fire_hydrant"},"name":"Fire Hydrant"},"emergency/life_ring":{"icon":"circle-stroked","fields":["ref","operator"],"geometry":["point","vertex"],"terms":["life buoy","kisby ring","kisbie ring","perry buoy"],"tags":{"emergency":"life_ring"},"name":"Life Ring"},"emergency/phone":{"icon":"emergency-phone","fields":["operator"],"geometry":["point","vertex"],"tags":{"emergency":"phone"},"name":"Emergency Phone"},"entrance":{"icon":"entrance-alt1","geometry":["vertex"],"tags":{"entrance":"*"},"fields":["entrance","access_simple","address"],"name":"Entrance/Exit"},"footway/crossing-raised":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"footway/crossing":{"fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"footway/crosswalk-raised":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"footway/crosswalk":{"icon":"highway-footway","fields":["crossing","access","surface","kerb","tactile_paving"],"geometry":["line"],"tags":{"highway":"footway","footway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"footway/sidewalk":{"icon":"highway-footway","fields":["surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"footway","footway":"sidewalk"},"reference":{"key":"footway","value":"sidewalk"},"terms":[],"name":"Sidewalk"},"ford":{"geometry":["vertex"],"tags":{"ford":"yes"},"name":"Ford"},"golf/bunker":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"bunker","natural":"sand"},"terms":["hazard","bunker"],"reference":{"key":"golf","value":"bunker"},"name":"Sand Trap"},"golf/fairway":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"fairway","landuse":"grass"},"reference":{"key":"golf","value":"fairway"},"name":"Fairway"},"golf/green":{"icon":"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":"golf","fields":["name","ref_golf_hole","par","handicap"],"geometry":["line"],"tags":{"golf":"hole"},"name":"Golf Hole"},"golf/lateral_water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"lateral_water_hazard","natural":"water"},"reference":{"key":"golf","value":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"lateral_water_hazard"},"name":"Lateral Water Hazard"},"golf/rough":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"rough","landuse":"grass"},"reference":{"key":"golf","value":"rough"},"name":"Rough"},"golf/tee":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"tee","landuse":"grass"},"terms":["teeing ground"],"reference":{"key":"golf","value":"tee"},"name":"Tee Box"},"golf/water_hazard_area":{"icon":"golf","fields":["name"],"geometry":["area"],"tags":{"golf":"water_hazard","natural":"water"},"reference":{"key":"golf","value":"water_hazard"},"name":"Water Hazard"},"golf/water_hazard_line":{"icon":"golf","fields":["name"],"geometry":["line"],"tags":{"golf":"water_hazard"},"name":"Water Hazard"},"healthcare":{"icon":"hospital","fields":["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"healthcare":"*"},"terms":["clinic","doctor","disease","health","institution","sick","surgery","wellness"],"name":"Healthcare Facility"},"healthcare/alternative":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],"tags":{"healthcare":"alternative"},"name":"Alternative Medicine"},"healthcare/alternative/chiropractic":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["back","pain","spine"],"tags":{"healthcare":"alternative","healthcare:speciality":"chiropractic"},"name":"Chiropractor"},"healthcare/audiologist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["ear","hearing","sound"],"tags":{"healthcare":"audiologist"},"name":"Audiologist"},"healthcare/birthing_center":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"birthing_center"},"name":"Birthing Center"},"healthcare/blood_donation":{"icon":"blood-bank","fields":["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],"tags":{"healthcare":"blood_donation"},"name":"Blood Donor Center"},"healthcare/hospice":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["terminal","illness"],"tags":{"healthcare":"hospice"},"name":"Hospice"},"healthcare/midwife":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["baby","childbirth","delivery","labour","labor","pregnancy"],"tags":{"healthcare":"midwife"},"name":"Midwife"},"healthcare/occupational_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["therapist","therapy"],"tags":{"healthcare":"occupational_therapist"},"name":"Occupational Therapist"},"healthcare/optometrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses","lasik","lenses","vision"],"tags":{"healthcare":"optometrist"},"name":"Optometrist"},"healthcare/physiotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["physical","therapist","therapy"],"tags":{"healthcare":"physiotherapist"},"name":"Physiotherapist"},"healthcare/podiatrist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["foot","feet","nails"],"tags":{"healthcare":"podiatrist"},"name":"Podiatrist"},"healthcare/psychotherapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],"tags":{"healthcare":"psychotherapist"},"name":"Psychotherapist"},"healthcare/rehabilitation":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["rehab","therapist","therapy"],"tags":{"healthcare":"rehabilitation"},"name":"Rehabilitation Facility"},"healthcare/speech_therapist":{"icon":"hospital","fields":["name","operator","healthcare/speciality","building_area","address","opening_hours"],"geometry":["point","area"],"terms":["speech","therapist","therapy","voice"],"tags":{"healthcare":"speech_therapist"},"name":"Speech Therapist"},"highway/bridleway":{"fields":["name","surface","width","structure","access"],"icon":"highway-bridleway","geometry":["line"],"tags":{"highway":"bridleway"},"terms":["bridleway","equestrian","horse"],"name":"Bridle Path"},"highway/bus_stop":{"icon":"bus","fields":["name","network","operator","bench","shelter"],"geometry":["point","vertex"],"tags":{"highway":"bus_stop"},"terms":[],"name":"Bus Stop"},"highway/corridor":{"icon":"highway-footway","fields":["name","width","level","access_simple"],"geometry":["line"],"tags":{"highway":"corridor"},"terms":["gallery","hall","hallway","indoor","passage","passageway"],"name":"Indoor Corridor"},"highway/crossing-raised":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["flat top","hump","speed","slow"],"name":"Raised Street Crossing"},"highway/crossing":{"fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing"},"reference":{"key":"footway","value":"crossing"},"terms":[],"name":"Street Crossing"},"highway/crosswalk-raised":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra","traffic_calming":"table"},"reference":{"key":"traffic_calming","value":"table"},"terms":["zebra crossing","flat top","hump","speed","slow"],"name":"Raised Pedestrian Crosswalk"},"highway/crosswalk":{"icon":"poi-foot","fields":["crossing","kerb","tactile_paving"],"geometry":["vertex"],"tags":{"highway":"crossing","crossing":"zebra"},"reference":{"key":"highway","value":"crossing"},"terms":["zebra crossing"],"name":"Pedestrian Crosswalk"},"highway/cycleway":{"icon":"highway-cycleway","fields":["name","oneway","surface","lit","width","structure","access"],"geometry":["line"],"tags":{"highway":"cycleway"},"terms":["bike"],"name":"Cycle Path"},"highway/elevator":{"icon":"poi-elevator","fields":["access_simple","opening_hours","maxweight","ref"],"geometry":["vertex"],"tags":{"highway":"elevator"},"terms":["lift"],"name":"Elevator"},"highway/footway":{"icon":"highway-footway","fields":["name","surface","lit","width","structure","access"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"footway"},"name":"Foot Path"},"highway/give_way":{"icon":"poi-yield","fields":["parallel_direction"],"geometry":["vertex"],"tags":{"highway":"give_way"},"terms":["give way","yield","sign"],"name":"Yield Sign"},"highway/living_street":{"icon":"highway-living-street","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],"geometry":["line"],"tags":{"highway":"living_street"},"name":"Living Street"},"highway/mini_roundabout":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"mini_roundabout"},"fields":["clock_direction"],"name":"Mini-Roundabout"},"highway/motorway_junction":{"icon":"poi-junction","geometry":["vertex"],"tags":{"highway":"motorway_junction"},"fields":["ref_highway_junction"],"name":"Motorway Junction / Exit"},"highway/motorway_link":{"icon":"highway-motorway-link","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"motorway_link"},"addTags":{"highway":"motorway_link","oneway":"yes"},"removeTags":{"highway":"motorway_link","oneway":"yes"},"terms":["ramp","on ramp","off ramp"],"name":"Motorway Link"},"highway/motorway":{"icon":"highway-motorway","fields":["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"motorway"},"terms":["autobahn","expressway","freeway","highway","interstate","parkway","thruway","turnpike"],"name":"Motorway"},"highway/path":{"icon":"highway-path","fields":["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","ref"],"geometry":["line"],"terms":["hike","hiking","trackway","trail","walk"],"tags":{"highway":"path"},"name":"Path"},"highway/pedestrian":{"icon":"highway-footway","fields":["name","surface","lit","width","oneway","structure","access"],"geometry":["line","area"],"tags":{"highway":"pedestrian"},"terms":[],"name":"Pedestrian Street"},"highway/primary_link":{"icon":"highway-primary-link","fields":["name","oneway","maxspeed","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],"geometry":["line"],"tags":{"highway":"primary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Primary Link"},"highway/primary":{"icon":"highway-primary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"primary"},"terms":[],"name":"Primary Road"},"highway/raceway":{"icon":"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":"highway-residential","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"residential"},"terms":[],"name":"Residential Road"},"highway/rest_area":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"rest_area"},"terms":["rest stop"],"name":"Rest Area"},"highway/road":{"icon":"highway-road","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"road"},"terms":[],"name":"Unknown Road"},"highway/secondary_link":{"icon":"highway-secondary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Secondary Link"},"highway/secondary":{"icon":"highway-secondary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"secondary"},"terms":[],"name":"Secondary Road"},"highway/service":{"icon":"highway-service","fields":["name","service","oneway","maxspeed","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"service"},"terms":[],"name":"Service Road"},"highway/service/alley":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"alley"},"reference":{"key":"service","value":"alley"},"name":"Alley"},"highway/service/drive-through":{"icon":"highway-service","fields":["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],"geometry":["line"],"tags":{"highway":"service","service":"drive-through"},"reference":{"key":"service","value":"drive-through"},"name":"Drive-Through"},"highway/service/driveway":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"driveway"},"reference":{"key":"service","value":"driveway"},"name":"Driveway"},"highway/service/emergency_access":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"emergency_access"},"reference":{"key":"service","value":"emergency_access"},"name":"Emergency Access"},"highway/service/parking_aisle":{"icon":"highway-service","fields":["name","oneway","maxspeed","structure","access","surface","maxheight"],"geometry":["line"],"tags":{"highway":"service","service":"parking_aisle"},"reference":{"key":"service","value":"parking_aisle"},"name":"Parking Aisle"},"highway/services":{"icon":"car","fields":["name"],"geometry":["point","vertex","area"],"tags":{"highway":"services"},"terms":["services","travel plaza","service station"],"name":"Service Area"},"highway/speed_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["ref"],"tags":{"highway":"speed_camera"},"terms":[],"name":"Speed Camera"},"highway/steps":{"icon":"highway-steps","fields":["surface","lit","width","incline_steps","handrail","step_count"],"geometry":["line"],"tags":{"highway":"steps"},"terms":["stairs","staircase"],"name":"Steps"},"highway/stop":{"icon":"poi-stop","fields":["stop","parallel_direction"],"geometry":["vertex"],"tags":{"highway":"stop"},"terms":["stop","halt","sign"],"name":"Stop Sign"},"highway/street_lamp":{"icon":"poi-street-lamp","geometry":["point","vertex"],"tags":{"highway":"street_lamp"},"fields":["lamp_type","ref"],"terms":["streetlight","street light","lamp","light","gaslight"],"name":"Street Lamp"},"highway/tertiary_link":{"icon":"highway-tertiary-link","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary_link"},"terms":["ramp","on ramp","off ramp"],"name":"Tertiary Link"},"highway/tertiary":{"icon":"highway-tertiary","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],"geometry":["line"],"tags":{"highway":"tertiary"},"terms":[],"name":"Tertiary Road"},"highway/track":{"icon":"highway-track","fields":["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],"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"],"tags":{"highway":"traffic_mirror"},"terms":["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],"name":"Traffic Mirror"},"highway/traffic_signals":{"icon":"poi-traffic-signals","geometry":["vertex"],"tags":{"highway":"traffic_signals"},"fields":["traffic_signals"],"terms":["light","stoplight","traffic light"],"name":"Traffic Signals"},"highway/trunk_link":{"icon":"highway-trunk-link","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","access"],"geometry":["line"],"tags":{"highway":"trunk_link"},"terms":["ramp","on ramp","off ramp"],"name":"Trunk Link"},"highway/trunk":{"icon":"highway-trunk","fields":["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],"geometry":["line"],"tags":{"highway":"trunk"},"terms":[],"name":"Trunk Road"},"highway/turning_circle":{"icon":"circle-stroked","geometry":["vertex"],"tags":{"highway":"turning_circle"},"terms":["cul-de-sac"],"name":"Turning Circle"},"highway/turning_loop":{"icon":"circle","geometry":["vertex"],"tags":{"highway":"turning_loop"},"terms":["cul-de-sac"],"name":"Turning Loop (Island)"},"highway/unclassified":{"icon":"highway-unclassified","fields":["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],"geometry":["line"],"tags":{"highway":"unclassified"},"terms":[],"name":"Minor/Unclassified Road"},"historic":{"icon":"poi-ruins","fields":["historic","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"*"},"name":"Historic Site"},"historic/archaeological_site":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"archaeological_site"},"name":"Archaeological Site"},"historic/boundary_stone":{"icon":"poi-milestone","fields":["name","inscription"],"geometry":["point","vertex"],"tags":{"historic":"boundary_stone"},"name":"Boundary Stone"},"historic/castle":{"icon":"castle","fields":["name","castle_type","building_area","historic/civilization"],"geometry":["point","area"],"tags":{"historic":"castle"},"name":"Castle"},"historic/memorial":{"icon":"monument","fields":["name","memorial","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"memorial"},"name":"Memorial"},"historic/monument":{"icon":"monument","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"monument"},"name":"Monument"},"historic/ruins":{"icon":"poi-ruins","fields":["name","historic/civilization","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"ruins"},"name":"Ruins"},"historic/tomb":{"icon":"cemetery","fields":["name","tomb","building_area","inscription"],"geometry":["point","area"],"tags":{"historic":"tomb"},"name":"Tomb"},"historic/wayside_cross":{"icon":"religious-christian","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_cross"},"name":"Wayside Cross"},"historic/wayside_shrine":{"icon":"landmark","fields":["name","inscription"],"geometry":["point","vertex","area"],"tags":{"historic":"wayside_shrine"},"name":"Wayside Shrine"},"junction":{"icon":"poi-junction","fields":["name"],"geometry":["vertex","area"],"tags":{"junction":"yes"},"name":"Junction"},"landuse":{"fields":["name","landuse"],"geometry":["area"],"tags":{"landuse":"*"},"matchScore":0.9,"name":"Land Use"},"landuse/farm":{"icon":"farm","fields":["name","operator","crop"],"geometry":["point","area"],"tags":{"landuse":"farm"},"terms":[],"name":"Farmland","searchable":false},"landuse/allotments":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"allotments"},"terms":["allotment","garden"],"name":"Community Garden"},"landuse/aquaculture":{"icon":"aquarium","fields":["name","operator","produce"],"geometry":["area"],"tags":{"landuse":"aquaculture"},"terms":["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],"name":"Aquaculture"},"landuse/basin":{"icon":"water","fields":["name"],"geometry":["area"],"tags":{"landuse":"basin"},"terms":[],"name":"Basin"},"landuse/cemetery":{"icon":"cemetery","fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"cemetery"},"terms":[],"name":"Cemetery"},"landuse/churchyard":{"fields":["name","religion","denomination"],"geometry":["area"],"tags":{"landuse":"churchyard"},"terms":[],"name":"Churchyard"},"landuse/commercial":{"icon":"commercial","fields":["name"],"geometry":["area"],"tags":{"landuse":"commercial"},"terms":[],"name":"Commercial Area"},"landuse/construction":{"fields":["name","construction","operator"],"geometry":["area"],"tags":{"landuse":"construction"},"terms":[],"name":"Construction"},"landuse/farmland":{"icon":"farm","fields":["name","operator","crop","produce"],"geometry":["area"],"tags":{"landuse":"farmland"},"terms":["crop","grow","plant"],"name":"Farmland"},"landuse/farmyard":{"icon":"farm","fields":["name","operator","crop"],"geometry":["area"],"tags":{"landuse":"farmyard"},"terms":["crop","grow","plant"],"name":"Farmyard"},"landuse/forest":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle","produce"],"geometry":["area"],"tags":{"landuse":"forest"},"terms":["tree"],"name":"Forest"},"landuse/garages":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"garages"},"terms":[],"name":"Garages"},"landuse/grass":{"geometry":["area"],"tags":{"landuse":"grass"},"terms":[],"name":"Grass"},"landuse/harbour":{"icon":"harbor","fields":["name","operator"],"geometry":["area"],"terms":["boat"],"tags":{"landuse":"harbour"},"name":"Harbor"},"landuse/industrial":{"icon":"industry","fields":["name"],"geometry":["area"],"tags":{"landuse":"industrial"},"terms":[],"matchScore":0.9,"name":"Industrial Area"},"landuse/landfill":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"landfill"},"terms":["dump"],"name":"Landfill"},"landuse/meadow":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"meadow"},"terms":[],"name":"Meadow"},"landuse/military":{"icon":"poi-military","fields":["name"],"geometry":["area"],"tags":{"landuse":"military"},"terms":[],"matchScore":0.9,"name":"Military Area"},"landuse/military/airfield":{"icon":"airfield","fields":["name","iata","icao"],"geometry":["point","area"],"tags":{"military":"airfield"},"addTags":{"landuse":"military","military":"airfield"},"removeTags":{"landuse":"military","military":"airfield"},"terms":["air force","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],"name":"Military Airfield"},"landuse/military/barracks":{"icon":"poi-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":"poi-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":"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":"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":"poi-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":"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":"poi-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":"poi-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":"poi-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":"poi-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":"park-alt1","fields":["name","operator","trees"],"geometry":["area"],"tags":{"landuse":"orchard"},"terms":["fruit"],"name":"Orchard"},"landuse/plant_nursery":{"icon":"garden","fields":["name","operator","plant"],"geometry":["area"],"tags":{"landuse":"plant_nursery"},"terms":["flower","garden","grow","vivero"],"name":"Plant Nursery"},"landuse/quarry":{"geometry":["area"],"fields":["name"],"tags":{"landuse":"quarry"},"terms":[],"name":"Quarry"},"landuse/railway":{"icon":"rail","fields":["operator"],"geometry":["area"],"tags":{"landuse":"railway"},"terms":["rail","train","track"],"name":"Railway Corridor"},"landuse/recreation_ground":{"icon":"pitch","geometry":["area"],"fields":["name"],"tags":{"landuse":"recreation_ground"},"terms":["playing fields"],"name":"Recreation Ground"},"landuse/residential":{"icon":"building","geometry":["area"],"tags":{"landuse":"residential"},"terms":[],"name":"Residential Area"},"landuse/retail":{"icon":"shop","geometry":["area"],"fields":["name"],"tags":{"landuse":"retail"},"name":"Retail Area"},"landuse/vineyard":{"fields":["name","operator","grape_variety"],"geometry":["area"],"tags":{"landuse":"vineyard"},"addTags":{"landuse":"vineyard","crop":"grape"},"removeTags":{"landuse":"vineyard","crop":"grape","grape_variety":"*"},"terms":["grape","wine"],"name":"Vineyard"},"leisure":{"icon":"pitch","fields":["name","leisure"],"geometry":["point","vertex","area"],"tags":{"leisure":"*"},"name":"Leisure"},"leisure/adult_gaming_centre":{"icon":"poi-dice","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["gambling","slot machine"],"tags":{"leisure":"adult_gaming_centre"},"name":"Adult Gaming Center"},"leisure/bird_hide":{"icon":"poi-binoculars","fields":["building_area"],"geometry":["point","area"],"tags":{"leisure":"bird_hide"},"terms":["machan","ornithology"],"name":"Bird Hide"},"leisure/bowling_alley":{"icon":"poi-bowling","fields":["name","operator","address","building_area","opening_hours","smoking"],"geometry":["point","area"],"terms":["bowling center"],"tags":{"leisure":"bowling_alley"},"name":"Bowling Alley"},"leisure/common":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"terms":["open space"],"tags":{"leisure":"common"},"name":"Common"},"leisure/dance":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ballroom","jive","swing","tango","waltz"],"tags":{"leisure":"dance"},"name":"Dance Hall"},"leisure/dog_park":{"icon":"dog-park","geometry":["point","area"],"fields":["name"],"terms":[],"tags":{"leisure":"dog_park"},"name":"Dog Park"},"leisure/firepit":{"icon":"fire-station","geometry":["point","area"],"tags":{"leisure":"firepit"},"terms":["fireplace","campfire"],"name":"Firepit"},"leisure/fitness_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_centre"},"terms":["health","gym","leisure","studio"],"name":"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["studio"],"tags":{"leisure":"fitness_centre","sport":"yoga"},"reference":{"key":"sport","value":"yoga"},"name":"Yoga Studio"},"leisure/fitness_station":{"icon":"pitch","fields":["name","sport","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"fitness_station"},"terms":["fitness","gym","trim trail"],"name":"Outdoor Fitness Station"},"leisure/garden":{"icon":"garden","fields":["name","access_simple"],"geometry":["point","vertex","area"],"tags":{"leisure":"garden"},"name":"Garden"},"leisure/golf_course":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["links"],"tags":{"leisure":"golf_course"},"name":"Golf Course"},"leisure/hackerspace":{"icon":"commercial","fields":["name","address","building_area","opening_hours","website"],"geometry":["point","area"],"terms":["makerspace","hackspace","hacklab"],"tags":{"leisure":"hackerspace"},"name":"Hackerspace"},"leisure/horse_riding":{"icon":"horse-riding","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["equestrian","stable"],"tags":{"leisure":"horse_riding"},"name":"Horseback Riding Facility"},"leisure/ice_rink":{"icon":"pitch","fields":["name","seasonal","sport_ice","operator","address","building","opening_hours"],"geometry":["point","area"],"terms":["hockey","skating","curling"],"tags":{"leisure":"ice_rink"},"name":"Ice Rink"},"leisure/marina":{"icon":"harbor","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["boat"],"tags":{"leisure":"marina"},"name":"Marina"},"leisure/miniature_golf":{"icon":"golf","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["crazy golf","mini golf","putt-putt"],"tags":{"leisure":"miniature_golf"},"name":"Miniature Golf"},"leisure/nature_reserve":{"icon":"park","geometry":["point","area"],"fields":["name"],"tags":{"leisure":"nature_reserve"},"terms":["protected","wildlife"],"name":"Nature Reserve"},"leisure/park":{"icon":"park","geometry":["point","area"],"fields":["name"],"terms":["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],"tags":{"leisure":"park"},"name":"Park"},"leisure/picnic_table":{"icon":"picnic-site","geometry":["point"],"tags":{"leisure":"picnic_table"},"terms":["bench"],"name":"Picnic Table"},"leisure/pitch":{"icon":"pitch","fields":["sport","surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch"},"terms":["field"],"name":"Sport Pitch"},"leisure/pitch/american_football":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"american_football"},"reference":{"key":"sport","value":"american_football"},"terms":[],"name":"American Football Field"},"leisure/pitch/baseball":{"icon":"baseball","fields":["lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"baseball"},"reference":{"key":"sport","value":"baseball"},"terms":[],"name":"Baseball Diamond"},"leisure/pitch/basketball":{"icon":"basketball","fields":["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":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"beachvolleyball"},"addTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"removeTags":{"leisure":"pitch","sport":"beachvolleyball","surface":"sand"},"reference":{"key":"sport","value":"beachvolleyball"},"terms":["volleyball"],"name":"Beach Volleyball Court"},"leisure/pitch/bowls":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"bowls"},"reference":{"key":"sport","value":"bowls"},"terms":[],"name":"Bowling Green"},"leisure/pitch/cricket":{"icon":"cricket","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"cricket"},"reference":{"key":"sport","value":"cricket"},"terms":[],"name":"Cricket Field"},"leisure/pitch/equestrian":{"icon":"horse-riding","fields":["surface","lit","building"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"equestrian"},"reference":{"key":"sport","value":"equestrian"},"terms":["dressage","equestrian","horse","horseback","riding"],"name":"Riding Arena"},"leisure/pitch/rugby_league":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_league"},"reference":{"key":"sport","value":"rugby_league"},"terms":[],"name":"Rugby League Field"},"leisure/pitch/rugby_union":{"icon":"america-football","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"rugby_union"},"reference":{"key":"sport","value":"rugby_union"},"terms":[],"name":"Rugby Union Field"},"leisure/pitch/skateboard":{"icon":"pitch","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"skateboard"},"reference":{"key":"sport","value":"skateboard"},"terms":[],"name":"Skate Park"},"leisure/pitch/soccer":{"icon":"soccer","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"soccer"},"reference":{"key":"sport","value":"soccer"},"terms":["football"],"name":"Soccer Field"},"leisure/pitch/table_tennis":{"icon":"tennis","fields":["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":"tennis","fields":["surface","lit","access_simple"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"tennis"},"reference":{"key":"sport","value":"tennis"},"terms":[],"name":"Tennis Court"},"leisure/pitch/volleyball":{"icon":"basketball","fields":["surface","lit"],"geometry":["point","area"],"tags":{"leisure":"pitch","sport":"volleyball"},"reference":{"key":"sport","value":"volleyball"},"terms":[],"name":"Volleyball Court"},"leisure/playground":{"icon":"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":"lodging","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"resort"},"name":"Resort"},"leisure/running_track":{"icon":"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/slipway":{"icon":"poi-beach","geometry":["point","line"],"terms":["boat launch","boat ramp"],"tags":{"leisure":"slipway"},"name":"Slipway"},"leisure/sports_centre":{"icon":"pitch","fields":["name","sport","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"leisure":"sports_centre"},"terms":[],"name":"Sports Center / Complex"},"leisure/sports_centre/swimming":{"icon":"swimming","fields":["name","access_simple","operator","address","building"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"sports_centre","sport":"swimming"},"reference":{"key":"sport","value":"swimming"},"name":"Swimming Pool Facility"},"leisure/stadium":{"icon":"pitch","fields":["name","sport","address"],"geometry":["point","area"],"tags":{"leisure":"stadium"},"name":"Stadium"},"leisure/swimming_pool":{"icon":"swimming","fields":["name","access_simple","operator","address"],"geometry":["point","area"],"terms":["dive","water"],"tags":{"leisure":"swimming_pool"},"name":"Swimming Pool"},"leisure/track":{"icon":"highway-road","fields":["surface","sport_racing_nonmotor","lit","width","lanes"],"geometry":["point","line","area"],"tags":{"leisure":"track"},"terms":["cycle","dog","greyhound","horse","race*","track"],"name":"Racetrack (Non-Motorsport)"},"leisure/water_park":{"icon":"swimming","fields":["name","operator","address"],"geometry":["point","area"],"terms":["swim","pool","dive"],"tags":{"leisure":"water_park"},"name":"Water Park"},"line":{"fields":["name"],"geometry":["line"],"tags":{},"name":"Line","matchScore":0.1},"man_made":{"icon":"poi-storage-tank","fields":["name","man_made"],"geometry":["point","vertex","line","area"],"tags":{"man_made":"*"},"name":"Man Made"},"man_made/embankment":{"geometry":["line"],"tags":{"man_made":"embankment"},"name":"Embankment","searchable":false},"man_made/adit":{"icon":"triangle","geometry":["point","area"],"fields":["operator"],"terms":["entrance","underground","mine","cave"],"tags":{"man_made":"adit"},"name":"Adit"},"man_made/breakwater":{"geometry":["line","area"],"tags":{"man_made":"breakwater"},"name":"Breakwater"},"man_made/bridge":{"geometry":["area"],"tags":{"man_made":"bridge"},"name":"Bridge"},"man_made/chimney":{"icon":"poi-chimney","geometry":["point","area"],"tags":{"man_made":"chimney"},"name":"Chimney"},"man_made/crane":{"icon":"poi-crane","fields":["operator","height","crane/type"],"geometry":["point","line","vertex","area"],"tags":{"man_made":"crane"},"name":"Crane"},"man_made/cutline":{"geometry":["line"],"tags":{"man_made":"cutline"},"name":"Cut line"},"man_made/flagpole":{"icon":"embassy","geometry":["point"],"tags":{"man_made":"flagpole"},"name":"Flagpole"},"man_made/gasometer":{"icon":"poi-storage-tank","geometry":["point","area"],"terms":["gas holder"],"tags":{"man_made":"gasometer"},"name":"Gasometer"},"man_made/groyne":{"geometry":["line","area"],"tags":{"man_made":"groyne"},"name":"Groyne"},"man_made/lighthouse":{"icon":"lighthouse","fields":["building_area"],"geometry":["point","area"],"tags":{"man_made":"lighthouse"},"name":"Lighthouse"},"man_made/mast":{"icon":"poi-mast","fields":["tower/type","tower/construction","height","communication_multi"],"geometry":["point"],"terms":["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],"tags":{"man_made":"mast"},"name":"Mast"},"man_made/observation":{"icon":"poi-tower","geometry":["point","area"],"terms":["lookout tower","fire tower"],"tags":{"man_made":"tower","tower:type":"observation"},"name":"Observation Tower"},"man_made/petroleum_well":{"icon":"poi-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":{"geometry":["line","area"],"terms":["dock","jetty"],"tags":{"man_made":"pier"},"name":"Pier"},"man_made/pipeline":{"icon":"pipeline-line","fields":["location","operator"],"geometry":["line"],"tags":{"man_made":"pipeline"},"name":"Pipeline"},"man_made/pumping_station":{"icon":"water","geometry":["point","area"],"tags":{"man_made":"pumping_station"},"name":"Pumping Station"},"man_made/silo":{"icon":"poi-silo","fields":["building_area","crop"],"geometry":["point","area"],"terms":["grain","corn","wheat"],"tags":{"man_made":"silo"},"name":"Silo"},"man_made/storage_tank":{"icon":"poi-storage-tank","fields":["building_area","content"],"geometry":["point","area"],"terms":["water","oil","gas","petrol"],"tags":{"man_made":"storage_tank"},"name":"Storage Tank"},"man_made/surveillance_camera":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance","surveillance:type":"camera"},"name":"Surveillance Camera"},"man_made/surveillance":{"icon":"attraction","geometry":["point","vertex"],"fields":["surveillance","surveillance/type","surveillance/zone"],"terms":["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],"tags":{"man_made":"surveillance"},"name":"Surveillance"},"man_made/survey_point":{"icon":"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":"poi-tower","fields":["tower/type","tower/construction","height"],"geometry":["point","area"],"tags":{"man_made":"tower"},"name":"Tower"},"man_made/wastewater_plant":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"terms":["sewage*","water treatment plant","reclamation plant"],"tags":{"man_made":"wastewater_plant"},"name":"Wastewater Plant"},"man_made/water_tower":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_tower"},"name":"Water Tower"},"man_made/water_well":{"icon":"water","fields":["operator"],"geometry":["point","area"],"tags":{"man_made":"water_well"},"name":"Water Well"},"man_made/water_works":{"icon":"water","fields":["name","operator","address"],"geometry":["point","area"],"tags":{"man_made":"water_works"},"name":"Water Works"},"man_made/watermill":{"icon":"buddhism","fields":["building_area"],"geometry":["point","area"],"terms":["water","wheel","mill"],"tags":{"man_made":"watermill"},"name":"Watermill"},"man_made/windmill":{"icon":"poi-windmill","fields":["building_area"],"geometry":["point","area"],"terms":["wind","wheel","mill"],"tags":{"man_made":"windmill"},"name":"Windmill"},"man_made/works":{"icon":"industry","fields":["name","operator","address","building_area","product"],"geometry":["point","area"],"terms":["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],"tags":{"man_made":"works"},"name":"Factory"},"manhole":{"icon":"circle-stroked","fields":["manhole","operator","label","ref"],"geometry":["point","vertex"],"tags":{"manhole":"*"},"terms":["cover","hole","sewer","sewage","telecom"],"name":"Manhole"},"manhole/drain":{"icon":"water","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"drain"},"terms":["cover","drain","hole","rain","sewer","sewage","storm"],"name":"Storm Drain"},"manhole/telecom":{"icon":"circle-stroked","fields":["operator","ref"],"geometry":["point","vertex"],"tags":{"manhole":"telecom"},"terms":["cover","phone","hole","telecom","telephone","bt"],"name":"Telecom Manhole"},"natural":{"icon":"natural","fields":["name","natural"],"geometry":["point","vertex","area"],"tags":{"natural":"*"},"name":"Natural"},"natural/bare_rock":{"geometry":["area"],"tags":{"natural":"bare_rock"},"terms":["rock"],"name":"Bare Rock"},"natural/bay":{"icon":"poi-beach","geometry":["point","area"],"fields":["name"],"tags":{"natural":"bay"},"terms":[],"name":"Bay"},"natural/beach":{"icon":"poi-beach","fields":["surface"],"geometry":["point","area"],"tags":{"natural":"beach"},"terms":["shore"],"name":"Beach"},"natural/cave_entrance":{"icon":"triangle","geometry":["point","area"],"fields":["fee","access_simple"],"tags":{"natural":"cave_entrance"},"terms":["cavern","hollow","grotto","shelter","cavity"],"name":"Cave Entrance"},"natural/cliff":{"icon":"triangle","geometry":["point","vertex","line","area"],"tags":{"natural":"cliff"},"terms":["escarpment"],"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/peak":{"icon":"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/ridge":{"geometry":["line"],"tags":{"natural":"ridge"},"terms":["crest"],"name":"Ridge"},"natural/saddle":{"icon":"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":"water","fields":["name","intermittent"],"geometry":["point","vertex"],"tags":{"natural":"spring"},"terms":[],"name":"Spring"},"natural/tree_row":{"icon":"park","fields":["leaf_type","leaf_cycle","denotation"],"geometry":["line"],"tags":{"natural":"tree_row"},"terms":[],"name":"Tree row"},"natural/tree":{"icon":"park","fields":["leaf_type_singular","leaf_cycle_singular","denotation"],"geometry":["point","vertex"],"tags":{"natural":"tree"},"terms":[],"name":"Tree"},"natural/volcano":{"icon":"volcano","fields":["name","elevation","volcano/status","volcano/type"],"geometry":["point","vertex"],"tags":{"natural":"volcano"},"terms":["mountain","crater"],"name":"Volcano"},"natural/water":{"icon":"water","fields":["water"],"geometry":["area"],"tags":{"natural":"water"},"name":"Water"},"natural/water/lake":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"lake"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","loch","mere"],"name":"Lake"},"natural/water/pond":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"pond"},"reference":{"key":"natural","value":"water"},"terms":["lakelet","millpond","tarn","pool","mere"],"name":"Pond"},"natural/water/reservoir":{"icon":"water","fields":["name","intermittent"],"geometry":["area"],"tags":{"natural":"water","water":"reservoir"},"reference":{"key":"natural","value":"water"},"name":"Reservoir"},"natural/wetland":{"icon":"wetland","fields":["wetland"],"geometry":["point","area"],"tags":{"natural":"wetland"},"terms":["bog","marsh","reedbed","swamp","tidalflat"],"name":"Wetland"},"natural/wood":{"icon":"park-alt1","fields":["name","leaf_type","leaf_cycle"],"geometry":["point","area"],"tags":{"natural":"wood"},"terms":["tree"],"name":"Wood"},"noexit/yes":{"icon":"barrier","geometry":["vertex"],"terms":["no exit","road end","dead end"],"tags":{"noexit":"yes"},"reference":{"key":"noexit","value":"*"},"name":"No Exit"},"office":{"icon":"commercial","fields":["name","office","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"*"},"terms":[],"name":"Office"},"office/physician":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"physician"},"searchable":false,"name":"Physician"},"office/travel_agent":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"travel_agent"},"reference":{"key":"shop","value":"travel_agency"},"terms":[],"name":"Travel Agency","searchable":false},"office/accountant":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"accountant"},"terms":[],"name":"Accountant"},"office/administrative":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"administrative"},"terms":[],"name":"Administrative Office"},"office/architect":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"architect"},"terms":[],"name":"Architect"},"office/company":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"company"},"terms":[],"name":"Company Office"},"office/coworking":{"icon":"commercial","fields":["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"terms":["coworking","office"],"tags":{"office":"coworking"},"reference":{"key":"amenity","value":"coworking_space"},"name":"Coworking Space"},"office/educational_institution":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"educational_institution"},"terms":[],"name":"Educational Institution"},"office/employment_agency":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"employment_agency"},"terms":["job"],"name":"Employment Agency"},"office/estate_agent":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"estate_agent"},"terms":[],"name":"Real Estate Office"},"office/financial":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"financial"},"terms":[],"name":"Financial Office"},"office/government":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"government"},"terms":[],"name":"Government Office"},"office/government/register_office":{"icon":"town-hall","fields":["name","address","building_area","opening_hours","operator"],"geometry":["point","area"],"terms":["clerk","marriage","death","birth","certificate"],"tags":{"office":"government","government":"register_office"},"reference":{"key":"government","value":"register_office"},"name":"Register Office"},"office/insurance":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"insurance"},"terms":[],"name":"Insurance Office"},"office/it":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"it"},"terms":[],"name":"IT Office"},"office/lawyer":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"lawyer"},"terms":[],"name":"Law Office"},"office/lawyer/notary":{"icon":"suitcase","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"lawyer","lawyer":"notary"},"reference":{"key":"office","value":"notary"},"terms":["clerk","signature","wills","deeds","estate"],"name":"Notary Office"},"office/newspaper":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"newspaper"},"terms":[],"name":"Newspaper"},"office/ngo":{"icon":"commercial","fields":["name","address","building_area","opening_hours","smoking"],"geometry":["point","vertex","area"],"tags":{"office":"ngo"},"terms":[],"name":"NGO Office"},"office/political_party":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"political_party"},"terms":[],"name":"Political Party"},"office/research":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"research"},"terms":[],"name":"Research Office"},"office/telecommunication":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"telecommunication"},"terms":[],"name":"Telecom Office"},"office/therapist":{"icon":"commercial","fields":["name","address","building_area","opening_hours"],"geometry":["point","vertex","area"],"tags":{"office":"therapist"},"terms":[],"name":"Therapist"},"piste":{"icon":"skiing","fields":["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],"geometry":["point","line","area"],"terms":["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],"tags":{"piste:type":"*"},"name":"Piste/Ski Trail"},"place/farm":{"icon":"farm","geometry":["point","area"],"fields":["name"],"tags":{"place":"farm"},"name":"Farm","searchable":false},"place/city":{"icon":"city","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"city"},"name":"City"},"place/hamlet":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"hamlet"},"name":"Hamlet"},"place/island":{"icon":"mountain","geometry":["point","area"],"fields":["name"],"terms":["archipelago","atoll","bar","cay","isle","islet","key","reef"],"tags":{"place":"island"},"name":"Island"},"place/isolated_dwelling":{"icon":"home","geometry":["point","area"],"fields":["name"],"tags":{"place":"isolated_dwelling"},"name":"Isolated Dwelling"},"place/locality":{"icon":"triangle-stroked","geometry":["point","area"],"fields":["name"],"tags":{"place":"locality"},"name":"Locality"},"place/neighbourhood":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"neighbourhood"},"terms":["neighbourhood"],"name":"Neighborhood"},"place/quarter":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"quarter"},"terms":["boro","borough","quarter"],"name":"Sub-Borough / Quarter"},"place/square":{"icon":"poi-foot","geometry":["point","area"],"fields":["name"],"tags":{"place":"square"},"name":"Square"},"place/suburb":{"icon":"triangle-stroked","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"suburb"},"terms":["boro","borough","quarter"],"name":"Borough / Suburb"},"place/town":{"icon":"town","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"town"},"name":"Town"},"place/village":{"icon":"village","fields":["name","population"],"geometry":["point","area"],"tags":{"place":"village"},"name":"Village"},"playground/balance_beam":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"balancebeam"},"name":"Balance Beam"},"playground/basket_spinner":{"icon":"playground","geometry":["point"],"terms":["basket rotator"],"tags":{"playground":"basketrotator"},"name":"Basket Spinner"},"playground/basket_swing":{"icon":"playground","geometry":["point"],"tags":{"playground":"basketswing"},"name":"Basket Swing"},"playground/climbing_frame":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"climbingframe"},"name":"Climbing Frame"},"playground/cushion":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"cushion"},"name":"Bouncy Cushion"},"playground/horizontal_bar":{"icon":"pitch","fields":["height"],"geometry":["point"],"terms":["high bar"],"tags":{"playground":"horizontal_bar"},"name":"Horizontal Bar"},"playground/rocker":{"icon":"playground","geometry":["point"],"tags":{"playground":"springy"},"name":"Springy Rocker"},"playground/roundabout":{"icon":"stadium","fields":["bench"],"geometry":["point","area"],"tags":{"playground":"roundabout"},"name":"Play Roundabout"},"playground/sandpit":{"icon":"playground","geometry":["point","area"],"tags":{"playground":"sandpit"},"name":"Sandpit"},"playground/seesaw":{"icon":"playground","geometry":["point"],"tags":{"playground":"seesaw"},"name":"Seesaw"},"playground/slide":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"slide"},"name":"Slide"},"playground/structure":{"icon":"pitch","geometry":["point","area"],"tags":{"playground":"structure"},"name":"Play Structure"},"playground/swing":{"icon":"playground","fields":["playground/baby","wheelchair"],"geometry":["point"],"tags":{"playground":"swing"},"name":"Swing"},"playground/zipwire":{"icon":"playground","geometry":["point","line"],"tags":{"playground":"zipwire"},"name":"Zip Wire"},"point":{"fields":["name"],"geometry":["point"],"tags":{},"name":"Point","matchScore":0.1},"power/sub_station":{"fields":["substation","operator","building"],"geometry":["point","area"],"tags":{"power":"sub_station"},"reference":{"key":"power","value":"substation"},"name":"Substation","searchable":false},"power/generator":{"icon":"poi-power","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity"],"geometry":["point","vertex","area"],"terms":["hydro","solar","turbine","wind"],"tags":{"power":"generator"},"name":"Power Generator"},"power/generator/source_nuclear":{"icon":"poi-nuclear","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity"],"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":"poi-wind","fields":["operator","generator/source","generator/method","generator/type","generator/output/electricity","height"],"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":"power-line","geometry":["line"],"tags":{"power":"line"},"name":"Power Line"},"power/minor_line":{"icon":"power-line","geometry":["line"],"tags":{"power":"minor_line"},"name":"Minor Power Line"},"power/plant":{"icon":"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":{"geometry":["vertex"],"tags":{"power":"pole"},"name":"Power Pole"},"power/substation":{"icon":"poi-power","fields":["substation","operator","building"],"geometry":["point","area"],"tags":{"power":"substation"},"name":"Substation"},"power/tower":{"geometry":["vertex"],"tags":{"power":"tower"},"name":"High-Voltage Tower"},"power/transformer":{"icon":"poi-power","geometry":["point","vertex","area"],"tags":{"power":"transformer"},"name":"Transformer"},"public_transport/platform":{"icon":"bus","fields":["name","ref_platform","network","operator","shelter"],"geometry":["point","vertex","line","area"],"tags":{"public_transport":"platform"},"name":"Platform"},"public_transport/stop_position":{"icon":"bus","fields":["name","ref_stop_position","network","operator"],"geometry":["vertex"],"tags":{"public_transport":"stop_position"},"name":"Stop Position"},"railway/abandoned":{"icon":"railway-abandoned","geometry":["line"],"tags":{"railway":"abandoned"},"fields":["name","structure","service_rail"],"terms":[],"name":"Abandoned Railway"},"railway/buffer_stop":{"icon":"poi-buffer-stop","geometry":["vertex"],"tags":{"railway":"buffer_stop"},"terms":["stop","halt","buffer"],"name":"Buffer Stop"},"railway/crossing":{"icon":"cross","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":"roadblock","geometry":["vertex"],"tags":{"railway":"derail"},"terms":["derailer"],"name":"Railway Derailer"},"railway/disused":{"icon":"railway-disused","geometry":["line"],"tags":{"railway":"disused"},"fields":["structure","service_rail"],"terms":[],"name":"Disused Railway"},"railway/funicular":{"icon":"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/halt":{"icon":"rail","geometry":["point","vertex"],"tags":{"railway":"halt"},"name":"Railway Halt","terms":["break","interrupt","rest","wait","interruption"]},"railway/level_crossing":{"icon":"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/milestone":{"icon":"poi-milestone","geometry":["point","vertex"],"fields":["milestone_position"],"tags":{"railway":"milestone"},"terms":["milestone","marker"],"name":"Railway Milestone"},"railway/monorail":{"icon":"railway-monorail","geometry":["line"],"tags":{"railway":"monorail"},"fields":["name","structure","electrified","service_rail"],"terms":[],"name":"Monorail"},"railway/narrow_gauge":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"narrow_gauge"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["narrow gauge railway","narrow gauge railroad"],"name":"Narrow Gauge Rail"},"railway/platform":{"icon":"highway-footway","fields":["name","ref_platform","surface","lit","shelter"],"geometry":["line","area"],"tags":{"railway":"platform"},"name":"Railway Platform"},"railway/rail":{"icon":"railway-rail","geometry":["line"],"tags":{"railway":"rail"},"fields":["name","structure","gauge","electrified","maxspeed","service_rail"],"terms":[],"name":"Rail"},"railway/signal":{"icon":"poi-railway-signals","geometry":["point","vertex"],"tags":{"railway":"signal"},"terms":["signal","lights"],"name":"Railway Signal"},"railway/station":{"icon":"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":"Railway Station"},"railway/subway_entrance":{"icon":"entrance","geometry":["point","vertex"],"fields":["name"],"tags":{"railway":"subway_entrance"},"terms":["metro","transit"],"name":"Subway Entrance"},"railway/subway":{"icon":"railway-subway","geometry":["line"],"tags":{"railway":"subway"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["metro","transit"],"name":"Subway"},"railway/switch":{"icon":"poi-junction","geometry":["vertex"],"tags":{"railway":"switch"},"terms":["switch","points"],"name":"Railway Switch"},"railway/train_wash":{"icon":"rail","geometry":["point","vertex","area"],"fields":["operator","building_area"],"tags":{"railway":"wash"},"terms":["wash","clean"],"name":"Train Wash"},"railway/tram_stop":{"icon":"rail-light","fields":["name","network","operator"],"geometry":["vertex"],"tags":{"railway":"tram_stop"},"terms":["light rail","streetcar","tram","trolley"],"name":"Tram Stop"},"railway/tram":{"icon":"railway-light-rail","geometry":["line"],"tags":{"railway":"tram"},"fields":["name","structure","gauge","electrified","service_rail"],"terms":["light rail","streetcar","tram","trolley"],"name":"Tram"},"relation":{"icon":"relation","fields":["name","relation"],"geometry":["relation"],"tags":{},"name":"Relation"},"route/ferry":{"icon":"ferry-line","geometry":["line"],"fields":["name","operator","duration","access"],"tags":{"route":"ferry"},"name":"Ferry Route"},"shop":{"icon":"shop","fields":["name","shop","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"*"},"terms":[],"name":"Shop"},"shop/fishmonger":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"fishmonger"},"reference":{"key":"shop","value":"seafood"},"name":"Fishmonger","searchable":false},"shop/furnace":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["oven","stove"],"tags":{"shop":"furnace"},"name":"Furnace Store","searchable":false},"shop/vacant":{"icon":"shop","fields":["name","address","building_area"],"geometry":["point","area"],"tags":{"shop":"vacant"},"name":"Vacant Shop","searchable":false},"shop/alcohol":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours","drive_through"],"geometry":["point","area"],"terms":["alcohol","beer","booze","wine"],"tags":{"shop":"alcohol"},"name":"Liquor Store"},"shop/anime":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"anime"},"terms":["manga","japan","cosplay","figurine","dakimakura"],"name":"Anime Shop"},"shop/antiques":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"antiques"},"name":"Antiques Shop"},"shop/appliance":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery"],"tags":{"shop":"art"},"name":"Art Store"},"shop/baby_goods":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"baby_goods"},"name":"Baby Goods Store"},"shop/bag":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["handbag","purse"],"tags":{"shop":"bag"},"name":"Bag/Luggage Store"},"shop/bakery":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bakery"},"name":"Bakery"},"shop/bathroom_furnishing":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bathroom_furnishing"},"name":"Bathroom Furnishing Store"},"shop/beauty":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","beauty"],"geometry":["point","area"],"terms":["spa","salon","tanning"],"tags":{"shop":"beauty"},"name":"Beauty Shop"},"shop/beauty/nails":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["manicure","pedicure"],"tags":{"shop":"beauty","beauty":"nails"},"reference":{"key":"shop","value":"beauty"},"name":"Nail Salon"},"shop/beauty/tanning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beauty","beauty":"tanning"},"reference":{"key":"leisure","value":"tanning_salon"},"name":"Tanning Salon"},"shop/bed":{"icon":"lodging","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"bed"},"name":"Bedding/Mattress Store"},"shop/beverages":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"beverages"},"name":"Beverage Store"},"shop/bicycle":{"icon":"bicycle","fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"geometry":["point","area"],"terms":["bike","repair"],"tags":{"shop":"bicycle"},"name":"Bicycle Shop"},"shop/bookmaker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["betting"],"tags":{"shop":"bookmaker"},"name":"Bookmaker"},"shop/books":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"shop":"books"},"name":"Book Store"},"shop/boutique":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"boutique"},"name":"Boutique"},"shop/butcher":{"icon":"slaughterhouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["meat"],"tags":{"shop":"butcher"},"name":"Butcher"},"shop/candles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"candles"},"name":"Candle Shop"},"shop/car_parts":{"icon":"car","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car_parts"},"name":"Car Parts Store"},"shop/car_repair":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"geometry":["point","area"],"terms":["auto","garage","service"],"tags":{"shop":"car_repair"},"name":"Car Repair Shop"},"shop/car":{"icon":"car","fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"geometry":["point","area"],"terms":["auto"],"tags":{"shop":"car"},"name":"Car Dealership"},"shop/carpet":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["rug"],"tags":{"shop":"carpet"},"name":"Carpet Store"},"shop/charity":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"geometry":["point","area"],"terms":["thrift","op shop","nonprofit"],"tags":{"shop":"charity"},"name":"Charity Store"},"shop/cheese":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cheese"},"name":"Cheese Store"},"shop/chemist":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chemist"},"terms":["med*","drug*","gift"],"name":"Drugstore"},"shop/chocolate":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"chocolate"},"name":"Chocolate Store"},"shop/clothes":{"icon":"clothing-store","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"clothes"},"name":"Clothing Store"},"shop/coffee":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"coffee"},"name":"Coffee Store"},"shop/computer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"computer"},"name":"Computer Store"},"shop/confectionery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sweet"],"tags":{"shop":"confectionery"},"name":"Candy Store"},"shop/convenience":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"convenience"},"name":"Convenience Store"},"shop/copyshop":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"copyshop"},"name":"Copy Store"},"shop/cosmetics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"cosmetics"},"name":"Cosmetics Store"},"shop/craft":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"craft"},"terms":["art*","paint*","frame"],"name":"Arts and Crafts Store"},"shop/curtain":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["drape*","window"],"tags":{"shop":"curtain"},"name":"Curtain Store"},"shop/dairy":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["milk","egg","cheese"],"tags":{"shop":"dairy"},"name":"Dairy Store"},"shop/deli":{"icon":"restaurant","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["lunch","meat","sandwich"],"tags":{"shop":"deli"},"name":"Deli"},"shop/department_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"department_store"},"name":"Department Store"},"shop/doityourself":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"doityourself"},"name":"DIY Store"},"shop/dry_cleaning":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"dry_cleaning"},"name":"Dry Cleaner"},"shop/e-cigarette":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"e-cigarette"},"terms":["electronic","vapor"],"name":"E-Cigarette Shop"},"shop/electronics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"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":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sex","porn"],"tags":{"shop":"erotic"},"name":"Erotic Store"},"shop/fabric":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["sew"],"tags":{"shop":"fabric"},"name":"Fabric Store"},"shop/farm":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["farm shop","farm stand"],"tags":{"shop":"farm"},"name":"Produce Stand"},"shop/fashion":{"icon":"shop","fields":["name","clothes","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"fashion"},"name":"Fashion Store"},"shop/florist":{"icon":"florist","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["flower"],"tags":{"shop":"florist"},"name":"Florist"},"shop/frame":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"frame"},"terms":["art*","paint*","photo*","frame"],"name":"Framing Shop"},"shop/funeral_directors":{"icon":"cemetery","fields":["name","operator","address","building_area","religion","denomination"],"geometry":["point","area"],"terms":["undertaker","memorial home"],"tags":{"shop":"funeral_directors"},"name":"Funeral Home"},"shop/furniture":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["chair","sofa","table"],"tags":{"shop":"furniture"},"name":"Furniture Store"},"shop/garden_centre":{"icon":"garden-center","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["landscape","mulch","shrub","tree"],"tags":{"shop":"garden_centre"},"name":"Garden Center"},"shop/gas":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["cng","lpg","natural gas","propane","refill","tank"],"tags":{"shop":"gas"},"name":"Bottled Gas Shop"},"shop/gift":{"icon":"gift","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["souvenir"],"tags":{"shop":"gift"},"name":"Gift Shop"},"shop/greengrocer":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fruit","vegetable"],"tags":{"shop":"greengrocer"},"name":"Greengrocer"},"shop/hairdresser":{"icon":"hairdresser","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["barber"],"tags":{"shop":"hairdresser"},"name":"Hairdresser"},"shop/hardware":{"icon":"poi-tool","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hardware"},"name":"Hardware Store"},"shop/hearing_aids":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"hearing_aids"},"name":"Hearing Aids Store"},"shop/herbalist":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"herbalist"},"name":"Herbalist"},"shop/hifi":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["stereo","video"],"tags":{"shop":"hifi"},"name":"Hifi Store"},"shop/houseware":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["home","household"],"tags":{"shop":"houseware"},"name":"Houseware Store"},"shop/interior_decoration":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"interior_decoration"},"name":"Interior Decoration Store"},"shop/jewelry":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["diamond","gem","ring"],"tags":{"shop":"jewelry"},"name":"Jeweler"},"shop/kiosk":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kiosk"},"name":"News Kiosk"},"shop/kitchen":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"kitchen"},"name":"Kitchen Design Store"},"shop/laundry":{"icon":"laundry","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"laundry"},"name":"Laundry"},"shop/leather":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"leather"},"name":"Leather Store"},"shop/locksmith":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["key","lockpick"],"tags":{"shop":"locksmith"},"name":"Locksmith"},"shop/lottery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"lottery"},"name":"Lottery Shop"},"shop/mall":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["shopping"],"tags":{"shop":"mall"},"name":"Mall"},"shop/massage":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"massage"},"name":"Massage Shop"},"shop/medical_supply":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"medical_supply"},"name":"Medical Supply Store"},"shop/mobile_phone":{"icon":"mobile-phone","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"mobile_phone"},"name":"Mobile Phone Store"},"shop/money_lender":{"icon":"bank","fields":["name","operator","address","building_area","opening_hours","currency_multi"],"geometry":["point","area"],"tags":{"shop":"money_lender"},"name":"Money Lender"},"shop/motorcycle":{"icon":"scooter","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["bike"],"tags":{"shop":"motorcycle"},"name":"Motorcycle Dealership"},"shop/music":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["CD","vinyl"],"tags":{"shop":"music"},"name":"Music Store"},"shop/musical_instrument":{"icon":"music","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["guitar"],"tags":{"shop":"musical_instrument"},"name":"Musical Instrument Store"},"shop/newsagent":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"newsagent"},"name":"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"nutrition_supplements"},"name":"Nutrition Supplements Store"},"shop/optician":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["eye","glasses"],"tags":{"shop":"optician"},"name":"Optician"},"shop/organic":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"supermarket","organic":"only"},"name":"Organic Goods Store"},"shop/outdoor":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["camping","climbing","hiking"],"tags":{"shop":"outdoor"},"name":"Outdoors Store"},"shop/paint":{"icon":"water","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"paint"},"name":"Paint Store"},"shop/pastry":{"icon":"bakery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pastry"},"terms":["patisserie","cake shop","cakery"],"name":"Pastry Shop"},"shop/pawnbroker":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pawnbroker"},"name":"Pawn Shop"},"shop/perfumery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"perfumery"},"name":"Perfume Store"},"shop/pet":{"icon":"dog-park","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["animal","cat","dog","fish","kitten","puppy","reptile"],"tags":{"shop":"pet"},"name":"Pet Store"},"shop/photo":{"icon":"attraction","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["camera","film"],"tags":{"shop":"photo"},"name":"Photography Store"},"shop/pyrotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"pyrotechnics"},"name":"Fireworks Store"},"shop/radiotechnics":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"radiotechnics"},"name":"Radio/Electronic Component Store"},"shop/religion":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","religion","denomination"],"geometry":["point","area"],"tags":{"shop":"religion"},"name":"Religious Store"},"shop/scuba_diving":{"icon":"swimming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"scuba_diving"},"name":"Scuba Diving Shop"},"shop/seafood":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fishmonger"],"tags":{"shop":"seafood"},"name":"Seafood Shop"},"shop/second_hand":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours","second_hand"],"geometry":["point","area"],"terms":["secondhand","second hand","resale","thrift","used"],"tags":{"shop":"second_hand"},"name":"Consignment/Thrift Store"},"shop/shoes":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"shoes"},"name":"Shoe Store"},"shop/sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"sports"},"name":"Sporting Goods Store"},"shop/stationery":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["card","paper"],"tags":{"shop":"stationery"},"name":"Stationery Store"},"shop/storage_rental":{"icon":"shop","fields":["name","operator","address","building","opening_hours"],"geometry":["point","area"],"tags":{"shop":"storage_rental"},"name":"Storage Rental"},"shop/supermarket":{"icon":"grocery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["grocery","store","shop"],"tags":{"shop":"supermarket"},"name":"Supermarket"},"shop/tailor":{"icon":"clothing-store","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["clothes","suit"],"tags":{"shop":"tailor"},"name":"Tailor"},"shop/tattoo":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tattoo"},"name":"Tattoo Parlor"},"shop/tea":{"icon":"teahouse","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tea"},"name":"Tea Store"},"shop/ticket":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"ticket"},"name":"Ticket Seller"},"shop/tiles":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tiles"},"name":"Tile Shop"},"shop/tobacco":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tobacco"},"name":"Tobacco Shop"},"shop/toys":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"toys"},"name":"Toy Store"},"shop/trade":{"icon":"shop","fields":["name","trade","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"trade"},"name":"Trade Shop"},"shop/travel_agency":{"icon":"suitcase","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"travel_agency"},"name":"Travel Agency"},"shop/tyres":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"tyres"},"name":"Tire Store"},"shop/vacuum_cleaner":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"vacuum_cleaner"},"name":"Vacuum Cleaner Store"},"shop/variety_store":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"variety_store"},"name":"Variety Store"},"shop/video_games":{"icon":"gaming","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"video_games"},"name":"Video Game Store"},"shop/video":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["DVD"],"tags":{"shop":"video"},"name":"Video Store"},"shop/watches":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"watches"},"name":"Watches Shop"},"shop/water_sports":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"water_sports"},"name":"Watersport/Swim Shop"},"shop/weapons":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["ammo","gun","knife","knives"],"tags":{"shop":"weapons"},"name":"Weapon Shop"},"shop/window_blind":{"icon":"shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"window_blind"},"name":"Window Blind Store"},"shop/wine":{"icon":"alcohol-shop","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"tags":{"shop":"wine"},"name":"Wine Shop"},"tourism":{"icon":"attraction","fields":["name","tourism"],"geometry":["point","vertex","area"],"tags":{"tourism":"*"},"name":"Tourism"},"tourism/alpine_hut":{"icon":"lodging","fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"alpine_hut"},"name":"Alpine Hut"},"tourism/apartment":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"apartment"},"name":"Guest Apartment / Condo"},"tourism/aquarium":{"icon":"aquarium","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["fish","sea","water"],"tags":{"tourism":"aquarium"},"name":"Aquarium"},"tourism/artwork":{"icon":"art-gallery","fields":["name","artwork_type","artist"],"geometry":["point","vertex","area"],"tags":{"tourism":"artwork"},"terms":["mural","sculpture","statue"],"name":"Artwork"},"tourism/attraction":{"icon":"monument","fields":["name","operator","address"],"geometry":["point","vertex","area"],"tags":{"tourism":"attraction"},"name":"Tourist Attraction"},"tourism/camp_site":{"icon":"campsite","fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["tent","rv"],"tags":{"tourism":"camp_site"},"name":"Campground"},"tourism/caravan_site":{"icon":"bus","fields":["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","vertex","area"],"terms":["Motor Home","Camper"],"tags":{"tourism":"caravan_site"},"name":"RV Park"},"tourism/chalet":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"chalet"},"name":"Chalet"},"tourism/gallery":{"icon":"art-gallery","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","paint*","photo*","sculpt*"],"tags":{"tourism":"gallery"},"name":"Art Gallery"},"tourism/guest_house":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"guest_house"},"terms":["B&B","Bed and Breakfast"],"name":"Guest House"},"tourism/hostel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hostel"},"name":"Hostel"},"tourism/hotel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"hotel"},"name":"Hotel"},"tourism/information":{"icon":"information","fields":["information","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information"},"name":"Information"},"tourism/information/board":{"icon":"information","fields":["name","operator","board_type"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"board"},"reference":{"key":"information","value":"board"},"name":"Information Board"},"tourism/information/guidepost":{"icon":"information","fields":["operator","ref"],"geometry":["point","vertex"],"terms":["signpost"],"tags":{"tourism":"information","information":"guidepost"},"reference":{"key":"information","value":"guidepost"},"name":"Guidepost"},"tourism/information/map":{"icon":"information","fields":["operator","map_type","map_size"],"geometry":["point","vertex"],"tags":{"tourism":"information","information":"map"},"reference":{"key":"information","value":"map"},"name":"Map"},"tourism/information/office":{"icon":"information","fields":["name","operator","address","building_area"],"geometry":["point","vertex","area"],"tags":{"tourism":"information","information":"office"},"reference":{"key":"information","value":"office"},"name":"Tourist Information Office"},"tourism/motel":{"icon":"lodging","fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"geometry":["point","area"],"tags":{"tourism":"motel"},"name":"Motel"},"tourism/museum":{"icon":"museum","fields":["name","operator","address","building_area","opening_hours"],"geometry":["point","area"],"terms":["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],"tags":{"tourism":"museum"},"name":"Museum"},"tourism/picnic_site":{"icon":"picnic-site","fields":["name","operator","address","smoking"],"geometry":["point","vertex","area"],"terms":["camp"],"tags":{"tourism":"picnic_site"},"name":"Picnic Site"},"tourism/theme_park":{"icon":"amusement-park","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"tags":{"tourism":"theme_park"},"name":"Theme Park"},"tourism/viewpoint":{"icon":"poi-binoculars","geometry":["point","vertex"],"tags":{"tourism":"viewpoint"},"name":"Viewpoint"},"tourism/zoo":{"icon":"zoo","fields":["name","operator","address","opening_hours"],"geometry":["point","area"],"terms":["animal"],"tags":{"tourism":"zoo"},"name":"Zoo"},"traffic_calming":{"icon":"poi-warning","fields":["traffic_calming","parallel_direction"],"geometry":["vertex","line"],"tags":{"traffic_calming":"*"},"terms":["bump","hump","slow","speed"],"name":"Traffic Calming"},"traffic_calming/bump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["hump","speed","slow"],"tags":{"traffic_calming":"bump"},"name":"Speed Bump"},"traffic_calming/chicane":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["driveway link","speed","slow"],"tags":{"traffic_calming":"chicane"},"name":"Traffic Chicane"},"traffic_calming/choker":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"choker"},"name":"Traffic Choker"},"traffic_calming/cushion":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","hump","speed","slow"],"tags":{"traffic_calming":"cushion"},"name":"Speed Cushion"},"traffic_calming/dip":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["speed","slow"],"tags":{"traffic_calming":"dip"},"name":"Dip"},"traffic_calming/hump":{"icon":"poi-warning","fields":["surface","parallel_direction"],"geometry":["vertex","line"],"terms":["bump","speed","slow"],"tags":{"traffic_calming":"hump"},"name":"Speed Hump"},"traffic_calming/island":{"icon":"poi-warning","geometry":["vertex"],"terms":["circle","roundabout","slow"],"tags":{"traffic_calming":"island"},"name":"Traffic Island"},"traffic_calming/rumble_strip":{"icon":"poi-warning","fields":["parallel_direction"],"geometry":["vertex","line"],"terms":["audible lines","sleeper lines","growlers"],"tags":{"traffic_calming":"rumble_strip"},"name":"Rumble Strip"},"traffic_calming/table":{"icon":"poi-warning","fields":["surface"],"geometry":["vertex"],"tags":{"traffic_calming":"table"},"terms":["flat top","hump","speed","slow"],"name":"Speed Table"},"type/multipolygon":{"icon":"multipolygon","geometry":["area","relation"],"tags":{"type":"multipolygon"},"removeTags":{},"name":"Multipolygon","searchable":false,"matchScore":0.1},"type/boundary":{"icon":"boundary","fields":["name","boundary"],"geometry":["relation"],"tags":{"type":"boundary"},"name":"Boundary"},"type/boundary/administrative":{"icon":"boundary","fields":["name","admin_level"],"geometry":["relation"],"tags":{"type":"boundary","boundary":"administrative"},"reference":{"key":"boundary","value":"administrative"},"name":"Administrative Boundary"},"type/restriction":{"icon":"restriction","fields":["name","restriction","except"],"geometry":["relation"],"tags":{"type":"restriction"},"name":"Restriction"},"type/restriction/no_left_turn":{"icon":"restriction-no-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_left_turn"},"name":"No Left Turn"},"type/restriction/no_right_turn":{"icon":"restriction-no-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_right_turn"},"name":"No Right Turn"},"type/restriction/no_straight_on":{"icon":"restriction-no-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_straight_on"},"name":"No Straight On"},"type/restriction/no_u_turn":{"icon":"restriction-no-u-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"no_u_turn"},"name":"No U-turn"},"type/restriction/only_left_turn":{"icon":"restriction-only-left-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_left_turn"},"name":"Left Turn Only"},"type/restriction/only_right_turn":{"icon":"restriction-only-right-turn","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_right_turn"},"name":"Right Turn Only"},"type/restriction/only_straight_on":{"icon":"restriction-only-straight-on","fields":["except"],"geometry":["relation"],"tags":{"type":"restriction","restriction":"only_straight_on"},"name":"No Turns"},"type/route_master":{"icon":"route-master","fields":["name","route_master","ref","operator","network"],"geometry":["relation"],"tags":{"type":"route_master"},"name":"Route Master"},"type/route":{"icon":"route","fields":["name","route","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route"},"name":"Route"},"type/route/bicycle":{"icon":"route-bicycle","fields":["name","ref_route","network_bicycle","cycle_network"],"geometry":["relation"],"tags":{"type":"route","route":"bicycle"},"name":"Cycle Route"},"type/route/bus":{"icon":"route-bus","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"bus"},"name":"Bus Route"},"type/route/detour":{"icon":"route-detour","fields":["name","ref_route"],"geometry":["relation"],"tags":{"type":"route","route":"detour"},"name":"Detour Route"},"type/route/ferry":{"icon":"route-ferry","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"ferry"},"name":"Ferry Route"},"type/route/foot":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"foot"},"name":"Foot Route"},"type/route/hiking":{"icon":"route-foot","fields":["name","ref_route","operator","network_foot"],"geometry":["relation"],"tags":{"type":"route","route":"hiking"},"name":"Hiking Route"},"type/route/horse":{"icon":"route-horse","fields":["name","ref_route","operator","network_horse"],"geometry":["relation"],"tags":{"type":"route","route":"horse"},"name":"Riding Route"},"type/route/pipeline":{"icon":"route-pipeline","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"pipeline"},"name":"Pipeline Route"},"type/route/power":{"icon":"route-power","fields":["name","ref_route","operator"],"geometry":["relation"],"tags":{"type":"route","route":"power"},"name":"Power Route"},"type/route/road":{"icon":"route-road","fields":["name","ref_route","network_road"],"geometry":["relation"],"tags":{"type":"route","route":"road"},"name":"Road Route"},"type/route/train":{"icon":"route-train","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"train"},"name":"Train Route"},"type/route/tram":{"icon":"route-tram","fields":["name","ref_route","operator","network"],"geometry":["relation"],"tags":{"type":"route","route":"tram"},"name":"Tram Route"},"type/site":{"icon":"relation","fields":["name","site"],"geometry":["relation"],"tags":{"type":"site"},"name":"Site"},"type/waterway":{"icon":"route-water","fields":["name","waterway","ref"],"geometry":["relation"],"tags":{"type":"waterway"},"name":"Waterway"},"vertex":{"fields":["name"],"geometry":["vertex"],"tags":{},"name":"Other","matchScore":0.1},"waterway/boatyard":{"icon":"harbor","fields":["name","operator"],"geometry":["area","vertex","point"],"tags":{"waterway":"boatyard"},"name":"Boatyard"},"waterway/canal":{"icon":"waterway-canal","fields":["name","width","intermittent"],"geometry":["line"],"tags":{"waterway":"canal"},"name":"Canal"},"waterway/dam":{"icon":"dam","geometry":["point","vertex","line","area"],"fields":["name"],"tags":{"waterway":"dam"},"name":"Dam"},"waterway/ditch":{"icon":"waterway-ditch","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"ditch"},"name":"Ditch"},"waterway/dock":{"icon":"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":"waterway-stream","fields":["structure_waterway","intermittent"],"geometry":["line"],"tags":{"waterway":"drain"},"name":"Drain"},"waterway/fuel":{"icon":"fuel","fields":["name","operator","address","opening_hours","fuel_multi"],"geometry":["point","area"],"terms":["petrol","gas","diesel","boat"],"tags":{"waterway":"fuel"},"name":"Marine Fuel Station"},"waterway/river":{"icon":"waterway-river","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],"tags":{"waterway":"river"},"name":"River"},"waterway/riverbank":{"icon":"water","geometry":["area"],"tags":{"waterway":"riverbank"},"name":"Riverbank"},"waterway/sanitary_dump_station":{"icon":"poi-storage-tank","fields":["name","operator","access_simple","fee","water_point"],"geometry":["point","vertex","area"],"terms":["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],"tags":{"waterway":"sanitary_dump_station"},"name":"Marine Toilet Disposal"},"waterway/stream_intermittent":{"icon":"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":"waterway-stream","fields":["name","structure_waterway","width","intermittent"],"geometry":["line"],"terms":["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],"tags":{"waterway":"stream"},"name":"Stream"},"waterway/water_point":{"icon":"drinking-water","geometry":["area","vertex","point"],"tags":{"waterway":"water_point"},"name":"Marine Drinking Water"},"waterway/waterfall":{"icon":"water","fields":["name","height","width","intermittent"],"geometry":["vertex"],"terms":["fall"],"tags":{"waterway":"waterfall"},"name":"Waterfall"},"waterway/weir":{"icon":"dam","geometry":["vertex","line"],"tags":{"waterway":"weir"},"name":"Weir"},"amenity/arts_centre/Świetlica wiejska":{"tags":{"name":"Świetlica wiejska","amenity":"arts_centre"},"name":"Świetlica wiejska","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/arts_centre/Дом культуры":{"tags":{"name":"Дом культуры","amenity":"arts_centre"},"name":"Дом культуры","icon":"theatre","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/bank/ABANCA":{"tags":{"name":"ABANCA","amenity":"bank"},"name":"ABANCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABN AMRO":{"tags":{"name":"ABN AMRO","amenity":"bank"},"name":"ABN AMRO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ABSA":{"tags":{"name":"ABSA","amenity":"bank"},"name":"ABSA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AIB":{"tags":{"name":"AIB","amenity":"bank"},"name":"AIB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ANZ":{"tags":{"name":"ANZ","amenity":"bank"},"name":"ANZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ASB Bank":{"tags":{"name":"ASB Bank","amenity":"bank"},"name":"ASB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ATB Financial":{"tags":{"name":"ATB Financial","amenity":"bank"},"name":"ATB Financial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/AXA":{"tags":{"name":"AXA","amenity":"bank"},"name":"AXA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Agribank":{"tags":{"name":"Agribank","amenity":"bank"},"name":"Agribank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Akbank":{"tags":{"name":"Akbank","amenity":"bank"},"name":"Akbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alior Bank":{"tags":{"name":"Alior Bank","amenity":"bank"},"name":"Alior Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allahabad Bank":{"tags":{"name":"Allahabad Bank","amenity":"bank"},"name":"Allahabad Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Allied Bank":{"tags":{"name":"Allied Bank","amenity":"bank"},"name":"Allied Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Alpha Bank":{"tags":{"name":"Alpha Bank","amenity":"bank"},"name":"Alpha Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Andhra Bank":{"tags":{"name":"Andhra Bank","amenity":"bank"},"name":"Andhra Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Antonveneta":{"tags":{"name":"Antonveneta","amenity":"bank"},"name":"Antonveneta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Argenta":{"tags":{"name":"Argenta","amenity":"bank"},"name":"Argenta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Asia United Bank":{"tags":{"name":"Asia United Bank","amenity":"bank"},"name":"Asia United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Askari Bank":{"tags":{"name":"Askari Bank","amenity":"bank"},"name":"Askari Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Associated Bank":{"tags":{"name":"Associated Bank","amenity":"bank"},"name":"Associated Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Axis Bank":{"tags":{"name":"Axis Bank","amenity":"bank"},"name":"Axis Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAC":{"tags":{"name":"BAC","amenity":"bank"},"name":"BAC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BAWAG PSK":{"tags":{"name":"BAWAG PSK","amenity":"bank"},"name":"BAWAG PSK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BB&T":{"tags":{"name":"BB&T","amenity":"bank"},"name":"BB&T","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBBank":{"tags":{"name":"BBBank","amenity":"bank"},"name":"BBBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBK":{"tags":{"name":"BBK","amenity":"bank"},"name":"BBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA":{"tags":{"name":"BBVA","amenity":"bank"},"name":"BBVA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Bancomer":{"tags":{"name":"BBVA Bancomer","amenity":"bank"},"name":"BBVA Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Compass":{"tags":{"name":"BBVA Compass","amenity":"bank"},"name":"BBVA Compass","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Continental":{"tags":{"name":"BBVA Continental","amenity":"bank"},"name":"BBVA Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BBVA Francés":{"tags":{"name":"BBVA Francés","amenity":"bank"},"name":"BBVA Francés","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCA":{"tags":{"name":"BCA","amenity":"bank"},"name":"BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCI":{"tags":{"name":"BCI","amenity":"bank"},"name":"BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCP":{"tags":{"name":"BCP","amenity":"bank"},"name":"BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BCR":{"tags":{"name":"BCR","amenity":"bank"},"name":"BCR","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BDO":{"tags":{"name":"BDO","amenity":"bank"},"name":"BDO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BGŻ BNP Paribas":{"tags":{"name":"BGŻ BNP Paribas","amenity":"bank"},"name":"BGŻ BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMCE":{"tags":{"name":"BMCE","amenity":"bank"},"name":"BMCE","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMN":{"tags":{"name":"BMN","amenity":"bank"},"name":"BMN","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO":{"tags":{"name":"BMO","amenity":"bank"},"name":"BMO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BMO Harris Bank":{"tags":{"name":"BMO Harris Bank","amenity":"bank"},"name":"BMO Harris Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNA":{"tags":{"name":"BNA","amenity":"bank"},"name":"BNA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNI":{"tags":{"name":"BNI","amenity":"bank"},"name":"BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNL":{"tags":{"name":"BNL","amenity":"bank"},"name":"BNL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas":{"tags":{"name":"BNP Paribas","amenity":"bank"},"name":"BNP Paribas","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BNP Paribas Fortis":{"tags":{"name":"BNP Paribas Fortis","amenity":"bank"},"name":"BNP Paribas Fortis","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BOC":{"tags":{"name":"BOC","amenity":"bank"},"name":"BOC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPH":{"tags":{"name":"BPH","amenity":"bank"},"name":"BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI":{"tags":{"name":"BPI","amenity":"bank"},"name":"BPI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BPI Family Savings Bank":{"tags":{"name":"BPI Family Savings Bank","amenity":"bank"},"name":"BPI Family Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRD":{"tags":{"name":"BRD","amenity":"bank"},"name":"BRD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRED":{"tags":{"name":"BRED","amenity":"bank"},"name":"BRED","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BRI":{"tags":{"name":"BRI","amenity":"bank"},"name":"BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BW-Bank":{"tags":{"name":"BW-Bank","amenity":"bank"},"name":"BW-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BZ WBK":{"tags":{"name":"BZ WBK","amenity":"bank"},"name":"BZ WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banamex":{"tags":{"name":"Banamex","amenity":"bank"},"name":"Banamex","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banc Sabadell":{"tags":{"name":"Banc Sabadell","amenity":"bank"},"name":"Banc Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Intesa":{"tags":{"name":"Banca Intesa","amenity":"bank"},"name":"Banca Intesa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca March":{"tags":{"name":"Banca March","amenity":"bank"},"name":"Banca March","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Milano":{"tags":{"name":"Banca Popolare di Milano","amenity":"bank"},"name":"Banca Popolare di Milano","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Novara":{"tags":{"name":"Banca Popolare di Novara","amenity":"bank"},"name":"Banca Popolare di Novara","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Sondrio":{"tags":{"name":"Banca Popolare di Sondrio","amenity":"bank"},"name":"Banca Popolare di Sondrio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Verona":{"tags":{"name":"Banca Popolare di Verona","amenity":"bank"},"name":"Banca Popolare di Verona","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Popolare di Vicenza":{"tags":{"name":"Banca Popolare di Vicenza","amenity":"bank"},"name":"Banca Popolare di Vicenza","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Românească":{"tags":{"name":"Banca Românească","amenity":"bank"},"name":"Banca Românească","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Sella":{"tags":{"name":"Banca Sella","amenity":"bank"},"name":"Banca Sella","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banca Transilvania":{"tags":{"name":"Banca Transilvania","amenity":"bank"},"name":"Banca Transilvania","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Agrario":{"tags":{"name":"Banco Agrario","amenity":"bank"},"name":"Banco Agrario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Azteca":{"tags":{"name":"Banco Azteca","amenity":"bank"},"name":"Banco Azteca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco BCI":{"tags":{"name":"Banco BCI","amenity":"bank"},"name":"Banco BCI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Bradesco":{"tags":{"name":"Banco Bradesco","amenity":"bank"},"name":"Banco Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Continental":{"tags":{"name":"Banco Continental","amenity":"bank"},"name":"Banco Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Estado":{"tags":{"name":"Banco Estado","amenity":"bank"},"name":"Banco Estado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Fassil":{"tags":{"name":"Banco Fassil","amenity":"bank"},"name":"Banco Fassil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco G&T Continental":{"tags":{"name":"Banco G&T Continental","amenity":"bank"},"name":"Banco G&T Continental","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco General":{"tags":{"name":"Banco General","amenity":"bank"},"name":"Banco General","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Industrial":{"tags":{"name":"Banco Industrial","amenity":"bank"},"name":"Banco Industrial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Internacional":{"tags":{"name":"Banco Internacional","amenity":"bank"},"name":"Banco Internacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Itaú":{"tags":{"name":"Banco Itaú","amenity":"bank"},"name":"Banco Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nacional":{"tags":{"name":"Banco Nacional","amenity":"bank"},"name":"Banco Nacional","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Nación":{"tags":{"name":"Banco Nación","amenity":"bank"},"name":"Banco Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pastor":{"tags":{"name":"Banco Pastor","amenity":"bank"},"name":"Banco Pastor","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Pichincha":{"tags":{"name":"Banco Pichincha","amenity":"bank"},"name":"Banco Pichincha","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Popular":{"tags":{"name":"Banco Popular","amenity":"bank"},"name":"Banco Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Provincia":{"tags":{"name":"Banco Provincia","amenity":"bank"},"name":"Banco Provincia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sabadell":{"tags":{"name":"Banco Sabadell","amenity":"bank"},"name":"Banco Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Santander":{"tags":{"name":"Banco Santander","amenity":"bank"},"name":"Banco Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco Sol":{"tags":{"name":"Banco Sol","amenity":"bank"},"name":"Banco Sol","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Bogotá":{"tags":{"name":"Banco de Bogotá","amenity":"bank"},"name":"Banco de Bogotá","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Chile":{"tags":{"name":"Banco de Chile","amenity":"bank"},"name":"Banco de Chile","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Costa Rica":{"tags":{"name":"Banco de Costa Rica","amenity":"bank"},"name":"Banco de Costa Rica","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Desarrollo Banrural":{"tags":{"name":"Banco de Desarrollo Banrural","amenity":"bank"},"name":"Banco de Desarrollo Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Occidente":{"tags":{"name":"Banco de Occidente","amenity":"bank"},"name":"Banco de Occidente","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de Venezuela":{"tags":{"name":"Banco de Venezuela","amenity":"bank"},"name":"Banco de Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación":{"tags":{"name":"Banco de la Nación","amenity":"bank"},"name":"Banco de la Nación","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco de la Nación Argentina":{"tags":{"name":"Banco de la Nación Argentina","amenity":"bank"},"name":"Banco de la Nación Argentina","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Napoli":{"tags":{"name":"Banco di Napoli","amenity":"bank"},"name":"Banco di Napoli","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco di Sardegna":{"tags":{"name":"Banco di Sardegna","amenity":"bank"},"name":"Banco di Sardegna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Brasil":{"tags":{"name":"Banco do Brasil","amenity":"bank"},"name":"Banco do Brasil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banco do Nordeste":{"tags":{"name":"Banco do Nordeste","amenity":"bank"},"name":"Banco do Nordeste","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/BancoEstado":{"tags":{"name":"BancoEstado","amenity":"bank"},"name":"BancoEstado","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancolombia":{"tags":{"name":"Bancolombia","amenity":"bank"},"name":"Bancolombia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancomer":{"tags":{"name":"Bancomer","amenity":"bank"},"name":"Bancomer","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bancpost":{"tags":{"name":"Bancpost","amenity":"bank"},"name":"Bancpost","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banesco":{"tags":{"name":"Banesco","amenity":"bank"},"name":"Banesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bangkok Bank":{"tags":{"name":"Bangkok Bank","amenity":"bank"},"name":"Bangkok Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Al Habib":{"tags":{"name":"Bank Al Habib","amenity":"bank"},"name":"Bank Al Habib","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Alfalah":{"tags":{"name":"Bank Alfalah","amenity":"bank"},"name":"Bank Alfalah","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Austria":{"tags":{"name":"Bank Austria","amenity":"bank"},"name":"Bank Austria","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BCA":{"tags":{"name":"Bank BCA","amenity":"bank"},"name":"Bank BCA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BNI":{"tags":{"name":"Bank BNI","amenity":"bank"},"name":"Bank BNI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BPH":{"tags":{"name":"Bank BPH","amenity":"bank"},"name":"Bank BPH","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank BRI":{"tags":{"name":"Bank BRI","amenity":"bank"},"name":"Bank BRI","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Danamon":{"tags":{"name":"Bank Danamon","amenity":"bank"},"name":"Bank Danamon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mandiri":{"tags":{"name":"Bank Mandiri","amenity":"bank"},"name":"Bank Mandiri","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Mega":{"tags":{"name":"Bank Mega","amenity":"bank"},"name":"Bank Mega","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Spółdzielczy":{"tags":{"name":"Bank Spółdzielczy","amenity":"bank"},"name":"Bank Spółdzielczy","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank Zachodni WBK":{"tags":{"name":"Bank Zachodni WBK","amenity":"bank"},"name":"Bank Zachodni WBK","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Africa":{"tags":{"name":"Bank of Africa","amenity":"bank"},"name":"Bank of Africa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of America":{"tags":{"name":"Bank of America","amenity":"bank"},"name":"Bank of America","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Baroda":{"tags":{"name":"Bank of Baroda","amenity":"bank"},"name":"Bank of Baroda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ceylon":{"tags":{"name":"Bank of Ceylon","amenity":"bank"},"name":"Bank of Ceylon","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of China":{"tags":{"name":"Bank of China","amenity":"bank"},"name":"Bank of China","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Commerce":{"tags":{"name":"Bank of Commerce","amenity":"bank"},"name":"Bank of Commerce","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of India":{"tags":{"name":"Bank of India","amenity":"bank"},"name":"Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Ireland":{"tags":{"name":"Bank of Ireland","amenity":"bank"},"name":"Bank of Ireland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Montreal":{"tags":{"name":"Bank of Montreal","amenity":"bank"},"name":"Bank of Montreal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of New Zealand":{"tags":{"name":"Bank of New Zealand","amenity":"bank"},"name":"Bank of New Zealand","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of Scotland":{"tags":{"name":"Bank of Scotland","amenity":"bank"},"name":"Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bank of the West":{"tags":{"name":"Bank of the West","amenity":"bank"},"name":"Bank of the West","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankia":{"tags":{"name":"Bankia","amenity":"bank"},"name":"Bankia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bankinter":{"tags":{"name":"Bankinter","amenity":"bank"},"name":"Bankinter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banner Bank":{"tags":{"name":"Banner Bank","amenity":"bank"},"name":"Banner Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banorte":{"tags":{"name":"Banorte","amenity":"bank"},"name":"Banorte","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Atlantique":{"tags":{"name":"Banque Atlantique","amenity":"bank"},"name":"Banque Atlantique","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Nationale":{"tags":{"name":"Banque Nationale","amenity":"bank"},"name":"Banque Nationale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banque Populaire":{"tags":{"name":"Banque Populaire","amenity":"bank"},"name":"Banque Populaire","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrisul":{"tags":{"name":"Banrisul","amenity":"bank"},"name":"Banrisul","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Banrural":{"tags":{"name":"Banrural","amenity":"bank"},"name":"Banrural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Barclays":{"tags":{"name":"Barclays","amenity":"bank"},"name":"Barclays","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bcc":{"tags":{"name":"Bcc","amenity":"bank"},"name":"Bcc","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Belfius":{"tags":{"name":"Belfius","amenity":"bank"},"name":"Belfius","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bendigo Bank":{"tags":{"name":"Bendigo Bank","amenity":"bank"},"name":"Bendigo Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Berliner Volksbank":{"tags":{"name":"Berliner Volksbank","amenity":"bank"},"name":"Berliner Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bicentenario":{"tags":{"name":"Bicentenario","amenity":"bank"},"name":"Bicentenario","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Bradesco":{"tags":{"name":"Bradesco","amenity":"bank"},"name":"Bradesco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Budapest Bank":{"tags":{"name":"Budapest Bank","amenity":"bank"},"name":"Budapest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CBAO":{"tags":{"name":"CBAO","amenity":"bank"},"name":"CBAO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CEC Bank":{"tags":{"name":"CEC Bank","amenity":"bank"},"name":"CEC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CGD":{"tags":{"name":"CGD","amenity":"bank"},"name":"CGD","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIB Bank":{"tags":{"name":"CIB Bank","amenity":"bank"},"name":"CIB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIBC":{"tags":{"name":"CIBC","amenity":"bank"},"name":"CIBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIC":{"tags":{"name":"CIC","amenity":"bank"},"name":"CIC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CIMB Bank":{"tags":{"name":"CIMB Bank","amenity":"bank"},"name":"CIMB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CNEP":{"tags":{"name":"CNEP","amenity":"bank"},"name":"CNEP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse Desjardins":{"tags":{"name":"Caisse Desjardins","amenity":"bank"},"name":"Caisse Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caisse d'Épargne":{"tags":{"name":"Caisse d'Épargne","amenity":"bank"},"name":"Caisse d'Épargne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa":{"tags":{"name":"Caixa","amenity":"bank"},"name":"Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Econômica Federal":{"tags":{"name":"Caixa Econômica Federal","amenity":"bank"},"name":"Caixa Econômica Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caixa Geral de Depósitos":{"tags":{"name":"Caixa Geral de Depósitos","amenity":"bank"},"name":"Caixa Geral de Depósitos","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CaixaBank":{"tags":{"name":"CaixaBank","amenity":"bank"},"name":"CaixaBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Círculo":{"tags":{"name":"Caja Círculo","amenity":"bank"},"name":"Caja Círculo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Duero":{"tags":{"name":"Caja Duero","amenity":"bank"},"name":"Caja Duero","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja España":{"tags":{"name":"Caja España","amenity":"bank"},"name":"Caja España","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural":{"tags":{"name":"Caja Rural","amenity":"bank"},"name":"Caja Rural","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Caja Rural de Jaén":{"tags":{"name":"Caja Rural de Jaén","amenity":"bank"},"name":"Caja Rural de Jaén","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CajaSur":{"tags":{"name":"CajaSur","amenity":"bank"},"name":"CajaSur","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajamar":{"tags":{"name":"Cajamar","amenity":"bank"},"name":"Cajamar","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cajero Automatico Bancared":{"tags":{"name":"Cajero Automatico Bancared","amenity":"bank"},"name":"Cajero Automatico Bancared","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Canara Bank":{"tags":{"name":"Canara Bank","amenity":"bank"},"name":"Canara Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Capital One":{"tags":{"name":"Capital One","amenity":"bank"},"name":"Capital One","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Carige":{"tags":{"name":"Carige","amenity":"bank"},"name":"Carige","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cariparma":{"tags":{"name":"Cariparma","amenity":"bank"},"name":"Cariparma","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cassa di Risparmio del Veneto":{"tags":{"name":"Cassa di Risparmio del Veneto","amenity":"bank"},"name":"Cassa di Risparmio del Veneto","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/CatalunyaCaixa":{"tags":{"name":"CatalunyaCaixa","amenity":"bank"},"name":"CatalunyaCaixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Central Bank of India":{"tags":{"name":"Central Bank of India","amenity":"bank"},"name":"Central Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Chase":{"tags":{"name":"Chase","amenity":"bank"},"name":"Chase","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank":{"tags":{"name":"China Bank","amenity":"bank"},"name":"China Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Bank Savings":{"tags":{"name":"China Bank Savings","amenity":"bank"},"name":"China Bank Savings","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/China Construction Bank":{"tags":{"name":"China Construction Bank","amenity":"bank"},"name":"China Construction Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citibank":{"tags":{"name":"Citibank","amenity":"bank"},"name":"Citibank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Citizens Bank":{"tags":{"name":"Citizens Bank","amenity":"bank"},"name":"Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Clydesdale Bank":{"tags":{"name":"Clydesdale Bank","amenity":"bank"},"name":"Clydesdale Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Columbia Bank":{"tags":{"name":"Columbia Bank","amenity":"bank"},"name":"Columbia Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Comerica Bank":{"tags":{"name":"Comerica Bank","amenity":"bank"},"name":"Comerica Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerce Bank":{"tags":{"name":"Commerce Bank","amenity":"bank"},"name":"Commerce Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank":{"tags":{"name":"Commercial Bank","amenity":"bank"},"name":"Commercial Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commercial Bank of Ceylon PLC":{"tags":{"name":"Commercial Bank of Ceylon PLC","amenity":"bank"},"name":"Commercial Bank of Ceylon PLC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commerzbank":{"tags":{"name":"Commerzbank","amenity":"bank"},"name":"Commerzbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Commonwealth Bank":{"tags":{"name":"Commonwealth Bank","amenity":"bank"},"name":"Commonwealth Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Corporation Bank":{"tags":{"name":"Corporation Bank","amenity":"bank"},"name":"Corporation Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credem":{"tags":{"name":"Credem","amenity":"bank"},"name":"Credem","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credicoop":{"tags":{"name":"Credicoop","amenity":"bank"},"name":"Credicoop","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Agricole":{"tags":{"name":"Credit Agricole","amenity":"bank"},"name":"Credit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Credit Suisse":{"tags":{"name":"Credit Suisse","amenity":"bank"},"name":"Credit Suisse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crelan":{"tags":{"name":"Crelan","amenity":"bank"},"name":"Crelan","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Agricole":{"tags":{"name":"Crédit Agricole","amenity":"bank"},"name":"Crédit Agricole","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel":{"tags":{"name":"Crédit Mutuel","amenity":"bank"},"name":"Crédit Mutuel","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit Mutuel de Bretagne":{"tags":{"name":"Crédit Mutuel de Bretagne","amenity":"bank"},"name":"Crédit Mutuel de Bretagne","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédit du Nord":{"tags":{"name":"Crédit du Nord","amenity":"bank"},"name":"Crédit du Nord","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Crédito Agrícola":{"tags":{"name":"Crédito Agrícola","amenity":"bank"},"name":"Crédito Agrícola","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Cбербанк":{"tags":{"name":"Cбербанк","amenity":"bank"},"name":"Cбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Danske Bank":{"tags":{"name":"Danske Bank","amenity":"bank"},"name":"Danske Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Davivienda":{"tags":{"name":"Davivienda","amenity":"bank"},"name":"Davivienda","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/De Venezuela":{"tags":{"name":"De Venezuela","amenity":"bank"},"name":"De Venezuela","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Denizbank":{"tags":{"name":"Denizbank","amenity":"bank"},"name":"Denizbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Desjardins":{"tags":{"name":"Desjardins","amenity":"bank"},"name":"Desjardins","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Deutsche Bank":{"tags":{"name":"Deutsche Bank","amenity":"bank"},"name":"Deutsche Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Dubai Islamic Bank":{"tags":{"name":"Dubai Islamic Bank","amenity":"bank"},"name":"Dubai Islamic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/EastWest Bank":{"tags":{"name":"EastWest Bank","amenity":"bank"},"name":"EastWest Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ecobank":{"tags":{"name":"Ecobank","amenity":"bank"},"name":"Ecobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Erste Bank":{"tags":{"name":"Erste Bank","amenity":"bank"},"name":"Erste Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Eurobank":{"tags":{"name":"Eurobank","amenity":"bank"},"name":"Eurobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Express Union":{"tags":{"name":"Express Union","amenity":"bank"},"name":"Express Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/FNB":{"tags":{"name":"FNB","amenity":"bank"},"name":"FNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Federal Bank":{"tags":{"name":"Federal Bank","amenity":"bank"},"name":"Federal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Fifth Third Bank":{"tags":{"name":"Fifth Third Bank","amenity":"bank"},"name":"Fifth Third Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Finansbank":{"tags":{"name":"Finansbank","amenity":"bank"},"name":"Finansbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Bank":{"tags":{"name":"First Bank","amenity":"bank"},"name":"First Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First Citizens Bank":{"tags":{"name":"First Citizens Bank","amenity":"bank"},"name":"First Citizens Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/First National Bank":{"tags":{"name":"First National Bank","amenity":"bank"},"name":"First National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Galicia":{"tags":{"name":"Galicia","amenity":"bank"},"name":"Galicia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti":{"tags":{"name":"Garanti","amenity":"bank"},"name":"Garanti","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Garanti Bankası":{"tags":{"name":"Garanti Bankası","amenity":"bank"},"name":"Garanti Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Getin Bank":{"tags":{"name":"Getin Bank","amenity":"bank"},"name":"Getin Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Groupama":{"tags":{"name":"Groupama","amenity":"bank"},"name":"Groupama","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HDFC Bank":{"tags":{"name":"HDFC Bank","amenity":"bank"},"name":"HDFC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HNB":{"tags":{"name":"HNB","amenity":"bank"},"name":"HNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HSBC":{"tags":{"name":"HSBC","amenity":"bank"},"name":"HSBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halifax":{"tags":{"name":"Halifax","amenity":"bank"},"name":"Halifax","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Halkbank":{"tags":{"name":"Halkbank","amenity":"bank"},"name":"Halkbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hamburger Sparkasse":{"tags":{"name":"Hamburger Sparkasse","amenity":"bank"},"name":"Hamburger Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Handelsbanken":{"tags":{"name":"Handelsbanken","amenity":"bank"},"name":"Handelsbanken","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hong Leong Bank":{"tags":{"name":"Hong Leong Bank","amenity":"bank"},"name":"Hong Leong Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Hrvatska poštanska banka":{"tags":{"name":"Hrvatska poštanska banka","amenity":"bank"},"name":"Hrvatska poštanska banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Huntington Bank":{"tags":{"name":"Huntington Bank","amenity":"bank"},"name":"Huntington Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/HypoVereinsbank":{"tags":{"name":"HypoVereinsbank","amenity":"bank"},"name":"HypoVereinsbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICBC":{"tags":{"name":"ICBC","amenity":"bank"},"name":"ICBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ICICI Bank":{"tags":{"name":"ICICI Bank","amenity":"bank"},"name":"ICICI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IDBI Bank":{"tags":{"name":"IDBI Bank","amenity":"bank"},"name":"IDBI Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING":{"tags":{"name":"ING","amenity":"bank"},"name":"ING","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ING Bank Śląski":{"tags":{"name":"ING Bank Śląski","amenity":"bank"},"name":"ING Bank Śląski","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/IberCaja":{"tags":{"name":"IberCaja","amenity":"bank"},"name":"IberCaja","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Bank":{"tags":{"name":"Indian Bank","amenity":"bank"},"name":"Indian Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Indian Overseas Bank":{"tags":{"name":"Indian Overseas Bank","amenity":"bank"},"name":"Indian Overseas Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Interbank":{"tags":{"name":"Interbank","amenity":"bank"},"name":"Interbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Intesa San Paolo":{"tags":{"name":"Intesa San Paolo","amenity":"bank"},"name":"Intesa San Paolo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Itaú":{"tags":{"name":"Itaú","amenity":"bank"},"name":"Itaú","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/K&H Bank":{"tags":{"name":"K&H Bank","amenity":"bank"},"name":"K&H Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/KBC":{"tags":{"name":"KBC","amenity":"bank"},"name":"KBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kasa Stefczyka":{"tags":{"name":"Kasa Stefczyka","amenity":"bank"},"name":"Kasa Stefczyka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Key Bank":{"tags":{"name":"Key Bank","amenity":"bank"},"name":"Key Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Komerční banka":{"tags":{"name":"Komerční banka","amenity":"bank"},"name":"Komerční banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse":{"tags":{"name":"Kreissparkasse","amenity":"bank"},"name":"Kreissparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kreissparkasse Köln":{"tags":{"name":"Kreissparkasse Köln","amenity":"bank"},"name":"Kreissparkasse Köln","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Kutxabank":{"tags":{"name":"Kutxabank","amenity":"bank"},"name":"Kutxabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/LCL":{"tags":{"name":"LCL","amenity":"bank"},"name":"LCL","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Banque Postale":{"tags":{"name":"La Banque Postale","amenity":"bank"},"name":"La Banque Postale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/La Caixa":{"tags":{"name":"La Caixa","amenity":"bank"},"name":"La Caixa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Laboral Kutxa":{"tags":{"name":"Laboral Kutxa","amenity":"bank"},"name":"Laboral Kutxa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Landbank":{"tags":{"name":"Landbank","amenity":"bank"},"name":"Landbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Liberbank":{"tags":{"name":"Liberbank","amenity":"bank"},"name":"Liberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Lloyds Bank":{"tags":{"name":"Lloyds Bank","amenity":"bank"},"name":"Lloyds Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/M&T Bank":{"tags":{"name":"M&T Bank","amenity":"bank"},"name":"M&T Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB":{"tags":{"name":"MCB","amenity":"bank"},"name":"MCB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MCB Bank":{"tags":{"name":"MCB Bank","amenity":"bank"},"name":"MCB Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/MONETA Money Bank":{"tags":{"name":"MONETA Money Bank","amenity":"bank"},"name":"MONETA Money Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Macro":{"tags":{"name":"Macro","amenity":"bank"},"name":"Macro","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Maybank":{"tags":{"name":"Maybank","amenity":"bank"},"name":"Maybank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Meezan Bank":{"tags":{"name":"Meezan Bank","amenity":"bank"},"name":"Meezan Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Mercantil":{"tags":{"name":"Mercantil","amenity":"bank"},"name":"Mercantil","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metro Bank":{"tags":{"name":"Metro Bank","amenity":"bank"},"name":"Metro Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Metrobank":{"tags":{"name":"Metrobank","amenity":"bank"},"name":"Metrobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium BCP":{"tags":{"name":"Millennium BCP","amenity":"bank"},"name":"Millennium BCP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Millennium Bank":{"tags":{"name":"Millennium Bank","amenity":"bank"},"name":"Millennium Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Monte dei Paschi di Siena":{"tags":{"name":"Monte dei Paschi di Siena","amenity":"bank"},"name":"Monte dei Paschi di Siena","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Montepio":{"tags":{"name":"Montepio","amenity":"bank"},"name":"Montepio","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NAB":{"tags":{"name":"NAB","amenity":"bank"},"name":"NAB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NSB":{"tags":{"name":"NSB","amenity":"bank"},"name":"NSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/NatWest":{"tags":{"name":"NatWest","amenity":"bank"},"name":"NatWest","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/National Bank":{"tags":{"name":"National Bank","amenity":"bank"},"name":"National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nationwide":{"tags":{"name":"Nationwide","amenity":"bank"},"name":"Nationwide","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nedbank":{"tags":{"name":"Nedbank","amenity":"bank"},"name":"Nedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Nordea":{"tags":{"name":"Nordea","amenity":"bank"},"name":"Nordea","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Novo Banco":{"tags":{"name":"Novo Banco","amenity":"bank"},"name":"Novo Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OLB":{"tags":{"name":"OLB","amenity":"bank"},"name":"OLB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/OTP":{"tags":{"name":"OTP","amenity":"bank"},"name":"OTP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oberbank":{"tags":{"name":"Oberbank","amenity":"bank"},"name":"Oberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Occidental de Descuento":{"tags":{"name":"Occidental de Descuento","amenity":"bank"},"name":"Occidental de Descuento","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Oldenburgische Landesbank":{"tags":{"name":"Oldenburgische Landesbank","amenity":"bank"},"name":"Oldenburgische Landesbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/One Network Bank":{"tags":{"name":"One Network Bank","amenity":"bank"},"name":"One Network Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Osuuspankki":{"tags":{"name":"Osuuspankki","amenity":"bank"},"name":"Osuuspankki","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PBZ":{"tags":{"name":"PBZ","amenity":"bank"},"name":"PBZ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO":{"tags":{"name":"PKO","amenity":"bank"},"name":"PKO","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PKO BP":{"tags":{"name":"PKO BP","amenity":"bank"},"name":"PKO BP","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNB":{"tags":{"name":"PNB","amenity":"bank"},"name":"PNB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC":{"tags":{"name":"PNC","amenity":"bank"},"name":"PNC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PNC Bank":{"tags":{"name":"PNC Bank","amenity":"bank"},"name":"PNC Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/PSBank":{"tags":{"name":"PSBank","amenity":"bank"},"name":"PSBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Patagonia":{"tags":{"name":"Patagonia","amenity":"bank"},"name":"Patagonia","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Pekao SA":{"tags":{"name":"Pekao SA","amenity":"bank"},"name":"Pekao SA","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Peoples Bank":{"tags":{"name":"Peoples Bank","amenity":"bank"},"name":"Peoples Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Philippine National Bank":{"tags":{"name":"Philippine National Bank","amenity":"bank"},"name":"Philippine National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Piraeus Bank":{"tags":{"name":"Piraeus Bank","amenity":"bank"},"name":"Piraeus Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Popular":{"tags":{"name":"Popular","amenity":"bank"},"name":"Popular","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank":{"tags":{"name":"Postbank","amenity":"bank"},"name":"Postbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Postbank Finanzcenter":{"tags":{"name":"Postbank Finanzcenter","amenity":"bank"},"name":"Postbank Finanzcenter","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Provincial":{"tags":{"name":"Provincial","amenity":"bank"},"name":"Provincial","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Public Bank":{"tags":{"name":"Public Bank","amenity":"bank"},"name":"Public Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Punjab National Bank":{"tags":{"name":"Punjab National Bank","amenity":"bank"},"name":"Punjab National Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC":{"tags":{"name":"RBC","amenity":"bank"},"name":"RBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBC Financial Group":{"tags":{"name":"RBC Financial Group","amenity":"bank"},"name":"RBC Financial Group","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RBS":{"tags":{"name":"RBS","amenity":"bank"},"name":"RBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC":{"tags":{"name":"RCBC","amenity":"bank"},"name":"RCBC","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/RCBC Savings Bank":{"tags":{"name":"RCBC Savings Bank","amenity":"bank"},"name":"RCBC Savings Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Rabobank":{"tags":{"name":"Rabobank","amenity":"bank"},"name":"Rabobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisen Polbank":{"tags":{"name":"Raiffeisen Polbank","amenity":"bank"},"name":"Raiffeisen Polbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Raiffeisenbank":{"tags":{"name":"Raiffeisenbank","amenity":"bank"},"name":"Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Regions Bank":{"tags":{"name":"Regions Bank","amenity":"bank"},"name":"Regions Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Republic Bank":{"tags":{"name":"Republic Bank","amenity":"bank"},"name":"Republic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank":{"tags":{"name":"Royal Bank","amenity":"bank"},"name":"Royal Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Canada":{"tags":{"name":"Royal Bank of Canada","amenity":"bank"},"name":"Royal Bank of Canada","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Royal Bank of Scotland":{"tags":{"name":"Royal Bank of Scotland","amenity":"bank"},"name":"Royal Bank of Scotland","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SEB":{"tags":{"name":"SEB","amenity":"bank"},"name":"SEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SNS Bank":{"tags":{"name":"SNS Bank","amenity":"bank"},"name":"SNS Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sabadell":{"tags":{"name":"Sabadell","amenity":"bank"},"name":"Sabadell","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sampath Bank":{"tags":{"name":"Sampath Bank","amenity":"bank"},"name":"Sampath Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander":{"tags":{"name":"Santander","amenity":"bank"},"name":"Santander","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Consumer Bank":{"tags":{"name":"Santander Consumer Bank","amenity":"bank"},"name":"Santander Consumer Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Río":{"tags":{"name":"Santander Río","amenity":"bank"},"name":"Santander Río","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Santander Totta":{"tags":{"name":"Santander Totta","amenity":"bank"},"name":"Santander Totta","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sberbank":{"tags":{"name":"Sberbank","amenity":"bank"},"name":"Sberbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Scotiabank":{"tags":{"name":"Scotiabank","amenity":"bank"},"name":"Scotiabank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Security Bank":{"tags":{"name":"Security Bank","amenity":"bank"},"name":"Security Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sicredi":{"tags":{"name":"Sicredi","amenity":"bank"},"name":"Sicredi","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Slovenská sporiteľňa":{"tags":{"name":"Slovenská sporiteľňa","amenity":"bank"},"name":"Slovenská sporiteľňa","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Société Générale":{"tags":{"name":"Société Générale","amenity":"bank"},"name":"Société Générale","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparda-Bank":{"tags":{"name":"Sparda-Bank","amenity":"bank"},"name":"Sparda-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse":{"tags":{"name":"Sparkasse","amenity":"bank"},"name":"Sparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse Aachen":{"tags":{"name":"Sparkasse Aachen","amenity":"bank"},"name":"Sparkasse Aachen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Sparkasse KölnBonn":{"tags":{"name":"Sparkasse KölnBonn","amenity":"bank"},"name":"Sparkasse KölnBonn","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stadtsparkasse":{"tags":{"name":"Stadtsparkasse","amenity":"bank"},"name":"Stadtsparkasse","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Stanbic Bank":{"tags":{"name":"Stanbic Bank","amenity":"bank"},"name":"Stanbic Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Bank":{"tags":{"name":"Standard Bank","amenity":"bank"},"name":"Standard Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered":{"tags":{"name":"Standard Chartered","amenity":"bank"},"name":"Standard Chartered","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Standard Chartered Bank":{"tags":{"name":"Standard Chartered Bank","amenity":"bank"},"name":"Standard Chartered Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/State Bank of India":{"tags":{"name":"State Bank of India","amenity":"bank"},"name":"State Bank of India","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/SunTrust":{"tags":{"name":"SunTrust","amenity":"bank"},"name":"SunTrust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Supervielle":{"tags":{"name":"Supervielle","amenity":"bank"},"name":"Supervielle","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Swedbank":{"tags":{"name":"Swedbank","amenity":"bank"},"name":"Swedbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Syndicate Bank":{"tags":{"name":"Syndicate Bank","amenity":"bank"},"name":"Syndicate Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TCF Bank":{"tags":{"name":"TCF Bank","amenity":"bank"},"name":"TCF Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Bank":{"tags":{"name":"TD Bank","amenity":"bank"},"name":"TD Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TD Canada Trust":{"tags":{"name":"TD Canada Trust","amenity":"bank"},"name":"TD Canada Trust","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TEB":{"tags":{"name":"TEB","amenity":"bank"},"name":"TEB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/TSB":{"tags":{"name":"TSB","amenity":"bank"},"name":"TSB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Takarékszövetkezet":{"tags":{"name":"Takarékszövetkezet","amenity":"bank"},"name":"Takarékszövetkezet","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Targobank":{"tags":{"name":"Targobank","amenity":"bank"},"name":"Targobank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Tatra banka":{"tags":{"name":"Tatra banka","amenity":"bank"},"name":"Tatra banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Türkiye İş Bankası":{"tags":{"name":"Türkiye İş Bankası","amenity":"bank"},"name":"Türkiye İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UBS":{"tags":{"name":"UBS","amenity":"bank"},"name":"UBS","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCO Bank":{"tags":{"name":"UCO Bank","amenity":"bank"},"name":"UCO Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UCPB":{"tags":{"name":"UCPB","amenity":"bank"},"name":"UCPB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UOB":{"tags":{"name":"UOB","amenity":"bank"},"name":"UOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/US Bank":{"tags":{"name":"US Bank","amenity":"bank"},"name":"US Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ulster Bank":{"tags":{"name":"Ulster Bank","amenity":"bank"},"name":"Ulster Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Umpqua Bank":{"tags":{"name":"Umpqua Bank","amenity":"bank"},"name":"Umpqua Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/UniCredit Bank":{"tags":{"name":"UniCredit Bank","amenity":"bank"},"name":"UniCredit Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicaja Banco":{"tags":{"name":"Unicaja Banco","amenity":"bank"},"name":"Unicaja Banco","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Unicredit Banca":{"tags":{"name":"Unicredit Banca","amenity":"bank"},"name":"Unicredit Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Union Bank":{"tags":{"name":"Union Bank","amenity":"bank"},"name":"Union Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/United Bank":{"tags":{"name":"United Bank","amenity":"bank"},"name":"United Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VR-Bank":{"tags":{"name":"VR-Bank","amenity":"bank"},"name":"VR-Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vakıfbank":{"tags":{"name":"Vakıfbank","amenity":"bank"},"name":"Vakıfbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Veneto Banca":{"tags":{"name":"Veneto Banca","amenity":"bank"},"name":"Veneto Banca","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Vijaya Bank":{"tags":{"name":"Vijaya Bank","amenity":"bank"},"name":"Vijaya Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volks- und Raiffeisenbank":{"tags":{"name":"Volks- und Raiffeisenbank","amenity":"bank"},"name":"Volks- und Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank":{"tags":{"name":"Volksbank","amenity":"bank"},"name":"Volksbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Mittelhessen":{"tags":{"name":"Volksbank Mittelhessen","amenity":"bank"},"name":"Volksbank Mittelhessen","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Volksbank Raiffeisenbank":{"tags":{"name":"Volksbank Raiffeisenbank","amenity":"bank"},"name":"Volksbank Raiffeisenbank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/VÚB":{"tags":{"name":"VÚB","amenity":"bank"},"name":"VÚB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Washington Federal":{"tags":{"name":"Washington Federal","amenity":"bank"},"name":"Washington Federal","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Wells Fargo":{"tags":{"name":"Wells Fargo","amenity":"bank"},"name":"Wells Fargo","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Western Union":{"tags":{"name":"Western Union","amenity":"bank"},"name":"Western Union","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Westpac":{"tags":{"name":"Westpac","amenity":"bank"},"name":"Westpac","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Bank":{"tags":{"name":"Yorkshire Bank","amenity":"bank"},"name":"Yorkshire Bank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Yorkshire Building Society":{"tags":{"name":"Yorkshire Building Society","amenity":"bank"},"name":"Yorkshire Building Society","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Zagrebačka banka":{"tags":{"name":"Zagrebačka banka","amenity":"bank"},"name":"Zagrebačka banka","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ziraat Bankası":{"tags":{"name":"Ziraat Bankası","amenity":"bank"},"name":"Ziraat Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/mBank":{"tags":{"name":"mBank","amenity":"bank"},"name":"mBank","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ČSOB":{"tags":{"name":"ČSOB","amenity":"bank"},"name":"ČSOB","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Česká spořitelna":{"tags":{"name":"Česká spořitelna","amenity":"bank"},"name":"Česká spořitelna","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/İş Bankası":{"tags":{"name":"İş Bankası","amenity":"bank"},"name":"İş Bankası","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Εθνική Τράπεζα":{"tags":{"name":"Εθνική Τράπεζα","amenity":"bank"},"name":"Εθνική Τράπεζα","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Πειραιώς":{"tags":{"name":"Πειραιώς","amenity":"bank"},"name":"Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Τράπεζα Πειραιώς":{"tags":{"name":"Τράπεζα Πειραιώς","amenity":"bank"},"name":"Τράπεζα Πειραιώς","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Авангард":{"tags":{"name":"Авангард","amenity":"bank"},"name":"Авангард","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Альфа-Банк":{"tags":{"name":"Альфа-Банк","amenity":"bank"},"name":"Альфа-Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банк Москвы":{"tags":{"name":"Банк Москвы","amenity":"bank"},"name":"Банк Москвы","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Банка ДСК":{"tags":{"name":"Банка ДСК","amenity":"bank"},"name":"Банка ДСК","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белагропромбанк":{"tags":{"name":"Белагропромбанк","amenity":"bank"},"name":"Белагропромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Беларусбанк":{"tags":{"name":"Беларусбанк","amenity":"bank"},"name":"Беларусбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Белинвестбанк":{"tags":{"name":"Белинвестбанк","amenity":"bank"},"name":"Белинвестбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Бинбанк":{"tags":{"name":"Бинбанк","amenity":"bank"},"name":"Бинбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ":{"tags":{"name":"ВТБ","amenity":"bank"},"name":"ВТБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ВТБ24":{"tags":{"name":"ВТБ24","amenity":"bank"},"name":"ВТБ24","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Возрождение":{"tags":{"name":"Возрождение","amenity":"bank"},"name":"Возрождение","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Газпромбанк":{"tags":{"name":"Газпромбанк","amenity":"bank"},"name":"Газпромбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Генбанк":{"tags":{"name":"Генбанк","amenity":"bank"},"name":"Генбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Казкоммерцбанк":{"tags":{"name":"Казкоммерцбанк","amenity":"bank"},"name":"Казкоммерцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/МДМ Банк":{"tags":{"name":"МДМ Банк","amenity":"bank"},"name":"МДМ Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Московский индустриальный банк":{"tags":{"name":"Московский индустриальный банк","amenity":"bank"},"name":"Московский индустриальный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Мособлбанк":{"tags":{"name":"Мособлбанк","amenity":"bank"},"name":"Мособлбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Народный банк":{"tags":{"name":"Народный банк","amenity":"bank"},"name":"Народный банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ОТП Банк":{"tags":{"name":"ОТП Банк","amenity":"bank"},"name":"ОТП Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Открытие":{"tags":{"name":"Открытие","amenity":"bank"},"name":"Открытие","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Ощадбанк":{"tags":{"name":"Ощадбанк","amenity":"bank"},"name":"Ощадбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПУМБ":{"tags":{"name":"ПУМБ","amenity":"bank"},"name":"ПУМБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Почта Банк":{"tags":{"name":"Почта Банк","amenity":"bank"},"name":"Почта Банк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ПриватБанк":{"tags":{"name":"ПриватБанк","amenity":"bank"},"name":"ПриватБанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приватбанк":{"tags":{"name":"Приватбанк","amenity":"bank"},"name":"Приватбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приднестровский Сбербанк":{"tags":{"name":"Приднестровский Сбербанк","amenity":"bank"},"name":"Приднестровский Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Приорбанк":{"tags":{"name":"Приорбанк","amenity":"bank"},"name":"Приорбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Промсвязьбанк":{"tags":{"name":"Промсвязьбанк","amenity":"bank"},"name":"Промсвязьбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/РНКБ":{"tags":{"name":"РНКБ","amenity":"bank"},"name":"РНКБ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен":{"tags":{"name":"Райффайзен","amenity":"bank"},"name":"Райффайзен","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзен Банк Аваль":{"tags":{"name":"Райффайзен Банк Аваль","amenity":"bank"},"name":"Райффайзен Банк Аваль","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Райффайзенбанк":{"tags":{"name":"Райффайзенбанк","amenity":"bank"},"name":"Райффайзенбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Росбанк":{"tags":{"name":"Росбанк","amenity":"bank"},"name":"Росбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Россельхозбанк":{"tags":{"name":"Россельхозбанк","amenity":"bank"},"name":"Россельхозбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Русский стандарт":{"tags":{"name":"Русский стандарт","amenity":"bank"},"name":"Русский стандарт","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Сбербанк":{"tags":{"name":"Сбербанк","amenity":"bank"},"name":"Сбербанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Совкомбанк":{"tags":{"name":"Совкомбанк","amenity":"bank"},"name":"Совкомбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/УкрСиббанк":{"tags":{"name":"УкрСиббанк","amenity":"bank"},"name":"УкрСиббанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Укрсоцбанк":{"tags":{"name":"Укрсоцбанк","amenity":"bank"},"name":"Укрсоцбанк","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Уралсиб":{"tags":{"name":"Уралсиб","amenity":"bank"},"name":"Уралсиб","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/Хоум Кредит":{"tags":{"name":"Хоум Кредит","amenity":"bank"},"name":"Хоум Кредит","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק הפועלים":{"tags":{"name":"בנק הפועלים","amenity":"bank"},"name":"בנק הפועלים","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/בנק לאומי":{"tags":{"name":"בנק לאומי","amenity":"bank"},"name":"בנק לאומי","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک":{"tags":{"name":"بانک","amenity":"bank"},"name":"بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک آینده":{"tags":{"name":"بانک آینده","amenity":"bank"},"name":"بانک آینده","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک اقتصاد نوین":{"tags":{"name":"بانک اقتصاد نوین","amenity":"bank"},"name":"بانک اقتصاد نوین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک انصار":{"tags":{"name":"بانک انصار","amenity":"bank"},"name":"بانک انصار","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک تجارت":{"tags":{"name":"بانک تجارت","amenity":"bank"},"name":"بانک تجارت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه":{"tags":{"name":"بانک رفاه","amenity":"bank"},"name":"بانک رفاه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک رفاه کارگران":{"tags":{"name":"بانک رفاه کارگران","amenity":"bank"},"name":"بانک رفاه کارگران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک سپه":{"tags":{"name":"بانک سپه","amenity":"bank"},"name":"بانک سپه","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک شهر":{"tags":{"name":"بانک شهر","amenity":"bank"},"name":"بانک شهر","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک صادرات":{"tags":{"name":"بانک صادرات","amenity":"bank"},"name":"بانک صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک قوامین":{"tags":{"name":"بانک قوامین","amenity":"bank"},"name":"بانک قوامین","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مسکن":{"tags":{"name":"بانک مسکن","amenity":"bank"},"name":"بانک مسکن","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملت":{"tags":{"name":"بانک ملت","amenity":"bank"},"name":"بانک ملت","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی":{"tags":{"name":"بانک ملی","amenity":"bank"},"name":"بانک ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک ملی ایران":{"tags":{"name":"بانک ملی ایران","amenity":"bank"},"name":"بانک ملی ایران","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک مهر اقتصاد":{"tags":{"name":"بانک مهر اقتصاد","amenity":"bank"},"name":"بانک مهر اقتصاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پارسیان":{"tags":{"name":"بانک پارسیان","amenity":"bank"},"name":"بانک پارسیان","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک پاسارگاد":{"tags":{"name":"بانک پاسارگاد","amenity":"bank"},"name":"بانک پاسارگاد","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/بانک کشاورزی":{"tags":{"name":"بانک کشاورزی","amenity":"bank"},"name":"بانک کشاورزی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/صادرات":{"tags":{"name":"صادرات","amenity":"bank"},"name":"صادرات","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ملی":{"tags":{"name":"ملی","amenity":"bank"},"name":"ملی","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/پست بانک":{"tags":{"name":"پست بانک","amenity":"bank"},"name":"پست بانک","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงเทพ":{"tags":{"name":"ธนาคารกรุงเทพ","amenity":"bank"},"name":"ธนาคารกรุงเทพ","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกรุงไทย":{"tags":{"name":"ธนาคารกรุงไทย","amenity":"bank"},"name":"ธนาคารกรุงไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารกสิกรไทย":{"tags":{"name":"ธนาคารกสิกรไทย","amenity":"bank"},"name":"ธนาคารกสิกรไทย","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารออมสิน":{"tags":{"name":"ธนาคารออมสิน","amenity":"bank"},"name":"ธนาคารออมสิน","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/ธนาคารไทยพาณิชย์":{"tags":{"name":"ธนาคารไทยพาณิชย์","amenity":"bank"},"name":"ธนาคารไทยพาณิชย์","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/みずほ銀行":{"tags":{"name":"みずほ銀行","amenity":"bank"},"name":"みずほ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/りそな銀行":{"tags":{"name":"りそな銀行","amenity":"bank"},"name":"りそな銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三井住友銀行":{"tags":{"name":"三井住友銀行","amenity":"bank"},"name":"三井住友銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/三菱東京UFJ銀行":{"tags":{"name":"三菱東京UFJ銀行","amenity":"bank"},"name":"三菱東京UFJ銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国农业银行":{"tags":{"name":"中国农业银行","amenity":"bank"},"name":"中国农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国工商银行":{"tags":{"name":"中国工商银行","amenity":"bank"},"name":"中国工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国建设银行":{"tags":{"name":"中国建设银行","amenity":"bank"},"name":"中国建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国邮政储蓄银行":{"tags":{"name":"中国邮政储蓄银行","amenity":"bank"},"name":"中国邮政储蓄银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/中国银行":{"tags":{"name":"中国银行","amenity":"bank"},"name":"中国银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/交通银行":{"tags":{"name":"交通银行","amenity":"bank"},"name":"交通银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都中央信用金庫":{"tags":{"name":"京都中央信用金庫","amenity":"bank"},"name":"京都中央信用金庫","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/京都銀行":{"tags":{"name":"京都銀行","amenity":"bank"},"name":"京都銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/农业银行":{"tags":{"name":"农业银行","amenity":"bank"},"name":"农业银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/北海道銀行":{"tags":{"name":"北海道銀行","amenity":"bank"},"name":"北海道銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/合作金庫銀行":{"tags":{"name":"合作金庫銀行","amenity":"bank"},"name":"合作金庫銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/土地銀行":{"tags":{"name":"土地銀行","amenity":"bank"},"name":"土地銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/工商银行":{"tags":{"name":"工商银行","amenity":"bank"},"name":"工商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/建设银行":{"tags":{"name":"建设银行","amenity":"bank"},"name":"建设银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/彰化銀行":{"tags":{"name":"彰化銀行","amenity":"bank"},"name":"彰化銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/招商银行":{"tags":{"name":"招商银行","amenity":"bank"},"name":"招商银行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/横浜銀行":{"tags":{"name":"横浜銀行","amenity":"bank"},"name":"横浜銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/第一銀行":{"tags":{"name":"第一銀行","amenity":"bank"},"name":"第一銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/華南銀行":{"tags":{"name":"華南銀行","amenity":"bank"},"name":"華南銀行","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/국민은행":{"tags":{"name":"국민은행","name:en":"Gungmin Bank","amenity":"bank"},"name":"국민은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/기업은행":{"tags":{"name":"기업은행","amenity":"bank"},"name":"기업은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/농협":{"tags":{"name":"농협","amenity":"bank"},"name":"농협","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/새마을금고":{"tags":{"name":"새마을금고","amenity":"bank"},"name":"새마을금고","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/신한은행":{"tags":{"name":"신한은행","name:en":"Sinhan Bank","amenity":"bank"},"name":"신한은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/우리은행":{"tags":{"name":"우리은행","name:en":"Uri Bank","amenity":"bank"},"name":"우리은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bank/하나은행":{"tags":{"name":"하나은행","amenity":"bank"},"name":"하나은행","icon":"bank","geometry":["point","area"],"fields":["name","atm","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/bar/Bar Centrale":{"tags":{"name":"Bar Centrale","amenity":"bar"},"name":"Bar Centrale","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Bar Sport":{"tags":{"name":"Bar Sport","amenity":"bar"},"name":"Bar Sport","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Beach Bar":{"tags":{"name":"Beach Bar","amenity":"bar"},"name":"Beach Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bar/Pool Bar":{"tags":{"name":"Pool Bar","amenity":"bar"},"name":"Pool Bar","icon":"bar","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/bicycle_rental/Bicing":{"tags":{"name":"Bicing","amenity":"bicycle_rental"},"name":"Bicing","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Call a Bike":{"tags":{"name":"Call a Bike","amenity":"bicycle_rental"},"name":"Call a Bike","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Grid":{"tags":{"name":"Grid","amenity":"bicycle_rental"},"name":"Grid","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/Mibici":{"tags":{"name":"Mibici","amenity":"bicycle_rental"},"name":"Mibici","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bicycle_rental/metropolradruhr":{"tags":{"name":"metropolradruhr","amenity":"bicycle_rental"},"name":"metropolradruhr","icon":"bicycle","geometry":["point","vertex","area"],"fields":["capacity","network","operator"],"suggestion":true},"amenity/bureau_de_change/Abitab":{"tags":{"name":"Abitab","amenity":"bureau_de_change"},"name":"Abitab","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Change":{"tags":{"name":"Change","amenity":"bureau_de_change"},"name":"Change","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/bureau_de_change/Travelex":{"tags":{"name":"Travelex","amenity":"bureau_de_change"},"name":"Travelex","icon":"bank","geometry":["point","vertex"],"fields":["name","operator","currency_multi"],"suggestion":true},"amenity/cafe/85度C":{"tags":{"name":"85度C","amenity":"cafe"},"name":"85度C","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bar Kafe":{"tags":{"name":"Bar Kafe","amenity":"cafe"},"name":"Bar Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Barista":{"tags":{"name":"Barista","amenity":"cafe"},"name":"Barista","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Bonafide":{"tags":{"name":"Bonafide","amenity":"cafe"},"name":"Bonafide","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Coffee Day":{"tags":{"name":"Cafe Coffee Day","amenity":"cafe"},"name":"Cafe Coffee Day","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafe Nero":{"tags":{"name":"Cafe Nero","amenity":"cafe"},"name":"Cafe Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafeteria":{"tags":{"name":"Cafeteria","amenity":"cafe"},"name":"Cafeteria","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Cafetería":{"tags":{"name":"Cafetería","amenity":"cafe"},"name":"Cafetería","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caffè Nero":{"tags":{"name":"Caffè Nero","amenity":"cafe"},"name":"Caffè Nero","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Amazon":{"tags":{"name":"Café Amazon","amenity":"cafe"},"name":"Café Amazon","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café Central":{"tags":{"name":"Café Central","amenity":"cafe"},"name":"Café Central","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café de la Place":{"tags":{"name":"Café de la Place","amenity":"cafe"},"name":"Café de la Place","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Café des Sports":{"tags":{"name":"Café des Sports","amenity":"cafe"},"name":"Café des Sports","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Caribou Coffee":{"tags":{"name":"Caribou Coffee","amenity":"cafe"},"name":"Caribou Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Fellows":{"tags":{"name":"Coffee Fellows","amenity":"cafe"},"name":"Coffee Fellows","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee House":{"tags":{"name":"Coffee House","amenity":"cafe"},"name":"Coffee House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Island":{"tags":{"name":"Coffee Island","amenity":"cafe"},"name":"Coffee Island","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Shop":{"tags":{"name":"Coffee Shop","amenity":"cafe"},"name":"Coffee Shop","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Coffee Time":{"tags":{"name":"Coffee Time","amenity":"cafe"},"name":"Coffee Time","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Costa":{"tags":{"name":"Costa","amenity":"cafe"},"name":"Costa","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Country Style":{"tags":{"name":"Country Style","amenity":"cafe"},"name":"Country Style","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Dunkin' Donuts":{"tags":{"name":"Dunkin' Donuts","cuisine":"donut","amenity":"cafe"},"name":"Dunkin' Donuts","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Dolomiti":{"tags":{"name":"Eiscafe Dolomiti","amenity":"cafe"},"name":"Eiscafe Dolomiti","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Eiscafe Venezia":{"tags":{"name":"Eiscafe Venezia","amenity":"cafe"},"name":"Eiscafe Venezia","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Espresso House":{"tags":{"name":"Espresso House","amenity":"cafe"},"name":"Espresso House","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Havanna":{"tags":{"name":"Havanna","amenity":"cafe"},"name":"Havanna","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Internet Cafe":{"tags":{"name":"Internet Cafe","amenity":"cafe"},"name":"Internet Cafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Kafe":{"tags":{"name":"Kafe","amenity":"cafe"},"name":"Kafe","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Krispy Kreme":{"tags":{"name":"Krispy Kreme","amenity":"cafe"},"name":"Krispy Kreme","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Le Pain Quotidien":{"tags":{"name":"Le Pain Quotidien","amenity":"cafe"},"name":"Le Pain Quotidien","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/McCafé":{"tags":{"name":"McCafé","amenity":"cafe","cuisine":"coffee_shop"},"name":"McCafé","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Peet's Coffee & Tea":{"tags":{"name":"Peet's Coffee & Tea","amenity":"cafe"},"name":"Peet's Coffee & Tea","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Pret A Manger":{"tags":{"name":"Pret A Manger","amenity":"cafe"},"name":"Pret A Manger","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Prime":{"tags":{"name":"Prime","amenity":"cafe"},"name":"Prime","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Second Cup":{"tags":{"name":"Second Cup","amenity":"cafe"},"name":"Second Cup","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Segafredo":{"tags":{"name":"Segafredo","amenity":"cafe"},"name":"Segafredo","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Starbucks":{"tags":{"name":"Starbucks","cuisine":"coffee_shop","amenity":"cafe"},"name":"Starbucks","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Bean & Tea Leaf":{"tags":{"name":"The Coffee Bean & Tea Leaf","amenity":"cafe"},"name":"The Coffee Bean & Tea Leaf","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/The Coffee Club":{"tags":{"name":"The Coffee Club","amenity":"cafe"},"name":"The Coffee Club","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Tim Hortons":{"tags":{"name":"Tim Hortons","amenity":"cafe"},"name":"Tim Hortons","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Traveler's Coffee":{"tags":{"name":"Traveler's Coffee","amenity":"cafe"},"name":"Traveler's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Wayne's Coffee":{"tags":{"name":"Wayne's Coffee","amenity":"cafe"},"name":"Wayne's Coffee","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Бистро":{"tags":{"name":"Бистро","amenity":"cafe"},"name":"Бистро","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Буфет":{"tags":{"name":"Буфет","amenity":"cafe"},"name":"Буфет","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Встреча":{"tags":{"name":"Встреча","amenity":"cafe"},"name":"Встреча","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Даблби":{"tags":{"name":"Даблби","amenity":"cafe"},"name":"Даблби","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Закусочная":{"tags":{"name":"Закусочная","amenity":"cafe"},"name":"Закусочная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофе Хауз":{"tags":{"name":"Кофе Хауз","amenity":"cafe"},"name":"Кофе Хауз","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Кофейня":{"tags":{"name":"Кофейня","amenity":"cafe"},"name":"Кофейня","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Лакомка":{"tags":{"name":"Лакомка","amenity":"cafe"},"name":"Лакомка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Летнее кафе":{"tags":{"name":"Летнее кафе","amenity":"cafe"},"name":"Летнее кафе","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пельменная":{"tags":{"name":"Пельменная","amenity":"cafe"},"name":"Пельменная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Пиццерия":{"tags":{"name":"Пиццерия","amenity":"cafe"},"name":"Пиццерия","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Рандеву":{"tags":{"name":"Рандеву","amenity":"cafe"},"name":"Рандеву","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Сказка":{"tags":{"name":"Сказка","amenity":"cafe"},"name":"Сказка","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Старбакс":{"tags":{"name":"Старбакс","amenity":"cafe"},"name":"Старбакс","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Столовая":{"tags":{"name":"Столовая","amenity":"cafe"},"name":"Столовая","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Уют":{"tags":{"name":"Уют","amenity":"cafe"},"name":"Уют","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Хуторок":{"tags":{"name":"Хуторок","amenity":"cafe"},"name":"Хуторок","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шашлычная":{"tags":{"name":"Шашлычная","amenity":"cafe"},"name":"Шашлычная","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколад":{"tags":{"name":"Шоколад","amenity":"cafe"},"name":"Шоколад","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/Шоколадница":{"tags":{"name":"Шоколадница","amenity":"cafe"},"name":"Шоколадница","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ארומה":{"tags":{"name":"ארומה","amenity":"cafe"},"name":"ארומה","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/مقهى":{"tags":{"name":"مقهى","amenity":"cafe"},"name":"مقهى","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/คาเฟ่ อเมซอน":{"tags":{"name":"คาเฟ่ อเมซอน","amenity":"cafe"},"name":"คาเฟ่ อเมซอน","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/エクセルシオール カフェ":{"tags":{"name":"エクセルシオール カフェ","amenity":"cafe"},"name":"エクセルシオール カフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ド・クリエ":{"tags":{"name":"カフェ・ド・クリエ","name:en":"Cafe de CRIE","amenity":"cafe"},"name":"カフェ・ド・クリエ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/カフェ・ベローチェ":{"tags":{"name":"カフェ・ベローチェ","amenity":"cafe"},"name":"カフェ・ベローチェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/コメダ珈琲店":{"tags":{"name":"コメダ珈琲店","amenity":"cafe"},"name":"コメダ珈琲店","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/サンマルクカフェ":{"tags":{"name":"サンマルクカフェ","amenity":"cafe"},"name":"サンマルクカフェ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/スターバックス":{"tags":{"name":"スターバックス","name:en":"Starbucks","amenity":"cafe"},"name":"スターバックス","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/タリーズコーヒー":{"tags":{"name":"タリーズコーヒー","amenity":"cafe"},"name":"タリーズコーヒー","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/ドトールコーヒーショップ":{"tags":{"name":"ドトールコーヒーショップ","amenity":"cafe"},"name":"ドトールコーヒーショップ","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/星巴克":{"tags":{"name":"星巴克","amenity":"cafe"},"name":"星巴克","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/cafe/스타벅스":{"tags":{"name":"스타벅스","amenity":"cafe"},"name":"스타벅스","icon":"cafe","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],"suggestion":true},"amenity/car_rental/Alamo":{"tags":{"name":"Alamo","amenity":"car_rental"},"name":"Alamo","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Avis":{"tags":{"name":"Avis","amenity":"car_rental"},"name":"Avis","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Budget":{"tags":{"name":"Budget","amenity":"car_rental"},"name":"Budget","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise":{"tags":{"name":"Enterprise","amenity":"car_rental"},"name":"Enterprise","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Enterprise Rent-a-Car":{"tags":{"name":"Enterprise Rent-a-Car","amenity":"car_rental"},"name":"Enterprise Rent-a-Car","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Europcar":{"tags":{"name":"Europcar","amenity":"car_rental"},"name":"Europcar","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Hertz":{"tags":{"name":"Hertz","amenity":"car_rental"},"name":"Hertz","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Localiza":{"tags":{"name":"Localiza","amenity":"car_rental"},"name":"Localiza","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Sixt":{"tags":{"name":"Sixt","amenity":"car_rental"},"name":"Sixt","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/Thrifty":{"tags":{"name":"Thrifty","amenity":"car_rental"},"name":"Thrifty","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/U-Haul":{"tags":{"name":"U-Haul","amenity":"car_rental"},"name":"U-Haul","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/オリックスレンタカー":{"tags":{"name":"オリックスレンタカー","amenity":"car_rental"},"name":"オリックスレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタカー":{"tags":{"name":"トヨタレンタカー","amenity":"car_rental"},"name":"トヨタレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/トヨタレンタリース":{"tags":{"name":"トヨタレンタリース","amenity":"car_rental"},"name":"トヨタレンタリース","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_rental/ニッポンレンタカー":{"tags":{"name":"ニッポンレンタカー","amenity":"car_rental"},"name":"ニッポンレンタカー","icon":"car","geometry":["point","area"],"fields":["name","operator"],"suggestion":true},"amenity/car_wash/Autolavaggio":{"tags":{"name":"Autolavaggio","amenity":"car_wash"},"name":"Autolavaggio","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/H-E-B Car Wash":{"tags":{"name":"H-E-B Car Wash","amenity":"car_wash"},"name":"H-E-B Car Wash","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Lavage Auto":{"tags":{"name":"Lavage Auto","amenity":"car_wash"},"name":"Lavage Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Lavazh":{"tags":{"name":"Lavazh","amenity":"car_wash"},"name":"Lavazh","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia":{"tags":{"name":"Myjnia","amenity":"car_wash"},"name":"Myjnia","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia bezdotykowa":{"tags":{"name":"Myjnia bezdotykowa","amenity":"car_wash"},"name":"Myjnia bezdotykowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Myjnia samochodowa":{"tags":{"name":"Myjnia samochodowa","amenity":"car_wash"},"name":"Myjnia samochodowa","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Spălătorie Auto":{"tags":{"name":"Spălătorie Auto","amenity":"car_wash"},"name":"Spălătorie Auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Spălătorie auto":{"tags":{"name":"Spălătorie auto","amenity":"car_wash"},"name":"Spălătorie auto","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/car_wash/Автомийка":{"tags":{"name":"Автомийка","amenity":"car_wash"},"name":"Автомийка","icon":"car","geometry":["point","area"],"fields":["address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinema City":{"tags":{"name":"Cinema City","amenity":"cinema"},"name":"Cinema City","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemark":{"tags":{"name":"Cinemark","amenity":"cinema"},"name":"Cinemark","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinemex":{"tags":{"name":"Cinemex","amenity":"cinema"},"name":"Cinemex","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cinepolis":{"tags":{"name":"Cinepolis","amenity":"cinema"},"name":"Cinepolis","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Cineworld":{"tags":{"name":"Cineworld","amenity":"cinema"},"name":"Cineworld","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/cinema/Odeon":{"tags":{"name":"Odeon","amenity":"cinema"},"name":"Odeon","icon":"cinema","geometry":["point","area"],"fields":["name","address","building_area","opening_hours"],"suggestion":true},"amenity/clinic/ФАП":{"tags":{"name":"ФАП","healthcare":"clinic","amenity":"clinic"},"name":"ФАП","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Aspen Dental":{"tags":{"name":"Aspen Dental","healthcare":"dentist","amenity":"dentist"},"name":"Aspen Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Consultorio Dental":{"tags":{"name":"Consultorio Dental","healthcare":"dentist","amenity":"dentist"},"name":"Consultorio Dental","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Dentista":{"tags":{"name":"Dentista","healthcare":"dentist","amenity":"dentist"},"name":"Dentista","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Family Dentistry":{"tags":{"name":"Family Dentistry","healthcare":"dentist","amenity":"dentist"},"name":"Family Dentistry","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Vitaldent":{"tags":{"name":"Vitaldent","healthcare":"dentist","amenity":"dentist"},"name":"Vitaldent","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматолог":{"tags":{"name":"Стоматолог","healthcare":"dentist","amenity":"dentist"},"name":"Стоматолог","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/dentist/Стоматологія":{"tags":{"name":"Стоматологія","healthcare":"dentist","amenity":"dentist"},"name":"Стоматологія","icon":"dentist","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Háziorvosi rendelő":{"tags":{"name":"Háziorvosi rendelő","healthcare":"doctor","amenity":"doctors"},"name":"Háziorvosi rendelő","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/doctors/Инвитро":{"tags":{"name":"Инвитро","healthcare":"doctor","amenity":"doctors"},"name":"Инвитро","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","building_area","opening_hours"],"suggestion":true},"amenity/driving_school/Автодром":{"tags":{"name":"Автодром","amenity":"driving_school"},"name":"Автодром","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/fast_food/A&W":{"tags":{"name":"A&W","amenity":"fast_food"},"name":"A&W","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Ali Baba":{"tags":{"name":"Ali Baba","amenity":"fast_food"},"name":"Ali Baba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Angel's Burger":{"tags":{"name":"Angel's Burger","amenity":"fast_food"},"name":"Angel's Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Antalya":{"tags":{"name":"Antalya","amenity":"fast_food"},"name":"Antalya","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Arby's":{"tags":{"name":"Arby's","amenity":"fast_food"},"name":"Arby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Bistro":{"tags":{"name":"Asia Bistro","amenity":"fast_food"},"name":"Asia Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Asia Wok":{"tags":{"name":"Asia Wok","amenity":"fast_food"},"name":"Asia Wok","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Baskin-Robbins":{"tags":{"name":"Baskin-Robbins","amenity":"fast_food"},"name":"Baskin-Robbins","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bistro":{"tags":{"name":"Bistro","amenity":"fast_food"},"name":"Bistro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bob's":{"tags":{"name":"Bob's","amenity":"fast_food"},"name":"Bob's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Bojangles":{"tags":{"name":"Bojangles","amenity":"fast_food"},"name":"Bojangles","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Booster Juice":{"tags":{"name":"Booster Juice","amenity":"fast_food"},"name":"Booster Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Boston Market":{"tags":{"name":"Boston Market","amenity":"fast_food"},"name":"Boston Market","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Braum's":{"tags":{"name":"Braum's","amenity":"fast_food"},"name":"Braum's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger King":{"tags":{"name":"Burger King","cuisine":"burger","amenity":"fast_food"},"name":"Burger King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Burger Machine":{"tags":{"name":"Burger Machine","amenity":"fast_food"},"name":"Burger Machine","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Büfé":{"tags":{"name":"Büfé","amenity":"fast_food"},"name":"Büfé","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Captain D's":{"tags":{"name":"Captain D's","amenity":"fast_food"},"name":"Captain D's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Carl's Jr.":{"tags":{"name":"Carl's Jr.","cuisine":"burger","amenity":"fast_food"},"name":"Carl's Jr.","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chick-fil-A":{"tags":{"name":"Chick-fil-A","cuisine":"chicken","amenity":"fast_food"},"name":"Chick-fil-A","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chicken Express":{"tags":{"name":"Chicken Express","amenity":"fast_food"},"name":"Chicken Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chipotle":{"tags":{"name":"Chipotle","cuisine":"mexican","amenity":"fast_food"},"name":"Chipotle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Chowking":{"tags":{"name":"Chowking","amenity":"fast_food"},"name":"Chowking","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Church's Chicken":{"tags":{"name":"Church's Chicken","amenity":"fast_food"},"name":"Church's Chicken","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/CoCo壱番屋":{"tags":{"name":"CoCo壱番屋","amenity":"fast_food"},"name":"CoCo壱番屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cold Stone Creamery":{"tags":{"name":"Cold Stone Creamery","amenity":"fast_food"},"name":"Cold Stone Creamery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Cook Out":{"tags":{"name":"Cook Out","amenity":"fast_food"},"name":"Cook Out","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Culver's":{"tags":{"name":"Culver's","amenity":"fast_food"},"name":"Culver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/DQ":{"tags":{"name":"DQ","amenity":"fast_food"},"name":"DQ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Dairy Queen":{"tags":{"name":"Dairy Queen","amenity":"fast_food"},"name":"Dairy Queen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Del Taco":{"tags":{"name":"Del Taco","amenity":"fast_food"},"name":"Del Taco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Domino's Pizza":{"tags":{"name":"Domino's Pizza","cuisine":"pizza","amenity":"fast_food"},"name":"Domino's Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/El Pollo Loco":{"tags":{"name":"El Pollo Loco","amenity":"fast_food"},"name":"El Pollo Loco","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Everest":{"tags":{"name":"Everest","amenity":"fast_food"},"name":"Everest","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Extreme Pita":{"tags":{"name":"Extreme Pita","amenity":"fast_food"},"name":"Extreme Pita","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fazoli's":{"tags":{"name":"Fazoli's","amenity":"fast_food"},"name":"Fazoli's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Firehouse Subs":{"tags":{"name":"Firehouse Subs","amenity":"fast_food"},"name":"Firehouse Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish & Chips":{"tags":{"name":"Fish & Chips","amenity":"fast_food"},"name":"Fish & Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Fish and Chips":{"tags":{"name":"Fish and Chips","amenity":"fast_food"},"name":"Fish and Chips","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Five Guys":{"tags":{"name":"Five Guys","amenity":"fast_food"},"name":"Five Guys","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Food Court":{"tags":{"name":"Food Court","amenity":"fast_food"},"name":"Food Court","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Greenwich":{"tags":{"name":"Greenwich","amenity":"fast_food"},"name":"Greenwich","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Habib's":{"tags":{"name":"Habib's","amenity":"fast_food"},"name":"Habib's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hallo Pizza":{"tags":{"name":"Hallo Pizza","amenity":"fast_food"},"name":"Hallo Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hardee's":{"tags":{"name":"Hardee's","cuisine":"burger","amenity":"fast_food"},"name":"Hardee's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Harvey's":{"tags":{"name":"Harvey's","amenity":"fast_food"},"name":"Harvey's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hesburger":{"tags":{"name":"Hesburger","amenity":"fast_food"},"name":"Hesburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Hungry Jacks":{"tags":{"name":"Hungry Jacks","cuisine":"burger","amenity":"fast_food"},"name":"Hungry Jacks","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/In-N-Out Burger":{"tags":{"name":"In-N-Out Burger","amenity":"fast_food"},"name":"In-N-Out Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul":{"tags":{"name":"Istanbul","amenity":"fast_food"},"name":"Istanbul","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Istanbul Kebab":{"tags":{"name":"Istanbul Kebab","amenity":"fast_food"},"name":"Istanbul Kebab","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jack in the Box":{"tags":{"name":"Jack in the Box","cuisine":"burger","amenity":"fast_food"},"name":"Jack in the Box","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jamba Juice":{"tags":{"name":"Jamba Juice","amenity":"fast_food"},"name":"Jamba Juice","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jersey Mike's Subs":{"tags":{"name":"Jersey Mike's Subs","amenity":"fast_food"},"name":"Jersey Mike's Subs","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jimmy John's":{"tags":{"name":"Jimmy John's","cuisine":"sandwich","amenity":"fast_food"},"name":"Jimmy John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Jollibee":{"tags":{"name":"Jollibee","amenity":"fast_food"},"name":"Jollibee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC":{"tags":{"name":"KFC","cuisine":"chicken","amenity":"fast_food"},"name":"KFC","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/KFC/Taco Bell":{"tags":{"name":"KFC/Taco Bell","amenity":"fast_food"},"name":"KFC/Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebab House":{"tags":{"name":"Kebab House","amenity":"fast_food"},"name":"Kebab House","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kebabai":{"tags":{"name":"Kebabai","amenity":"fast_food"},"name":"Kebabai","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kochlöffel":{"tags":{"name":"Kochlöffel","amenity":"fast_food"},"name":"Kochlöffel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Kotipizza":{"tags":{"name":"Kotipizza","amenity":"fast_food"},"name":"Kotipizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Krystal":{"tags":{"name":"Krystal","amenity":"fast_food"},"name":"Krystal","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars":{"tags":{"name":"Little Caesars","amenity":"fast_food"},"name":"Little Caesars","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Little Caesars Pizza":{"tags":{"name":"Little Caesars Pizza","amenity":"fast_food"},"name":"Little Caesars Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Long John Silver's":{"tags":{"name":"Long John Silver's","amenity":"fast_food"},"name":"Long John Silver's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Lotteria":{"tags":{"name":"Lotteria","amenity":"fast_food"},"name":"Lotteria","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Max":{"tags":{"name":"Max","amenity":"fast_food"},"name":"Max","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/McDonald's":{"tags":{"name":"McDonald's","cuisine":"burger","amenity":"fast_food"},"name":"McDonald's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Minute Burger":{"tags":{"name":"Minute Burger","amenity":"fast_food"},"name":"Minute Burger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Mr. Sub":{"tags":{"name":"Mr. Sub","amenity":"fast_food"},"name":"Mr. Sub","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/New York Pizza":{"tags":{"name":"New York Pizza","amenity":"fast_food"},"name":"New York Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Nordsee":{"tags":{"name":"Nordsee","amenity":"fast_food"},"name":"Nordsee","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Panda Express":{"tags":{"name":"Panda Express","cuisine":"chinese","amenity":"fast_food"},"name":"Panda Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa John's":{"tags":{"name":"Papa John's","cuisine":"pizza","amenity":"fast_food"},"name":"Papa John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Papa Murphy's":{"tags":{"name":"Papa Murphy's","amenity":"fast_food"},"name":"Papa Murphy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pinulito":{"tags":{"name":"Pinulito","amenity":"fast_food"},"name":"Pinulito","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pita Pit":{"tags":{"name":"Pita Pit","amenity":"fast_food"},"name":"Pita Pit","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Hut Delivery":{"tags":{"name":"Pizza Hut Delivery","amenity":"fast_food"},"name":"Pizza Hut Delivery","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza King":{"tags":{"name":"Pizza King","amenity":"fast_food"},"name":"Pizza King","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Nova":{"tags":{"name":"Pizza Nova","amenity":"fast_food"},"name":"Pizza Nova","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pizza Pizza":{"tags":{"name":"Pizza Pizza","amenity":"fast_food"},"name":"Pizza Pizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Campero":{"tags":{"name":"Pollo Campero","amenity":"fast_food"},"name":"Pollo Campero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Pollo Granjero":{"tags":{"name":"Pollo Granjero","amenity":"fast_food"},"name":"Pollo Granjero","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeye's":{"tags":{"name":"Popeye's","cuisine":"chicken","amenity":"fast_food"},"name":"Popeye's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Popeyes Louisiana Kitchen":{"tags":{"name":"Popeyes Louisiana Kitchen","amenity":"fast_food"},"name":"Popeyes Louisiana Kitchen","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Qdoba":{"tags":{"name":"Qdoba","amenity":"fast_food"},"name":"Qdoba","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quick":{"tags":{"name":"Quick","amenity":"fast_food"},"name":"Quick","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Quiznos":{"tags":{"name":"Quiznos","amenity":"fast_food"},"name":"Quiznos","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Rally's":{"tags":{"name":"Rally's","amenity":"fast_food"},"name":"Rally's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Red Rooster":{"tags":{"name":"Red Rooster","amenity":"fast_food"},"name":"Red Rooster","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sbarro":{"tags":{"name":"Sbarro","amenity":"fast_food"},"name":"Sbarro","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Schlotzsky's Deli":{"tags":{"name":"Schlotzsky's Deli","amenity":"fast_food"},"name":"Schlotzsky's Deli","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sibylla":{"tags":{"name":"Sibylla","amenity":"fast_food"},"name":"Sibylla","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Sonic":{"tags":{"name":"Sonic","cuisine":"burger","amenity":"fast_food"},"name":"Sonic","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Steers":{"tags":{"name":"Steers","amenity":"fast_food"},"name":"Steers","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Subway":{"tags":{"name":"Subway","amenity":"fast_food"},"name":"Subway","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bell":{"tags":{"name":"Taco Bell","cuisine":"mexican","amenity":"fast_food"},"name":"Taco Bell","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Bueno":{"tags":{"name":"Taco Bueno","amenity":"fast_food"},"name":"Taco Bueno","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Cabana":{"tags":{"name":"Taco Cabana","amenity":"fast_food"},"name":"Taco Cabana","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Del Mar":{"tags":{"name":"Taco Del Mar","amenity":"fast_food"},"name":"Taco Del Mar","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco John's":{"tags":{"name":"Taco John's","amenity":"fast_food"},"name":"Taco John's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Taco Time":{"tags":{"name":"Taco Time","amenity":"fast_food"},"name":"Taco Time","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Telepizza":{"tags":{"name":"Telepizza","amenity":"fast_food"},"name":"Telepizza","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Thai Express":{"tags":{"name":"Thai Express","amenity":"fast_food"},"name":"Thai Express","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/The Pizza Company":{"tags":{"name":"The Pizza Company","amenity":"fast_food"},"name":"The Pizza Company","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wendy's":{"tags":{"name":"Wendy's","cuisine":"burger","amenity":"fast_food"},"name":"Wendy's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Whataburger":{"tags":{"name":"Whataburger","amenity":"fast_food"},"name":"Whataburger","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/White Castle":{"tags":{"name":"White Castle","amenity":"fast_food"},"name":"White Castle","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wienerschnitzel":{"tags":{"name":"Wienerschnitzel","amenity":"fast_food"},"name":"Wienerschnitzel","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Wimpy":{"tags":{"name":"Wimpy","amenity":"fast_food"},"name":"Wimpy","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Zaxby's":{"tags":{"name":"Zaxby's","amenity":"fast_food"},"name":"Zaxby's","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Γρηγόρης":{"tags":{"name":"Γρηγόρης","amenity":"fast_food"},"name":"Γρηγόρης","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Бургер Кинг":{"tags":{"name":"Бургер Кинг","amenity":"fast_food"},"name":"Бургер Кинг","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Крошка Картошка":{"tags":{"name":"Крошка Картошка","amenity":"fast_food"},"name":"Крошка Картошка","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Макдоналдс":{"tags":{"name":"Макдоналдс","name:en":"McDonald's","amenity":"fast_food"},"name":"Макдоналдс","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Робин Сдобин":{"tags":{"name":"Робин Сдобин","amenity":"fast_food"},"name":"Робин Сдобин","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Русский Аппетит":{"tags":{"name":"Русский Аппетит","amenity":"fast_food"},"name":"Русский Аппетит","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Сабвэй":{"tags":{"name":"Сабвэй","amenity":"fast_food"},"name":"Сабвэй","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Стардог!s":{"tags":{"name":"Стардог!s","amenity":"fast_food"},"name":"Стардог!s","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Теремок":{"tags":{"name":"Теремок","amenity":"fast_food"},"name":"Теремок","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаверма":{"tags":{"name":"Шаверма","amenity":"fast_food"},"name":"Шаверма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/Шаурма":{"tags":{"name":"Шаурма","amenity":"fast_food"},"name":"Шаурма","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かっぱ寿司":{"tags":{"name":"かっぱ寿司","amenity":"fast_food"},"name":"かっぱ寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/かつや":{"tags":{"name":"かつや","amenity":"fast_food"},"name":"かつや","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/くら寿司":{"tags":{"name":"くら寿司","amenity":"fast_food"},"name":"くら寿司","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/すき家":{"tags":{"name":"すき家","name:en":"SUKIYA","amenity":"fast_food"},"name":"すき家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/なか卯":{"tags":{"name":"なか卯","amenity":"fast_food"},"name":"なか卯","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっかほっか亭":{"tags":{"name":"ほっかほっか亭","amenity":"fast_food"},"name":"ほっかほっか亭","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ほっともっと":{"tags":{"name":"ほっともっと","amenity":"fast_food"},"name":"ほっともっと","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/オリジン弁当":{"tags":{"name":"オリジン弁当","amenity":"fast_food"},"name":"オリジン弁当","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ケンタッキーフライドチキン":{"tags":{"name":"ケンタッキーフライドチキン","cuisine":"chicken","name:en":"KFC","amenity":"fast_food"},"name":"ケンタッキーフライドチキン","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/サブウェイ":{"tags":{"name":"サブウェイ","amenity":"fast_food"},"name":"サブウェイ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/スシロー":{"tags":{"name":"スシロー","amenity":"fast_food"},"name":"スシロー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/マクドナルド":{"tags":{"name":"マクドナルド","cuisine":"burger","name:en":"McDonald's","amenity":"fast_food"},"name":"マクドナルド","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ミスタードーナツ":{"tags":{"name":"ミスタードーナツ","amenity":"fast_food"},"name":"ミスタードーナツ","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/モスバーガー":{"tags":{"name":"モスバーガー","name:en":"MOS BURGER","amenity":"fast_food"},"name":"モスバーガー","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/ロッテリア":{"tags":{"name":"ロッテリア","amenity":"fast_food"},"name":"ロッテリア","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/吉野家":{"tags":{"name":"吉野家","amenity":"fast_food"},"name":"吉野家","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/幸楽苑":{"tags":{"name":"幸楽苑","amenity":"fast_food"},"name":"幸楽苑","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/摩斯漢堡":{"tags":{"name":"摩斯漢堡","amenity":"fast_food"},"name":"摩斯漢堡","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/松屋":{"tags":{"name":"松屋","name:en":"Matsuya","amenity":"fast_food"},"name":"松屋","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/肯德基":{"tags":{"name":"肯德基","amenity":"fast_food"},"name":"肯德基","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麥當勞":{"tags":{"name":"麥當勞","amenity":"fast_food"},"name":"麥當勞","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/麦当劳":{"tags":{"name":"麦当劳","amenity":"fast_food"},"name":"麦当劳","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fast_food/롯데리아":{"tags":{"name":"롯데리아","amenity":"fast_food"},"name":"롯데리아","icon":"fast-food","geometry":["point","area"],"fields":["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],"suggestion":true},"amenity/fuel/76":{"tags":{"name":"76","amenity":"fuel"},"name":"76","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/1-2-3":{"tags":{"name":"1-2-3","amenity":"fuel"},"name":"1-2-3","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ADNOC":{"tags":{"name":"ADNOC","amenity":"fuel"},"name":"ADNOC","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ANP":{"tags":{"name":"ANP","amenity":"fuel"},"name":"ANP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ARAL":{"tags":{"name":"ARAL","amenity":"fuel"},"name":"ARAL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aegean":{"tags":{"name":"Aegean","amenity":"fuel"},"name":"Aegean","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Afriquia":{"tags":{"name":"Afriquia","amenity":"fuel"},"name":"Afriquia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agip":{"tags":{"name":"Agip","amenity":"fuel"},"name":"Agip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Agrola":{"tags":{"name":"Agrola","amenity":"fuel"},"name":"Agrola","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alon":{"tags":{"name":"Alon","amenity":"fuel"},"name":"Alon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Alpet":{"tags":{"name":"Alpet","amenity":"fuel"},"name":"Alpet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Api":{"tags":{"name":"Api","amenity":"fuel"},"name":"Api","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Aral":{"tags":{"name":"Aral","amenity":"fuel"},"name":"Aral","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Arco":{"tags":{"name":"Arco","amenity":"fuel"},"name":"Arco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avanti":{"tags":{"name":"Avanti","amenity":"fuel"},"name":"Avanti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Avia":{"tags":{"name":"Avia","amenity":"fuel"},"name":"Avia","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BEBECO":{"tags":{"name":"BEBECO","amenity":"fuel"},"name":"BEBECO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BFT":{"tags":{"name":"BFT","amenity":"fuel"},"name":"BFT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BHPetrol":{"tags":{"name":"BHPetrol","amenity":"fuel"},"name":"BHPetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BP":{"tags":{"name":"BP","amenity":"fuel"},"name":"BP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/BR":{"tags":{"name":"BR","amenity":"fuel"},"name":"BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bangchak":{"tags":{"name":"Bangchak","amenity":"fuel"},"name":"Bangchak","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Benzina":{"tags":{"name":"Benzina","amenity":"fuel"},"name":"Benzina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bharat Petroleum":{"tags":{"name":"Bharat Petroleum","amenity":"fuel"},"name":"Bharat Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Bliska":{"tags":{"name":"Bliska","amenity":"fuel"},"name":"Bliska","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CAMPSA":{"tags":{"name":"CAMPSA","amenity":"fuel"},"name":"CAMPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CARREFOUR":{"tags":{"name":"CARREFOUR","amenity":"fuel"},"name":"CARREFOUR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CEPSA":{"tags":{"name":"CEPSA","amenity":"fuel"},"name":"CEPSA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/CNG":{"tags":{"name":"CNG","amenity":"fuel"},"name":"CNG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Caltex":{"tags":{"name":"Caltex","amenity":"fuel"},"name":"Caltex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Campsa":{"tags":{"name":"Campsa","amenity":"fuel"},"name":"Campsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Casey's General Store":{"tags":{"name":"Casey's General Store","amenity":"fuel"},"name":"Casey's General Store","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cenex":{"tags":{"name":"Cenex","amenity":"fuel"},"name":"Cenex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cepsa":{"tags":{"name":"Cepsa","amenity":"fuel"},"name":"Cepsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ceypetco":{"tags":{"name":"Ceypetco","amenity":"fuel"},"name":"Ceypetco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Chevron":{"tags":{"name":"Chevron","amenity":"fuel"},"name":"Chevron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Citgo":{"tags":{"name":"Citgo","amenity":"fuel"},"name":"Citgo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Clark":{"tags":{"name":"Clark","amenity":"fuel"},"name":"Clark","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Coles Express":{"tags":{"name":"Coles Express","amenity":"fuel"},"name":"Coles Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Conoco":{"tags":{"name":"Conoco","amenity":"fuel"},"name":"Conoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copec":{"tags":{"name":"Copec","amenity":"fuel"},"name":"Copec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Copetrol":{"tags":{"name":"Copetrol","amenity":"fuel"},"name":"Copetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Cosmo":{"tags":{"name":"Cosmo","amenity":"fuel"},"name":"Cosmo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Costco Gas":{"tags":{"name":"Costco Gas","amenity":"fuel"},"name":"Costco Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Costco Gasoline":{"tags":{"name":"Costco Gasoline","amenity":"fuel"},"name":"Costco Gasoline","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Crodux":{"tags":{"name":"Crodux","amenity":"fuel"},"name":"Crodux","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Delta":{"tags":{"name":"Delta","amenity":"fuel"},"name":"Delta","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Diamond Shamrock":{"tags":{"name":"Diamond Shamrock","amenity":"fuel"},"name":"Diamond Shamrock","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Drummed Fuel":{"tags":{"name":"Drummed Fuel","amenity":"fuel"},"name":"Drummed Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EKO":{"tags":{"name":"EKO","amenity":"fuel"},"name":"EKO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENEOS":{"tags":{"name":"ENEOS","amenity":"fuel"},"name":"ENEOS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ENI":{"tags":{"name":"ENI","amenity":"fuel"},"name":"ENI","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ERG":{"tags":{"name":"ERG","amenity":"fuel"},"name":"ERG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Elan":{"tags":{"name":"Elan","amenity":"fuel"},"name":"Elan","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eneos":{"tags":{"name":"Eneos","amenity":"fuel"},"name":"Eneos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Engen":{"tags":{"name":"Engen","amenity":"fuel"},"name":"Engen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Eni":{"tags":{"name":"Eni","amenity":"fuel"},"name":"Eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Erg":{"tags":{"name":"Erg","amenity":"fuel"},"name":"Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso":{"tags":{"name":"Esso","amenity":"fuel"},"name":"Esso","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Esso Express":{"tags":{"name":"Esso Express","amenity":"fuel"},"name":"Esso Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/EuroOil":{"tags":{"name":"EuroOil","amenity":"fuel"},"name":"EuroOil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Exxon":{"tags":{"name":"Exxon","amenity":"fuel"},"name":"Exxon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/F24":{"tags":{"name":"F24","amenity":"fuel"},"name":"F24","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Firezone":{"tags":{"name":"Firezone","amenity":"fuel"},"name":"Firezone","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Flying V":{"tags":{"name":"Flying V","amenity":"fuel"},"name":"Flying V","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GALP":{"tags":{"name":"GALP","amenity":"fuel"},"name":"GALP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GNV":{"tags":{"name":"GNV","amenity":"fuel"},"name":"GNV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gas":{"tags":{"name":"Gas","amenity":"fuel"},"name":"Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gazprom":{"tags":{"name":"Gazprom","amenity":"fuel"},"name":"Gazprom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/GetGo":{"tags":{"name":"GetGo","amenity":"fuel"},"name":"GetGo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Goil":{"tags":{"name":"Goil","amenity":"fuel"},"name":"Goil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Gulf":{"tags":{"name":"Gulf","amenity":"fuel"},"name":"Gulf","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/H-E-B Fuel":{"tags":{"name":"H-E-B Fuel","amenity":"fuel"},"name":"H-E-B Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/H-E-B Gas":{"tags":{"name":"H-E-B Gas","amenity":"fuel"},"name":"H-E-B Gas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HEM":{"tags":{"name":"HEM","amenity":"fuel"},"name":"HEM","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP":{"tags":{"name":"HP","amenity":"fuel"},"name":"HP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/HP Petrol Pump":{"tags":{"name":"HP Petrol Pump","amenity":"fuel"},"name":"HP Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Helios":{"tags":{"name":"Helios","amenity":"fuel"},"name":"Helios","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hess":{"tags":{"name":"Hess","amenity":"fuel"},"name":"Hess","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Hindustan Petroleum":{"tags":{"name":"Hindustan Petroleum","amenity":"fuel"},"name":"Hindustan Petroleum","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Holiday":{"tags":{"name":"Holiday","amenity":"fuel"},"name":"Holiday","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Husky":{"tags":{"name":"Husky","amenity":"fuel"},"name":"Husky","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IES":{"tags":{"name":"IES","amenity":"fuel"},"name":"IES","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/IP":{"tags":{"name":"IP","amenity":"fuel"},"name":"IP","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Independent Fuel Station":{"tags":{"name":"Independent Fuel Station","amenity":"fuel"},"name":"Independent Fuel Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indian Oil":{"tags":{"name":"Indian Oil","amenity":"fuel"},"name":"Indian Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Indipend.":{"tags":{"name":"Indipend.","amenity":"fuel"},"name":"Indipend.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ingo":{"tags":{"name":"Ingo","amenity":"fuel"},"name":"Ingo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ipiranga":{"tags":{"name":"Ipiranga","amenity":"fuel"},"name":"Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Irving":{"tags":{"name":"Irving","amenity":"fuel"},"name":"Irving","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JA-SS":{"tags":{"name":"JA-SS","amenity":"fuel"},"name":"JA-SS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/JOMO":{"tags":{"name":"JOMO","amenity":"fuel"},"name":"JOMO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jet":{"tags":{"name":"Jet","amenity":"fuel"},"name":"Jet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Jetti":{"tags":{"name":"Jetti","amenity":"fuel"},"name":"Jetti","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kangaroo":{"tags":{"name":"Kangaroo","amenity":"fuel"},"name":"Kangaroo","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kobil":{"tags":{"name":"Kobil","amenity":"fuel"},"name":"Kobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kroger Fuel":{"tags":{"name":"Kroger Fuel","amenity":"fuel"},"name":"Kroger Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kum & Go":{"tags":{"name":"Kum & Go","amenity":"fuel"},"name":"Kum & Go","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Kwik Trip":{"tags":{"name":"Kwik Trip","amenity":"fuel"},"name":"Kwik Trip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG":{"tags":{"name":"LPG","amenity":"fuel"},"name":"LPG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LPG Station":{"tags":{"name":"LPG Station","amenity":"fuel"},"name":"LPG Station","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/LUKOIL":{"tags":{"name":"LUKOIL","amenity":"fuel"},"name":"LUKOIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Liberty":{"tags":{"name":"Liberty","amenity":"fuel"},"name":"Liberty","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos":{"tags":{"name":"Lotos","amenity":"fuel"},"name":"Lotos","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lotos Optima":{"tags":{"name":"Lotos Optima","amenity":"fuel"},"name":"Lotos Optima","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Love's":{"tags":{"name":"Love's","amenity":"fuel"},"name":"Love's","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Lukoil":{"tags":{"name":"Lukoil","amenity":"fuel"},"name":"Lukoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MEROIL":{"tags":{"name":"MEROIL","amenity":"fuel"},"name":"MEROIL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MOL":{"tags":{"name":"MOL","amenity":"fuel"},"name":"MOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/MRS":{"tags":{"name":"MRS","amenity":"fuel"},"name":"MRS","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Marathon":{"tags":{"name":"Marathon","amenity":"fuel"},"name":"Marathon","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maverik":{"tags":{"name":"Maverik","amenity":"fuel"},"name":"Maverik","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Maxol":{"tags":{"name":"Maxol","amenity":"fuel"},"name":"Maxol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Metano":{"tags":{"name":"Metano","amenity":"fuel"},"name":"Metano","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Migrol":{"tags":{"name":"Migrol","amenity":"fuel"},"name":"Migrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Minipump":{"tags":{"name":"Minipump","amenity":"fuel"},"name":"Minipump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobil":{"tags":{"name":"Mobil","amenity":"fuel"},"name":"Mobil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mobile":{"tags":{"name":"Mobile","amenity":"fuel"},"name":"Mobile","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Mol":{"tags":{"name":"Mol","amenity":"fuel"},"name":"Mol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Moya":{"tags":{"name":"Moya","amenity":"fuel"},"name":"Moya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Murphy USA":{"tags":{"name":"Murphy USA","amenity":"fuel"},"name":"Murphy USA","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Neste":{"tags":{"name":"Neste","amenity":"fuel"},"name":"Neste","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OIL!":{"tags":{"name":"OIL!","amenity":"fuel"},"name":"OIL!","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OK":{"tags":{"name":"OK","amenity":"fuel"},"name":"OK","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OKQ8":{"tags":{"name":"OKQ8","amenity":"fuel"},"name":"OKQ8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/OMV":{"tags":{"name":"OMV","amenity":"fuel"},"name":"OMV","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Oilibya":{"tags":{"name":"Oilibya","amenity":"fuel"},"name":"Oilibya","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Opet":{"tags":{"name":"Opet","amenity":"fuel"},"name":"Opet","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Orlen":{"tags":{"name":"Orlen","amenity":"fuel"},"name":"Orlen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PETRONOR":{"tags":{"name":"PETRONOR","amenity":"fuel"},"name":"PETRONOR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO":{"tags":{"name":"PSO","amenity":"fuel"},"name":"PSO","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PSO Petrol Pump":{"tags":{"name":"PSO Petrol Pump","amenity":"fuel"},"name":"PSO Petrol Pump","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PT":{"tags":{"name":"PT","amenity":"fuel"},"name":"PT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PTT":{"tags":{"name":"PTT","amenity":"fuel"},"name":"PTT","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/PV Oil":{"tags":{"name":"PV Oil","amenity":"fuel"},"name":"PV Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pacific Pride":{"tags":{"name":"Pacific Pride","amenity":"fuel"},"name":"Pacific Pride","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pecsa":{"tags":{"name":"Pecsa","amenity":"fuel"},"name":"Pecsa","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pemex":{"tags":{"name":"Pemex","amenity":"fuel"},"name":"Pemex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pertamina":{"tags":{"name":"Pertamina","amenity":"fuel"},"name":"Pertamina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro":{"tags":{"name":"Petro","amenity":"fuel"},"name":"Petro","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petro-Canada":{"tags":{"name":"Petro-Canada","amenity":"fuel"},"name":"Petro-Canada","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrobras":{"tags":{"name":"Petrobras","amenity":"fuel"},"name":"Petrobras","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrochina":{"tags":{"name":"Petrochina","amenity":"fuel"},"name":"Petrochina","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroecuador":{"tags":{"name":"Petroecuador","amenity":"fuel"},"name":"Petroecuador","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrol Ofisi":{"tags":{"name":"Petrol Ofisi","amenity":"fuel"},"name":"Petrol Ofisi","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrolimex":{"tags":{"name":"Petrolimex","amenity":"fuel"},"name":"Petrolimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petrom":{"tags":{"name":"Petrom","amenity":"fuel"},"name":"Petrom","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petron":{"tags":{"name":"Petron","amenity":"fuel"},"name":"Petron","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petronas":{"tags":{"name":"Petronas","amenity":"fuel"},"name":"Petronas","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Petroperu":{"tags":{"name":"Petroperu","amenity":"fuel"},"name":"Petroperu","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phillips 66":{"tags":{"name":"Phillips 66","amenity":"fuel"},"name":"Phillips 66","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Phoenix":{"tags":{"name":"Phoenix","amenity":"fuel"},"name":"Phoenix","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pilot":{"tags":{"name":"Pilot","amenity":"fuel"},"name":"Pilot","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Pioneer":{"tags":{"name":"Pioneer","amenity":"fuel"},"name":"Pioneer","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto":{"tags":{"name":"Posto","amenity":"fuel"},"name":"Posto","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Atem":{"tags":{"name":"Posto Atem","amenity":"fuel"},"name":"Posto Atem","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto BR":{"tags":{"name":"Posto BR","amenity":"fuel"},"name":"Posto BR","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Ipiranga":{"tags":{"name":"Posto Ipiranga","amenity":"fuel"},"name":"Posto Ipiranga","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Posto Shell":{"tags":{"name":"Posto Shell","amenity":"fuel"},"name":"Posto Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Primax":{"tags":{"name":"Primax","amenity":"fuel"},"name":"Primax","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Prio":{"tags":{"name":"Prio","amenity":"fuel"},"name":"Prio","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Puma":{"tags":{"name":"Puma","amenity":"fuel"},"name":"Puma","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q1":{"tags":{"name":"Q1","amenity":"fuel"},"name":"Q1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8":{"tags":{"name":"Q8","amenity":"fuel"},"name":"Q8","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Q8 Easy":{"tags":{"name":"Q8 Easy","amenity":"fuel"},"name":"Q8 Easy","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/QuikTrip":{"tags":{"name":"QuikTrip","amenity":"fuel"},"name":"QuikTrip","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/REPSOL":{"tags":{"name":"REPSOL","amenity":"fuel"},"name":"REPSOL","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/RaceTrac":{"tags":{"name":"RaceTrac","amenity":"fuel"},"name":"RaceTrac","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Repsol":{"tags":{"name":"Repsol","amenity":"fuel"},"name":"Repsol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rompetrol":{"tags":{"name":"Rompetrol","amenity":"fuel"},"name":"Rompetrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Rubis":{"tags":{"name":"Rubis","amenity":"fuel"},"name":"Rubis","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SB Tank":{"tags":{"name":"SB Tank","amenity":"fuel"},"name":"SB Tank","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/SPBU":{"tags":{"name":"SPBU","amenity":"fuel"},"name":"SPBU","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sasol":{"tags":{"name":"Sasol","amenity":"fuel"},"name":"Sasol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sea Oil":{"tags":{"name":"Sea Oil","amenity":"fuel"},"name":"Sea Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sheetz":{"tags":{"name":"Sheetz","amenity":"fuel"},"name":"Sheetz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell":{"tags":{"name":"Shell","amenity":"fuel"},"name":"Shell","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Shell Express":{"tags":{"name":"Shell Express","amenity":"fuel"},"name":"Shell Express","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinclair":{"tags":{"name":"Sinclair","amenity":"fuel"},"name":"Sinclair","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec":{"tags":{"name":"Sinopec","amenity":"fuel"},"name":"Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sinopec Fuel":{"tags":{"name":"Sinopec Fuel","amenity":"fuel"},"name":"Sinopec Fuel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Slovnaft":{"tags":{"name":"Slovnaft","amenity":"fuel"},"name":"Slovnaft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Socar":{"tags":{"name":"Socar","amenity":"fuel"},"name":"Socar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sokimex":{"tags":{"name":"Sokimex","amenity":"fuel"},"name":"Sokimex","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Speedway":{"tags":{"name":"Speedway","amenity":"fuel"},"name":"Speedway","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/St1":{"tags":{"name":"St1","amenity":"fuel"},"name":"St1","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star":{"tags":{"name":"Star","amenity":"fuel"},"name":"Star","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Star Oil":{"tags":{"name":"Star Oil","amenity":"fuel"},"name":"Star Oil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Station Service E. Leclerc":{"tags":{"name":"Station Service E. Leclerc","amenity":"fuel"},"name":"Station Service E. Leclerc","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Statoil":{"tags":{"name":"Statoil","amenity":"fuel"},"name":"Statoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Sunoco":{"tags":{"name":"Sunoco","amenity":"fuel"},"name":"Sunoco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tamoil":{"tags":{"name":"Tamoil","amenity":"fuel"},"name":"Tamoil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tango":{"tags":{"name":"Tango","amenity":"fuel"},"name":"Tango","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Teboil":{"tags":{"name":"Teboil","amenity":"fuel"},"name":"Teboil","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tela":{"tags":{"name":"Tela","amenity":"fuel"},"name":"Tela","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Terpel":{"tags":{"name":"Terpel","amenity":"fuel"},"name":"Terpel","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Texaco":{"tags":{"name":"Texaco","amenity":"fuel"},"name":"Texaco","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Tinq":{"tags":{"name":"Tinq","amenity":"fuel"},"name":"Tinq","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Topaz":{"tags":{"name":"Topaz","amenity":"fuel"},"name":"Topaz","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total":{"tags":{"name":"Total","amenity":"fuel"},"name":"Total","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total Access":{"tags":{"name":"Total Access","amenity":"fuel"},"name":"Total Access","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Total Erg":{"tags":{"name":"Total Erg","amenity":"fuel"},"name":"Total Erg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/TotalErg":{"tags":{"name":"TotalErg","amenity":"fuel"},"name":"TotalErg","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Turkey Hill":{"tags":{"name":"Turkey Hill","amenity":"fuel"},"name":"Turkey Hill","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Turmöl":{"tags":{"name":"Turmöl","amenity":"fuel"},"name":"Turmöl","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Ultramar":{"tags":{"name":"Ultramar","amenity":"fuel"},"name":"Ultramar","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/United":{"tags":{"name":"United","amenity":"fuel"},"name":"United","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno":{"tags":{"name":"Uno","amenity":"fuel"},"name":"Uno","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Uno-X":{"tags":{"name":"Uno-X","amenity":"fuel"},"name":"Uno-X","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Valero":{"tags":{"name":"Valero","amenity":"fuel"},"name":"Valero","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Vito":{"tags":{"name":"Vito","amenity":"fuel"},"name":"Vito","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/WOG":{"tags":{"name":"WOG","amenity":"fuel"},"name":"WOG","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Westfalen":{"tags":{"name":"Westfalen","amenity":"fuel"},"name":"Westfalen","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Woolworths Petrol":{"tags":{"name":"Woolworths Petrol","amenity":"fuel"},"name":"Woolworths Petrol","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Z":{"tags":{"name":"Z","amenity":"fuel"},"name":"Z","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/bft":{"tags":{"name":"bft","amenity":"fuel"},"name":"bft","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/eni":{"tags":{"name":"eni","amenity":"fuel"},"name":"eni","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ΕΚΟ":{"tags":{"name":"ΕΚΟ","amenity":"fuel"},"name":"ΕΚΟ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АГЗС":{"tags":{"name":"АГЗС","amenity":"fuel"},"name":"АГЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/АЗС":{"tags":{"name":"АЗС","amenity":"fuel"},"name":"АЗС","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Авіас":{"tags":{"name":"Авіас","amenity":"fuel"},"name":"Авіас","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/БРСМ-Нафта":{"tags":{"name":"БРСМ-Нафта","amenity":"fuel"},"name":"БРСМ-Нафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Башнефть":{"tags":{"name":"Башнефть","amenity":"fuel"},"name":"Башнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Белоруснефть":{"tags":{"name":"Белоруснефть","amenity":"fuel"},"name":"Белоруснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газовая заправка":{"tags":{"name":"Газовая заправка","amenity":"fuel"},"name":"Газовая заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Газпромнефть":{"tags":{"name":"Газпромнефть","amenity":"fuel"},"name":"Газпромнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Гелиос":{"tags":{"name":"Гелиос","amenity":"fuel"},"name":"Гелиос","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ЕКА":{"tags":{"name":"ЕКА","amenity":"fuel"},"name":"ЕКА","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Заправка":{"tags":{"name":"Заправка","amenity":"fuel"},"name":"Заправка","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/КазМунайГаз":{"tags":{"name":"КазМунайГаз","amenity":"fuel"},"name":"КазМунайГаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Лукойл":{"tags":{"name":"Лукойл","amenity":"fuel"},"name":"Лукойл","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Макпетрол":{"tags":{"name":"Макпетрол","amenity":"fuel"},"name":"Макпетрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/НК Альянс":{"tags":{"name":"НК Альянс","amenity":"fuel"},"name":"НК Альянс","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Нефтьмагистраль":{"tags":{"name":"Нефтьмагистраль","amenity":"fuel"},"name":"Нефтьмагистраль","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОККО":{"tags":{"name":"ОККО","amenity":"fuel"},"name":"ОККО","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ОМВ":{"tags":{"name":"ОМВ","amenity":"fuel"},"name":"ОМВ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Октан":{"tags":{"name":"Октан","amenity":"fuel"},"name":"Октан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ПТК":{"tags":{"name":"ПТК","amenity":"fuel"},"name":"ПТК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Петрол":{"tags":{"name":"Петрол","amenity":"fuel"},"name":"Петрол","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Пропан":{"tags":{"name":"Пропан","amenity":"fuel"},"name":"Пропан","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Роснефть":{"tags":{"name":"Роснефть","amenity":"fuel"},"name":"Роснефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сибнефть":{"tags":{"name":"Сибнефть","amenity":"fuel"},"name":"Сибнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Сургутнефтегаз":{"tags":{"name":"Сургутнефтегаз","amenity":"fuel"},"name":"Сургутнефтегаз","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ТНК":{"tags":{"name":"ТНК","amenity":"fuel"},"name":"ТНК","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефтепродукт":{"tags":{"name":"Татнефтепродукт","amenity":"fuel"},"name":"Татнефтепродукт","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Татнефть":{"tags":{"name":"Татнефть","amenity":"fuel"},"name":"Татнефть","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/Укрнафта":{"tags":{"name":"Укрнафта","amenity":"fuel"},"name":"Укрнафта","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דור אלון":{"tags":{"name":"דור אלון","amenity":"fuel"},"name":"דור אלון","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/דלק":{"tags":{"name":"דלק","amenity":"fuel"},"name":"דלק","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/סונול":{"tags":{"name":"סונול","amenity":"fuel"},"name":"סונול","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/פז":{"tags":{"name":"פז","amenity":"fuel"},"name":"פז","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطة وقود":{"tags":{"name":"محطة وقود","amenity":"fuel"},"name":"محطة وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/محطه وقود":{"tags":{"name":"محطه وقود","amenity":"fuel"},"name":"محطه وقود","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ بنزین":{"tags":{"name":"پمپ بنزین","amenity":"fuel"},"name":"پمپ بنزین","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/پمپ گاز":{"tags":{"name":"پمپ گاز","amenity":"fuel"},"name":"پمپ گاز","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/บางจาก":{"tags":{"name":"บางจาก","amenity":"fuel"},"name":"บางจาก","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ป.ต.ท.":{"tags":{"name":"ป.ต.ท.","amenity":"fuel"},"name":"ป.ต.ท.","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เชลล์":{"tags":{"name":"เชลล์","amenity":"fuel"},"name":"เชลล์","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/เอสโซ่":{"tags":{"name":"เอสโซ่","amenity":"fuel"},"name":"เอสโซ่","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エッソ":{"tags":{"name":"エッソ","amenity":"fuel"},"name":"エッソ","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/エネオス":{"tags":{"name":"エネオス","amenity":"fuel"},"name":"エネオス","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/コスモ石油":{"tags":{"name":"コスモ石油","amenity":"fuel"},"name":"コスモ石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/ゼネラル":{"tags":{"name":"ゼネラル","amenity":"fuel"},"name":"ゼネラル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化":{"tags":{"name":"中国石化","amenity":"fuel"},"name":"中国石化","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石化 Sinopec":{"tags":{"name":"中国石化 Sinopec","amenity":"fuel"},"name":"中国石化 Sinopec","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中国石油":{"tags":{"name":"中国石油","amenity":"fuel"},"name":"中国石油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/中油":{"tags":{"name":"中油","amenity":"fuel"},"name":"中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/出光":{"tags":{"name":"出光","name:en":"IDEMITSU","amenity":"fuel"},"name":"出光","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/加油站":{"tags":{"name":"加油站","amenity":"fuel"},"name":"加油站","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/台灣中油":{"tags":{"name":"台灣中油","amenity":"fuel"},"name":"台灣中油","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/fuel/昭和シェル":{"tags":{"name":"昭和シェル","amenity":"fuel"},"name":"昭和シェル","icon":"fuel","geometry":["point","area"],"fields":["name","operator","address","opening_hours","fuel_multi"],"suggestion":true},"amenity/hospital/Cruz Roja":{"tags":{"name":"Cruz Roja","healthcare":"hospital","amenity":"hospital"},"name":"Cruz Roja","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/IMSS":{"tags":{"name":"IMSS","healthcare":"hospital","amenity":"hospital"},"name":"IMSS","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Инфекционное отделение":{"tags":{"name":"Инфекционное отделение","healthcare":"hospital","amenity":"hospital"},"name":"Инфекционное отделение","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Кожно-венерологический диспансер":{"tags":{"name":"Кожно-венерологический диспансер","healthcare":"hospital","amenity":"hospital"},"name":"Кожно-венерологический диспансер","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Районная больница":{"tags":{"name":"Районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Роддом":{"tags":{"name":"Роддом","healthcare":"hospital","amenity":"hospital"},"name":"Роддом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Родильный дом":{"tags":{"name":"Родильный дом","healthcare":"hospital","amenity":"hospital"},"name":"Родильный дом","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Скорая помощь":{"tags":{"name":"Скорая помощь","healthcare":"hospital","amenity":"hospital"},"name":"Скорая помощь","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/ЦРБ":{"tags":{"name":"ЦРБ","healthcare":"hospital","amenity":"hospital"},"name":"ЦРБ","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/Центральная районная больница":{"tags":{"name":"Центральная районная больница","healthcare":"hospital","amenity":"hospital"},"name":"Центральная районная больница","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{"tags":{"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","healthcare":"hospital","amenity":"hospital"},"name":"โรงพยาบาลส่งเสริมสุขภาพตำบล","icon":"hospital","geometry":["point","area"],"fields":["name","operator","healthcare/speciality","address","emergency"],"suggestion":true},"amenity/ice_cream/Grido":{"tags":{"name":"Grido","amenity":"ice_cream"},"name":"Grido","icon":"ice-cream","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],"suggestion":true},"amenity/kindergarten/Anganwadi":{"tags":{"name":"Anganwadi","amenity":"kindergarten"},"name":"Anganwadi","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Arche Noah":{"tags":{"name":"Arche Noah","amenity":"kindergarten"},"name":"Arche Noah","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/CONAFE Preescolar":{"tags":{"name":"CONAFE Preescolar","amenity":"kindergarten"},"name":"CONAFE Preescolar","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{"tags":{"name":"Educacion Inicial de CONAFE No Escolarizado","amenity":"kindergarten"},"name":"Educacion Inicial de CONAFE No Escolarizado","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Estefania Casta�eda":{"tags":{"name":"Estefania Casta�eda","amenity":"kindergarten"},"name":"Estefania Casta�eda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Evangelischer Kindergarten":{"tags":{"name":"Evangelischer Kindergarten","amenity":"kindergarten"},"name":"Evangelischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Federico Froebel":{"tags":{"name":"Federico Froebel","amenity":"kindergarten"},"name":"Federico Froebel","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Gabriela Mistral":{"tags":{"name":"Gabriela Mistral","amenity":"kindergarten"},"name":"Gabriela Mistral","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jardin Infantil":{"tags":{"name":"Jardin Infantil","amenity":"kindergarten"},"name":"Jardin Infantil","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Jean Piaget":{"tags":{"name":"Jean Piaget","amenity":"kindergarten"},"name":"Jean Piaget","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Katholischer Kindergarten":{"tags":{"name":"Katholischer Kindergarten","amenity":"kindergarten"},"name":"Katholischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten Regenbogen":{"tags":{"name":"Kindergarten Regenbogen","amenity":"kindergarten"},"name":"Kindergarten Regenbogen","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Josef":{"tags":{"name":"Kindergarten St. Josef","amenity":"kindergarten"},"name":"Kindergarten St. Josef","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Kindergarten St. Martin":{"tags":{"name":"Kindergarten St. Martin","amenity":"kindergarten"},"name":"Kindergarten St. Martin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Maria Montessori":{"tags":{"name":"Maria Montessori","amenity":"kindergarten"},"name":"Maria Montessori","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/PAUD":{"tags":{"name":"PAUD","amenity":"kindergarten"},"name":"PAUD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Pusteblume":{"tags":{"name":"Pusteblume","amenity":"kindergarten"},"name":"Pusteblume","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Rosaura Zapata":{"tags":{"name":"Rosaura Zapata","amenity":"kindergarten"},"name":"Rosaura Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{"tags":{"name":"Sor Juana Ines De La Cruz","amenity":"kindergarten"},"name":"Sor Juana Ines De La Cruz","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Spatzennest":{"tags":{"name":"Spatzennest","amenity":"kindergarten"},"name":"Spatzennest","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Städtischer Kindergarten":{"tags":{"name":"Städtischer Kindergarten","amenity":"kindergarten"},"name":"Städtischer Kindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Villa Kunterbunt":{"tags":{"name":"Villa Kunterbunt","amenity":"kindergarten"},"name":"Villa Kunterbunt","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldkindergarten":{"tags":{"name":"Waldkindergarten","amenity":"kindergarten"},"name":"Waldkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Waldorfkindergarten":{"tags":{"name":"Waldorfkindergarten","amenity":"kindergarten"},"name":"Waldorfkindergarten","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Óvoda":{"tags":{"name":"Óvoda","amenity":"kindergarten"},"name":"Óvoda","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детсад":{"tags":{"name":"Детсад","amenity":"kindergarten"},"name":"Детсад","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад Солнышко":{"tags":{"name":"Детский сад Солнышко","amenity":"kindergarten"},"name":"Детский сад Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад № 1":{"tags":{"name":"Детский сад № 1","amenity":"kindergarten"},"name":"Детский сад № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №1":{"tags":{"name":"Детский сад №1","amenity":"kindergarten"},"name":"Детский сад №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №10":{"tags":{"name":"Детский сад №10","amenity":"kindergarten"},"name":"Детский сад №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №11":{"tags":{"name":"Детский сад №11","amenity":"kindergarten"},"name":"Детский сад №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №12":{"tags":{"name":"Детский сад №12","amenity":"kindergarten"},"name":"Детский сад №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №13":{"tags":{"name":"Детский сад №13","amenity":"kindergarten"},"name":"Детский сад №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №14":{"tags":{"name":"Детский сад №14","amenity":"kindergarten"},"name":"Детский сад №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №15":{"tags":{"name":"Детский сад №15","amenity":"kindergarten"},"name":"Детский сад №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №16":{"tags":{"name":"Детский сад №16","amenity":"kindergarten"},"name":"Детский сад №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №17":{"tags":{"name":"Детский сад №17","amenity":"kindergarten"},"name":"Детский сад №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №18":{"tags":{"name":"Детский сад №18","amenity":"kindergarten"},"name":"Детский сад №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №19":{"tags":{"name":"Детский сад №19","amenity":"kindergarten"},"name":"Детский сад №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №2":{"tags":{"name":"Детский сад №2","amenity":"kindergarten"},"name":"Детский сад №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №22":{"tags":{"name":"Детский сад №22","amenity":"kindergarten"},"name":"Детский сад №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №24":{"tags":{"name":"Детский сад №24","amenity":"kindergarten"},"name":"Детский сад №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №25":{"tags":{"name":"Детский сад №25","amenity":"kindergarten"},"name":"Детский сад №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №27":{"tags":{"name":"Детский сад №27","amenity":"kindergarten"},"name":"Детский сад №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №29":{"tags":{"name":"Детский сад №29","amenity":"kindergarten"},"name":"Детский сад №29","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №3":{"tags":{"name":"Детский сад №3","amenity":"kindergarten"},"name":"Детский сад №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №33":{"tags":{"name":"Детский сад №33","amenity":"kindergarten"},"name":"Детский сад №33","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №4":{"tags":{"name":"Детский сад №4","amenity":"kindergarten"},"name":"Детский сад №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №5":{"tags":{"name":"Детский сад №5","amenity":"kindergarten"},"name":"Детский сад №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №6":{"tags":{"name":"Детский сад №6","amenity":"kindergarten"},"name":"Детский сад №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №7":{"tags":{"name":"Детский сад №7","amenity":"kindergarten"},"name":"Детский сад №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №8":{"tags":{"name":"Детский сад №8","amenity":"kindergarten"},"name":"Детский сад №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Детский сад №9":{"tags":{"name":"Детский сад №9","amenity":"kindergarten"},"name":"Детский сад №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Дитячий садок":{"tags":{"name":"Дитячий садок","amenity":"kindergarten"},"name":"Дитячий садок","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/Солнышко":{"tags":{"name":"Солнышко","amenity":"kindergarten"},"name":"Солнышко","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/საბავშვო ბაღი":{"tags":{"name":"საბავშვო ბაღი","amenity":"kindergarten"},"name":"საბავშვო ბაღი","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/kindergarten/中央保育所":{"tags":{"name":"中央保育所","amenity":"kindergarten"},"name":"中央保育所","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/library/Biblioteca Comunale":{"tags":{"name":"Biblioteca Comunale","amenity":"library"},"name":"Biblioteca Comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Municipal":{"tags":{"name":"Biblioteca Municipal","amenity":"library"},"name":"Biblioteca Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública":{"tags":{"name":"Biblioteca Pública","amenity":"library"},"name":"Biblioteca Pública","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca Pública Municipal":{"tags":{"name":"Biblioteca Pública Municipal","amenity":"library"},"name":"Biblioteca Pública Municipal","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteca comunale":{"tags":{"name":"Biblioteca comunale","amenity":"library"},"name":"Biblioteca comunale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Biblioteka Publiczna":{"tags":{"name":"Biblioteka Publiczna","amenity":"library"},"name":"Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bibliothèque Municipale":{"tags":{"name":"Bibliothèque Municipale","amenity":"library"},"name":"Bibliothèque Municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bibliothèque municipale":{"tags":{"name":"Bibliothèque municipale","amenity":"library"},"name":"Bibliothèque municipale","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Bücherei":{"tags":{"name":"Bücherei","amenity":"library"},"name":"Bücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Central Library":{"tags":{"name":"Central Library","amenity":"library"},"name":"Central Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Gemeindebücherei":{"tags":{"name":"Gemeindebücherei","amenity":"library"},"name":"Gemeindebücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Gminna Biblioteka Publiczna":{"tags":{"name":"Gminna Biblioteka Publiczna","amenity":"library"},"name":"Gminna Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Miejska Biblioteka Publiczna":{"tags":{"name":"Miejska Biblioteka Publiczna","amenity":"library"},"name":"Miejska Biblioteka Publiczna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Médiathèque":{"tags":{"name":"Médiathèque","amenity":"library"},"name":"Médiathèque","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Městská knihovna":{"tags":{"name":"Městská knihovna","amenity":"library"},"name":"Městská knihovna","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Public Library":{"tags":{"name":"Public Library","amenity":"library"},"name":"Public Library","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Stadtbibliothek":{"tags":{"name":"Stadtbibliothek","amenity":"library"},"name":"Stadtbibliothek","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Stadtbücherei":{"tags":{"name":"Stadtbücherei","amenity":"library"},"name":"Stadtbücherei","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Городская библиотека":{"tags":{"name":"Городская библиотека","amenity":"library"},"name":"Городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Детская библиотека":{"tags":{"name":"Детская библиотека","amenity":"library"},"name":"Детская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Центральная библиотека":{"tags":{"name":"Центральная библиотека","amenity":"library"},"name":"Центральная библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/Центральная городская библиотека":{"tags":{"name":"Центральная городская библиотека","amenity":"library"},"name":"Центральная городская библиотека","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/library/图书馆":{"tags":{"name":"图书馆","amenity":"library"},"name":"图书馆","icon":"library","geometry":["point","area"],"fields":["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"amenity/pharmacy/36.6":{"tags":{"name":"36.6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"36.6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Adler-Apotheke":{"tags":{"name":"Adler-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Adler-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Alte Apotheke":{"tags":{"name":"Alte Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Alte Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apollo Pharmacy":{"tags":{"name":"Apollo Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apollo Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotek":{"tags":{"name":"Apotek","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotek Hjärtat":{"tags":{"name":"Apotek Hjärtat","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotek Hjärtat","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Apotheke am Markt":{"tags":{"name":"Apotheke am Markt","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Apotheke am Markt","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bahnhof Apotheke":{"tags":{"name":"Bahnhof Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bahnhof-Apotheke":{"tags":{"name":"Bahnhof-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bahnhof-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bartell Drugs":{"tags":{"name":"Bartell Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bartell Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Benavides":{"tags":{"name":"Benavides","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benavides","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Benu":{"tags":{"name":"Benu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Benu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Boots":{"tags":{"name":"Boots","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Boots","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Botica":{"tags":{"name":"Botica","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Botica","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Brunnen-Apotheke":{"tags":{"name":"Brunnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Brunnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Burg-Apotheke":{"tags":{"name":"Burg-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Burg-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Bären-Apotheke":{"tags":{"name":"Bären-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Bären-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/CVS":{"tags":{"name":"CVS","healthcare":"pharmacy","amenity":"pharmacy"},"name":"CVS","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Camelia":{"tags":{"name":"Camelia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Camelia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Catena":{"tags":{"name":"Catena","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Catena","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Chemist Warehouse":{"tags":{"name":"Chemist Warehouse","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Chemist Warehouse","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Clicks":{"tags":{"name":"Clicks","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Clicks","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Cruz Azul":{"tags":{"name":"Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Cruz Verde":{"tags":{"name":"Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Dbam o Zdrowie":{"tags":{"name":"Dbam o Zdrowie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dbam o Zdrowie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Dr. Max":{"tags":{"name":"Dr. Max","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Dr. Max","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Droga Raia":{"tags":{"name":"Droga Raia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Droga Raia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Drogaria São Paulo":{"tags":{"name":"Drogaria São Paulo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogaria São Paulo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Drogasil":{"tags":{"name":"Drogasil","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Drogasil","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Duane Reade":{"tags":{"name":"Duane Reade","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Duane Reade","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Eczane":{"tags":{"name":"Eczane","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eczane","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Engel-Apotheke":{"tags":{"name":"Engel-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Engel-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Eurovaistinė":{"tags":{"name":"Eurovaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Eurovaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Familiprix":{"tags":{"name":"Familiprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Familiprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacenter":{"tags":{"name":"Farmacenter","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacenter","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Centrale":{"tags":{"name":"Farmacia Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Comunale":{"tags":{"name":"Farmacia Comunale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Comunale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia Guadalajara":{"tags":{"name":"Farmacia Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacia del Ahorro":{"tags":{"name":"Farmacia del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacia del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Ahumada":{"tags":{"name":"Farmacias Ahumada","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Ahumada","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Azul":{"tags":{"name":"Farmacias Cruz Azul","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Azul","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Cruz Verde":{"tags":{"name":"Farmacias Cruz Verde","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Cruz Verde","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Económicas":{"tags":{"name":"Farmacias Económicas","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Económicas","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Guadalajara":{"tags":{"name":"Farmacias Guadalajara","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Guadalajara","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias SalcoBrand":{"tags":{"name":"Farmacias SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Sana Sana":{"tags":{"name":"Farmacias Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias Similares":{"tags":{"name":"Farmacias Similares","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias Similares","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacias del Ahorro":{"tags":{"name":"Farmacias del Ahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacias del Ahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmacity":{"tags":{"name":"Farmacity","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmacity","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmahorro":{"tags":{"name":"Farmahorro","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmahorro","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmatodo":{"tags":{"name":"Farmatodo","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmatodo","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Farmácia":{"tags":{"name":"Farmácia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Farmácia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Felicia":{"tags":{"name":"Felicia","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Felicia","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Fybeca":{"tags":{"name":"Fybeca","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Fybeca","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Generika Drugstore":{"tags":{"name":"Generika Drugstore","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Generika Drugstore","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Gintarinė vaistinė":{"tags":{"name":"Gintarinė vaistinė","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gintarinė vaistinė","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Guardian":{"tags":{"name":"Guardian","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Guardian","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Gyógyszertár":{"tags":{"name":"Gyógyszertár","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Gyógyszertár","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/H-E-B Pharmacy":{"tags":{"name":"H-E-B Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"H-E-B Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Hirsch-Apotheke":{"tags":{"name":"Hirsch-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hirsch-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Hubertus Apotheke":{"tags":{"name":"Hubertus Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Hubertus Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Inkafarma":{"tags":{"name":"Inkafarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Inkafarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Jean Coutu":{"tags":{"name":"Jean Coutu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Jean Coutu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Kinney Drugs":{"tags":{"name":"Kinney Drugs","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kinney Drugs","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Kur-Apotheke":{"tags":{"name":"Kur-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Kur-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Linden-Apotheke":{"tags":{"name":"Linden-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Linden-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ljekarna":{"tags":{"name":"Ljekarna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ljekarna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Lloyds Pharmacy":{"tags":{"name":"Lloyds Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lloyds Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Lékárna":{"tags":{"name":"Lékárna","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Lékárna","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Löwen-Apotheke":{"tags":{"name":"Löwen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Löwen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Marien-Apotheke":{"tags":{"name":"Marien-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Marien-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Markt-Apotheke":{"tags":{"name":"Markt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Markt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mercury Drug":{"tags":{"name":"Mercury Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mercury Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mifarma":{"tags":{"name":"Mifarma","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mifarma","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Mēness aptieka":{"tags":{"name":"Mēness aptieka","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Mēness aptieka","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Neue Apotheke":{"tags":{"name":"Neue Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Neue Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pague Menos":{"tags":{"name":"Pague Menos","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pague Menos","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Panvel":{"tags":{"name":"Panvel","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Panvel","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Park-Apotheke":{"tags":{"name":"Park-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Park-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie Centrale":{"tags":{"name":"Pharmacie Centrale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Centrale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie Principale":{"tags":{"name":"Pharmacie Principale","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie Principale","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{"tags":{"name":"Pharmacie de l'Hôtel de Ville","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de l'Hôtel de Ville","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Gare":{"tags":{"name":"Pharmacie de la Gare","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Gare","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Mairie":{"tags":{"name":"Pharmacie de la Mairie","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Mairie","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie de la Poste":{"tags":{"name":"Pharmacie de la Poste","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie de la Poste","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Centre":{"tags":{"name":"Pharmacie du Centre","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Centre","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Marché":{"tags":{"name":"Pharmacie du Marché","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Marché","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmacie du Parc":{"tags":{"name":"Pharmacie du Parc","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmacie du Parc","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmaprix":{"tags":{"name":"Pharmaprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmaprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Pharmasave":{"tags":{"name":"Pharmasave","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Pharmasave","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Punkt Apteczny":{"tags":{"name":"Punkt Apteczny","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Punkt Apteczny","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rathaus-Apotheke":{"tags":{"name":"Rathaus-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rathaus-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rats-Apotheke":{"tags":{"name":"Rats-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rats-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rexall":{"tags":{"name":"Rexall","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rexall","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rite Aid":{"tags":{"name":"Rite Aid","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rite Aid","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rose Pharmacy":{"tags":{"name":"Rose Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rose Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rosen-Apotheke":{"tags":{"name":"Rosen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rosen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Rowlands Pharmacy":{"tags":{"name":"Rowlands Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Rowlands Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/SalcoBrand":{"tags":{"name":"SalcoBrand","healthcare":"pharmacy","amenity":"pharmacy"},"name":"SalcoBrand","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sana Sana":{"tags":{"name":"Sana Sana","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sana Sana","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Schloss-Apotheke":{"tags":{"name":"Schloss-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Schloss-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sensiblu":{"tags":{"name":"Sensiblu","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sensiblu","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Shoppers Drug Mart":{"tags":{"name":"Shoppers Drug Mart","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Shoppers Drug Mart","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Sonnen-Apotheke":{"tags":{"name":"Sonnen-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Sonnen-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/South Star Drug":{"tags":{"name":"South Star Drug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"South Star Drug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Stadt-Apotheke":{"tags":{"name":"Stadt-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stadt-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Stern-Apotheke":{"tags":{"name":"Stern-Apotheke","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Stern-Apotheke","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Superdrug":{"tags":{"name":"Superdrug","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Superdrug","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/São João":{"tags":{"name":"São João","healthcare":"pharmacy","amenity":"pharmacy"},"name":"São João","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/The Generics Pharmacy":{"tags":{"name":"The Generics Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"The Generics Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Uniprix":{"tags":{"name":"Uniprix","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Uniprix","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walgreens":{"tags":{"name":"Walgreens","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walgreens Pharmacy":{"tags":{"name":"Walgreens Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walgreens Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Walmart Pharmacy":{"tags":{"name":"Walmart Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Walmart Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Well Pharmacy":{"tags":{"name":"Well Pharmacy","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Well Pharmacy","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/centro naturista":{"tags":{"name":"centro naturista","healthcare":"pharmacy","amenity":"pharmacy"},"name":"centro naturista","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/А5":{"tags":{"name":"А5","healthcare":"pharmacy","amenity":"pharmacy"},"name":"А5","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Айболит":{"tags":{"name":"Айболит","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Айболит","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека 36,6":{"tags":{"name":"Аптека 36,6","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека 36,6","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низких цен":{"tags":{"name":"Аптека низких цен","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низких цен","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека низьких цін":{"tags":{"name":"Аптека низьких цін","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека низьких цін","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека от склада":{"tags":{"name":"Аптека от склада","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека от склада","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптека №1":{"tags":{"name":"Аптека №1","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптека №1","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Аптечный пункт":{"tags":{"name":"Аптечный пункт","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Аптечный пункт","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Арніка":{"tags":{"name":"Арніка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Арніка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Бережная аптека":{"tags":{"name":"Бережная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Бережная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Будь здоров":{"tags":{"name":"Будь здоров","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Будь здоров","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Вита":{"tags":{"name":"Вита","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Вита","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Горздрав":{"tags":{"name":"Горздрав","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Горздрав","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Живика":{"tags":{"name":"Живика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Живика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Здоровье":{"tags":{"name":"Здоровье","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Здоровье","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Имплозия":{"tags":{"name":"Имплозия","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Имплозия","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Классика":{"tags":{"name":"Классика","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Классика","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ладушка":{"tags":{"name":"Ладушка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ладушка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мед-сервіс":{"tags":{"name":"Мед-сервіс","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мед-сервіс","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Мелодия здоровья":{"tags":{"name":"Мелодия здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Мелодия здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Невис":{"tags":{"name":"Невис","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Невис","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Норма":{"tags":{"name":"Норма","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Норма","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Озерки":{"tags":{"name":"Озерки","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Озерки","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Панацея":{"tags":{"name":"Панацея","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Панацея","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Первая помощь":{"tags":{"name":"Первая помощь","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Первая помощь","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Планета здоровья":{"tags":{"name":"Планета здоровья","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Планета здоровья","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Ригла":{"tags":{"name":"Ригла","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Ригла","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Семейная":{"tags":{"name":"Семейная","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Семейная","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Социальная аптека":{"tags":{"name":"Социальная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Социальная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Столички":{"tags":{"name":"Столички","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Столички","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакопейка":{"tags":{"name":"Фармакопейка","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакопейка","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармакор":{"tags":{"name":"Фармакор","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармакор","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармация":{"tags":{"name":"Фармация","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармация","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Фармленд":{"tags":{"name":"Фармленд","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Фармленд","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/Центральная аптека":{"tags":{"name":"Центральная аптека","healthcare":"pharmacy","amenity":"pharmacy"},"name":"Центральная аптека","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/סופר-פארם":{"tags":{"name":"סופר-פארם","healthcare":"pharmacy","amenity":"pharmacy"},"name":"סופר-פארם","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه":{"tags":{"name":"داروخانه","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/داروخانه شبانه روزی":{"tags":{"name":"داروخانه شبانه روزی","healthcare":"pharmacy","amenity":"pharmacy"},"name":"داروخانه شبانه روزی","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/صيدلية":{"tags":{"name":"صيدلية","healthcare":"pharmacy","amenity":"pharmacy"},"name":"صيدلية","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/くすりの福太郎":{"tags":{"name":"くすりの福太郎","healthcare":"pharmacy","amenity":"pharmacy"},"name":"くすりの福太郎","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/さくら薬局":{"tags":{"name":"さくら薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"さくら薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ウエルシア":{"tags":{"name":"ウエルシア","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ウエルシア","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/カワチ薬品":{"tags":{"name":"カワチ薬品","healthcare":"pharmacy","amenity":"pharmacy"},"name":"カワチ薬品","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/クリエイト":{"tags":{"name":"クリエイト","healthcare":"pharmacy","amenity":"pharmacy"},"name":"クリエイト","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/サンドラッグ":{"tags":{"name":"サンドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"サンドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/スギ薬局":{"tags":{"name":"スギ薬局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"スギ薬局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/セイジョー":{"tags":{"name":"セイジョー","healthcare":"pharmacy","amenity":"pharmacy"},"name":"セイジョー","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ツルハドラッグ":{"tags":{"name":"ツルハドラッグ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ツルハドラッグ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{"tags":{"name":"ドラッグてらしま (Drug Terashima)","healthcare":"pharmacy","amenity":"pharmacy"},"name":"ドラッグてらしま (Drug Terashima)","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/マツモトキヨシ":{"tags":{"name":"マツモトキヨシ","healthcare":"pharmacy","amenity":"pharmacy"},"name":"マツモトキヨシ","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pharmacy/丁丁藥局":{"tags":{"name":"丁丁藥局","healthcare":"pharmacy","amenity":"pharmacy"},"name":"丁丁藥局","icon":"pharmacy","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"amenity/pub/Black Bull":{"tags":{"name":"Black Bull","amenity":"pub"},"name":"Black Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Commercial Hotel":{"tags":{"name":"Commercial Hotel","amenity":"pub"},"name":"Commercial Hotel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Cross Keys":{"tags":{"name":"Cross Keys","amenity":"pub"},"name":"Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Irish Pub":{"tags":{"name":"Irish Pub","amenity":"pub"},"name":"Irish Pub","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Kings Arms":{"tags":{"name":"Kings Arms","amenity":"pub"},"name":"Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Kings Head":{"tags":{"name":"Kings Head","amenity":"pub"},"name":"Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/New Inn":{"tags":{"name":"New Inn","amenity":"pub"},"name":"New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Prince of Wales":{"tags":{"name":"Prince of Wales","amenity":"pub"},"name":"Prince of Wales","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Queens Head":{"tags":{"name":"Queens Head","amenity":"pub"},"name":"Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Red Lion":{"tags":{"name":"Red Lion","amenity":"pub"},"name":"Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Rose & Crown":{"tags":{"name":"Rose & Crown","amenity":"pub"},"name":"Rose & Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Rose and Crown":{"tags":{"name":"Rose and Crown","amenity":"pub"},"name":"Rose and Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/Royal Oak":{"tags":{"name":"Royal Oak","amenity":"pub"},"name":"Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Albion":{"tags":{"name":"The Albion","amenity":"pub"},"name":"The Albion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Anchor":{"tags":{"name":"The Anchor","amenity":"pub"},"name":"The Anchor","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Angel":{"tags":{"name":"The Angel","amenity":"pub"},"name":"The Angel","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Beehive":{"tags":{"name":"The Beehive","amenity":"pub"},"name":"The Beehive","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bell":{"tags":{"name":"The Bell","amenity":"pub"},"name":"The Bell","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bell Inn":{"tags":{"name":"The Bell Inn","amenity":"pub"},"name":"The Bell Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Black Horse":{"tags":{"name":"The Black Horse","amenity":"pub"},"name":"The Black Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Bull":{"tags":{"name":"The Bull","amenity":"pub"},"name":"The Bull","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Castle":{"tags":{"name":"The Castle","amenity":"pub"},"name":"The Castle","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Chequers":{"tags":{"name":"The Chequers","amenity":"pub"},"name":"The Chequers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Cricketers":{"tags":{"name":"The Cricketers","amenity":"pub"},"name":"The Cricketers","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Cross Keys":{"tags":{"name":"The Cross Keys","amenity":"pub"},"name":"The Cross Keys","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Crown":{"tags":{"name":"The Crown","amenity":"pub"},"name":"The Crown","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Crown Inn":{"tags":{"name":"The Crown Inn","amenity":"pub"},"name":"The Crown Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Fox":{"tags":{"name":"The Fox","amenity":"pub"},"name":"The Fox","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The George":{"tags":{"name":"The George","amenity":"pub"},"name":"The George","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Green Man":{"tags":{"name":"The Green Man","amenity":"pub"},"name":"The Green Man","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Greyhound":{"tags":{"name":"The Greyhound","amenity":"pub"},"name":"The Greyhound","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Kings Arms":{"tags":{"name":"The Kings Arms","amenity":"pub"},"name":"The Kings Arms","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Kings Head":{"tags":{"name":"The Kings Head","amenity":"pub"},"name":"The Kings Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The New Inn":{"tags":{"name":"The New Inn","amenity":"pub"},"name":"The New Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Plough":{"tags":{"name":"The Plough","amenity":"pub"},"name":"The Plough","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Plough Inn":{"tags":{"name":"The Plough Inn","amenity":"pub"},"name":"The Plough Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Queens Head":{"tags":{"name":"The Queens Head","amenity":"pub"},"name":"The Queens Head","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Railway":{"tags":{"name":"The Railway","amenity":"pub"},"name":"The Railway","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Red Lion":{"tags":{"name":"The Red Lion","amenity":"pub"},"name":"The Red Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Rising Sun":{"tags":{"name":"The Rising Sun","amenity":"pub"},"name":"The Rising Sun","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Royal Oak":{"tags":{"name":"The Royal Oak","amenity":"pub"},"name":"The Royal Oak","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Ship":{"tags":{"name":"The Ship","amenity":"pub"},"name":"The Ship","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Ship Inn":{"tags":{"name":"The Ship Inn","amenity":"pub"},"name":"The Ship Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Star":{"tags":{"name":"The Star","amenity":"pub"},"name":"The Star","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Star Inn":{"tags":{"name":"The Star Inn","amenity":"pub"},"name":"The Star Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Sun Inn":{"tags":{"name":"The Sun Inn","amenity":"pub"},"name":"The Sun Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Swan":{"tags":{"name":"The Swan","amenity":"pub"},"name":"The Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Swan Inn":{"tags":{"name":"The Swan Inn","amenity":"pub"},"name":"The Swan Inn","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Victoria":{"tags":{"name":"The Victoria","amenity":"pub"},"name":"The Victoria","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The Wheatsheaf":{"tags":{"name":"The Wheatsheaf","amenity":"pub"},"name":"The Wheatsheaf","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Hart":{"tags":{"name":"The White Hart","amenity":"pub"},"name":"The White Hart","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Horse":{"tags":{"name":"The White Horse","amenity":"pub"},"name":"The White Horse","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Lion":{"tags":{"name":"The White Lion","amenity":"pub"},"name":"The White Lion","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/The White Swan":{"tags":{"name":"The White Swan","amenity":"pub"},"name":"The White Swan","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/魚民":{"tags":{"name":"魚民","amenity":"pub"},"name":"魚民","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/pub/鳥貴族":{"tags":{"name":"鳥貴族","amenity":"pub"},"name":"鳥貴族","icon":"beer","geometry":["point","area"],"fields":["name","address","building_area","opening_hours","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adler":{"tags":{"name":"Adler","amenity":"restaurant"},"name":"Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adria":{"tags":{"name":"Adria","amenity":"restaurant"},"name":"Adria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Adyar Ananda Bhavan":{"tags":{"name":"Adyar Ananda Bhavan","amenity":"restaurant"},"name":"Adyar Ananda Bhavan","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Akropolis":{"tags":{"name":"Akropolis","amenity":"restaurant"},"name":"Akropolis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Alte Post":{"tags":{"name":"Alte Post","amenity":"restaurant"},"name":"Alte Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Applebee's":{"tags":{"name":"Applebee's","amenity":"restaurant"},"name":"Applebee's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Asia":{"tags":{"name":"Asia","amenity":"restaurant"},"name":"Asia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athen":{"tags":{"name":"Athen","amenity":"restaurant"},"name":"Athen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Athos":{"tags":{"name":"Athos","amenity":"restaurant"},"name":"Athos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Autogrill":{"tags":{"name":"Autogrill","amenity":"restaurant"},"name":"Autogrill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bahnhof":{"tags":{"name":"Bahnhof","amenity":"restaurant"},"name":"Bahnhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Italia":{"tags":{"name":"Bella Italia","amenity":"restaurant"},"name":"Bella Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bella Napoli":{"tags":{"name":"Bella Napoli","amenity":"restaurant"},"name":"Bella Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Belvedere":{"tags":{"name":"Belvedere","amenity":"restaurant"},"name":"Belvedere","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Big Boy":{"tags":{"name":"Big Boy","amenity":"restaurant"},"name":"Big Boy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bob Evans":{"tags":{"name":"Bob Evans","amenity":"restaurant"},"name":"Bob Evans","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bonefish Grill":{"tags":{"name":"Bonefish Grill","amenity":"restaurant"},"name":"Bonefish Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Boston Pizza":{"tags":{"name":"Boston Pizza","amenity":"restaurant"},"name":"Boston Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Grill":{"tags":{"name":"Buffalo Grill","amenity":"restaurant"},"name":"Buffalo Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Buffalo Wild Wings":{"tags":{"name":"Buffalo Wild Wings","amenity":"restaurant"},"name":"Buffalo Wild Wings","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Bären":{"tags":{"name":"Bären","amenity":"restaurant"},"name":"Bären","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/California Pizza Kitchen":{"tags":{"name":"California Pizza Kitchen","amenity":"restaurant"},"name":"California Pizza Kitchen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Canteen":{"tags":{"name":"Canteen","amenity":"restaurant"},"name":"Canteen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Capri":{"tags":{"name":"Capri","amenity":"restaurant"},"name":"Capri","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carluccio's":{"tags":{"name":"Carluccio's","amenity":"restaurant"},"name":"Carluccio's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carpe Diem":{"tags":{"name":"Carpe Diem","amenity":"restaurant"},"name":"Carpe Diem","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Carrabba's Italian Grill":{"tags":{"name":"Carrabba's Italian Grill","amenity":"restaurant"},"name":"Carrabba's Italian Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casa Mia":{"tags":{"name":"Casa Mia","amenity":"restaurant"},"name":"Casa Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Casablanca":{"tags":{"name":"Casablanca","amenity":"restaurant"},"name":"Casablanca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cheesecake Factory":{"tags":{"name":"Cheesecake Factory","amenity":"restaurant"},"name":"Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chifa":{"tags":{"name":"Chifa","amenity":"restaurant"},"name":"Chifa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chili's":{"tags":{"name":"Chili's","amenity":"restaurant"},"name":"Chili's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Buffet":{"tags":{"name":"China Buffet","amenity":"restaurant"},"name":"China Buffet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Garden":{"tags":{"name":"China Garden","amenity":"restaurant"},"name":"China Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China House":{"tags":{"name":"China House","amenity":"restaurant"},"name":"China House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Town":{"tags":{"name":"China Town","amenity":"restaurant"},"name":"China Town","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/China Wok":{"tags":{"name":"China Wok","amenity":"restaurant"},"name":"China Wok","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chiquito":{"tags":{"name":"Chiquito","amenity":"restaurant"},"name":"Chiquito","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Chuck E. Cheese's":{"tags":{"name":"Chuck E. Cheese's","amenity":"restaurant"},"name":"Chuck E. Cheese's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cici's Pizza":{"tags":{"name":"Cici's Pizza","amenity":"restaurant"},"name":"Cici's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comedor":{"tags":{"name":"Comedor","amenity":"restaurant"},"name":"Comedor","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Comida China":{"tags":{"name":"Comida China","amenity":"restaurant"},"name":"Comida China","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Courtepaille":{"tags":{"name":"Courtepaille","amenity":"restaurant"},"name":"Courtepaille","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Cracker Barrel":{"tags":{"name":"Cracker Barrel","amenity":"restaurant"},"name":"Cracker Barrel","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Grasso":{"tags":{"name":"Da Grasso","amenity":"restaurant"},"name":"Da Grasso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Da Vinci":{"tags":{"name":"Da Vinci","amenity":"restaurant"},"name":"Da Vinci","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Delphi":{"tags":{"name":"Delphi","amenity":"restaurant"},"name":"Delphi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Denny's":{"tags":{"name":"Denny's","amenity":"restaurant"},"name":"Denny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Deutsches Haus":{"tags":{"name":"Deutsches Haus","amenity":"restaurant"},"name":"Deutsches Haus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dionysos":{"tags":{"name":"Dionysos","amenity":"restaurant"},"name":"Dionysos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dolce Vita":{"tags":{"name":"Dolce Vita","amenity":"restaurant"},"name":"Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Dorfkrug":{"tags":{"name":"Dorfkrug","amenity":"restaurant"},"name":"Dorfkrug","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/East Side Mario's":{"tags":{"name":"East Side Mario's","amenity":"restaurant"},"name":"East Side Mario's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Greco":{"tags":{"name":"El Greco","amenity":"restaurant"},"name":"El Greco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Paso":{"tags":{"name":"El Paso","amenity":"restaurant"},"name":"El Paso","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/El Rancho":{"tags":{"name":"El Rancho","amenity":"restaurant"},"name":"El Rancho","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Europa":{"tags":{"name":"Europa","amenity":"restaurant"},"name":"Europa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Famous Dave's":{"tags":{"name":"Famous Dave's","amenity":"restaurant"},"name":"Famous Dave's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Flunch":{"tags":{"name":"Flunch","amenity":"restaurant"},"name":"Flunch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Frankie & Benny's":{"tags":{"name":"Frankie & Benny's","amenity":"restaurant"},"name":"Frankie & Benny's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Friendly's":{"tags":{"name":"Friendly's","amenity":"restaurant"},"name":"Friendly's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus Krone":{"tags":{"name":"Gasthaus Krone","amenity":"restaurant"},"name":"Gasthaus Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthaus zur Linde":{"tags":{"name":"Gasthaus zur Linde","amenity":"restaurant"},"name":"Gasthaus zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gasthof zur Post":{"tags":{"name":"Gasthof zur Post","amenity":"restaurant"},"name":"Gasthof zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Corral":{"tags":{"name":"Golden Corral","amenity":"restaurant"},"name":"Golden Corral","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Golden Dragon":{"tags":{"name":"Golden Dragon","amenity":"restaurant"},"name":"Golden Dragon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Great Wall":{"tags":{"name":"Great Wall","amenity":"restaurant"},"name":"Great Wall","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Grüner Baum":{"tags":{"name":"Grüner Baum","amenity":"restaurant"},"name":"Grüner Baum","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Gusto":{"tags":{"name":"Gusto","amenity":"restaurant"},"name":"Gusto","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hard Rock Cafe":{"tags":{"name":"Hard Rock Cafe","amenity":"restaurant"},"name":"Hard Rock Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Harvester":{"tags":{"name":"Harvester","amenity":"restaurant"},"name":"Harvester","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hellas":{"tags":{"name":"Hellas","amenity":"restaurant"},"name":"Hellas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hippopotamus":{"tags":{"name":"Hippopotamus","amenity":"restaurant"},"name":"Hippopotamus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirsch":{"tags":{"name":"Hirsch","amenity":"restaurant"},"name":"Hirsch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hirschen":{"tags":{"name":"Hirschen","amenity":"restaurant"},"name":"Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hong Kong":{"tags":{"name":"Hong Kong","amenity":"restaurant"},"name":"Hong Kong","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Hooters":{"tags":{"name":"Hooters","amenity":"restaurant"},"name":"Hooters","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IHOP":{"tags":{"name":"IHOP","amenity":"restaurant"},"name":"IHOP","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/IL Патио":{"tags":{"name":"IL Патио","amenity":"restaurant"},"name":"IL Патио","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jason's Deli":{"tags":{"name":"Jason's Deli","amenity":"restaurant"},"name":"Jason's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Joe's Crab Shack":{"tags":{"name":"Joe's Crab Shack","amenity":"restaurant"},"name":"Joe's Crab Shack","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Jägerhof":{"tags":{"name":"Jägerhof","amenity":"restaurant"},"name":"Jägerhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kantine":{"tags":{"name":"Kantine","amenity":"restaurant"},"name":"Kantine","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kelsey's":{"tags":{"name":"Kelsey's","amenity":"restaurant"},"name":"Kelsey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kirchenwirt":{"tags":{"name":"Kirchenwirt","amenity":"restaurant"},"name":"Kirchenwirt","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreta":{"tags":{"name":"Kreta","amenity":"restaurant"},"name":"Kreta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kreuz":{"tags":{"name":"Kreuz","amenity":"restaurant"},"name":"Kreuz","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Krone":{"tags":{"name":"Krone","amenity":"restaurant"},"name":"Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Kudu":{"tags":{"name":"Kudu","amenity":"restaurant"},"name":"Kudu","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Escale":{"tags":{"name":"L'Escale","amenity":"restaurant"},"name":"L'Escale","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/L'Osteria":{"tags":{"name":"L'Osteria","amenity":"restaurant"},"name":"L'Osteria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Bodega":{"tags":{"name":"La Bodega","amenity":"restaurant"},"name":"La Bodega","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Boucherie":{"tags":{"name":"La Boucherie","amenity":"restaurant"},"name":"La Boucherie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Cantina":{"tags":{"name":"La Cantina","amenity":"restaurant"},"name":"La Cantina","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casa":{"tags":{"name":"La Casa","amenity":"restaurant"},"name":"La Casa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Casona":{"tags":{"name":"La Casona","amenity":"restaurant"},"name":"La Casona","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Dolce Vita":{"tags":{"name":"La Dolce Vita","amenity":"restaurant"},"name":"La Dolce Vita","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Fontana":{"tags":{"name":"La Fontana","amenity":"restaurant"},"name":"La Fontana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Gondola":{"tags":{"name":"La Gondola","amenity":"restaurant"},"name":"La Gondola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Hacienda":{"tags":{"name":"La Hacienda","amenity":"restaurant"},"name":"La Hacienda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pataterie":{"tags":{"name":"La Pataterie","amenity":"restaurant"},"name":"La Pataterie","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Pergola":{"tags":{"name":"La Pergola","amenity":"restaurant"},"name":"La Pergola","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Perla":{"tags":{"name":"La Perla","amenity":"restaurant"},"name":"La Perla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazza":{"tags":{"name":"La Piazza","amenity":"restaurant"},"name":"La Piazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Piazzetta":{"tags":{"name":"La Piazzetta","amenity":"restaurant"},"name":"La Piazzetta","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Place":{"tags":{"name":"La Place","amenity":"restaurant"},"name":"La Place","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Scala":{"tags":{"name":"La Scala","amenity":"restaurant"},"name":"La Scala","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Strada":{"tags":{"name":"La Strada","amenity":"restaurant"},"name":"La Strada","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tagliatella":{"tags":{"name":"La Tagliatella","amenity":"restaurant"},"name":"La Tagliatella","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Tasca":{"tags":{"name":"La Tasca","amenity":"restaurant"},"name":"La Tasca","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Taverna":{"tags":{"name":"La Taverna","amenity":"restaurant"},"name":"La Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrasse":{"tags":{"name":"La Terrasse","amenity":"restaurant"},"name":"La Terrasse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terraza":{"tags":{"name":"La Terraza","amenity":"restaurant"},"name":"La Terraza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Terrazza":{"tags":{"name":"La Terrazza","amenity":"restaurant"},"name":"La Terrazza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/La Trattoria":{"tags":{"name":"La Trattoria","amenity":"restaurant"},"name":"La Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lamm":{"tags":{"name":"Lamm","amenity":"restaurant"},"name":"Lamm","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Linde":{"tags":{"name":"Linde","amenity":"restaurant"},"name":"Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lindenhof":{"tags":{"name":"Lindenhof","amenity":"restaurant"},"name":"Lindenhof","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Chef":{"tags":{"name":"Little Chef","amenity":"restaurant"},"name":"Little Chef","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Little Italy":{"tags":{"name":"Little Italy","amenity":"restaurant"},"name":"Little Italy","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Logan's Roadhouse":{"tags":{"name":"Logan's Roadhouse","amenity":"restaurant"},"name":"Logan's Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/LongHorn Steakhouse":{"tags":{"name":"LongHorn Steakhouse","amenity":"restaurant"},"name":"LongHorn Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Lotus":{"tags":{"name":"Lotus","amenity":"restaurant"},"name":"Lotus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Léon de Bruxelles":{"tags":{"name":"Léon de Bruxelles","amenity":"restaurant"},"name":"Léon de Bruxelles","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Löwen":{"tags":{"name":"Löwen","amenity":"restaurant"},"name":"Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/MK Restaurants":{"tags":{"name":"MK Restaurants","amenity":"restaurant"},"name":"MK Restaurants","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Maharaja":{"tags":{"name":"Maharaja","amenity":"restaurant"},"name":"Maharaja","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mamma Mia":{"tags":{"name":"Mamma Mia","amenity":"restaurant"},"name":"Mamma Mia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mandarin":{"tags":{"name":"Mandarin","amenity":"restaurant"},"name":"Mandarin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mang Inasal":{"tags":{"name":"Mang Inasal","amenity":"restaurant"},"name":"Mang Inasal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco Polo":{"tags":{"name":"Marco Polo","amenity":"restaurant"},"name":"Marco Polo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Marco's Pizza":{"tags":{"name":"Marco's Pizza","amenity":"restaurant"},"name":"Marco's Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/McAlister's Deli":{"tags":{"name":"McAlister's Deli","amenity":"restaurant"},"name":"McAlister's Deli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mediterraneo":{"tags":{"name":"Mediterraneo","amenity":"restaurant"},"name":"Mediterraneo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mellow Mushroom":{"tags":{"name":"Mellow Mushroom","amenity":"restaurant"},"name":"Mellow Mushroom","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mensa":{"tags":{"name":"Mensa","amenity":"restaurant"},"name":"Mensa","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Milano":{"tags":{"name":"Milano","amenity":"restaurant"},"name":"Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mimi's Cafe":{"tags":{"name":"Mimi's Cafe","amenity":"restaurant"},"name":"Mimi's Cafe","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Moe's Southwest Grill":{"tags":{"name":"Moe's Southwest Grill","amenity":"restaurant"},"name":"Moe's Southwest Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mykonos":{"tags":{"name":"Mykonos","amenity":"restaurant"},"name":"Mykonos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Mythos":{"tags":{"name":"Mythos","amenity":"restaurant"},"name":"Mythos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Nando's":{"tags":{"name":"Nando's","amenity":"restaurant"},"name":"Nando's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Noodles & Company":{"tags":{"name":"Noodles & Company","amenity":"restaurant"},"name":"Noodles & Company","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/O'Charley's":{"tags":{"name":"O'Charley's","amenity":"restaurant"},"name":"O'Charley's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Oasis":{"tags":{"name":"Oasis","amenity":"restaurant"},"name":"Oasis","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ocean Basket":{"tags":{"name":"Ocean Basket","amenity":"restaurant"},"name":"Ocean Basket","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ochsen":{"tags":{"name":"Ochsen","amenity":"restaurant"},"name":"Ochsen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Old Chicago":{"tags":{"name":"Old Chicago","amenity":"restaurant"},"name":"Old Chicago","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olive Garden":{"tags":{"name":"Olive Garden","amenity":"restaurant"},"name":"Olive Garden","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Olympia":{"tags":{"name":"Olympia","amenity":"restaurant"},"name":"Olympia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Osaka":{"tags":{"name":"Osaka","amenity":"restaurant"},"name":"Osaka","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Outback Steakhouse":{"tags":{"name":"Outback Steakhouse","amenity":"restaurant"},"name":"Outback Steakhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/P.F. Chang's":{"tags":{"name":"P.F. Chang's","amenity":"restaurant"},"name":"P.F. Chang's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pancake House":{"tags":{"name":"Pancake House","amenity":"restaurant"},"name":"Pancake House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panda":{"tags":{"name":"Panda","amenity":"restaurant"},"name":"Panda","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panera Bread":{"tags":{"name":"Panera Bread","amenity":"restaurant"},"name":"Panera Bread","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Panorama":{"tags":{"name":"Panorama","amenity":"restaurant"},"name":"Panorama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Parrilla":{"tags":{"name":"Parrilla","amenity":"restaurant"},"name":"Parrilla","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Peking":{"tags":{"name":"Peking","amenity":"restaurant"},"name":"Peking","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Perkins":{"tags":{"name":"Perkins","amenity":"restaurant"},"name":"Perkins","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pinocchio":{"tags":{"name":"Pinocchio","amenity":"restaurant"},"name":"Pinocchio","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Express":{"tags":{"name":"Pizza Express","amenity":"restaurant"},"name":"Pizza Express","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Factory":{"tags":{"name":"Pizza Factory","amenity":"restaurant"},"name":"Pizza Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza House":{"tags":{"name":"Pizza House","amenity":"restaurant"},"name":"Pizza House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Hut":{"tags":{"name":"Pizza Hut","cuisine":"pizza","amenity":"restaurant"},"name":"Pizza Hut","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizza Ranch":{"tags":{"name":"Pizza Ranch","amenity":"restaurant"},"name":"Pizza Ranch","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Italia":{"tags":{"name":"Pizzeria Italia","amenity":"restaurant"},"name":"Pizzeria Italia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Milano":{"tags":{"name":"Pizzeria Milano","amenity":"restaurant"},"name":"Pizzeria Milano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Napoli":{"tags":{"name":"Pizzeria Napoli","amenity":"restaurant"},"name":"Pizzeria Napoli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Roma":{"tags":{"name":"Pizzeria Roma","amenity":"restaurant"},"name":"Pizzeria Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pizzeria Venezia":{"tags":{"name":"Pizzeria Venezia","amenity":"restaurant"},"name":"Pizzeria Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poivre Rouge":{"tags":{"name":"Poivre Rouge","amenity":"restaurant"},"name":"Poivre Rouge","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Pomodoro":{"tags":{"name":"Pomodoro","amenity":"restaurant"},"name":"Pomodoro","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Portofino":{"tags":{"name":"Portofino","amenity":"restaurant"},"name":"Portofino","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Poseidon":{"tags":{"name":"Poseidon","amenity":"restaurant"},"name":"Poseidon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Prezzo":{"tags":{"name":"Prezzo","amenity":"restaurant"},"name":"Prezzo","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Qdoba Mexican Grill":{"tags":{"name":"Qdoba Mexican Grill","amenity":"restaurant"},"name":"Qdoba Mexican Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ratskeller":{"tags":{"name":"Ratskeller","amenity":"restaurant"},"name":"Ratskeller","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Lobster":{"tags":{"name":"Red Lobster","amenity":"restaurant"},"name":"Red Lobster","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Red Robin":{"tags":{"name":"Red Robin","amenity":"restaurant"},"name":"Red Robin","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Restaurante Universitário":{"tags":{"name":"Restaurante Universitário","amenity":"restaurant"},"name":"Restaurante Universitário","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rhodos":{"tags":{"name":"Rhodos","amenity":"restaurant"},"name":"Rhodos","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ristorante Del Arte":{"tags":{"name":"Ristorante Del Arte","amenity":"restaurant"},"name":"Ristorante Del Arte","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Roma":{"tags":{"name":"Roma","amenity":"restaurant"},"name":"Roma","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rose":{"tags":{"name":"Rose","amenity":"restaurant"},"name":"Rose","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Round Table Pizza":{"tags":{"name":"Round Table Pizza","amenity":"restaurant"},"name":"Round Table Pizza","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ruby Tuesday":{"tags":{"name":"Ruby Tuesday","amenity":"restaurant"},"name":"Ruby Tuesday","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössle":{"tags":{"name":"Rössle","amenity":"restaurant"},"name":"Rössle","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Rössli":{"tags":{"name":"Rössli","amenity":"restaurant"},"name":"Rössli","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Saigon":{"tags":{"name":"Saigon","amenity":"restaurant"},"name":"Saigon","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sakura":{"tags":{"name":"Sakura","amenity":"restaurant"},"name":"Sakura","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/San Marco":{"tags":{"name":"San Marco","amenity":"restaurant"},"name":"San Marco","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Santorini":{"tags":{"name":"Santorini","amenity":"restaurant"},"name":"Santorini","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schwarzer Adler":{"tags":{"name":"Schwarzer Adler","amenity":"restaurant"},"name":"Schwarzer Adler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Schützenhaus":{"tags":{"name":"Schützenhaus","amenity":"restaurant"},"name":"Schützenhaus","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shakey's":{"tags":{"name":"Shakey's","amenity":"restaurant"},"name":"Shakey's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shalimar":{"tags":{"name":"Shalimar","amenity":"restaurant"},"name":"Shalimar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shanghai":{"tags":{"name":"Shanghai","amenity":"restaurant"},"name":"Shanghai","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shari's":{"tags":{"name":"Shari's","amenity":"restaurant"},"name":"Shari's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Shoney's":{"tags":{"name":"Shoney's","amenity":"restaurant"},"name":"Shoney's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sizzler":{"tags":{"name":"Sizzler","amenity":"restaurant"},"name":"Sizzler","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sonne":{"tags":{"name":"Sonne","amenity":"restaurant"},"name":"Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sphinx":{"tags":{"name":"Sphinx","amenity":"restaurant"},"name":"Sphinx","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sportheim":{"tags":{"name":"Sportheim","amenity":"restaurant"},"name":"Sportheim","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Spur":{"tags":{"name":"Spur","amenity":"restaurant"},"name":"Spur","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak 'n Shake":{"tags":{"name":"Steak 'n Shake","cuisine":"burger","amenity":"restaurant"},"name":"Steak 'n Shake","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Steak House":{"tags":{"name":"Steak House","amenity":"restaurant"},"name":"Steak House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sternen":{"tags":{"name":"Sternen","amenity":"restaurant"},"name":"Sternen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sunset Grill":{"tags":{"name":"Sunset Grill","amenity":"restaurant"},"name":"Sunset Grill","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi":{"tags":{"name":"Sushi","amenity":"restaurant"},"name":"Sushi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Sushi Bar":{"tags":{"name":"Sushi Bar","amenity":"restaurant"},"name":"Sushi Bar","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Swiss Chalet":{"tags":{"name":"Swiss Chalet","amenity":"restaurant"},"name":"Swiss Chalet","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Syrtaki":{"tags":{"name":"Syrtaki","amenity":"restaurant"},"name":"Syrtaki","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/TGI Friday's":{"tags":{"name":"TGI Friday's","amenity":"restaurant"},"name":"TGI Friday's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taj Mahal":{"tags":{"name":"Taj Mahal","amenity":"restaurant"},"name":"Taj Mahal","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taste of India":{"tags":{"name":"Taste of India","amenity":"restaurant"},"name":"Taste of India","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Taverna":{"tags":{"name":"Taverna","amenity":"restaurant"},"name":"Taverna","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Texas Roadhouse":{"tags":{"name":"Texas Roadhouse","amenity":"restaurant"},"name":"Texas Roadhouse","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/The Cheesecake Factory":{"tags":{"name":"The Cheesecake Factory","amenity":"restaurant"},"name":"The Cheesecake Factory","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toby Carvery":{"tags":{"name":"Toby Carvery","amenity":"restaurant"},"name":"Toby Carvery","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Tony Roma's":{"tags":{"name":"Tony Roma's","amenity":"restaurant"},"name":"Tony Roma's","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Toscana":{"tags":{"name":"Toscana","amenity":"restaurant"},"name":"Toscana","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Trattoria":{"tags":{"name":"Trattoria","amenity":"restaurant"},"name":"Trattoria","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Traube":{"tags":{"name":"Traube","amenity":"restaurant"},"name":"Traube","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vapiano":{"tags":{"name":"Vapiano","amenity":"restaurant"},"name":"Vapiano","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Venezia":{"tags":{"name":"Venezia","amenity":"restaurant"},"name":"Venezia","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Village Inn":{"tags":{"name":"Village Inn","amenity":"restaurant"},"name":"Village Inn","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Vips":{"tags":{"name":"Vips","amenity":"restaurant"},"name":"Vips","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waffle House":{"tags":{"name":"Waffle House","amenity":"restaurant"},"name":"Waffle House","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wagamama":{"tags":{"name":"Wagamama","amenity":"restaurant"},"name":"Wagamama","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Waldschänke":{"tags":{"name":"Waldschänke","amenity":"restaurant"},"name":"Waldschänke","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Warung":{"tags":{"name":"Warung","amenity":"restaurant"},"name":"Warung","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Wasabi":{"tags":{"name":"Wasabi","amenity":"restaurant"},"name":"Wasabi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zizzi":{"tags":{"name":"Zizzi","amenity":"restaurant"},"name":"Zizzi","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zorbas":{"tags":{"name":"Zorbas","amenity":"restaurant"},"name":"Zorbas","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Hirschen":{"tags":{"name":"Zum Hirschen","amenity":"restaurant"},"name":"Zum Hirschen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zum Löwen":{"tags":{"name":"Zum Löwen","amenity":"restaurant"},"name":"Zum Löwen","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Krone":{"tags":{"name":"Zur Krone","amenity":"restaurant"},"name":"Zur Krone","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Linde":{"tags":{"name":"Zur Linde","amenity":"restaurant"},"name":"Zur Linde","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Post":{"tags":{"name":"Zur Post","amenity":"restaurant"},"name":"Zur Post","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Zur Sonne":{"tags":{"name":"Zur Sonne","amenity":"restaurant"},"name":"Zur Sonne","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Евразия":{"tags":{"name":"Евразия","amenity":"restaurant"},"name":"Евразия","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Ресторан":{"tags":{"name":"Ресторан","amenity":"restaurant"},"name":"Ресторан","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Тануки":{"tags":{"name":"Тануки","amenity":"restaurant"},"name":"Тануки","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/Якитория":{"tags":{"name":"Якитория","amenity":"restaurant"},"name":"Якитория","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/رستوران":{"tags":{"name":"رستوران","amenity":"restaurant"},"name":"رستوران","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/مطعم":{"tags":{"name":"مطعم","amenity":"restaurant"},"name":"مطعم","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/はま寿司":{"tags":{"name":"はま寿司","amenity":"restaurant"},"name":"はま寿司","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/びっくりドンキー":{"tags":{"name":"びっくりドンキー","amenity":"restaurant"},"name":"びっくりドンキー","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/やよい軒":{"tags":{"name":"やよい軒","amenity":"restaurant"},"name":"やよい軒","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ガスト":{"tags":{"name":"ガスト","name:en":"Gusto","amenity":"restaurant"},"name":"ガスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ココス":{"tags":{"name":"ココス","amenity":"restaurant"},"name":"ココス","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリア":{"tags":{"name":"サイゼリア","amenity":"restaurant"},"name":"サイゼリア","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/サイゼリヤ":{"tags":{"name":"サイゼリヤ","amenity":"restaurant"},"name":"サイゼリヤ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョイフル":{"tags":{"name":"ジョイフル","amenity":"restaurant"},"name":"ジョイフル","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョナサン":{"tags":{"name":"ジョナサン","amenity":"restaurant"},"name":"ジョナサン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ジョリーパスタ":{"tags":{"name":"ジョリーパスタ","amenity":"restaurant"},"name":"ジョリーパスタ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/デニーズ":{"tags":{"name":"デニーズ","amenity":"restaurant"},"name":"デニーズ","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/バーミヤン":{"tags":{"name":"バーミヤン","amenity":"restaurant"},"name":"バーミヤン","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/ロイヤルホスト":{"tags":{"name":"ロイヤルホスト","amenity":"restaurant"},"name":"ロイヤルホスト","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/丸亀製麺":{"tags":{"name":"丸亀製麺","amenity":"restaurant"},"name":"丸亀製麺","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/八方雲集":{"tags":{"name":"八方雲集","amenity":"restaurant"},"name":"八方雲集","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/夢庵":{"tags":{"name":"夢庵","amenity":"restaurant"},"name":"夢庵","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大戸屋":{"tags":{"name":"大戸屋","amenity":"restaurant"},"name":"大戸屋","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/大阪王将":{"tags":{"name":"大阪王将","amenity":"restaurant"},"name":"大阪王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/天下一品":{"tags":{"name":"天下一品","amenity":"restaurant"},"name":"天下一品","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/安楽亭":{"tags":{"name":"安楽亭","amenity":"restaurant"},"name":"安楽亭","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/牛角":{"tags":{"name":"牛角","amenity":"restaurant"},"name":"牛角","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/食堂":{"tags":{"name":"食堂","amenity":"restaurant"},"name":"食堂","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/餃子の王将":{"tags":{"name":"餃子の王将","amenity":"restaurant"},"name":"餃子の王将","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{"tags":{"name":"바다횟집 (Bada Fish Restaurant)","amenity":"restaurant"},"name":"바다횟집 (Bada Fish Restaurant)","icon":"restaurant","geometry":["point","area"],"fields":["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],"suggestion":true},"amenity/school/Adolfo Lopez Mateos":{"tags":{"name":"Adolfo Lopez Mateos","amenity":"school"},"name":"Adolfo Lopez Mateos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Agustin Ya�ez":{"tags":{"name":"Agustin Ya�ez","amenity":"school"},"name":"Agustin Ya�ez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Albert-Schweitzer-Schule":{"tags":{"name":"Albert-Schweitzer-Schule","amenity":"school"},"name":"Albert-Schweitzer-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Amado Nervo":{"tags":{"name":"Amado Nervo","amenity":"school"},"name":"Amado Nervo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Astrid-Lindgren-Schule":{"tags":{"name":"Astrid-Lindgren-Schule","amenity":"school"},"name":"Astrid-Lindgren-Schule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Benito Juarez":{"tags":{"name":"Benito Juarez","amenity":"school"},"name":"Benito Juarez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Brown School":{"tags":{"name":"Brown School","amenity":"school"},"name":"Brown School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/CEM":{"tags":{"name":"CEM","amenity":"school"},"name":"CEM","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Center School":{"tags":{"name":"Center School","amenity":"school"},"name":"Center School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central Elementary School":{"tags":{"name":"Central Elementary School","amenity":"school"},"name":"Central Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central High School":{"tags":{"name":"Central High School","amenity":"school"},"name":"Central High School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Central School":{"tags":{"name":"Central School","amenity":"school"},"name":"Central School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Colegio San José":{"tags":{"name":"Colegio San José","amenity":"school"},"name":"Colegio San José","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Collège Jean Moulin":{"tags":{"name":"Collège Jean Moulin","amenity":"school"},"name":"Collège Jean Moulin","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Collège privé Saint-Joseph":{"tags":{"name":"Collège privé Saint-Joseph","amenity":"school"},"name":"Collège privé Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cuauhtemoc":{"tags":{"name":"Cuauhtemoc","amenity":"school"},"name":"Cuauhtemoc","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Curso Comunitario":{"tags":{"name":"Curso Comunitario","amenity":"school"},"name":"Curso Comunitario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Cursos Comunitarios":{"tags":{"name":"Cursos Comunitarios","amenity":"school"},"name":"Cursos Comunitarios","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/EPP":{"tags":{"name":"EPP","amenity":"school"},"name":"EPP","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Emiliano Zapata":{"tags":{"name":"Emiliano Zapata","amenity":"school"},"name":"Emiliano Zapata","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Estadual":{"tags":{"name":"Escola Estadual","amenity":"school"},"name":"Escola Estadual","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Escola Municipal":{"tags":{"name":"Escola Municipal","amenity":"school"},"name":"Escola Municipal","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Fairview Elementary School":{"tags":{"name":"Fairview Elementary School","amenity":"school"},"name":"Fairview Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Fairview School":{"tags":{"name":"Fairview School","amenity":"school"},"name":"Fairview School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco I Madero":{"tags":{"name":"Francisco I Madero","amenity":"school"},"name":"Francisco I Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco I. Madero":{"tags":{"name":"Francisco I. Madero","amenity":"school"},"name":"Francisco I. Madero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Francisco Villa":{"tags":{"name":"Francisco Villa","amenity":"school"},"name":"Francisco Villa","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Franklin Elementary School":{"tags":{"name":"Franklin Elementary School","amenity":"school"},"name":"Franklin Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Franklin School":{"tags":{"name":"Franklin School","amenity":"school"},"name":"Franklin School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Garfield Elementary School":{"tags":{"name":"Garfield Elementary School","amenity":"school"},"name":"Garfield Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Garfield School":{"tags":{"name":"Garfield School","amenity":"school"},"name":"Garfield School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Gimnazjum nr 1":{"tags":{"name":"Gimnazjum nr 1","amenity":"school"},"name":"Gimnazjum nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Government School":{"tags":{"name":"Government School","amenity":"school"},"name":"Government School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Gregorio Torres Quintero":{"tags":{"name":"Gregorio Torres Quintero","amenity":"school"},"name":"Gregorio Torres Quintero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Groupe Scolaire":{"tags":{"name":"Groupe Scolaire","amenity":"school"},"name":"Groupe Scolaire","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Guadalupe Victoria":{"tags":{"name":"Guadalupe Victoria","amenity":"school"},"name":"Guadalupe Victoria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Highland School":{"tags":{"name":"Highland School","amenity":"school"},"name":"Highland School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Hillcrest Elementary School":{"tags":{"name":"Hillcrest Elementary School","amenity":"school"},"name":"Hillcrest Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Cross School":{"tags":{"name":"Holy Cross School","amenity":"school"},"name":"Holy Cross School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Family School":{"tags":{"name":"Holy Family School","amenity":"school"},"name":"Holy Family School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Holy Trinity School":{"tags":{"name":"Holy Trinity School","amenity":"school"},"name":"Holy Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Allende":{"tags":{"name":"Ignacio Allende","amenity":"school"},"name":"Ignacio Allende","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ignacio Zaragoza":{"tags":{"name":"Ignacio Zaragoza","amenity":"school"},"name":"Ignacio Zaragoza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Immaculate Conception School":{"tags":{"name":"Immaculate Conception School","amenity":"school"},"name":"Immaculate Conception School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jackson Elementary School":{"tags":{"name":"Jackson Elementary School","amenity":"school"},"name":"Jackson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jackson School":{"tags":{"name":"Jackson School","amenity":"school"},"name":"Jackson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jefferson Elementary School":{"tags":{"name":"Jefferson Elementary School","amenity":"school"},"name":"Jefferson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jefferson School":{"tags":{"name":"Jefferson School","amenity":"school"},"name":"Jefferson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Clemente Orozco":{"tags":{"name":"Jose Clemente Orozco","amenity":"school"},"name":"Jose Clemente Orozco","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Ma Morelos Y Pavon":{"tags":{"name":"Jose Ma Morelos Y Pavon","amenity":"school"},"name":"Jose Ma Morelos Y Pavon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Jose Vasconcelos":{"tags":{"name":"Jose Vasconcelos","amenity":"school"},"name":"Jose Vasconcelos","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Josefa Ortiz De Dominguez":{"tags":{"name":"Josefa Ortiz De Dominguez","amenity":"school"},"name":"Josefa Ortiz De Dominguez","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Juan Escutia":{"tags":{"name":"Juan Escutia","amenity":"school"},"name":"Juan Escutia","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Justo Sierra":{"tags":{"name":"Justo Sierra","amenity":"school"},"name":"Justo Sierra","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Kumon":{"tags":{"name":"Kumon","amenity":"school"},"name":"Kumon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas":{"tags":{"name":"Lazaro Cardenas","amenity":"school"},"name":"Lazaro Cardenas","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lazaro Cardenas Del Rio":{"tags":{"name":"Lazaro Cardenas Del Rio","amenity":"school"},"name":"Lazaro Cardenas Del Rio","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Leona Vicario":{"tags":{"name":"Leona Vicario","amenity":"school"},"name":"Leona Vicario","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Liberty Elementary School":{"tags":{"name":"Liberty Elementary School","amenity":"school"},"name":"Liberty Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Liberty School":{"tags":{"name":"Liberty School","amenity":"school"},"name":"Liberty School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lincoln Elementary School":{"tags":{"name":"Lincoln Elementary School","amenity":"school"},"name":"Lincoln Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Lincoln School":{"tags":{"name":"Lincoln School","amenity":"school"},"name":"Lincoln School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Longfellow Elementary School":{"tags":{"name":"Longfellow Elementary School","amenity":"school"},"name":"Longfellow Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Longfellow School":{"tags":{"name":"Longfellow School","amenity":"school"},"name":"Longfellow School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Madison Elementary School":{"tags":{"name":"Madison Elementary School","amenity":"school"},"name":"Madison Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Manuel Lopez Cotilla":{"tags":{"name":"Manuel Lopez Cotilla","amenity":"school"},"name":"Manuel Lopez Cotilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Maple Grove School":{"tags":{"name":"Maple Grove School","amenity":"school"},"name":"Maple Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/McKinley Elementary School":{"tags":{"name":"McKinley Elementary School","amenity":"school"},"name":"McKinley Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/McKinley School":{"tags":{"name":"McKinley School","amenity":"school"},"name":"McKinley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo":{"tags":{"name":"Miguel Hidalgo","amenity":"school"},"name":"Miguel Hidalgo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miguel Hidalgo Y Costilla":{"tags":{"name":"Miguel Hidalgo Y Costilla","amenity":"school"},"name":"Miguel Hidalgo Y Costilla","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Miller School":{"tags":{"name":"Miller School","amenity":"school"},"name":"Miller School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mount Pleasant School":{"tags":{"name":"Mount Pleasant School","amenity":"school"},"name":"Mount Pleasant School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mount Zion School":{"tags":{"name":"Mount Zion School","amenity":"school"},"name":"Mount Zion School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Mountain View Elementary School":{"tags":{"name":"Mountain View Elementary School","amenity":"school"},"name":"Mountain View Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/New Hope School":{"tags":{"name":"New Hope School","amenity":"school"},"name":"New Hope School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Nicolas Bravo":{"tags":{"name":"Nicolas Bravo","amenity":"school"},"name":"Nicolas Bravo","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ni�os Heroes":{"tags":{"name":"Ni�os Heroes","amenity":"school"},"name":"Ni�os Heroes","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Nombre En Tramite":{"tags":{"name":"Nombre En Tramite","amenity":"school"},"name":"Nombre En Tramite","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/North Elementary School":{"tags":{"name":"North Elementary School","amenity":"school"},"name":"North Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Oak Grove School":{"tags":{"name":"Oak Grove School","amenity":"school"},"name":"Oak Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pedro Moreno":{"tags":{"name":"Pedro Moreno","amenity":"school"},"name":"Pedro Moreno","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pestalozzischule":{"tags":{"name":"Pestalozzischule","amenity":"school"},"name":"Pestalozzischule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pine Grove School":{"tags":{"name":"Pine Grove School","amenity":"school"},"name":"Pine Grove School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant Hill School":{"tags":{"name":"Pleasant Hill School","amenity":"school"},"name":"Pleasant Hill School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant Valley School":{"tags":{"name":"Pleasant Valley School","amenity":"school"},"name":"Pleasant Valley School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Pleasant View School":{"tags":{"name":"Pleasant View School","amenity":"school"},"name":"Pleasant View School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Primaria Comunitaria":{"tags":{"name":"Primaria Comunitaria","amenity":"school"},"name":"Primaria Comunitaria","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ramon Corona":{"tags":{"name":"Ramon Corona","amenity":"school"},"name":"Ramon Corona","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Ricardo Flores Magon":{"tags":{"name":"Ricardo Flores Magon","amenity":"school"},"name":"Ricardo Flores Magon","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Riverside School":{"tags":{"name":"Riverside School","amenity":"school"},"name":"Riverside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Roosevelt Elementary School":{"tags":{"name":"Roosevelt Elementary School","amenity":"school"},"name":"Roosevelt Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Roosevelt School":{"tags":{"name":"Roosevelt School","amenity":"school"},"name":"Roosevelt School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SD":{"tags":{"name":"SD","amenity":"school"},"name":"SD","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/SDN":{"tags":{"name":"SDN","amenity":"school"},"name":"SDN","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Sacred Heart School":{"tags":{"name":"Sacred Heart School","amenity":"school"},"name":"Sacred Heart School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Francis School":{"tags":{"name":"Saint Francis School","amenity":"school"},"name":"Saint Francis School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint James School":{"tags":{"name":"Saint James School","amenity":"school"},"name":"Saint James School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Johns School":{"tags":{"name":"Saint Johns School","amenity":"school"},"name":"Saint Johns School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Joseph School":{"tags":{"name":"Saint Joseph School","amenity":"school"},"name":"Saint Joseph School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Josephs School":{"tags":{"name":"Saint Josephs School","amenity":"school"},"name":"Saint Josephs School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Kizito Primary School":{"tags":{"name":"Saint Kizito Primary School","amenity":"school"},"name":"Saint Kizito Primary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Mary School":{"tags":{"name":"Saint Mary School","amenity":"school"},"name":"Saint Mary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Marys School":{"tags":{"name":"Saint Marys School","amenity":"school"},"name":"Saint Marys School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Patricks School":{"tags":{"name":"Saint Patricks School","amenity":"school"},"name":"Saint Patricks School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Paul School":{"tags":{"name":"Saint Paul School","amenity":"school"},"name":"Saint Paul School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Pauls School":{"tags":{"name":"Saint Pauls School","amenity":"school"},"name":"Saint Pauls School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Saint Peters School":{"tags":{"name":"Saint Peters School","amenity":"school"},"name":"Saint Peters School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Schillerschule":{"tags":{"name":"Schillerschule","amenity":"school"},"name":"Schillerschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 1":{"tags":{"name":"School Number 1","amenity":"school"},"name":"School Number 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 2":{"tags":{"name":"School Number 2","amenity":"school"},"name":"School Number 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 3":{"tags":{"name":"School Number 3","amenity":"school"},"name":"School Number 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/School Number 4":{"tags":{"name":"School Number 4","amenity":"school"},"name":"School Number 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Smith School":{"tags":{"name":"Smith School","amenity":"school"},"name":"Smith School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/South Elementary School":{"tags":{"name":"South Elementary School","amenity":"school"},"name":"South Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Sunnyside School":{"tags":{"name":"Sunnyside School","amenity":"school"},"name":"Sunnyside School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 1":{"tags":{"name":"Szkoła Podstawowa nr 1","amenity":"school"},"name":"Szkoła Podstawowa nr 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 2":{"tags":{"name":"Szkoła Podstawowa nr 2","amenity":"school"},"name":"Szkoła Podstawowa nr 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Szkoła Podstawowa nr 3":{"tags":{"name":"Szkoła Podstawowa nr 3","amenity":"school"},"name":"Szkoła Podstawowa nr 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Trinity School":{"tags":{"name":"Trinity School","amenity":"school"},"name":"Trinity School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/UNIDAD EDUCATIVA":{"tags":{"name":"UNIDAD EDUCATIVA","amenity":"school"},"name":"UNIDAD EDUCATIVA","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Union School":{"tags":{"name":"Union School","amenity":"school"},"name":"Union School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Valentin Gomez Farias":{"tags":{"name":"Valentin Gomez Farias","amenity":"school"},"name":"Valentin Gomez Farias","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Venustiano Carranza":{"tags":{"name":"Venustiano Carranza","amenity":"school"},"name":"Venustiano Carranza","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Vicente Guerrero":{"tags":{"name":"Vicente Guerrero","amenity":"school"},"name":"Vicente Guerrero","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volkshochschule":{"tags":{"name":"Volkshochschule","amenity":"school"},"name":"Volkshochschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Volksschule":{"tags":{"name":"Volksschule","amenity":"school"},"name":"Volksschule","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Washington Elementary School":{"tags":{"name":"Washington Elementary School","amenity":"school"},"name":"Washington Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Washington School":{"tags":{"name":"Washington School","amenity":"school"},"name":"Washington School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/West Elementary School":{"tags":{"name":"West Elementary School","amenity":"school"},"name":"West Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/White School":{"tags":{"name":"White School","amenity":"school"},"name":"White School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Wilson Elementary School":{"tags":{"name":"Wilson Elementary School","amenity":"school"},"name":"Wilson Elementary School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Wilson School":{"tags":{"name":"Wilson School","amenity":"school"},"name":"Wilson School","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Általános iskola":{"tags":{"name":"Általános iskola","amenity":"school"},"name":"Általános iskola","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Jules Ferry":{"tags":{"name":"École Jules Ferry","amenity":"school"},"name":"École Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Notre-Dame":{"tags":{"name":"École Notre-Dame","amenity":"school"},"name":"École Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École Saint-Joseph":{"tags":{"name":"École Saint-Joseph","amenity":"school"},"name":"École Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire Jean Jaurès":{"tags":{"name":"École primaire Jean Jaurès","amenity":"school"},"name":"École primaire Jean Jaurès","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire Jules Ferry":{"tags":{"name":"École primaire Jules Ferry","amenity":"school"},"name":"École primaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Notre-Dame":{"tags":{"name":"École primaire privée Notre-Dame","amenity":"school"},"name":"École primaire privée Notre-Dame","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Saint-Joseph":{"tags":{"name":"École primaire privée Saint-Joseph","amenity":"school"},"name":"École primaire privée Saint-Joseph","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École primaire privée Sainte-Marie":{"tags":{"name":"École primaire privée Sainte-Marie","amenity":"school"},"name":"École primaire privée Sainte-Marie","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/École élémentaire Jules Ferry":{"tags":{"name":"École élémentaire Jules Ferry","amenity":"school"},"name":"École élémentaire Jules Ferry","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școala Generală":{"tags":{"name":"Școala Generală","amenity":"school"},"name":"Școala Generală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Școală":{"tags":{"name":"Școală","amenity":"school"},"name":"Școală","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Вечерняя школа":{"tags":{"name":"Вечерняя школа","amenity":"school"},"name":"Вечерняя школа","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Гимназия №1":{"tags":{"name":"Гимназия №1","amenity":"school"},"name":"Гимназия №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №1":{"tags":{"name":"Средняя школа №1","amenity":"school"},"name":"Средняя школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №2":{"tags":{"name":"Средняя школа №2","amenity":"school"},"name":"Средняя школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Средняя школа №3":{"tags":{"name":"Средняя школа №3","amenity":"school"},"name":"Средняя школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 1":{"tags":{"name":"Школа № 1","amenity":"school"},"name":"Школа № 1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 2":{"tags":{"name":"Школа № 2","amenity":"school"},"name":"Школа № 2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 3":{"tags":{"name":"Школа № 3","amenity":"school"},"name":"Школа № 3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 4":{"tags":{"name":"Школа № 4","amenity":"school"},"name":"Школа № 4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа № 5":{"tags":{"name":"Школа № 5","amenity":"school"},"name":"Школа № 5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №1":{"tags":{"name":"Школа №1","amenity":"school"},"name":"Школа №1","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №10":{"tags":{"name":"Школа №10","amenity":"school"},"name":"Школа №10","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №11":{"tags":{"name":"Школа №11","amenity":"school"},"name":"Школа №11","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №12":{"tags":{"name":"Школа №12","amenity":"school"},"name":"Школа №12","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №13":{"tags":{"name":"Школа №13","amenity":"school"},"name":"Школа №13","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №14":{"tags":{"name":"Школа №14","amenity":"school"},"name":"Школа №14","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №15":{"tags":{"name":"Школа №15","amenity":"school"},"name":"Школа №15","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №16":{"tags":{"name":"Школа №16","amenity":"school"},"name":"Школа №16","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №17":{"tags":{"name":"Школа №17","amenity":"school"},"name":"Школа №17","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №18":{"tags":{"name":"Школа №18","amenity":"school"},"name":"Школа №18","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №19":{"tags":{"name":"Школа №19","amenity":"school"},"name":"Школа №19","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №2":{"tags":{"name":"Школа №2","amenity":"school"},"name":"Школа №2","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №20":{"tags":{"name":"Школа №20","amenity":"school"},"name":"Школа №20","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №21":{"tags":{"name":"Школа №21","amenity":"school"},"name":"Школа №21","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №22":{"tags":{"name":"Школа №22","amenity":"school"},"name":"Школа №22","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №23":{"tags":{"name":"Школа №23","amenity":"school"},"name":"Школа №23","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №24":{"tags":{"name":"Школа №24","amenity":"school"},"name":"Школа №24","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №25":{"tags":{"name":"Школа №25","amenity":"school"},"name":"Школа №25","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №26":{"tags":{"name":"Школа №26","amenity":"school"},"name":"Школа №26","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №27":{"tags":{"name":"Школа №27","amenity":"school"},"name":"Школа №27","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №28":{"tags":{"name":"Школа №28","amenity":"school"},"name":"Школа №28","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №3":{"tags":{"name":"Школа №3","amenity":"school"},"name":"Школа №3","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №31":{"tags":{"name":"Школа №31","amenity":"school"},"name":"Школа №31","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №35":{"tags":{"name":"Школа №35","amenity":"school"},"name":"Школа №35","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №4":{"tags":{"name":"Школа №4","amenity":"school"},"name":"Школа №4","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №5":{"tags":{"name":"Школа №5","amenity":"school"},"name":"Школа №5","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №6":{"tags":{"name":"Школа №6","amenity":"school"},"name":"Школа №6","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №7":{"tags":{"name":"Школа №7","amenity":"school"},"name":"Школа №7","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №8":{"tags":{"name":"Школа №8","amenity":"school"},"name":"Школа №8","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/Школа №9":{"tags":{"name":"Школа №9","amenity":"school"},"name":"Школа №9","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسة":{"tags":{"name":"مدرسة","amenity":"school"},"name":"مدرسة","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/مدرسه":{"tags":{"name":"مدرسه","amenity":"school"},"name":"مدرسه","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南中学校":{"tags":{"name":"市立南中学校","amenity":"school"},"name":"市立南中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立南小学校":{"tags":{"name":"市立南小学校","amenity":"school"},"name":"市立南小学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/school/市立東中学校":{"tags":{"name":"市立東中学校","amenity":"school"},"name":"市立東中学校","icon":"school","geometry":["point","area"],"fields":["name","operator","address"],"suggestion":true},"amenity/social_facility/Safe Haven":{"tags":{"name":"Safe Haven","amenity":"social_facility"},"name":"Safe Haven","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Детский дом":{"tags":{"name":"Детский дом","amenity":"social_facility"},"name":"Детский дом","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/social_facility/Социальный участковый":{"tags":{"name":"Социальный участковый","amenity":"social_facility"},"name":"Социальный участковый","icon":"poi-social-facility","geometry":["point","area"],"fields":["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],"suggestion":true},"amenity/theatre/Amfiteatr":{"tags":{"name":"Amfiteatr","amenity":"theatre"},"name":"Amfiteatr","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheater":{"tags":{"name":"Amphitheater","amenity":"theatre"},"name":"Amphitheater","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Amphitheatre":{"tags":{"name":"Amphitheatre","amenity":"theatre"},"name":"Amphitheatre","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Anfiteatro":{"tags":{"name":"Anfiteatro","amenity":"theatre"},"name":"Anfiteatro","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Freilichtbühne":{"tags":{"name":"Freilichtbühne","amenity":"theatre"},"name":"Freilichtbühne","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Comunale":{"tags":{"name":"Teatro Comunale","amenity":"theatre"},"name":"Teatro Comunale","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/theatre/Teatro Municipal":{"tags":{"name":"Teatro Municipal","amenity":"theatre"},"name":"Teatro Municipal","icon":"theatre","geometry":["point","area"],"fields":["name","operator","address","building_area"],"suggestion":true},"amenity/veterinary/Clinica Veterinaria":{"tags":{"name":"Clinica Veterinaria","amenity":"veterinary"},"name":"Clinica Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"amenity/veterinary/Veterinaria":{"tags":{"name":"Veterinaria","amenity":"veterinary"},"name":"Veterinaria","icon":"veterinary","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/LA Fitness":{"tags":{"name":"LA Fitness","leisure":"fitness_centre"},"name":"LA Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Planet Fitness":{"tags":{"name":"Planet Fitness","leisure":"fitness_centre"},"name":"Planet Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/fitness_centre/Snap Fitness":{"tags":{"name":"Snap Fitness","leisure":"fitness_centre"},"name":"Snap Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/playground/Çocuk Parkı":{"tags":{"name":"Çocuk Parkı","leisure":"playground"},"name":"Çocuk Parkı","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/playground/놀이터":{"tags":{"name":"놀이터","leisure":"playground"},"name":"놀이터","icon":"playground","geometry":["point","area"],"fields":["name","operator","surface","playground/max_age","playground/min_age","access_simple"],"suggestion":true},"leisure/sports_centre/Anytime Fitness":{"tags":{"name":"Anytime Fitness","leisure":"sports_centre"},"name":"Anytime Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Complejo Municipal de Deportes":{"tags":{"name":"Complejo Municipal de Deportes","leisure":"sports_centre"},"name":"Complejo Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Complexe Sportif":{"tags":{"name":"Complexe Sportif","leisure":"sports_centre"},"name":"Complexe Sportif","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Curves":{"tags":{"name":"Curves","leisure":"sports_centre"},"name":"Curves","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Fitness First":{"tags":{"name":"Fitness First","leisure":"sports_centre"},"name":"Fitness First","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Gold's Gym":{"tags":{"name":"Gold's Gym","leisure":"sports_centre"},"name":"Gold's Gym","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Kieser Training":{"tags":{"name":"Kieser Training","leisure":"sports_centre"},"name":"Kieser Training","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Life Time Fitness":{"tags":{"name":"Life Time Fitness","leisure":"sports_centre"},"name":"Life Time Fitness","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/McFit":{"tags":{"name":"McFit","leisure":"sports_centre"},"name":"McFit","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Mrs. Sporty":{"tags":{"name":"Mrs. Sporty","leisure":"sports_centre"},"name":"Mrs. Sporty","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Orlik":{"tags":{"name":"Orlik","leisure":"sports_centre"},"name":"Orlik","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Pabellón Municipal de Deportes":{"tags":{"name":"Pabellón Municipal de Deportes","leisure":"sports_centre"},"name":"Pabellón Municipal de Deportes","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Palestra Comunale":{"tags":{"name":"Palestra Comunale","leisure":"sports_centre"},"name":"Palestra Comunale","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Polideportivo":{"tags":{"name":"Polideportivo","leisure":"sports_centre"},"name":"Polideportivo","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Salle Omnisport":{"tags":{"name":"Salle Omnisport","leisure":"sports_centre"},"name":"Salle Omnisport","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Virgin Active":{"tags":{"name":"Virgin Active","leisure":"sports_centre"},"name":"Virgin Active","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/YMCA":{"tags":{"name":"YMCA","leisure":"sports_centre"},"name":"YMCA","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/ДЮСШ":{"tags":{"name":"ДЮСШ","leisure":"sports_centre"},"name":"ДЮСШ","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/Ледовый дворец":{"tags":{"name":"Ледовый дворец","leisure":"sports_centre"},"name":"Ледовый дворец","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/sports_centre/体育館":{"tags":{"name":"体育館","leisure":"sports_centre"},"name":"体育館","icon":"pitch","geometry":["point","area"],"fields":["name","sport","address","building_area","opening_hours"],"suggestion":true},"leisure/swimming_pool/Schwimmerbecken":{"tags":{"name":"Schwimmerbecken","leisure":"swimming_pool"},"name":"Schwimmerbecken","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/Yüzme Havuzu":{"tags":{"name":"Yüzme Havuzu","leisure":"swimming_pool"},"name":"Yüzme Havuzu","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/プール":{"tags":{"name":"プール","leisure":"swimming_pool"},"name":"プール","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"leisure/swimming_pool/游泳池":{"tags":{"name":"游泳池","leisure":"swimming_pool"},"name":"游泳池","icon":"swimming","geometry":["point","area"],"fields":["name","access_simple","operator","address"],"suggestion":true},"man_made/windmill/De Hoop":{"tags":{"name":"De Hoop","man_made":"windmill"},"name":"De Hoop","icon":"poi-windmill","geometry":["point","area"],"fields":["building_area"],"suggestion":true},"shop/alcohol/Alko":{"tags":{"name":"Alko","shop":"alcohol"},"name":"Alko","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/BC Liquor Store":{"tags":{"name":"BC Liquor Store","shop":"alcohol"},"name":"BC Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/BWS":{"tags":{"name":"BWS","shop":"alcohol"},"name":"BWS","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Bargain Booze":{"tags":{"name":"Bargain Booze","shop":"alcohol"},"name":"Bargain Booze","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Beer Store":{"tags":{"name":"Beer Store","shop":"alcohol"},"name":"Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Botilleria":{"tags":{"name":"Botilleria","shop":"alcohol"},"name":"Botilleria","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Dan Murphy's":{"tags":{"name":"Dan Murphy's","shop":"alcohol"},"name":"Dan Murphy's","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Gall & Gall":{"tags":{"name":"Gall & Gall","shop":"alcohol"},"name":"Gall & Gall","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/LCBO":{"tags":{"name":"LCBO","shop":"alcohol"},"name":"LCBO","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquor Depot":{"tags":{"name":"Liquor Depot","shop":"alcohol"},"name":"Liquor Depot","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquor Store":{"tags":{"name":"Liquor Store","shop":"alcohol"},"name":"Liquor Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Liquorland":{"tags":{"name":"Liquorland","shop":"alcohol"},"name":"Liquorland","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Mitra":{"tags":{"name":"Mitra","shop":"alcohol"},"name":"Mitra","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Nicolas":{"tags":{"name":"Nicolas","shop":"alcohol"},"name":"Nicolas","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/SAQ":{"tags":{"name":"SAQ","shop":"alcohol"},"name":"SAQ","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Systembolaget":{"tags":{"name":"Systembolaget","shop":"alcohol"},"name":"Systembolaget","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/The Beer Store":{"tags":{"name":"The Beer Store","shop":"alcohol"},"name":"The Beer Store","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Vinmonopolet":{"tags":{"name":"Vinmonopolet","shop":"alcohol"},"name":"Vinmonopolet","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Алкомаркет":{"tags":{"name":"Алкомаркет","shop":"alcohol"},"name":"Алкомаркет","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Ароматный мир":{"tags":{"name":"Ароматный мир","shop":"alcohol"},"name":"Ароматный мир","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Бристоль":{"tags":{"name":"Бристоль","shop":"alcohol"},"name":"Бристоль","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Градус":{"tags":{"name":"Градус","shop":"alcohol"},"name":"Градус","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Живое пиво":{"tags":{"name":"Живое пиво","shop":"alcohol"},"name":"Живое пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Красное & Белое":{"tags":{"name":"Красное & Белое","shop":"alcohol"},"name":"Красное & Белое","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Норман":{"tags":{"name":"Норман","shop":"alcohol"},"name":"Норман","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Отдохни":{"tags":{"name":"Отдохни","shop":"alcohol"},"name":"Отдохни","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Пиво":{"tags":{"name":"Пиво","shop":"alcohol"},"name":"Пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/alcohol/Разливное пиво":{"tags":{"name":"Разливное пиво","shop":"alcohol"},"name":"Разливное пиво","icon":"alcohol-shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","drive_through"],"suggestion":true},"shop/baby_goods/Aubert":{"tags":{"name":"Aubert","shop":"baby_goods"},"name":"Aubert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/baby_goods/Babies R Us":{"tags":{"name":"Babies R Us","shop":"baby_goods"},"name":"Babies R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/baby_goods/BabyOne":{"tags":{"name":"BabyOne","shop":"baby_goods"},"name":"BabyOne","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/AILI":{"tags":{"name":"AILI","shop":"bakery"},"name":"AILI","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Anker":{"tags":{"name":"Anker","shop":"bakery"},"name":"Anker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Awiteks":{"tags":{"name":"Awiteks","shop":"bakery"},"name":"Awiteks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Backshop":{"tags":{"name":"Backshop","shop":"bakery"},"name":"Backshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Backwerk":{"tags":{"name":"Backwerk","shop":"bakery"},"name":"Backwerk","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Baguette":{"tags":{"name":"Baguette","shop":"bakery"},"name":"Baguette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bakers Delight":{"tags":{"name":"Bakers Delight","shop":"bakery"},"name":"Bakers Delight","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bakker Bart":{"tags":{"name":"Bakker Bart","shop":"bakery"},"name":"Bakker Bart","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Banette":{"tags":{"name":"Banette","shop":"bakery"},"name":"Banette","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Fuchs":{"tags":{"name":"Bäckerei Fuchs","shop":"bakery"},"name":"Bäckerei Fuchs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Grimminger":{"tags":{"name":"Bäckerei Grimminger","shop":"bakery"},"name":"Bäckerei Grimminger","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Müller":{"tags":{"name":"Bäckerei Müller","shop":"bakery"},"name":"Bäckerei Müller","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Schmidt":{"tags":{"name":"Bäckerei Schmidt","shop":"bakery"},"name":"Bäckerei Schmidt","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Bäckerei Schneider":{"tags":{"name":"Bäckerei Schneider","shop":"bakery"},"name":"Bäckerei Schneider","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Cooplands":{"tags":{"name":"Cooplands","shop":"bakery"},"name":"Cooplands","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Dat Backhus":{"tags":{"name":"Dat Backhus","shop":"bakery"},"name":"Dat Backhus","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Der Beck":{"tags":{"name":"Der Beck","shop":"bakery"},"name":"Der Beck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Der Mann":{"tags":{"name":"Der Mann","shop":"bakery"},"name":"Der Mann","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ditsch":{"tags":{"name":"Ditsch","shop":"bakery"},"name":"Ditsch","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Fornetti":{"tags":{"name":"Fornetti","shop":"bakery"},"name":"Fornetti","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Goeken backen":{"tags":{"name":"Goeken backen","shop":"bakery"},"name":"Goeken backen","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Goldilocks":{"tags":{"name":"Goldilocks","shop":"bakery"},"name":"Goldilocks","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Greggs":{"tags":{"name":"Greggs","shop":"bakery"},"name":"Greggs","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Hofpfisterei":{"tags":{"name":"Hofpfisterei","shop":"bakery"},"name":"Hofpfisterei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ihle":{"tags":{"name":"Ihle","shop":"bakery"},"name":"Ihle","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Julie's Bakeshop":{"tags":{"name":"Julie's Bakeshop","shop":"bakery"},"name":"Julie's Bakeshop","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/K&U":{"tags":{"name":"K&U","shop":"bakery"},"name":"K&U","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/K&U Bäckerei":{"tags":{"name":"K&U Bäckerei","shop":"bakery"},"name":"K&U Bäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Kamps":{"tags":{"name":"Kamps","shop":"bakery"},"name":"Kamps","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/La Mie Câline":{"tags":{"name":"La Mie Câline","shop":"bakery"},"name":"La Mie Câline","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Le Crobag":{"tags":{"name":"Le Crobag","shop":"bakery"},"name":"Le Crobag","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Le Fournil":{"tags":{"name":"Le Fournil","shop":"bakery"},"name":"Le Fournil","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Lila Bäcker":{"tags":{"name":"Lila Bäcker","shop":"bakery"},"name":"Lila Bäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Lipóti Pékség":{"tags":{"name":"Lipóti Pékség","shop":"bakery"},"name":"Lipóti Pékség","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Marie Blachère":{"tags":{"name":"Marie Blachère","shop":"bakery"},"name":"Marie Blachère","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Mlinar":{"tags":{"name":"Mlinar","shop":"bakery"},"name":"Mlinar","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Musmanni":{"tags":{"name":"Musmanni","shop":"bakery"},"name":"Musmanni","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Oebel":{"tags":{"name":"Oebel","shop":"bakery"},"name":"Oebel","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Panaderia":{"tags":{"name":"Panaderia","shop":"bakery"},"name":"Panaderia","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Paul":{"tags":{"name":"Paul","shop":"bakery"},"name":"Paul","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Red Ribbon":{"tags":{"name":"Red Ribbon","shop":"bakery"},"name":"Red Ribbon","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Schäfer's":{"tags":{"name":"Schäfer's","shop":"bakery"},"name":"Schäfer's","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Sehne":{"tags":{"name":"Sehne","shop":"bakery"},"name":"Sehne","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Stadtbäckerei":{"tags":{"name":"Stadtbäckerei","shop":"bakery"},"name":"Stadtbäckerei","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Steinecke":{"tags":{"name":"Steinecke","shop":"bakery"},"name":"Steinecke","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Sternenbäck":{"tags":{"name":"Sternenbäck","shop":"bakery"},"name":"Sternenbäck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Ströck":{"tags":{"name":"Ströck","shop":"bakery"},"name":"Ströck","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Wiener Feinbäcker":{"tags":{"name":"Wiener Feinbäcker","shop":"bakery"},"name":"Wiener Feinbäcker","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/von Allwörden":{"tags":{"name":"von Allwörden","shop":"bakery"},"name":"von Allwörden","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Булочная":{"tags":{"name":"Булочная","shop":"bakery"},"name":"Булочная","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Горячий хлеб":{"tags":{"name":"Горячий хлеб","shop":"bakery"},"name":"Горячий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Каравай":{"tags":{"name":"Каравай","shop":"bakery"},"name":"Каравай","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничи":{"tags":{"name":"Кулиничи","shop":"bakery"},"name":"Кулиничи","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Кулиничі":{"tags":{"name":"Кулиничі","shop":"bakery"},"name":"Кулиничі","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Свежий хлеб":{"tags":{"name":"Свежий хлеб","shop":"bakery"},"name":"Свежий хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/Хлеб":{"tags":{"name":"Хлеб","shop":"bakery"},"name":"Хлеб","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبز":{"tags":{"name":"مخبز","shop":"bakery"},"name":"مخبز","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/مخبزة":{"tags":{"name":"مخبزة","shop":"bakery"},"name":"مخبزة","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نان لواش":{"tags":{"name":"نان لواش","shop":"bakery"},"name":"نان لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی":{"tags":{"name":"نانوایی","shop":"bakery"},"name":"نانوایی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی بربری":{"tags":{"name":"نانوایی بربری","shop":"bakery"},"name":"نانوایی بربری","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگک":{"tags":{"name":"نانوایی سنگک","shop":"bakery"},"name":"نانوایی سنگک","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی سنگکی":{"tags":{"name":"نانوایی سنگکی","shop":"bakery"},"name":"نانوایی سنگکی","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bakery/نانوایی لواش":{"tags":{"name":"نانوایی لواش","shop":"bakery"},"name":"نانوایی لواش","icon":"bakery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beauty/Sally Beauty Supply":{"tags":{"name":"Sally Beauty Supply","shop":"beauty"},"name":"Sally Beauty Supply","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","beauty"],"suggestion":true},"shop/beauty/Yves Rocher":{"tags":{"name":"Yves Rocher","shop":"beauty"},"name":"Yves Rocher","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","beauty"],"suggestion":true},"shop/bed/Matratzen Concord":{"tags":{"name":"Matratzen Concord","shop":"bed"},"name":"Matratzen Concord","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bed/Mattress Firm":{"tags":{"name":"Mattress Firm","shop":"bed"},"name":"Mattress Firm","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bed/Sleepy's":{"tags":{"name":"Sleepy's","shop":"bed"},"name":"Sleepy's","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/50嵐":{"tags":{"name":"50嵐","shop":"beverages"},"name":"50嵐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Dursty":{"tags":{"name":"Dursty","shop":"beverages"},"name":"Dursty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Edeka Getränkemarkt":{"tags":{"name":"Edeka Getränkemarkt","shop":"beverages"},"name":"Edeka Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Fristo":{"tags":{"name":"Fristo","shop":"beverages"},"name":"Fristo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränke Hoffmann":{"tags":{"name":"Getränke Hoffmann","shop":"beverages"},"name":"Getränke Hoffmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränkeland":{"tags":{"name":"Getränkeland","shop":"beverages"},"name":"Getränkeland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Getränkemarkt":{"tags":{"name":"Getränkemarkt","shop":"beverages"},"name":"Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Orterer Getränkemarkt":{"tags":{"name":"Orterer Getränkemarkt","shop":"beverages"},"name":"Orterer Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Rewe Getränkemarkt":{"tags":{"name":"Rewe Getränkemarkt","shop":"beverages"},"name":"Rewe Getränkemarkt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/Trinkgut":{"tags":{"name":"Trinkgut","shop":"beverages"},"name":"Trinkgut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/beverages/茶湯會":{"tags":{"name":"茶湯會","shop":"beverages"},"name":"茶湯會","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bicycle/Halfords":{"tags":{"name":"Halfords","shop":"bicycle"},"name":"Halfords","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/Веломарка":{"tags":{"name":"Веломарка","shop":"bicycle"},"name":"Веломарка","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bicycle/サイクルベースあさひ":{"tags":{"name":"サイクルベースあさひ","shop":"bicycle"},"name":"サイクルベースあさひ","icon":"bicycle","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/bicycle"],"suggestion":true},"shop/bookmaker/Betfred":{"tags":{"name":"Betfred","shop":"bookmaker"},"name":"Betfred","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Coral":{"tags":{"name":"Coral","shop":"bookmaker"},"name":"Coral","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Ladbrokes":{"tags":{"name":"Ladbrokes","shop":"bookmaker"},"name":"Ladbrokes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/Paddy Power":{"tags":{"name":"Paddy Power","shop":"bookmaker"},"name":"Paddy Power","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/William Hill":{"tags":{"name":"William Hill","shop":"bookmaker"},"name":"William Hill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/bookmaker/ΟΠΑΠ":{"tags":{"name":"ΟΠΑΠ","shop":"bookmaker"},"name":"ΟΠΑΠ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Boucherie Charcuterie":{"tags":{"name":"Boucherie Charcuterie","shop":"butcher"},"name":"Boucherie Charcuterie","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Carnicería":{"tags":{"name":"Carnicería","shop":"butcher"},"name":"Carnicería","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Fleischerei Richter":{"tags":{"name":"Fleischerei Richter","shop":"butcher"},"name":"Fleischerei Richter","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Húsbolt":{"tags":{"name":"Húsbolt","shop":"butcher"},"name":"Húsbolt","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Macelleria":{"tags":{"name":"Macelleria","shop":"butcher"},"name":"Macelleria","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Vinzenzmurr":{"tags":{"name":"Vinzenzmurr","shop":"butcher"},"name":"Vinzenzmurr","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Ариант":{"tags":{"name":"Ариант","shop":"butcher"},"name":"Ариант","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Великолукский мясокомбинат":{"tags":{"name":"Великолукский мясокомбинат","shop":"butcher"},"name":"Великолукский мясокомбинат","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясная лавка":{"tags":{"name":"Мясная лавка","shop":"butcher"},"name":"Мясная лавка","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясницкий ряд":{"tags":{"name":"Мясницкий ряд","shop":"butcher"},"name":"Мясницкий ряд","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясной":{"tags":{"name":"Мясной","shop":"butcher"},"name":"Мясной","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Мясо":{"tags":{"name":"Мясо","shop":"butcher"},"name":"Мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Наша Ряба":{"tags":{"name":"Наша Ряба","shop":"butcher"},"name":"Наша Ряба","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/butcher/Свежее мясо":{"tags":{"name":"Свежее мясо","shop":"butcher"},"name":"Свежее мясо","icon":"slaughterhouse","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car/Audi":{"tags":{"name":"Audi","shop":"car"},"name":"Audi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/BMW":{"tags":{"name":"BMW","shop":"car"},"name":"BMW","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Chevrolet":{"tags":{"name":"Chevrolet","shop":"car"},"name":"Chevrolet","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Citroën":{"tags":{"name":"Citroën","shop":"car"},"name":"Citroën","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Dacia":{"tags":{"name":"Dacia","shop":"car"},"name":"Dacia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Fiat":{"tags":{"name":"Fiat","shop":"car"},"name":"Fiat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Ford":{"tags":{"name":"Ford","shop":"car"},"name":"Ford","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Honda":{"tags":{"name":"Honda","shop":"car"},"name":"Honda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Hyundai":{"tags":{"name":"Hyundai","shop":"car"},"name":"Hyundai","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Isuzu":{"tags":{"name":"Isuzu","shop":"car"},"name":"Isuzu","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Kia":{"tags":{"name":"Kia","shop":"car"},"name":"Kia","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Land Rover":{"tags":{"name":"Land Rover","shop":"car"},"name":"Land Rover","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Lexus":{"tags":{"name":"Lexus","shop":"car"},"name":"Lexus","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mazda":{"tags":{"name":"Mazda","shop":"car"},"name":"Mazda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mercedes-Benz":{"tags":{"name":"Mercedes-Benz","shop":"car"},"name":"Mercedes-Benz","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi":{"tags":{"name":"Mitsubishi","shop":"car"},"name":"Mitsubishi","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Mitsubishi Motors":{"tags":{"name":"Mitsubishi Motors","shop":"car"},"name":"Mitsubishi Motors","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/NISSAN":{"tags":{"name":"NISSAN","shop":"car"},"name":"NISSAN","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Nissan":{"tags":{"name":"Nissan","shop":"car"},"name":"Nissan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Opel":{"tags":{"name":"Opel","shop":"car"},"name":"Opel","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Peugeot":{"tags":{"name":"Peugeot","shop":"car"},"name":"Peugeot","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Porsche":{"tags":{"name":"Porsche","shop":"car"},"name":"Porsche","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Renault":{"tags":{"name":"Renault","shop":"car"},"name":"Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Seat":{"tags":{"name":"Seat","shop":"car"},"name":"Seat","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Skoda":{"tags":{"name":"Skoda","shop":"car"},"name":"Skoda","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Subaru":{"tags":{"name":"Subaru","shop":"car"},"name":"Subaru","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Suzuki":{"tags":{"name":"Suzuki","shop":"car"},"name":"Suzuki","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Toyota":{"tags":{"name":"Toyota","shop":"car"},"name":"Toyota","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volkswagen":{"tags":{"name":"Volkswagen","shop":"car"},"name":"Volkswagen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car/Volvo":{"tags":{"name":"Volvo","shop":"car"},"name":"Volvo","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand","service/vehicle"],"suggestion":true},"shop/car_parts/Advance Auto Parts":{"tags":{"name":"Advance Auto Parts","shop":"car_parts"},"name":"Advance Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/AutoZone":{"tags":{"name":"AutoZone","shop":"car_parts"},"name":"AutoZone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Brezan":{"tags":{"name":"Brezan","shop":"car_parts"},"name":"Brezan","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/NAPA Auto Parts":{"tags":{"name":"NAPA Auto Parts","shop":"car_parts"},"name":"NAPA Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Napa Auto Parts":{"tags":{"name":"Napa Auto Parts","shop":"car_parts"},"name":"Napa Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/O'Reilly Auto Parts":{"tags":{"name":"O'Reilly Auto Parts","shop":"car_parts"},"name":"O'Reilly Auto Parts","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Repco":{"tags":{"name":"Repco","shop":"car_parts"},"name":"Repco","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Tokić":{"tags":{"name":"Tokić","shop":"car_parts"},"name":"Tokić","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/repuestos automotrices":{"tags":{"name":"repuestos automotrices","shop":"car_parts"},"name":"repuestos automotrices","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автозапчастини":{"tags":{"name":"Автозапчастини","shop":"car_parts"},"name":"Автозапчастини","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/Автомир":{"tags":{"name":"Автомир","shop":"car_parts"},"name":"Автомир","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/イエローハット":{"tags":{"name":"イエローハット","shop":"car_parts"},"name":"イエローハット","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/オートバックス":{"tags":{"name":"オートバックス","shop":"car_parts"},"name":"オートバックス","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_parts/タイヤ館":{"tags":{"name":"タイヤ館","shop":"car_parts"},"name":"タイヤ館","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/car_repair/A.T.U":{"tags":{"name":"A.T.U","shop":"car_repair"},"name":"A.T.U","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Bosch Car Service":{"tags":{"name":"Bosch Car Service","shop":"car_repair"},"name":"Bosch Car Service","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Carglass":{"tags":{"name":"Carglass","shop":"car_repair"},"name":"Carglass","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Euromaster":{"tags":{"name":"Euromaster","shop":"car_repair"},"name":"Euromaster","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Feu Vert":{"tags":{"name":"Feu Vert","shop":"car_repair"},"name":"Feu Vert","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Firestone":{"tags":{"name":"Firestone","shop":"car_repair"},"name":"Firestone","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Firestone Complete Auto Care":{"tags":{"name":"Firestone Complete Auto Care","shop":"car_repair"},"name":"Firestone Complete Auto Care","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Garage Renault":{"tags":{"name":"Garage Renault","shop":"car_repair"},"name":"Garage Renault","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Gomeria":{"tags":{"name":"Gomeria","shop":"car_repair"},"name":"Gomeria","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Gomería":{"tags":{"name":"Gomería","shop":"car_repair"},"name":"Gomería","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Goodyear":{"tags":{"name":"Goodyear","shop":"car_repair"},"name":"Goodyear","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Grease Monkey":{"tags":{"name":"Grease Monkey","shop":"car_repair"},"name":"Grease Monkey","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Jiffy Lube":{"tags":{"name":"Jiffy Lube","shop":"car_repair"},"name":"Jiffy Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Kwik Fit":{"tags":{"name":"Kwik Fit","shop":"car_repair"},"name":"Kwik Fit","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Lubricentro":{"tags":{"name":"Lubricentro","shop":"car_repair"},"name":"Lubricentro","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Meineke":{"tags":{"name":"Meineke","shop":"car_repair"},"name":"Meineke","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Mekonomen":{"tags":{"name":"Mekonomen","shop":"car_repair"},"name":"Mekonomen","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Midas":{"tags":{"name":"Midas","shop":"car_repair"},"name":"Midas","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Mr. Lube":{"tags":{"name":"Mr. Lube","shop":"car_repair"},"name":"Mr. Lube","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Norauto":{"tags":{"name":"Norauto","shop":"car_repair"},"name":"Norauto","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Pep Boys":{"tags":{"name":"Pep Boys","shop":"car_repair"},"name":"Pep Boys","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Pit Stop":{"tags":{"name":"Pit Stop","shop":"car_repair"},"name":"Pit Stop","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Point S":{"tags":{"name":"Point S","shop":"car_repair"},"name":"Point S","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Roady":{"tags":{"name":"Roady","shop":"car_repair"},"name":"Roady","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Sears Auto Center":{"tags":{"name":"Sears Auto Center","shop":"car_repair"},"name":"Sears Auto Center","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Speedy":{"tags":{"name":"Speedy","shop":"car_repair"},"name":"Speedy","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Stacja Kontroli Pojazdów":{"tags":{"name":"Stacja Kontroli Pojazdów","shop":"car_repair"},"name":"Stacja Kontroli Pojazdów","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Taller":{"tags":{"name":"Taller","shop":"car_repair"},"name":"Taller","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Valvoline":{"tags":{"name":"Valvoline","shop":"car_repair"},"name":"Valvoline","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Valvoline Instant Oil Change":{"tags":{"name":"Valvoline Instant Oil Change","shop":"car_repair"},"name":"Valvoline Instant Oil Change","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Wulkanizacja":{"tags":{"name":"Wulkanizacja","shop":"car_repair"},"name":"Wulkanizacja","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/ÖAMTC":{"tags":{"name":"ÖAMTC","shop":"car_repair"},"name":"ÖAMTC","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автомастерская":{"tags":{"name":"Автомастерская","shop":"car_repair"},"name":"Автомастерская","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Авторемонт":{"tags":{"name":"Авторемонт","shop":"car_repair"},"name":"Авторемонт","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис":{"tags":{"name":"Автосервис","shop":"car_repair"},"name":"Автосервис","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Автосервис+шиномонтаж":{"tags":{"name":"Автосервис+шиномонтаж","shop":"car_repair"},"name":"Автосервис+шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Замена масла":{"tags":{"name":"Замена масла","shop":"car_repair"},"name":"Замена масла","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/СТО":{"tags":{"name":"СТО","shop":"car_repair"},"name":"СТО","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/Шиномонтаж":{"tags":{"name":"Шиномонтаж","shop":"car_repair"},"name":"Шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/car_repair/шиномонтаж":{"tags":{"name":"шиномонтаж","shop":"car_repair"},"name":"шиномонтаж","icon":"car","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","service/vehicle"],"suggestion":true},"shop/carpet/Carpet Right":{"tags":{"name":"Carpet Right","shop":"carpet"},"name":"Carpet Right","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/carpet/Carpetright":{"tags":{"name":"Carpetright","shop":"carpet"},"name":"Carpetright","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/charity/Age UK":{"tags":{"name":"Age UK","shop":"charity"},"name":"Age UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Barnardo's":{"tags":{"name":"Barnardo's","shop":"charity"},"name":"Barnardo's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/British Heart Foundation":{"tags":{"name":"British Heart Foundation","shop":"charity"},"name":"British Heart Foundation","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Cancer Research UK":{"tags":{"name":"Cancer Research UK","shop":"charity"},"name":"Cancer Research UK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Oxfam":{"tags":{"name":"Oxfam","shop":"charity"},"name":"Oxfam","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Salvation Army":{"tags":{"name":"Salvation Army","shop":"charity"},"name":"Salvation Army","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Scope":{"tags":{"name":"Scope","shop":"charity"},"name":"Scope","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/charity/Sue Ryder":{"tags":{"name":"Sue Ryder","shop":"charity"},"name":"Sue Ryder","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/chemist/7 Дней":{"tags":{"name":"7 Дней","shop":"chemist"},"name":"7 Дней","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Bipa":{"tags":{"name":"Bipa","shop":"chemist"},"name":"Bipa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Budnikowsky":{"tags":{"name":"Budnikowsky","shop":"chemist"},"name":"Budnikowsky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Etos":{"tags":{"name":"Etos","shop":"chemist"},"name":"Etos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Kruidvat":{"tags":{"name":"Kruidvat","shop":"chemist"},"name":"Kruidvat","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Matas":{"tags":{"name":"Matas","shop":"chemist"},"name":"Matas","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Müller":{"tags":{"name":"Müller","shop":"chemist"},"name":"Müller","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Rossmann":{"tags":{"name":"Rossmann","shop":"chemist"},"name":"Rossmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Schlecker":{"tags":{"name":"Schlecker","shop":"chemist"},"name":"Schlecker","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Teta":{"tags":{"name":"Teta","shop":"chemist"},"name":"Teta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Trekpleister":{"tags":{"name":"Trekpleister","shop":"chemist"},"name":"Trekpleister","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Watsons":{"tags":{"name":"Watsons","shop":"chemist"},"name":"Watsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/dm":{"tags":{"name":"dm","shop":"chemist"},"name":"dm","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Бытовая химия":{"tags":{"name":"Бытовая химия","shop":"chemist"},"name":"Бытовая химия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Магнит Косметик":{"tags":{"name":"Магнит Косметик","shop":"chemist"},"name":"Магнит Косметик","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Мила":{"tags":{"name":"Мила","shop":"chemist"},"name":"Мила","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Остров чистоты":{"tags":{"name":"Остров чистоты","shop":"chemist"},"name":"Остров чистоты","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Рубль Бум":{"tags":{"name":"Рубль Бум","shop":"chemist"},"name":"Рубль Бум","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/Улыбка радуги":{"tags":{"name":"Улыбка радуги","shop":"chemist"},"name":"Улыбка радуги","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/屈臣氏":{"tags":{"name":"屈臣氏","shop":"chemist"},"name":"屈臣氏","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/chemist/康是美":{"tags":{"name":"康是美","shop":"chemist"},"name":"康是美","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/AOKI":{"tags":{"name":"AOKI","shop":"clothes"},"name":"AOKI","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/AWG":{"tags":{"name":"AWG","shop":"clothes"},"name":"AWG","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ackermans":{"tags":{"name":"Ackermans","shop":"clothes"},"name":"Ackermans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Adidas":{"tags":{"name":"Adidas","shop":"clothes"},"name":"Adidas","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/American Apparel":{"tags":{"name":"American Apparel","shop":"clothes"},"name":"American Apparel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/American Eagle Outfitters":{"tags":{"name":"American Eagle Outfitters","shop":"clothes"},"name":"American Eagle Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Anthropologie":{"tags":{"name":"Anthropologie","shop":"clothes"},"name":"Anthropologie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ardene":{"tags":{"name":"Ardene","shop":"clothes"},"name":"Ardene","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Armand Thiery":{"tags":{"name":"Armand Thiery","shop":"clothes"},"name":"Armand Thiery","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Banana Republic":{"tags":{"name":"Banana Republic","shop":"clothes"},"name":"Banana Republic","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Benetton":{"tags":{"name":"Benetton","shop":"clothes"},"name":"Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bershka":{"tags":{"name":"Bershka","shop":"clothes"},"name":"Bershka","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bonita":{"tags":{"name":"Bonita","shop":"clothes"},"name":"Bonita","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Bonobo":{"tags":{"name":"Bonobo","shop":"clothes"},"name":"Bonobo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Brooks Brothers":{"tags":{"name":"Brooks Brothers","shop":"clothes"},"name":"Brooks Brothers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burberry":{"tags":{"name":"Burberry","shop":"clothes"},"name":"Burberry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burlington Coat Factory":{"tags":{"name":"Burlington Coat Factory","shop":"clothes"},"name":"Burlington Coat Factory","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Burton":{"tags":{"name":"Burton","shop":"clothes"},"name":"Burton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/C&A":{"tags":{"name":"C&A","shop":"clothes"},"name":"C&A","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cache Cache":{"tags":{"name":"Cache Cache","shop":"clothes"},"name":"Cache Cache","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Calvin Klein":{"tags":{"name":"Calvin Klein","shop":"clothes"},"name":"Calvin Klein","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Calzedonia":{"tags":{"name":"Calzedonia","shop":"clothes"},"name":"Calzedonia","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Camaïeu":{"tags":{"name":"Camaïeu","shop":"clothes"},"name":"Camaïeu","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Caroll":{"tags":{"name":"Caroll","shop":"clothes"},"name":"Caroll","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Carter's":{"tags":{"name":"Carter's","shop":"clothes"},"name":"Carter's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cecil":{"tags":{"name":"Cecil","shop":"clothes"},"name":"Cecil","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Celio":{"tags":{"name":"Celio","shop":"clothes"},"name":"Celio","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Charles Vögele":{"tags":{"name":"Charles Vögele","shop":"clothes"},"name":"Charles Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Chico's":{"tags":{"name":"Chico's","shop":"clothes"},"name":"Chico's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cropp":{"tags":{"name":"Cropp","shop":"clothes"},"name":"Cropp","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Cubus":{"tags":{"name":"Cubus","shop":"clothes"},"name":"Cubus","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Desigual":{"tags":{"name":"Desigual","shop":"clothes"},"name":"Desigual","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Devred":{"tags":{"name":"Devred","shop":"clothes"},"name":"Devred","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Didi":{"tags":{"name":"Didi","shop":"clothes"},"name":"Didi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Diesel":{"tags":{"name":"Diesel","shop":"clothes"},"name":"Diesel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dorothy Perkins":{"tags":{"name":"Dorothy Perkins","shop":"clothes"},"name":"Dorothy Perkins","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dress Barn":{"tags":{"name":"Dress Barn","shop":"clothes"},"name":"Dress Barn","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Dressmann":{"tags":{"name":"Dressmann","shop":"clothes"},"name":"Dressmann","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Eddie Bauer":{"tags":{"name":"Eddie Bauer","shop":"clothes"},"name":"Eddie Bauer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Edgars":{"tags":{"name":"Edgars","shop":"clothes"},"name":"Edgars","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Engbers":{"tags":{"name":"Engbers","shop":"clothes"},"name":"Engbers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ernsting's family":{"tags":{"name":"Ernsting's family","shop":"clothes"},"name":"Ernsting's family","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Esprit":{"tags":{"name":"Esprit","shop":"clothes"},"name":"Esprit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Etam":{"tags":{"name":"Etam","shop":"clothes"},"name":"Etam","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Express":{"tags":{"name":"Express","shop":"clothes"},"name":"Express","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Fat Face":{"tags":{"name":"Fat Face","shop":"clothes"},"name":"Fat Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Forever 21":{"tags":{"name":"Forever 21","shop":"clothes"},"name":"Forever 21","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gant":{"tags":{"name":"Gant","shop":"clothes"},"name":"Gant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gap":{"tags":{"name":"Gap","shop":"clothes"},"name":"Gap","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gerry Weber":{"tags":{"name":"Gerry Weber","shop":"clothes"},"name":"Gerry Weber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gina Laura":{"tags":{"name":"Gina Laura","shop":"clothes"},"name":"Gina Laura","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Guess":{"tags":{"name":"Guess","shop":"clothes"},"name":"Guess","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gymboree":{"tags":{"name":"Gymboree","shop":"clothes"},"name":"Gymboree","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Gémo":{"tags":{"name":"Gémo","shop":"clothes"},"name":"Gémo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/H&M":{"tags":{"name":"H&M","shop":"clothes"},"name":"H&M","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hallhuber":{"tags":{"name":"Hallhuber","shop":"clothes"},"name":"Hallhuber","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/House":{"tags":{"name":"House","shop":"clothes"},"name":"House","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hugo Boss":{"tags":{"name":"Hugo Boss","shop":"clothes"},"name":"Hugo Boss","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Humana":{"tags":{"name":"Humana","shop":"clothes"},"name":"Humana","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Hunkemöller":{"tags":{"name":"Hunkemöller","shop":"clothes"},"name":"Hunkemöller","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Intimissimi":{"tags":{"name":"Intimissimi","shop":"clothes"},"name":"Intimissimi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/JBC":{"tags":{"name":"JBC","shop":"clothes"},"name":"JBC","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jack & Jones":{"tags":{"name":"Jack & Jones","shop":"clothes"},"name":"Jack & Jones","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jack Wolfskin":{"tags":{"name":"Jack Wolfskin","shop":"clothes"},"name":"Jack Wolfskin","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jeans Fritz":{"tags":{"name":"Jeans Fritz","shop":"clothes"},"name":"Jeans Fritz","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jennyfer":{"tags":{"name":"Jennyfer","shop":"clothes"},"name":"Jennyfer","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jigsaw":{"tags":{"name":"Jigsaw","shop":"clothes"},"name":"Jigsaw","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Jules":{"tags":{"name":"Jules","shop":"clothes"},"name":"Jules","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Justice":{"tags":{"name":"Justice","shop":"clothes"},"name":"Justice","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/KappAhl":{"tags":{"name":"KappAhl","shop":"clothes"},"name":"KappAhl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/KiK":{"tags":{"name":"KiK","shop":"clothes"},"name":"KiK","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Kiabi":{"tags":{"name":"Kiabi","shop":"clothes"},"name":"Kiabi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/La Halle":{"tags":{"name":"La Halle","shop":"clothes"},"name":"La Halle","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lacoste":{"tags":{"name":"Lacoste","shop":"clothes"},"name":"Lacoste","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lane Bryant":{"tags":{"name":"Lane Bryant","shop":"clothes"},"name":"Lane Bryant","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Levi's":{"tags":{"name":"Levi's","shop":"clothes"},"name":"Levi's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Lindex":{"tags":{"name":"Lindex","shop":"clothes"},"name":"Lindex","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Loft":{"tags":{"name":"Loft","shop":"clothes"},"name":"Loft","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mango":{"tags":{"name":"Mango","shop":"clothes"},"name":"Mango","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Marc O'Polo":{"tags":{"name":"Marc O'Polo","shop":"clothes"},"name":"Marc O'Polo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mark's":{"tags":{"name":"Mark's","shop":"clothes"},"name":"Mark's","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Marshalls":{"tags":{"name":"Marshalls","shop":"clothes"},"name":"Marshalls","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Massimo Dutti":{"tags":{"name":"Massimo Dutti","shop":"clothes"},"name":"Massimo Dutti","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Matalan":{"tags":{"name":"Matalan","shop":"clothes"},"name":"Matalan","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Maurices":{"tags":{"name":"Maurices","shop":"clothes"},"name":"Maurices","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Max Mara":{"tags":{"name":"Max Mara","shop":"clothes"},"name":"Max Mara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Men's Wearhouse":{"tags":{"name":"Men's Wearhouse","shop":"clothes"},"name":"Men's Wearhouse","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mexx":{"tags":{"name":"Mexx","shop":"clothes"},"name":"Mexx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Michael Kors":{"tags":{"name":"Michael Kors","shop":"clothes"},"name":"Michael Kors","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mim":{"tags":{"name":"Mim","shop":"clothes"},"name":"Mim","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Monsoon":{"tags":{"name":"Monsoon","shop":"clothes"},"name":"Monsoon","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Mr Price":{"tags":{"name":"Mr Price","shop":"clothes"},"name":"Mr Price","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/NKD":{"tags":{"name":"NKD","shop":"clothes"},"name":"NKD","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/New Look":{"tags":{"name":"New Look","shop":"clothes"},"name":"New Look","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/New Yorker":{"tags":{"name":"New Yorker","shop":"clothes"},"name":"New Yorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/NewYorker":{"tags":{"name":"NewYorker","shop":"clothes"},"name":"NewYorker","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Next":{"tags":{"name":"Next","shop":"clothes"},"name":"Next","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Nike":{"tags":{"name":"Nike","shop":"clothes"},"name":"Nike","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Nordstrom Rack":{"tags":{"name":"Nordstrom Rack","shop":"clothes"},"name":"Nordstrom Rack","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/OVS":{"tags":{"name":"OVS","shop":"clothes"},"name":"OVS","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Okaïdi":{"tags":{"name":"Okaïdi","shop":"clothes"},"name":"Okaïdi","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Old Navy":{"tags":{"name":"Old Navy","shop":"clothes"},"name":"Old Navy","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Only":{"tags":{"name":"Only","shop":"clothes"},"name":"Only","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Orchestra":{"tags":{"name":"Orchestra","shop":"clothes"},"name":"Orchestra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Original Marines":{"tags":{"name":"Original Marines","shop":"clothes"},"name":"Original Marines","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Orsay":{"tags":{"name":"Orsay","shop":"clothes"},"name":"Orsay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Outfit":{"tags":{"name":"Outfit","shop":"clothes"},"name":"Outfit","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Outlet":{"tags":{"name":"Outlet","shop":"clothes"},"name":"Outlet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Palmers":{"tags":{"name":"Palmers","shop":"clothes"},"name":"Palmers","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Peacocks":{"tags":{"name":"Peacocks","shop":"clothes"},"name":"Peacocks","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Peek & Cloppenburg":{"tags":{"name":"Peek & Cloppenburg","shop":"clothes"},"name":"Peek & Cloppenburg","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pep":{"tags":{"name":"Pep","shop":"clothes"},"name":"Pep","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pepco":{"tags":{"name":"Pepco","shop":"clothes"},"name":"Pepco","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Petit Bateau":{"tags":{"name":"Petit Bateau","shop":"clothes"},"name":"Petit Bateau","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pimkie":{"tags":{"name":"Pimkie","shop":"clothes"},"name":"Pimkie","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Plato's Closet":{"tags":{"name":"Plato's Closet","shop":"clothes"},"name":"Plato's Closet","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Primark":{"tags":{"name":"Primark","shop":"clothes"},"name":"Primark","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Promod":{"tags":{"name":"Promod","shop":"clothes"},"name":"Promod","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Pull & Bear":{"tags":{"name":"Pull & Bear","shop":"clothes"},"name":"Pull & Bear","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Reitmans":{"tags":{"name":"Reitmans","shop":"clothes"},"name":"Reitmans","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Reserved":{"tags":{"name":"Reserved","shop":"clothes"},"name":"Reserved","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/River Island":{"tags":{"name":"River Island","shop":"clothes"},"name":"River Island","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ross":{"tags":{"name":"Ross","shop":"clothes"},"name":"Ross","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sela":{"tags":{"name":"Sela","shop":"clothes"},"name":"Sela","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sergent Major":{"tags":{"name":"Sergent Major","shop":"clothes"},"name":"Sergent Major","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Shoeby":{"tags":{"name":"Shoeby","shop":"clothes"},"name":"Shoeby","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Sisley":{"tags":{"name":"Sisley","shop":"clothes"},"name":"Sisley","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Springfield":{"tags":{"name":"Springfield","shop":"clothes"},"name":"Springfield","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Stefanel":{"tags":{"name":"Stefanel","shop":"clothes"},"name":"Stefanel","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Steps":{"tags":{"name":"Steps","shop":"clothes"},"name":"Steps","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Stradivarius":{"tags":{"name":"Stradivarius","shop":"clothes"},"name":"Stradivarius","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Street One":{"tags":{"name":"Street One","shop":"clothes"},"name":"Street One","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Superdry":{"tags":{"name":"Superdry","shop":"clothes"},"name":"Superdry","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/TJ Maxx":{"tags":{"name":"TJ Maxx","shop":"clothes"},"name":"TJ Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/TK Maxx":{"tags":{"name":"TK Maxx","shop":"clothes"},"name":"TK Maxx","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Takko":{"tags":{"name":"Takko","shop":"clothes"},"name":"Takko","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Talbots":{"tags":{"name":"Talbots","shop":"clothes"},"name":"Talbots","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tally Weijl":{"tags":{"name":"Tally Weijl","shop":"clothes"},"name":"Tally Weijl","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tati":{"tags":{"name":"Tati","shop":"clothes"},"name":"Tati","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Terranova":{"tags":{"name":"Terranova","shop":"clothes"},"name":"Terranova","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tesha":{"tags":{"name":"Tesha","shop":"clothes"},"name":"Tesha","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tezenis":{"tags":{"name":"Tezenis","shop":"clothes"},"name":"Tezenis","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The Children's Place":{"tags":{"name":"The Children's Place","shop":"clothes"},"name":"The Children's Place","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The North Face":{"tags":{"name":"The North Face","shop":"clothes"},"name":"The North Face","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/The Sting":{"tags":{"name":"The Sting","shop":"clothes"},"name":"The Sting","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Timberland":{"tags":{"name":"Timberland","shop":"clothes"},"name":"Timberland","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Toko Pakaian":{"tags":{"name":"Toko Pakaian","shop":"clothes"},"name":"Toko Pakaian","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tom Tailor":{"tags":{"name":"Tom Tailor","shop":"clothes"},"name":"Tom Tailor","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Tommy Hilfiger":{"tags":{"name":"Tommy Hilfiger","shop":"clothes"},"name":"Tommy Hilfiger","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Topshop":{"tags":{"name":"Topshop","shop":"clothes"},"name":"Topshop","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Triumph":{"tags":{"name":"Triumph","shop":"clothes"},"name":"Triumph","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Truworths":{"tags":{"name":"Truworths","shop":"clothes"},"name":"Truworths","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Ulla Popken":{"tags":{"name":"Ulla Popken","shop":"clothes"},"name":"Ulla Popken","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Uniqlo":{"tags":{"name":"Uniqlo","shop":"clothes"},"name":"Uniqlo","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/United Colors of Benetton":{"tags":{"name":"United Colors of Benetton","shop":"clothes"},"name":"United Colors of Benetton","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Urban Outfitters":{"tags":{"name":"Urban Outfitters","shop":"clothes"},"name":"Urban Outfitters","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Vero Moda":{"tags":{"name":"Vero Moda","shop":"clothes"},"name":"Vero Moda","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Victoria's Secret":{"tags":{"name":"Victoria's Secret","shop":"clothes"},"name":"Victoria's Secret","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Vögele":{"tags":{"name":"Vögele","shop":"clothes"},"name":"Vögele","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/WE":{"tags":{"name":"WE","shop":"clothes"},"name":"WE","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Wibra":{"tags":{"name":"Wibra","shop":"clothes"},"name":"Wibra","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Winners":{"tags":{"name":"Winners","shop":"clothes"},"name":"Winners","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Yamamay":{"tags":{"name":"Yamamay","shop":"clothes"},"name":"Yamamay","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Zara":{"tags":{"name":"Zara","shop":"clothes"},"name":"Zara","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Zeeman":{"tags":{"name":"Zeeman","shop":"clothes"},"name":"Zeeman","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/mister*lady":{"tags":{"name":"mister*lady","shop":"clothes"},"name":"mister*lady","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/s.Oliver":{"tags":{"name":"s.Oliver","shop":"clothes"},"name":"s.Oliver","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Детская одежда":{"tags":{"name":"Детская одежда","shop":"clothes"},"name":"Детская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Женская одежда":{"tags":{"name":"Женская одежда","shop":"clothes"},"name":"Женская одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Липненски":{"tags":{"name":"Липненски","shop":"clothes"},"name":"Липненски","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Московская ярмарка":{"tags":{"name":"Московская ярмарка","shop":"clothes"},"name":"Московская ярмарка","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Одежда":{"tags":{"name":"Одежда","shop":"clothes"},"name":"Одежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Смешные цены":{"tags":{"name":"Смешные цены","shop":"clothes"},"name":"Смешные цены","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/Спецодежда":{"tags":{"name":"Спецодежда","shop":"clothes"},"name":"Спецодежда","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/しまむら":{"tags":{"name":"しまむら","shop":"clothes"},"name":"しまむら","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ユニクロ":{"tags":{"name":"ユニクロ","shop":"clothes"},"name":"ユニクロ","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/ワークマン":{"tags":{"name":"ワークマン","shop":"clothes"},"name":"ワークマン","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/洋服の青山":{"tags":{"name":"洋服の青山","shop":"clothes"},"name":"洋服の青山","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/clothes/西松屋":{"tags":{"name":"西松屋","shop":"clothes"},"name":"西松屋","icon":"clothing-store","geometry":["point","area"],"fields":["name","clothes","operator","address","building_area","opening_hours"],"suggestion":true},"shop/coffee/Nespresso":{"tags":{"name":"Nespresso","shop":"coffee"},"name":"Nespresso","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/coffee/Tchibo":{"tags":{"name":"Tchibo","shop":"coffee"},"name":"Tchibo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/Apple Store":{"tags":{"name":"Apple Store","shop":"computer"},"name":"Apple Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/DNS":{"tags":{"name":"DNS","shop":"computer"},"name":"DNS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/PC World":{"tags":{"name":"PC World","shop":"computer"},"name":"PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/computer/ДНС":{"tags":{"name":"ДНС","shop":"computer"},"name":"ДНС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Fagyizó":{"tags":{"name":"Fagyizó","shop":"confectionery"},"name":"Fagyizó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Hussel":{"tags":{"name":"Hussel","shop":"confectionery"},"name":"Hussel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Leonidas":{"tags":{"name":"Leonidas","shop":"confectionery"},"name":"Leonidas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/T. SN":{"tags":{"name":"T. SN","shop":"confectionery"},"name":"T. SN","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/confectionery/Thorntons":{"tags":{"name":"Thorntons","shop":"confectionery"},"name":"Thorntons","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/711":{"tags":{"name":"711","shop":"convenience"},"name":"711","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/777":{"tags":{"name":"777","shop":"convenience"},"name":"777","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/24 часа":{"tags":{"name":"24 часа","shop":"convenience"},"name":"24 часа","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/7-Eleven":{"tags":{"name":"7-Eleven","shop":"convenience"},"name":"7-Eleven","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/8 à Huit":{"tags":{"name":"8 à Huit","shop":"convenience"},"name":"8 à Huit","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/99 Speedmart":{"tags":{"name":"99 Speedmart","shop":"convenience"},"name":"99 Speedmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ABC":{"tags":{"name":"ABC","shop":"convenience"},"name":"ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/AMPM":{"tags":{"name":"AMPM","shop":"convenience"},"name":"AMPM","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Aibė":{"tags":{"name":"Aibė","shop":"convenience"},"name":"Aibė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alepa":{"tags":{"name":"Alepa","shop":"convenience"},"name":"Alepa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alfamart":{"tags":{"name":"Alfamart","shop":"convenience"},"name":"Alfamart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Alimentara":{"tags":{"name":"Alimentara","shop":"convenience"},"name":"Alimentara","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Almacen":{"tags":{"name":"Almacen","shop":"convenience"},"name":"Almacen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Almacén":{"tags":{"name":"Almacén","shop":"convenience"},"name":"Almacén","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/BP Shop":{"tags":{"name":"BP Shop","shop":"convenience"},"name":"BP Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Baqala":{"tags":{"name":"Baqala","shop":"convenience"},"name":"Baqala","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Best One":{"tags":{"name":"Best One","shop":"convenience"},"name":"Best One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Best-One":{"tags":{"name":"Best-One","shop":"convenience"},"name":"Best-One","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Bodega":{"tags":{"name":"Bodega","shop":"convenience"},"name":"Bodega","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Bonjour":{"tags":{"name":"Bonjour","shop":"convenience"},"name":"Bonjour","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/CBA":{"tags":{"name":"CBA","shop":"convenience"},"name":"CBA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/COOP":{"tags":{"name":"COOP","shop":"convenience"},"name":"COOP","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/COOP Jednota":{"tags":{"name":"COOP Jednota","shop":"convenience"},"name":"COOP Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/CU":{"tags":{"name":"CU","shop":"convenience"},"name":"CU","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Casino Shop":{"tags":{"name":"Casino Shop","shop":"convenience"},"name":"Casino Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Centra":{"tags":{"name":"Centra","shop":"convenience"},"name":"Centra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Central Convenience Store":{"tags":{"name":"Central Convenience Store","shop":"convenience"},"name":"Central Convenience Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Circle K":{"tags":{"name":"Circle K","shop":"convenience"},"name":"Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Coop Jednota":{"tags":{"name":"Coop Jednota","shop":"convenience"},"name":"Coop Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Corner Store":{"tags":{"name":"Corner Store","shop":"convenience"},"name":"Corner Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Costcutter":{"tags":{"name":"Costcutter","shop":"convenience"},"name":"Costcutter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Couche-Tard":{"tags":{"name":"Couche-Tard","shop":"convenience"},"name":"Couche-Tard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Cumberland Farms":{"tags":{"name":"Cumberland Farms","shop":"convenience"},"name":"Cumberland Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Daisy Mart":{"tags":{"name":"Daisy Mart","shop":"convenience"},"name":"Daisy Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Delikatesy":{"tags":{"name":"Delikatesy","shop":"convenience"},"name":"Delikatesy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Dollar General":{"tags":{"name":"Dollar General","shop":"convenience"},"name":"Dollar General","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Dépanneur":{"tags":{"name":"Dépanneur","shop":"convenience"},"name":"Dépanneur","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/FamilyMart":{"tags":{"name":"FamilyMart","shop":"convenience"},"name":"FamilyMart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Food Mart":{"tags":{"name":"Food Mart","shop":"convenience"},"name":"Food Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Four Square":{"tags":{"name":"Four Square","shop":"convenience"},"name":"Four Square","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Fresh":{"tags":{"name":"Fresh","shop":"convenience"},"name":"Fresh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Freshmarket":{"tags":{"name":"Freshmarket","shop":"convenience"},"name":"Freshmarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/GS25":{"tags":{"name":"GS25","shop":"convenience"},"name":"GS25","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Groszek":{"tags":{"name":"Groszek","shop":"convenience"},"name":"Groszek","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Hasty Market":{"tags":{"name":"Hasty Market","shop":"convenience"},"name":"Hasty Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Hruška":{"tags":{"name":"Hruška","shop":"convenience"},"name":"Hruška","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Indomaret":{"tags":{"name":"Indomaret","shop":"convenience"},"name":"Indomaret","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Jednota":{"tags":{"name":"Jednota","shop":"convenience"},"name":"Jednota","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Joker":{"tags":{"name":"Joker","shop":"convenience"},"name":"Joker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/K-Market":{"tags":{"name":"K-Market","shop":"convenience"},"name":"K-Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Kangaroo Express":{"tags":{"name":"Kangaroo Express","shop":"convenience"},"name":"Kangaroo Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Kisbolt":{"tags":{"name":"Kisbolt","shop":"convenience"},"name":"Kisbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lawson":{"tags":{"name":"Lawson","shop":"convenience"},"name":"Lawson","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lewiatan":{"tags":{"name":"Lewiatan","shop":"convenience"},"name":"Lewiatan","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Lifestyle Express":{"tags":{"name":"Lifestyle Express","shop":"convenience"},"name":"Lifestyle Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Londis":{"tags":{"name":"Londis","shop":"convenience"},"name":"Londis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/M&S Simply Food":{"tags":{"name":"M&S Simply Food","shop":"convenience"},"name":"M&S Simply Food","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mac's":{"tags":{"name":"Mac's","shop":"convenience"},"name":"Mac's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mace":{"tags":{"name":"Mace","shop":"convenience"},"name":"Mace","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin":{"tags":{"name":"Magazin","shop":"convenience"},"name":"Magazin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin Mixt":{"tags":{"name":"Magazin Mixt","shop":"convenience"},"name":"Magazin Mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin Non-Stop":{"tags":{"name":"Magazin Non-Stop","shop":"convenience"},"name":"Magazin Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Magazin mixt":{"tags":{"name":"Magazin mixt","shop":"convenience"},"name":"Magazin mixt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Maxikiosco":{"tags":{"name":"Maxikiosco","shop":"convenience"},"name":"Maxikiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Małpka Express":{"tags":{"name":"Małpka Express","shop":"convenience"},"name":"Małpka Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/McColl's":{"tags":{"name":"McColl's","shop":"convenience"},"name":"McColl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Migrolino":{"tags":{"name":"Migrolino","shop":"convenience"},"name":"Migrolino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini ABC":{"tags":{"name":"Mini ABC","shop":"convenience"},"name":"Mini ABC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Market":{"tags":{"name":"Mini Market","shop":"convenience"},"name":"Mini Market","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Market Non-Stop":{"tags":{"name":"Mini Market Non-Stop","shop":"convenience"},"name":"Mini Market Non-Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Mart":{"tags":{"name":"Mini Mart","shop":"convenience"},"name":"Mini Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mini Stop":{"tags":{"name":"Mini Stop","shop":"convenience"},"name":"Mini Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Minimarket":{"tags":{"name":"Minimarket","shop":"convenience"},"name":"Minimarket","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Minimercado":{"tags":{"name":"Minimercado","shop":"convenience"},"name":"Minimercado","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Mlin i pekare":{"tags":{"name":"Mlin i pekare","shop":"convenience"},"name":"Mlin i pekare","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nasz Sklep":{"tags":{"name":"Nasz Sklep","shop":"convenience"},"name":"Nasz Sklep","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nisa":{"tags":{"name":"Nisa","shop":"convenience"},"name":"Nisa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Nisa Local":{"tags":{"name":"Nisa Local","shop":"convenience"},"name":"Nisa Local","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK-Mart":{"tags":{"name":"OK-Mart","shop":"convenience"},"name":"OK-Mart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK便利商店":{"tags":{"name":"OK便利商店","shop":"convenience"},"name":"OK便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/OK便利店 Circle K":{"tags":{"name":"OK便利店 Circle K","shop":"convenience"},"name":"OK便利店 Circle K","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Odido":{"tags":{"name":"Odido","shop":"convenience"},"name":"Odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/On The Run":{"tags":{"name":"On The Run","shop":"convenience"},"name":"On The Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/On the Run":{"tags":{"name":"On the Run","shop":"convenience"},"name":"On the Run","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/One Stop":{"tags":{"name":"One Stop","shop":"convenience"},"name":"One Stop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Oxxo":{"tags":{"name":"Oxxo","shop":"convenience"},"name":"Oxxo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Parduotuvė":{"tags":{"name":"Parduotuvė","shop":"convenience"},"name":"Parduotuvė","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Petit Casino":{"tags":{"name":"Petit Casino","shop":"convenience"},"name":"Petit Casino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Plaid Pantry":{"tags":{"name":"Plaid Pantry","shop":"convenience"},"name":"Plaid Pantry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Potraviny":{"tags":{"name":"Potraviny","shop":"convenience"},"name":"Potraviny","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Prehrana":{"tags":{"name":"Prehrana","shop":"convenience"},"name":"Prehrana","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Premier":{"tags":{"name":"Premier","shop":"convenience"},"name":"Premier","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Proxi":{"tags":{"name":"Proxi","shop":"convenience"},"name":"Proxi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Proxy":{"tags":{"name":"Proxy","shop":"convenience"},"name":"Proxy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Pulperia":{"tags":{"name":"Pulperia","shop":"convenience"},"name":"Pulperia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Royal Farms":{"tags":{"name":"Royal Farms","shop":"convenience"},"name":"Royal Farms","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sale":{"tags":{"name":"Sale","shop":"convenience"},"name":"Sale","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sari-sari Store":{"tags":{"name":"Sari-sari Store","shop":"convenience"},"name":"Sari-sari Store","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Select":{"tags":{"name":"Select","shop":"convenience"},"name":"Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Shell Select":{"tags":{"name":"Shell Select","shop":"convenience"},"name":"Shell Select","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Shop & Go":{"tags":{"name":"Shop & Go","shop":"convenience"},"name":"Shop & Go","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Siwa":{"tags":{"name":"Siwa","shop":"convenience"},"name":"Siwa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sklep spożywczy":{"tags":{"name":"Sklep spożywczy","shop":"convenience"},"name":"Sklep spożywczy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Smíšené zboží":{"tags":{"name":"Smíšené zboží","shop":"convenience"},"name":"Smíšené zboží","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Społem":{"tags":{"name":"Społem","shop":"convenience"},"name":"Społem","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Spätkauf":{"tags":{"name":"Spätkauf","shop":"convenience"},"name":"Spätkauf","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stewart's":{"tags":{"name":"Stewart's","shop":"convenience"},"name":"Stewart's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stores":{"tags":{"name":"Stores","shop":"convenience"},"name":"Stores","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Stripes":{"tags":{"name":"Stripes","shop":"convenience"},"name":"Stripes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Studenac":{"tags":{"name":"Studenac","shop":"convenience"},"name":"Studenac","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Sunkus":{"tags":{"name":"Sunkus","shop":"convenience"},"name":"Sunkus","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Słoneczko":{"tags":{"name":"Słoneczko","shop":"convenience"},"name":"Słoneczko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/TESCO Lotus Express":{"tags":{"name":"TESCO Lotus Express","shop":"convenience"},"name":"TESCO Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tesco Express":{"tags":{"name":"Tesco Express","shop":"convenience"},"name":"Tesco Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tesco Lotus Express":{"tags":{"name":"Tesco Lotus Express","shop":"convenience"},"name":"Tesco Lotus Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Tom Market 89":{"tags":{"name":"Tom Market 89","shop":"convenience"},"name":"Tom Market 89","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/United Dairy Farmers":{"tags":{"name":"United Dairy Farmers","shop":"convenience"},"name":"United Dairy Farmers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Vegyesbolt":{"tags":{"name":"Vegyesbolt","shop":"convenience"},"name":"Vegyesbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Večerka":{"tags":{"name":"Večerka","shop":"convenience"},"name":"Večerka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Vival":{"tags":{"name":"Vival","shop":"convenience"},"name":"Vival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Wawa":{"tags":{"name":"Wawa","shop":"convenience"},"name":"Wawa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Weltladen":{"tags":{"name":"Weltladen","shop":"convenience"},"name":"Weltladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/abc":{"tags":{"name":"abc","shop":"convenience"},"name":"abc","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ampm":{"tags":{"name":"ampm","shop":"convenience"},"name":"ampm","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/best-one":{"tags":{"name":"best-one","shop":"convenience"},"name":"best-one","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/odido":{"tags":{"name":"odido","shop":"convenience"},"name":"odido","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Élelmiszer":{"tags":{"name":"Élelmiszer","shop":"convenience"},"name":"Élelmiszer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Élelmiszerbolt":{"tags":{"name":"Élelmiszerbolt","shop":"convenience"},"name":"Élelmiszerbolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Żabka":{"tags":{"name":"Żabka","shop":"convenience"},"name":"Żabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Žabka":{"tags":{"name":"Žabka","shop":"convenience"},"name":"Žabka","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Августина":{"tags":{"name":"Августина","shop":"convenience"},"name":"Августина","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Авоська":{"tags":{"name":"Авоська","shop":"convenience"},"name":"Авоська","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Агрокомплекс":{"tags":{"name":"Агрокомплекс","shop":"convenience"},"name":"Агрокомплекс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Альянс":{"tags":{"name":"Альянс","shop":"convenience"},"name":"Альянс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Апельсин":{"tags":{"name":"Апельсин","shop":"convenience"},"name":"Апельсин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ассорти":{"tags":{"name":"Ассорти","shop":"convenience"},"name":"Ассорти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Белорусские продукты":{"tags":{"name":"Белорусские продукты","shop":"convenience"},"name":"Белорусские продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Берёзка":{"tags":{"name":"Берёзка","shop":"convenience"},"name":"Берёзка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Везунчик":{"tags":{"name":"Везунчик","shop":"convenience"},"name":"Везунчик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Весна":{"tags":{"name":"Весна","shop":"convenience"},"name":"Весна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ветеран":{"tags":{"name":"Ветеран","shop":"convenience"},"name":"Ветеран","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Визит":{"tags":{"name":"Визит","shop":"convenience"},"name":"Визит","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Виктория":{"tags":{"name":"Виктория","shop":"convenience"},"name":"Виктория","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ВкусВилл":{"tags":{"name":"ВкусВилл","shop":"convenience"},"name":"ВкусВилл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гастроном":{"tags":{"name":"Гастроном","shop":"convenience"},"name":"Гастроном","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гермес":{"tags":{"name":"Гермес","shop":"convenience"},"name":"Гермес","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Гурман":{"tags":{"name":"Гурман","shop":"convenience"},"name":"Гурман","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Домашний":{"tags":{"name":"Домашний","shop":"convenience"},"name":"Домашний","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Елена":{"tags":{"name":"Елена","shop":"convenience"},"name":"Елена","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ермолино":{"tags":{"name":"Ермолино","shop":"convenience"},"name":"Ермолино","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Калинка":{"tags":{"name":"Калинка","shop":"convenience"},"name":"Калинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кировский":{"tags":{"name":"Кировский","shop":"convenience"},"name":"Кировский","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колобок":{"tags":{"name":"Колобок","shop":"convenience"},"name":"Колобок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Колосок":{"tags":{"name":"Колосок","shop":"convenience"},"name":"Колосок","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копеечка":{"tags":{"name":"Копеечка","shop":"convenience"},"name":"Копеечка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Копейка":{"tags":{"name":"Копейка","shop":"convenience"},"name":"Копейка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Корзинка":{"tags":{"name":"Корзинка","shop":"convenience"},"name":"Корзинка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Крамниця":{"tags":{"name":"Крамниця","shop":"convenience"},"name":"Крамниця","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кристалл":{"tags":{"name":"Кристалл","shop":"convenience"},"name":"Кристалл","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Кулинария":{"tags":{"name":"Кулинария","shop":"convenience"},"name":"Кулинария","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Купец":{"tags":{"name":"Купец","shop":"convenience"},"name":"Купец","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ласточка":{"tags":{"name":"Ласточка","shop":"convenience"},"name":"Ласточка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Лидер":{"tags":{"name":"Лидер","shop":"convenience"},"name":"Лидер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Любимый":{"tags":{"name":"Любимый","shop":"convenience"},"name":"Любимый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Люкс":{"tags":{"name":"Люкс","shop":"convenience"},"name":"Люкс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Магазин при АЗС":{"tags":{"name":"Магазин при АЗС","shop":"convenience"},"name":"Магазин при АЗС","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мария-Ра":{"tags":{"name":"Мария-Ра","shop":"convenience"},"name":"Мария-Ра","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Маяк":{"tags":{"name":"Маяк","shop":"convenience"},"name":"Маяк","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Меркурий":{"tags":{"name":"Меркурий","shop":"convenience"},"name":"Меркурий","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мечта":{"tags":{"name":"Мечта","shop":"convenience"},"name":"Мечта","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Минимаркет":{"tags":{"name":"Минимаркет","shop":"convenience"},"name":"Минимаркет","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Мираж":{"tags":{"name":"Мираж","shop":"convenience"},"name":"Мираж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Надежда":{"tags":{"name":"Надежда","shop":"convenience"},"name":"Надежда","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ника":{"tags":{"name":"Ника","shop":"convenience"},"name":"Ника","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Оазис":{"tags":{"name":"Оазис","shop":"convenience"},"name":"Оазис","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Олимп":{"tags":{"name":"Олимп","shop":"convenience"},"name":"Олимп","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Подсолнух":{"tags":{"name":"Подсолнух","shop":"convenience"},"name":"Подсолнух","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Престиж":{"tags":{"name":"Престиж","shop":"convenience"},"name":"Престиж","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукти":{"tags":{"name":"Продукти","shop":"convenience"},"name":"Продукти","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый":{"tags":{"name":"Продуктовый","shop":"convenience"},"name":"Продуктовый","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продуктовый магазин":{"tags":{"name":"Продуктовый магазин","shop":"convenience"},"name":"Продуктовый магазин","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты":{"tags":{"name":"Продукты","shop":"convenience"},"name":"Продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Продукты 24":{"tags":{"name":"Продукты 24","shop":"convenience"},"name":"Продукты 24","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Радуга":{"tags":{"name":"Радуга","shop":"convenience"},"name":"Радуга","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Родны кут":{"tags":{"name":"Родны кут","shop":"convenience"},"name":"Родны кут","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Ромашка":{"tags":{"name":"Ромашка","shop":"convenience"},"name":"Ромашка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Русь":{"tags":{"name":"Русь","shop":"convenience"},"name":"Русь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Светлана":{"tags":{"name":"Светлана","shop":"convenience"},"name":"Светлана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Смак":{"tags":{"name":"Смак","shop":"convenience"},"name":"Смак","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Солнечный":{"tags":{"name":"Солнечный","shop":"convenience"},"name":"Солнечный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Татьяна":{"tags":{"name":"Татьяна","shop":"convenience"},"name":"Татьяна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Тройка":{"tags":{"name":"Тройка","shop":"convenience"},"name":"Тройка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/У Палыча":{"tags":{"name":"У Палыча","shop":"convenience"},"name":"У Палыча","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Универсам":{"tags":{"name":"Универсам","shop":"convenience"},"name":"Универсам","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Фортуна":{"tags":{"name":"Фортуна","shop":"convenience"},"name":"Фортуна","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Хороший":{"tags":{"name":"Хороший","shop":"convenience"},"name":"Хороший","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Центральный":{"tags":{"name":"Центральный","shop":"convenience"},"name":"Центральный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Чайка":{"tags":{"name":"Чайка","shop":"convenience"},"name":"Чайка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Шанс":{"tags":{"name":"Шанс","shop":"convenience"},"name":"Шанс","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Эконом":{"tags":{"name":"Эконом","shop":"convenience"},"name":"Эконом","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юбилейный":{"tags":{"name":"Юбилейный","shop":"convenience"},"name":"Юбилейный","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/Юлия":{"tags":{"name":"Юлия","shop":"convenience"},"name":"Юлия","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/продукты":{"tags":{"name":"продукты","shop":"convenience"},"name":"продукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/მარკეტი":{"tags":{"name":"მარკეტი","shop":"convenience"},"name":"მარკეტი","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/サンクス":{"tags":{"name":"サンクス","name:en":"sunkus","shop":"convenience"},"name":"サンクス","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/サークルK":{"tags":{"name":"サークルK","name:en":"Circle K","shop":"convenience"},"name":"サークルK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/スリーエフ":{"tags":{"name":"スリーエフ","shop":"convenience"},"name":"スリーエフ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セイコーマート":{"tags":{"name":"セイコーマート","shop":"convenience"},"name":"セイコーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セブンイレブン":{"tags":{"name":"セブンイレブン","name:en":"7-Eleven","shop":"convenience"},"name":"セブンイレブン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セブンイレブン(Seven-Eleven)":{"tags":{"name":"セブンイレブン(Seven-Eleven)","shop":"convenience"},"name":"セブンイレブン(Seven-Eleven)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/セーブオン":{"tags":{"name":"セーブオン","shop":"convenience"},"name":"セーブオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/デイリーヤマザキ":{"tags":{"name":"デイリーヤマザキ","shop":"convenience"},"name":"デイリーヤマザキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ファミリーマート":{"tags":{"name":"ファミリーマート","name:en":"FamilyMart","shop":"convenience"},"name":"ファミリーマート","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ポプラ":{"tags":{"name":"ポプラ","shop":"convenience"},"name":"ポプラ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ミニストップ":{"tags":{"name":"ミニストップ","name:en":"MINISTOP","shop":"convenience"},"name":"ミニストップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ヤマザキショップ":{"tags":{"name":"ヤマザキショップ","shop":"convenience"},"name":"ヤマザキショップ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ローソン":{"tags":{"name":"ローソン","name:en":"LAWSON","shop":"convenience"},"name":"ローソン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/ローソンストア100":{"tags":{"name":"ローソンストア100","shop":"convenience"},"name":"ローソンストア100","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家":{"tags":{"name":"全家","shop":"convenience"},"name":"全家","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/全家便利商店":{"tags":{"name":"全家便利商店","shop":"convenience"},"name":"全家便利商店","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/萊爾富":{"tags":{"name":"萊爾富","shop":"convenience"},"name":"萊爾富","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/convenience/세븐일레븐":{"tags":{"name":"세븐일레븐","shop":"convenience"},"name":"세븐일레븐","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/copyshop/FedEx Office":{"tags":{"name":"FedEx Office","shop":"copyshop"},"name":"FedEx Office","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/copyshop/FedEx Office Print and Ship Center":{"tags":{"name":"FedEx Office Print and Ship Center","shop":"copyshop"},"name":"FedEx Office Print and Ship Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Douglas":{"tags":{"name":"Douglas","shop":"cosmetics"},"name":"Douglas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Lush":{"tags":{"name":"Lush","shop":"cosmetics"},"name":"Lush","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Marionnaud":{"tags":{"name":"Marionnaud","shop":"cosmetics"},"name":"Marionnaud","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Sephora":{"tags":{"name":"Sephora","shop":"cosmetics"},"name":"Sephora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/The Body Shop":{"tags":{"name":"The Body Shop","shop":"cosmetics"},"name":"The Body Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Л'Этуаль":{"tags":{"name":"Л'Этуаль","shop":"cosmetics"},"name":"Л'Этуаль","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит косметик":{"tags":{"name":"Магнит косметик","shop":"cosmetics"},"name":"Магнит косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Магнит-Косметик":{"tags":{"name":"Магнит-Косметик","shop":"cosmetics"},"name":"Магнит-Косметик","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/cosmetics/Подружка":{"tags":{"name":"Подружка","shop":"cosmetics"},"name":"Подружка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/craft/Hobby Lobby":{"tags":{"name":"Hobby Lobby","shop":"craft"},"name":"Hobby Lobby","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/craft/Michaels":{"tags":{"name":"Michaels","shop":"craft"},"name":"Michaels","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Argos":{"tags":{"name":"Argos","shop":"department_store"},"name":"Argos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Bed Bath & Beyond":{"tags":{"name":"Bed Bath & Beyond","shop":"department_store"},"name":"Bed Bath & Beyond","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Big Lots":{"tags":{"name":"Big Lots","shop":"department_store"},"name":"Big Lots","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Big W":{"tags":{"name":"Big W","shop":"department_store"},"name":"Big W","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Canadian Tire":{"tags":{"name":"Canadian Tire","shop":"department_store"},"name":"Canadian Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Coppel":{"tags":{"name":"Coppel","shop":"department_store"},"name":"Coppel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Debenhams":{"tags":{"name":"Debenhams","shop":"department_store"},"name":"Debenhams","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Dillard's":{"tags":{"name":"Dillard's","shop":"department_store"},"name":"Dillard's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/El Corte Inglés":{"tags":{"name":"El Corte Inglés","shop":"department_store"},"name":"El Corte Inglés","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Galeria Kaufhof":{"tags":{"name":"Galeria Kaufhof","shop":"department_store"},"name":"Galeria Kaufhof","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/HEMA":{"tags":{"name":"HEMA","shop":"department_store"},"name":"HEMA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Harvey Norman":{"tags":{"name":"Harvey Norman","shop":"department_store"},"name":"Harvey Norman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/JCPenney":{"tags":{"name":"JCPenney","shop":"department_store"},"name":"JCPenney","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Karstadt":{"tags":{"name":"Karstadt","shop":"department_store"},"name":"Karstadt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Kmart":{"tags":{"name":"Kmart","shop":"department_store"},"name":"Kmart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Kohl's":{"tags":{"name":"Kohl's","shop":"department_store"},"name":"Kohl's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Lojas Americanas":{"tags":{"name":"Lojas Americanas","shop":"department_store"},"name":"Lojas Americanas","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Macy's":{"tags":{"name":"Macy's","shop":"department_store"},"name":"Macy's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Marks & Spencer":{"tags":{"name":"Marks & Spencer","shop":"department_store"},"name":"Marks & Spencer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Myer":{"tags":{"name":"Myer","shop":"department_store"},"name":"Myer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Nordstrom":{"tags":{"name":"Nordstrom","shop":"department_store"},"name":"Nordstrom","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Sears":{"tags":{"name":"Sears","shop":"department_store"},"name":"Sears","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Shopko":{"tags":{"name":"Shopko","shop":"department_store"},"name":"Shopko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Target":{"tags":{"name":"Target","shop":"department_store"},"name":"Target","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/The Warehouse":{"tags":{"name":"The Warehouse","shop":"department_store"},"name":"The Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Woolworth":{"tags":{"name":"Woolworth","shop":"department_store"},"name":"Woolworth","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/department_store/Универмаг":{"tags":{"name":"Универмаг","shop":"department_store"},"name":"Универмаг","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Ace Hardware":{"tags":{"name":"Ace Hardware","shop":"doityourself"},"name":"Ace Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/B&Q":{"tags":{"name":"B&Q","shop":"doityourself"},"name":"B&Q","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bauhaus":{"tags":{"name":"Bauhaus","shop":"doityourself"},"name":"Bauhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Biltema":{"tags":{"name":"Biltema","shop":"doityourself"},"name":"Biltema","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Brico":{"tags":{"name":"Brico","shop":"doityourself"},"name":"Brico","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bricomarché":{"tags":{"name":"Bricomarché","shop":"doityourself"},"name":"Bricomarché","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bricorama":{"tags":{"name":"Bricorama","shop":"doityourself"},"name":"Bricorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Bunnings Warehouse":{"tags":{"name":"Bunnings Warehouse","shop":"doityourself"},"name":"Bunnings Warehouse","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Castorama":{"tags":{"name":"Castorama","shop":"doityourself"},"name":"Castorama","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Easy":{"tags":{"name":"Easy","shop":"doityourself"},"name":"Easy","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Gamma":{"tags":{"name":"Gamma","shop":"doityourself"},"name":"Gamma","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Globus Baumarkt":{"tags":{"name":"Globus Baumarkt","shop":"doityourself"},"name":"Globus Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hagebaumarkt":{"tags":{"name":"Hagebaumarkt","shop":"doityourself"},"name":"Hagebaumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hellweg":{"tags":{"name":"Hellweg","shop":"doityourself"},"name":"Hellweg","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Home Depot":{"tags":{"name":"Home Depot","shop":"doityourself"},"name":"Home Depot","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Home Hardware":{"tags":{"name":"Home Hardware","shop":"doityourself"},"name":"Home Hardware","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Homebase":{"tags":{"name":"Homebase","shop":"doityourself"},"name":"Homebase","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hornbach":{"tags":{"name":"Hornbach","shop":"doityourself"},"name":"Hornbach","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Hubo":{"tags":{"name":"Hubo","shop":"doityourself"},"name":"Hubo","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Karwei":{"tags":{"name":"Karwei","shop":"doityourself"},"name":"Karwei","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lagerhaus":{"tags":{"name":"Lagerhaus","shop":"doityourself"},"name":"Lagerhaus","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Leroy Merlin":{"tags":{"name":"Leroy Merlin","shop":"doityourself"},"name":"Leroy Merlin","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lowe's":{"tags":{"name":"Lowe's","shop":"doityourself"},"name":"Lowe's","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Lowes":{"tags":{"name":"Lowes","shop":"doityourself"},"name":"Lowes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Menards":{"tags":{"name":"Menards","shop":"doityourself"},"name":"Menards","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Mr Bricolage":{"tags":{"name":"Mr Bricolage","shop":"doityourself"},"name":"Mr Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Mr.Bricolage":{"tags":{"name":"Mr.Bricolage","shop":"doityourself"},"name":"Mr.Bricolage","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/OBI":{"tags":{"name":"OBI","shop":"doityourself"},"name":"OBI","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Point P":{"tags":{"name":"Point P","shop":"doityourself"},"name":"Point P","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Praktiker":{"tags":{"name":"Praktiker","shop":"doityourself"},"name":"Praktiker","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Praxis":{"tags":{"name":"Praxis","shop":"doityourself"},"name":"Praxis","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Rona":{"tags":{"name":"Rona","shop":"doityourself"},"name":"Rona","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Screwfix":{"tags":{"name":"Screwfix","shop":"doityourself"},"name":"Screwfix","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Sonderpreis Baumarkt":{"tags":{"name":"Sonderpreis Baumarkt","shop":"doityourself"},"name":"Sonderpreis Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Tekzen":{"tags":{"name":"Tekzen","shop":"doityourself"},"name":"Tekzen","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Toom Baumarkt":{"tags":{"name":"Toom Baumarkt","shop":"doityourself"},"name":"Toom Baumarkt","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Weldom":{"tags":{"name":"Weldom","shop":"doityourself"},"name":"Weldom","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Wickes":{"tags":{"name":"Wickes","shop":"doityourself"},"name":"Wickes","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Леруа Мерлен":{"tags":{"name":"Леруа Мерлен","shop":"doityourself"},"name":"Леруа Мерлен","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Мастер":{"tags":{"name":"Мастер","shop":"doityourself"},"name":"Мастер","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Строитель":{"tags":{"name":"Строитель","shop":"doityourself"},"name":"Строитель","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/Стройматериалы":{"tags":{"name":"Стройматериалы","shop":"doityourself"},"name":"Стройматериалы","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/カインズホーム":{"tags":{"name":"カインズホーム","shop":"doityourself"},"name":"カインズホーム","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コメリ":{"tags":{"name":"コメリ","shop":"doityourself"},"name":"コメリ","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/doityourself/コーナン":{"tags":{"name":"コーナン","shop":"doityourself"},"name":"コーナン","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Cleaners":{"tags":{"name":"Cleaners","shop":"dry_cleaning"},"name":"Cleaners","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Pressing":{"tags":{"name":"Pressing","shop":"dry_cleaning"},"name":"Pressing","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Диана":{"tags":{"name":"Диана","shop":"dry_cleaning"},"name":"Диана","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/Химчистка":{"tags":{"name":"Химчистка","shop":"dry_cleaning"},"name":"Химчистка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/dry_cleaning/ホワイト急便":{"tags":{"name":"ホワイト急便","shop":"dry_cleaning"},"name":"ホワイト急便","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/BCC":{"tags":{"name":"BCC","shop":"electronics"},"name":"BCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Batteries Plus Bulbs":{"tags":{"name":"Batteries Plus Bulbs","shop":"electronics"},"name":"Batteries Plus Bulbs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Best Buy":{"tags":{"name":"Best Buy","shop":"electronics"},"name":"Best Buy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Boulanger":{"tags":{"name":"Boulanger","shop":"electronics"},"name":"Boulanger","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Currys":{"tags":{"name":"Currys","shop":"electronics"},"name":"Currys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Currys PC World":{"tags":{"name":"Currys PC World","shop":"electronics"},"name":"Currys PC World","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Darty":{"tags":{"name":"Darty","shop":"electronics"},"name":"Darty","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Elektra":{"tags":{"name":"Elektra","shop":"electronics"},"name":"Elektra","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Elgiganten":{"tags":{"name":"Elgiganten","shop":"electronics"},"name":"Elgiganten","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Euronics":{"tags":{"name":"Euronics","shop":"electronics"},"name":"Euronics","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Expert":{"tags":{"name":"Expert","shop":"electronics"},"name":"Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Hartlauer":{"tags":{"name":"Hartlauer","shop":"electronics"},"name":"Hartlauer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Interdiscount":{"tags":{"name":"Interdiscount","shop":"electronics"},"name":"Interdiscount","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/La Curacao":{"tags":{"name":"La Curacao","shop":"electronics"},"name":"La Curacao","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Maplin":{"tags":{"name":"Maplin","shop":"electronics"},"name":"Maplin","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Media Expert":{"tags":{"name":"Media Expert","shop":"electronics"},"name":"Media Expert","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Media Markt":{"tags":{"name":"Media Markt","shop":"electronics"},"name":"Media Markt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Musimundo":{"tags":{"name":"Musimundo","shop":"electronics"},"name":"Musimundo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Neonet":{"tags":{"name":"Neonet","shop":"electronics"},"name":"Neonet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/RTV Euro AGD":{"tags":{"name":"RTV Euro AGD","shop":"electronics"},"name":"RTV Euro AGD","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Radio Shack":{"tags":{"name":"Radio Shack","shop":"electronics"},"name":"Radio Shack","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Rogers":{"tags":{"name":"Rogers","shop":"electronics"},"name":"Rogers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Samsung":{"tags":{"name":"Samsung","shop":"electronics"},"name":"Samsung","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Saturn":{"tags":{"name":"Saturn","shop":"electronics"},"name":"Saturn","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Sony":{"tags":{"name":"Sony","shop":"electronics"},"name":"Sony","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/The Source":{"tags":{"name":"The Source","shop":"electronics"},"name":"The Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Unieuro":{"tags":{"name":"Unieuro","shop":"electronics"},"name":"Unieuro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/М.Видео":{"tags":{"name":"М.Видео","shop":"electronics"},"name":"М.Видео","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Фокстрот":{"tags":{"name":"Фокстрот","shop":"electronics"},"name":"Фокстрот","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эксперт":{"tags":{"name":"Эксперт","shop":"electronics"},"name":"Эксперт","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/Эльдорадо":{"tags":{"name":"Эльдорадо","shop":"electronics"},"name":"Эльдорадо","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/エディオン":{"tags":{"name":"エディオン","shop":"electronics"},"name":"エディオン","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ケーズデンキ":{"tags":{"name":"ケーズデンキ","shop":"electronics"},"name":"ケーズデンキ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/コジマ":{"tags":{"name":"コジマ","shop":"electronics"},"name":"コジマ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/ヤマダ電機":{"tags":{"name":"ヤマダ電機","shop":"electronics"},"name":"ヤマダ電機","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/全國電子":{"tags":{"name":"全國電子","shop":"electronics"},"name":"全國電子","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/electronics/燦坤3C":{"tags":{"name":"燦坤3C","shop":"electronics"},"name":"燦坤3C","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/erotic/Orion":{"tags":{"name":"Orion","shop":"erotic"},"name":"Orion","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/fabric/Ткани":{"tags":{"name":"Ткани","shop":"fabric"},"name":"Ткани","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/farm/Hofladen":{"tags":{"name":"Hofladen","shop":"farm"},"name":"Hofladen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Blume 2000":{"tags":{"name":"Blume 2000","shop":"florist"},"name":"Blume 2000","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Blumen Risse":{"tags":{"name":"Blumen Risse","shop":"florist"},"name":"Blumen Risse","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Fleuriste":{"tags":{"name":"Fleuriste","shop":"florist"},"name":"Fleuriste","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Interflora":{"tags":{"name":"Interflora","shop":"florist"},"name":"Interflora","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Monceau Fleurs":{"tags":{"name":"Monceau Fleurs","shop":"florist"},"name":"Monceau Fleurs","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Virágbolt":{"tags":{"name":"Virágbolt","shop":"florist"},"name":"Virágbolt","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Квіти":{"tags":{"name":"Квіти","shop":"florist"},"name":"Квіти","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветочный магазин":{"tags":{"name":"Цветочный магазин","shop":"florist"},"name":"Цветочный магазин","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/florist/Цветы":{"tags":{"name":"Цветы","shop":"florist"},"name":"Цветы","icon":"florist","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/frame/rumah penduduk":{"tags":{"name":"rumah penduduk","shop":"frame"},"name":"rumah penduduk","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/funeral_directors/Funeraria":{"tags":{"name":"Funeraria","shop":"funeral_directors"},"name":"Funeraria","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/The Co-operative Funeralcare":{"tags":{"name":"The Co-operative Funeralcare","shop":"funeral_directors"},"name":"The Co-operative Funeralcare","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/funeral_directors/Ритуальные услуги":{"tags":{"name":"Ритуальные услуги","shop":"funeral_directors"},"name":"Ритуальные услуги","icon":"cemetery","geometry":["point","area"],"fields":["name","operator","address","building_area","religion","denomination"],"suggestion":true},"shop/furniture/Aaron's":{"tags":{"name":"Aaron's","shop":"furniture"},"name":"Aaron's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Black Red White":{"tags":{"name":"Black Red White","shop":"furniture"},"name":"Black Red White","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Bodzio":{"tags":{"name":"Bodzio","shop":"furniture"},"name":"Bodzio","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/But":{"tags":{"name":"But","shop":"furniture"},"name":"But","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Conforama":{"tags":{"name":"Conforama","shop":"furniture"},"name":"Conforama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/DFS":{"tags":{"name":"DFS","shop":"furniture"},"name":"DFS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Dänisches Bettenlager":{"tags":{"name":"Dänisches Bettenlager","shop":"furniture"},"name":"Dänisches Bettenlager","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Fly":{"tags":{"name":"Fly","shop":"furniture"},"name":"Fly","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Harveys":{"tags":{"name":"Harveys","shop":"furniture"},"name":"Harveys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/IKEA":{"tags":{"name":"IKEA","shop":"furniture"},"name":"IKEA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/JYSK":{"tags":{"name":"JYSK","shop":"furniture"},"name":"JYSK","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Kwantum":{"tags":{"name":"Kwantum","shop":"furniture"},"name":"Kwantum","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Leen Bakker":{"tags":{"name":"Leen Bakker","shop":"furniture"},"name":"Leen Bakker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Pier 1 Imports":{"tags":{"name":"Pier 1 Imports","shop":"furniture"},"name":"Pier 1 Imports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Roller":{"tags":{"name":"Roller","shop":"furniture"},"name":"Roller","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/The Brick":{"tags":{"name":"The Brick","shop":"furniture"},"name":"The Brick","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/Меблі":{"tags":{"name":"Меблі","shop":"furniture"},"name":"Меблі","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/furniture/ニトリ":{"tags":{"name":"ニトリ","shop":"furniture"},"name":"ニトリ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Dehner":{"tags":{"name":"Dehner","shop":"garden_centre"},"name":"Dehner","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Gamm Vert":{"tags":{"name":"Gamm Vert","shop":"garden_centre"},"name":"Gamm Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Jardiland":{"tags":{"name":"Jardiland","shop":"garden_centre"},"name":"Jardiland","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Point Vert":{"tags":{"name":"Point Vert","shop":"garden_centre"},"name":"Point Vert","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Welkoop":{"tags":{"name":"Welkoop","shop":"garden_centre"},"name":"Welkoop","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/garden_centre/Семена":{"tags":{"name":"Семена","shop":"garden_centre"},"name":"Семена","icon":"garden-center","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Card Factory":{"tags":{"name":"Card Factory","shop":"gift"},"name":"Card Factory","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Hallmark":{"tags":{"name":"Hallmark","shop":"gift"},"name":"Hallmark","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/gift/Подарки":{"tags":{"name":"Подарки","shop":"gift"},"name":"Подарки","icon":"gift","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/greengrocer/Frutería":{"tags":{"name":"Frutería","shop":"greengrocer"},"name":"Frutería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/greengrocer/Овощи и фрукты":{"tags":{"name":"Овощи и фрукты","shop":"greengrocer"},"name":"Овощи и фрукты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Barbershop":{"tags":{"name":"Barbershop","shop":"hairdresser"},"name":"Barbershop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Berber":{"tags":{"name":"Berber","shop":"hairdresser"},"name":"Berber","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Cost Cutters":{"tags":{"name":"Cost Cutters","shop":"hairdresser"},"name":"Cost Cutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Fantastic Sams":{"tags":{"name":"Fantastic Sams","shop":"hairdresser"},"name":"Fantastic Sams","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Figaro":{"tags":{"name":"Figaro","shop":"hairdresser"},"name":"Figaro","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/First Choice Haircutters":{"tags":{"name":"First Choice Haircutters","shop":"hairdresser"},"name":"First Choice Haircutters","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Franck Provost":{"tags":{"name":"Franck Provost","shop":"hairdresser"},"name":"Franck Provost","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Frizerie":{"tags":{"name":"Frizerie","shop":"hairdresser"},"name":"Frizerie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Great Clips":{"tags":{"name":"Great Clips","shop":"hairdresser"},"name":"Great Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Haarmonie":{"tags":{"name":"Haarmonie","shop":"hairdresser"},"name":"Haarmonie","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Haarscharf":{"tags":{"name":"Haarscharf","shop":"hairdresser"},"name":"Haarscharf","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Hair Cuttery":{"tags":{"name":"Hair Cuttery","shop":"hairdresser"},"name":"Hair Cuttery","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Hairkiller":{"tags":{"name":"Hairkiller","shop":"hairdresser"},"name":"Hairkiller","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Jean Louis David":{"tags":{"name":"Jean Louis David","shop":"hairdresser"},"name":"Jean Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Jean-Louis David":{"tags":{"name":"Jean-Louis David","shop":"hairdresser"},"name":"Jean-Louis David","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Klier":{"tags":{"name":"Klier","shop":"hairdresser"},"name":"Klier","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Klipp":{"tags":{"name":"Klipp","shop":"hairdresser"},"name":"Klipp","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Le Salon":{"tags":{"name":"Le Salon","shop":"hairdresser"},"name":"Le Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Marco Aldany":{"tags":{"name":"Marco Aldany","shop":"hairdresser"},"name":"Marco Aldany","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Peluquería":{"tags":{"name":"Peluquería","shop":"hairdresser"},"name":"Peluquería","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Salon":{"tags":{"name":"Salon","shop":"hairdresser"},"name":"Salon","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Salon fryzjerski":{"tags":{"name":"Salon fryzjerski","shop":"hairdresser"},"name":"Salon fryzjerski","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Sport Clips":{"tags":{"name":"Sport Clips","shop":"hairdresser"},"name":"Sport Clips","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Super Cuts":{"tags":{"name":"Super Cuts","shop":"hairdresser"},"name":"Super Cuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Supercuts":{"tags":{"name":"Supercuts","shop":"hairdresser"},"name":"Supercuts","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Tchip":{"tags":{"name":"Tchip","shop":"hairdresser"},"name":"Tchip","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/The Barber Shop":{"tags":{"name":"The Barber Shop","shop":"hairdresser"},"name":"The Barber Shop","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Toni & Guy":{"tags":{"name":"Toni & Guy","shop":"hairdresser"},"name":"Toni & Guy","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Top Hair":{"tags":{"name":"Top Hair","shop":"hairdresser"},"name":"Top Hair","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Локон":{"tags":{"name":"Локон","shop":"hairdresser"},"name":"Локон","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Парикмахерская":{"tags":{"name":"Парикмахерская","shop":"hairdresser"},"name":"Парикмахерская","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Перукарня":{"tags":{"name":"Перукарня","shop":"hairdresser"},"name":"Перукарня","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Салон красоты":{"tags":{"name":"Салон красоты","shop":"hairdresser"},"name":"Салон красоты","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Стиль":{"tags":{"name":"Стиль","shop":"hairdresser"},"name":"Стиль","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/Шарм":{"tags":{"name":"Шарм","shop":"hairdresser"},"name":"Шарм","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hairdresser/حلاق":{"tags":{"name":"حلاق","shop":"hairdresser"},"name":"حلاق","icon":"hairdresser","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/1000 мелочей":{"tags":{"name":"1000 мелочей","shop":"hardware"},"name":"1000 мелочей","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Ferretería":{"tags":{"name":"Ferretería","shop":"hardware"},"name":"Ferretería","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Harbor Freight Tools":{"tags":{"name":"Harbor Freight Tools","shop":"hardware"},"name":"Harbor Freight Tools","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Quincaillerie":{"tags":{"name":"Quincaillerie","shop":"hardware"},"name":"Quincaillerie","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/True Value":{"tags":{"name":"True Value","shop":"hardware"},"name":"True Value","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Würth":{"tags":{"name":"Würth","shop":"hardware"},"name":"Würth","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Промтовары":{"tags":{"name":"Промтовары","shop":"hardware"},"name":"Промтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Сантехника":{"tags":{"name":"Сантехника","shop":"hardware"},"name":"Сантехника","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Товары для дома":{"tags":{"name":"Товары для дома","shop":"hardware"},"name":"Товары для дома","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hardware/Хозтовары":{"tags":{"name":"Хозтовары","shop":"hardware"},"name":"Хозтовары","icon":"poi-tool","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Amplifon":{"tags":{"name":"Amplifon","shop":"hearing_aids"},"name":"Amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Geers":{"tags":{"name":"Geers","shop":"hearing_aids"},"name":"Geers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/Kind Hörgeräte":{"tags":{"name":"Kind Hörgeräte","shop":"hearing_aids"},"name":"Kind Hörgeräte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hearing_aids/amplifon":{"tags":{"name":"amplifon","shop":"hearing_aids"},"name":"amplifon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/hifi/Bang & Olufsen":{"tags":{"name":"Bang & Olufsen","shop":"hifi"},"name":"Bang & Olufsen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Blokker":{"tags":{"name":"Blokker","shop":"houseware"},"name":"Blokker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Marskramer":{"tags":{"name":"Marskramer","shop":"houseware"},"name":"Marskramer","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/houseware/Xenos":{"tags":{"name":"Xenos","shop":"houseware"},"name":"Xenos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/interior_decoration/Casa":{"tags":{"name":"Casa","shop":"interior_decoration"},"name":"Casa","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/interior_decoration/Depot":{"tags":{"name":"Depot","shop":"interior_decoration"},"name":"Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/585":{"tags":{"name":"585","shop":"jewelry"},"name":"585","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Apart":{"tags":{"name":"Apart","shop":"jewelry"},"name":"Apart","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Bijou Brigitte":{"tags":{"name":"Bijou Brigitte","shop":"jewelry"},"name":"Bijou Brigitte","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Christ":{"tags":{"name":"Christ","shop":"jewelry"},"name":"Christ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Claire's":{"tags":{"name":"Claire's","shop":"jewelry"},"name":"Claire's","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Ernest Jones":{"tags":{"name":"Ernest Jones","shop":"jewelry"},"name":"Ernest Jones","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/H Samuel":{"tags":{"name":"H Samuel","shop":"jewelry"},"name":"H Samuel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/James Avery Jewelry":{"tags":{"name":"James Avery Jewelry","shop":"jewelry"},"name":"James Avery Jewelry","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Julien d'Orcel":{"tags":{"name":"Julien d'Orcel","shop":"jewelry"},"name":"Julien d'Orcel","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Kay Jewelers":{"tags":{"name":"Kay Jewelers","shop":"jewelry"},"name":"Kay Jewelers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Pandora":{"tags":{"name":"Pandora","shop":"jewelry"},"name":"Pandora","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Swarovski":{"tags":{"name":"Swarovski","shop":"jewelry"},"name":"Swarovski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Адамас":{"tags":{"name":"Адамас","shop":"jewelry"},"name":"Адамас","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/jewelry/Золото":{"tags":{"name":"Золото","shop":"jewelry"},"name":"Золото","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/KIOS":{"tags":{"name":"KIOS","shop":"kiosk"},"name":"KIOS","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosco":{"tags":{"name":"Kiosco","shop":"kiosk"},"name":"Kiosco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosko":{"tags":{"name":"Kiosko","shop":"kiosk"},"name":"Kiosko","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kiosque":{"tags":{"name":"Kiosque","shop":"kiosk"},"name":"Kiosque","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Kolporter":{"tags":{"name":"Kolporter","shop":"kiosk"},"name":"Kolporter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Lietuvos spauda":{"tags":{"name":"Lietuvos spauda","shop":"kiosk"},"name":"Lietuvos spauda","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Narvesen":{"tags":{"name":"Narvesen","shop":"kiosk"},"name":"Narvesen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Pressbyrån":{"tags":{"name":"Pressbyrån","shop":"kiosk"},"name":"Pressbyrån","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Pulpería":{"tags":{"name":"Pulpería","shop":"kiosk"},"name":"Pulpería","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/R-Kioski":{"tags":{"name":"R-Kioski","shop":"kiosk"},"name":"R-Kioski","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Ruch":{"tags":{"name":"Ruch","shop":"kiosk"},"name":"Ruch","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Tabak Trafik":{"tags":{"name":"Tabak Trafik","shop":"kiosk"},"name":"Tabak Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Tisak":{"tags":{"name":"Tisak","shop":"kiosk"},"name":"Tisak","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trafik":{"tags":{"name":"Trafik","shop":"kiosk"},"name":"Trafik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trafika":{"tags":{"name":"Trafika","shop":"kiosk"},"name":"Trafika","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Trinkhalle":{"tags":{"name":"Trinkhalle","shop":"kiosk"},"name":"Trinkhalle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Белсоюзпечать":{"tags":{"name":"Белсоюзпечать","shop":"kiosk"},"name":"Белсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Киоск":{"tags":{"name":"Киоск","shop":"kiosk"},"name":"Киоск","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/Мороженое":{"tags":{"name":"Мороженое","shop":"kiosk"},"name":"Мороженое","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kiosk/მარკეტი (Market)":{"tags":{"name":"მარკეტი (Market)","shop":"kiosk"},"name":"მარკეტი (Market)","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Cuisinella":{"tags":{"name":"Cuisinella","shop":"kitchen"},"name":"Cuisinella","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Home Utensils":{"tags":{"name":"Home Utensils","shop":"kitchen"},"name":"Home Utensils","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/Kitchen":{"tags":{"name":"Kitchen","shop":"kitchen"},"name":"Kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/kitchen/kitchen":{"tags":{"name":"kitchen","shop":"kitchen"},"name":"kitchen","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/Launderette":{"tags":{"name":"Launderette","shop":"laundry"},"name":"Launderette","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/Lavandería":{"tags":{"name":"Lavandería","shop":"laundry"},"name":"Lavandería","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/laundry/コインランドリー":{"tags":{"name":"コインランドリー","shop":"laundry"},"name":"コインランドリー","icon":"laundry","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Loteria de la Provincia":{"tags":{"name":"Loteria de la Provincia","shop":"lottery"},"name":"Loteria de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotería Nacional":{"tags":{"name":"Lotería Nacional","shop":"lottery"},"name":"Lotería Nacional","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotería de la Provincia":{"tags":{"name":"Lotería de la Provincia","shop":"lottery"},"name":"Lotería de la Provincia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lotto":{"tags":{"name":"Lotto","shop":"lottery"},"name":"Lotto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/Lottózó":{"tags":{"name":"Lottózó","shop":"lottery"},"name":"Lottózó","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/lottery/ONCE":{"tags":{"name":"ONCE","shop":"lottery"},"name":"ONCE","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mall/Торговый центр":{"tags":{"name":"Торговый центр","shop":"mall"},"name":"Торговый центр","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/massage/Massage Envy":{"tags":{"name":"Massage Envy","shop":"massage"},"name":"Massage Envy","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/medical_supply/Pofam-Poznań":{"tags":{"name":"Pofam-Poznań","shop":"medical_supply"},"name":"Pofam-Poznań","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/3 Store":{"tags":{"name":"3 Store","shop":"mobile_phone"},"name":"3 Store","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/AT&T":{"tags":{"name":"AT&T","shop":"mobile_phone"},"name":"AT&T","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Bell":{"tags":{"name":"Bell","shop":"mobile_phone"},"name":"Bell","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Bitė":{"tags":{"name":"Bitė","shop":"mobile_phone"},"name":"Bitė","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Boost Mobile":{"tags":{"name":"Boost Mobile","shop":"mobile_phone"},"name":"Boost Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Carphone Warehouse":{"tags":{"name":"Carphone Warehouse","shop":"mobile_phone"},"name":"Carphone Warehouse","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Claro":{"tags":{"name":"Claro","shop":"mobile_phone"},"name":"Claro","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Cricket":{"tags":{"name":"Cricket","shop":"mobile_phone"},"name":"Cricket","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Cricket Wireless":{"tags":{"name":"Cricket Wireless","shop":"mobile_phone"},"name":"Cricket Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Digicel":{"tags":{"name":"Digicel","shop":"mobile_phone"},"name":"Digicel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/EE":{"tags":{"name":"EE","shop":"mobile_phone"},"name":"EE","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/MetroPCS":{"tags":{"name":"MetroPCS","shop":"mobile_phone"},"name":"MetroPCS","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Movistar":{"tags":{"name":"Movistar","shop":"mobile_phone"},"name":"Movistar","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/O2":{"tags":{"name":"O2","shop":"mobile_phone"},"name":"O2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Orange":{"tags":{"name":"Orange","shop":"mobile_phone"},"name":"Orange","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Personal":{"tags":{"name":"Personal","shop":"mobile_phone"},"name":"Personal","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Play":{"tags":{"name":"Play","shop":"mobile_phone"},"name":"Play","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Plus":{"tags":{"name":"Plus","shop":"mobile_phone"},"name":"Plus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/SFR":{"tags":{"name":"SFR","shop":"mobile_phone"},"name":"SFR","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Sprint":{"tags":{"name":"Sprint","shop":"mobile_phone"},"name":"Sprint","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/T-Mobile":{"tags":{"name":"T-Mobile","shop":"mobile_phone"},"name":"T-Mobile","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/TIM":{"tags":{"name":"TIM","shop":"mobile_phone"},"name":"TIM","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telcel":{"tags":{"name":"Telcel","shop":"mobile_phone"},"name":"Telcel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Tele2":{"tags":{"name":"Tele2","shop":"mobile_phone"},"name":"Tele2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telekom":{"tags":{"name":"Telekom","shop":"mobile_phone"},"name":"Telekom","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telekom Shop":{"tags":{"name":"Telekom Shop","shop":"mobile_phone"},"name":"Telekom Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telenor":{"tags":{"name":"Telenor","shop":"mobile_phone"},"name":"Telenor","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Telus":{"tags":{"name":"Telus","shop":"mobile_phone"},"name":"Telus","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/The Phone House":{"tags":{"name":"The Phone House","shop":"mobile_phone"},"name":"The Phone House","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Three":{"tags":{"name":"Three","shop":"mobile_phone"},"name":"Three","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Tim":{"tags":{"name":"Tim","shop":"mobile_phone"},"name":"Tim","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Télécentre":{"tags":{"name":"Télécentre","shop":"mobile_phone"},"name":"Télécentre","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Verizon":{"tags":{"name":"Verizon","shop":"mobile_phone"},"name":"Verizon","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Verizon Wireless":{"tags":{"name":"Verizon Wireless","shop":"mobile_phone"},"name":"Verizon Wireless","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Vodafone":{"tags":{"name":"Vodafone","shop":"mobile_phone"},"name":"Vodafone","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Vodafone Shop":{"tags":{"name":"Vodafone Shop","shop":"mobile_phone"},"name":"Vodafone Shop","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Wind":{"tags":{"name":"Wind","shop":"mobile_phone"},"name":"Wind","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Yoigo":{"tags":{"name":"Yoigo","shop":"mobile_phone"},"name":"Yoigo","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/au":{"tags":{"name":"au","shop":"mobile_phone"},"name":"au","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/auショップ":{"tags":{"name":"auショップ","shop":"mobile_phone"},"name":"auショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/mobilcom debitel":{"tags":{"name":"mobilcom debitel","shop":"mobile_phone"},"name":"mobilcom debitel","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Алло":{"tags":{"name":"Алло","shop":"mobile_phone"},"name":"Алло","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Билайн":{"tags":{"name":"Билайн","shop":"mobile_phone"},"name":"Билайн","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Евросеть":{"tags":{"name":"Евросеть","shop":"mobile_phone"},"name":"Евросеть","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Київстар":{"tags":{"name":"Київстар","shop":"mobile_phone"},"name":"Київстар","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/МТС":{"tags":{"name":"МТС","shop":"mobile_phone"},"name":"МТС","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Мегафон":{"tags":{"name":"Мегафон","shop":"mobile_phone"},"name":"Мегафон","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Связной":{"tags":{"name":"Связной","shop":"mobile_phone"},"name":"Связной","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/Теле2":{"tags":{"name":"Теле2","shop":"mobile_phone"},"name":"Теле2","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/ソフトバンクショップ":{"tags":{"name":"ソフトバンクショップ","shop":"mobile_phone"},"name":"ソフトバンクショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/mobile_phone/ドコモショップ":{"tags":{"name":"ドコモショップ","shop":"mobile_phone"},"name":"ドコモショップ","icon":"mobile-phone","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/money_lender/Money Mart":{"tags":{"name":"Money Mart","shop":"money_lender"},"name":"Money Mart","icon":"bank","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","currency_multi"],"suggestion":true},"shop/motorcycle/Harley Davidson":{"tags":{"name":"Harley Davidson","shop":"motorcycle"},"name":"Harley Davidson","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/motorcycle/Yamaha":{"tags":{"name":"Yamaha","shop":"motorcycle"},"name":"Yamaha","icon":"scooter","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/music/HMV":{"tags":{"name":"HMV","shop":"music"},"name":"HMV","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/musical_instrument/Guitar Center":{"tags":{"name":"Guitar Center","shop":"musical_instrument"},"name":"Guitar Center","icon":"music","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Edicola":{"tags":{"name":"Edicola","shop":"newsagent"},"name":"Edicola","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Maison de la Presse":{"tags":{"name":"Maison de la Presse","shop":"newsagent"},"name":"Maison de la Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Relay":{"tags":{"name":"Relay","shop":"newsagent"},"name":"Relay","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Tabac Presse":{"tags":{"name":"Tabac Presse","shop":"newsagent"},"name":"Tabac Presse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/WHSmith":{"tags":{"name":"WHSmith","shop":"newsagent"},"name":"WHSmith","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Витебскоблсоюзпечать":{"tags":{"name":"Витебскоблсоюзпечать","shop":"newsagent"},"name":"Витебскоблсоюзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Первая полоса":{"tags":{"name":"Первая полоса","shop":"newsagent"},"name":"Первая полоса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Печать":{"tags":{"name":"Печать","shop":"newsagent"},"name":"Печать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Роспечать":{"tags":{"name":"Роспечать","shop":"newsagent"},"name":"Роспечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/newsagent/Союзпечать":{"tags":{"name":"Союзпечать","shop":"newsagent"},"name":"Союзпечать","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Alain Afflelou":{"tags":{"name":"Alain Afflelou","shop":"optician"},"name":"Alain Afflelou","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Apollo":{"tags":{"name":"Apollo","shop":"optician"},"name":"Apollo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Atol":{"tags":{"name":"Atol","shop":"optician"},"name":"Atol","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Boots Opticians":{"tags":{"name":"Boots Opticians","shop":"optician"},"name":"Boots Opticians","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Fielmann":{"tags":{"name":"Fielmann","shop":"optician"},"name":"Fielmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/General Óptica":{"tags":{"name":"General Óptica","shop":"optician"},"name":"General Óptica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Grand Optical":{"tags":{"name":"Grand Optical","shop":"optician"},"name":"Grand Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Générale d'Optique":{"tags":{"name":"Générale d'Optique","shop":"optician"},"name":"Générale d'Optique","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Hakim Optical":{"tags":{"name":"Hakim Optical","shop":"optician"},"name":"Hakim Optical","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Hans Anders":{"tags":{"name":"Hans Anders","shop":"optician"},"name":"Hans Anders","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Krys":{"tags":{"name":"Krys","shop":"optician"},"name":"Krys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Les Opticiens Mutualistes":{"tags":{"name":"Les Opticiens Mutualistes","shop":"optician"},"name":"Les Opticiens Mutualistes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optic 2000":{"tags":{"name":"Optic 2000","shop":"optician"},"name":"Optic 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optica":{"tags":{"name":"Optica","shop":"optician"},"name":"Optica","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Optical Center":{"tags":{"name":"Optical Center","shop":"optician"},"name":"Optical Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Pearle":{"tags":{"name":"Pearle","shop":"optician"},"name":"Pearle","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Pearle Vision":{"tags":{"name":"Pearle Vision","shop":"optician"},"name":"Pearle Vision","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Specsavers":{"tags":{"name":"Specsavers","shop":"optician"},"name":"Specsavers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Sunglass Hut":{"tags":{"name":"Sunglass Hut","shop":"optician"},"name":"Sunglass Hut","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Synoptik":{"tags":{"name":"Synoptik","shop":"optician"},"name":"Synoptik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/Vision Express":{"tags":{"name":"Vision Express","shop":"optician"},"name":"Vision Express","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/แว่นท็อปเจริญ":{"tags":{"name":"แว่นท็อปเจริญ","shop":"optician"},"name":"แว่นท็อปเจริญ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/メガネスーパー":{"tags":{"name":"メガネスーパー","shop":"optician"},"name":"メガネスーパー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/optician/眼鏡市場":{"tags":{"name":"眼鏡市場","shop":"optician"},"name":"眼鏡市場","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/Mountain Warehouse":{"tags":{"name":"Mountain Warehouse","shop":"outdoor"},"name":"Mountain Warehouse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/REI":{"tags":{"name":"REI","shop":"outdoor"},"name":"REI","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/outdoor/Рыболов":{"tags":{"name":"Рыболов","shop":"outdoor"},"name":"Рыболов","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Benjamin Moore":{"tags":{"name":"Benjamin Moore","shop":"paint"},"name":"Benjamin Moore","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Comex":{"tags":{"name":"Comex","shop":"paint"},"name":"Comex","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Jotun":{"tags":{"name":"Jotun","shop":"paint"},"name":"Jotun","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/National Paints":{"tags":{"name":"National Paints","shop":"paint"},"name":"National Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Sherwin Williams":{"tags":{"name":"Sherwin Williams","shop":"paint"},"name":"Sherwin Williams","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/paint/Sherwin-Williams Paints":{"tags":{"name":"Sherwin-Williams Paints","shop":"paint"},"name":"Sherwin-Williams Paints","icon":"water","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Cash Converters":{"tags":{"name":"Cash Converters","shop":"pawnbroker"},"name":"Cash Converters","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Lombard":{"tags":{"name":"Lombard","shop":"pawnbroker"},"name":"Lombard","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pawnbroker/Palawan Pawnshop":{"tags":{"name":"Palawan Pawnshop","shop":"pawnbroker"},"name":"Palawan Pawnshop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Das Futterhaus":{"tags":{"name":"Das Futterhaus","shop":"pet"},"name":"Das Futterhaus","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Fressnapf":{"tags":{"name":"Fressnapf","shop":"pet"},"name":"Fressnapf","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Global Pet Foods":{"tags":{"name":"Global Pet Foods","shop":"pet"},"name":"Global Pet Foods","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Maxi Zoo":{"tags":{"name":"Maxi Zoo","shop":"pet"},"name":"Maxi Zoo","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Pet Valu":{"tags":{"name":"Pet Valu","shop":"pet"},"name":"Pet Valu","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/PetSmart":{"tags":{"name":"PetSmart","shop":"pet"},"name":"PetSmart","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Petco":{"tags":{"name":"Petco","shop":"pet"},"name":"Petco","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Pets at Home":{"tags":{"name":"Pets at Home","shop":"pet"},"name":"Pets at Home","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Бетховен":{"tags":{"name":"Бетховен","shop":"pet"},"name":"Бетховен","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Зоотовары":{"tags":{"name":"Зоотовары","shop":"pet"},"name":"Зоотовары","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/pet/Четыре лапы":{"tags":{"name":"Четыре лапы","shop":"pet"},"name":"Четыре лапы","icon":"dog-park","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/second_hand/Goodwill":{"tags":{"name":"Goodwill","shop":"second_hand"},"name":"Goodwill","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/second_hand/Value Village":{"tags":{"name":"Value Village","shop":"second_hand"},"name":"Value Village","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours","second_hand"],"suggestion":true},"shop/shoes/Aldo":{"tags":{"name":"Aldo","shop":"shoes"},"name":"Aldo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Bata":{"tags":{"name":"Bata","shop":"shoes"},"name":"Bata","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Besson Chaussures":{"tags":{"name":"Besson Chaussures","shop":"shoes"},"name":"Besson Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Brantano":{"tags":{"name":"Brantano","shop":"shoes"},"name":"Brantano","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/CCC":{"tags":{"name":"CCC","shop":"shoes"},"name":"CCC","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Camper":{"tags":{"name":"Camper","shop":"shoes"},"name":"Camper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Chaussea":{"tags":{"name":"Chaussea","shop":"shoes"},"name":"Chaussea","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Clarks":{"tags":{"name":"Clarks","shop":"shoes"},"name":"Clarks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Converse":{"tags":{"name":"Converse","shop":"shoes"},"name":"Converse","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Crocs":{"tags":{"name":"Crocs","shop":"shoes"},"name":"Crocs","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/DSW":{"tags":{"name":"DSW","shop":"shoes"},"name":"DSW","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Deichmann":{"tags":{"name":"Deichmann","shop":"shoes"},"name":"Deichmann","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Dosenbach":{"tags":{"name":"Dosenbach","shop":"shoes"},"name":"Dosenbach","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Ecco":{"tags":{"name":"Ecco","shop":"shoes"},"name":"Ecco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Famous Footwear":{"tags":{"name":"Famous Footwear","shop":"shoes"},"name":"Famous Footwear","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Foot Locker":{"tags":{"name":"Foot Locker","shop":"shoes"},"name":"Foot Locker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Geox":{"tags":{"name":"Geox","shop":"shoes"},"name":"Geox","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Kari":{"tags":{"name":"Kari","shop":"shoes"},"name":"Kari","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/La Halle aux Chaussures":{"tags":{"name":"La Halle aux Chaussures","shop":"shoes"},"name":"La Halle aux Chaussures","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Mephisto":{"tags":{"name":"Mephisto","shop":"shoes"},"name":"Mephisto","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Minelli":{"tags":{"name":"Minelli","shop":"shoes"},"name":"Minelli","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/New Balance":{"tags":{"name":"New Balance","shop":"shoes"},"name":"New Balance","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless":{"tags":{"name":"Payless","shop":"shoes"},"name":"Payless","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless Shoe Source":{"tags":{"name":"Payless Shoe Source","shop":"shoes"},"name":"Payless Shoe Source","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Payless ShoeSource":{"tags":{"name":"Payless ShoeSource","shop":"shoes"},"name":"Payless ShoeSource","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Quick Schuh":{"tags":{"name":"Quick Schuh","shop":"shoes"},"name":"Quick Schuh","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Rack Room Shoes":{"tags":{"name":"Rack Room Shoes","shop":"shoes"},"name":"Rack Room Shoes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Reno":{"tags":{"name":"Reno","shop":"shoes"},"name":"Reno","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Rieker":{"tags":{"name":"Rieker","shop":"shoes"},"name":"Rieker","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Salamander":{"tags":{"name":"Salamander","shop":"shoes"},"name":"Salamander","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/San Marina":{"tags":{"name":"San Marina","shop":"shoes"},"name":"San Marina","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Scapino":{"tags":{"name":"Scapino","shop":"shoes"},"name":"Scapino","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Shoe Carnival":{"tags":{"name":"Shoe Carnival","shop":"shoes"},"name":"Shoe Carnival","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Shoe Zone":{"tags":{"name":"Shoe Zone","shop":"shoes"},"name":"Shoe Zone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Siemes Schuhcenter":{"tags":{"name":"Siemes Schuhcenter","shop":"shoes"},"name":"Siemes Schuhcenter","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Skechers":{"tags":{"name":"Skechers","shop":"shoes"},"name":"Skechers","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Tamaris":{"tags":{"name":"Tamaris","shop":"shoes"},"name":"Tamaris","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/vanHaren":{"tags":{"name":"vanHaren","shop":"shoes"},"name":"vanHaren","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Éram":{"tags":{"name":"Éram","shop":"shoes"},"name":"Éram","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Ремонт обуви":{"tags":{"name":"Ремонт обуви","shop":"shoes"},"name":"Ремонт обуви","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/ЦентрОбувь":{"tags":{"name":"ЦентрОбувь","shop":"shoes"},"name":"ЦентрОбувь","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/Юничел":{"tags":{"name":"Юничел","shop":"shoes"},"name":"Юничел","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/shoes/東京靴流通センター":{"tags":{"name":"東京靴流通センター","shop":"shoes"},"name":"東京靴流通センター","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Aktiesport":{"tags":{"name":"Aktiesport","shop":"sports"},"name":"Aktiesport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Big 5 Sporting Goods":{"tags":{"name":"Big 5 Sporting Goods","shop":"sports"},"name":"Big 5 Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Decathlon":{"tags":{"name":"Decathlon","shop":"sports"},"name":"Decathlon","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Dick's Sporting Goods":{"tags":{"name":"Dick's Sporting Goods","shop":"sports"},"name":"Dick's Sporting Goods","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Hervis":{"tags":{"name":"Hervis","shop":"sports"},"name":"Hervis","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Intersport":{"tags":{"name":"Intersport","shop":"sports"},"name":"Intersport","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/JD Sports":{"tags":{"name":"JD Sports","shop":"sports"},"name":"JD Sports","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sport 2000":{"tags":{"name":"Sport 2000","shop":"sports"},"name":"Sport 2000","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sports Authority":{"tags":{"name":"Sports Authority","shop":"sports"},"name":"Sports Authority","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Sports Direct":{"tags":{"name":"Sports Direct","shop":"sports"},"name":"Sports Direct","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Stadium":{"tags":{"name":"Stadium","shop":"sports"},"name":"Stadium","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спортмастер":{"tags":{"name":"Спортмастер","shop":"sports"},"name":"Спортмастер","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/sports/Спорттовары":{"tags":{"name":"Спорттовары","shop":"sports"},"name":"Спорттовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Bureau Vallée":{"tags":{"name":"Bureau Vallée","shop":"stationery"},"name":"Bureau Vallée","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Libro":{"tags":{"name":"Libro","shop":"stationery"},"name":"Libro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/McPaper":{"tags":{"name":"McPaper","shop":"stationery"},"name":"McPaper","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Office Depot":{"tags":{"name":"Office Depot","shop":"stationery"},"name":"Office Depot","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Office Max":{"tags":{"name":"Office Max","shop":"stationery"},"name":"Office Max","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Officeworks":{"tags":{"name":"Officeworks","shop":"stationery"},"name":"Officeworks","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Pagro":{"tags":{"name":"Pagro","shop":"stationery"},"name":"Pagro","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Paperchase":{"tags":{"name":"Paperchase","shop":"stationery"},"name":"Paperchase","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Ryman":{"tags":{"name":"Ryman","shop":"stationery"},"name":"Ryman","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Staples":{"tags":{"name":"Staples","shop":"stationery"},"name":"Staples","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/stationery/Канцтовары":{"tags":{"name":"Канцтовары","shop":"stationery"},"name":"Канцтовары","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/A&O":{"tags":{"name":"A&O","shop":"supermarket"},"name":"A&O","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/A101":{"tags":{"name":"A101","shop":"supermarket"},"name":"A101","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/AD Delhaize":{"tags":{"name":"AD Delhaize","shop":"supermarket"},"name":"AD Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ADEG":{"tags":{"name":"ADEG","shop":"supermarket"},"name":"ADEG","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ahorramás":{"tags":{"name":"Ahorramás","shop":"supermarket"},"name":"Ahorramás","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albert":{"tags":{"name":"Albert","shop":"supermarket"},"name":"Albert","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albert Heijn":{"tags":{"name":"Albert Heijn","shop":"supermarket"},"name":"Albert Heijn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Albertsons":{"tags":{"name":"Albertsons","shop":"supermarket"},"name":"Albertsons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi":{"tags":{"name":"Aldi","shop":"supermarket"},"name":"Aldi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi Nord":{"tags":{"name":"Aldi Nord","shop":"supermarket"},"name":"Aldi Nord","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Aldi Süd":{"tags":{"name":"Aldi Süd","shop":"supermarket"},"name":"Aldi Süd","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Alimerka":{"tags":{"name":"Alimerka","shop":"supermarket"},"name":"Alimerka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Alnatura":{"tags":{"name":"Alnatura","shop":"supermarket"},"name":"Alnatura","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Asda":{"tags":{"name":"Asda","shop":"supermarket"},"name":"Asda","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Atac":{"tags":{"name":"Atac","shop":"supermarket"},"name":"Atac","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Atacadão":{"tags":{"name":"Atacadão","shop":"supermarket"},"name":"Atacadão","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Auchan":{"tags":{"name":"Auchan","shop":"supermarket"},"name":"Auchan","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/BM":{"tags":{"name":"BM","shop":"supermarket"},"name":"BM","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Biedronka":{"tags":{"name":"Biedronka","shop":"supermarket"},"name":"Biedronka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Big C":{"tags":{"name":"Big C","shop":"supermarket"},"name":"Big C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Billa":{"tags":{"name":"Billa","shop":"supermarket"},"name":"Billa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bim":{"tags":{"name":"Bim","shop":"supermarket"},"name":"Bim","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Biocoop":{"tags":{"name":"Biocoop","shop":"supermarket"},"name":"Biocoop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bodega Aurrera":{"tags":{"name":"Bodega Aurrera","shop":"supermarket"},"name":"Bodega Aurrera","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Budgens":{"tags":{"name":"Budgens","shop":"supermarket"},"name":"Budgens","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bulk Barn":{"tags":{"name":"Bulk Barn","shop":"supermarket"},"name":"Bulk Barn","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Bunnpris":{"tags":{"name":"Bunnpris","shop":"supermarket"},"name":"Bunnpris","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/CONAD":{"tags":{"name":"CONAD","shop":"supermarket"},"name":"CONAD","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/CRAI":{"tags":{"name":"CRAI","shop":"supermarket"},"name":"CRAI","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Caprabo":{"tags":{"name":"Caprabo","shop":"supermarket"},"name":"Caprabo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Cargills Food City":{"tags":{"name":"Cargills Food City","shop":"supermarket"},"name":"Cargills Food City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour":{"tags":{"name":"Carrefour","shop":"supermarket"},"name":"Carrefour","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour City":{"tags":{"name":"Carrefour City","shop":"supermarket"},"name":"Carrefour City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour Contact":{"tags":{"name":"Carrefour Contact","shop":"supermarket"},"name":"Carrefour Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Carrefour Express":{"tags":{"name":"Carrefour Express","shop":"supermarket"},"name":"Carrefour Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Casino":{"tags":{"name":"Casino","shop":"supermarket"},"name":"Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Centre Commercial E. Leclerc":{"tags":{"name":"Centre Commercial E. Leclerc","shop":"supermarket"},"name":"Centre Commercial E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Checkers":{"tags":{"name":"Checkers","shop":"supermarket"},"name":"Checkers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Chedraui":{"tags":{"name":"Chedraui","shop":"supermarket"},"name":"Chedraui","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-Op":{"tags":{"name":"Co-Op","shop":"supermarket"},"name":"Co-Op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-op":{"tags":{"name":"Co-op","shop":"supermarket"},"name":"Co-op","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Co-operative":{"tags":{"name":"Co-operative","shop":"supermarket"},"name":"Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coles":{"tags":{"name":"Coles","shop":"supermarket"},"name":"Coles","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Colmado":{"tags":{"name":"Colmado","shop":"supermarket"},"name":"Colmado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Colruyt":{"tags":{"name":"Colruyt","shop":"supermarket"},"name":"Colruyt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Combi":{"tags":{"name":"Combi","shop":"supermarket"},"name":"Combi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Comercial Mexicana":{"tags":{"name":"Comercial Mexicana","shop":"supermarket"},"name":"Comercial Mexicana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Conad":{"tags":{"name":"Conad","shop":"supermarket"},"name":"Conad","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Conad City":{"tags":{"name":"Conad City","shop":"supermarket"},"name":"Conad City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Condis":{"tags":{"name":"Condis","shop":"supermarket"},"name":"Condis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Consum":{"tags":{"name":"Consum","shop":"supermarket"},"name":"Consum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Continente":{"tags":{"name":"Continente","shop":"supermarket"},"name":"Continente","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop":{"tags":{"name":"Coop","shop":"supermarket"},"name":"Coop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop Extra":{"tags":{"name":"Coop Extra","shop":"supermarket"},"name":"Coop Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coop Konsum":{"tags":{"name":"Coop Konsum","shop":"supermarket"},"name":"Coop Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Costco":{"tags":{"name":"Costco","shop":"supermarket"},"name":"Costco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coto":{"tags":{"name":"Coto","shop":"supermarket"},"name":"Coto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Countdown":{"tags":{"name":"Countdown","shop":"supermarket"},"name":"Countdown","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Coviran":{"tags":{"name":"Coviran","shop":"supermarket"},"name":"Coviran","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Covirán":{"tags":{"name":"Covirán","shop":"supermarket"},"name":"Covirán","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Crai":{"tags":{"name":"Crai","shop":"supermarket"},"name":"Crai","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Cub Foods":{"tags":{"name":"Cub Foods","shop":"supermarket"},"name":"Cub Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dagli'Brugsen":{"tags":{"name":"Dagli'Brugsen","shop":"supermarket"},"name":"Dagli'Brugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Deen":{"tags":{"name":"Deen","shop":"supermarket"},"name":"Deen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Delhaize":{"tags":{"name":"Delhaize","shop":"supermarket"},"name":"Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Delikatesy Centrum":{"tags":{"name":"Delikatesy Centrum","shop":"supermarket"},"name":"Delikatesy Centrum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Denner":{"tags":{"name":"Denner","shop":"supermarket"},"name":"Denner","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Despar":{"tags":{"name":"Despar","shop":"supermarket"},"name":"Despar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Despensa Familiar":{"tags":{"name":"Despensa Familiar","shop":"supermarket"},"name":"Despensa Familiar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia":{"tags":{"name":"Dia","shop":"supermarket"},"name":"Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia %":{"tags":{"name":"Dia %","shop":"supermarket"},"name":"Dia %","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dia Market":{"tags":{"name":"Dia Market","shop":"supermarket"},"name":"Dia Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dino":{"tags":{"name":"Dino","shop":"supermarket"},"name":"Dino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dirk van den Broek":{"tags":{"name":"Dirk van den Broek","shop":"supermarket"},"name":"Dirk van den Broek","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Disco":{"tags":{"name":"Disco","shop":"supermarket"},"name":"Disco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Diska":{"tags":{"name":"Diska","shop":"supermarket"},"name":"Diska","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Dunnes Stores":{"tags":{"name":"Dunnes Stores","shop":"supermarket"},"name":"Dunnes Stores","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E-Center":{"tags":{"name":"E-Center","shop":"supermarket"},"name":"E-Center","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E. Leclerc":{"tags":{"name":"E. Leclerc","shop":"supermarket"},"name":"E. Leclerc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/E. Leclerc Drive":{"tags":{"name":"E. Leclerc Drive","shop":"supermarket"},"name":"E. Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/EMTÉ":{"tags":{"name":"EMTÉ","shop":"supermarket"},"name":"EMTÉ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Edeka":{"tags":{"name":"Edeka","shop":"supermarket"},"name":"Edeka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ekom":{"tags":{"name":"Ekom","shop":"supermarket"},"name":"Ekom","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ekono":{"tags":{"name":"Ekono","shop":"supermarket"},"name":"Ekono","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/El Árbol":{"tags":{"name":"El Árbol","shop":"supermarket"},"name":"El Árbol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eroski":{"tags":{"name":"Eroski","shop":"supermarket"},"name":"Eroski","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Esselunga":{"tags":{"name":"Esselunga","shop":"supermarket"},"name":"Esselunga","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/EuroSpin":{"tags":{"name":"EuroSpin","shop":"supermarket"},"name":"EuroSpin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eurospar":{"tags":{"name":"Eurospar","shop":"supermarket"},"name":"Eurospar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Eurospin":{"tags":{"name":"Eurospin","shop":"supermarket"},"name":"Eurospin","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Extra":{"tags":{"name":"Extra","shop":"supermarket"},"name":"Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Famiglia Cooperativa":{"tags":{"name":"Famiglia Cooperativa","shop":"supermarket"},"name":"Famiglia Cooperativa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Famila":{"tags":{"name":"Famila","shop":"supermarket"},"name":"Famila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Fareway":{"tags":{"name":"Fareway","shop":"supermarket"},"name":"Fareway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Farmfoods":{"tags":{"name":"Farmfoods","shop":"supermarket"},"name":"Farmfoods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Feneberg":{"tags":{"name":"Feneberg","shop":"supermarket"},"name":"Feneberg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Food Basics":{"tags":{"name":"Food Basics","shop":"supermarket"},"name":"Food Basics","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Food Lion":{"tags":{"name":"Food Lion","shop":"supermarket"},"name":"Food Lion","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Foodland":{"tags":{"name":"Foodland","shop":"supermarket"},"name":"Foodland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Foodworks":{"tags":{"name":"Foodworks","shop":"supermarket"},"name":"Foodworks","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Franprix":{"tags":{"name":"Franprix","shop":"supermarket"},"name":"Franprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Fred Meyer":{"tags":{"name":"Fred Meyer","shop":"supermarket"},"name":"Fred Meyer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Froiz":{"tags":{"name":"Froiz","shop":"supermarket"},"name":"Froiz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Føtex":{"tags":{"name":"Føtex","shop":"supermarket"},"name":"Føtex","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/G20":{"tags":{"name":"G20","shop":"supermarket"},"name":"G20","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Gadis":{"tags":{"name":"Gadis","shop":"supermarket"},"name":"Gadis","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Giant":{"tags":{"name":"Giant","shop":"supermarket"},"name":"Giant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Giant Eagle":{"tags":{"name":"Giant Eagle","shop":"supermarket"},"name":"Giant Eagle","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Grand Frais":{"tags":{"name":"Grand Frais","shop":"supermarket"},"name":"Grand Frais","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Grocery Outlet":{"tags":{"name":"Grocery Outlet","shop":"supermarket"},"name":"Grocery Outlet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Géant Casino":{"tags":{"name":"Géant Casino","shop":"supermarket"},"name":"Géant Casino","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/H-E-B":{"tags":{"name":"H-E-B","shop":"supermarket"},"name":"H-E-B","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/HIT":{"tags":{"name":"HIT","shop":"supermarket"},"name":"HIT","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hannaford":{"tags":{"name":"Hannaford","shop":"supermarket"},"name":"Hannaford","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Harris Teeter":{"tags":{"name":"Harris Teeter","shop":"supermarket"},"name":"Harris Teeter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hemköp":{"tags":{"name":"Hemköp","shop":"supermarket"},"name":"Hemköp","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Heron Foods":{"tags":{"name":"Heron Foods","shop":"supermarket"},"name":"Heron Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hofer":{"tags":{"name":"Hofer","shop":"supermarket"},"name":"Hofer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hoogvliet":{"tags":{"name":"Hoogvliet","shop":"supermarket"},"name":"Hoogvliet","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Hy-Vee":{"tags":{"name":"Hy-Vee","shop":"supermarket"},"name":"Hy-Vee","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ICA":{"tags":{"name":"ICA","shop":"supermarket"},"name":"ICA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ICA Kvantum":{"tags":{"name":"ICA Kvantum","shop":"supermarket"},"name":"ICA Kvantum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/IDEA":{"tags":{"name":"IDEA","shop":"supermarket"},"name":"IDEA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/IGA":{"tags":{"name":"IGA","shop":"supermarket"},"name":"IGA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Iceland":{"tags":{"name":"Iceland","shop":"supermarket"},"name":"Iceland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché":{"tags":{"name":"Intermarché","shop":"supermarket"},"name":"Intermarché","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché Contact":{"tags":{"name":"Intermarché Contact","shop":"supermarket"},"name":"Intermarché Contact","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Intermarché Super":{"tags":{"name":"Intermarché Super","shop":"supermarket"},"name":"Intermarché Super","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Interspar":{"tags":{"name":"Interspar","shop":"supermarket"},"name":"Interspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Irma":{"tags":{"name":"Irma","shop":"supermarket"},"name":"Irma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Jewel-Osco":{"tags":{"name":"Jewel-Osco","shop":"supermarket"},"name":"Jewel-Osco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Jumbo":{"tags":{"name":"Jumbo","shop":"supermarket"},"name":"Jumbo","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/K+K":{"tags":{"name":"K+K","shop":"supermarket"},"name":"K+K","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kaufland":{"tags":{"name":"Kaufland","shop":"supermarket"},"name":"Kaufland","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/King Soopers":{"tags":{"name":"King Soopers","shop":"supermarket"},"name":"King Soopers","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kiwi":{"tags":{"name":"Kiwi","shop":"supermarket"},"name":"Kiwi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Konsum":{"tags":{"name":"Konsum","shop":"supermarket"},"name":"Konsum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Konzum":{"tags":{"name":"Konzum","shop":"supermarket"},"name":"Konzum","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kroger":{"tags":{"name":"Kroger","shop":"supermarket"},"name":"Kroger","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Kvickly":{"tags":{"name":"Kvickly","shop":"supermarket"},"name":"Kvickly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/La Vie Claire":{"tags":{"name":"La Vie Claire","shop":"supermarket"},"name":"La Vie Claire","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Landi":{"tags":{"name":"Landi","shop":"supermarket"},"name":"Landi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Leader Price":{"tags":{"name":"Leader Price","shop":"supermarket"},"name":"Leader Price","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Leclerc Drive":{"tags":{"name":"Leclerc Drive","shop":"supermarket"},"name":"Leclerc Drive","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lider":{"tags":{"name":"Lider","shop":"supermarket"},"name":"Lider","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lidl":{"tags":{"name":"Lidl","shop":"supermarket"},"name":"Lidl","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Lupa":{"tags":{"name":"Lupa","shop":"supermarket"},"name":"Lupa","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/MPREIS":{"tags":{"name":"MPREIS","shop":"supermarket"},"name":"MPREIS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Makro":{"tags":{"name":"Makro","shop":"supermarket"},"name":"Makro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Markant":{"tags":{"name":"Markant","shop":"supermarket"},"name":"Markant","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Market Basket":{"tags":{"name":"Market Basket","shop":"supermarket"},"name":"Market Basket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Marktkauf":{"tags":{"name":"Marktkauf","shop":"supermarket"},"name":"Marktkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Match":{"tags":{"name":"Match","shop":"supermarket"},"name":"Match","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxi":{"tags":{"name":"Maxi","shop":"supermarket"},"name":"Maxi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxi Dia":{"tags":{"name":"Maxi Dia","shop":"supermarket"},"name":"Maxi Dia","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima":{"tags":{"name":"Maxima","shop":"supermarket"},"name":"Maxima","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima X":{"tags":{"name":"Maxima X","shop":"supermarket"},"name":"Maxima X","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Maxima XX":{"tags":{"name":"Maxima XX","shop":"supermarket"},"name":"Maxima XX","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mega Image":{"tags":{"name":"Mega Image","shop":"supermarket"},"name":"Mega Image","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mego":{"tags":{"name":"Mego","shop":"supermarket"},"name":"Mego","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Meijer":{"tags":{"name":"Meijer","shop":"supermarket"},"name":"Meijer","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Meny":{"tags":{"name":"Meny","shop":"supermarket"},"name":"Meny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado":{"tags":{"name":"Mercado","shop":"supermarket"},"name":"Mercado","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado Municipal":{"tags":{"name":"Mercado Municipal","shop":"supermarket"},"name":"Mercado Municipal","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercado de Abastos":{"tags":{"name":"Mercado de Abastos","shop":"supermarket"},"name":"Mercado de Abastos","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercadona":{"tags":{"name":"Mercadona","shop":"supermarket"},"name":"Mercadona","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mercator":{"tags":{"name":"Mercator","shop":"supermarket"},"name":"Mercator","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Merkur":{"tags":{"name":"Merkur","shop":"supermarket"},"name":"Merkur","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Metro":{"tags":{"name":"Metro","shop":"supermarket"},"name":"Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Migros":{"tags":{"name":"Migros","shop":"supermarket"},"name":"Migros","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mila":{"tags":{"name":"Mila","shop":"supermarket"},"name":"Mila","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Minipreço":{"tags":{"name":"Minipreço","shop":"supermarket"},"name":"Minipreço","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Mix Markt":{"tags":{"name":"Mix Markt","shop":"supermarket"},"name":"Mix Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Monoprix":{"tags":{"name":"Monoprix","shop":"supermarket"},"name":"Monoprix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/More":{"tags":{"name":"More","shop":"supermarket"},"name":"More","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Morrisons":{"tags":{"name":"Morrisons","shop":"supermarket"},"name":"Morrisons","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/NORMA":{"tags":{"name":"NORMA","shop":"supermarket"},"name":"NORMA","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/NP":{"tags":{"name":"NP","shop":"supermarket"},"name":"NP","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Nah & Frisch":{"tags":{"name":"Nah & Frisch","shop":"supermarket"},"name":"Nah & Frisch","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Nahkauf":{"tags":{"name":"Nahkauf","shop":"supermarket"},"name":"Nahkauf","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Netto":{"tags":{"name":"Netto","shop":"supermarket"},"name":"Netto","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Netto Marken-Discount":{"tags":{"name":"Netto Marken-Discount","shop":"supermarket"},"name":"Netto Marken-Discount","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/New World":{"tags":{"name":"New World","shop":"supermarket"},"name":"New World","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/No Frills":{"tags":{"name":"No Frills","shop":"supermarket"},"name":"No Frills","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Norfa XL":{"tags":{"name":"Norfa XL","shop":"supermarket"},"name":"Norfa XL","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Norma":{"tags":{"name":"Norma","shop":"supermarket"},"name":"Norma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/PENNY":{"tags":{"name":"PENNY","shop":"supermarket"},"name":"PENNY","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/PLUS":{"tags":{"name":"PLUS","shop":"supermarket"},"name":"PLUS","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/POLOmarket":{"tags":{"name":"POLOmarket","shop":"supermarket"},"name":"POLOmarket","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Palí":{"tags":{"name":"Palí","shop":"supermarket"},"name":"Palí","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pam":{"tags":{"name":"Pam","shop":"supermarket"},"name":"Pam","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Penny":{"tags":{"name":"Penny","shop":"supermarket"},"name":"Penny","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Penny Markt":{"tags":{"name":"Penny Markt","shop":"supermarket"},"name":"Penny Markt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pick n Pay":{"tags":{"name":"Pick n Pay","shop":"supermarket"},"name":"Pick n Pay","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Piggly Wiggly":{"tags":{"name":"Piggly Wiggly","shop":"supermarket"},"name":"Piggly Wiggly","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pingo Doce":{"tags":{"name":"Pingo Doce","shop":"supermarket"},"name":"Pingo Doce","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Piotr i Paweł":{"tags":{"name":"Piotr i Paweł","shop":"supermarket"},"name":"Piotr i Paweł","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Plaza Vea":{"tags":{"name":"Plaza Vea","shop":"supermarket"},"name":"Plaza Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Plodine":{"tags":{"name":"Plodine","shop":"supermarket"},"name":"Plodine","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Poiesz":{"tags":{"name":"Poiesz","shop":"supermarket"},"name":"Poiesz","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Price Chopper":{"tags":{"name":"Price Chopper","shop":"supermarket"},"name":"Price Chopper","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Prix":{"tags":{"name":"Prix","shop":"supermarket"},"name":"Prix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Profi":{"tags":{"name":"Profi","shop":"supermarket"},"name":"Profi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Proxy Delhaize":{"tags":{"name":"Proxy Delhaize","shop":"supermarket"},"name":"Proxy Delhaize","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Publix":{"tags":{"name":"Publix","shop":"supermarket"},"name":"Publix","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Punto Simply":{"tags":{"name":"Punto Simply","shop":"supermarket"},"name":"Punto Simply","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Puregold":{"tags":{"name":"Puregold","shop":"supermarket"},"name":"Puregold","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Pão de Açúcar":{"tags":{"name":"Pão de Açúcar","shop":"supermarket"},"name":"Pão de Açúcar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/QFC":{"tags":{"name":"QFC","shop":"supermarket"},"name":"QFC","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/REMA 1000":{"tags":{"name":"REMA 1000","shop":"supermarket"},"name":"REMA 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ralphs":{"tags":{"name":"Ralphs","shop":"supermarket"},"name":"Ralphs","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Real":{"tags":{"name":"Real","shop":"supermarket"},"name":"Real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Real Canadian Superstore":{"tags":{"name":"Real Canadian Superstore","shop":"supermarket"},"name":"Real Canadian Superstore","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Reliance Fresh":{"tags":{"name":"Reliance Fresh","shop":"supermarket"},"name":"Reliance Fresh","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rema 1000":{"tags":{"name":"Rema 1000","shop":"supermarket"},"name":"Rema 1000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rewe":{"tags":{"name":"Rewe","shop":"supermarket"},"name":"Rewe","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rewe City":{"tags":{"name":"Rewe City","shop":"supermarket"},"name":"Rewe City","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Rimi":{"tags":{"name":"Rimi","shop":"supermarket"},"name":"Rimi","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/S-Market":{"tags":{"name":"S-Market","shop":"supermarket"},"name":"S-Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Safeway":{"tags":{"name":"Safeway","shop":"supermarket"},"name":"Safeway","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sainsbury's":{"tags":{"name":"Sainsbury's","shop":"supermarket"},"name":"Sainsbury's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sainsbury's Local":{"tags":{"name":"Sainsbury's Local","shop":"supermarket"},"name":"Sainsbury's Local","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sam's Club":{"tags":{"name":"Sam's Club","shop":"supermarket"},"name":"Sam's Club","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Santa Isabel":{"tags":{"name":"Santa Isabel","shop":"supermarket"},"name":"Santa Isabel","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Save-A-Lot":{"tags":{"name":"Save-A-Lot","shop":"supermarket"},"name":"Save-A-Lot","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ShopRite":{"tags":{"name":"ShopRite","shop":"supermarket"},"name":"ShopRite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Shoprite":{"tags":{"name":"Shoprite","shop":"supermarket"},"name":"Shoprite","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sigma":{"tags":{"name":"Sigma","shop":"supermarket"},"name":"Sigma","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Simply Market":{"tags":{"name":"Simply Market","shop":"supermarket"},"name":"Simply Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sky":{"tags":{"name":"Sky","shop":"supermarket"},"name":"Sky","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Smith's":{"tags":{"name":"Smith's","shop":"supermarket"},"name":"Smith's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sobeys":{"tags":{"name":"Sobeys","shop":"supermarket"},"name":"Sobeys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Soriana":{"tags":{"name":"Soriana","shop":"supermarket"},"name":"Soriana","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Spar":{"tags":{"name":"Spar","shop":"supermarket"},"name":"Spar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Sprouts Farmers Market":{"tags":{"name":"Sprouts Farmers Market","shop":"supermarket"},"name":"Sprouts Farmers Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Stokrotka":{"tags":{"name":"Stokrotka","shop":"supermarket"},"name":"Stokrotka","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Stop & Shop":{"tags":{"name":"Stop & Shop","shop":"supermarket"},"name":"Stop & Shop","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Super C":{"tags":{"name":"Super C","shop":"supermarket"},"name":"Super C","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Super U":{"tags":{"name":"Super U","shop":"supermarket"},"name":"Super U","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/SuperBrugsen":{"tags":{"name":"SuperBrugsen","shop":"supermarket"},"name":"SuperBrugsen","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/SuperValu":{"tags":{"name":"SuperValu","shop":"supermarket"},"name":"SuperValu","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Superama":{"tags":{"name":"Superama","shop":"supermarket"},"name":"Superama","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Supersol":{"tags":{"name":"Supersol","shop":"supermarket"},"name":"Supersol","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Superspar":{"tags":{"name":"Superspar","shop":"supermarket"},"name":"Superspar","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tegut":{"tags":{"name":"Tegut","shop":"supermarket"},"name":"Tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tengelmann":{"tags":{"name":"Tengelmann","shop":"supermarket"},"name":"Tengelmann","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco":{"tags":{"name":"Tesco","shop":"supermarket"},"name":"Tesco","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Extra":{"tags":{"name":"Tesco Extra","shop":"supermarket"},"name":"Tesco Extra","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Lotus":{"tags":{"name":"Tesco Lotus","shop":"supermarket"},"name":"Tesco Lotus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tesco Metro":{"tags":{"name":"Tesco Metro","shop":"supermarket"},"name":"Tesco Metro","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/The Co-operative":{"tags":{"name":"The Co-operative","shop":"supermarket"},"name":"The Co-operative","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/The Co-operative Food":{"tags":{"name":"The Co-operative Food","shop":"supermarket"},"name":"The Co-operative Food","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tommy":{"tags":{"name":"Tommy","shop":"supermarket"},"name":"Tommy","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Tottus":{"tags":{"name":"Tottus","shop":"supermarket"},"name":"Tottus","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Trader Joe's":{"tags":{"name":"Trader Joe's","shop":"supermarket"},"name":"Trader Joe's","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Treff 3000":{"tags":{"name":"Treff 3000","shop":"supermarket"},"name":"Treff 3000","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/U Express":{"tags":{"name":"U Express","shop":"supermarket"},"name":"U Express","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Unimarc":{"tags":{"name":"Unimarc","shop":"supermarket"},"name":"Unimarc","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Unimarkt":{"tags":{"name":"Unimarkt","shop":"supermarket"},"name":"Unimarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Utile":{"tags":{"name":"Utile","shop":"supermarket"},"name":"Utile","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Vea":{"tags":{"name":"Vea","shop":"supermarket"},"name":"Vea","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Volg":{"tags":{"name":"Volg","shop":"supermarket"},"name":"Volg","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Waitrose":{"tags":{"name":"Waitrose","shop":"supermarket"},"name":"Waitrose","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart":{"tags":{"name":"Walmart","shop":"supermarket"},"name":"Walmart","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart Neighborhood Market":{"tags":{"name":"Walmart Neighborhood Market","shop":"supermarket"},"name":"Walmart Neighborhood Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Walmart Supercenter":{"tags":{"name":"Walmart Supercenter","shop":"supermarket"},"name":"Walmart Supercenter","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wasgau":{"tags":{"name":"Wasgau","shop":"supermarket"},"name":"Wasgau","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wegmans":{"tags":{"name":"Wegmans","shop":"supermarket"},"name":"Wegmans","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Wellcome":{"tags":{"name":"Wellcome","shop":"supermarket"},"name":"Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Whole Foods Market":{"tags":{"name":"Whole Foods Market","shop":"supermarket"},"name":"Whole Foods Market","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Willys":{"tags":{"name":"Willys","shop":"supermarket"},"name":"Willys","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/WinCo Foods":{"tags":{"name":"WinCo Foods","shop":"supermarket"},"name":"WinCo Foods","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Winn Dixie":{"tags":{"name":"Winn Dixie","shop":"supermarket"},"name":"Winn Dixie","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Woolworths":{"tags":{"name":"Woolworths","shop":"supermarket"},"name":"Woolworths","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/denn's Biomarkt":{"tags":{"name":"denn's Biomarkt","shop":"supermarket"},"name":"denn's Biomarkt","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/fakta":{"tags":{"name":"fakta","shop":"supermarket"},"name":"fakta","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/real":{"tags":{"name":"real","shop":"supermarket"},"name":"real","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/tegut":{"tags":{"name":"tegut","shop":"supermarket"},"name":"tegut","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Şok":{"tags":{"name":"Şok","shop":"supermarket"},"name":"Şok","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ΑΒ Βασιλόπουλος":{"tags":{"name":"ΑΒ Βασιλόπουλος","shop":"supermarket"},"name":"ΑΒ Βασιλόπουλος","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Γαλαξίας":{"tags":{"name":"Γαλαξίας","shop":"supermarket"},"name":"Γαλαξίας","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Μασούτης":{"tags":{"name":"Μασούτης","shop":"supermarket"},"name":"Μασούτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Σκλαβενίτης":{"tags":{"name":"Σκλαβενίτης","shop":"supermarket"},"name":"Σκλαβενίτης","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/АТБ":{"tags":{"name":"АТБ","shop":"supermarket"},"name":"АТБ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Абсолют":{"tags":{"name":"Абсолют","shop":"supermarket"},"name":"Абсолют","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Азбука Вкуса":{"tags":{"name":"Азбука Вкуса","shop":"supermarket"},"name":"Азбука Вкуса","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Атак":{"tags":{"name":"Атак","shop":"supermarket"},"name":"Атак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Ашан":{"tags":{"name":"Ашан","shop":"supermarket"},"name":"Ашан","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Верный":{"tags":{"name":"Верный","shop":"supermarket"},"name":"Верный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Вопак":{"tags":{"name":"Вопак","shop":"supermarket"},"name":"Вопак","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Гроздь":{"tags":{"name":"Гроздь","shop":"supermarket"},"name":"Гроздь","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Десяточка":{"tags":{"name":"Десяточка","shop":"supermarket"},"name":"Десяточка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Дикси":{"tags":{"name":"Дикси","shop":"supermarket"},"name":"Дикси","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Евроопт":{"tags":{"name":"Евроопт","shop":"supermarket"},"name":"Евроопт","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Карусель":{"tags":{"name":"Карусель","shop":"supermarket"},"name":"Карусель","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Квартал":{"tags":{"name":"Квартал","shop":"supermarket"},"name":"Квартал","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Командор":{"tags":{"name":"Командор","shop":"supermarket"},"name":"Командор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Красный Яр":{"tags":{"name":"Красный Яр","shop":"supermarket"},"name":"Красный Яр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Лента":{"tags":{"name":"Лента","shop":"supermarket"},"name":"Лента","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнит":{"tags":{"name":"Магнит","shop":"supermarket"},"name":"Магнит","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Магнолия":{"tags":{"name":"Магнолия","shop":"supermarket"},"name":"Магнолия","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Монетка":{"tags":{"name":"Монетка","shop":"supermarket"},"name":"Монетка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Народная 7Я семьЯ":{"tags":{"name":"Народная 7Я семьЯ","shop":"supermarket"},"name":"Народная 7Я семьЯ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Перекресток":{"tags":{"name":"Перекресток","shop":"supermarket"},"name":"Перекресток","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Покупочка":{"tags":{"name":"Покупочка","shop":"supermarket"},"name":"Покупочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Полушка":{"tags":{"name":"Полушка","shop":"supermarket"},"name":"Полушка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Пятёрочка":{"tags":{"name":"Пятёрочка","shop":"supermarket"},"name":"Пятёрочка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Радеж":{"tags":{"name":"Радеж","shop":"supermarket"},"name":"Радеж","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Рукавичка":{"tags":{"name":"Рукавичка","shop":"supermarket"},"name":"Рукавичка","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Светофор":{"tags":{"name":"Светофор","shop":"supermarket"},"name":"Светофор","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Седьмой континент":{"tags":{"name":"Седьмой континент","shop":"supermarket"},"name":"Седьмой континент","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семейный":{"tags":{"name":"Семейный","shop":"supermarket"},"name":"Семейный","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Семья":{"tags":{"name":"Семья","shop":"supermarket"},"name":"Семья","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Супермаркет":{"tags":{"name":"Супермаркет","shop":"supermarket"},"name":"Супермаркет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Сільпо":{"tags":{"name":"Сільпо","shop":"supermarket"},"name":"Сільпо","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Таврія‑В":{"tags":{"name":"Таврія‑В","shop":"supermarket"},"name":"Таврія‑В","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фора":{"tags":{"name":"Фора","shop":"supermarket"},"name":"Фора","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Фуршет":{"tags":{"name":"Фуршет","shop":"supermarket"},"name":"Фуршет","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Хүнсний дэлгүүр":{"tags":{"name":"Хүнсний дэлгүүр","shop":"supermarket"},"name":"Хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/Эдельвейс":{"tags":{"name":"Эдельвейс","shop":"supermarket"},"name":"Эдельвейс","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/хүнсний дэлгүүр":{"tags":{"name":"хүнсний дэлгүүр","shop":"supermarket"},"name":"хүнсний дэлгүүр","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/بقالة":{"tags":{"name":"بقالة","shop":"supermarket"},"name":"بقالة","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپر مارکت":{"tags":{"name":"سوپر مارکت","shop":"supermarket"},"name":"سوپر مارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/سوپرمارکت":{"tags":{"name":"سوپرمارکت","shop":"supermarket"},"name":"سوپرمارکت","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/いなげや":{"tags":{"name":"いなげや","shop":"supermarket"},"name":"いなげや","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/まいばすけっと":{"tags":{"name":"まいばすけっと","shop":"supermarket"},"name":"まいばすけっと","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イオン":{"tags":{"name":"イオン","shop":"supermarket"},"name":"イオン","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/イトーヨーカドー":{"tags":{"name":"イトーヨーカドー","shop":"supermarket"},"name":"イトーヨーカドー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/カスミ":{"tags":{"name":"カスミ","shop":"supermarket"},"name":"カスミ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マックスバリュ":{"tags":{"name":"マックスバリュ","shop":"supermarket"},"name":"マックスバリュ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/マルエツ":{"tags":{"name":"マルエツ","shop":"supermarket"},"name":"マルエツ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/ライフ":{"tags":{"name":"ライフ","shop":"supermarket"},"name":"ライフ","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯":{"tags":{"name":"全聯","shop":"supermarket"},"name":"全聯","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/全聯福利中心":{"tags":{"name":"全聯福利中心","shop":"supermarket"},"name":"全聯福利中心","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/惠康 Wellcome":{"tags":{"name":"惠康 Wellcome","shop":"supermarket"},"name":"惠康 Wellcome","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/業務スーパー":{"tags":{"name":"業務スーパー","shop":"supermarket"},"name":"業務スーパー","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/美廉社":{"tags":{"name":"美廉社","shop":"supermarket"},"name":"美廉社","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/supermarket/西友":{"tags":{"name":"西友","shop":"supermarket"},"name":"西友","icon":"grocery","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tailor/Atelier de couture":{"tags":{"name":"Atelier de couture","shop":"tailor"},"name":"Atelier de couture","icon":"clothing-store","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tattoo/Tattoo":{"tags":{"name":"Tattoo","shop":"tattoo"},"name":"Tattoo","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Boutique Grandes Lignes":{"tags":{"name":"Boutique Grandes Lignes","shop":"ticket"},"name":"Boutique Grandes Lignes","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Guichet Transilien":{"tags":{"name":"Guichet Transilien","shop":"ticket"},"name":"Guichet Transilien","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Касса":{"tags":{"name":"Касса","shop":"ticket"},"name":"Касса","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/ticket/Проездные билеты":{"tags":{"name":"Проездные билеты","shop":"ticket"},"name":"Проездные билеты","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Dohánybolt":{"tags":{"name":"Dohánybolt","shop":"tobacco"},"name":"Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Estanco":{"tags":{"name":"Estanco","shop":"tobacco"},"name":"Estanco","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Nemzeti Dohánybolt":{"tags":{"name":"Nemzeti Dohánybolt","shop":"tobacco"},"name":"Nemzeti Dohánybolt","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Tabacos":{"tags":{"name":"Tabacos","shop":"tobacco"},"name":"Tabacos","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tobacco/Табакерка":{"tags":{"name":"Табакерка","shop":"tobacco"},"name":"Табакерка","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Dráčik":{"tags":{"name":"Dráčik","shop":"toys"},"name":"Dráčik","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Intertoys":{"tags":{"name":"Intertoys","shop":"toys"},"name":"Intertoys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/King Jouet":{"tags":{"name":"King Jouet","shop":"toys"},"name":"King Jouet","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/La Grande Récré":{"tags":{"name":"La Grande Récré","shop":"toys"},"name":"La Grande Récré","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Maxi Toys":{"tags":{"name":"Maxi Toys","shop":"toys"},"name":"Maxi Toys","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Toys R Us":{"tags":{"name":"Toys R Us","shop":"toys"},"name":"Toys R Us","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Детский мир":{"tags":{"name":"Детский мир","shop":"toys"},"name":"Детский мир","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/toys/Игрушки":{"tags":{"name":"Игрушки","shop":"toys"},"name":"Игрушки","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/D-reizen":{"tags":{"name":"D-reizen","shop":"travel_agency"},"name":"D-reizen","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/DER Reisebüro":{"tags":{"name":"DER Reisebüro","shop":"travel_agency"},"name":"DER Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/First Reisebüro":{"tags":{"name":"First Reisebüro","shop":"travel_agency"},"name":"First Reisebüro","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Flight Centre":{"tags":{"name":"Flight Centre","shop":"travel_agency"},"name":"Flight Centre","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Reiseland":{"tags":{"name":"Reiseland","shop":"travel_agency"},"name":"Reiseland","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/TUI":{"tags":{"name":"TUI","shop":"travel_agency"},"name":"TUI","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/The Co-operative Travel":{"tags":{"name":"The Co-operative Travel","shop":"travel_agency"},"name":"The Co-operative Travel","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Thomas Cook":{"tags":{"name":"Thomas Cook","shop":"travel_agency"},"name":"Thomas Cook","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/travel_agency/Thomson":{"tags":{"name":"Thomson","shop":"travel_agency"},"name":"Thomson","icon":"suitcase","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Borracharia":{"tags":{"name":"Borracharia","shop":"tyres"},"name":"Borracharia","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Bridgestone":{"tags":{"name":"Bridgestone","shop":"tyres"},"name":"Bridgestone","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Discount Tire":{"tags":{"name":"Discount Tire","shop":"tyres"},"name":"Discount Tire","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Les Schwab Tire Center":{"tags":{"name":"Les Schwab Tire Center","shop":"tyres"},"name":"Les Schwab Tire Center","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Vianor":{"tags":{"name":"Vianor","shop":"tyres"},"name":"Vianor","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Vulcanizing Shop":{"tags":{"name":"Vulcanizing Shop","shop":"tyres"},"name":"Vulcanizing Shop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/tyres/Вулканизация":{"tags":{"name":"Вулканизация","shop":"tyres"},"name":"Вулканизация","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Action":{"tags":{"name":"Action","shop":"variety_store"},"name":"Action","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Bazar":{"tags":{"name":"Bazar","shop":"variety_store"},"name":"Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Big Bazar":{"tags":{"name":"Big Bazar","shop":"variety_store"},"name":"Big Bazar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Dollar Tree":{"tags":{"name":"Dollar Tree","shop":"variety_store"},"name":"Dollar Tree","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Dollarama":{"tags":{"name":"Dollarama","shop":"variety_store"},"name":"Dollarama","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/EuroShop":{"tags":{"name":"EuroShop","shop":"variety_store"},"name":"EuroShop","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Family Dollar":{"tags":{"name":"Family Dollar","shop":"variety_store"},"name":"Family Dollar","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Fix Price":{"tags":{"name":"Fix Price","shop":"variety_store"},"name":"Fix Price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Fix price":{"tags":{"name":"Fix price","shop":"variety_store"},"name":"Fix price","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/FixPrice":{"tags":{"name":"FixPrice","shop":"variety_store"},"name":"FixPrice","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/GiFi":{"tags":{"name":"GiFi","shop":"variety_store"},"name":"GiFi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Home Bargains":{"tags":{"name":"Home Bargains","shop":"variety_store"},"name":"Home Bargains","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Mäc-Geiz":{"tags":{"name":"Mäc-Geiz","shop":"variety_store"},"name":"Mäc-Geiz","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/NOZ":{"tags":{"name":"NOZ","shop":"variety_store"},"name":"NOZ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Poundland":{"tags":{"name":"Poundland","shop":"variety_store"},"name":"Poundland","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Poundworld":{"tags":{"name":"Poundworld","shop":"variety_store"},"name":"Poundworld","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/Tedi":{"tags":{"name":"Tedi","shop":"variety_store"},"name":"Tedi","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/variety_store/ダイソー":{"tags":{"name":"ダイソー","shop":"variety_store"},"name":"ダイソー","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/Blockbuster":{"tags":{"name":"Blockbuster","shop":"video"},"name":"Blockbuster","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/Family Video":{"tags":{"name":"Family Video","shop":"video"},"name":"Family Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/TSUTAYA":{"tags":{"name":"TSUTAYA","shop":"video"},"name":"TSUTAYA","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/World of Video":{"tags":{"name":"World of Video","shop":"video"},"name":"World of Video","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video/ゲオ":{"tags":{"name":"ゲオ","shop":"video"},"name":"ゲオ","icon":"shop","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/EB Games":{"tags":{"name":"EB Games","shop":"video_games"},"name":"EB Games","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/Game":{"tags":{"name":"Game","shop":"video_games"},"name":"Game","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/GameStop":{"tags":{"name":"GameStop","shop":"video_games"},"name":"GameStop","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"shop/video_games/Micromania":{"tags":{"name":"Micromania","shop":"video_games"},"name":"Micromania","icon":"gaming","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/alpine_hut/КОШ":{"tags":{"name":"КОШ","tourism":"alpine_hut"},"name":"КОШ","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/apartment/Двухкомнатная квартира на сутки":{"tags":{"name":"Двухкомнатная квартира на сутки","tourism":"apartment"},"name":"Двухкомнатная квартира на сутки","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/attraction/Arch":{"tags":{"name":"Arch","tourism":"attraction"},"name":"Arch","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Kursächsische Postmeilensäule":{"tags":{"name":"Kursächsische Postmeilensäule","tourism":"attraction"},"name":"Kursächsische Postmeilensäule","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Lavoir":{"tags":{"name":"Lavoir","tourism":"attraction"},"name":"Lavoir","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Maibaum":{"tags":{"name":"Maibaum","tourism":"attraction"},"name":"Maibaum","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moab trail":{"tags":{"name":"Moab trail","tourism":"attraction"},"name":"Moab trail","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Moai":{"tags":{"name":"Moai","tourism":"attraction"},"name":"Moai","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/OWŚ":{"tags":{"name":"OWŚ","tourism":"attraction"},"name":"OWŚ","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Sommerrodelbahn":{"tags":{"name":"Sommerrodelbahn","tourism":"attraction"},"name":"Sommerrodelbahn","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path continues":{"tags":{"name":"path continues","tourism":"attraction"},"name":"path continues","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/path contiunes":{"tags":{"name":"path contiunes","tourism":"attraction"},"name":"path contiunes","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/white blaze":{"tags":{"name":"white blaze","tourism":"attraction"},"name":"white blaze","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Кладбище еврейское":{"tags":{"name":"Кладбище еврейское","tourism":"attraction"},"name":"Кладбище еврейское","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Колесо обозрения":{"tags":{"name":"Колесо обозрения","tourism":"attraction"},"name":"Колесо обозрения","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Приусадебный парк":{"tags":{"name":"Приусадебный парк","tourism":"attraction"},"name":"Приусадебный парк","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Усадьба":{"tags":{"name":"Усадьба","tourism":"attraction"},"name":"Усадьба","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Хозяйственный двор":{"tags":{"name":"Хозяйственный двор","tourism":"attraction"},"name":"Хозяйственный двор","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/Часовня":{"tags":{"name":"Часовня","tourism":"attraction"},"name":"Часовня","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/attraction/дольмен":{"tags":{"name":"дольмен","tourism":"attraction"},"name":"дольмен","icon":"monument","geometry":["point","vertex","area"],"fields":["name","operator","address"],"suggestion":true},"tourism/camp_site/Camping Municipal":{"tags":{"name":"Camping Municipal","tourism":"camp_site"},"name":"Camping Municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Camping municipal":{"tags":{"name":"Camping municipal","tourism":"camp_site"},"name":"Camping municipal","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/camp_site/Campsite":{"tags":{"name":"Campsite","tourism":"camp_site"},"name":"Campsite","icon":"campsite","geometry":["point","vertex","area"],"fields":["name","operator","address","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Guest House":{"tags":{"name":"Guest House","tourism":"guest_house"},"name":"Guest House","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/Home":{"tags":{"name":"Home","tourism":"guest_house"},"name":"Home","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/guest_house/OW Bielanka":{"tags":{"name":"OW Bielanka","tourism":"guest_house"},"name":"OW Bielanka","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Albergue de Peregrinos":{"tags":{"name":"Albergue de Peregrinos","tourism":"hostel"},"name":"Albergue de Peregrinos","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hospedaje":{"tags":{"name":"Hospedaje","tourism":"hostel"},"name":"Hospedaje","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hostel/Hostal":{"tags":{"name":"Hostal","tourism":"hostel"},"name":"Hostal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&B Hôtel":{"tags":{"name":"B&B Hôtel","tourism":"hotel"},"name":"B&B Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/B&b Hôtel":{"tags":{"name":"B&b Hôtel","tourism":"hotel"},"name":"B&b Hôtel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Best Western":{"tags":{"name":"Best Western","tourism":"hotel"},"name":"Best Western","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Campanile":{"tags":{"name":"Campanile","tourism":"hotel"},"name":"Campanile","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Central Hotel":{"tags":{"name":"Central Hotel","tourism":"hotel"},"name":"Central Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/City Hotel":{"tags":{"name":"City Hotel","tourism":"hotel"},"name":"City Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn":{"tags":{"name":"Comfort Inn","tourism":"hotel"},"name":"Comfort Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Inn & Suites":{"tags":{"name":"Comfort Inn & Suites","tourism":"hotel"},"name":"Comfort Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Comfort Suites":{"tags":{"name":"Comfort Suites","tourism":"hotel"},"name":"Comfort Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Country Inn & Suites":{"tags":{"name":"Country Inn & Suites","tourism":"hotel"},"name":"Country Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Courtyard by Marriott":{"tags":{"name":"Courtyard by Marriott","tourism":"hotel"},"name":"Courtyard by Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Crowne Plaza":{"tags":{"name":"Crowne Plaza","tourism":"hotel"},"name":"Crowne Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Days Inn":{"tags":{"name":"Days Inn","tourism":"hotel"},"name":"Days Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Embassy Suites":{"tags":{"name":"Embassy Suites","tourism":"hotel"},"name":"Embassy Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Extended Stay America":{"tags":{"name":"Extended Stay America","tourism":"hotel"},"name":"Extended Stay America","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn":{"tags":{"name":"Fairfield Inn","tourism":"hotel"},"name":"Fairfield Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Fairfield Inn & Suites":{"tags":{"name":"Fairfield Inn & Suites","tourism":"hotel"},"name":"Fairfield Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Formule 1":{"tags":{"name":"Formule 1","tourism":"hotel"},"name":"Formule 1","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Grand Hotel":{"tags":{"name":"Grand Hotel","tourism":"hotel"},"name":"Grand Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn":{"tags":{"name":"Hampton Inn","tourism":"hotel"},"name":"Hampton Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hampton Inn & Suites":{"tags":{"name":"Hampton Inn & Suites","tourism":"hotel"},"name":"Hampton Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hilton Garden Inn":{"tags":{"name":"Hilton Garden Inn","tourism":"hotel"},"name":"Hilton Garden Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn":{"tags":{"name":"Holiday Inn","tourism":"hotel"},"name":"Holiday Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express":{"tags":{"name":"Holiday Inn Express","tourism":"hotel"},"name":"Holiday Inn Express","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Holiday Inn Express & Suites":{"tags":{"name":"Holiday Inn Express & Suites","tourism":"hotel"},"name":"Holiday Inn Express & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Homewood Suites":{"tags":{"name":"Homewood Suites","tourism":"hotel"},"name":"Homewood Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Central":{"tags":{"name":"Hotel Central","tourism":"hotel"},"name":"Hotel Central","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Europa":{"tags":{"name":"Hotel Europa","tourism":"hotel"},"name":"Hotel Europa","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Ibis":{"tags":{"name":"Hotel Ibis","tourism":"hotel"},"name":"Hotel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Krone":{"tags":{"name":"Hotel Krone","tourism":"hotel"},"name":"Hotel Krone","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Panorama":{"tags":{"name":"Hotel Panorama","tourism":"hotel"},"name":"Hotel Panorama","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Plaza":{"tags":{"name":"Hotel Plaza","tourism":"hotel"},"name":"Hotel Plaza","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Post":{"tags":{"name":"Hotel Post","tourism":"hotel"},"name":"Hotel Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Royal":{"tags":{"name":"Hotel Royal","tourism":"hotel"},"name":"Hotel Royal","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel Victoria":{"tags":{"name":"Hotel Victoria","tourism":"hotel"},"name":"Hotel Victoria","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hotel zur Post":{"tags":{"name":"Hotel zur Post","tourism":"hotel"},"name":"Hotel zur Post","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel Ibis":{"tags":{"name":"Hôtel Ibis","tourism":"hotel"},"name":"Hôtel Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Hôtel de France":{"tags":{"name":"Hôtel de France","tourism":"hotel"},"name":"Hôtel de France","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis":{"tags":{"name":"Ibis","tourism":"hotel"},"name":"Ibis","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Budget":{"tags":{"name":"Ibis Budget","tourism":"hotel"},"name":"Ibis Budget","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ibis Styles":{"tags":{"name":"Ibis Styles","tourism":"hotel"},"name":"Ibis Styles","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Kyriad":{"tags":{"name":"Kyriad","tourism":"hotel"},"name":"Kyriad","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/La Quinta":{"tags":{"name":"La Quinta","tourism":"hotel"},"name":"La Quinta","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Marriott":{"tags":{"name":"Marriott","tourism":"hotel"},"name":"Marriott","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Mercure":{"tags":{"name":"Mercure","tourism":"hotel"},"name":"Mercure","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Novotel":{"tags":{"name":"Novotel","tourism":"hotel"},"name":"Novotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Palace Hotel":{"tags":{"name":"Palace Hotel","tourism":"hotel"},"name":"Palace Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Park Hotel":{"tags":{"name":"Park Hotel","tourism":"hotel"},"name":"Park Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Parkhotel":{"tags":{"name":"Parkhotel","tourism":"hotel"},"name":"Parkhotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Premier Inn":{"tags":{"name":"Premier Inn","tourism":"hotel"},"name":"Premier Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Première Classe":{"tags":{"name":"Première Classe","tourism":"hotel"},"name":"Première Classe","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn":{"tags":{"name":"Quality Inn","tourism":"hotel"},"name":"Quality Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Quality Inn & Suites":{"tags":{"name":"Quality Inn & Suites","tourism":"hotel"},"name":"Quality Inn & Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Ramada":{"tags":{"name":"Ramada","tourism":"hotel"},"name":"Ramada","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Residence Inn":{"tags":{"name":"Residence Inn","tourism":"hotel"},"name":"Residence Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Royal Hotel":{"tags":{"name":"Royal Hotel","tourism":"hotel"},"name":"Royal Hotel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sheraton":{"tags":{"name":"Sheraton","tourism":"hotel"},"name":"Sheraton","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Sleep Inn":{"tags":{"name":"Sleep Inn","tourism":"hotel"},"name":"Sleep Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Staybridge Suites":{"tags":{"name":"Staybridge Suites","tourism":"hotel"},"name":"Staybridge Suites","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Super 8":{"tags":{"name":"Super 8","tourism":"hotel"},"name":"Super 8","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Travelodge":{"tags":{"name":"Travelodge","tourism":"hotel"},"name":"Travelodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/Гостиница":{"tags":{"name":"Гостиница","tourism":"hotel"},"name":"Гостиница","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/hotel/東横イン":{"tags":{"name":"東横イン","tourism":"hotel"},"name":"東横イン","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Budget Inn":{"tags":{"name":"Budget Inn","tourism":"motel"},"name":"Budget Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Econo Lodge":{"tags":{"name":"Econo Lodge","tourism":"motel"},"name":"Econo Lodge","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel":{"tags":{"name":"Motel","tourism":"motel"},"name":"Motel","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Motel 6":{"tags":{"name":"Motel 6","tourism":"motel"},"name":"Motel 6","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/motel/Rodeway Inn":{"tags":{"name":"Rodeway Inn","tourism":"motel"},"name":"Rodeway Inn","icon":"lodging","geometry":["point","area"],"fields":["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],"suggestion":true},"tourism/museum/Heimatmuseum":{"tags":{"name":"Heimatmuseum","tourism":"museum"},"name":"Heimatmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Museum":{"tags":{"name":"Museum","tourism":"museum"},"name":"Museum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Stadtmuseum":{"tags":{"name":"Stadtmuseum","tourism":"museum"},"name":"Stadtmuseum","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Tájház":{"tags":{"name":"Tájház","tourism":"museum"},"name":"Tájház","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Краеведческий музей":{"tags":{"name":"Краеведческий музей","tourism":"museum"},"name":"Краеведческий музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true},"tourism/museum/Музей":{"tags":{"name":"Музей","tourism":"museum"},"name":"Музей","icon":"museum","geometry":["point","area"],"fields":["name","operator","address","building_area","opening_hours"],"suggestion":true}};
23192
23193 var defaults = {"area":["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],"line":["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],"point":["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],"vertex":["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],"relation":["category-route","category-restriction","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23194
23195 var categories = {"category-barrier":{"icon":"roadblock","geometry":"line","name":"Barrier Features","members":["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier"]},"category-building":{"icon":"building","geometry":"area","name":"Building Features","members":["building","building/house","building/apartments","building/commercial","building/industrial","building/residential"]},"category-golf":{"icon":"golf","geometry":"area","name":"Golf Features","members":["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{"icon":"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"]},"category-natural-area":{"icon":"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":"natural","geometry":"line","name":"Natural Features","members":["natural/coastline","natural/tree_row"]},"category-natural-point":{"icon":"natural","geometry":"point","name":"Natural Features","members":["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{"icon":"category-path","geometry":"line","name":"Path Features","members":["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian"]},"category-rail":{"icon":"category-rail","geometry":"line","name":"Rail Features","members":["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{"icon":"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"]},"category-road":{"icon":"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":"route","geometry":"relation","name":"Route Features","members":["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/bus","type/route/train","type/route/tram","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{"icon":"water","geometry":"area","name":"Water Features","members":["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{"icon":"category-water","geometry":"line","name":"Water Features","members":["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23196
23197 var fields = {"access_simple":{"key":"access","type":"combo","label":"Allowed Access","options":["yes","permissive","private","customers","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 permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}}},"address":{"type":"address","keys":["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],"reference":{"key":"addr"},"icon":"address","universal":true,"label":"Address","strings":{"placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward","unit":"Unit"}}},"admin_level":{"key":"admin_level","type":"number","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","label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"key":"aerialway:duration","type":"number","label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"key":"aerialway:heating","type":"check","label":"Heated"},"aerialway/occupancy":{"key":"aerialway:occupancy","type":"number","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"},"amenity":{"key":"amenity","type":"typeCombo","label":"Type"},"animal_boarding":{"key":"animal_boarding","type":"semiCombo","label":"For Animals"},"animal_breeding":{"key":"animal_breeding","type":"semiCombo","label":"For Animals"},"animal_shelter":{"key":"animal_shelter","type":"semiCombo","label":"For Animals"},"area/highway":{"key":"area:highway","type":"typeCombo","label":"Type"},"artist":{"key":"artist_name","type":"text","label":"Artist"},"artwork_type":{"key":"artwork_type","type":"combo","label":"Type"},"atm":{"key":"atm","type":"check","label":"ATM"},"backrest":{"key":"backrest","type":"check","label":"Backrest"},"barrier":{"key":"barrier","type":"typeCombo","label":"Type"},"bath/open_air":{"key":"bath:open_air","label":"Open Air","type":"check"},"bath/sand_bath":{"key":"bath:sand_bath","label":"Sand Bath","type":"check"},"bath/type":{"key":"bath:type","type":"combo","label":"Specialty","strings":{"options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}}},"beauty":{"key":"beauty","type":"combo","label":"Shop Type"},"bench":{"key":"bench","type":"check","label":"Bench"},"bicycle_parking":{"key":"bicycle_parking","type":"combo","label":"Type"},"bin":{"key":"bin","type":"check","label":"Waste Bin"},"blood_components":{"key":"blood:","type":"multiCombo","label":"Blood Components","strings":{"options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}}},"board_type":{"key":"board_type","type":"typeCombo","label":"Type"},"boundary":{"key":"boundary","type":"combo","label":"Type"},"brand":{"key":"brand","type":"text","label":"Brand"},"bridge":{"key":"bridge","type":"typeCombo","label":"Type","placeholder":"Default"},"building_area":{"key":"building","type":"combo","default":"yes","geometry":"area","label":"Building"},"building":{"key":"building","type":"combo","label":"Building"},"bunker_type":{"key":"bunker_type","type":"combo","label":"Type"},"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","label":"Capacity","placeholder":"50, 100, 200..."},"cardinal_direction":{"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"}}},"castle_type":{"key":"castle_type","type":"combo","label":"Type"},"clock_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}}},"clothes":{"key":"clothes","type":"semiCombo","label":"Clothes"},"club":{"key":"club","type":"typeCombo","label":"Type"},"collection_times":{"key":"collection_times","type":"text","label":"Collection Times"},"comment":{"key":"comment","type":"textarea","label":"Changeset Comment","placeholder":"Brief description of your contributions (required)"},"communication_multi":{"key":"communication:","type":"multiCombo","label":"Communication Types"},"construction":{"key":"construction","type":"combo","label":"Type"},"contact/webcam":{"key":"contact:webcam","type":"url","icon":"website","label":"Webcam URL","placeholder":"http://example.com/"},"content":{"key":"content","type":"combo","label":"Content"},"country":{"key":"country","type":"combo","label":"Country"},"covered":{"key":"covered","type":"check","label":"Covered"},"craft":{"key":"craft","type":"typeCombo","label":"Type"},"crane/type":{"key":"crane:type","type":"combo","label":"Crane Type","strings":{"options":{"portal_crane":"Portal Crane","floor-mounted_crane":"Floor-mounted Crane","travel_lift":"Travel Lift"}}},"crop":{"key":"crop","type":"semiCombo","label":"Crops"},"crossing":{"key":"crossing","type":"combo","label":"Type"},"cuisine":{"key":"cuisine","type":"semiCombo","label":"Cuisines"},"currency_multi":{"key":"currency:","type":"multiCombo","label":"Currency Types"},"cutting":{"key":"cutting","type":"typeCombo","label":"Type","placeholder":"Default"},"cycle_network":{"key":"cycle_network","type":"networkCombo","label":"Network"},"cycleway":{"keys":["cycleway:left","cycleway:right"],"reference":{"key":"cycleway"},"type":"cycleway","label":"Bike Lanes","placeholder":"none","strings":{"types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}}},"date":{"key":"date","type":"check","label":"Date"},"delivery":{"key":"delivery","type":"check","label":"Delivery"},"denomination":{"key":"denomination","type":"combo","label":"Denomination"},"denotation":{"key":"denotation","type":"combo","label":"Denotation"},"description":{"key":"description","type":"textarea","label":"Description","universal":true},"diaper":{"key":"diaper","type":"combo","label":"Diaper Changing Available","options":["yes","no","room","1","2","3","4","5"]},"display":{"key":"display","type":"combo","label":"Display","options":["analog","digital","sundial","unorthodox"]},"dock":{"key":"dock","type":"combo","label":"Type"},"drive_through":{"key":"drive_through","type":"check","label":"Drive-Through"},"duration":{"key":"duration","type":"text","label":"Duration","placeholder":"00:00"},"electrified":{"key":"electrified","type":"combo","label":"Electrification","placeholder":"Contact Line, Electrified Rail...","strings":{"options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}}},"elevation":{"key":"ele","type":"number","icon":"elevation","universal":true,"label":"Elevation"},"email":{"key":"email","type":"email","placeholder":"example@example.com","universal":true,"label":"Email"},"embankment":{"key":"embankment","type":"typeCombo","label":"Type","placeholder":"Default"},"emergency":{"key":"emergency","type":"check","label":"Emergency"},"entrance":{"key":"entrance","type":"typeCombo","label":"Type"},"except":{"key":"except","type":"combo","label":"Exceptions"},"fax":{"key":"fax","type":"tel","label":"Fax","universal":true,"placeholder":"+31 42 123 4567"},"fee":{"key":"fee","type":"check","label":"Fee"},"fence_type":{"key":"fence_type","type":"combo","label":"Type"},"fire_hydrant/position":{"key":"fire_hydrant:position","type":"combo","label":"Position","strings":{"options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}}},"fire_hydrant/type":{"key":"fire_hydrant:type","type":"combo","label":"Type","strings":{"options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}}},"fixme":{"key":"fixme","type":"textarea","label":"Fix Me","universal":true},"ford":{"key":"ford","type":"typeCombo","label":"Type","placeholder":"Default"},"fuel_multi":{"key":"fuel:","type":"multiCombo","label":"Fuel Types"},"fuel":{"key":"fuel","type":"combo","label":"Fuel"},"gauge":{"key":"gauge","type":"combo","label":"Gauge"},"gender":{"type":"radio","keys":["male","female","unisex"],"label":"Gender","placeholder":"Unknown","strings":{"options":{"male":"Male","female":"Female","unisex":"Unisex"}}},"generator/method":{"key":"generator:method","type":"combo","label":"Method"},"generator/output/electricity":{"key":"generator:output:electricity","type":"text","label":"Power Output","placeholder":"50 MW, 100 MW, 200 MW..."},"generator/source":{"key":"generator:source","type":"combo","label":"Source"},"generator/type":{"key":"generator:type","type":"combo","label":"Type"},"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","type":"number","label":"Height (Meters)"},"highway":{"key":"highway","type":"typeCombo","label":"Type"},"historic":{"key":"historic","type":"typeCombo","label":"Type"},"historic/civilization":{"key":"historic:civilization","type":"combo","label":"Historic Civilization"},"hoops":{"key":"hoops","type":"number","label":"Hoops","placeholder":"1, 2, 4..."},"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"},"information":{"key":"information","type":"typeCombo","label":"Type"},"inscription":{"key":"inscription","type":"textarea","label":"Inscription"},"intermittent":{"key":"intermittent","type":"check","label":"Intermittent"},"internet_access":{"key":"internet_access","type":"combo","label":"Internet Access","strings":{"options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}}},"internet_access/fee":{"key":"internet_access:fee","type":"check","label":"Internet Access Fee"},"internet_access/ssid":{"key":"internet_access:ssid","type":"text","label":"SSID (Network Name)"},"kerb":{"key":"kerb","type":"combo","label":"Curb"},"label":{"key":"label","type":"textarea","label":"Label"},"lamp_type":{"key":"lamp_type","type":"combo","label":"Type"},"landuse":{"key":"landuse","type":"typeCombo","label":"Type"},"lanes":{"key":"lanes","type":"number","label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"key":"layer","type":"number","label":"Layer","placeholder":"0"},"leaf_cycle_singular":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}}},"leaf_cycle":{"key":"leaf_cycle","type":"combo","label":"Leaf Cycle","strings":{"options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}}},"leaf_type_singular":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}}},"leaf_type":{"key":"leaf_type","type":"combo","label":"Leaf Type","strings":{"options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}}},"leisure":{"key":"leisure","type":"typeCombo","label":"Type"},"length":{"key":"length","type":"number","label":"Length (Meters)"},"level":{"key":"level","type":"combo","label":"Level","universal":true},"levels":{"key":"building:levels","type":"number","label":"Levels","placeholder":"2, 4, 6..."},"lit":{"key":"lit","type":"check","label":"Lit"},"location":{"key":"location","type":"combo","label":"Location"},"man_made":{"key":"man_made","type":"typeCombo","label":"Type"},"manhole":{"key":"manhole","type":"typeCombo","label":"Type"},"map_size":{"key":"map_size","type":"typeCombo","label":"Coverage"},"map_type":{"key":"map_type","type":"typeCombo","label":"Type"},"maxheight":{"key":"maxheight","type":"combo","label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\"","snake_case":false},"maxspeed":{"key":"maxspeed","type":"maxspeed","label":"Speed Limit","placeholder":"40, 50, 60..."},"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"},"milestone_position":{"key":"railway:position","type":"text","placeholder":"Distance to one decimal (123.4)","label":"Milestone Position"},"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"}}},"oneway":{"key":"oneway","type":"onewayCheck","label":"One Way","strings":{"options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}}},"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","label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"key":"direction","type":"combo","label":"Direction","strings":{"options":{"forward":"Forward","backward":"Backward"}}},"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"},"phone":{"key":"phone","type":"tel","icon":"telephone","universal":true,"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"key":"piste:difficulty","type":"combo","label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","strings":{"options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}}},"piste/grooming":{"key":"piste:grooming","type":"combo","label":"Grooming","strings":{"options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}}},"piste/type":{"key":"piste:type","type":"typeCombo","label":"Type","strings":{"options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}}},"place":{"key":"place","type":"typeCombo","label":"Type"},"plant":{"key":"plant","type":"combo","label":"Plant"},"plant/output/electricity":{"key":"plant:output:electricity","type":"text","label":"Power Output","placeholder":"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{"key":"baby","type":"check","label":"Baby Seat"},"playground/max_age":{"key":"max_age","type":"number","label":"Maximum Age"},"playground/min_age":{"key":"max_age","type":"number","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"},"recycling_accepts":{"key":"recycling:","type":"multiCombo","label":"Accepts"},"recycling_type":{"key":"recycling_type","default":"container","type":"combo","label":"Recycling Type","strings":{"options":{"container":"Container","centre":"Recycling 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"},"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":"restrictions","reference":{"rtype":"restriction"},"label":"Turn Restrictions"},"rooms":{"key":"rooms","type":"number","label":"Rooms"},"route_master":{"key":"route_master","type":"combo","label":"Type"},"route":{"key":"route","type":"combo","label":"Type"},"sac_scale":{"key":"sac_scale","type":"combo","label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","strings":{"options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}}},"sanitary_dump_station":{"key":"sanitary_dump_station","type":"check","label":"Toilet Disposal"},"seasonal":{"key":"seasonal","type":"check","label":"Seasonal"},"second_hand":{"key":"second_hand","type":"combo","label":"Sells Used","placeholder":"Yes, No, Only","strings":{"options":{"yes":"Yes","no":"No","only":"Only"}}},"service_rail":{"key":"service","type":"combo","label":"Service Type","strings":{"options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}}},"service_times":{"key":"service_times","type":"text","label":"Service Times"},"service":{"key":"service","type":"combo","label":"Type","options":["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{"key":"service:bicycle:","type":"multiCombo","label":"Services"},"service/vehicle":{"key":"service:vehicle:","type":"multiCombo","label":"Services"},"shelter_type":{"key":"shelter_type","type":"combo","label":"Type"},"shelter":{"key":"shelter","type":"check","label":"Shelter"},"shop":{"key":"shop","type":"typeCombo","label":"Type"},"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","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":"number","label":"Stars"},"start_date":{"key":"start_date","type":"text","universal":true,"label":"Start Date"},"step_count":{"key":"step_count","type":"number","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"},"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"},"tactile_paving":{"key":"tactile_paving","type":"check","label":"Tactile Paving"},"takeaway":{"key":"takeaway","type":"combo","label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","strings":{"options":{"yes":"Yes","no":"No","only":"Takeaway Only"}}},"toilets/disposal":{"key":"toilets:disposal","type":"combo","label":"Disposal","strings":{"options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}}},"toll":{"key":"toll","type":"check","label":"Toll"},"tomb":{"key":"tomb","type":"typeCombo","label":"Type"},"tourism_attraction":{"key":"tourism","default":"attraction","type":"typeCombo","universal":true,"label":"Tourism"},"tourism":{"key":"tourism","type":"typeCombo","label":"Type"},"tower/construction":{"key":"tower:construction","type":"combo","label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"key":"tower:type","type":"combo","label":"Type"},"tracktype":{"key":"tracktype","type":"combo","label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","strings":{"options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}}},"trade":{"key":"trade","type":"typeCombo","label":"Type"},"traffic_calming":{"key":"traffic_calming","type":"typeCombo","label":"Type"},"traffic_signals":{"key":"traffic_signals","type":"combo","label":"Type","default":"signal"},"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"}}},"trees":{"key":"trees","type":"semiCombo","label":"Trees"},"tunnel":{"key":"tunnel","type":"typeCombo","label":"Type","placeholder":"Default"},"vending":{"key":"vending","type":"combo","label":"Type 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"}}},"wall":{"key":"wall","type":"combo","label":"Type"},"water_point":{"key":"water_point","type":"check","label":"Water Point"},"water":{"key":"water","type":"combo","label":"Type"},"waterway":{"key":"waterway","type":"typeCombo","label":"Type"},"website":{"key":"website","type":"url","icon":"website","placeholder":"http://example.com/","universal":true,"label":"Website"},"wetland":{"key":"wetland","type":"combo","label":"Type"},"wheelchair":{"key":"wheelchair","type":"radio","options":["yes","limited","no"],"icon":"wheelchair","universal":true,"label":"Wheelchair Access"},"width":{"key":"width","type":"number","label":"Width (Meters)"},"wikipedia":{"key":"wikipedia","keys":["wikipedia","wikidata"],"type":"wikipedia","icon":"wikipedia","universal":true,"label":"Wikipedia"}};
23198
23199 var all = ["aerialway","airfield","airport","alcohol-shop","america-football","amusement-park","aquarium","art-gallery","attraction","bakery","bank","bar","barrier","baseball","basketball","bbq","beer","bicycle","bicycle-share","blood-bank","buddhism","building","building-alt1","bus","cafe","campsite","car","castle","cemetery","cinema","circle","circle-stroked","city","clothing-store","college","commercial","cricket","cross","dam","danger","defibrillator","dentist","doctor","dog-park","drinking-water","embassy","emergency-phone","entrance","entrance-alt1","farm","fast-food","fence","ferry","fire-station","florist","fuel","gaming","garden","garden-center","gift","golf","grocery","hairdresser","harbor","heart","heliport","home","horse-riding","hospital","ice-cream","industry","information","karaoke","landmark","landuse","laundry","library","lighthouse","lodging","logging","marker","marker-stroked","mobile-phone","monument","mountain","museum","music","natural","park","park-alt1","parking","parking-garage","pharmacy","picnic-site","pitch","place-of-worship","playground","police","post","prison","rail","rail-light","rail-metro","ranger-station","recycling","religious-christian","religious-jewish","religious-muslim","residential-community","restaurant","roadblock","rocket","school","scooter","shelter","shop","skiing","slaughterhouse","snowmobile","soccer","square","square-stroked","stadium","star","star-stroked","suitcase","sushi","swimming","teahouse","telephone","tennis","theatre","toilet","town","town-hall","triangle","triangle-stroked","veterinary","village","volcano","warehouse","waste-basket","water","wetland","wheelchair","zoo"];
23200 var all$1 = {
23201         all: all
23202 };
23203
23204 var all$2 = Object.freeze({
23205         all: all,
23206         default: all$1
23207 });
23208
23209 var Airport = ["airfield","airport","heliport","rocket"];
23210 var Dining = ["bakery","bar","beer","cafe","fast-food","ice-cream","restaurant"];
23211 var Education = ["college","school"];
23212 var General = ["alcohol-shop","amusement-park","aquarium","art-gallery","attraction","bank","bicycle","bicycle-share","car","castle","cinema","circle","circle-stroked","clothing-store","drinking-water","embassy","fire-station","fuel","grocery","harbor","information","laundry","library","lodging","marker","monument","museum","music","place-of-worship","police","post","prison","religious-christian","religious-jewish","religious-muslim","shop","stadium","star","suitcase","swimming","theatre","toilet","town-hall","triangle","triangle-stroked","veterinary"];
23213 var Health = ["dentist","doctor","hospital","pharmacy"];
23214 var Outdoors = ["campsite","cemetery","dog-park","garden","golf","park","picnic-site","playground","zoo"];
23215 var Transit = ["bus","ferry"];
23216 var streets = {
23217         Airport: Airport,
23218         Dining: Dining,
23219         Education: Education,
23220         General: General,
23221         Health: Health,
23222         Outdoors: Outdoors,
23223         Transit: Transit,
23224         "Mountain peak": ["mountain","volcano"],
23225         "Rail station": ["entrance","rail","rail-light","rail-metro"]
23226 };
23227
23228 var streets$1 = Object.freeze({
23229         Airport: Airport,
23230         Dining: Dining,
23231         Education: Education,
23232         General: General,
23233         Health: Health,
23234         Outdoors: Outdoors,
23235         Transit: Transit,
23236         default: streets
23237 });
23238
23239 var require$$0 = ( all$2 && all$1 ) || all$2;
23240
23241 var require$$1 = ( streets$1 && streets ) || streets$1;
23242
23243 var maki = {
23244   layouts: {
23245     all: require$$0,
23246     streets: require$$1
23247   }
23248 };
23249
23250 var dataFeatureIcons = maki.layouts.all.all;
23251
23252 var data = {
23253     imagery: dataImagery,
23254     presets: {
23255         presets: presets,
23256         defaults: defaults,
23257         categories: categories,
23258         fields: fields
23259     }
23260 };
23261
23262 function osmEntity$$1(attrs) {
23263     // For prototypal inheritance.
23264     if (this instanceof osmEntity$$1) return;
23265
23266     // Create the appropriate subtype.
23267     if (attrs && attrs.type) {
23268         return osmEntity$$1[attrs.type].apply(this, arguments);
23269     } else if (attrs && attrs.id) {
23270         return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
23271     }
23272
23273     // Initialize a generic Entity (used only in tests).
23274     return (new osmEntity$$1()).initialize(arguments);
23275 }
23276
23277
23278 osmEntity$$1.id = function(type) {
23279     return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
23280 };
23281
23282
23283 osmEntity$$1.id.next = {
23284     changeset: -1, node: -1, way: -1, relation: -1
23285 };
23286
23287
23288 osmEntity$$1.id.fromOSM = function(type, id) {
23289     return type[0] + id;
23290 };
23291
23292
23293 osmEntity$$1.id.toOSM = function(id) {
23294     return id.slice(1);
23295 };
23296
23297
23298 osmEntity$$1.id.type = function(id) {
23299     return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
23300 };
23301
23302
23303 // A function suitable for use as the second argument to d3.selection#data().
23304 osmEntity$$1.key = function(entity) {
23305     return entity.id + 'v' + (entity.v || 0);
23306 };
23307
23308
23309 osmEntity$$1.prototype = {
23310
23311     tags: {},
23312
23313
23314     initialize: function(sources) {
23315         for (var i = 0; i < sources.length; ++i) {
23316             var source = sources[i];
23317             for (var prop in source) {
23318                 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23319                     if (source[prop] === undefined) {
23320                         delete this[prop];
23321                     } else {
23322                         this[prop] = source[prop];
23323                     }
23324                 }
23325             }
23326         }
23327
23328         if (!this.id && this.type) {
23329             this.id = osmEntity$$1.id(this.type);
23330         }
23331         if (!this.hasOwnProperty('visible')) {
23332             this.visible = true;
23333         }
23334
23335         if (debug) {
23336             Object.freeze(this);
23337             Object.freeze(this.tags);
23338
23339             if (this.loc) Object.freeze(this.loc);
23340             if (this.nodes) Object.freeze(this.nodes);
23341             if (this.members) Object.freeze(this.members);
23342         }
23343
23344         return this;
23345     },
23346
23347
23348     copy: function(resolver, copies) {
23349         if (copies[this.id])
23350             return copies[this.id];
23351
23352         var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
23353         copies[this.id] = copy;
23354
23355         return copy;
23356     },
23357
23358
23359     osmId: function() {
23360         return osmEntity$$1.id.toOSM(this.id);
23361     },
23362
23363
23364     isNew: function() {
23365         return this.osmId() < 0;
23366     },
23367
23368
23369     update: function(attrs) {
23370         return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
23371     },
23372
23373
23374     mergeTags: function(tags) {
23375         var merged = clone(this.tags), changed = false;
23376         for (var k in tags) {
23377             var t1 = merged[k],
23378                 t2 = tags[k];
23379             if (!t1) {
23380                 changed = true;
23381                 merged[k] = t2;
23382             } else if (t1 !== t2) {
23383                 changed = true;
23384                 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
23385             }
23386         }
23387         return changed ? this.update({tags: merged}) : this;
23388     },
23389
23390
23391     intersects: function(extent, resolver) {
23392         return this.extent(resolver).intersects(extent);
23393     },
23394
23395
23396     isUsed: function(resolver) {
23397         return without(Object.keys(this.tags), 'area').length > 0 ||
23398             resolver.parentRelations(this).length > 0;
23399     },
23400
23401
23402     hasInterestingTags: function() {
23403         return keys$1(this.tags).some(osmIsInterestingTag);
23404     },
23405
23406
23407     isHighwayIntersection: function() {
23408         return false;
23409     },
23410
23411     isDegenerate: function() {
23412         return true;
23413     },
23414
23415     deprecatedTags: function() {
23416         var tags = toPairs(this.tags);
23417         var deprecated = {};
23418
23419         dataDeprecated.forEach(function(d) {
23420             var match = toPairs(d.old)[0];
23421             tags.forEach(function(t) {
23422                 if (t[0] === match[0] &&
23423                     (t[1] === match[1] || match[1] === '*')) {
23424                     deprecated[t[0]] = t[1];
23425                 }
23426             });
23427         });
23428
23429         return deprecated;
23430     }
23431 };
23432
23433 /**
23434  * A specialized version of `_.every` for arrays without support for
23435  * iteratee shorthands.
23436  *
23437  * @private
23438  * @param {Array} [array] The array to iterate over.
23439  * @param {Function} predicate The function invoked per iteration.
23440  * @returns {boolean} Returns `true` if all elements pass the predicate check,
23441  *  else `false`.
23442  */
23443 function arrayEvery(array, predicate) {
23444   var index = -1,
23445       length = array == null ? 0 : array.length;
23446
23447   while (++index < length) {
23448     if (!predicate(array[index], index, array)) {
23449       return false;
23450     }
23451   }
23452   return true;
23453 }
23454
23455 /**
23456  * The base implementation of `_.every` without support for iteratee shorthands.
23457  *
23458  * @private
23459  * @param {Array|Object} collection The collection to iterate over.
23460  * @param {Function} predicate The function invoked per iteration.
23461  * @returns {boolean} Returns `true` if all elements pass the predicate check,
23462  *  else `false`
23463  */
23464 function baseEvery(collection, predicate) {
23465   var result = true;
23466   baseEach(collection, function(value, index, collection) {
23467     result = !!predicate(value, index, collection);
23468     return result;
23469   });
23470   return result;
23471 }
23472
23473 /**
23474  * Checks if `predicate` returns truthy for **all** elements of `collection`.
23475  * Iteration is stopped once `predicate` returns falsey. The predicate is
23476  * invoked with three arguments: (value, index|key, collection).
23477  *
23478  * **Note:** This method returns `true` for
23479  * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
23480  * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
23481  * elements of empty collections.
23482  *
23483  * @static
23484  * @memberOf _
23485  * @since 0.1.0
23486  * @category Collection
23487  * @param {Array|Object} collection The collection to iterate over.
23488  * @param {Function} [predicate=_.identity] The function invoked per iteration.
23489  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23490  * @returns {boolean} Returns `true` if all elements pass the predicate check,
23491  *  else `false`.
23492  * @example
23493  *
23494  * _.every([true, 1, null, 'yes'], Boolean);
23495  * // => false
23496  *
23497  * var users = [
23498  *   { 'user': 'barney', 'age': 36, 'active': false },
23499  *   { 'user': 'fred',   'age': 40, 'active': false }
23500  * ];
23501  *
23502  * // The `_.matches` iteratee shorthand.
23503  * _.every(users, { 'user': 'barney', 'active': false });
23504  * // => false
23505  *
23506  * // The `_.matchesProperty` iteratee shorthand.
23507  * _.every(users, ['active', false]);
23508  * // => true
23509  *
23510  * // The `_.property` iteratee shorthand.
23511  * _.every(users, 'active');
23512  * // => false
23513  */
23514 function every(collection, predicate, guard) {
23515   var func = isArray(collection) ? arrayEvery : baseEvery;
23516   if (guard && isIterateeCall(collection, predicate, guard)) {
23517     predicate = undefined;
23518   }
23519   return func(collection, baseIteratee(predicate, 3));
23520 }
23521
23522 /**
23523  * The base implementation of `_.some` without support for iteratee shorthands.
23524  *
23525  * @private
23526  * @param {Array|Object} collection The collection to iterate over.
23527  * @param {Function} predicate The function invoked per iteration.
23528  * @returns {boolean} Returns `true` if any element passes the predicate check,
23529  *  else `false`.
23530  */
23531 function baseSome(collection, predicate) {
23532   var result;
23533
23534   baseEach(collection, function(value, index, collection) {
23535     result = predicate(value, index, collection);
23536     return !result;
23537   });
23538   return !!result;
23539 }
23540
23541 /**
23542  * Checks if `predicate` returns truthy for **any** element of `collection`.
23543  * Iteration is stopped once `predicate` returns truthy. The predicate is
23544  * invoked with three arguments: (value, index|key, collection).
23545  *
23546  * @static
23547  * @memberOf _
23548  * @since 0.1.0
23549  * @category Collection
23550  * @param {Array|Object} collection The collection to iterate over.
23551  * @param {Function} [predicate=_.identity] The function invoked per iteration.
23552  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23553  * @returns {boolean} Returns `true` if any element passes the predicate check,
23554  *  else `false`.
23555  * @example
23556  *
23557  * _.some([null, 0, 'yes', false], Boolean);
23558  * // => true
23559  *
23560  * var users = [
23561  *   { 'user': 'barney', 'active': true },
23562  *   { 'user': 'fred',   'active': false }
23563  * ];
23564  *
23565  * // The `_.matches` iteratee shorthand.
23566  * _.some(users, { 'user': 'barney', 'active': false });
23567  * // => false
23568  *
23569  * // The `_.matchesProperty` iteratee shorthand.
23570  * _.some(users, ['active', false]);
23571  * // => true
23572  *
23573  * // The `_.property` iteratee shorthand.
23574  * _.some(users, 'active');
23575  * // => true
23576  */
23577 function some(collection, predicate, guard) {
23578   var func = isArray(collection) ? arraySome : baseSome;
23579   if (guard && isIterateeCall(collection, predicate, guard)) {
23580     predicate = undefined;
23581   }
23582   return func(collection, baseIteratee(predicate, 3));
23583 }
23584
23585 function geoRoundCoords(c) {
23586     return [Math.floor(c[0]), Math.floor(c[1])];
23587 }
23588
23589
23590 function geoInterp(p1, p2, t) {
23591     return [p1[0] + (p2[0] - p1[0]) * t,
23592             p1[1] + (p2[1] - p1[1]) * t];
23593 }
23594
23595
23596 // 2D cross product of OA and OB vectors, i.e. z-component of their 3D cross product.
23597 // Returns a positive value, if OAB makes a counter-clockwise turn,
23598 // negative for clockwise turn, and zero if the points are collinear.
23599 function geoCross(o, a, b) {
23600     return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
23601 }
23602
23603
23604 // http://jsperf.com/id-dist-optimization
23605 function geoEuclideanDistance(a, b) {
23606     var x = a[0] - b[0], y = a[1] - b[1];
23607     return Math.sqrt((x * x) + (y * y));
23608 }
23609
23610
23611 // using WGS84 polar radius (6356752.314245179 m)
23612 // const = 2 * PI * r / 360
23613 function geoLatToMeters(dLat) {
23614     return dLat * 110946.257617;
23615 }
23616
23617
23618 // using WGS84 equatorial radius (6378137.0 m)
23619 // const = 2 * PI * r / 360
23620 function geoLonToMeters(dLon, atLat) {
23621     return Math.abs(atLat) >= 90 ? 0 :
23622         dLon * 111319.490793 * Math.abs(Math.cos(atLat * (Math.PI/180)));
23623 }
23624
23625
23626 // using WGS84 polar radius (6356752.314245179 m)
23627 // const = 2 * PI * r / 360
23628 function geoMetersToLat(m) {
23629     return m / 110946.257617;
23630 }
23631
23632
23633 // using WGS84 equatorial radius (6378137.0 m)
23634 // const = 2 * PI * r / 360
23635 function geoMetersToLon(m, atLat) {
23636     return Math.abs(atLat) >= 90 ? 0 :
23637         m / 111319.490793 / Math.abs(Math.cos(atLat * (Math.PI/180)));
23638 }
23639
23640
23641 function geoOffsetToMeters(offset) {
23642     var equatRadius = 6356752.314245179,
23643         polarRadius = 6378137.0,
23644         tileSize = 256;
23645
23646     return [
23647         offset[0] * 2 * Math.PI * equatRadius / tileSize,
23648         -offset[1] * 2 * Math.PI * polarRadius / tileSize
23649     ];
23650 }
23651
23652
23653 function geoMetersToOffset(meters) {
23654     var equatRadius = 6356752.314245179,
23655         polarRadius = 6378137.0,
23656         tileSize = 256;
23657
23658     return [
23659         meters[0] * tileSize / (2 * Math.PI * equatRadius),
23660         -meters[1] * tileSize / (2 * Math.PI * polarRadius)
23661     ];
23662 }
23663
23664
23665 // Equirectangular approximation of spherical distances on Earth
23666 function geoSphericalDistance(a, b) {
23667     var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2),
23668         y = geoLatToMeters(a[1] - b[1]);
23669     return Math.sqrt((x * x) + (y * y));
23670 }
23671
23672
23673 function geoEdgeEqual(a, b) {
23674     return (a[0] === b[0] && a[1] === b[1]) ||
23675         (a[0] === b[1] && a[1] === b[0]);
23676 }
23677
23678
23679 // Return the counterclockwise angle in the range (-pi, pi)
23680 // between the positive X axis and the line intersecting a and b.
23681 function geoAngle(a, b, projection) {
23682     a = projection(a.loc);
23683     b = projection(b.loc);
23684     return Math.atan2(b[1] - a[1], b[0] - a[0]);
23685 }
23686
23687
23688 // Rotate all points counterclockwise around a pivot point by given angle
23689 function geoRotate(points, angle, around) {
23690     return points.map(function(point) {
23691         var radial = [point[0] - around[0], point[1] - around[1]];
23692         return [
23693             radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
23694             radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
23695         ];
23696     });
23697 }
23698
23699
23700 // Choose the edge with the minimal distance from `point` to its orthogonal
23701 // projection onto that edge, if such a projection exists, or the distance to
23702 // the closest vertex on that edge. Returns an object with the `index` of the
23703 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
23704 function geoChooseEdge(nodes, point, projection) {
23705     var dist = geoEuclideanDistance,
23706         points = nodes.map(function(n) { return projection(n.loc); }),
23707         min = Infinity,
23708         idx, loc;
23709
23710     function dot(p, q) {
23711         return p[0] * q[0] + p[1] * q[1];
23712     }
23713
23714     for (var i = 0; i < points.length - 1; i++) {
23715         var o = points[i],
23716             s = [points[i + 1][0] - o[0],
23717                  points[i + 1][1] - o[1]],
23718             v = [point[0] - o[0],
23719                  point[1] - o[1]],
23720             proj = dot(v, s) / dot(s, s),
23721             p;
23722
23723         if (proj < 0) {
23724             p = o;
23725         } else if (proj > 1) {
23726             p = points[i + 1];
23727         } else {
23728             p = [o[0] + proj * s[0], o[1] + proj * s[1]];
23729         }
23730
23731         var d = dist(p, point);
23732         if (d < min) {
23733             min = d;
23734             idx = i + 1;
23735             loc = projection.invert(p);
23736         }
23737     }
23738
23739     return {
23740         index: idx,
23741         distance: min,
23742         loc: loc
23743     };
23744 }
23745
23746
23747 // Return the intersection point of 2 line segments.
23748 // From https://github.com/pgkelley4/line-segments-intersect
23749 // This uses the vector cross product approach described below:
23750 //  http://stackoverflow.com/a/565282/786339
23751 function geoLineIntersection(a, b) {
23752     function subtractPoints(point1, point2) {
23753         return [point1[0] - point2[0], point1[1] - point2[1]];
23754     }
23755     function crossProduct(point1, point2) {
23756         return point1[0] * point2[1] - point1[1] * point2[0];
23757     }
23758
23759     var p = [a[0][0], a[0][1]],
23760         p2 = [a[1][0], a[1][1]],
23761         q = [b[0][0], b[0][1]],
23762         q2 = [b[1][0], b[1][1]],
23763         r = subtractPoints(p2, p),
23764         s = subtractPoints(q2, q),
23765         uNumerator = crossProduct(subtractPoints(q, p), r),
23766         denominator = crossProduct(r, s);
23767
23768     if (uNumerator && denominator) {
23769         var u = uNumerator / denominator,
23770             t = crossProduct(subtractPoints(q, p), s) / denominator;
23771
23772         if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
23773             return geoInterp(p, p2, t);
23774         }
23775     }
23776
23777     return null;
23778 }
23779
23780
23781 function geoPathIntersections(path1, path2) {
23782     var intersections = [];
23783     for (var i = 0; i < path1.length - 1; i++) {
23784         for (var j = 0; j < path2.length - 1; j++) {
23785             var a = [ path1[i], path1[i+1] ],
23786                 b = [ path2[j], path2[j+1] ],
23787                 hit = geoLineIntersection(a, b);
23788             if (hit) intersections.push(hit);
23789         }
23790     }
23791     return intersections;
23792 }
23793
23794
23795 // Return whether point is contained in polygon.
23796 //
23797 // `point` should be a 2-item array of coordinates.
23798 // `polygon` should be an array of 2-item arrays of coordinates.
23799 //
23800 // From https://github.com/substack/point-in-polygon.
23801 // ray-casting algorithm based on
23802 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
23803 //
23804 function geoPointInPolygon(point, polygon) {
23805     var x = point[0],
23806         y = point[1],
23807         inside = false;
23808
23809     for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
23810         var xi = polygon[i][0], yi = polygon[i][1];
23811         var xj = polygon[j][0], yj = polygon[j][1];
23812
23813         var intersect = ((yi > y) !== (yj > y)) &&
23814             (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
23815         if (intersect) inside = !inside;
23816     }
23817
23818     return inside;
23819 }
23820
23821
23822 function geoPolygonContainsPolygon(outer, inner) {
23823     return every(inner, function(point) {
23824         return geoPointInPolygon(point, outer);
23825     });
23826 }
23827
23828
23829 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
23830     function testSegments(outer, inner) {
23831         for (var i = 0; i < outer.length - 1; i++) {
23832             for (var j = 0; j < inner.length - 1; j++) {
23833                 var a = [ outer[i], outer[i+1] ],
23834                     b = [ inner[j], inner[j+1] ];
23835                 if (geoLineIntersection(a, b)) return true;
23836             }
23837         }
23838         return false;
23839     }
23840
23841     function testPoints(outer, inner) {
23842         return some(inner, function(point) {
23843             return geoPointInPolygon(point, outer);
23844         });
23845     }
23846
23847    return testPoints(outer, inner) || (!!checkSegments && testSegments(outer, inner));
23848 }
23849
23850
23851 function geoPathLength(path) {
23852     var length = 0;
23853     for (var i = 0; i < path.length - 1; i++) {
23854         length += geoEuclideanDistance(path[i], path[i + 1]);
23855     }
23856     return length;
23857 }
23858
23859 function geoExtent$$1(min, max) {
23860     if (!(this instanceof geoExtent$$1)) return new geoExtent$$1(min, max);
23861     if (min instanceof geoExtent$$1) {
23862         return min;
23863     } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23864         this[0] = min[0];
23865         this[1] = min[1];
23866     } else {
23867         this[0] = min        || [ Infinity,  Infinity];
23868         this[1] = max || min || [-Infinity, -Infinity];
23869     }
23870 }
23871
23872 geoExtent$$1.prototype = new Array(2);
23873
23874 assignIn$1(geoExtent$$1.prototype, {
23875
23876     equals: function (obj) {
23877         return this[0][0] === obj[0][0] &&
23878             this[0][1] === obj[0][1] &&
23879             this[1][0] === obj[1][0] &&
23880             this[1][1] === obj[1][1];
23881     },
23882
23883
23884     extend: function(obj) {
23885         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23886         return geoExtent$$1(
23887             [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23888             [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23889         );
23890     },
23891
23892
23893     _extend: function(extent) {
23894         this[0][0] = Math.min(extent[0][0], this[0][0]);
23895         this[0][1] = Math.min(extent[0][1], this[0][1]);
23896         this[1][0] = Math.max(extent[1][0], this[1][0]);
23897         this[1][1] = Math.max(extent[1][1], this[1][1]);
23898     },
23899
23900
23901     area: function() {
23902         return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23903     },
23904
23905
23906     center: function() {
23907         return [(this[0][0] + this[1][0]) / 2,
23908                 (this[0][1] + this[1][1]) / 2];
23909     },
23910
23911
23912     rectangle: function() {
23913         return [this[0][0], this[0][1], this[1][0], this[1][1]];
23914     },
23915
23916
23917     bbox: function() {
23918         return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23919     },
23920
23921
23922     polygon: function() {
23923         return [
23924             [this[0][0], this[0][1]],
23925             [this[0][0], this[1][1]],
23926             [this[1][0], this[1][1]],
23927             [this[1][0], this[0][1]],
23928             [this[0][0], this[0][1]]
23929         ];
23930     },
23931
23932
23933     contains: function(obj) {
23934         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23935         return obj[0][0] >= this[0][0] &&
23936                obj[0][1] >= this[0][1] &&
23937                obj[1][0] <= this[1][0] &&
23938                obj[1][1] <= this[1][1];
23939     },
23940
23941
23942     intersects: function(obj) {
23943         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23944         return obj[0][0] <= this[1][0] &&
23945                obj[0][1] <= this[1][1] &&
23946                obj[1][0] >= this[0][0] &&
23947                obj[1][1] >= this[0][1];
23948     },
23949
23950
23951     intersection: function(obj) {
23952         if (!this.intersects(obj)) return new geoExtent$$1();
23953         return new geoExtent$$1(
23954             [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23955             [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23956         );
23957     },
23958
23959
23960     percentContainedIn: function(obj) {
23961         if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
23962         var a1 = this.intersection(obj).area(),
23963             a2 = this.area();
23964
23965         if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23966             return 0;
23967         } else {
23968             return a1 / a2;
23969         }
23970     },
23971
23972
23973     padByMeters: function(meters) {
23974         var dLat = geoMetersToLat(meters),
23975             dLon = geoMetersToLon(meters, this.center()[1]);
23976         return geoExtent$$1(
23977             [this[0][0] - dLon, this[0][1] - dLat],
23978             [this[1][0] + dLon, this[1][1] + dLat]
23979         );
23980     },
23981
23982
23983     toParam: function() {
23984         return this.rectangle().join(',');
23985     }
23986
23987 });
23988
23989 /*
23990     Bypasses features of D3's default projection stream pipeline that are unnecessary:
23991     * Antimeridian clipping
23992     * Spherical rotation
23993     * Resampling
23994 */
23995 function geoRawMercator() {
23996     var project = mercatorRaw,
23997         k = 512 / Math.PI, // scale
23998         x = 0, y = 0, // translate
23999         clipExtent = [[0, 0], [0, 0]];
24000
24001
24002     function projection$$1(point) {
24003         point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24004         return [point[0] * k + x, y - point[1] * k];
24005     }
24006
24007
24008     projection$$1.invert = function(point) {
24009         point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24010         return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24011     };
24012
24013
24014     projection$$1.scale = function(_) {
24015         if (!arguments.length) return k;
24016         k = +_;
24017         return projection$$1;
24018     };
24019
24020
24021     projection$$1.translate = function(_) {
24022         if (!arguments.length) return [x, y];
24023         x = +_[0];
24024         y = +_[1];
24025         return projection$$1;
24026     };
24027
24028
24029     projection$$1.clipExtent = function(_) {
24030         if (!arguments.length) return clipExtent;
24031         clipExtent = _;
24032         return projection$$1;
24033     };
24034
24035
24036     projection$$1.transform = function(_) {
24037         if (!arguments.length) return identity$7.translate(x, y).scale(k);
24038         x = +_.x;
24039         y = +_.y;
24040         k = +_.k;
24041         return projection$$1;
24042     };
24043
24044
24045     projection$$1.stream = d3_geoTransform({
24046         point: function(x, y) {
24047             x = projection$$1([x, y]);
24048             this.stream.point(x[0], x[1]);
24049         }
24050     }).stream;
24051
24052
24053     return projection$$1;
24054 }
24055
24056 function osmChangeset() {
24057     if (!(this instanceof osmChangeset)) {
24058         return (new osmChangeset()).initialize(arguments);
24059     } else if (arguments.length) {
24060         this.initialize(arguments);
24061     }
24062 }
24063
24064
24065 osmEntity$$1.changeset = osmChangeset;
24066
24067 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
24068
24069 assignIn$1(osmChangeset.prototype, {
24070
24071     type: 'changeset',
24072
24073
24074     extent: function() {
24075         return new geoExtent$$1();
24076     },
24077
24078
24079     geometry: function() {
24080         return 'changeset';
24081     },
24082
24083
24084     asJXON: function() {
24085         return {
24086             osm: {
24087                 changeset: {
24088                     tag: map$4(this.tags, function(value, key) {
24089                         return { '@k': key, '@v': value };
24090                     }),
24091                     '@version': 0.6,
24092                     '@generator': 'iD'
24093                 }
24094             }
24095         };
24096     },
24097
24098
24099     // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
24100     // XML. Returns a string.
24101     osmChangeJXON: function(changes) {
24102         var changeset_id = this.id;
24103
24104         function nest(x, order) {
24105             var groups = {};
24106             for (var i = 0; i < x.length; i++) {
24107                 var tagName = Object.keys(x[i])[0];
24108                 if (!groups[tagName]) groups[tagName] = [];
24109                 groups[tagName].push(x[i][tagName]);
24110             }
24111             var ordered = {};
24112             order.forEach(function(o) {
24113                 if (groups[o]) ordered[o] = groups[o];
24114             });
24115             return ordered;
24116         }
24117
24118
24119         // sort relations in a changeset by dependencies
24120         function sort(changes) {
24121
24122             // find a referenced relation in the current changeset
24123             function resolve(item) {
24124                 return find$1(relations, function(relation) {
24125                     return item.keyAttributes.type === 'relation'
24126                         && item.keyAttributes.ref === relation['@id'];
24127                 });
24128             }
24129
24130             // a new item is an item that has not been already processed
24131             function isNew(item) {
24132                 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
24133                     return proc['@id'] === item['@id'];
24134                 });
24135             }
24136
24137             var processing = [],
24138                 sorted = {},
24139                 relations = changes.relation;
24140
24141             if (!relations) return changes;
24142
24143             for (var i = 0; i < relations.length; i++) {
24144                 var relation = relations[i];
24145
24146                 // skip relation if already sorted
24147                 if (!sorted[relation['@id']]) {
24148                     processing.push(relation);
24149                 }
24150
24151                 while (processing.length > 0) {
24152                     var next = processing[0],
24153                     deps = filter(compact(next.member.map(resolve)), isNew);
24154                     if (deps.length === 0) {
24155                         sorted[next['@id']] = next;
24156                         processing.shift();
24157                     } else {
24158                         processing = deps.concat(processing);
24159                     }
24160                 }
24161             }
24162
24163             changes.relation = values$1(sorted);
24164             return changes;
24165         }
24166
24167         function rep(entity) {
24168             return entity.asJXON(changeset_id);
24169         }
24170
24171         return {
24172             osmChange: {
24173                 '@version': 0.6,
24174                 '@generator': 'iD',
24175                 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
24176                 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
24177                 'delete': assignIn$1(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
24178             }
24179         };
24180     },
24181
24182
24183     asGeoJSON: function() {
24184         return {};
24185     }
24186
24187 });
24188
24189 function osmNode() {
24190     if (!(this instanceof osmNode)) {
24191         return (new osmNode()).initialize(arguments);
24192     } else if (arguments.length) {
24193         this.initialize(arguments);
24194     }
24195 }
24196
24197 osmEntity$$1.node = osmNode;
24198
24199 osmNode.prototype = Object.create(osmEntity$$1.prototype);
24200
24201 assignIn$1(osmNode.prototype, {
24202
24203     type: 'node',
24204
24205
24206     extent: function() {
24207         return new geoExtent$$1(this.loc);
24208     },
24209
24210
24211     geometry: function(graph) {
24212         return graph.transient(this, 'geometry', function() {
24213             return graph.isPoi(this) ? 'point' : 'vertex';
24214         });
24215     },
24216
24217
24218     move: function(loc) {
24219         return this.update({loc: loc});
24220     },
24221
24222
24223     isDegenerate: function() {
24224         return !(
24225             Array.isArray(this.loc) && this.loc.length === 2 &&
24226             this.loc[0] >= -180 && this.loc[0] <= 180 &&
24227             this.loc[1] >= -90 && this.loc[1] <= 90
24228         );
24229     },
24230
24231
24232     isEndpoint: function(resolver) {
24233         return resolver.transient(this, 'isEndpoint', function() {
24234             var id = this.id;
24235             return resolver.parentWays(this).filter(function(parent) {
24236                 return !parent.isClosed() && !!parent.affix(id);
24237             }).length > 0;
24238         });
24239     },
24240
24241
24242     isConnected: function(resolver) {
24243         return resolver.transient(this, 'isConnected', function() {
24244             var parents = resolver.parentWays(this);
24245
24246             function isLine(entity) {
24247                 return entity.geometry(resolver) === 'line' &&
24248                     entity.hasInterestingTags();
24249             }
24250
24251             // vertex is connected to multiple parent lines
24252             if (parents.length > 1 && some(parents, isLine)) {
24253                 return true;
24254
24255             } else if (parents.length === 1) {
24256                 var way = parents[0],
24257                     nodes = way.nodes.slice();
24258                 if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
24259
24260                 // return true if vertex appears multiple times (way is self intersecting)
24261                 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
24262             }
24263
24264             return false;
24265         });
24266     },
24267
24268
24269     isIntersection: function(resolver) {
24270         return resolver.transient(this, 'isIntersection', function() {
24271             return resolver.parentWays(this).filter(function(parent) {
24272                 return (parent.tags.highway ||
24273                     parent.tags.waterway ||
24274                     parent.tags.railway ||
24275                     parent.tags.aeroway) &&
24276                     parent.geometry(resolver) === 'line';
24277             }).length > 1;
24278         });
24279     },
24280
24281
24282     isHighwayIntersection: function(resolver) {
24283         return resolver.transient(this, 'isHighwayIntersection', function() {
24284             return resolver.parentWays(this).filter(function(parent) {
24285                 return parent.tags.highway && parent.geometry(resolver) === 'line';
24286             }).length > 1;
24287         });
24288     },
24289
24290
24291     isOnAddressLine: function(resolver) {
24292         return resolver.transient(this, 'isOnAddressLine', function() {
24293             return resolver.parentWays(this).filter(function(parent) {
24294                 return parent.tags.hasOwnProperty('addr:interpolation') &&
24295                     parent.geometry(resolver) === 'line';
24296             }).length > 0;
24297         });
24298     },
24299
24300
24301     asJXON: function(changeset_id) {
24302         var r = {
24303             node: {
24304                 '@id': this.osmId(),
24305                 '@lon': this.loc[0],
24306                 '@lat': this.loc[1],
24307                 '@version': (this.version || 0),
24308                 tag: map$4(this.tags, function(v, k) {
24309                     return { keyAttributes: { k: k, v: v } };
24310                 })
24311             }
24312         };
24313         if (changeset_id) r.node['@changeset'] = changeset_id;
24314         return r;
24315     },
24316
24317
24318     asGeoJSON: function() {
24319         return {
24320             type: 'Point',
24321             coordinates: this.loc
24322         };
24323     }
24324 });
24325
24326 /** Error message constants. */
24327 var FUNC_ERROR_TEXT$1 = 'Expected a function';
24328
24329 /**
24330  * Creates a function that negates the result of the predicate `func`. The
24331  * `func` predicate is invoked with the `this` binding and arguments of the
24332  * created function.
24333  *
24334  * @static
24335  * @memberOf _
24336  * @since 3.0.0
24337  * @category Function
24338  * @param {Function} predicate The predicate to negate.
24339  * @returns {Function} Returns the new negated function.
24340  * @example
24341  *
24342  * function isEven(n) {
24343  *   return n % 2 == 0;
24344  * }
24345  *
24346  * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
24347  * // => [1, 3, 5]
24348  */
24349 function negate(predicate) {
24350   if (typeof predicate != 'function') {
24351     throw new TypeError(FUNC_ERROR_TEXT$1);
24352   }
24353   return function() {
24354     var args = arguments;
24355     switch (args.length) {
24356       case 0: return !predicate.call(this);
24357       case 1: return !predicate.call(this, args[0]);
24358       case 2: return !predicate.call(this, args[0], args[1]);
24359       case 3: return !predicate.call(this, args[0], args[1], args[2]);
24360     }
24361     return !predicate.apply(this, args);
24362   };
24363 }
24364
24365 /**
24366  * The opposite of `_.filter`; this method returns the elements of `collection`
24367  * that `predicate` does **not** return truthy for.
24368  *
24369  * @static
24370  * @memberOf _
24371  * @since 0.1.0
24372  * @category Collection
24373  * @param {Array|Object} collection The collection to iterate over.
24374  * @param {Function} [predicate=_.identity] The function invoked per iteration.
24375  * @returns {Array} Returns the new filtered array.
24376  * @see _.filter
24377  * @example
24378  *
24379  * var users = [
24380  *   { 'user': 'barney', 'age': 36, 'active': false },
24381  *   { 'user': 'fred',   'age': 40, 'active': true }
24382  * ];
24383  *
24384  * _.reject(users, function(o) { return !o.active; });
24385  * // => objects for ['fred']
24386  *
24387  * // The `_.matches` iteratee shorthand.
24388  * _.reject(users, { 'age': 40, 'active': true });
24389  * // => objects for ['barney']
24390  *
24391  * // The `_.matchesProperty` iteratee shorthand.
24392  * _.reject(users, ['active', false]);
24393  * // => objects for ['fred']
24394  *
24395  * // The `_.property` iteratee shorthand.
24396  * _.reject(users, 'active');
24397  * // => objects for ['barney']
24398  */
24399 function reject(collection, predicate) {
24400   var func = isArray(collection) ? arrayFilter : baseFilter;
24401   return func(collection, negate(baseIteratee(predicate, 3)));
24402 }
24403
24404 /**
24405  * An alternative to `_.reduce`; this method transforms `object` to a new
24406  * `accumulator` object which is the result of running each of its own
24407  * enumerable string keyed properties thru `iteratee`, with each invocation
24408  * potentially mutating the `accumulator` object. If `accumulator` is not
24409  * provided, a new object with the same `[[Prototype]]` will be used. The
24410  * iteratee is invoked with four arguments: (accumulator, value, key, object).
24411  * Iteratee functions may exit iteration early by explicitly returning `false`.
24412  *
24413  * @static
24414  * @memberOf _
24415  * @since 1.3.0
24416  * @category Object
24417  * @param {Object} object The object to iterate over.
24418  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
24419  * @param {*} [accumulator] The custom accumulator value.
24420  * @returns {*} Returns the accumulated value.
24421  * @example
24422  *
24423  * _.transform([2, 3, 4], function(result, n) {
24424  *   result.push(n *= n);
24425  *   return n % 2 == 0;
24426  * }, []);
24427  * // => [4, 9]
24428  *
24429  * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
24430  *   (result[value] || (result[value] = [])).push(key);
24431  * }, {});
24432  * // => { '1': ['a', 'c'], '2': ['b'] }
24433  */
24434 function transform$1(object, iteratee, accumulator) {
24435   var isArr = isArray(object),
24436       isArrLike = isArr || isBuffer(object) || isTypedArray(object);
24437
24438   iteratee = baseIteratee(iteratee, 4);
24439   if (accumulator == null) {
24440     var Ctor = object && object.constructor;
24441     if (isArrLike) {
24442       accumulator = isArr ? new Ctor : [];
24443     }
24444     else if (isObject(object)) {
24445       accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
24446     }
24447     else {
24448       accumulator = {};
24449     }
24450   }
24451   (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
24452     return iteratee(accumulator, value, index, object);
24453   });
24454   return accumulator;
24455 }
24456
24457 /*
24458   Order the nodes of a way in reverse order and reverse any direction dependent tags
24459   other than `oneway`. (We assume that correcting a backwards oneway is the primary
24460   reason for reversing a way.)
24461
24462   The following transforms are performed:
24463
24464     Keys:
24465           *:right=* ⟺ *:left=*
24466         *:forward=* ⟺ *:backward=*
24467        direction=up ⟺ direction=down
24468          incline=up ⟺ incline=down
24469             *=right ⟺ *=left
24470
24471     Relation members:
24472        role=forward ⟺ role=backward
24473          role=north ⟺ role=south
24474           role=east ⟺ role=west
24475
24476    In addition, numeric-valued `incline` tags are negated.
24477
24478    The JOSM implementation was used as a guide, but transformations that were of unclear benefit
24479    or adjusted tags that don't seem to be used in practice were omitted.
24480
24481    Also, each node on the way is examined for its own tags and the following transformations are performed
24482    in order to ensure associated nodes (eg a Stop Sign) is also reversed
24483
24484     Node Keys:
24485         direction=forward ⟺ direction=backward
24486         direction=left ⟺ direction=right
24487         *:forward=* ⟺ *:backward=*
24488         *:left=* ⟺ *:right=*
24489
24490    References:
24491       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
24492       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
24493       http://wiki.openstreetmap.org/wiki/Key:incline
24494       http://wiki.openstreetmap.org/wiki/Route#Members
24495       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
24496       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
24497       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
24498  */
24499 function actionReverse(wayId, options) {
24500     var replacements = [
24501             [/:right$/, ':left'], [/:left$/, ':right'],
24502             [/:forward$/, ':backward'], [/:backward$/, ':forward']
24503         ],
24504         numeric = /^([+\-]?)(?=[\d.])/,
24505         roleReversals = {
24506             forward: 'backward',
24507             backward: 'forward',
24508             north: 'south',
24509             south: 'north',
24510             east: 'west',
24511             west: 'east'
24512         };
24513
24514
24515     function reverseKey(key) {
24516         for (var i = 0; i < replacements.length; ++i) {
24517             var replacement = replacements[i];
24518             if (replacement[0].test(key)) {
24519                 return key.replace(replacement[0], replacement[1]);
24520             }
24521         }
24522         return key;
24523     }
24524
24525
24526     function reverseValue(key, value) {
24527         if (key === 'incline' && numeric.test(value)) {
24528             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
24529         } else if (key === 'incline' || key === 'direction') {
24530             return {up: 'down', down: 'up'}[value] || value;
24531         } else if (options && options.reverseOneway && key === 'oneway') {
24532             return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
24533         } else {
24534             return {left: 'right', right: 'left'}[value] || value;
24535         }
24536     }
24537
24538
24539     function reverseDirectionTags(node) {
24540         // Update the direction based tags as appropriate then return an updated node
24541         return node.update({tags: transform$1(node.tags, function(acc, tagValue, tagKey) {
24542             // See if this is a direction tag and reverse (or use existing value if not recognised)
24543             if (tagKey === 'direction') {
24544                 acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue;
24545             } else {
24546                 // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop
24547                 // This will pass through other tags unchanged
24548                 acc[reverseKey(tagKey)] = tagValue;
24549             }
24550             return acc;
24551         }, {})});
24552     }
24553
24554
24555     function reverseTagsOnNodes(graph, nodeIds) {
24556         // Reverse the direction of appropriate tags attached to the nodes (#3076)
24557         return nodeIds
24558             // Get each node from the graph
24559             .map(function(nodeId) { return graph.entity(nodeId);})
24560             // Check tags on the node, if there aren't any, we can skip
24561             .filter(function(existingNode) { return existingNode.tags !== undefined;})
24562             // Get a new version of each node with the appropriate tags reversed
24563             .map(function(existingNode) { return reverseDirectionTags(existingNode);})
24564             // Chain together consecutive updates to the graph for each updated node and return
24565             .reduce(function (accGraph, value) { return accGraph.replace(value); }, graph);
24566     }
24567
24568
24569     return function(graph) {
24570         var way = graph.entity(wayId),
24571             nodes = way.nodes.slice().reverse(),
24572             tags = {}, key, role;
24573
24574         for (key in way.tags) {
24575             tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
24576         }
24577
24578         graph.parentRelations(way).forEach(function(relation) {
24579             relation.members.forEach(function(member, index) {
24580                 if (member.id === way.id && (role = roleReversals[member.role])) {
24581                     relation = relation.updateMember({role: role}, index);
24582                     graph = graph.replace(relation);
24583                 }
24584             });
24585         });
24586
24587         // Reverse any associated directions on nodes on the way and then replace
24588         // the way itself with the reversed node ids and updated way tags
24589         return reverseTagsOnNodes(graph, nodes).replace(way.update({nodes: nodes, tags: tags}));
24590     };
24591 }
24592
24593 // For fixing up rendering of multipolygons with tags on the outer member.
24594 // https://github.com/openstreetmap/iD/issues/613
24595 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
24596     if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
24597         return false;
24598
24599     var parents = graph.parentRelations(entity);
24600     if (parents.length !== 1)
24601         return false;
24602
24603     var parent = parents[0];
24604     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
24605         return false;
24606
24607     var members = parent.members, member;
24608     for (var i = 0; i < members.length; i++) {
24609         member = members[i];
24610         if (member.id === entity.id && member.role && member.role !== 'outer')
24611             return false; // Not outer member
24612         if (member.id !== entity.id && (!member.role || member.role === 'outer'))
24613             return false; // Not a simple multipolygon
24614     }
24615
24616     return parent;
24617 }
24618
24619
24620 function osmSimpleMultipolygonOuterMember(entity, graph) {
24621     if (entity.type !== 'way')
24622         return false;
24623
24624     var parents = graph.parentRelations(entity);
24625     if (parents.length !== 1)
24626         return false;
24627
24628     var parent = parents[0];
24629     if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
24630         return false;
24631
24632     var members = parent.members, member, outerMember;
24633     for (var i = 0; i < members.length; i++) {
24634         member = members[i];
24635         if (!member.role || member.role === 'outer') {
24636             if (outerMember)
24637                 return false; // Not a simple multipolygon
24638             outerMember = member;
24639         }
24640     }
24641
24642     if (!outerMember)
24643         return false;
24644
24645     var outerEntity = graph.hasEntity(outerMember.id);
24646     if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
24647         return false;
24648
24649     return outerEntity;
24650 }
24651
24652
24653 // Join `array` into sequences of connecting ways.
24654 //
24655 // Segments which share identical start/end nodes will, as much as possible,
24656 // be connected with each other.
24657 //
24658 // The return value is a nested array. Each constituent array contains elements
24659 // of `array` which have been determined to connect. Each consitituent array
24660 // also has a `nodes` property whose value is an ordered array of member nodes,
24661 // with appropriate order reversal and start/end coordinate de-duplication.
24662 //
24663 // Members of `array` must have, at minimum, `type` and `id` properties.
24664 // Thus either an array of `osmWay`s or a relation member array may be
24665 // used.
24666 //
24667 // If an member has a `tags` property, its tags will be reversed via
24668 // `actionReverse` in the output.
24669 //
24670 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
24671 // false) and non-way members are ignored.
24672 //
24673 function osmJoinWays(array, graph) {
24674     var joined = [], member, current, nodes, first, last, i, how, what;
24675
24676     array = array.filter(function(member) {
24677         return member.type === 'way' && graph.hasEntity(member.id);
24678     });
24679
24680     function resolve(member) {
24681         return graph.childNodes(graph.entity(member.id));
24682     }
24683
24684     function reverse(member) {
24685         return member.tags ? actionReverse(member.id, { reverseOneway: true })(graph).entity(member.id) : member;
24686     }
24687
24688     while (array.length) {
24689         member = array.shift();
24690         current = [member];
24691         current.nodes = nodes = resolve(member).slice();
24692         joined.push(current);
24693
24694         while (array.length && nodes[0] !== nodes[nodes.length - 1]) {
24695             first = nodes[0];
24696             last  = nodes[nodes.length - 1];
24697
24698             for (i = 0; i < array.length; i++) {
24699                 member = array[i];
24700                 what = resolve(member);
24701
24702                 if (last === what[0]) {
24703                     how  = nodes.push;
24704                     what = what.slice(1);
24705                     break;
24706                 } else if (last === what[what.length - 1]) {
24707                     how  = nodes.push;
24708                     what = what.slice(0, -1).reverse();
24709                     member = reverse(member);
24710                     break;
24711                 } else if (first === what[what.length - 1]) {
24712                     how  = nodes.unshift;
24713                     what = what.slice(0, -1);
24714                     break;
24715                 } else if (first === what[0]) {
24716                     how  = nodes.unshift;
24717                     what = what.slice(1).reverse();
24718                     member = reverse(member);
24719                     break;
24720                 } else {
24721                     what = how = null;
24722                 }
24723             }
24724
24725             if (!what)
24726                 break; // No more joinable ways.
24727
24728             how.apply(current, [member]);
24729             how.apply(nodes, what);
24730
24731             array.splice(i, 1);
24732         }
24733     }
24734
24735     return joined;
24736 }
24737
24738 function osmRelation() {
24739     if (!(this instanceof osmRelation)) {
24740         return (new osmRelation()).initialize(arguments);
24741     } else if (arguments.length) {
24742         this.initialize(arguments);
24743     }
24744 }
24745
24746
24747 osmEntity$$1.relation = osmRelation;
24748
24749 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
24750
24751
24752 osmRelation.creationOrder = function(a, b) {
24753     var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
24754     var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
24755
24756     if (aId < 0 || bId < 0) return aId - bId;
24757     return bId - aId;
24758 };
24759
24760
24761 assignIn$1(osmRelation.prototype, {
24762     type: 'relation',
24763     members: [],
24764
24765
24766     copy: function(resolver, copies) {
24767         if (copies[this.id])
24768             return copies[this.id];
24769
24770         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
24771
24772         var members = this.members.map(function(member) {
24773             return assignIn$1({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
24774         });
24775
24776         copy = copy.update({members: members});
24777         copies[this.id] = copy;
24778
24779         return copy;
24780     },
24781
24782
24783     extent: function(resolver, memo) {
24784         return resolver.transient(this, 'extent', function() {
24785             if (memo && memo[this.id]) return geoExtent$$1();
24786             memo = memo || {};
24787             memo[this.id] = true;
24788
24789             var extent = geoExtent$$1();
24790             for (var i = 0; i < this.members.length; i++) {
24791                 var member = resolver.hasEntity(this.members[i].id);
24792                 if (member) {
24793                     extent._extend(member.extent(resolver, memo));
24794                 }
24795             }
24796             return extent;
24797         });
24798     },
24799
24800
24801     geometry: function(graph) {
24802         return graph.transient(this, 'geometry', function() {
24803             return this.isMultipolygon() ? 'area' : 'relation';
24804         });
24805     },
24806
24807
24808     isDegenerate: function() {
24809         return this.members.length === 0;
24810     },
24811
24812
24813     // Return an array of members, each extended with an 'index' property whose value
24814     // is the member index.
24815     indexedMembers: function() {
24816         var result = new Array(this.members.length);
24817         for (var i = 0; i < this.members.length; i++) {
24818             result[i] = assignIn$1({}, this.members[i], {index: i});
24819         }
24820         return result;
24821     },
24822
24823
24824     // Return the first member with the given role. A copy of the member object
24825     // is returned, extended with an 'index' property whose value is the member index.
24826     memberByRole: function(role) {
24827         for (var i = 0; i < this.members.length; i++) {
24828             if (this.members[i].role === role) {
24829                 return assignIn$1({}, this.members[i], {index: i});
24830             }
24831         }
24832     },
24833
24834
24835     // Return the first member with the given id. A copy of the member object
24836     // is returned, extended with an 'index' property whose value is the member index.
24837     memberById: function(id) {
24838         for (var i = 0; i < this.members.length; i++) {
24839             if (this.members[i].id === id) {
24840                 return assignIn$1({}, this.members[i], {index: i});
24841             }
24842         }
24843     },
24844
24845
24846     // Return the first member with the given id and role. A copy of the member object
24847     // is returned, extended with an 'index' property whose value is the member index.
24848     memberByIdAndRole: function(id, role) {
24849         for (var i = 0; i < this.members.length; i++) {
24850             if (this.members[i].id === id && this.members[i].role === role) {
24851                 return assignIn$1({}, this.members[i], {index: i});
24852             }
24853         }
24854     },
24855
24856
24857     addMember: function(member, index) {
24858         var members = this.members.slice();
24859         members.splice(index === undefined ? members.length : index, 0, member);
24860         return this.update({members: members});
24861     },
24862
24863
24864     updateMember: function(member, index) {
24865         var members = this.members.slice();
24866         members.splice(index, 1, assignIn$1({}, members[index], member));
24867         return this.update({members: members});
24868     },
24869
24870
24871     removeMember: function(index) {
24872         var members = this.members.slice();
24873         members.splice(index, 1);
24874         return this.update({members: members});
24875     },
24876
24877
24878     removeMembersWithID: function(id) {
24879         var members = reject(this.members, function(m) { return m.id === id; });
24880         return this.update({members: members});
24881     },
24882
24883
24884     // Wherever a member appears with id `needle.id`, replace it with a member
24885     // with id `replacement.id`, type `replacement.type`, and the original role,
24886     // unless a member already exists with that id and role. Return an updated
24887     // relation.
24888     replaceMember: function(needle, replacement) {
24889         if (!this.memberById(needle.id))
24890             return this;
24891
24892         var members = [];
24893
24894         for (var i = 0; i < this.members.length; i++) {
24895             var member = this.members[i];
24896             if (member.id !== needle.id) {
24897                 members.push(member);
24898             } else if (!this.memberByIdAndRole(replacement.id, member.role)) {
24899                 members.push({id: replacement.id, type: replacement.type, role: member.role});
24900             }
24901         }
24902
24903         return this.update({members: members});
24904     },
24905
24906
24907     asJXON: function(changeset_id) {
24908         var r = {
24909             relation: {
24910                 '@id': this.osmId(),
24911                 '@version': this.version || 0,
24912                 member: map$4(this.members, function(member) {
24913                     return {
24914                         keyAttributes: {
24915                             type: member.type,
24916                             role: member.role,
24917                             ref: osmEntity$$1.id.toOSM(member.id)
24918                         }
24919                     };
24920                 }),
24921                 tag: map$4(this.tags, function(v, k) {
24922                     return { keyAttributes: { k: k, v: v } };
24923                 })
24924             }
24925         };
24926         if (changeset_id) r.relation['@changeset'] = changeset_id;
24927         return r;
24928     },
24929
24930
24931     asGeoJSON: function(resolver) {
24932         return resolver.transient(this, 'GeoJSON', function () {
24933             if (this.isMultipolygon()) {
24934                 return {
24935                     type: 'MultiPolygon',
24936                     coordinates: this.multipolygon(resolver)
24937                 };
24938             } else {
24939                 return {
24940                     type: 'FeatureCollection',
24941                     properties: this.tags,
24942                     features: this.members.map(function (member) {
24943                         return assignIn$1({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
24944                     })
24945                 };
24946             }
24947         });
24948     },
24949
24950
24951     area: function(resolver) {
24952         return resolver.transient(this, 'area', function() {
24953             return d3_geoArea(this.asGeoJSON(resolver));
24954         });
24955     },
24956
24957
24958     isMultipolygon: function() {
24959         return this.tags.type === 'multipolygon';
24960     },
24961
24962
24963     isComplete: function(resolver) {
24964         for (var i = 0; i < this.members.length; i++) {
24965             if (!resolver.hasEntity(this.members[i].id)) {
24966                 return false;
24967             }
24968         }
24969         return true;
24970     },
24971
24972
24973     isRestriction: function() {
24974         return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
24975     },
24976
24977
24978     // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
24979     // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
24980     //
24981     // This corresponds to the structure needed for rendering a multipolygon path using a
24982     // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
24983     //
24984     // In the case of invalid geometries, this function will still return a result which
24985     // includes the nodes of all way members, but some Nds may be unclosed and some inner
24986     // rings not matched with the intended outer ring.
24987     //
24988     multipolygon: function(resolver) {
24989         var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); }),
24990             inners = this.members.filter(function(m) { return 'inner' === m.role; });
24991
24992         outers = osmJoinWays(outers, resolver);
24993         inners = osmJoinWays(inners, resolver);
24994
24995         outers = outers.map(function(outer) { return map$4(outer.nodes, 'loc'); });
24996         inners = inners.map(function(inner) { return map$4(inner.nodes, 'loc'); });
24997
24998         var result = outers.map(function(o) {
24999             // Heuristic for detecting counterclockwise winding order. Assumes
25000             // that OpenStreetMap polygons are not hemisphere-spanning.
25001             return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
25002         });
25003
25004         function findOuter(inner) {
25005             var o, outer;
25006
25007             for (o = 0; o < outers.length; o++) {
25008                 outer = outers[o];
25009                 if (geoPolygonContainsPolygon(outer, inner))
25010                     return o;
25011             }
25012
25013             for (o = 0; o < outers.length; o++) {
25014                 outer = outers[o];
25015                 if (geoPolygonIntersectsPolygon(outer, inner, false))
25016                     return o;
25017             }
25018         }
25019
25020         for (var i = 0; i < inners.length; i++) {
25021             var inner = inners[i];
25022
25023             if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
25024                 inner = inner.reverse();
25025             }
25026
25027             var o = findOuter(inners[i]);
25028             if (o !== undefined)
25029                 result[o].push(inners[i]);
25030             else
25031                 result.push([inners[i]]); // Invalid geometry
25032         }
25033
25034         return result;
25035     }
25036 });
25037
25038 /**
25039  * Creates a duplicate-free version of an array, using
25040  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25041  * for equality comparisons, in which only the first occurrence of each element
25042  * is kept. The order of result values is determined by the order they occur
25043  * in the array.
25044  *
25045  * @static
25046  * @memberOf _
25047  * @since 0.1.0
25048  * @category Array
25049  * @param {Array} array The array to inspect.
25050  * @returns {Array} Returns the new duplicate free array.
25051  * @example
25052  *
25053  * _.uniq([2, 1, 2]);
25054  * // => [2, 1]
25055  */
25056 function uniq(array) {
25057   return (array && array.length) ? baseUniq(array) : [];
25058 }
25059
25060 /** `Object#toString` result references. */
25061 var numberTag$4 = '[object Number]';
25062
25063 /**
25064  * Checks if `value` is classified as a `Number` primitive or object.
25065  *
25066  * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25067  * classified as numbers, use the `_.isFinite` method.
25068  *
25069  * @static
25070  * @memberOf _
25071  * @since 0.1.0
25072  * @category Lang
25073  * @param {*} value The value to check.
25074  * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25075  * @example
25076  *
25077  * _.isNumber(3);
25078  * // => true
25079  *
25080  * _.isNumber(Number.MIN_VALUE);
25081  * // => true
25082  *
25083  * _.isNumber(Infinity);
25084  * // => true
25085  *
25086  * _.isNumber('3');
25087  * // => false
25088  */
25089 function isNumber(value) {
25090   return typeof value == 'number' ||
25091     (isObjectLike(value) && baseGetTag(value) == numberTag$4);
25092 }
25093
25094 /** `Object#toString` result references. */
25095 var stringTag$4 = '[object String]';
25096
25097 /**
25098  * Checks if `value` is classified as a `String` primitive or object.
25099  *
25100  * @static
25101  * @since 0.1.0
25102  * @memberOf _
25103  * @category Lang
25104  * @param {*} value The value to check.
25105  * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25106  * @example
25107  *
25108  * _.isString('abc');
25109  * // => true
25110  *
25111  * _.isString(1);
25112  * // => false
25113  */
25114 function isString(value) {
25115   return typeof value == 'string' ||
25116     (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
25117 }
25118
25119 /**
25120  * Checks if `value` is `NaN`.
25121  *
25122  * **Note:** This method is based on
25123  * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25124  * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25125  * `undefined` and other non-number values.
25126  *
25127  * @static
25128  * @memberOf _
25129  * @since 0.1.0
25130  * @category Lang
25131  * @param {*} value The value to check.
25132  * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25133  * @example
25134  *
25135  * _.isNaN(NaN);
25136  * // => true
25137  *
25138  * _.isNaN(new Number(NaN));
25139  * // => true
25140  *
25141  * isNaN(undefined);
25142  * // => true
25143  *
25144  * _.isNaN(undefined);
25145  * // => false
25146  */
25147 function isNaN$1(value) {
25148   // An `NaN` primitive is the only value that is not equal to itself.
25149   // Perform the `toStringTag` check first to avoid errors with some
25150   // ActiveX objects in IE.
25151   return isNumber(value) && value != +value;
25152 }
25153
25154 function osmLanes(entity) {
25155     if (entity.type !== 'way') return null;
25156     if (!entity.tags.highway) return null;
25157
25158     var tags = entity.tags;
25159     var isOneWay = entity.isOneWay();
25160     var laneCount = getLaneCount(tags, isOneWay);
25161     var maxspeed = parseMaxspeed(tags);
25162
25163     var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
25164     var forward = laneDirections.forward;
25165     var backward = laneDirections.backward;
25166     var bothways = laneDirections.bothways;
25167
25168     // parse the piped string 'x|y|z' format
25169     var turnLanes = {};
25170     turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
25171     turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
25172     turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
25173
25174     var maxspeedLanes = {};
25175     maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
25176     maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
25177     maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
25178
25179     var psvLanes = {};
25180     psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
25181     psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
25182     psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
25183
25184     var busLanes = {};
25185     busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
25186     busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
25187     busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
25188
25189     var taxiLanes = {};
25190     taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
25191     taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
25192     taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
25193
25194     var hovLanes = {};
25195     hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
25196     hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
25197     hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
25198
25199     var hgvLanes = {};
25200     hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
25201     hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
25202     hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
25203
25204     var bicyclewayLanes = {};
25205     bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
25206     bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
25207     bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
25208
25209     var lanesObj = {
25210         forward: [],
25211         backward: [],
25212         unspecified: []
25213     };
25214
25215     // map forward/backward/unspecified of each lane type to lanesObj
25216     mapToLanesObj(lanesObj, turnLanes, 'turnLane');
25217     mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
25218     mapToLanesObj(lanesObj, psvLanes, 'psv');
25219     mapToLanesObj(lanesObj, busLanes, 'bus');
25220     mapToLanesObj(lanesObj, taxiLanes, 'taxi');
25221     mapToLanesObj(lanesObj, hovLanes, 'hov');
25222     mapToLanesObj(lanesObj, hgvLanes, 'hgv');
25223     mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
25224
25225     return {
25226         metadata: {
25227             count: laneCount,
25228             oneway: isOneWay,
25229             forward: forward,
25230             backward: backward,
25231             bothways: bothways,
25232             turnLanes: turnLanes,
25233             maxspeed: maxspeed,
25234             maxspeedLanes: maxspeedLanes,
25235             psvLanes: psvLanes,
25236             busLanes: busLanes,
25237             taxiLanes: taxiLanes,
25238             hovLanes: hovLanes,
25239             hgvLanes: hgvLanes,
25240             bicyclewayLanes: bicyclewayLanes
25241         },
25242         lanes: lanesObj
25243     };
25244 }
25245
25246
25247 function getLaneCount(tags, isOneWay) {
25248     var count;
25249     if (tags.lanes) {
25250         count = parseInt(tags.lanes, 10);
25251         if (count > 0) {
25252             return count;
25253         }
25254     }
25255
25256
25257     switch (tags.highway) {
25258         case 'trunk':
25259         case 'motorway':
25260             count = isOneWay ? 2 : 4;
25261             break;
25262         default:
25263             count = isOneWay ? 1 : 2;
25264             break;
25265     }
25266
25267     return count;
25268 }
25269
25270
25271 function parseMaxspeed(tags) {
25272     var maxspeed = tags.maxspeed;
25273     if (isNumber(maxspeed)) return maxspeed;
25274     if (isString(maxspeed)) {
25275         maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
25276         if (!maxspeed) return;
25277         return parseInt(maxspeed, 10);
25278     }
25279 }
25280
25281
25282 function parseLaneDirections(tags, isOneWay, laneCount) {
25283     var forward = parseInt(tags['lanes:forward'], 10);
25284     var backward = parseInt(tags['lanes:backward'], 10);
25285     var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
25286
25287     if (parseInt(tags.oneway, 10) === -1) {
25288         forward = 0;
25289         bothways = 0;
25290         backward = laneCount;
25291     }
25292     else if (isOneWay) {
25293         forward = laneCount;
25294         bothways = 0;
25295         backward = 0;
25296     }
25297     else if (isNaN$1(forward) && isNaN$1(backward)) {
25298         backward = Math.floor((laneCount - bothways) / 2);
25299         forward = laneCount - bothways - backward;
25300     }
25301     else if (isNaN$1(forward)) {
25302         if (backward > laneCount - bothways) {
25303             backward = laneCount - bothways;
25304         }
25305         forward = laneCount - bothways - backward;
25306     }
25307     else if (isNaN$1(backward)) {
25308         if (forward > laneCount - bothways) {
25309             forward = laneCount - bothways;
25310         }
25311         backward = laneCount - bothways - forward;
25312     }
25313     return {
25314         forward: forward,
25315         backward: backward,
25316         bothways: bothways
25317     };
25318 }
25319
25320
25321 function parseTurnLanes(tag){
25322     if (!tag) return;
25323
25324     var validValues = [
25325         'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
25326         'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
25327     ];
25328
25329     return tag.split('|')
25330         .map(function (s) {
25331             if (s === '') s = 'none';
25332             return s.split(';')
25333                 .map(function (d) {
25334                     return validValues.indexOf(d) === -1 ? 'unknown': d;
25335                 });
25336         });
25337 }
25338
25339
25340 function parseMaxspeedLanes(tag, maxspeed) {
25341     if (!tag) return;
25342
25343     return tag.split('|')
25344         .map(function (s) {
25345             if (s === 'none') return s;
25346             var m = parseInt(s, 10);
25347             if (s === '' || m === maxspeed) return null;
25348             return isNaN$1(m) ? 'unknown': m;
25349         });
25350 }
25351
25352
25353 function parseMiscLanes(tag) {
25354     if (!tag) return;
25355
25356     var validValues = [
25357         'yes', 'no', 'designated'
25358     ];
25359
25360     return tag.split('|')
25361         .map(function (s) {
25362             if (s === '') s = 'no';
25363             return validValues.indexOf(s) === -1 ? 'unknown': s;
25364         });
25365 }
25366
25367
25368 function parseBicycleWay(tag) {
25369     if (!tag) return;
25370
25371     var validValues = [
25372         'yes', 'no', 'designated', 'lane'
25373     ];
25374
25375     return tag.split('|')
25376         .map(function (s) {
25377             if (s === '') s = 'no';
25378             return validValues.indexOf(s) === -1 ? 'unknown': s;
25379         });
25380 }
25381
25382
25383 function mapToLanesObj(lanesObj, data, key) {
25384     if (data.forward) data.forward.forEach(function(l, i) {
25385         if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
25386         lanesObj.forward[i][key] = l;
25387     });
25388     if (data.backward) data.backward.forEach(function(l, i) {
25389         if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
25390         lanesObj.backward[i][key] = l;
25391     });
25392     if (data.unspecified) data.unspecified.forEach(function(l, i) {
25393         if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
25394         lanesObj.unspecified[i][key] = l;
25395     });
25396 }
25397
25398 /** Used to compose bitmasks for cloning. */
25399 var CLONE_DEEP_FLAG$3 = 1;
25400 var CLONE_SYMBOLS_FLAG$2 = 4;
25401
25402 /**
25403  * This method is like `_.clone` except that it recursively clones `value`.
25404  *
25405  * @static
25406  * @memberOf _
25407  * @since 1.0.0
25408  * @category Lang
25409  * @param {*} value The value to recursively clone.
25410  * @returns {*} Returns the deep cloned value.
25411  * @see _.clone
25412  * @example
25413  *
25414  * var objects = [{ 'a': 1 }, { 'b': 2 }];
25415  *
25416  * var deep = _.cloneDeep(objects);
25417  * console.log(deep[0] === objects[0]);
25418  * // => false
25419  */
25420 function cloneDeep(value) {
25421   return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$2);
25422 }
25423
25424 /**
25425  * Gets the timestamp of the number of milliseconds that have elapsed since
25426  * the Unix epoch (1 January 1970 00:00:00 UTC).
25427  *
25428  * @static
25429  * @memberOf _
25430  * @since 2.4.0
25431  * @category Date
25432  * @returns {number} Returns the timestamp.
25433  * @example
25434  *
25435  * _.defer(function(stamp) {
25436  *   console.log(_.now() - stamp);
25437  * }, _.now());
25438  * // => Logs the number of milliseconds it took for the deferred invocation.
25439  */
25440 var now$1 = function() {
25441   return root$2.Date.now();
25442 };
25443
25444 /** Error message constants. */
25445 var FUNC_ERROR_TEXT$2 = 'Expected a function';
25446
25447 /* Built-in method references for those with the same name as other `lodash` methods. */
25448 var nativeMax$2 = Math.max;
25449 var nativeMin = Math.min;
25450
25451 /**
25452  * Creates a debounced function that delays invoking `func` until after `wait`
25453  * milliseconds have elapsed since the last time the debounced function was
25454  * invoked. The debounced function comes with a `cancel` method to cancel
25455  * delayed `func` invocations and a `flush` method to immediately invoke them.
25456  * Provide `options` to indicate whether `func` should be invoked on the
25457  * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
25458  * with the last arguments provided to the debounced function. Subsequent
25459  * calls to the debounced function return the result of the last `func`
25460  * invocation.
25461  *
25462  * **Note:** If `leading` and `trailing` options are `true`, `func` is
25463  * invoked on the trailing edge of the timeout only if the debounced function
25464  * is invoked more than once during the `wait` timeout.
25465  *
25466  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
25467  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
25468  *
25469  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
25470  * for details over the differences between `_.debounce` and `_.throttle`.
25471  *
25472  * @static
25473  * @memberOf _
25474  * @since 0.1.0
25475  * @category Function
25476  * @param {Function} func The function to debounce.
25477  * @param {number} [wait=0] The number of milliseconds to delay.
25478  * @param {Object} [options={}] The options object.
25479  * @param {boolean} [options.leading=false]
25480  *  Specify invoking on the leading edge of the timeout.
25481  * @param {number} [options.maxWait]
25482  *  The maximum time `func` is allowed to be delayed before it's invoked.
25483  * @param {boolean} [options.trailing=true]
25484  *  Specify invoking on the trailing edge of the timeout.
25485  * @returns {Function} Returns the new debounced function.
25486  * @example
25487  *
25488  * // Avoid costly calculations while the window size is in flux.
25489  * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
25490  *
25491  * // Invoke `sendMail` when clicked, debouncing subsequent calls.
25492  * jQuery(element).on('click', _.debounce(sendMail, 300, {
25493  *   'leading': true,
25494  *   'trailing': false
25495  * }));
25496  *
25497  * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
25498  * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
25499  * var source = new EventSource('/stream');
25500  * jQuery(source).on('message', debounced);
25501  *
25502  * // Cancel the trailing debounced invocation.
25503  * jQuery(window).on('popstate', debounced.cancel);
25504  */
25505 function debounce$1(func, wait, options) {
25506   var lastArgs,
25507       lastThis,
25508       maxWait,
25509       result,
25510       timerId,
25511       lastCallTime,
25512       lastInvokeTime = 0,
25513       leading = false,
25514       maxing = false,
25515       trailing = true;
25516
25517   if (typeof func != 'function') {
25518     throw new TypeError(FUNC_ERROR_TEXT$2);
25519   }
25520   wait = toNumber(wait) || 0;
25521   if (isObject(options)) {
25522     leading = !!options.leading;
25523     maxing = 'maxWait' in options;
25524     maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
25525     trailing = 'trailing' in options ? !!options.trailing : trailing;
25526   }
25527
25528   function invokeFunc(time) {
25529     var args = lastArgs,
25530         thisArg = lastThis;
25531
25532     lastArgs = lastThis = undefined;
25533     lastInvokeTime = time;
25534     result = func.apply(thisArg, args);
25535     return result;
25536   }
25537
25538   function leadingEdge(time) {
25539     // Reset any `maxWait` timer.
25540     lastInvokeTime = time;
25541     // Start the timer for the trailing edge.
25542     timerId = setTimeout(timerExpired, wait);
25543     // Invoke the leading edge.
25544     return leading ? invokeFunc(time) : result;
25545   }
25546
25547   function remainingWait(time) {
25548     var timeSinceLastCall = time - lastCallTime,
25549         timeSinceLastInvoke = time - lastInvokeTime,
25550         result = wait - timeSinceLastCall;
25551
25552     return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
25553   }
25554
25555   function shouldInvoke(time) {
25556     var timeSinceLastCall = time - lastCallTime,
25557         timeSinceLastInvoke = time - lastInvokeTime;
25558
25559     // Either this is the first call, activity has stopped and we're at the
25560     // trailing edge, the system time has gone backwards and we're treating
25561     // it as the trailing edge, or we've hit the `maxWait` limit.
25562     return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
25563       (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
25564   }
25565
25566   function timerExpired() {
25567     var time = now$1();
25568     if (shouldInvoke(time)) {
25569       return trailingEdge(time);
25570     }
25571     // Restart the timer.
25572     timerId = setTimeout(timerExpired, remainingWait(time));
25573   }
25574
25575   function trailingEdge(time) {
25576     timerId = undefined;
25577
25578     // Only invoke if we have `lastArgs` which means `func` has been
25579     // debounced at least once.
25580     if (trailing && lastArgs) {
25581       return invokeFunc(time);
25582     }
25583     lastArgs = lastThis = undefined;
25584     return result;
25585   }
25586
25587   function cancel() {
25588     if (timerId !== undefined) {
25589       clearTimeout(timerId);
25590     }
25591     lastInvokeTime = 0;
25592     lastArgs = lastCallTime = lastThis = timerId = undefined;
25593   }
25594
25595   function flush() {
25596     return timerId === undefined ? result : trailingEdge(now$1());
25597   }
25598
25599   function debounced() {
25600     var time = now$1(),
25601         isInvoking = shouldInvoke(time);
25602
25603     lastArgs = arguments;
25604     lastThis = this;
25605     lastCallTime = time;
25606
25607     if (isInvoking) {
25608       if (timerId === undefined) {
25609         return leadingEdge(lastCallTime);
25610       }
25611       if (maxing) {
25612         // Handle invocations in a tight loop.
25613         timerId = setTimeout(timerExpired, wait);
25614         return invokeFunc(lastCallTime);
25615       }
25616     }
25617     if (timerId === undefined) {
25618       timerId = setTimeout(timerExpired, wait);
25619     }
25620     return result;
25621   }
25622   debounced.cancel = cancel;
25623   debounced.flush = flush;
25624   return debounced;
25625 }
25626
25627 /**
25628  * Casts `value` to `identity` if it's not a function.
25629  *
25630  * @private
25631  * @param {*} value The value to inspect.
25632  * @returns {Function} Returns cast function.
25633  */
25634 function castFunction(value) {
25635   return typeof value == 'function' ? value : identity$8;
25636 }
25637
25638 /**
25639  * Iterates over elements of `collection` and invokes `iteratee` for each element.
25640  * The iteratee is invoked with three arguments: (value, index|key, collection).
25641  * Iteratee functions may exit iteration early by explicitly returning `false`.
25642  *
25643  * **Note:** As with other "Collections" methods, objects with a "length"
25644  * property are iterated like arrays. To avoid this behavior use `_.forIn`
25645  * or `_.forOwn` for object iteration.
25646  *
25647  * @static
25648  * @memberOf _
25649  * @since 0.1.0
25650  * @alias each
25651  * @category Collection
25652  * @param {Array|Object} collection The collection to iterate over.
25653  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25654  * @returns {Array|Object} Returns `collection`.
25655  * @see _.forEachRight
25656  * @example
25657  *
25658  * _.forEach([1, 2], function(value) {
25659  *   console.log(value);
25660  * });
25661  * // => Logs `1` then `2`.
25662  *
25663  * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
25664  *   console.log(key);
25665  * });
25666  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25667  */
25668 function forEach(collection, iteratee) {
25669   var func = isArray(collection) ? arrayEach : baseEach;
25670   return func(collection, castFunction(iteratee));
25671 }
25672
25673 /**
25674  * Iterates over own enumerable string keyed properties of an object and
25675  * invokes `iteratee` for each property. The iteratee is invoked with three
25676  * arguments: (value, key, object). Iteratee functions may exit iteration
25677  * early by explicitly returning `false`.
25678  *
25679  * @static
25680  * @memberOf _
25681  * @since 0.3.0
25682  * @category Object
25683  * @param {Object} object The object to iterate over.
25684  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
25685  * @returns {Object} Returns `object`.
25686  * @see _.forOwnRight
25687  * @example
25688  *
25689  * function Foo() {
25690  *   this.a = 1;
25691  *   this.b = 2;
25692  * }
25693  *
25694  * Foo.prototype.c = 3;
25695  *
25696  * _.forOwn(new Foo, function(value, key) {
25697  *   console.log(key);
25698  * });
25699  * // => Logs 'a' then 'b' (iteration order is not guaranteed).
25700  */
25701 function forOwn(object, iteratee) {
25702   return object && baseForOwn(object, castFunction(iteratee));
25703 }
25704
25705 var translations = Object.create(null);
25706
25707 var currentLocale = 'en';
25708 var textDirection = 'ltr';
25709
25710 function setLocale(_) {
25711     if (translations[_] !== undefined) {
25712         currentLocale = _;
25713     } else if (translations[_.split('-')[0]]) {
25714         currentLocale = _.split('-')[0];
25715     }
25716 }
25717
25718 function addTranslation(id, value) {
25719     translations[id] = value;
25720 }
25721
25722 /**
25723  * Given a string identifier, try to find that string in the current
25724  * language, and return it.
25725  *
25726  * @param {string} s string identifier
25727  * @returns {string?} locale string
25728  */
25729 function t(s, o, loc) {
25730     loc = loc || currentLocale;
25731
25732     var path = s
25733         .split('.')
25734         .map(function(s) { return s.replace('<TX_DOT>', '.'); })
25735         .reverse();
25736
25737     var rep = translations[loc];
25738
25739     while (rep !== undefined && path.length) rep = rep[path.pop()];
25740
25741     if (rep !== undefined) {
25742         if (o) for (var k in o) rep = rep.replace('{' + k + '}', o[k]);
25743         return rep;
25744     }
25745
25746     if (loc !== 'en') {
25747         return t(s, o, 'en');
25748     }
25749
25750     if (o && 'default' in o) {
25751         return o.default;
25752     }
25753
25754     var missing = 'Missing ' + loc + ' translation: ' + s;
25755     if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
25756
25757     return missing;
25758 }
25759
25760 /**
25761  * Given string 'ltr' or 'rtl', save that setting
25762  *
25763  * @param {string} s ltr or rtl
25764  */
25765
25766 function setTextDirection(dir) {
25767     textDirection = dir;
25768 }
25769
25770 /** Used to compose bitmasks for cloning. */
25771 var CLONE_DEEP_FLAG$4 = 1;
25772 var CLONE_SYMBOLS_FLAG$3 = 4;
25773
25774 /**
25775  * This method is like `_.cloneWith` except that it recursively clones `value`.
25776  *
25777  * @static
25778  * @memberOf _
25779  * @since 4.0.0
25780  * @category Lang
25781  * @param {*} value The value to recursively clone.
25782  * @param {Function} [customizer] The function to customize cloning.
25783  * @returns {*} Returns the deep cloned value.
25784  * @see _.cloneWith
25785  * @example
25786  *
25787  * function customizer(value) {
25788  *   if (_.isElement(value)) {
25789  *     return value.cloneNode(true);
25790  *   }
25791  * }
25792  *
25793  * var el = _.cloneDeepWith(document.body, customizer);
25794  *
25795  * console.log(el === document.body);
25796  * // => false
25797  * console.log(el.nodeName);
25798  * // => 'BODY'
25799  * console.log(el.childNodes.length);
25800  * // => 20
25801  */
25802 function cloneDeepWith(value, customizer) {
25803   customizer = typeof customizer == 'function' ? customizer : undefined;
25804   return baseClone(value, CLONE_DEEP_FLAG$4 | CLONE_SYMBOLS_FLAG$3, customizer);
25805 }
25806
25807 /**
25808  * Creates an array of `array` values not included in the other given arrays
25809  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25810  * for equality comparisons. The order and references of result values are
25811  * determined by the first array.
25812  *
25813  * **Note:** Unlike `_.pullAll`, this method returns a new array.
25814  *
25815  * @static
25816  * @memberOf _
25817  * @since 0.1.0
25818  * @category Array
25819  * @param {Array} array The array to inspect.
25820  * @param {...Array} [values] The values to exclude.
25821  * @returns {Array} Returns the new array of filtered values.
25822  * @see _.without, _.xor
25823  * @example
25824  *
25825  * _.difference([2, 1], [2, 3]);
25826  * // => [1]
25827  */
25828 var difference = baseRest(function(array, values) {
25829   return isArrayLikeObject(array)
25830     ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
25831     : [];
25832 });
25833
25834 /**
25835  * Flattens `array` a single level deep.
25836  *
25837  * @static
25838  * @memberOf _
25839  * @since 0.1.0
25840  * @category Array
25841  * @param {Array} array The array to flatten.
25842  * @returns {Array} Returns the new flattened array.
25843  * @example
25844  *
25845  * _.flatten([1, [2, [3, [4]], 5]]);
25846  * // => [1, 2, [3, [4]], 5]
25847  */
25848 function flatten(array) {
25849   var length = array == null ? 0 : array.length;
25850   return length ? baseFlatten(array, 1) : [];
25851 }
25852
25853 /**
25854  * A specialized version of `baseAggregator` for arrays.
25855  *
25856  * @private
25857  * @param {Array} [array] The array to iterate over.
25858  * @param {Function} setter The function to set `accumulator` values.
25859  * @param {Function} iteratee The iteratee to transform keys.
25860  * @param {Object} accumulator The initial aggregated object.
25861  * @returns {Function} Returns `accumulator`.
25862  */
25863 function arrayAggregator(array, setter, iteratee, accumulator) {
25864   var index = -1,
25865       length = array == null ? 0 : array.length;
25866
25867   while (++index < length) {
25868     var value = array[index];
25869     setter(accumulator, value, iteratee(value), array);
25870   }
25871   return accumulator;
25872 }
25873
25874 /**
25875  * Aggregates elements of `collection` on `accumulator` with keys transformed
25876  * by `iteratee` and values set by `setter`.
25877  *
25878  * @private
25879  * @param {Array|Object} collection The collection to iterate over.
25880  * @param {Function} setter The function to set `accumulator` values.
25881  * @param {Function} iteratee The iteratee to transform keys.
25882  * @param {Object} accumulator The initial aggregated object.
25883  * @returns {Function} Returns `accumulator`.
25884  */
25885 function baseAggregator(collection, setter, iteratee, accumulator) {
25886   baseEach(collection, function(value, key, collection) {
25887     setter(accumulator, value, iteratee(value), collection);
25888   });
25889   return accumulator;
25890 }
25891
25892 /**
25893  * Creates a function like `_.groupBy`.
25894  *
25895  * @private
25896  * @param {Function} setter The function to set accumulator values.
25897  * @param {Function} [initializer] The accumulator object initializer.
25898  * @returns {Function} Returns the new aggregator function.
25899  */
25900 function createAggregator(setter, initializer) {
25901   return function(collection, iteratee) {
25902     var func = isArray(collection) ? arrayAggregator : baseAggregator,
25903         accumulator = initializer ? initializer() : {};
25904
25905     return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
25906   };
25907 }
25908
25909 /** Used for built-in method references. */
25910 var objectProto$15 = Object.prototype;
25911
25912 /** Used to check objects for own properties. */
25913 var hasOwnProperty$12 = objectProto$15.hasOwnProperty;
25914
25915 /**
25916  * Creates an object composed of keys generated from the results of running
25917  * each element of `collection` thru `iteratee`. The order of grouped values
25918  * is determined by the order they occur in `collection`. The corresponding
25919  * value of each key is an array of elements responsible for generating the
25920  * key. The iteratee is invoked with one argument: (value).
25921  *
25922  * @static
25923  * @memberOf _
25924  * @since 0.1.0
25925  * @category Collection
25926  * @param {Array|Object} collection The collection to iterate over.
25927  * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
25928  * @returns {Object} Returns the composed aggregate object.
25929  * @example
25930  *
25931  * _.groupBy([6.1, 4.2, 6.3], Math.floor);
25932  * // => { '4': [4.2], '6': [6.1, 6.3] }
25933  *
25934  * // The `_.property` iteratee shorthand.
25935  * _.groupBy(['one', 'two', 'three'], 'length');
25936  * // => { '3': ['one', 'two'], '5': ['three'] }
25937  */
25938 var groupBy = createAggregator(function(result, value, key) {
25939   if (hasOwnProperty$12.call(result, key)) {
25940     result[key].push(value);
25941   } else {
25942     baseAssignValue(result, key, [value]);
25943   }
25944 });
25945
25946 /** `Object#toString` result references. */
25947 var mapTag$6 = '[object Map]';
25948 var setTag$6 = '[object Set]';
25949
25950 /** Used for built-in method references. */
25951 var objectProto$16 = Object.prototype;
25952
25953 /** Used to check objects for own properties. */
25954 var hasOwnProperty$13 = objectProto$16.hasOwnProperty;
25955
25956 /**
25957  * Checks if `value` is an empty object, collection, map, or set.
25958  *
25959  * Objects are considered empty if they have no own enumerable string keyed
25960  * properties.
25961  *
25962  * Array-like values such as `arguments` objects, arrays, buffers, strings, or
25963  * jQuery-like collections are considered empty if they have a `length` of `0`.
25964  * Similarly, maps and sets are considered empty if they have a `size` of `0`.
25965  *
25966  * @static
25967  * @memberOf _
25968  * @since 0.1.0
25969  * @category Lang
25970  * @param {*} value The value to check.
25971  * @returns {boolean} Returns `true` if `value` is empty, else `false`.
25972  * @example
25973  *
25974  * _.isEmpty(null);
25975  * // => true
25976  *
25977  * _.isEmpty(true);
25978  * // => true
25979  *
25980  * _.isEmpty(1);
25981  * // => true
25982  *
25983  * _.isEmpty([1, 2, 3]);
25984  * // => false
25985  *
25986  * _.isEmpty({ 'a': 1 });
25987  * // => false
25988  */
25989 function isEmpty(value) {
25990   if (value == null) {
25991     return true;
25992   }
25993   if (isArrayLike(value) &&
25994       (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
25995         isBuffer(value) || isTypedArray(value) || isArguments(value))) {
25996     return !value.length;
25997   }
25998   var tag = getTag$1(value);
25999   if (tag == mapTag$6 || tag == setTag$6) {
26000     return !value.size;
26001   }
26002   if (isPrototype(value)) {
26003     return !baseKeys(value).length;
26004   }
26005   for (var key in value) {
26006     if (hasOwnProperty$13.call(value, key)) {
26007       return false;
26008     }
26009   }
26010   return true;
26011 }
26012
26013 /**
26014  * Gets the last element of `array`.
26015  *
26016  * @static
26017  * @memberOf _
26018  * @since 0.1.0
26019  * @category Array
26020  * @param {Array} array The array to query.
26021  * @returns {*} Returns the last element of `array`.
26022  * @example
26023  *
26024  * _.last([1, 2, 3]);
26025  * // => 3
26026  */
26027 function last(array) {
26028   var length = array == null ? 0 : array.length;
26029   return length ? array[length - 1] : undefined;
26030 }
26031
26032 /**
26033  * The base implementation of `_.slice` without an iteratee call guard.
26034  *
26035  * @private
26036  * @param {Array} array The array to slice.
26037  * @param {number} [start=0] The start position.
26038  * @param {number} [end=array.length] The end position.
26039  * @returns {Array} Returns the slice of `array`.
26040  */
26041 function baseSlice(array, start, end) {
26042   var index = -1,
26043       length = array.length;
26044
26045   if (start < 0) {
26046     start = -start > length ? 0 : (length + start);
26047   }
26048   end = end > length ? length : end;
26049   if (end < 0) {
26050     end += length;
26051   }
26052   length = start > end ? 0 : ((end - start) >>> 0);
26053   start >>>= 0;
26054
26055   var result = Array(length);
26056   while (++index < length) {
26057     result[index] = array[index + start];
26058   }
26059   return result;
26060 }
26061
26062 /**
26063  * Gets the parent value at `path` of `object`.
26064  *
26065  * @private
26066  * @param {Object} object The object to query.
26067  * @param {Array} path The path to get the parent value of.
26068  * @returns {*} Returns the parent value.
26069  */
26070 function parent(object, path) {
26071   return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
26072 }
26073
26074 /**
26075  * The base implementation of `_.unset`.
26076  *
26077  * @private
26078  * @param {Object} object The object to modify.
26079  * @param {Array|string} path The property path to unset.
26080  * @returns {boolean} Returns `true` if the property is deleted, else `false`.
26081  */
26082 function baseUnset(object, path) {
26083   path = castPath(path, object);
26084   object = parent(object, path);
26085   return object == null || delete object[toKey(last(path))];
26086 }
26087
26088 /** `Object#toString` result references. */
26089 var objectTag$4 = '[object Object]';
26090
26091 /** Used for built-in method references. */
26092 var funcProto$2 = Function.prototype;
26093 var objectProto$17 = Object.prototype;
26094
26095 /** Used to resolve the decompiled source of functions. */
26096 var funcToString$2 = funcProto$2.toString;
26097
26098 /** Used to check objects for own properties. */
26099 var hasOwnProperty$14 = objectProto$17.hasOwnProperty;
26100
26101 /** Used to infer the `Object` constructor. */
26102 var objectCtorString = funcToString$2.call(Object);
26103
26104 /**
26105  * Checks if `value` is a plain object, that is, an object created by the
26106  * `Object` constructor or one with a `[[Prototype]]` of `null`.
26107  *
26108  * @static
26109  * @memberOf _
26110  * @since 0.8.0
26111  * @category Lang
26112  * @param {*} value The value to check.
26113  * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
26114  * @example
26115  *
26116  * function Foo() {
26117  *   this.a = 1;
26118  * }
26119  *
26120  * _.isPlainObject(new Foo);
26121  * // => false
26122  *
26123  * _.isPlainObject([1, 2, 3]);
26124  * // => false
26125  *
26126  * _.isPlainObject({ 'x': 0, 'y': 0 });
26127  * // => true
26128  *
26129  * _.isPlainObject(Object.create(null));
26130  * // => true
26131  */
26132 function isPlainObject(value) {
26133   if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
26134     return false;
26135   }
26136   var proto = getPrototype(value);
26137   if (proto === null) {
26138     return true;
26139   }
26140   var Ctor = hasOwnProperty$14.call(proto, 'constructor') && proto.constructor;
26141   return typeof Ctor == 'function' && Ctor instanceof Ctor &&
26142     funcToString$2.call(Ctor) == objectCtorString;
26143 }
26144
26145 /**
26146  * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
26147  * objects.
26148  *
26149  * @private
26150  * @param {*} value The value to inspect.
26151  * @param {string} key The key of the property to inspect.
26152  * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
26153  */
26154 function customOmitClone(value) {
26155   return isPlainObject(value) ? undefined : value;
26156 }
26157
26158 /**
26159  * A specialized version of `baseRest` which flattens the rest array.
26160  *
26161  * @private
26162  * @param {Function} func The function to apply a rest parameter to.
26163  * @returns {Function} Returns the new function.
26164  */
26165 function flatRest(func) {
26166   return setToString(overRest(func, undefined, flatten), func + '');
26167 }
26168
26169 /** Used to compose bitmasks for cloning. */
26170 var CLONE_DEEP_FLAG$5 = 1;
26171 var CLONE_FLAT_FLAG$1 = 2;
26172 var CLONE_SYMBOLS_FLAG$4 = 4;
26173
26174 /**
26175  * The opposite of `_.pick`; this method creates an object composed of the
26176  * own and inherited enumerable property paths of `object` that are not omitted.
26177  *
26178  * **Note:** This method is considerably slower than `_.pick`.
26179  *
26180  * @static
26181  * @since 0.1.0
26182  * @memberOf _
26183  * @category Object
26184  * @param {Object} object The source object.
26185  * @param {...(string|string[])} [paths] The property paths to omit.
26186  * @returns {Object} Returns the new object.
26187  * @example
26188  *
26189  * var object = { 'a': 1, 'b': '2', 'c': 3 };
26190  *
26191  * _.omit(object, ['a', 'c']);
26192  * // => { 'b': '2' }
26193  */
26194 var omit = flatRest(function(object, paths) {
26195   var result = {};
26196   if (object == null) {
26197     return result;
26198   }
26199   var isDeep = false;
26200   paths = arrayMap(paths, function(path) {
26201     path = castPath(path, object);
26202     isDeep || (isDeep = path.length > 1);
26203     return path;
26204   });
26205   copyObject(object, getAllKeysIn(object), result);
26206   if (isDeep) {
26207     result = baseClone(result, CLONE_DEEP_FLAG$5 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$4, customOmitClone);
26208   }
26209   var length = paths.length;
26210   while (length--) {
26211     baseUnset(result, paths[length]);
26212   }
26213   return result;
26214 });
26215
26216 var detected;
26217
26218 function utilDetect(force) {
26219     if (detected && !force) return detected;
26220     detected = {};
26221
26222     var ua = navigator.userAgent,
26223         m = null;
26224
26225     m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
26226     if (m !== null) {
26227         detected.browser = m[1];
26228         detected.version = m[2];
26229     }
26230     if (!detected.browser) {
26231         m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
26232         if (m !== null) {
26233             detected.browser = 'msie';
26234             detected.version = m[1];
26235         }
26236     }
26237     if (!detected.browser) {
26238         m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
26239         if (m !== null) {
26240             detected.browser = 'Opera';
26241             detected.version = m[2];
26242         }
26243     }
26244     if (!detected.browser) {
26245         m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
26246         if (m !== null) {
26247             detected.browser = m[1];
26248             detected.version = m[2];
26249             m = ua.match(/version\/([\.\d]+)/i);
26250             if (m !== null) detected.version = m[1];
26251         }
26252     }
26253     if (!detected.browser) {
26254         detected.browser = navigator.appName;
26255         detected.version = navigator.appVersion;
26256     }
26257
26258     // keep major.minor version only..
26259     detected.version = detected.version.split(/\W/).slice(0,2).join('.');
26260
26261     if (detected.browser.toLowerCase() === 'msie') {
26262         detected.ie = true;
26263         detected.browser = 'Internet Explorer';
26264         detected.support = parseFloat(detected.version) >= 11;
26265     } else {
26266         detected.ie = false;
26267         detected.support = true;
26268     }
26269
26270     // Added due to incomplete svg style support. See #715
26271     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
26272
26273     detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
26274     detected.language = detected.locale.split('-')[0];
26275
26276     // Search `navigator.languages` for a better locale.. Prefer the first language,
26277     // unless the second language is a culture-specific version of the first one, see #3842
26278     if (navigator.languages && navigator.languages.length > 0) {
26279         var code0 = navigator.languages[0],
26280             parts0 = code0.split('-');
26281
26282         detected.locale = code0;
26283         detected.language = parts0[0];
26284
26285         if (navigator.languages.length > 1 && parts0.length === 1) {
26286             var code1 = navigator.languages[1],
26287                 parts1 = code1.split('-');
26288
26289             if (parts1[0] === parts0[0]) {
26290                 detected.locale = code1;
26291             }
26292         }
26293     }
26294
26295     // Loaded locale is stored in currentLocale
26296     // return that instead (except in the situation where 'en' might override 'en-US')
26297     var loadedLocale = currentLocale || 'en';
26298     if (loadedLocale !== 'en') {
26299         detected.locale = loadedLocale;
26300         detected.language = detected.locale.split('-')[0];
26301     }
26302
26303     // detect text direction
26304     var q = utilStringQs(window.location.hash.substring(1));
26305     var lang = dataLocales[detected.locale];
26306     if ((lang && lang.rtl) || (q.rtl === 'true')) {
26307         detected.textDirection = 'rtl';
26308     } else {
26309         detected.textDirection = 'ltr';
26310     }
26311     setTextDirection(detected.textDirection);
26312
26313     // detect host
26314     var loc = window.top.location;
26315     var origin = loc.origin;
26316     if (!origin) {  // for unpatched IE11
26317         origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
26318     }
26319
26320     detected.host = origin + loc.pathname;
26321
26322     detected.filedrop = (window.FileReader && 'ondrop' in window);
26323
26324     detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
26325
26326     function nav(x) {
26327         return navigator.userAgent.indexOf(x) !== -1;
26328     }
26329
26330     if (nav('Win')) {
26331         detected.os = 'win';
26332         detected.platform = 'Windows';
26333     }
26334     else if (nav('Mac')) {
26335         detected.os = 'mac';
26336         detected.platform = 'Macintosh';
26337     }
26338     else if (nav('X11') || nav('Linux')) {
26339         detected.os = 'linux';
26340         detected.platform = 'Linux';
26341     }
26342     else {
26343         detected.os = 'win';
26344         detected.platform = 'Unknown';
26345     }
26346
26347     return detected;
26348 }
26349
26350 var remove$1 = removeDiacritics;
26351
26352 var replacementList = [
26353   {
26354     base: ' ',
26355     chars: "\u00A0",
26356   }, {
26357     base: '0',
26358     chars: "\u07C0",
26359   }, {
26360     base: 'A',
26361     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",
26362   }, {
26363     base: 'AA',
26364     chars: "\uA732",
26365   }, {
26366     base: 'AE',
26367     chars: "\u00C6\u01FC\u01E2",
26368   }, {
26369     base: 'AO',
26370     chars: "\uA734",
26371   }, {
26372     base: 'AU',
26373     chars: "\uA736",
26374   }, {
26375     base: 'AV',
26376     chars: "\uA738\uA73A",
26377   }, {
26378     base: 'AY',
26379     chars: "\uA73C",
26380   }, {
26381     base: 'B',
26382     chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
26383   }, {
26384     base: 'C',
26385     chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
26386   }, {
26387     base: 'D',
26388     chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
26389   }, {
26390     base: 'Dh',
26391     chars: "\u00D0",
26392   }, {
26393     base: 'DZ',
26394     chars: "\u01F1\u01C4",
26395   }, {
26396     base: 'Dz',
26397     chars: "\u01F2\u01C5",
26398   }, {
26399     base: 'E',
26400     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",
26401   }, {
26402     base: 'F',
26403     chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
26404   }, {
26405     base: 'G',
26406     chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
26407   }, {
26408     base: 'H',
26409     chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
26410   }, {
26411     base: 'I',
26412     chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
26413   }, {
26414     base: 'J',
26415     chars: "\u24BF\uFF2A\u0134\u0248\u0237",
26416   }, {
26417     base: 'K',
26418     chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
26419   }, {
26420     base: 'L',
26421     chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
26422   }, {
26423     base: 'LJ',
26424     chars: "\u01C7",
26425   }, {
26426     base: 'Lj',
26427     chars: "\u01C8",
26428   }, {
26429     base: 'M',
26430     chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
26431   }, {
26432     base: 'N',
26433     chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
26434   }, {
26435     base: 'NJ',
26436     chars: "\u01CA",
26437   }, {
26438     base: 'Nj',
26439     chars: "\u01CB",
26440   }, {
26441     base: 'O',
26442     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",
26443   }, {
26444     base: 'OE',
26445     chars: "\u0152",
26446   }, {
26447     base: 'OI',
26448     chars: "\u01A2",
26449   }, {
26450     base: 'OO',
26451     chars: "\uA74E",
26452   }, {
26453     base: 'OU',
26454     chars: "\u0222",
26455   }, {
26456     base: 'P',
26457     chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26458   }, {
26459     base: 'Q',
26460     chars: "\u24C6\uFF31\uA756\uA758\u024A",
26461   }, {
26462     base: 'R',
26463     chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26464   }, {
26465     base: 'S',
26466     chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26467   }, {
26468     base: 'T',
26469     chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26470   }, {
26471     base: 'Th',
26472     chars: "\u00DE",
26473   }, {
26474     base: 'TZ',
26475     chars: "\uA728",
26476   }, {
26477     base: 'U',
26478     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",
26479   }, {
26480     base: 'V',
26481     chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26482   }, {
26483     base: 'VY',
26484     chars: "\uA760",
26485   }, {
26486     base: 'W',
26487     chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26488   }, {
26489     base: 'X',
26490     chars: "\u24CD\uFF38\u1E8A\u1E8C",
26491   }, {
26492     base: 'Y',
26493     chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26494   }, {
26495     base: 'Z',
26496     chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26497   }, {
26498     base: 'a',
26499     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",
26500   }, {
26501     base: 'aa',
26502     chars: "\uA733",
26503   }, {
26504     base: 'ae',
26505     chars: "\u00E6\u01FD\u01E3",
26506   }, {
26507     base: 'ao',
26508     chars: "\uA735",
26509   }, {
26510     base: 'au',
26511     chars: "\uA737",
26512   }, {
26513     base: 'av',
26514     chars: "\uA739\uA73B",
26515   }, {
26516     base: 'ay',
26517     chars: "\uA73D",
26518   }, {
26519     base: 'b',
26520     chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26521   }, {
26522     base: 'c',
26523     chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26524   }, {
26525     base: 'd',
26526     chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26527   }, {
26528     base: 'dh',
26529     chars: "\u00F0",
26530   }, {
26531     base: 'dz',
26532     chars: "\u01F3\u01C6",
26533   }, {
26534     base: 'e',
26535     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",
26536   }, {
26537     base: 'f',
26538     chars: "\u24D5\uFF46\u1E1F\u0192",
26539   }, {
26540     base: 'ff',
26541     chars: "\uFB00",
26542   }, {
26543     base: 'fi',
26544     chars: "\uFB01",
26545   }, {
26546     base: 'fl',
26547     chars: "\uFB02",
26548   }, {
26549     base: 'ffi',
26550     chars: "\uFB03",
26551   }, {
26552     base: 'ffl',
26553     chars: "\uFB04",
26554   }, {
26555     base: 'g',
26556     chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26557   }, {
26558     base: 'h',
26559     chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26560   }, {
26561     base: 'hv',
26562     chars: "\u0195",
26563   }, {
26564     base: 'i',
26565     chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26566   }, {
26567     base: 'j',
26568     chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26569   }, {
26570     base: 'k',
26571     chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26572   }, {
26573     base: 'l',
26574     chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26575   }, {
26576     base: 'lj',
26577     chars: "\u01C9",
26578   }, {
26579     base: 'm',
26580     chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26581   }, {
26582     base: 'n',
26583     chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26584   }, {
26585     base: 'nj',
26586     chars: "\u01CC",
26587   }, {
26588     base: 'o',
26589     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",
26590   }, {
26591     base: 'oe',
26592     chars: "\u0153",
26593   }, {
26594     base: 'oi',
26595     chars: "\u01A3",
26596   }, {
26597     base: 'oo',
26598     chars: "\uA74F",
26599   }, {
26600     base: 'ou',
26601     chars: "\u0223",
26602   }, {
26603     base: 'p',
26604     chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26605   }, {
26606     base: 'q',
26607     chars: "\u24E0\uFF51\u024B\uA757\uA759",
26608   }, {
26609     base: 'r',
26610     chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26611   }, {
26612     base: 's',
26613     chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26614   }, {
26615     base: 'ss',
26616     chars: "\xDF",
26617   }, {
26618     base: 't',
26619     chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26620   }, {
26621     base: 'th',
26622     chars: "\u00FE",
26623   }, {
26624     base: 'tz',
26625     chars: "\uA729",
26626   }, {
26627     base: 'u',
26628     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",
26629   }, {
26630     base: 'v',
26631     chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26632   }, {
26633     base: 'vy',
26634     chars: "\uA761",
26635   }, {
26636     base: 'w',
26637     chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26638   }, {
26639     base: 'x',
26640     chars: "\u24E7\uFF58\u1E8B\u1E8D",
26641   }, {
26642     base: 'y',
26643     chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26644   }, {
26645     base: 'z',
26646     chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26647   }
26648 ];
26649
26650 var diacriticsMap = {};
26651 for (var i = 0; i < replacementList.length; i += 1) {
26652   var chars = replacementList[i].chars;
26653   for (var j = 0; j < chars.length; j += 1) {
26654     diacriticsMap[chars[j]] = replacementList[i].base;
26655   }
26656 }
26657
26658 function removeDiacritics(str) {
26659   return str.replace(/[^\u0000-\u007e]/g, function(c) {
26660     return diacriticsMap[c] || c;
26661   });
26662 }
26663
26664 // see https://github.com/openstreetmap/iD/pull/3707
26665 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
26666
26667 var chars$1 = {
26668     // madda above alef
26669     1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
26670
26671     // hamza above and below alef
26672     1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
26673     // 1572 is ؤ
26674     1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
26675     // 1574 is ئ
26676     1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
26677     1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
26678
26679     // 1577 ة
26680     1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
26681
26682     1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
26683     1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
26684     1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
26685     1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
26686     1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
26687     1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
26688     1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
26689     1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
26690     1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
26691     1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
26692     1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
26693     1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
26694     1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
26695     1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
26696     1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
26697     1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
26698     1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
26699     1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
26700
26701     // 1595 ػ - may be very rare
26702
26703     1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
26704     1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
26705     1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
26706     1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
26707     1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
26708     1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
26709     1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
26710
26711     // 1609 ى
26712     1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
26713     // 1610 ي
26714     1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
26715
26716     // short vowel sounds / tashkil markings
26717
26718     1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
26719
26720     1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
26721     1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
26722     1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
26723     1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
26724     1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
26725     5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
26726 };
26727
26728 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
26729
26730 function fixRTLTextForSvg(inputText) {
26731     var context = true;
26732     var ret = '';
26733     var rtlBuffer = [];
26734     var arabicRegex = /[\u0600-\u06FF]/g;
26735     var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
26736     var thaanaVowel = /[\u07A6-\u07B0]/;
26737     var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
26738
26739     if (!arabicRegex.test(inputText)) {
26740         // Hebrew or Thaana RTL script
26741         for (var n = 0; n < inputText.length; n++) {
26742             var c = inputText[n];
26743             if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
26744                 rtlBuffer[rtlBuffer.length - 1] += c;
26745             } else if (rtlRegex.test(c)) {
26746                 rtlBuffer.push(c);
26747             } else if (c === ' ' && rtlBuffer.length) {
26748                 // whitespace within RTL text
26749                 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26750             } else {
26751                 // non-RTL character
26752                 ret += rtlBuffer.reverse().join('') + c;
26753                 rtlBuffer = [];
26754             }
26755         }
26756     } else {
26757         for (var i = 0, l = inputText.length; i < l; i++) {
26758             var code = inputText[i].charCodeAt(0);
26759             var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
26760
26761             if (!chars$1[code]) {
26762                 if (code === 32 && rtlBuffer.length) {
26763                     // whitespace
26764                     rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
26765                 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
26766                     // tashkil mark
26767                     rtlBuffer[rtlBuffer.length - 1] += inputText[i];
26768                 } else {
26769                     // non-RTL character
26770                     ret += rtlBuffer.reverse().join('') + inputText[i];
26771                     rtlBuffer = [];
26772                 }
26773                 continue;
26774             }
26775             if (context) {
26776                 if (i === l - 1 || nextCode === 32) {
26777                     rtlBuffer.push(chars$1[code].isolated);
26778                 } else {
26779                     // special case for لا
26780                     if (code === 1604 && nextCode === 1575) {
26781                         rtlBuffer.push(chars$1[5000].initial);
26782                         i++;
26783                         context = true;
26784                         continue;
26785                     }
26786                     rtlBuffer.push(chars$1[code].initial);
26787                 }
26788             } else {
26789                 if (i === l - 1 || nextCode === 32){
26790                     rtlBuffer.push(chars$1[code].final);
26791                 } else {
26792                     // special case for ﻼ
26793                     if (code === 1604 && nextCode === 1575){
26794                         rtlBuffer.push(chars$1[5000].final);
26795                         i++;
26796                         context = true;
26797                         continue;
26798                     }
26799                     if (chars$1[code].medial === ''){
26800                         rtlBuffer.push(chars$1[code].final);
26801                     } else {
26802                         rtlBuffer.push(chars$1[code].medial);
26803                     }
26804                 }
26805             }
26806             context = (chars$1[code].medial === '') || nextCode === 32;
26807         }
26808     }
26809     ret += rtlBuffer.reverse().join('');
26810     return ret;
26811 }
26812
26813 function utilTagText(entity) {
26814     return map$4(entity.tags, function(v, k) {
26815         return k + '=' + v;
26816     }).join(', ');
26817 }
26818
26819
26820 function utilEntitySelector(ids) {
26821     return ids.length ? '.' + ids.join(',.') : 'nothing';
26822 }
26823
26824
26825 function utilEntityOrMemberSelector(ids, graph) {
26826     var s = utilEntitySelector(ids);
26827
26828     ids.forEach(function(id) {
26829         var entity = graph.hasEntity(id);
26830         if (entity && entity.type === 'relation') {
26831             entity.members.forEach(function(member) {
26832                 s += ',.' + member.id;
26833             });
26834         }
26835     });
26836
26837     return s;
26838 }
26839
26840
26841 function utilGetAllNodes(ids, graph) {
26842     var seen = {};
26843     var nodes = [];
26844     ids.forEach(getNodes);
26845     return nodes;
26846
26847     function getNodes(id) {
26848         if (seen[id]) return;
26849         seen[id] = true;
26850
26851         var entity = graph.hasEntity(id);
26852         if (!entity) return;
26853
26854         if (entity.type === 'node') {
26855             nodes.push(entity);
26856         } else if (entity.type === 'way') {
26857             entity.nodes.forEach(getNodes);
26858         } else {
26859             entity.members.map(function(member) { return member.id; }).forEach(getNodes);
26860         }
26861     }
26862 }
26863
26864
26865 function utilDisplayName(entity) {
26866     var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
26867         name = entity.tags[localizedNameKey] || entity.tags.name || '',
26868         network = entity.tags.cycle_network || entity.tags.network;
26869
26870     if (!name && entity.tags.ref) {
26871         name = entity.tags.ref;
26872         if (network) {
26873             name = network + ' ' + name;
26874         }
26875     }
26876
26877     return name;
26878 }
26879
26880
26881 function utilDisplayNameForPath(entity) {
26882     var name = utilDisplayName(entity);
26883     var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
26884
26885     if (!isFirefox && name && rtlRegex.test(name)) {
26886         name = fixRTLTextForSvg(name);
26887     }
26888
26889     return name;
26890 }
26891
26892
26893 function utilDisplayType(id) {
26894     return {
26895         n: t('inspector.node'),
26896         w: t('inspector.way'),
26897         r: t('inspector.relation')
26898     }[id.charAt(0)];
26899 }
26900
26901
26902 function utilStringQs(str) {
26903     return str.split('&').reduce(function(obj, pair){
26904         var parts = pair.split('=');
26905         if (parts.length === 2) {
26906             obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
26907         }
26908         return obj;
26909     }, {});
26910 }
26911
26912
26913 function utilQsString(obj, noencode) {
26914     function softEncode(s) {
26915       // encode everything except special characters used in certain hash parameters:
26916       // "/" in map states, ":", ",", {" and "}" in background
26917       return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
26918     }
26919     return Object.keys(obj).sort().map(function(key) {
26920         return encodeURIComponent(key) + '=' + (
26921             noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
26922     }).join('&');
26923 }
26924
26925
26926 function utilPrefixDOMProperty(property) {
26927     var prefixes = ['webkit', 'ms', 'moz', 'o'],
26928         i = -1,
26929         n = prefixes.length,
26930         s = document.body;
26931
26932     if (property in s)
26933         return property;
26934
26935     property = property.substr(0, 1).toUpperCase() + property.substr(1);
26936
26937     while (++i < n)
26938         if (prefixes[i] + property in s)
26939             return prefixes[i] + property;
26940
26941     return false;
26942 }
26943
26944
26945 function utilPrefixCSSProperty(property) {
26946     var prefixes = ['webkit', 'ms', 'Moz', 'O'],
26947         i = -1,
26948         n = prefixes.length,
26949         s = document.body.style;
26950
26951     if (property.toLowerCase() in s)
26952         return property.toLowerCase();
26953
26954     while (++i < n)
26955         if (prefixes[i] + property in s)
26956             return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
26957
26958     return false;
26959 }
26960
26961
26962 var transformProperty;
26963 function utilSetTransform(el, x, y, scale) {
26964     var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
26965         translate = utilDetect().opera ?
26966             'translate('   + x + 'px,' + y + 'px)' :
26967             'translate3d(' + x + 'px,' + y + 'px,0)';
26968     return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
26969 }
26970
26971
26972 // Calculates Levenshtein distance between two strings
26973 // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
26974 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
26975 function utilEditDistance(a, b) {
26976     a = remove$1(a.toLowerCase());
26977     b = remove$1(b.toLowerCase());
26978     if (a.length === 0) return b.length;
26979     if (b.length === 0) return a.length;
26980     var matrix = [];
26981     for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
26982     for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
26983     for (i = 1; i <= b.length; i++) {
26984         for (j = 1; j <= a.length; j++) {
26985             if (b.charAt(i-1) === a.charAt(j-1)) {
26986                 matrix[i][j] = matrix[i-1][j-1];
26987             } else {
26988                 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
26989                     Math.min(matrix[i][j-1] + 1, // insertion
26990                     matrix[i-1][j] + 1)); // deletion
26991             }
26992         }
26993     }
26994     return matrix[b.length][a.length];
26995 }
26996
26997
26998 // a d3.mouse-alike which
26999 // 1. Only works on HTML elements, not SVG
27000 // 2. Does not cause style recalculation
27001 function utilFastMouse(container) {
27002     var rect = container.getBoundingClientRect(),
27003         rectLeft = rect.left,
27004         rectTop = rect.top,
27005         clientLeft = +container.clientLeft,
27006         clientTop = +container.clientTop;
27007     if (textDirection === 'rtl') {
27008         rectLeft = 0;
27009     }
27010     return function(e) {
27011         return [
27012             e.clientX - rectLeft - clientLeft,
27013             e.clientY - rectTop - clientTop];
27014     };
27015 }
27016
27017
27018 /* eslint-disable no-proto */
27019 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27020 /* eslint-enable no-proto */
27021
27022
27023 function utilAsyncMap(inputs, func, callback) {
27024     var remaining = inputs.length,
27025         results = [],
27026         errors = [];
27027
27028     inputs.forEach(function(d, i) {
27029         func(d, function done(err, data) {
27030             errors[i] = err;
27031             results[i] = data;
27032             remaining--;
27033             if (!remaining) callback(errors, results);
27034         });
27035     });
27036 }
27037
27038
27039 // wraps an index to an interval [0..length-1]
27040 function utilWrap(index, length) {
27041     if (index < 0)
27042         index += Math.ceil(-index/length)*length;
27043     return index % length;
27044 }
27045
27046
27047 /**
27048  * a replacement for functor
27049  *
27050  * @param {*} value any value
27051  * @returns {Function} a function that returns that value or the value if it's a function
27052  */
27053 function utilFunctor(value) {
27054     if (typeof value === 'function') return value;
27055     return function() {
27056         return value;
27057     };
27058 }
27059
27060
27061 function utilNoAuto(selection) {
27062     return selection
27063         .attr('autocomplete', 'off')
27064         .attr('autocorrect', 'off')
27065         .attr('autocapitalize', 'off')
27066         .attr('spellcheck', 'false');
27067 }
27068
27069 // note the function should be of low priority
27070 // and should not be returning a value.
27071 function utilCallWhenIdle(func, timeout) {
27072     return function() {
27073         var args = arguments;
27074         var that = this;
27075         window.requestIdleCallback(function() {
27076             func.apply(that, args);
27077         }, {timeout: timeout});
27078     };
27079 }
27080
27081 // Like selection.property('value', ...), but avoids no-op value sets,
27082 // which can result in layout/repaint thrashing in some situations.
27083 function utilGetSetValue(selection, value) {
27084     function d3_selection_value(value) {
27085         function valueNull() {
27086             delete this.value;
27087         }
27088
27089         function valueConstant() {
27090             if (this.value !== value) {
27091                 this.value = value;
27092             }
27093         }
27094
27095         function valueFunction() {
27096             var x = value.apply(this, arguments);
27097             if (x == null) {
27098                 delete this.value;
27099             } else if (this.value !== x) {
27100                 this.value = x;
27101             }
27102         }
27103
27104         return value == null
27105             ? valueNull : (typeof value === 'function'
27106             ? valueFunction : valueConstant);
27107     }
27108
27109     if (arguments.length === 1) {
27110         return selection.property('value');
27111     }
27112
27113     return selection.each(d3_selection_value(value));
27114 }
27115
27116 function utilIdleWorker(tasks, processor, callback) {
27117     var processed = [];
27118     var currentPos = 0;
27119     var totalTasks = tasks.length;
27120
27121     function worker(deadline) {
27122         while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27123             var result = processor(tasks[currentPos]);
27124
27125             // if falsy dont add to the processed list
27126             if (result) processed.push(result);
27127             currentPos++;
27128         }
27129
27130         // more tasks are left, we might need more idleCallbacks
27131         if (currentPos < totalTasks) {
27132             return window.requestIdleCallback(function(deadline) {worker(deadline);});
27133         }
27134
27135         // tasks are completed
27136         return callback(processed);
27137     }
27138
27139     window.requestIdleCallback(function(deadline) {worker(deadline);});
27140 }
27141
27142 // shim
27143 window.requestIdleCallback =
27144     window.requestIdleCallback ||
27145     function(cb) {
27146         var start = Date.now();
27147         return setTimeout(function() {
27148             cb({
27149                 didTimeout: false,
27150                 timeRemaining: function() {
27151                     return Math.max(0, 50 - (Date.now() - start));
27152                 }
27153             });
27154         }, 1);
27155     };
27156
27157 window.cancelIdleCallback =
27158     window.cancelIdleCallback ||
27159     function(id) {
27160         clearTimeout(id);
27161     };
27162
27163 // Copies a variable number of methods from source to target.
27164 function utilRebind(target, source) {
27165     var i = 1, n = arguments.length, method;
27166     while (++i < n) {
27167         target[method = arguments[i]] = d3_rebind(target, source, source[method]);
27168     }
27169     return target;
27170 }
27171
27172 // Method is assumed to be a standard D3 getter-setter:
27173 // If passed with no arguments, gets the value.
27174 // If passed with arguments, sets the value and returns the target.
27175 function d3_rebind(target, source, method) {
27176     return function() {
27177         var value = method.apply(source, arguments);
27178         return value === source ? target : value;
27179     };
27180 }
27181
27182 // A per-domain session mutex backed by a cookie and dead man's
27183 // switch. If the session crashes, the mutex will auto-release
27184 // after 5 seconds.
27185
27186 function utilSessionMutex(name) {
27187     var mutex = {},
27188         intervalID;
27189
27190     function renew() {
27191         var expires = new Date();
27192         expires.setSeconds(expires.getSeconds() + 5);
27193         document.cookie = name + '=1; expires=' + expires.toUTCString();
27194     }
27195
27196     mutex.lock = function() {
27197         if (intervalID) return true;
27198         var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
27199         if (cookie) return false;
27200         renew();
27201         intervalID = window.setInterval(renew, 4000);
27202         return true;
27203     };
27204
27205     mutex.unlock = function() {
27206         if (!intervalID) return;
27207         document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
27208         clearInterval(intervalID);
27209         intervalID = null;
27210     };
27211
27212     mutex.locked = function() {
27213         return !!intervalID;
27214     };
27215
27216     return mutex;
27217 }
27218
27219 function utilSuggestNames(preset, suggestions) {
27220     preset = preset.id.split('/', 2);
27221     var k = preset[0],
27222         v = preset[1];
27223
27224     return function(value, callback) {
27225         var result = [];
27226         if (value && value.length > 2) {
27227             if (suggestions[k] && suggestions[k][v]) {
27228                 for (var sugg in suggestions[k][v]) {
27229                     var dist = utilEditDistance(value, sugg.substring(0, value.length));
27230                     if (dist < 3) {
27231                         result.push({
27232                             title: sugg,
27233                             value: sugg,
27234                             dist: dist
27235                         });
27236                     }
27237                 }
27238             }
27239             result.sort(function(a, b) {
27240                 return a.dist - b.dist;
27241             });
27242         }
27243         result = result.slice(0,3);
27244         callback(result);
27245     };
27246 }
27247
27248 function utilTriggerEvent(target, type) {
27249     target.each(function() {
27250         var evt = document.createEvent('HTMLEvents');
27251         evt.initEvent(type, true, true);
27252         this.dispatchEvent(evt);
27253     });
27254 }
27255
27256 function validationDeprecatedTag() {
27257
27258     var validation = function(changes) {
27259         var warnings = [];
27260         for (var i = 0; i < changes.created.length; i++) {
27261             var change = changes.created[i],
27262                 deprecatedTags = change.deprecatedTags();
27263
27264             if (!isEmpty(deprecatedTags)) {
27265                 var tags = utilTagText({ tags: deprecatedTags });
27266                 warnings.push({
27267                     id: 'deprecated_tags',
27268                     message: t('validations.deprecated_tags', { tags: tags }),
27269                     entity: change
27270                 });
27271             }
27272         }
27273
27274         return warnings;
27275     };
27276
27277
27278     return validation;
27279 }
27280
27281 function validationDisconnectedHighway() {
27282
27283     function isDisconnectedHighway(entity, graph) {
27284         if (!entity.tags.highway) return false;
27285         if (entity.geometry(graph) !== 'line') return false;
27286
27287         return graph.childNodes(entity)
27288             .every(function(vertex) {
27289                 var parents = graph.parentWays(vertex);
27290                 if (parents.length === 1) {  // standalone vertex
27291                     return true;
27292                 } else {                     // shared vertex
27293                     return !vertex.tags.entrance &&
27294                         parents.filter(function(parent) {
27295                             return parent.tags.highway && parent !== entity;
27296                         }).length === 0;
27297                 }
27298             });
27299     }
27300
27301
27302     var validation = function(changes, graph) {
27303         var warnings = [];
27304         for (var i = 0; i < changes.created.length; i++) {
27305             var entity = changes.created[i];
27306
27307             if (isDisconnectedHighway(entity, graph)) {
27308                 warnings.push({
27309                     id: 'disconnected_highway',
27310                     message: t('validations.disconnected_highway'),
27311                     tooltip: t('validations.disconnected_highway_tooltip'),
27312                     entity: entity
27313                 });
27314             }
27315         }
27316
27317         return warnings;
27318     };
27319
27320
27321     return validation;
27322 }
27323
27324 function validationManyDeletions() {
27325     var threshold = 100;
27326
27327     var validation = function(changes) {
27328         var warnings = [];
27329         if (changes.deleted.length > threshold) {
27330             warnings.push({
27331                 id: 'many_deletions',
27332                 message: t('validations.many_deletions', { n: changes.deleted.length })
27333             });
27334         }
27335
27336         return warnings;
27337     };
27338
27339
27340     return validation;
27341 }
27342
27343 function validationMissingTag() {
27344
27345     // Slightly stricter check than Entity#isUsed (#3091)
27346     function hasTags(entity, graph) {
27347         return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
27348             graph.parentRelations(entity).length > 0;
27349     }
27350
27351     var validation = function(changes, graph) {
27352         var types = ['point', 'line', 'area', 'relation'],
27353             warnings = [];
27354
27355         for (var i = 0; i < changes.created.length; i++) {
27356             var change = changes.created[i],
27357                 geometry = change.geometry(graph);
27358
27359             if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
27360                 warnings.push({
27361                     id: 'missing_tag',
27362                     message: t('validations.untagged_' + geometry),
27363                     tooltip: t('validations.untagged_' + geometry + '_tooltip'),
27364                     entity: change
27365                 });
27366             }
27367         }
27368
27369         return warnings;
27370     };
27371
27372
27373     return validation;
27374 }
27375
27376 function validationOldMultipolygon() {
27377
27378     return function validation(changes, graph) {
27379         var warnings = [];
27380         for (var i = 0; i < changes.created.length; i++) {
27381             var entity = changes.created[i];
27382             var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
27383             if (parent) {
27384                 warnings.push({
27385                     id: 'old_multipolygon',
27386                     message: t('validations.old_multipolygon'),
27387                     tooltip: t('validations.old_multipolygon_tooltip'),
27388                     entity: parent
27389                 });
27390             }
27391         }
27392         return warnings;
27393     };
27394 }
27395
27396 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
27397 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
27398 function validationTagSuggestsArea() {
27399
27400     function tagSuggestsArea(tags) {
27401         if (isEmpty(tags)) return false;
27402
27403         var presence = ['landuse', 'amenities', 'tourism', 'shop'];
27404         for (var i = 0; i < presence.length; i++) {
27405             if (tags[presence[i]] !== undefined) {
27406                 return presence[i] + '=' + tags[presence[i]];
27407             }
27408         }
27409
27410         if (tags.building && tags.building === 'yes') return 'building=yes';
27411     }
27412
27413
27414     var validation = function(changes, graph) {
27415         var warnings = [];
27416         for (var i = 0; i < changes.created.length; i++) {
27417             var change = changes.created[i],
27418                 geometry = change.geometry(graph),
27419                 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
27420
27421             if (suggestion) {
27422                 warnings.push({
27423                     id: 'tag_suggests_area',
27424                     message: t('validations.tag_suggests_area', { tag: suggestion }),
27425                     entity: change
27426                 });
27427             }
27428         }
27429
27430         return warnings;
27431     };
27432
27433
27434     return validation;
27435 }
27436
27437
27438
27439 var Validations = Object.freeze({
27440         validationDeprecatedTag: validationDeprecatedTag,
27441         validationDisconnectedHighway: validationDisconnectedHighway,
27442         validationManyDeletions: validationManyDeletions,
27443         validationMissingTag: validationMissingTag,
27444         validationOldMultipolygon: validationOldMultipolygon,
27445         validationTagSuggestsArea: validationTagSuggestsArea
27446 });
27447
27448 /**
27449  * Performs a deep comparison between two values to determine if they are
27450  * equivalent.
27451  *
27452  * **Note:** This method supports comparing arrays, array buffers, booleans,
27453  * date objects, error objects, maps, numbers, `Object` objects, regexes,
27454  * sets, strings, symbols, and typed arrays. `Object` objects are compared
27455  * by their own, not inherited, enumerable properties. Functions and DOM
27456  * nodes are compared by strict equality, i.e. `===`.
27457  *
27458  * @static
27459  * @memberOf _
27460  * @since 0.1.0
27461  * @category Lang
27462  * @param {*} value The value to compare.
27463  * @param {*} other The other value to compare.
27464  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
27465  * @example
27466  *
27467  * var object = { 'a': 1 };
27468  * var other = { 'a': 1 };
27469  *
27470  * _.isEqual(object, other);
27471  * // => true
27472  *
27473  * object === other;
27474  * // => false
27475  */
27476 function isEqual(value, other) {
27477   return baseIsEqual(value, other);
27478 }
27479
27480 /*
27481     iD.Difference represents the difference between two graphs.
27482     It knows how to calculate the set of entities that were
27483     created, modified, or deleted, and also contains the logic
27484     for recursively extending a difference to the complete set
27485     of entities that will require a redraw, taking into account
27486     child and parent relationships.
27487  */
27488 function coreDifference(base, head) {
27489     var changes = {},
27490         difference$$1 = {},
27491         length = 0;
27492
27493
27494     function changed(h, b) {
27495         return h !== b && !isEqual(omit(h, 'v'), omit(b, 'v'));
27496     }
27497
27498
27499     forEach(head.entities, function(h, id) {
27500         var b = base.entities[id];
27501         if (changed(h, b)) {
27502             changes[id] = {base: b, head: h};
27503             length++;
27504         }
27505     });
27506
27507
27508     forEach(base.entities, function(b, id) {
27509         var h = head.entities[id];
27510         if (!changes[id] && changed(h, b)) {
27511             changes[id] = {base: b, head: h};
27512             length++;
27513         }
27514     });
27515
27516
27517     function addParents(parents, result) {
27518         for (var i = 0; i < parents.length; i++) {
27519             var parent = parents[i];
27520
27521             if (parent.id in result)
27522                 continue;
27523
27524             result[parent.id] = parent;
27525             addParents(head.parentRelations(parent), result);
27526         }
27527     }
27528
27529
27530     difference$$1.length = function() {
27531         return length;
27532     };
27533
27534
27535     difference$$1.changes = function() {
27536         return changes;
27537     };
27538
27539
27540     difference$$1.extantIDs = function() {
27541         var result = [];
27542         forEach(changes, function(change, id) {
27543             if (change.head) result.push(id);
27544         });
27545         return result;
27546     };
27547
27548
27549     difference$$1.modified = function() {
27550         var result = [];
27551         forEach(changes, function(change) {
27552             if (change.base && change.head) result.push(change.head);
27553         });
27554         return result;
27555     };
27556
27557
27558     difference$$1.created = function() {
27559         var result = [];
27560         forEach(changes, function(change) {
27561             if (!change.base && change.head) result.push(change.head);
27562         });
27563         return result;
27564     };
27565
27566
27567     difference$$1.deleted = function() {
27568         var result = [];
27569         forEach(changes, function(change) {
27570             if (change.base && !change.head) result.push(change.base);
27571         });
27572         return result;
27573     };
27574
27575
27576     difference$$1.summary = function() {
27577         var relevant = {};
27578
27579         function addEntity(entity, graph, changeType) {
27580             relevant[entity.id] = {
27581                 entity: entity,
27582                 graph: graph,
27583                 changeType: changeType
27584             };
27585         }
27586
27587         function addParents(entity) {
27588             var parents = head.parentWays(entity);
27589             for (var j = parents.length - 1; j >= 0; j--) {
27590                 var parent = parents[j];
27591                 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
27592             }
27593         }
27594
27595         forEach(changes, function(change) {
27596             if (change.head && change.head.geometry(head) !== 'vertex') {
27597                 addEntity(change.head, head, change.base ? 'modified' : 'created');
27598
27599             } else if (change.base && change.base.geometry(base) !== 'vertex') {
27600                 addEntity(change.base, base, 'deleted');
27601
27602             } else if (change.base && change.head) { // modified vertex
27603                 var moved    = !isEqual(change.base.loc,  change.head.loc),
27604                     retagged = !isEqual(change.base.tags, change.head.tags);
27605
27606                 if (moved) {
27607                     addParents(change.head);
27608                 }
27609
27610                 if (retagged || (moved && change.head.hasInterestingTags())) {
27611                     addEntity(change.head, head, 'modified');
27612                 }
27613
27614             } else if (change.head && change.head.hasInterestingTags()) { // created vertex
27615                 addEntity(change.head, head, 'created');
27616
27617             } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
27618                 addEntity(change.base, base, 'deleted');
27619             }
27620         });
27621
27622         return values$1(relevant);
27623     };
27624
27625
27626     difference$$1.complete = function(extent) {
27627         var result = {}, id, change;
27628
27629         for (id in changes) {
27630             change = changes[id];
27631
27632             var h = change.head,
27633                 b = change.base,
27634                 entity = h || b;
27635
27636             if (extent &&
27637                 (!h || !h.intersects(extent, head)) &&
27638                 (!b || !b.intersects(extent, base)))
27639                 continue;
27640
27641             result[id] = h;
27642
27643             if (entity.type === 'way') {
27644                 var nh = h ? h.nodes : [],
27645                     nb = b ? b.nodes : [],
27646                     diff, i;
27647
27648                 diff = difference(nh, nb);
27649                 for (i = 0; i < diff.length; i++) {
27650                     result[diff[i]] = head.hasEntity(diff[i]);
27651                 }
27652
27653                 diff = difference(nb, nh);
27654                 for (i = 0; i < diff.length; i++) {
27655                     result[diff[i]] = head.hasEntity(diff[i]);
27656                 }
27657             }
27658
27659             addParents(head.parentWays(entity), result);
27660             addParents(head.parentRelations(entity), result);
27661         }
27662
27663         return result;
27664     };
27665
27666
27667     return difference$$1;
27668 }
27669
27670 /** Used for built-in method references. */
27671 var objectProto$18 = Object.prototype;
27672
27673 /** Used to check objects for own properties. */
27674 var hasOwnProperty$15 = objectProto$18.hasOwnProperty;
27675
27676 /**
27677  * Assigns own enumerable string keyed properties of source objects to the
27678  * destination object. Source objects are applied from left to right.
27679  * Subsequent sources overwrite property assignments of previous sources.
27680  *
27681  * **Note:** This method mutates `object` and is loosely based on
27682  * [`Object.assign`](https://mdn.io/Object/assign).
27683  *
27684  * @static
27685  * @memberOf _
27686  * @since 0.10.0
27687  * @category Object
27688  * @param {Object} object The destination object.
27689  * @param {...Object} [sources] The source objects.
27690  * @returns {Object} Returns `object`.
27691  * @see _.assignIn
27692  * @example
27693  *
27694  * function Foo() {
27695  *   this.a = 1;
27696  * }
27697  *
27698  * function Bar() {
27699  *   this.c = 3;
27700  * }
27701  *
27702  * Foo.prototype.b = 2;
27703  * Bar.prototype.d = 4;
27704  *
27705  * _.assign({ 'a': 0 }, new Foo, new Bar);
27706  * // => { 'a': 1, 'c': 3 }
27707  */
27708 var assign = createAssigner(function(object, source) {
27709   if (isPrototype(source) || isArrayLike(source)) {
27710     copyObject(source, keys$1(source), object);
27711     return;
27712   }
27713   for (var key in source) {
27714     if (hasOwnProperty$15.call(source, key)) {
27715       assignValue(object, key, source[key]);
27716     }
27717   }
27718 });
27719
27720 /* Built-in method references for those with the same name as other `lodash` methods. */
27721 var nativeMax$3 = Math.max;
27722
27723 /**
27724  * Checks if `value` is in `collection`. If `collection` is a string, it's
27725  * checked for a substring of `value`, otherwise
27726  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27727  * is used for equality comparisons. If `fromIndex` is negative, it's used as
27728  * the offset from the end of `collection`.
27729  *
27730  * @static
27731  * @memberOf _
27732  * @since 0.1.0
27733  * @category Collection
27734  * @param {Array|Object|string} collection The collection to inspect.
27735  * @param {*} value The value to search for.
27736  * @param {number} [fromIndex=0] The index to search from.
27737  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
27738  * @returns {boolean} Returns `true` if `value` is found, else `false`.
27739  * @example
27740  *
27741  * _.includes([1, 2, 3], 1);
27742  * // => true
27743  *
27744  * _.includes([1, 2, 3], 1, 2);
27745  * // => false
27746  *
27747  * _.includes({ 'a': 1, 'b': 2 }, 1);
27748  * // => true
27749  *
27750  * _.includes('abcd', 'bc');
27751  * // => true
27752  */
27753 function includes(collection, value, fromIndex, guard) {
27754   collection = isArrayLike(collection) ? collection : values$1(collection);
27755   fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
27756
27757   var length = collection.length;
27758   if (fromIndex < 0) {
27759     fromIndex = nativeMax$3(length + fromIndex, 0);
27760   }
27761   return isString(collection)
27762     ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
27763     : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
27764 }
27765
27766 function coreGraph$$1(other, mutable) {
27767     if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
27768
27769     if (other instanceof coreGraph$$1) {
27770         var base = other.base();
27771         this.entities = assign(Object.create(base.entities), other.entities);
27772         this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
27773         this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
27774
27775     } else {
27776         this.entities = Object.create({});
27777         this._parentWays = Object.create({});
27778         this._parentRels = Object.create({});
27779         this.rebase(other || [], [this]);
27780     }
27781
27782     this.transients = {};
27783     this._childNodes = {};
27784     this.frozen = !mutable;
27785 }
27786
27787
27788 coreGraph$$1.prototype = {
27789
27790     hasEntity: function(id) {
27791         return this.entities[id];
27792     },
27793
27794
27795     entity: function(id) {
27796         var entity = this.entities[id];
27797
27798         //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
27799         if (!entity) {
27800             entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
27801         }
27802
27803         if (!entity) {
27804             throw new Error('entity ' + id + ' not found');
27805         }
27806         return entity;
27807     },
27808
27809
27810     transient: function(entity, key, fn) {
27811         var id = entity.id,
27812             transients = this.transients[id] ||
27813             (this.transients[id] = {});
27814
27815         if (transients[key] !== undefined) {
27816             return transients[key];
27817         }
27818
27819         transients[key] = fn.call(entity);
27820
27821         return transients[key];
27822     },
27823
27824
27825     parentWays: function(entity) {
27826         var parents = this._parentWays[entity.id],
27827             result = [];
27828
27829         if (parents) {
27830             for (var i = 0; i < parents.length; i++) {
27831                 result.push(this.entity(parents[i]));
27832             }
27833         }
27834         return result;
27835     },
27836
27837
27838     isPoi: function(entity) {
27839         var parentWays = this._parentWays[entity.id];
27840         return !parentWays || parentWays.length === 0;
27841     },
27842
27843
27844     isShared: function(entity) {
27845         var parentWays = this._parentWays[entity.id];
27846         return parentWays && parentWays.length > 1;
27847     },
27848
27849
27850     parentRelations: function(entity) {
27851         var parents = this._parentRels[entity.id],
27852             result = [];
27853
27854         if (parents) {
27855             for (var i = 0; i < parents.length; i++) {
27856                 result.push(this.entity(parents[i]));
27857             }
27858         }
27859         return result;
27860     },
27861
27862
27863     childNodes: function(entity) {
27864         if (this._childNodes[entity.id]) return this._childNodes[entity.id];
27865         if (!entity.nodes) return [];
27866
27867         var nodes = [];
27868         for (var i = 0; i < entity.nodes.length; i++) {
27869             nodes[i] = this.entity(entity.nodes[i]);
27870         }
27871
27872         if (debug) Object.freeze(nodes);
27873
27874         this._childNodes[entity.id] = nodes;
27875         return this._childNodes[entity.id];
27876     },
27877
27878
27879     base: function() {
27880         return {
27881             'entities': utilGetPrototypeOf(this.entities),
27882             'parentWays': utilGetPrototypeOf(this._parentWays),
27883             'parentRels': utilGetPrototypeOf(this._parentRels)
27884         };
27885     },
27886
27887
27888     // Unlike other graph methods, rebase mutates in place. This is because it
27889     // is used only during the history operation that merges newly downloaded
27890     // data into each state. To external consumers, it should appear as if the
27891     // graph always contained the newly downloaded data.
27892     rebase: function(entities, stack, force) {
27893         var base = this.base(),
27894             i, j, k, id;
27895
27896         for (i = 0; i < entities.length; i++) {
27897             var entity = entities[i];
27898
27899             if (!entity.visible || (!force && base.entities[entity.id]))
27900                 continue;
27901
27902             // Merging data into the base graph
27903             base.entities[entity.id] = entity;
27904             this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
27905
27906             // Restore provisionally-deleted nodes that are discovered to have an extant parent
27907             if (entity.type === 'way') {
27908                 for (j = 0; j < entity.nodes.length; j++) {
27909                     id = entity.nodes[j];
27910                     for (k = 1; k < stack.length; k++) {
27911                         var ents = stack[k].entities;
27912                         if (ents.hasOwnProperty(id) && ents[id] === undefined) {
27913                             delete ents[id];
27914                         }
27915                     }
27916                 }
27917             }
27918         }
27919
27920         for (i = 0; i < stack.length; i++) {
27921             stack[i]._updateRebased();
27922         }
27923     },
27924
27925
27926     _updateRebased: function() {
27927         var base = this.base(),
27928             i, k, child, id, keys;
27929
27930         keys = Object.keys(this._parentWays);
27931         for (i = 0; i < keys.length; i++) {
27932             child = keys[i];
27933             if (base.parentWays[child]) {
27934                 for (k = 0; k < base.parentWays[child].length; k++) {
27935                     id = base.parentWays[child][k];
27936                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
27937                         this._parentWays[child].push(id);
27938                     }
27939                 }
27940             }
27941         }
27942
27943         keys = Object.keys(this._parentRels);
27944         for (i = 0; i < keys.length; i++) {
27945             child = keys[i];
27946             if (base.parentRels[child]) {
27947                 for (k = 0; k < base.parentRels[child].length; k++) {
27948                     id = base.parentRels[child][k];
27949                     if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
27950                         this._parentRels[child].push(id);
27951                     }
27952                 }
27953             }
27954         }
27955
27956         this.transients = {};
27957
27958         // this._childNodes is not updated, under the assumption that
27959         // ways are always downloaded with their child nodes.
27960     },
27961
27962
27963     // Updates calculated properties (parentWays, parentRels) for the specified change
27964     _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
27965
27966         parentWays = parentWays || this._parentWays;
27967         parentRels = parentRels || this._parentRels;
27968
27969         var type = entity && entity.type || oldentity && oldentity.type,
27970             removed, added, ways, rels, i;
27971
27972
27973         if (type === 'way') {
27974
27975             // Update parentWays
27976             if (oldentity && entity) {
27977                 removed = difference(oldentity.nodes, entity.nodes);
27978                 added = difference(entity.nodes, oldentity.nodes);
27979             } else if (oldentity) {
27980                 removed = oldentity.nodes;
27981                 added = [];
27982             } else if (entity) {
27983                 removed = [];
27984                 added = entity.nodes;
27985             }
27986             for (i = 0; i < removed.length; i++) {
27987                 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
27988             }
27989             for (i = 0; i < added.length; i++) {
27990                 ways = without(parentWays[added[i]], entity.id);
27991                 ways.push(entity.id);
27992                 parentWays[added[i]] = ways;
27993             }
27994
27995         } else if (type === 'relation') {
27996
27997             // Update parentRels
27998             if (oldentity && entity) {
27999                 removed = difference(oldentity.members, entity.members);
28000                 added = difference(entity.members, oldentity);
28001             } else if (oldentity) {
28002                 removed = oldentity.members;
28003                 added = [];
28004             } else if (entity) {
28005                 removed = [];
28006                 added = entity.members;
28007             }
28008             for (i = 0; i < removed.length; i++) {
28009                 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
28010             }
28011             for (i = 0; i < added.length; i++) {
28012                 rels = without(parentRels[added[i].id], entity.id);
28013                 rels.push(entity.id);
28014                 parentRels[added[i].id] = rels;
28015             }
28016         }
28017     },
28018
28019
28020     replace: function(entity) {
28021         if (this.entities[entity.id] === entity)
28022             return this;
28023
28024         return this.update(function() {
28025             this._updateCalculated(this.entities[entity.id], entity);
28026             this.entities[entity.id] = entity;
28027         });
28028     },
28029
28030
28031     remove: function(entity) {
28032         return this.update(function() {
28033             this._updateCalculated(entity, undefined);
28034             this.entities[entity.id] = undefined;
28035         });
28036     },
28037
28038
28039     revert: function(id) {
28040         var baseEntity = this.base().entities[id],
28041             headEntity = this.entities[id];
28042
28043         if (headEntity === baseEntity)
28044             return this;
28045
28046         return this.update(function() {
28047             this._updateCalculated(headEntity, baseEntity);
28048             delete this.entities[id];
28049         });
28050     },
28051
28052
28053     update: function() {
28054         var graph = this.frozen ? coreGraph$$1(this, true) : this;
28055
28056         for (var i = 0; i < arguments.length; i++) {
28057             arguments[i].call(graph, graph);
28058         }
28059
28060         if (this.frozen) graph.frozen = true;
28061
28062         return graph;
28063     },
28064
28065
28066     // Obliterates any existing entities
28067     load: function(entities) {
28068         var base = this.base();
28069         this.entities = Object.create(base.entities);
28070
28071         for (var i in entities) {
28072             this.entities[i] = entities[i];
28073             this._updateCalculated(base.entities[i], this.entities[i]);
28074         }
28075
28076         return this;
28077     }
28078 };
28079
28080 var quickselect = partialSort;
28081
28082 // Floyd-Rivest selection algorithm:
28083 // Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
28084 // The k-th element will have the (k - left + 1)th smallest value in [left, right]
28085
28086 function partialSort(arr, k, left, right, compare) {
28087     left = left || 0;
28088     right = right || (arr.length - 1);
28089     compare = compare || defaultCompare;
28090
28091     while (right > left) {
28092         if (right - left > 600) {
28093             var n = right - left + 1;
28094             var m = k - left + 1;
28095             var z = Math.log(n);
28096             var s = 0.5 * Math.exp(2 * z / 3);
28097             var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
28098             var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
28099             var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
28100             partialSort(arr, k, newLeft, newRight, compare);
28101         }
28102
28103         var t = arr[k];
28104         var i = left;
28105         var j = right;
28106
28107         swap(arr, left, k);
28108         if (compare(arr[right], t) > 0) swap(arr, left, right);
28109
28110         while (i < j) {
28111             swap(arr, i, j);
28112             i++;
28113             j--;
28114             while (compare(arr[i], t) < 0) i++;
28115             while (compare(arr[j], t) > 0) j--;
28116         }
28117
28118         if (compare(arr[left], t) === 0) swap(arr, left, j);
28119         else {
28120             j++;
28121             swap(arr, j, right);
28122         }
28123
28124         if (j <= k) left = j + 1;
28125         if (k <= j) right = j - 1;
28126     }
28127 }
28128
28129 function swap(arr, i, j) {
28130     var tmp = arr[i];
28131     arr[i] = arr[j];
28132     arr[j] = tmp;
28133 }
28134
28135 function defaultCompare(a, b) {
28136     return a < b ? -1 : a > b ? 1 : 0;
28137 }
28138
28139 var rbush_1 = rbush;
28140
28141
28142
28143 function rbush(maxEntries, format) {
28144     if (!(this instanceof rbush)) return new rbush(maxEntries, format);
28145
28146     // max entries in a node is 9 by default; min node fill is 40% for best performance
28147     this._maxEntries = Math.max(4, maxEntries || 9);
28148     this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
28149
28150     if (format) {
28151         this._initFormat(format);
28152     }
28153
28154     this.clear();
28155 }
28156
28157 rbush.prototype = {
28158
28159     all: function () {
28160         return this._all(this.data, []);
28161     },
28162
28163     search: function (bbox) {
28164
28165         var node = this.data,
28166             result = [],
28167             toBBox = this.toBBox;
28168
28169         if (!intersects$1(bbox, node)) return result;
28170
28171         var nodesToSearch = [],
28172             i, len, child, childBBox;
28173
28174         while (node) {
28175             for (i = 0, len = node.children.length; i < len; i++) {
28176
28177                 child = node.children[i];
28178                 childBBox = node.leaf ? toBBox(child) : child;
28179
28180                 if (intersects$1(bbox, childBBox)) {
28181                     if (node.leaf) result.push(child);
28182                     else if (contains$2(bbox, childBBox)) this._all(child, result);
28183                     else nodesToSearch.push(child);
28184                 }
28185             }
28186             node = nodesToSearch.pop();
28187         }
28188
28189         return result;
28190     },
28191
28192     collides: function (bbox) {
28193
28194         var node = this.data,
28195             toBBox = this.toBBox;
28196
28197         if (!intersects$1(bbox, node)) return false;
28198
28199         var nodesToSearch = [],
28200             i, len, child, childBBox;
28201
28202         while (node) {
28203             for (i = 0, len = node.children.length; i < len; i++) {
28204
28205                 child = node.children[i];
28206                 childBBox = node.leaf ? toBBox(child) : child;
28207
28208                 if (intersects$1(bbox, childBBox)) {
28209                     if (node.leaf || contains$2(bbox, childBBox)) return true;
28210                     nodesToSearch.push(child);
28211                 }
28212             }
28213             node = nodesToSearch.pop();
28214         }
28215
28216         return false;
28217     },
28218
28219     load: function (data) {
28220         if (!(data && data.length)) return this;
28221
28222         if (data.length < this._minEntries) {
28223             for (var i = 0, len = data.length; i < len; i++) {
28224                 this.insert(data[i]);
28225             }
28226             return this;
28227         }
28228
28229         // recursively build the tree with the given data from stratch using OMT algorithm
28230         var node = this._build(data.slice(), 0, data.length - 1, 0);
28231
28232         if (!this.data.children.length) {
28233             // save as is if tree is empty
28234             this.data = node;
28235
28236         } else if (this.data.height === node.height) {
28237             // split root if trees have the same height
28238             this._splitRoot(this.data, node);
28239
28240         } else {
28241             if (this.data.height < node.height) {
28242                 // swap trees if inserted one is bigger
28243                 var tmpNode = this.data;
28244                 this.data = node;
28245                 node = tmpNode;
28246             }
28247
28248             // insert the small tree into the large tree at appropriate level
28249             this._insert(node, this.data.height - node.height - 1, true);
28250         }
28251
28252         return this;
28253     },
28254
28255     insert: function (item) {
28256         if (item) this._insert(item, this.data.height - 1);
28257         return this;
28258     },
28259
28260     clear: function () {
28261         this.data = createNode([]);
28262         return this;
28263     },
28264
28265     remove: function (item, equalsFn) {
28266         if (!item) return this;
28267
28268         var node = this.data,
28269             bbox = this.toBBox(item),
28270             path = [],
28271             indexes = [],
28272             i, parent, index, goingUp;
28273
28274         // depth-first iterative tree traversal
28275         while (node || path.length) {
28276
28277             if (!node) { // go up
28278                 node = path.pop();
28279                 parent = path[path.length - 1];
28280                 i = indexes.pop();
28281                 goingUp = true;
28282             }
28283
28284             if (node.leaf) { // check current node
28285                 index = findItem(item, node.children, equalsFn);
28286
28287                 if (index !== -1) {
28288                     // item found, remove the item and condense tree upwards
28289                     node.children.splice(index, 1);
28290                     path.push(node);
28291                     this._condense(path);
28292                     return this;
28293                 }
28294             }
28295
28296             if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
28297                 path.push(node);
28298                 indexes.push(i);
28299                 i = 0;
28300                 parent = node;
28301                 node = node.children[0];
28302
28303             } else if (parent) { // go right
28304                 i++;
28305                 node = parent.children[i];
28306                 goingUp = false;
28307
28308             } else node = null; // nothing found
28309         }
28310
28311         return this;
28312     },
28313
28314     toBBox: function (item) { return item; },
28315
28316     compareMinX: compareNodeMinX,
28317     compareMinY: compareNodeMinY,
28318
28319     toJSON: function () { return this.data; },
28320
28321     fromJSON: function (data) {
28322         this.data = data;
28323         return this;
28324     },
28325
28326     _all: function (node, result) {
28327         var nodesToSearch = [];
28328         while (node) {
28329             if (node.leaf) result.push.apply(result, node.children);
28330             else nodesToSearch.push.apply(nodesToSearch, node.children);
28331
28332             node = nodesToSearch.pop();
28333         }
28334         return result;
28335     },
28336
28337     _build: function (items, left, right, height) {
28338
28339         var N = right - left + 1,
28340             M = this._maxEntries,
28341             node;
28342
28343         if (N <= M) {
28344             // reached leaf level; return leaf
28345             node = createNode(items.slice(left, right + 1));
28346             calcBBox(node, this.toBBox);
28347             return node;
28348         }
28349
28350         if (!height) {
28351             // target height of the bulk-loaded tree
28352             height = Math.ceil(Math.log(N) / Math.log(M));
28353
28354             // target number of root entries to maximize storage utilization
28355             M = Math.ceil(N / Math.pow(M, height - 1));
28356         }
28357
28358         node = createNode([]);
28359         node.leaf = false;
28360         node.height = height;
28361
28362         // split the items into M mostly square tiles
28363
28364         var N2 = Math.ceil(N / M),
28365             N1 = N2 * Math.ceil(Math.sqrt(M)),
28366             i, j, right2, right3;
28367
28368         multiSelect(items, left, right, N1, this.compareMinX);
28369
28370         for (i = left; i <= right; i += N1) {
28371
28372             right2 = Math.min(i + N1 - 1, right);
28373
28374             multiSelect(items, i, right2, N2, this.compareMinY);
28375
28376             for (j = i; j <= right2; j += N2) {
28377
28378                 right3 = Math.min(j + N2 - 1, right2);
28379
28380                 // pack each entry recursively
28381                 node.children.push(this._build(items, j, right3, height - 1));
28382             }
28383         }
28384
28385         calcBBox(node, this.toBBox);
28386
28387         return node;
28388     },
28389
28390     _chooseSubtree: function (bbox, node, level, path) {
28391
28392         var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
28393
28394         while (true) {
28395             path.push(node);
28396
28397             if (node.leaf || path.length - 1 === level) break;
28398
28399             minArea = minEnlargement = Infinity;
28400
28401             for (i = 0, len = node.children.length; i < len; i++) {
28402                 child = node.children[i];
28403                 area = bboxArea(child);
28404                 enlargement = enlargedArea(bbox, child) - area;
28405
28406                 // choose entry with the least area enlargement
28407                 if (enlargement < minEnlargement) {
28408                     minEnlargement = enlargement;
28409                     minArea = area < minArea ? area : minArea;
28410                     targetNode = child;
28411
28412                 } else if (enlargement === minEnlargement) {
28413                     // otherwise choose one with the smallest area
28414                     if (area < minArea) {
28415                         minArea = area;
28416                         targetNode = child;
28417                     }
28418                 }
28419             }
28420
28421             node = targetNode || node.children[0];
28422         }
28423
28424         return node;
28425     },
28426
28427     _insert: function (item, level, isNode) {
28428
28429         var toBBox = this.toBBox,
28430             bbox = isNode ? item : toBBox(item),
28431             insertPath = [];
28432
28433         // find the best node for accommodating the item, saving all nodes along the path too
28434         var node = this._chooseSubtree(bbox, this.data, level, insertPath);
28435
28436         // put the item into the node
28437         node.children.push(item);
28438         extend$1(node, bbox);
28439
28440         // split on node overflow; propagate upwards if necessary
28441         while (level >= 0) {
28442             if (insertPath[level].children.length > this._maxEntries) {
28443                 this._split(insertPath, level);
28444                 level--;
28445             } else break;
28446         }
28447
28448         // adjust bboxes along the insertion path
28449         this._adjustParentBBoxes(bbox, insertPath, level);
28450     },
28451
28452     // split overflowed node into two
28453     _split: function (insertPath, level) {
28454
28455         var node = insertPath[level],
28456             M = node.children.length,
28457             m = this._minEntries;
28458
28459         this._chooseSplitAxis(node, m, M);
28460
28461         var splitIndex = this._chooseSplitIndex(node, m, M);
28462
28463         var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
28464         newNode.height = node.height;
28465         newNode.leaf = node.leaf;
28466
28467         calcBBox(node, this.toBBox);
28468         calcBBox(newNode, this.toBBox);
28469
28470         if (level) insertPath[level - 1].children.push(newNode);
28471         else this._splitRoot(node, newNode);
28472     },
28473
28474     _splitRoot: function (node, newNode) {
28475         // split root node
28476         this.data = createNode([node, newNode]);
28477         this.data.height = node.height + 1;
28478         this.data.leaf = false;
28479         calcBBox(this.data, this.toBBox);
28480     },
28481
28482     _chooseSplitIndex: function (node, m, M) {
28483
28484         var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
28485
28486         minOverlap = minArea = Infinity;
28487
28488         for (i = m; i <= M - m; i++) {
28489             bbox1 = distBBox(node, 0, i, this.toBBox);
28490             bbox2 = distBBox(node, i, M, this.toBBox);
28491
28492             overlap = intersectionArea(bbox1, bbox2);
28493             area = bboxArea(bbox1) + bboxArea(bbox2);
28494
28495             // choose distribution with minimum overlap
28496             if (overlap < minOverlap) {
28497                 minOverlap = overlap;
28498                 index = i;
28499
28500                 minArea = area < minArea ? area : minArea;
28501
28502             } else if (overlap === minOverlap) {
28503                 // otherwise choose distribution with minimum area
28504                 if (area < minArea) {
28505                     minArea = area;
28506                     index = i;
28507                 }
28508             }
28509         }
28510
28511         return index;
28512     },
28513
28514     // sorts node children by the best axis for split
28515     _chooseSplitAxis: function (node, m, M) {
28516
28517         var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
28518             compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
28519             xMargin = this._allDistMargin(node, m, M, compareMinX),
28520             yMargin = this._allDistMargin(node, m, M, compareMinY);
28521
28522         // if total distributions margin value is minimal for x, sort by minX,
28523         // otherwise it's already sorted by minY
28524         if (xMargin < yMargin) node.children.sort(compareMinX);
28525     },
28526
28527     // total margin of all possible split distributions where each node is at least m full
28528     _allDistMargin: function (node, m, M, compare) {
28529
28530         node.children.sort(compare);
28531
28532         var toBBox = this.toBBox,
28533             leftBBox = distBBox(node, 0, m, toBBox),
28534             rightBBox = distBBox(node, M - m, M, toBBox),
28535             margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
28536             i, child;
28537
28538         for (i = m; i < M - m; i++) {
28539             child = node.children[i];
28540             extend$1(leftBBox, node.leaf ? toBBox(child) : child);
28541             margin += bboxMargin(leftBBox);
28542         }
28543
28544         for (i = M - m - 1; i >= m; i--) {
28545             child = node.children[i];
28546             extend$1(rightBBox, node.leaf ? toBBox(child) : child);
28547             margin += bboxMargin(rightBBox);
28548         }
28549
28550         return margin;
28551     },
28552
28553     _adjustParentBBoxes: function (bbox, path, level) {
28554         // adjust bboxes along the given tree path
28555         for (var i = level; i >= 0; i--) {
28556             extend$1(path[i], bbox);
28557         }
28558     },
28559
28560     _condense: function (path) {
28561         // go through the path, removing empty nodes and updating bboxes
28562         for (var i = path.length - 1, siblings; i >= 0; i--) {
28563             if (path[i].children.length === 0) {
28564                 if (i > 0) {
28565                     siblings = path[i - 1].children;
28566                     siblings.splice(siblings.indexOf(path[i]), 1);
28567
28568                 } else this.clear();
28569
28570             } else calcBBox(path[i], this.toBBox);
28571         }
28572     },
28573
28574     _initFormat: function (format) {
28575         // data format (minX, minY, maxX, maxY accessors)
28576
28577         // uses eval-type function compilation instead of just accepting a toBBox function
28578         // because the algorithms are very sensitive to sorting functions performance,
28579         // so they should be dead simple and without inner calls
28580
28581         var compareArr = ['return a', ' - b', ';'];
28582
28583         this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
28584         this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
28585
28586         this.toBBox = new Function('a',
28587             'return {minX: a' + format[0] +
28588             ', minY: a' + format[1] +
28589             ', maxX: a' + format[2] +
28590             ', maxY: a' + format[3] + '};');
28591     }
28592 };
28593
28594 function findItem(item, items, equalsFn) {
28595     if (!equalsFn) return items.indexOf(item);
28596
28597     for (var i = 0; i < items.length; i++) {
28598         if (equalsFn(item, items[i])) return i;
28599     }
28600     return -1;
28601 }
28602
28603 // calculate node's bbox from bboxes of its children
28604 function calcBBox(node, toBBox) {
28605     distBBox(node, 0, node.children.length, toBBox, node);
28606 }
28607
28608 // min bounding rectangle of node children from k to p-1
28609 function distBBox(node, k, p, toBBox, destNode) {
28610     if (!destNode) destNode = createNode(null);
28611     destNode.minX = Infinity;
28612     destNode.minY = Infinity;
28613     destNode.maxX = -Infinity;
28614     destNode.maxY = -Infinity;
28615
28616     for (var i = k, child; i < p; i++) {
28617         child = node.children[i];
28618         extend$1(destNode, node.leaf ? toBBox(child) : child);
28619     }
28620
28621     return destNode;
28622 }
28623
28624 function extend$1(a, b) {
28625     a.minX = Math.min(a.minX, b.minX);
28626     a.minY = Math.min(a.minY, b.minY);
28627     a.maxX = Math.max(a.maxX, b.maxX);
28628     a.maxY = Math.max(a.maxY, b.maxY);
28629     return a;
28630 }
28631
28632 function compareNodeMinX(a, b) { return a.minX - b.minX; }
28633 function compareNodeMinY(a, b) { return a.minY - b.minY; }
28634
28635 function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
28636 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
28637
28638 function enlargedArea(a, b) {
28639     return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
28640            (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
28641 }
28642
28643 function intersectionArea(a, b) {
28644     var minX = Math.max(a.minX, b.minX),
28645         minY = Math.max(a.minY, b.minY),
28646         maxX = Math.min(a.maxX, b.maxX),
28647         maxY = Math.min(a.maxY, b.maxY);
28648
28649     return Math.max(0, maxX - minX) *
28650            Math.max(0, maxY - minY);
28651 }
28652
28653 function contains$2(a, b) {
28654     return a.minX <= b.minX &&
28655            a.minY <= b.minY &&
28656            b.maxX <= a.maxX &&
28657            b.maxY <= a.maxY;
28658 }
28659
28660 function intersects$1(a, b) {
28661     return b.minX <= a.maxX &&
28662            b.minY <= a.maxY &&
28663            b.maxX >= a.minX &&
28664            b.maxY >= a.minY;
28665 }
28666
28667 function createNode(children) {
28668     return {
28669         children: children,
28670         height: 1,
28671         leaf: true,
28672         minX: Infinity,
28673         minY: Infinity,
28674         maxX: -Infinity,
28675         maxY: -Infinity
28676     };
28677 }
28678
28679 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
28680 // combines selection algorithm with binary divide & conquer approach
28681
28682 function multiSelect(arr, left, right, n, compare) {
28683     var stack = [left, right],
28684         mid;
28685
28686     while (stack.length) {
28687         right = stack.pop();
28688         left = stack.pop();
28689
28690         if (right - left <= n) continue;
28691
28692         mid = left + Math.ceil((right - left) / n / 2) * n;
28693         quickselect(arr, mid, left, right, compare);
28694
28695         stack.push(left, mid, mid, right);
28696     }
28697 }
28698
28699 function coreTree(head) {
28700     var rtree = rbush_1(),
28701         bboxes = {},
28702         tree = {};
28703
28704
28705     function entityBBox(entity) {
28706         var bbox = entity.extent(head).bbox();
28707         bbox.id = entity.id;
28708         bboxes[entity.id] = bbox;
28709         return bbox;
28710     }
28711
28712
28713     function updateParents(entity, insertions, memo) {
28714         head.parentWays(entity).forEach(function(way) {
28715             if (bboxes[way.id]) {
28716                 rtree.remove(bboxes[way.id]);
28717                 insertions[way.id] = way;
28718             }
28719             updateParents(way, insertions, memo);
28720         });
28721
28722         head.parentRelations(entity).forEach(function(relation) {
28723             if (memo[entity.id]) return;
28724             memo[entity.id] = true;
28725             if (bboxes[relation.id]) {
28726                 rtree.remove(bboxes[relation.id]);
28727                 insertions[relation.id] = relation;
28728             }
28729             updateParents(relation, insertions, memo);
28730         });
28731     }
28732
28733
28734     tree.rebase = function(entities, force) {
28735         var insertions = {};
28736
28737         for (var i = 0; i < entities.length; i++) {
28738             var entity = entities[i];
28739
28740             if (!entity.visible)
28741                 continue;
28742
28743             if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
28744                 if (!force) {
28745                     continue;
28746                 } else if (bboxes[entity.id]) {
28747                     rtree.remove(bboxes[entity.id]);
28748                 }
28749             }
28750
28751             insertions[entity.id] = entity;
28752             updateParents(entity, insertions, {});
28753         }
28754
28755         rtree.load(map$4(insertions, entityBBox));
28756
28757         return tree;
28758     };
28759
28760
28761     tree.intersects = function(extent, graph) {
28762         if (graph !== head) {
28763             var diff = coreDifference(head, graph),
28764                 insertions = {};
28765
28766             head = graph;
28767
28768             diff.deleted().forEach(function(entity) {
28769                 rtree.remove(bboxes[entity.id]);
28770                 delete bboxes[entity.id];
28771             });
28772
28773             diff.modified().forEach(function(entity) {
28774                 rtree.remove(bboxes[entity.id]);
28775                 insertions[entity.id] = entity;
28776                 updateParents(entity, insertions, {});
28777             });
28778
28779             diff.created().forEach(function(entity) {
28780                 insertions[entity.id] = entity;
28781             });
28782
28783             rtree.load(map$4(insertions, entityBBox));
28784         }
28785
28786         return rtree.search(extent.bbox()).map(function(bbox) {
28787             return head.entity(bbox.id);
28788         });
28789     };
28790
28791
28792     return tree;
28793 }
28794
28795 /*
28796  * This code is licensed under the MIT license.
28797  *
28798  * Copyright © 2013, iD authors.
28799  *
28800  * Portions copyright © 2011, Keith Cirkel
28801  * See https://github.com/keithamus/jwerty
28802  *
28803  */
28804 function d3keybinding(namespace$$1) {
28805     var bindings = [];
28806
28807
28808     function testBindings(isCapturing) {
28809         var didMatch = false,
28810             i, binding;
28811
28812         // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28813         // so we don't strictly match on the shift key, but we prioritize
28814         // shifted bindings first, and fallback to unshifted only if no match.
28815         // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28816
28817         // priority match shifted bindings first
28818         for (i = 0; i < bindings.length; i++) {
28819             binding = bindings[i];
28820             if (!binding.event.modifiers.shiftKey) continue;  // no shift
28821             if (!!binding.capture !== isCapturing) continue;
28822             if (matches(binding, true)) {
28823                 binding.callback();
28824                 didMatch = true;
28825             }
28826         }
28827
28828         // then unshifted bindings
28829         if (didMatch) return;
28830         for (i = 0; i < bindings.length; i++) {
28831             binding = bindings[i];
28832             if (binding.event.modifiers.shiftKey) continue;   // shift
28833             if (!!binding.capture !== isCapturing) continue;
28834             if (matches(binding, false)) {
28835                 binding.callback();
28836             }
28837         }
28838
28839
28840         function matches(binding, testShift) {
28841             var event$$1 = event;
28842             if (event$$1.key !== undefined) {
28843                 if (binding.event.key === undefined) {
28844                     return false;
28845                 } else if (Array.isArray(binding.event.key)) {
28846                     if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28847                         return false;
28848                 } else {
28849                     if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28850                         return false;
28851                 }
28852             } else {
28853                 // check keycodes if browser doesn't support KeyboardEvent.key
28854                 if (event$$1.keyCode !== binding.event.keyCode)
28855                     return false;
28856             }
28857
28858             // test modifier keys
28859             if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
28860                 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28861                 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28862             }
28863             if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28864             if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28865
28866             return true;
28867         }
28868     }
28869
28870
28871     function capture() {
28872         testBindings(true);
28873     }
28874
28875
28876     function bubble() {
28877         var tagName = d3_select(event.target).node().tagName;
28878         if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28879             return;
28880         }
28881         testBindings(false);
28882     }
28883
28884
28885     function keybinding(selection$$1) {
28886         selection$$1 = selection$$1 || d3_select(document);
28887         selection$$1.on('keydown.capture' + namespace$$1, capture, true);
28888         selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
28889         return keybinding;
28890     }
28891
28892
28893     keybinding.off = function(selection$$1) {
28894         bindings = [];
28895         selection$$1 = selection$$1 || d3_select(document);
28896         selection$$1.on('keydown.capture' + namespace$$1, null);
28897         selection$$1.on('keydown.bubble' + namespace$$1, null);
28898         return keybinding;
28899     };
28900
28901
28902     keybinding.on = function(codes, callback, capture) {
28903         var arr = [].concat(codes);
28904         for (var i = 0; i < arr.length; i++) {
28905             var code = arr[i];
28906             var binding = {
28907                 event: {
28908                     key: undefined,
28909                     keyCode: 0, // only for browsers that don't support KeyboardEvent.key
28910                     modifiers: {
28911                         shiftKey: false,
28912                         ctrlKey: false,
28913                         altKey: false,
28914                         metaKey: false
28915                     }
28916                 },
28917                 capture: capture,
28918                 callback: callback
28919             };
28920
28921             code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28922
28923             for (var j = 0; j < code.length; j++) {
28924                 // Normalise matching errors
28925                 if (code[j] === '++') code[j] = '+';
28926
28927                 if (code[j] in d3keybinding.modifierCodes) {
28928                     binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
28929                 } else {
28930                     binding.event.key = d3keybinding.keys[code[j]] || code[j];
28931                     if (code[j] in d3keybinding.keyCodes) {
28932                         binding.event.keyCode = d3keybinding.keyCodes[code[j]];
28933                     }
28934                 }
28935             }
28936
28937             bindings.push(binding);
28938         }
28939
28940         return keybinding;
28941     };
28942
28943     return keybinding;
28944 }
28945
28946
28947 d3keybinding.modifierCodes = {
28948     // Shift key, ⇧
28949     '⇧': 16, shift: 16,
28950     // CTRL key, on Mac: ⌃
28951     '⌃': 17, ctrl: 17,
28952     // ALT key, on Mac: ⌥ (Alt)
28953     '⌥': 18, alt: 18, option: 18,
28954     // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28955     '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28956 };
28957
28958 d3keybinding.modifierProperties = {
28959     16: 'shiftKey',
28960     17: 'ctrlKey',
28961     18: 'altKey',
28962     91: 'metaKey'
28963 };
28964
28965 d3keybinding.keys = {
28966     // Backspace key, on Mac: ⌫ (Backspace)
28967     '⌫': 'Backspace', backspace: 'Backspace',
28968     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28969     '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28970     // Return key, ↩
28971     '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28972     // Pause/Break key
28973     'pause': 'Pause', 'pause-break': 'Pause',
28974     // Caps Lock key, ⇪
28975     '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28976     // Escape key, on Mac: ⎋, on Windows: Esc
28977     '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28978     // Space key
28979     space: [' ', 'Spacebar'],
28980     // Page-Up key, or pgup, on Mac: ↖
28981     '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28982     // Page-Down key, or pgdown, on Mac: ↘
28983     '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
28984     // END key, on Mac: ⇟
28985     '⇟': 'End', end: 'End',
28986     // HOME key, on Mac: ⇞
28987     '⇞': 'Home', home: 'Home',
28988     // Insert key, or ins
28989     ins: 'Insert', insert: 'Insert',
28990     // Delete key, on Mac: ⌦ (Delete)
28991     '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
28992     // Left Arrow Key, or ←
28993     '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
28994     // Up Arrow Key, or ↑
28995     '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
28996     // Right Arrow Key, or →
28997     '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
28998     // Up Arrow Key, or ↓
28999     '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29000     // odities, stuff for backward compatibility (browsers and code):
29001     // Num-Multiply, or *
29002     '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29003     // Num-Plus or +
29004     '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29005     // Num-Subtract, or -
29006     '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29007     // Semicolon
29008     semicolon: ';',
29009     // = or equals
29010     equals: '=',
29011     // Comma, or ,
29012     comma: ',',
29013     // Period, or ., or full-stop
29014     period: '.', 'full-stop': '.',
29015     // Slash, or /, or forward-slash
29016     slash: '/', 'forward-slash': '/',
29017     // Tick, or `, or back-quote
29018     tick: '`', 'back-quote': '`',
29019     // Open bracket, or [
29020     'open-bracket': '[',
29021     // Back slash, or \
29022     'back-slash': '\\',
29023     // Close backet, or ]
29024     'close-bracket': ']',
29025     // Apostrophe, or Quote, or '
29026     quote: '\'', apostrophe: '\'',
29027     // NUMPAD 0-9
29028     'num-0': '0',
29029     'num-1': '1',
29030     'num-2': '2',
29031     'num-3': '3',
29032     'num-4': '4',
29033     'num-5': '5',
29034     'num-6': '6',
29035     'num-7': '7',
29036     'num-8': '8',
29037     'num-9': '9',
29038     // F1-F25
29039     f1: 'F1',
29040     f2: 'F2',
29041     f3: 'F3',
29042     f4: 'F4',
29043     f5: 'F5',
29044     f6: 'F6',
29045     f7: 'F7',
29046     f8: 'F8',
29047     f9: 'F9',
29048     f10: 'F10',
29049     f11: 'F11',
29050     f12: 'F12',
29051     f13: 'F13',
29052     f14: 'F14',
29053     f15: 'F15',
29054     f16: 'F16',
29055     f17: 'F17',
29056     f18: 'F18',
29057     f19: 'F19',
29058     f20: 'F20',
29059     f21: 'F21',
29060     f22: 'F22',
29061     f23: 'F23',
29062     f24: 'F24',
29063     f25: 'F25'
29064 };
29065
29066 d3keybinding.keyCodes = {
29067     // Backspace key, on Mac: ⌫ (Backspace)
29068     '⌫': 8, backspace: 8,
29069     // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29070     '⇥': 9, '⇆': 9, tab: 9,
29071     // Return key, ↩
29072     '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29073     // Pause/Break key
29074     'pause': 19, 'pause-break': 19,
29075     // Caps Lock key, ⇪
29076     '⇪': 20, caps: 20, 'caps-lock': 20,
29077     // Escape key, on Mac: ⎋, on Windows: Esc
29078     '⎋': 27, escape: 27, esc: 27,
29079     // Space key
29080     space: 32,
29081     // Page-Up key, or pgup, on Mac: ↖
29082     '↖': 33, pgup: 33, 'page-up': 33,
29083     // Page-Down key, or pgdown, on Mac: ↘
29084     '↘': 34, pgdown: 34, 'page-down': 34,
29085     // END key, on Mac: ⇟
29086     '⇟': 35, end: 35,
29087     // HOME key, on Mac: ⇞
29088     '⇞': 36, home: 36,
29089     // Insert key, or ins
29090     ins: 45, insert: 45,
29091     // Delete key, on Mac: ⌦ (Delete)
29092     '⌦': 46, del: 46, 'delete': 46,
29093     // Left Arrow Key, or ←
29094     '←': 37, left: 37, 'arrow-left': 37,
29095     // Up Arrow Key, or ↑
29096     '↑': 38, up: 38, 'arrow-up': 38,
29097     // Right Arrow Key, or →
29098     '→': 39, right: 39, 'arrow-right': 39,
29099     // Up Arrow Key, or ↓
29100     '↓': 40, down: 40, 'arrow-down': 40,
29101     // odities, printing characters that come out wrong:
29102     // Firefox Equals
29103     'ffequals': 61,
29104     // Num-Multiply, or *
29105     '*': 106, star: 106, asterisk: 106, multiply: 106,
29106     // Num-Plus or +
29107     '+': 107, 'plus': 107,
29108     // Num-Subtract, or -
29109     '-': 109, subtract: 109,
29110     // Firefox Plus
29111     'ffplus': 171,
29112     // Firefox Minus
29113     'ffminus': 173,
29114     // Semicolon
29115     ';': 186, semicolon: 186,
29116     // = or equals
29117     '=': 187, 'equals': 187,
29118     // Comma, or ,
29119     ',': 188, comma: 188,
29120     // Dash / Underscore key
29121     'dash': 189,
29122     // Period, or ., or full-stop
29123     '.': 190, period: 190, 'full-stop': 190,
29124     // Slash, or /, or forward-slash
29125     '/': 191, slash: 191, 'forward-slash': 191,
29126     // Tick, or `, or back-quote
29127     '`': 192, tick: 192, 'back-quote': 192,
29128     // Open bracket, or [
29129     '[': 219, 'open-bracket': 219,
29130     // Back slash, or \
29131     '\\': 220, 'back-slash': 220,
29132     // Close backet, or ]
29133     ']': 221, 'close-bracket': 221,
29134     // Apostrophe, or Quote, or '
29135     '\'': 222, quote: 222, apostrophe: 222
29136 };
29137
29138 // NUMPAD 0-9
29139 var i$1 = 95;
29140 var n = 0;
29141 while (++i$1 < 106) {
29142     d3keybinding.keyCodes['num-' + n] = i$1;
29143     ++n;
29144 }
29145
29146 // 0-9
29147 i$1 = 47; n = 0;
29148 while (++i$1 < 58) {
29149     d3keybinding.keyCodes[n] = i$1;
29150     ++n;
29151 }
29152
29153 // F1-F25
29154 i$1 = 111; n = 1;
29155 while (++i$1 < 136) {
29156     d3keybinding.keyCodes['f' + n] = i$1;
29157     ++n;
29158 }
29159
29160 // a-z
29161 i$1 = 64;
29162 while (++i$1 < 91) {
29163     d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29164 }
29165
29166 function tooltip() {
29167   var tooltip = function(selection$$1) {
29168       selection$$1.each(setup);
29169     },
29170     animation = utilFunctor(false),
29171     html = utilFunctor(false),
29172     title = function() {
29173       var title = this.getAttribute('data-original-title');
29174       if (title) {
29175         return title;
29176       } else {
29177         title = this.getAttribute('title');
29178         this.removeAttribute('title');
29179         this.setAttribute('data-original-title', title);
29180       }
29181       return title;
29182     },
29183     over = 'mouseenter.tooltip',
29184     out = 'mouseleave.tooltip',
29185     placement = utilFunctor('top');
29186
29187
29188   tooltip.title = function(_) {
29189     if (arguments.length) {
29190       title = utilFunctor(_);
29191       return tooltip;
29192     } else {
29193       return title;
29194     }
29195   };
29196
29197
29198   tooltip.html = function(_) {
29199     if (arguments.length) {
29200       html = utilFunctor(_);
29201       return tooltip;
29202     } else {
29203       return html;
29204     }
29205   };
29206
29207
29208   tooltip.placement = function(_) {
29209     if (arguments.length) {
29210       placement = utilFunctor(_);
29211       return tooltip;
29212     } else {
29213       return placement;
29214     }
29215   };
29216
29217
29218   tooltip.show = function(selection$$1) {
29219     selection$$1.each(show);
29220   };
29221
29222
29223   tooltip.hide = function(selection$$1) {
29224     selection$$1.each(hide);
29225   };
29226
29227
29228   tooltip.toggle = function(selection$$1) {
29229     selection$$1.each(toggle);
29230   };
29231
29232
29233   tooltip.destroy = function(selection$$1) {
29234     selection$$1
29235       .on(over, null)
29236       .on(out, null)
29237       .attr('title', function() {
29238         return this.getAttribute('data-original-title') || this.getAttribute('title');
29239       })
29240       .attr('data-original-title', null)
29241       .selectAll('.tooltip')
29242       .remove();
29243   };
29244
29245
29246   function setup() {
29247     var root = d3_select(this),
29248         animate = animation.apply(this, arguments),
29249         tip = root.selectAll('.tooltip').data([0]);
29250
29251     var enter = tip.enter()
29252       .append('div')
29253       .attr('class', 'tooltip');
29254
29255     enter
29256       .append('div')
29257       .attr('class', 'tooltip-arrow');
29258
29259     enter
29260       .append('div')
29261       .attr('class', 'tooltip-inner');
29262
29263     tip = enter
29264       .merge(tip);
29265
29266     if (animate) {
29267       tip.classed('fade', true);
29268     }
29269
29270     var place = placement.apply(this, arguments);
29271     tip.classed(place, true);
29272
29273     root.on(over, show);
29274     root.on(out, hide);
29275   }
29276
29277
29278   function show() {
29279     var root = d3_select(this),
29280       content = title.apply(this, arguments),
29281       tip = root.selectAll('.tooltip')
29282         .classed('in', true),
29283       markup = html.apply(this, arguments);
29284
29285     tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29286     var place = placement.apply(this, arguments),
29287       outer = getPosition(root.node()),
29288       inner = getPosition(tip.node()),
29289       pos;
29290
29291     switch (place) {
29292       case 'top':
29293         pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29294         break;
29295       case 'right':
29296         pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29297         break;
29298       case 'left':
29299         pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29300         break;
29301       case 'bottom':
29302         pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29303         break;
29304     }
29305
29306     if (pos) {
29307       tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29308     } else {
29309       tip.style('left', null).style('top', null);
29310     }
29311
29312     this.tooltipVisible = true;
29313   }
29314
29315
29316   function hide() {
29317     d3_select(this).selectAll('.tooltip')
29318       .classed('in', false);
29319
29320     this.tooltipVisible = false;
29321   }
29322
29323
29324   function toggle() {
29325     if (this.tooltipVisible) {
29326       hide.apply(this, arguments);
29327     } else {
29328       show.apply(this, arguments);
29329     }
29330   }
29331
29332   return tooltip;
29333 }
29334
29335
29336 function getPosition(node) {
29337   var mode = d3_select(node).style('position');
29338   if (mode === 'absolute' || mode === 'static') {
29339     return {
29340       x: node.offsetLeft,
29341       y: node.offsetTop,
29342       w: node.offsetWidth,
29343       h: node.offsetHeight
29344     };
29345   } else {
29346     return {
29347       x: 0,
29348       y: 0,
29349       w: node.offsetWidth,
29350       h: node.offsetHeight
29351     };
29352   }
29353 }
29354
29355 function svgAreas$$1(projection, context) {
29356     // Patterns only work in Firefox when set directly on element.
29357     // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
29358     var patterns = {
29359         beach: 'beach',
29360         cemetery: 'cemetery',
29361         construction: 'construction',
29362         farm: 'farmland',
29363         farmland: 'farmland',
29364         grave_yard: 'cemetery',
29365         meadow: 'meadow',
29366         military: 'construction',
29367         orchard: 'orchard',
29368         sand: 'beach',
29369         scrub: 'scrub',
29370         wetland: 'wetland',
29371     };
29372
29373     var patternKeys = ['landuse', 'natural', 'amenity'];
29374
29375
29376     function setPattern(d) {
29377         for (var i = 0; i < patternKeys.length; i++) {
29378             if (d.tags.building && d.tags.building !== 'no') continue;
29379
29380             if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
29381                 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
29382                 return;
29383             }
29384         }
29385         this.style.fill = this.style.stroke = '';
29386     }
29387
29388
29389     return function drawAreas(selection, graph, entities, filter) {
29390         var path = svgPath(projection, graph, true),
29391             areas = {},
29392             multipolygon;
29393
29394         for (var i = 0; i < entities.length; i++) {
29395             var entity = entities[i];
29396             if (entity.geometry(graph) !== 'area') continue;
29397
29398             multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
29399             if (multipolygon) {
29400                 areas[multipolygon.id] = {
29401                     entity: multipolygon.mergeTags(entity.tags),
29402                     area: Math.abs(entity.area(graph))
29403                 };
29404             } else if (!areas[entity.id]) {
29405                 areas[entity.id] = {
29406                     entity: entity,
29407                     area: Math.abs(entity.area(graph))
29408                 };
29409             }
29410         }
29411
29412         areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
29413         areas.sort(function areaSort(a, b) { return b.area - a.area; });
29414         areas = map$4(areas, 'entity');
29415
29416         var strokes = areas.filter(function(area) {
29417             return area.type === 'way';
29418         });
29419
29420         var data = {
29421             clip: areas,
29422             shadow: strokes,
29423             stroke: strokes,
29424             fill: areas
29425         };
29426
29427         var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath')
29428            .filter(filter)
29429            .data(data.clip, osmEntity$$1.key);
29430
29431         clipPaths.exit()
29432            .remove();
29433
29434         var clipPathsEnter = clipPaths.enter()
29435            .append('clipPath')
29436            .attr('class', 'clipPath')
29437            .attr('id', function(entity) { return entity.id + '-clippath'; });
29438
29439         clipPathsEnter
29440            .append('path');
29441
29442         clipPaths.merge(clipPathsEnter)
29443            .selectAll('path')
29444            .attr('d', path);
29445
29446
29447         var layer = selection.selectAll('.layer-areas');
29448
29449         var areagroup = layer
29450             .selectAll('g.areagroup')
29451             .data(['fill', 'shadow', 'stroke']);
29452
29453         areagroup = areagroup.enter()
29454             .append('g')
29455             .attr('class', function(d) { return 'areagroup area-' + d; })
29456             .merge(areagroup);
29457
29458         var paths = areagroup
29459             .selectAll('path')
29460             .filter(filter)
29461             .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
29462
29463         paths.exit()
29464             .remove();
29465
29466         var fills = selection.selectAll('.area-fill path.area').nodes();
29467
29468         var bisect = d3_bisector(function(node) {
29469             return -node.__data__.area(graph);
29470         }).left;
29471
29472         function sortedByArea(entity) {
29473             if (this._parent.__data__ === 'fill') {
29474                 return fills[bisect(fills, -entity.area(graph))];
29475             }
29476         }
29477
29478         paths = paths.enter()
29479             .insert('path', sortedByArea)
29480             .merge(paths)
29481             .each(function(entity) {
29482                 var layer = this.parentNode.__data__;
29483
29484                 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
29485
29486                 if (layer === 'fill') {
29487                     this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
29488                     setPattern.apply(this, arguments);
29489                 }
29490             })
29491             .call(svgTagClasses())
29492             .attr('d', path);
29493     };
29494 }
29495
29496 function svgDebug(projection$$1, context) {
29497
29498     function multipolygons(imagery) {
29499         return imagery.map(function(data$$1) {
29500             return {
29501                 type: 'MultiPolygon',
29502                 coordinates: [ data$$1.polygon ]
29503             };
29504         });
29505     }
29506
29507     function drawDebug(selection$$1) {
29508         var showsTile = context.getDebug('tile'),
29509             showsCollision = context.getDebug('collision'),
29510             showsImagery = context.getDebug('imagery'),
29511             showsImperial = context.getDebug('imperial'),
29512             showsDriveLeft = context.getDebug('driveLeft'),
29513             path = d3_geoPath(projection$$1);
29514
29515
29516         var debugData = [];
29517         if (showsTile) {
29518             debugData.push({ class: 'red', label: 'tile' });
29519         }
29520         if (showsCollision) {
29521             debugData.push({ class: 'yellow', label: 'collision' });
29522         }
29523         if (showsImagery) {
29524             debugData.push({ class: 'orange', label: 'imagery' });
29525         }
29526         if (showsImperial) {
29527             debugData.push({ class: 'cyan', label: 'imperial' });
29528         }
29529         if (showsDriveLeft) {
29530             debugData.push({ class: 'green', label: 'driveLeft' });
29531         }
29532
29533
29534         var legend = d3_select('#content')
29535             .selectAll('.debug-legend')
29536             .data(debugData.length ? [0] : []);
29537
29538         legend.exit()
29539             .remove();
29540
29541         legend = legend.enter()
29542             .append('div')
29543             .attr('class', 'fillD debug-legend')
29544             .merge(legend);
29545
29546
29547         var legendItems = legend.selectAll('.debug-legend-item')
29548             .data(debugData, function(d) { return d.label; });
29549
29550         legendItems.exit()
29551             .remove();
29552
29553         legendItems.enter()
29554             .append('span')
29555             .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
29556             .text(function(d) { return d.label; });
29557
29558
29559         var layer = selection$$1.selectAll('.layer-debug')
29560             .data(showsImagery || showsImperial || showsDriveLeft ? [0] : []);
29561
29562         layer.exit()
29563             .remove();
29564
29565         layer = layer.enter()
29566             .append('g')
29567             .attr('class', 'layer-debug')
29568             .merge(layer);
29569
29570
29571         var extent = context.map().extent(),
29572             dataImagery = data.imagery || [],
29573             availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) {
29574                 if (!source.polygon) return false;
29575                 return source.polygon.some(function(polygon) {
29576                     return geoPolygonIntersectsPolygon(polygon, extent, true);
29577                 });
29578             }));
29579
29580         var imagery = layer.selectAll('path.debug-imagery')
29581             .data(showsImagery ? availableImagery : []);
29582
29583         imagery.exit()
29584             .remove();
29585
29586         imagery.enter()
29587             .append('path')
29588             .attr('class', 'debug-imagery debug orange');
29589
29590
29591         var imperial = layer
29592             .selectAll('path.debug-imperial')
29593             .data(showsImperial ? [dataImperial] : []);
29594
29595         imperial.exit()
29596             .remove();
29597
29598         imperial.enter()
29599             .append('path')
29600             .attr('class', 'debug-imperial debug cyan');
29601
29602
29603         var driveLeft = layer
29604             .selectAll('path.debug-drive-left')
29605             .data(showsDriveLeft ? [dataDriveLeft] : []);
29606
29607         driveLeft.exit()
29608             .remove();
29609
29610         driveLeft.enter()
29611             .append('path')
29612             .attr('class', 'debug-drive-left debug green');
29613
29614
29615         // update
29616         layer.selectAll('path')
29617             .attr('d', path);
29618     }
29619
29620
29621     // This looks strange because `enabled` methods on other layers are
29622     // chainable getter/setters, and this one is just a getter.
29623     drawDebug.enabled = function() {
29624         if (!arguments.length) {
29625             return context.getDebug('tile') ||
29626                 context.getDebug('collision') ||
29627                 context.getDebug('imagery') ||
29628                 context.getDebug('imperial') ||
29629                 context.getDebug('driveLeft');
29630         } else {
29631             return this;
29632         }
29633     };
29634
29635
29636     return drawDebug;
29637 }
29638
29639 /*
29640     A standalone SVG element that contains only a `defs` sub-element. To be
29641     used once globally, since defs IDs must be unique within a document.
29642 */
29643 function svgDefs(context) {
29644
29645     function SVGSpriteDefinition(id, href) {
29646         return function(defs) {
29647             d3_request(href)
29648                 .mimeType('image/svg+xml')
29649                 .response(function(xhr) { return xhr.responseXML; })
29650                 .get(function(err, svg) {
29651                     if (err) return;
29652                     defs.node().appendChild(
29653                         d3_select(svg.documentElement).attr('id', id).node()
29654                     );
29655                 });
29656         };
29657     }
29658
29659
29660     return function drawDefs(selection$$1) {
29661         var defs = selection$$1.append('defs');
29662
29663         // marker
29664         defs.append('marker')
29665             .attr('id', 'oneway-marker')
29666             .attr('viewBox', '0 0 10 10')
29667             .attr('refY', 2.5)
29668             .attr('refX', 5)
29669             .attr('markerWidth', 2)
29670             .attr('markerHeight', 2)
29671             .attr('markerUnits', 'strokeWidth')
29672             .attr('orient', 'auto')
29673
29674             .append('path')
29675             .attr('class', 'oneway')
29676             .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')
29677             .attr('stroke', 'none')
29678             .attr('fill', '#000')
29679             .attr('opacity', '0.75');
29680
29681         // patterns
29682         var patterns = defs.selectAll('pattern')
29683             .data([
29684                 // pattern name, pattern image name
29685                 ['wetland', 'wetland'],
29686                 ['construction', 'construction'],
29687                 ['cemetery', 'cemetery'],
29688                 ['orchard', 'orchard'],
29689                 ['farmland', 'farmland'],
29690                 ['beach', 'dots'],
29691                 ['scrub', 'dots'],
29692                 ['meadow', 'dots']
29693             ])
29694             .enter()
29695             .append('pattern')
29696             .attr('id', function (d) {
29697                 return 'pattern-' + d[0];
29698             })
29699             .attr('width', 32)
29700             .attr('height', 32)
29701             .attr('patternUnits', 'userSpaceOnUse');
29702
29703         patterns.append('rect')
29704             .attr('x', 0)
29705             .attr('y', 0)
29706             .attr('width', 32)
29707             .attr('height', 32)
29708             .attr('class', function (d) {
29709                     return 'pattern-color-' + d[0];
29710             });
29711
29712         patterns.append('image')
29713             .attr('x', 0)
29714             .attr('y', 0)
29715             .attr('width', 32)
29716             .attr('height', 32)
29717             .attr('xlink:href', function (d) {
29718                 return context.imagePath('pattern/' + d[1] + '.png');
29719             });
29720
29721         // clip paths
29722         defs.selectAll()
29723             .data([12, 18, 20, 32, 45])
29724             .enter()
29725             .append('clipPath')
29726             .attr('id', function (d) {
29727                 return 'clip-square-' + d;
29728             })
29729             .append('rect')
29730             .attr('x', 0)
29731             .attr('y', 0)
29732             .attr('width', function (d) {
29733                 return d;
29734             })
29735             .attr('height', function (d) {
29736                 return d;
29737             });
29738
29739         defs.call(SVGSpriteDefinition(
29740             'iD-sprite',
29741             context.imagePath('iD-sprite.svg')));
29742
29743         defs.call(SVGSpriteDefinition(
29744             'maki-sprite',
29745             context.imagePath('maki-sprite.svg')));
29746     };
29747 }
29748
29749 /**
29750  * Checks if `value` is `undefined`.
29751  *
29752  * @static
29753  * @since 0.1.0
29754  * @memberOf _
29755  * @category Lang
29756  * @param {*} value The value to check.
29757  * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
29758  * @example
29759  *
29760  * _.isUndefined(void 0);
29761  * // => true
29762  *
29763  * _.isUndefined(null);
29764  * // => false
29765  */
29766 function isUndefined(value) {
29767   return value === undefined;
29768 }
29769
29770 /**
29771  * The base implementation of `_.reduce` and `_.reduceRight`, without support
29772  * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
29773  *
29774  * @private
29775  * @param {Array|Object} collection The collection to iterate over.
29776  * @param {Function} iteratee The function invoked per iteration.
29777  * @param {*} accumulator The initial value.
29778  * @param {boolean} initAccum Specify using the first or last element of
29779  *  `collection` as the initial value.
29780  * @param {Function} eachFunc The function to iterate over `collection`.
29781  * @returns {*} Returns the accumulated value.
29782  */
29783 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
29784   eachFunc(collection, function(value, index, collection) {
29785     accumulator = initAccum
29786       ? (initAccum = false, value)
29787       : iteratee(accumulator, value, index, collection);
29788   });
29789   return accumulator;
29790 }
29791
29792 /**
29793  * Reduces `collection` to a value which is the accumulated result of running
29794  * each element in `collection` thru `iteratee`, where each successive
29795  * invocation is supplied the return value of the previous. If `accumulator`
29796  * is not given, the first element of `collection` is used as the initial
29797  * value. The iteratee is invoked with four arguments:
29798  * (accumulator, value, index|key, collection).
29799  *
29800  * Many lodash methods are guarded to work as iteratees for methods like
29801  * `_.reduce`, `_.reduceRight`, and `_.transform`.
29802  *
29803  * The guarded methods are:
29804  * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
29805  * and `sortBy`
29806  *
29807  * @static
29808  * @memberOf _
29809  * @since 0.1.0
29810  * @category Collection
29811  * @param {Array|Object} collection The collection to iterate over.
29812  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
29813  * @param {*} [accumulator] The initial value.
29814  * @returns {*} Returns the accumulated value.
29815  * @see _.reduceRight
29816  * @example
29817  *
29818  * _.reduce([1, 2], function(sum, n) {
29819  *   return sum + n;
29820  * }, 0);
29821  * // => 3
29822  *
29823  * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
29824  *   (result[value] || (result[value] = [])).push(key);
29825  *   return result;
29826  * }, {});
29827  * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
29828  */
29829 function reduce(collection, iteratee, accumulator) {
29830   var func = isArray(collection) ? arrayReduce : baseReduce,
29831       initAccum = arguments.length < 3;
29832
29833   return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
29834 }
29835
29836 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
29837
29838
29839
29840
29841
29842 function createCommonjsModule(fn, module) {
29843         return module = { exports: {} }, fn(module, module.exports), module.exports;
29844 }
29845
29846 //[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]
29847 //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
29848 //[5]           Name       ::=          NameStartChar (NameChar)*
29849 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
29850 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
29851 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
29852 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
29853 //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(',')
29854
29855 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
29856 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
29857 var S_TAG = 0;//tag name offerring
29858 var S_ATTR = 1;//attr name offerring 
29859 var S_ATTR_SPACE=2;//attr name end and space offer
29860 var S_EQ = 3;//=space?
29861 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
29862 var S_ATTR_END = 5;//attr value end and no space(quot end)
29863 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
29864 var S_TAG_CLOSE = 7;//closed el<el />
29865
29866 function XMLReader(){
29867         
29868 }
29869
29870 XMLReader.prototype = {
29871         parse:function(source,defaultNSMap,entityMap){
29872                 var domBuilder = this.domBuilder;
29873                 domBuilder.startDocument();
29874                 _copy(defaultNSMap ,defaultNSMap = {});
29875                 parse(source,defaultNSMap,entityMap,
29876                                 domBuilder,this.errorHandler);
29877                 domBuilder.endDocument();
29878         }
29879 };
29880 function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
29881         function fixedFromCharCode(code) {
29882                 // String.prototype.fromCharCode does not supports
29883                 // > 2 bytes unicode chars directly
29884                 if (code > 0xffff) {
29885                         code -= 0x10000;
29886                         var surrogate1 = 0xd800 + (code >> 10)
29887                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
29888
29889                         return String.fromCharCode(surrogate1, surrogate2);
29890                 } else {
29891                         return String.fromCharCode(code);
29892                 }
29893         }
29894         function entityReplacer(a){
29895                 var k = a.slice(1,-1);
29896                 if(k in entityMap){
29897                         return entityMap[k]; 
29898                 }else if(k.charAt(0) === '#'){
29899                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
29900                 }else{
29901                         errorHandler.error('entity not found:'+a);
29902                         return a;
29903                 }
29904         }
29905         function appendText(end){//has some bugs
29906                 if(end>start){
29907                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
29908                         locator&&position(start);
29909                         domBuilder.characters(xt,0,end-start);
29910                         start = end;
29911                 }
29912         }
29913         function position(p,m){
29914                 while(p>=lineEnd && (m = linePattern.exec(source))){
29915                         lineStart = m.index;
29916                         lineEnd = lineStart + m[0].length;
29917                         locator.lineNumber++;
29918                         //console.log('line++:',locator,startPos,endPos)
29919                 }
29920                 locator.columnNumber = p-lineStart+1;
29921         }
29922         var lineStart = 0;
29923         var lineEnd = 0;
29924         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
29925         var locator = domBuilder.locator;
29926         
29927         var parseStack = [{currentNSMap:defaultNSMapCopy}];
29928         var closeMap = {};
29929         var start = 0;
29930         while(true){
29931                 try{
29932                         var tagStart = source.indexOf('<',start);
29933                         if(tagStart<0){
29934                                 if(!source.substr(start).match(/^\s*$/)){
29935                                         var doc = domBuilder.doc;
29936                                 var text = doc.createTextNode(source.substr(start));
29937                                 doc.appendChild(text);
29938                                 domBuilder.currentElement = text;
29939                                 }
29940                                 return;
29941                         }
29942                         if(tagStart>start){
29943                                 appendText(tagStart);
29944                         }
29945                         switch(source.charAt(tagStart+1)){
29946                         case '/':
29947                                 var end = source.indexOf('>',tagStart+3);
29948                                 var tagName = source.substring(tagStart+2,end);
29949                                 var config = parseStack.pop();
29950                                 if(end<0){
29951                                         
29952                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
29953                                 //console.error('#@@@@@@'+tagName)
29954                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
29955                                 end = tagStart+1+tagName.length;
29956                         }else if(tagName.match(/\s</)){
29957                                 tagName = tagName.replace(/[\s<].*/,'');
29958                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
29959                                 end = tagStart+1+tagName.length;
29960                                 }
29961                                 //console.error(parseStack.length,parseStack)
29962                                 //console.error(config);
29963                                 var localNSMap = config.localNSMap;
29964                                 var endMatch = config.tagName == tagName;
29965                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
29966                         if(endIgnoreCaseMach){
29967                                 domBuilder.endElement(config.uri,config.localName,tagName);
29968                                         if(localNSMap){
29969                                                 for(var prefix in localNSMap){
29970                                                         domBuilder.endPrefixMapping(prefix) ;
29971                                                 }
29972                                         }
29973                                         if(!endMatch){
29974                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
29975                                         }
29976                         }else{
29977                                 parseStack.push(config);
29978                         }
29979                                 
29980                                 end++;
29981                                 break;
29982                                 // end elment
29983                         case '?':// <?...?>
29984                                 locator&&position(tagStart);
29985                                 end = parseInstruction(source,tagStart,domBuilder);
29986                                 break;
29987                         case '!':// <!doctype,<![CDATA,<!--
29988                                 locator&&position(tagStart);
29989                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
29990                                 break;
29991                         default:
29992                                 locator&&position(tagStart);
29993                                 var el = new ElementAttributes();
29994                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
29995                                 //elStartEnd
29996                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
29997                                 var len = el.length;
29998                                 
29999                                 
30000                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
30001                                         el.closed = true;
30002                                         if(!entityMap.nbsp){
30003                                                 errorHandler.warning('unclosed xml attribute');
30004                                         }
30005                                 }
30006                                 if(locator && len){
30007                                         var locator2 = copyLocator(locator,{});
30008                                         //try{//attribute position fixed
30009                                         for(var i = 0;i<len;i++){
30010                                                 var a = el[i];
30011                                                 position(a.offset);
30012                                                 a.locator = copyLocator(locator,{});
30013                                         }
30014                                         //}catch(e){console.error('@@@@@'+e)}
30015                                         domBuilder.locator = locator2;
30016                                         if(appendElement(el,domBuilder,currentNSMap)){
30017                                                 parseStack.push(el);
30018                                         }
30019                                         domBuilder.locator = locator;
30020                                 }else{
30021                                         if(appendElement(el,domBuilder,currentNSMap)){
30022                                                 parseStack.push(el);
30023                                         }
30024                                 }
30025                                 
30026                                 
30027                                 
30028                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
30029                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
30030                                 }else{
30031                                         end++;
30032                                 }
30033                         }
30034                 }catch(e){
30035                         errorHandler.error('element parse error: '+e);
30036                         //errorHandler.error('element parse error: '+e);
30037                         end = -1;
30038                         //throw e;
30039                 }
30040                 if(end>start){
30041                         start = end;
30042                 }else{
30043                         //TODO: 这里有可能sax回退,有位置错误风险
30044                         appendText(Math.max(tagStart,start)+1);
30045                 }
30046         }
30047 }
30048 function copyLocator(f,t){
30049         t.lineNumber = f.lineNumber;
30050         t.columnNumber = f.columnNumber;
30051         return t;
30052 }
30053
30054 /**
30055  * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
30056  * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
30057  */
30058 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
30059         var attrName;
30060         var value;
30061         var p = ++start;
30062         var s = S_TAG;//status
30063         while(true){
30064                 var c = source.charAt(p);
30065                 switch(c){
30066                 case '=':
30067                         if(s === S_ATTR){//attrName
30068                                 attrName = source.slice(start,p);
30069                                 s = S_EQ;
30070                         }else if(s === S_ATTR_SPACE){
30071                                 s = S_EQ;
30072                         }else{
30073                                 //fatalError: equal must after attrName or space after attrName
30074                                 throw new Error('attribute equal must after attrName');
30075                         }
30076                         break;
30077                 case '\'':
30078                 case '"':
30079                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
30080                                 ){//equal
30081                                 if(s === S_ATTR){
30082                                         errorHandler.warning('attribute value must after "="');
30083                                         attrName = source.slice(start,p);
30084                                 }
30085                                 start = p+1;
30086                                 p = source.indexOf(c,start);
30087                                 if(p>0){
30088                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
30089                                         el.add(attrName,value,start-1);
30090                                         s = S_ATTR_END;
30091                                 }else{
30092                                         //fatalError: no end quot match
30093                                         throw new Error('attribute value no end \''+c+'\' match');
30094                                 }
30095                         }else if(s == S_ATTR_NOQUOT_VALUE){
30096                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
30097                                 //console.log(attrName,value,start,p)
30098                                 el.add(attrName,value,start);
30099                                 //console.dir(el)
30100                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
30101                                 start = p+1;
30102                                 s = S_ATTR_END;
30103                         }else{
30104                                 //fatalError: no equal before
30105                                 throw new Error('attribute value must after "="');
30106                         }
30107                         break;
30108                 case '/':
30109                         switch(s){
30110                         case S_TAG:
30111                                 el.setTagName(source.slice(start,p));
30112                         case S_ATTR_END:
30113                         case S_TAG_SPACE:
30114                         case S_TAG_CLOSE:
30115                                 s =S_TAG_CLOSE;
30116                                 el.closed = true;
30117                         case S_ATTR_NOQUOT_VALUE:
30118                         case S_ATTR:
30119                         case S_ATTR_SPACE:
30120                                 break;
30121                         //case S_EQ:
30122                         default:
30123                                 throw new Error("attribute invalid close char('/')")
30124                         }
30125                         break;
30126                 case ''://end document
30127                         //throw new Error('unexpected end of input')
30128                         errorHandler.error('unexpected end of input');
30129                         if(s == S_TAG){
30130                                 el.setTagName(source.slice(start,p));
30131                         }
30132                         return p;
30133                 case '>':
30134                         switch(s){
30135                         case S_TAG:
30136                                 el.setTagName(source.slice(start,p));
30137                         case S_ATTR_END:
30138                         case S_TAG_SPACE:
30139                         case S_TAG_CLOSE:
30140                                 break;//normal
30141                         case S_ATTR_NOQUOT_VALUE://Compatible state
30142                         case S_ATTR:
30143                                 value = source.slice(start,p);
30144                                 if(value.slice(-1) === '/'){
30145                                         el.closed  = true;
30146                                         value = value.slice(0,-1);
30147                                 }
30148                         case S_ATTR_SPACE:
30149                                 if(s === S_ATTR_SPACE){
30150                                         value = attrName;
30151                                 }
30152                                 if(s == S_ATTR_NOQUOT_VALUE){
30153                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
30154                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
30155                                 }else{
30156                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
30157                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
30158                                         }
30159                                         el.add(value,value,start);
30160                                 }
30161                                 break;
30162                         case S_EQ:
30163                                 throw new Error('attribute value missed!!');
30164                         }
30165 //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
30166                         return p;
30167                 /*xml space '\x20' | #x9 | #xD | #xA; */
30168                 case '\u0080':
30169                         c = ' ';
30170                 default:
30171                         if(c<= ' '){//space
30172                                 switch(s){
30173                                 case S_TAG:
30174                                         el.setTagName(source.slice(start,p));//tagName
30175                                         s = S_TAG_SPACE;
30176                                         break;
30177                                 case S_ATTR:
30178                                         attrName = source.slice(start,p);
30179                                         s = S_ATTR_SPACE;
30180                                         break;
30181                                 case S_ATTR_NOQUOT_VALUE:
30182                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
30183                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
30184                                         el.add(attrName,value,start);
30185                                 case S_ATTR_END:
30186                                         s = S_TAG_SPACE;
30187                                         break;
30188                                 //case S_TAG_SPACE:
30189                                 //case S_EQ:
30190                                 //case S_ATTR_SPACE:
30191                                 //      void();break;
30192                                 //case S_TAG_CLOSE:
30193                                         //ignore warning
30194                                 }
30195                         }else{//not space
30196 //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
30197 //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
30198                                 switch(s){
30199                                 //case S_TAG:void();break;
30200                                 //case S_ATTR:void();break;
30201                                 //case S_ATTR_NOQUOT_VALUE:void();break;
30202                                 case S_ATTR_SPACE:
30203                                         var tagName =  el.tagName;
30204                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
30205                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
30206                                         }
30207                                         el.add(attrName,attrName,start);
30208                                         start = p;
30209                                         s = S_ATTR;
30210                                         break;
30211                                 case S_ATTR_END:
30212                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
30213                                 case S_TAG_SPACE:
30214                                         s = S_ATTR;
30215                                         start = p;
30216                                         break;
30217                                 case S_EQ:
30218                                         s = S_ATTR_NOQUOT_VALUE;
30219                                         start = p;
30220                                         break;
30221                                 case S_TAG_CLOSE:
30222                                         throw new Error("elements closed character '/' and '>' must be connected to");
30223                                 }
30224                         }
30225                 }//end outer switch
30226                 //console.log('p++',p)
30227                 p++;
30228         }
30229 }
30230 /**
30231  * @return true if has new namespace define
30232  */
30233 function appendElement(el,domBuilder,currentNSMap){
30234         var tagName = el.tagName;
30235         var localNSMap = null;
30236         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
30237         var i = el.length;
30238         while(i--){
30239                 var a = el[i];
30240                 var qName = a.qName;
30241                 var value = a.value;
30242                 var nsp = qName.indexOf(':');
30243                 if(nsp>0){
30244                         var prefix = a.prefix = qName.slice(0,nsp);
30245                         var localName = qName.slice(nsp+1);
30246                         var nsPrefix = prefix === 'xmlns' && localName;
30247                 }else{
30248                         localName = qName;
30249                         prefix = null;
30250                         nsPrefix = qName === 'xmlns' && '';
30251                 }
30252                 //can not set prefix,because prefix !== ''
30253                 a.localName = localName ;
30254                 //prefix == null for no ns prefix attribute 
30255                 if(nsPrefix !== false){//hack!!
30256                         if(localNSMap == null){
30257                                 localNSMap = {};
30258                                 //console.log(currentNSMap,0)
30259                                 _copy(currentNSMap,currentNSMap={});
30260                                 //console.log(currentNSMap,1)
30261                         }
30262                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
30263                         a.uri = 'http://www.w3.org/2000/xmlns/';
30264                         domBuilder.startPrefixMapping(nsPrefix, value); 
30265                 }
30266         }
30267         var i = el.length;
30268         while(i--){
30269                 a = el[i];
30270                 var prefix = a.prefix;
30271                 if(prefix){//no prefix attribute has no namespace
30272                         if(prefix === 'xml'){
30273                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
30274                         }if(prefix !== 'xmlns'){
30275                                 a.uri = currentNSMap[prefix || ''];
30276                                 
30277                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
30278                         }
30279                 }
30280         }
30281         var nsp = tagName.indexOf(':');
30282         if(nsp>0){
30283                 prefix = el.prefix = tagName.slice(0,nsp);
30284                 localName = el.localName = tagName.slice(nsp+1);
30285         }else{
30286                 prefix = null;//important!!
30287                 localName = el.localName = tagName;
30288         }
30289         //no prefix element has default namespace
30290         var ns = el.uri = currentNSMap[prefix || ''];
30291         domBuilder.startElement(ns,localName,tagName,el);
30292         //endPrefixMapping and startPrefixMapping have not any help for dom builder
30293         //localNSMap = null
30294         if(el.closed){
30295                 domBuilder.endElement(ns,localName,tagName);
30296                 if(localNSMap){
30297                         for(prefix in localNSMap){
30298                                 domBuilder.endPrefixMapping(prefix); 
30299                         }
30300                 }
30301         }else{
30302                 el.currentNSMap = currentNSMap;
30303                 el.localNSMap = localNSMap;
30304                 //parseStack.push(el);
30305                 return true;
30306         }
30307 }
30308 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
30309         if(/^(?:script|textarea)$/i.test(tagName)){
30310                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
30311                 var text = source.substring(elStartEnd+1,elEndStart);
30312                 if(/[&<]/.test(text)){
30313                         if(/^script$/i.test(tagName)){
30314                                 //if(!/\]\]>/.test(text)){
30315                                         //lexHandler.startCDATA();
30316                                         domBuilder.characters(text,0,text.length);
30317                                         //lexHandler.endCDATA();
30318                                         return elEndStart;
30319                                 //}
30320                         }//}else{//text area
30321                                 text = text.replace(/&#?\w+;/g,entityReplacer);
30322                                 domBuilder.characters(text,0,text.length);
30323                                 return elEndStart;
30324                         //}
30325                         
30326                 }
30327         }
30328         return elStartEnd+1;
30329 }
30330 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
30331         //if(tagName in closeMap){
30332         var pos = closeMap[tagName];
30333         if(pos == null){
30334                 //console.log(tagName)
30335                 pos =  source.lastIndexOf('</'+tagName+'>');
30336                 if(pos<elStartEnd){//忘记闭合
30337                         pos = source.lastIndexOf('</'+tagName);
30338                 }
30339                 closeMap[tagName] =pos;
30340         }
30341         return pos<elStartEnd;
30342         //} 
30343 }
30344 function _copy(source,target){
30345         for(var n in source){target[n] = source[n];}
30346 }
30347 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
30348         var next= source.charAt(start+2);
30349         switch(next){
30350         case '-':
30351                 if(source.charAt(start + 3) === '-'){
30352                         var end = source.indexOf('-->',start+4);
30353                         //append comment source.substring(4,end)//<!--
30354                         if(end>start){
30355                                 domBuilder.comment(source,start+4,end-start-4);
30356                                 return end+3;
30357                         }else{
30358                                 errorHandler.error("Unclosed comment");
30359                                 return -1;
30360                         }
30361                 }else{
30362                         //error
30363                         return -1;
30364                 }
30365         default:
30366                 if(source.substr(start+3,6) == 'CDATA['){
30367                         var end = source.indexOf(']]>',start+9);
30368                         domBuilder.startCDATA();
30369                         domBuilder.characters(source,start+9,end-start-9);
30370                         domBuilder.endCDATA(); 
30371                         return end+3;
30372                 }
30373                 //<!DOCTYPE
30374                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
30375                 var matchs = split(source,start);
30376                 var len = matchs.length;
30377                 if(len>1 && /!doctype/i.test(matchs[0][0])){
30378                         var name = matchs[1][0];
30379                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
30380                         var sysid = len>4 && matchs[4][0];
30381                         var lastMatch = matchs[len-1];
30382                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
30383                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
30384                         domBuilder.endDTD();
30385                         
30386                         return lastMatch.index+lastMatch[0].length
30387                 }
30388         }
30389         return -1;
30390 }
30391
30392
30393
30394 function parseInstruction(source,start,domBuilder){
30395         var end = source.indexOf('?>',start);
30396         if(end){
30397                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
30398                 if(match){
30399                         var len = match[0].length;
30400                         domBuilder.processingInstruction(match[1], match[2]) ;
30401                         return end+2;
30402                 }else{//error
30403                         return -1;
30404                 }
30405         }
30406         return -1;
30407 }
30408
30409 /**
30410  * @param source
30411  */
30412 function ElementAttributes(source){
30413         
30414 }
30415 ElementAttributes.prototype = {
30416         setTagName:function(tagName){
30417                 if(!tagNamePattern.test(tagName)){
30418                         throw new Error('invalid tagName:'+tagName)
30419                 }
30420                 this.tagName = tagName;
30421         },
30422         add:function(qName,value,offset){
30423                 if(!tagNamePattern.test(qName)){
30424                         throw new Error('invalid attribute:'+qName)
30425                 }
30426                 this[this.length++] = {qName:qName,value:value,offset:offset};
30427         },
30428         length:0,
30429         getLocalName:function(i){return this[i].localName},
30430         getLocator:function(i){return this[i].locator},
30431         getQName:function(i){return this[i].qName},
30432         getURI:function(i){return this[i].uri},
30433         getValue:function(i){return this[i].value}
30434 //      ,getIndex:function(uri, localName)){
30435 //              if(localName){
30436 //                      
30437 //              }else{
30438 //                      var qName = uri
30439 //              }
30440 //      },
30441 //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
30442 //      getType:function(uri,localName){}
30443 //      getType:function(i){},
30444 };
30445
30446
30447
30448
30449 function _set_proto_(thiz,parent){
30450         thiz.__proto__ = parent;
30451         return thiz;
30452 }
30453 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
30454         _set_proto_ = function(thiz,parent){
30455                 function p(){}
30456                 p.prototype = parent;
30457                 p = new p();
30458                 for(parent in thiz){
30459                         p[parent] = thiz[parent];
30460                 }
30461                 return p;
30462         };
30463 }
30464
30465 function split(source,start){
30466         var match;
30467         var buf = [];
30468         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
30469         reg.lastIndex = start;
30470         reg.exec(source);//skip <
30471         while(match = reg.exec(source)){
30472                 buf.push(match);
30473                 if(match[1])return buf;
30474         }
30475 }
30476
30477 var XMLReader_1 = XMLReader;
30478
30479 var sax = {
30480         XMLReader: XMLReader_1
30481 };
30482
30483 /*
30484  * DOM Level 2
30485  * Object DOMException
30486  * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
30487  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
30488  */
30489
30490 function copy$1(src,dest){
30491         for(var p in src){
30492                 dest[p] = src[p];
30493         }
30494 }
30495 /**
30496 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
30497 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
30498  */
30499 function _extends(Class,Super){
30500         var pt = Class.prototype;
30501         if(Object.create){
30502                 var ppt = Object.create(Super.prototype);
30503                 pt.__proto__ = ppt;
30504         }
30505         if(!(pt instanceof Super)){
30506                 function t(){}
30507                 t.prototype = Super.prototype;
30508                 t = new t();
30509                 copy$1(pt,t);
30510                 Class.prototype = pt = t;
30511         }
30512         if(pt.constructor != Class){
30513                 if(typeof Class != 'function'){
30514                         console.error("unknow Class:"+Class);
30515                 }
30516                 pt.constructor = Class;
30517         }
30518 }
30519 var htmlns = 'http://www.w3.org/1999/xhtml';
30520 // Node Types
30521 var NodeType = {};
30522 var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
30523 var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
30524 var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
30525 var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
30526 var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
30527 var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
30528 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
30529 var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
30530 var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
30531 var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
30532 var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
30533 var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
30534
30535 // ExceptionCode
30536 var ExceptionCode = {};
30537 var ExceptionMessage = {};
30538 var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
30539 var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
30540 var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
30541 var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
30542 var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
30543 var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
30544 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
30545 var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
30546 var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
30547 var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
30548 //level2
30549 var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
30550 var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
30551 var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
30552 var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
30553 var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
30554
30555
30556 function DOMException(code, message) {
30557         if(message instanceof Error){
30558                 var error = message;
30559         }else{
30560                 error = this;
30561                 Error.call(this, ExceptionMessage[code]);
30562                 this.message = ExceptionMessage[code];
30563                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
30564         }
30565         error.code = code;
30566         if(message) this.message = this.message + ": " + message;
30567         return error;
30568 }
30569 DOMException.prototype = Error.prototype;
30570 copy$1(ExceptionCode,DOMException);
30571 /**
30572  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
30573  * 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.
30574  * The items in the NodeList are accessible via an integral index, starting from 0.
30575  */
30576 function NodeList() {
30577 }
30578 NodeList.prototype = {
30579         /**
30580          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
30581          * @standard level1
30582          */
30583         length:0, 
30584         /**
30585          * 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.
30586          * @standard level1
30587          * @param index  unsigned long 
30588          *   Index into the collection.
30589          * @return Node
30590          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
30591          */
30592         item: function(index) {
30593                 return this[index] || null;
30594         },
30595         toString:function(isHTML,nodeFilter){
30596                 for(var buf = [], i = 0;i<this.length;i++){
30597                         serializeToString(this[i],buf,isHTML,nodeFilter);
30598                 }
30599                 return buf.join('');
30600         }
30601 };
30602 function LiveNodeList(node,refresh){
30603         this._node = node;
30604         this._refresh = refresh;
30605         _updateLiveList(this);
30606 }
30607 function _updateLiveList(list){
30608         var inc = list._node._inc || list._node.ownerDocument._inc;
30609         if(list._inc != inc){
30610                 var ls = list._refresh(list._node);
30611                 //console.log(ls.length)
30612                 __set__(list,'length',ls.length);
30613                 copy$1(ls,list);
30614                 list._inc = inc;
30615         }
30616 }
30617 LiveNodeList.prototype.item = function(i){
30618         _updateLiveList(this);
30619         return this[i];
30620 };
30621
30622 _extends(LiveNodeList,NodeList);
30623 /**
30624  * 
30625  * 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.
30626  * NamedNodeMap objects in the DOM are live.
30627  * used for attributes or DocumentType entities 
30628  */
30629 function NamedNodeMap() {
30630 }
30631
30632 function _findNodeIndex(list,node){
30633         var i = list.length;
30634         while(i--){
30635                 if(list[i] === node){return i}
30636         }
30637 }
30638
30639 function _addNamedNode(el,list,newAttr,oldAttr){
30640         if(oldAttr){
30641                 list[_findNodeIndex(list,oldAttr)] = newAttr;
30642         }else{
30643                 list[list.length++] = newAttr;
30644         }
30645         if(el){
30646                 newAttr.ownerElement = el;
30647                 var doc = el.ownerDocument;
30648                 if(doc){
30649                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
30650                         _onAddAttribute(doc,el,newAttr);
30651                 }
30652         }
30653 }
30654 function _removeNamedNode(el,list,attr){
30655         //console.log('remove attr:'+attr)
30656         var i = _findNodeIndex(list,attr);
30657         if(i>=0){
30658                 var lastIndex = list.length-1;
30659                 while(i<lastIndex){
30660                         list[i] = list[++i];
30661                 }
30662                 list.length = lastIndex;
30663                 if(el){
30664                         var doc = el.ownerDocument;
30665                         if(doc){
30666                                 _onRemoveAttribute(doc,el,attr);
30667                                 attr.ownerElement = null;
30668                         }
30669                 }
30670         }else{
30671                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
30672         }
30673 }
30674 NamedNodeMap.prototype = {
30675         length:0,
30676         item:NodeList.prototype.item,
30677         getNamedItem: function(key) {
30678 //              if(key.indexOf(':')>0 || key == 'xmlns'){
30679 //                      return null;
30680 //              }
30681                 //console.log()
30682                 var i = this.length;
30683                 while(i--){
30684                         var attr = this[i];
30685                         //console.log(attr.nodeName,key)
30686                         if(attr.nodeName == key){
30687                                 return attr;
30688                         }
30689                 }
30690         },
30691         setNamedItem: function(attr) {
30692                 var el = attr.ownerElement;
30693                 if(el && el!=this._ownerElement){
30694                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
30695                 }
30696                 var oldAttr = this.getNamedItem(attr.nodeName);
30697                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
30698                 return oldAttr;
30699         },
30700         /* returns Node */
30701         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
30702                 var el = attr.ownerElement, oldAttr;
30703                 if(el && el!=this._ownerElement){
30704                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
30705                 }
30706                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
30707                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
30708                 return oldAttr;
30709         },
30710
30711         /* returns Node */
30712         removeNamedItem: function(key) {
30713                 var attr = this.getNamedItem(key);
30714                 _removeNamedNode(this._ownerElement,this,attr);
30715                 return attr;
30716                 
30717                 
30718         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
30719         
30720         //for level2
30721         removeNamedItemNS:function(namespaceURI,localName){
30722                 var attr = this.getNamedItemNS(namespaceURI,localName);
30723                 _removeNamedNode(this._ownerElement,this,attr);
30724                 return attr;
30725         },
30726         getNamedItemNS: function(namespaceURI, localName) {
30727                 var i = this.length;
30728                 while(i--){
30729                         var node = this[i];
30730                         if(node.localName == localName && node.namespaceURI == namespaceURI){
30731                                 return node;
30732                         }
30733                 }
30734                 return null;
30735         }
30736 };
30737 /**
30738  * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
30739  */
30740 function DOMImplementation(/* Object */ features) {
30741         this._features = {};
30742         if (features) {
30743                 for (var feature in features) {
30744                          this._features = features[feature];
30745                 }
30746         }
30747 }
30748
30749 DOMImplementation.prototype = {
30750         hasFeature: function(/* string */ feature, /* string */ version) {
30751                 var versions = this._features[feature.toLowerCase()];
30752                 if (versions && (!version || version in versions)) {
30753                         return true;
30754                 } else {
30755                         return false;
30756                 }
30757         },
30758         // Introduced in DOM Level 2:
30759         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
30760                 var doc = new Document();
30761                 doc.implementation = this;
30762                 doc.childNodes = new NodeList();
30763                 doc.doctype = doctype;
30764                 if(doctype){
30765                         doc.appendChild(doctype);
30766                 }
30767                 if(qualifiedName){
30768                         var root = doc.createElementNS(namespaceURI,qualifiedName);
30769                         doc.appendChild(root);
30770                 }
30771                 return doc;
30772         },
30773         // Introduced in DOM Level 2:
30774         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
30775                 var node = new DocumentType();
30776                 node.name = qualifiedName;
30777                 node.nodeName = qualifiedName;
30778                 node.publicId = publicId;
30779                 node.systemId = systemId;
30780                 // Introduced in DOM Level 2:
30781                 //readonly attribute DOMString        internalSubset;
30782                 
30783                 //TODO:..
30784                 //  readonly attribute NamedNodeMap     entities;
30785                 //  readonly attribute NamedNodeMap     notations;
30786                 return node;
30787         }
30788 };
30789
30790
30791 /**
30792  * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
30793  */
30794
30795 function Node$2() {
30796 }
30797
30798 Node$2.prototype = {
30799         firstChild : null,
30800         lastChild : null,
30801         previousSibling : null,
30802         nextSibling : null,
30803         attributes : null,
30804         parentNode : null,
30805         childNodes : null,
30806         ownerDocument : null,
30807         nodeValue : null,
30808         namespaceURI : null,
30809         prefix : null,
30810         localName : null,
30811         // Modified in DOM Level 2:
30812         insertBefore:function(newChild, refChild){//raises 
30813                 return _insertBefore(this,newChild,refChild);
30814         },
30815         replaceChild:function(newChild, oldChild){//raises 
30816                 this.insertBefore(newChild,oldChild);
30817                 if(oldChild){
30818                         this.removeChild(oldChild);
30819                 }
30820         },
30821         removeChild:function(oldChild){
30822                 return _removeChild(this,oldChild);
30823         },
30824         appendChild:function(newChild){
30825                 return this.insertBefore(newChild,null);
30826         },
30827         hasChildNodes:function(){
30828                 return this.firstChild != null;
30829         },
30830         cloneNode:function(deep){
30831                 return cloneNode(this.ownerDocument||this,this,deep);
30832         },
30833         // Modified in DOM Level 2:
30834         normalize:function(){
30835                 var child = this.firstChild;
30836                 while(child){
30837                         var next = child.nextSibling;
30838                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
30839                                 this.removeChild(next);
30840                                 child.appendData(next.data);
30841                         }else{
30842                                 child.normalize();
30843                                 child = next;
30844                         }
30845                 }
30846         },
30847         // Introduced in DOM Level 2:
30848         isSupported:function(feature, version){
30849                 return this.ownerDocument.implementation.hasFeature(feature,version);
30850         },
30851     // Introduced in DOM Level 2:
30852     hasAttributes:function(){
30853         return this.attributes.length>0;
30854     },
30855     lookupPrefix:function(namespaceURI){
30856         var el = this;
30857         while(el){
30858                 var map = el._nsMap;
30859                 //console.dir(map)
30860                 if(map){
30861                         for(var n in map){
30862                                 if(map[n] == namespaceURI){
30863                                         return n;
30864                                 }
30865                         }
30866                 }
30867                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
30868         }
30869         return null;
30870     },
30871     // Introduced in DOM Level 3:
30872     lookupNamespaceURI:function(prefix){
30873         var el = this;
30874         while(el){
30875                 var map = el._nsMap;
30876                 //console.dir(map)
30877                 if(map){
30878                         if(prefix in map){
30879                                 return map[prefix] ;
30880                         }
30881                 }
30882                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
30883         }
30884         return null;
30885     },
30886     // Introduced in DOM Level 3:
30887     isDefaultNamespace:function(namespaceURI){
30888         var prefix = this.lookupPrefix(namespaceURI);
30889         return prefix == null;
30890     }
30891 };
30892
30893
30894 function _xmlEncoder(c){
30895         return c == '<' && '&lt;' ||
30896          c == '>' && '&gt;' ||
30897          c == '&' && '&amp;' ||
30898          c == '"' && '&quot;' ||
30899          '&#'+c.charCodeAt()+';'
30900 }
30901
30902
30903 copy$1(NodeType,Node$2);
30904 copy$1(NodeType,Node$2.prototype);
30905
30906 /**
30907  * @param callback return true for continue,false for break
30908  * @return boolean true: break visit;
30909  */
30910 function _visitNode(node,callback){
30911         if(callback(node)){
30912                 return true;
30913         }
30914         if(node = node.firstChild){
30915                 do{
30916                         if(_visitNode(node,callback)){return true}
30917         }while(node=node.nextSibling)
30918     }
30919 }
30920
30921
30922
30923 function Document(){
30924 }
30925 function _onAddAttribute(doc,el,newAttr){
30926         doc && doc._inc++;
30927         var ns = newAttr.namespaceURI;
30928         if(ns == 'http://www.w3.org/2000/xmlns/'){
30929                 //update namespace
30930                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
30931         }
30932 }
30933 function _onRemoveAttribute(doc,el,newAttr,remove){
30934         doc && doc._inc++;
30935         var ns = newAttr.namespaceURI;
30936         if(ns == 'http://www.w3.org/2000/xmlns/'){
30937                 //update namespace
30938                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
30939         }
30940 }
30941 function _onUpdateChild(doc,el,newChild){
30942         if(doc && doc._inc){
30943                 doc._inc++;
30944                 //update childNodes
30945                 var cs = el.childNodes;
30946                 if(newChild){
30947                         cs[cs.length++] = newChild;
30948                 }else{
30949                         //console.log(1)
30950                         var child = el.firstChild;
30951                         var i = 0;
30952                         while(child){
30953                                 cs[i++] = child;
30954                                 child =child.nextSibling;
30955                         }
30956                         cs.length = i;
30957                 }
30958         }
30959 }
30960
30961 /**
30962  * attributes;
30963  * children;
30964  * 
30965  * writeable properties:
30966  * nodeValue,Attr:value,CharacterData:data
30967  * prefix
30968  */
30969 function _removeChild(parentNode,child){
30970         var previous = child.previousSibling;
30971         var next = child.nextSibling;
30972         if(previous){
30973                 previous.nextSibling = next;
30974         }else{
30975                 parentNode.firstChild = next;
30976         }
30977         if(next){
30978                 next.previousSibling = previous;
30979         }else{
30980                 parentNode.lastChild = previous;
30981         }
30982         _onUpdateChild(parentNode.ownerDocument,parentNode);
30983         return child;
30984 }
30985 /**
30986  * preformance key(refChild == null)
30987  */
30988 function _insertBefore(parentNode,newChild,nextChild){
30989         var cp = newChild.parentNode;
30990         if(cp){
30991                 cp.removeChild(newChild);//remove and update
30992         }
30993         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
30994                 var newFirst = newChild.firstChild;
30995                 if (newFirst == null) {
30996                         return newChild;
30997                 }
30998                 var newLast = newChild.lastChild;
30999         }else{
31000                 newFirst = newLast = newChild;
31001         }
31002         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
31003
31004         newFirst.previousSibling = pre;
31005         newLast.nextSibling = nextChild;
31006         
31007         
31008         if(pre){
31009                 pre.nextSibling = newFirst;
31010         }else{
31011                 parentNode.firstChild = newFirst;
31012         }
31013         if(nextChild == null){
31014                 parentNode.lastChild = newLast;
31015         }else{
31016                 nextChild.previousSibling = newLast;
31017         }
31018         do{
31019                 newFirst.parentNode = parentNode;
31020         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
31021         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
31022         //console.log(parentNode.lastChild.nextSibling == null)
31023         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
31024                 newChild.firstChild = newChild.lastChild = null;
31025         }
31026         return newChild;
31027 }
31028 function _appendSingleChild(parentNode,newChild){
31029         var cp = newChild.parentNode;
31030         if(cp){
31031                 var pre = parentNode.lastChild;
31032                 cp.removeChild(newChild);//remove and update
31033                 var pre = parentNode.lastChild;
31034         }
31035         var pre = parentNode.lastChild;
31036         newChild.parentNode = parentNode;
31037         newChild.previousSibling = pre;
31038         newChild.nextSibling = null;
31039         if(pre){
31040                 pre.nextSibling = newChild;
31041         }else{
31042                 parentNode.firstChild = newChild;
31043         }
31044         parentNode.lastChild = newChild;
31045         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
31046         return newChild;
31047         //console.log("__aa",parentNode.lastChild.nextSibling == null)
31048 }
31049 Document.prototype = {
31050         //implementation : null,
31051         nodeName :  '#document',
31052         nodeType :  DOCUMENT_NODE,
31053         doctype :  null,
31054         documentElement :  null,
31055         _inc : 1,
31056         
31057         insertBefore :  function(newChild, refChild){//raises 
31058                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
31059                         var child = newChild.firstChild;
31060                         while(child){
31061                                 var next = child.nextSibling;
31062                                 this.insertBefore(child,refChild);
31063                                 child = next;
31064                         }
31065                         return newChild;
31066                 }
31067                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
31068                         this.documentElement = newChild;
31069                 }
31070                 
31071                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
31072         },
31073         removeChild :  function(oldChild){
31074                 if(this.documentElement == oldChild){
31075                         this.documentElement = null;
31076                 }
31077                 return _removeChild(this,oldChild);
31078         },
31079         // Introduced in DOM Level 2:
31080         importNode : function(importedNode,deep){
31081                 return importNode(this,importedNode,deep);
31082         },
31083         // Introduced in DOM Level 2:
31084         getElementById :        function(id){
31085                 var rtv = null;
31086                 _visitNode(this.documentElement,function(node){
31087                         if(node.nodeType == ELEMENT_NODE){
31088                                 if(node.getAttribute('id') == id){
31089                                         rtv = node;
31090                                         return true;
31091                                 }
31092                         }
31093                 });
31094                 return rtv;
31095         },
31096         
31097         //document factory method:
31098         createElement : function(tagName){
31099                 var node = new Element();
31100                 node.ownerDocument = this;
31101                 node.nodeName = tagName;
31102                 node.tagName = tagName;
31103                 node.childNodes = new NodeList();
31104                 var attrs       = node.attributes = new NamedNodeMap();
31105                 attrs._ownerElement = node;
31106                 return node;
31107         },
31108         createDocumentFragment :        function(){
31109                 var node = new DocumentFragment();
31110                 node.ownerDocument = this;
31111                 node.childNodes = new NodeList();
31112                 return node;
31113         },
31114         createTextNode :        function(data){
31115                 var node = new Text();
31116                 node.ownerDocument = this;
31117                 node.appendData(data);
31118                 return node;
31119         },
31120         createComment : function(data){
31121                 var node = new Comment();
31122                 node.ownerDocument = this;
31123                 node.appendData(data);
31124                 return node;
31125         },
31126         createCDATASection :    function(data){
31127                 var node = new CDATASection();
31128                 node.ownerDocument = this;
31129                 node.appendData(data);
31130                 return node;
31131         },
31132         createProcessingInstruction :   function(target,data){
31133                 var node = new ProcessingInstruction();
31134                 node.ownerDocument = this;
31135                 node.tagName = node.target = target;
31136                 node.nodeValue= node.data = data;
31137                 return node;
31138         },
31139         createAttribute :       function(name){
31140                 var node = new Attr();
31141                 node.ownerDocument      = this;
31142                 node.name = name;
31143                 node.nodeName   = name;
31144                 node.localName = name;
31145                 node.specified = true;
31146                 return node;
31147         },
31148         createEntityReference : function(name){
31149                 var node = new EntityReference();
31150                 node.ownerDocument      = this;
31151                 node.nodeName   = name;
31152                 return node;
31153         },
31154         // Introduced in DOM Level 2:
31155         createElementNS :       function(namespaceURI,qualifiedName){
31156                 var node = new Element();
31157                 var pl = qualifiedName.split(':');
31158                 var attrs       = node.attributes = new NamedNodeMap();
31159                 node.childNodes = new NodeList();
31160                 node.ownerDocument = this;
31161                 node.nodeName = qualifiedName;
31162                 node.tagName = qualifiedName;
31163                 node.namespaceURI = namespaceURI;
31164                 if(pl.length == 2){
31165                         node.prefix = pl[0];
31166                         node.localName = pl[1];
31167                 }else{
31168                         //el.prefix = null;
31169                         node.localName = qualifiedName;
31170                 }
31171                 attrs._ownerElement = node;
31172                 return node;
31173         },
31174         // Introduced in DOM Level 2:
31175         createAttributeNS :     function(namespaceURI,qualifiedName){
31176                 var node = new Attr();
31177                 var pl = qualifiedName.split(':');
31178                 node.ownerDocument = this;
31179                 node.nodeName = qualifiedName;
31180                 node.name = qualifiedName;
31181                 node.namespaceURI = namespaceURI;
31182                 node.specified = true;
31183                 if(pl.length == 2){
31184                         node.prefix = pl[0];
31185                         node.localName = pl[1];
31186                 }else{
31187                         //el.prefix = null;
31188                         node.localName = qualifiedName;
31189                 }
31190                 return node;
31191         }
31192 };
31193 _extends(Document,Node$2);
31194
31195
31196 function Element() {
31197         this._nsMap = {};
31198 }
31199 Element.prototype = {
31200         nodeType : ELEMENT_NODE,
31201         hasAttribute : function(name){
31202                 return this.getAttributeNode(name)!=null;
31203         },
31204         getAttribute : function(name){
31205                 var attr = this.getAttributeNode(name);
31206                 return attr && attr.value || '';
31207         },
31208         getAttributeNode : function(name){
31209                 return this.attributes.getNamedItem(name);
31210         },
31211         setAttribute : function(name, value){
31212                 var attr = this.ownerDocument.createAttribute(name);
31213                 attr.value = attr.nodeValue = "" + value;
31214                 this.setAttributeNode(attr);
31215         },
31216         removeAttribute : function(name){
31217                 var attr = this.getAttributeNode(name);
31218                 attr && this.removeAttributeNode(attr);
31219         },
31220         
31221         //four real opeartion method
31222         appendChild:function(newChild){
31223                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
31224                         return this.insertBefore(newChild,null);
31225                 }else{
31226                         return _appendSingleChild(this,newChild);
31227                 }
31228         },
31229         setAttributeNode : function(newAttr){
31230                 return this.attributes.setNamedItem(newAttr);
31231         },
31232         setAttributeNodeNS : function(newAttr){
31233                 return this.attributes.setNamedItemNS(newAttr);
31234         },
31235         removeAttributeNode : function(oldAttr){
31236                 //console.log(this == oldAttr.ownerElement)
31237                 return this.attributes.removeNamedItem(oldAttr.nodeName);
31238         },
31239         //get real attribute name,and remove it by removeAttributeNode
31240         removeAttributeNS : function(namespaceURI, localName){
31241                 var old = this.getAttributeNodeNS(namespaceURI, localName);
31242                 old && this.removeAttributeNode(old);
31243         },
31244         
31245         hasAttributeNS : function(namespaceURI, localName){
31246                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
31247         },
31248         getAttributeNS : function(namespaceURI, localName){
31249                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
31250                 return attr && attr.value || '';
31251         },
31252         setAttributeNS : function(namespaceURI, qualifiedName, value){
31253                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
31254                 attr.value = attr.nodeValue = "" + value;
31255                 this.setAttributeNode(attr);
31256         },
31257         getAttributeNodeNS : function(namespaceURI, localName){
31258                 return this.attributes.getNamedItemNS(namespaceURI, localName);
31259         },
31260         
31261         getElementsByTagName : function(tagName){
31262                 return new LiveNodeList(this,function(base){
31263                         var ls = [];
31264                         _visitNode(base,function(node){
31265                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
31266                                         ls.push(node);
31267                                 }
31268                         });
31269                         return ls;
31270                 });
31271         },
31272         getElementsByTagNameNS : function(namespaceURI, localName){
31273                 return new LiveNodeList(this,function(base){
31274                         var ls = [];
31275                         _visitNode(base,function(node){
31276                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
31277                                         ls.push(node);
31278                                 }
31279                         });
31280                         return ls;
31281                         
31282                 });
31283         }
31284 };
31285 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
31286 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
31287
31288
31289 _extends(Element,Node$2);
31290 function Attr() {
31291 }
31292 Attr.prototype.nodeType = ATTRIBUTE_NODE;
31293 _extends(Attr,Node$2);
31294
31295
31296 function CharacterData() {
31297 }
31298 CharacterData.prototype = {
31299         data : '',
31300         substringData : function(offset, count) {
31301                 return this.data.substring(offset, offset+count);
31302         },
31303         appendData: function(text) {
31304                 text = this.data+text;
31305                 this.nodeValue = this.data = text;
31306                 this.length = text.length;
31307         },
31308         insertData: function(offset,text) {
31309                 this.replaceData(offset,0,text);
31310         
31311         },
31312         appendChild:function(newChild){
31313                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
31314         },
31315         deleteData: function(offset, count) {
31316                 this.replaceData(offset,count,"");
31317         },
31318         replaceData: function(offset, count, text) {
31319                 var start = this.data.substring(0,offset);
31320                 var end = this.data.substring(offset+count);
31321                 text = start + text + end;
31322                 this.nodeValue = this.data = text;
31323                 this.length = text.length;
31324         }
31325 };
31326 _extends(CharacterData,Node$2);
31327 function Text() {
31328 }
31329 Text.prototype = {
31330         nodeName : "#text",
31331         nodeType : TEXT_NODE,
31332         splitText : function(offset) {
31333                 var text = this.data;
31334                 var newText = text.substring(offset);
31335                 text = text.substring(0, offset);
31336                 this.data = this.nodeValue = text;
31337                 this.length = text.length;
31338                 var newNode = this.ownerDocument.createTextNode(newText);
31339                 if(this.parentNode){
31340                         this.parentNode.insertBefore(newNode, this.nextSibling);
31341                 }
31342                 return newNode;
31343         }
31344 };
31345 _extends(Text,CharacterData);
31346 function Comment() {
31347 }
31348 Comment.prototype = {
31349         nodeName : "#comment",
31350         nodeType : COMMENT_NODE
31351 };
31352 _extends(Comment,CharacterData);
31353
31354 function CDATASection() {
31355 }
31356 CDATASection.prototype = {
31357         nodeName : "#cdata-section",
31358         nodeType : CDATA_SECTION_NODE
31359 };
31360 _extends(CDATASection,CharacterData);
31361
31362
31363 function DocumentType() {
31364 }
31365 DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
31366 _extends(DocumentType,Node$2);
31367
31368 function Notation() {
31369 }
31370 Notation.prototype.nodeType = NOTATION_NODE;
31371 _extends(Notation,Node$2);
31372
31373 function Entity() {
31374 }
31375 Entity.prototype.nodeType = ENTITY_NODE;
31376 _extends(Entity,Node$2);
31377
31378 function EntityReference() {
31379 }
31380 EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
31381 _extends(EntityReference,Node$2);
31382
31383 function DocumentFragment() {
31384 }
31385 DocumentFragment.prototype.nodeName =   "#document-fragment";
31386 DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
31387 _extends(DocumentFragment,Node$2);
31388
31389
31390 function ProcessingInstruction() {
31391 }
31392 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
31393 _extends(ProcessingInstruction,Node$2);
31394 function XMLSerializer$1(){}
31395 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
31396         return nodeSerializeToString.call(node,isHtml,nodeFilter);
31397 };
31398 Node$2.prototype.toString = nodeSerializeToString;
31399 function nodeSerializeToString(isHtml,nodeFilter){
31400         var buf = [];
31401         var refNode = this.nodeType == 9?this.documentElement:this;
31402         var prefix = refNode.prefix;
31403         var uri = refNode.namespaceURI;
31404         
31405         if(uri && prefix == null){
31406                 //console.log(prefix)
31407                 var prefix = refNode.lookupPrefix(uri);
31408                 if(prefix == null){
31409                         //isHTML = true;
31410                         var visibleNamespaces=[
31411                         {namespace:uri,prefix:null}
31412                         //{namespace:uri,prefix:''}
31413                         ];
31414                 }
31415         }
31416         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
31417         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
31418         return buf.join('');
31419 }
31420 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
31421         var prefix = node.prefix||'';
31422         var uri = node.namespaceURI;
31423         if (!prefix && !uri){
31424                 return false;
31425         }
31426         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
31427                 || uri == 'http://www.w3.org/2000/xmlns/'){
31428                 return false;
31429         }
31430         
31431         var i = visibleNamespaces.length; 
31432         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
31433         while (i--) {
31434                 var ns = visibleNamespaces[i];
31435                 // get namespace prefix
31436                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
31437                 if (ns.prefix == prefix){
31438                         return ns.namespace != uri;
31439                 }
31440         }
31441         //console.log(isHTML,uri,prefix=='')
31442         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
31443         //      return false;
31444         //}
31445         //node.flag = '11111'
31446         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
31447         return true;
31448 }
31449 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
31450         if(nodeFilter){
31451                 node = nodeFilter(node);
31452                 if(node){
31453                         if(typeof node == 'string'){
31454                                 buf.push(node);
31455                                 return;
31456                         }
31457                 }else{
31458                         return;
31459                 }
31460                 //buf.sort.apply(attrs, attributeSorter);
31461         }
31462         switch(node.nodeType){
31463         case ELEMENT_NODE:
31464                 if (!visibleNamespaces) visibleNamespaces = [];
31465                 var startVisibleNamespaces = visibleNamespaces.length;
31466                 var attrs = node.attributes;
31467                 var len = attrs.length;
31468                 var child = node.firstChild;
31469                 var nodeName = node.tagName;
31470                 
31471                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
31472                 buf.push('<',nodeName);
31473                 
31474                 
31475                 
31476                 for(var i=0;i<len;i++){
31477                         // add namespaces for attributes
31478                         var attr = attrs.item(i);
31479                         if (attr.prefix == 'xmlns') {
31480                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
31481                         }else if(attr.nodeName == 'xmlns'){
31482                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
31483                         }
31484                 }
31485                 for(var i=0;i<len;i++){
31486                         var attr = attrs.item(i);
31487                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
31488                                 var prefix = attr.prefix||'';
31489                                 var uri = attr.namespaceURI;
31490                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
31491                                 buf.push(ns, '="' , uri , '"');
31492                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
31493                         }
31494                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
31495                 }
31496                 // add namespace for current node               
31497                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
31498                         var prefix = node.prefix||'';
31499                         var uri = node.namespaceURI;
31500                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
31501                         buf.push(ns, '="' , uri , '"');
31502                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
31503                 }
31504                 
31505                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
31506                         buf.push('>');
31507                         //if is cdata child node
31508                         if(isHTML && /^script$/i.test(nodeName)){
31509                                 while(child){
31510                                         if(child.data){
31511                                                 buf.push(child.data);
31512                                         }else{
31513                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
31514                                         }
31515                                         child = child.nextSibling;
31516                                 }
31517                         }else
31518                         {
31519                                 while(child){
31520                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
31521                                         child = child.nextSibling;
31522                                 }
31523                         }
31524                         buf.push('</',nodeName,'>');
31525                 }else{
31526                         buf.push('/>');
31527                 }
31528                 // remove added visible namespaces
31529                 //visibleNamespaces.length = startVisibleNamespaces;
31530                 return;
31531         case DOCUMENT_NODE:
31532         case DOCUMENT_FRAGMENT_NODE:
31533                 var child = node.firstChild;
31534                 while(child){
31535                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
31536                         child = child.nextSibling;
31537                 }
31538                 return;
31539         case ATTRIBUTE_NODE:
31540                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
31541         case TEXT_NODE:
31542                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
31543         case CDATA_SECTION_NODE:
31544                 return buf.push( '<![CDATA[',node.data,']]>');
31545         case COMMENT_NODE:
31546                 return buf.push( "<!--",node.data,"-->");
31547         case DOCUMENT_TYPE_NODE:
31548                 var pubid = node.publicId;
31549                 var sysid = node.systemId;
31550                 buf.push('<!DOCTYPE ',node.name);
31551                 if(pubid){
31552                         buf.push(' PUBLIC "',pubid);
31553                         if (sysid && sysid!='.') {
31554                                 buf.push( '" "',sysid);
31555                         }
31556                         buf.push('">');
31557                 }else if(sysid && sysid!='.'){
31558                         buf.push(' SYSTEM "',sysid,'">');
31559                 }else{
31560                         var sub = node.internalSubset;
31561                         if(sub){
31562                                 buf.push(" [",sub,"]");
31563                         }
31564                         buf.push(">");
31565                 }
31566                 return;
31567         case PROCESSING_INSTRUCTION_NODE:
31568                 return buf.push( "<?",node.target," ",node.data,"?>");
31569         case ENTITY_REFERENCE_NODE:
31570                 return buf.push( '&',node.nodeName,';');
31571         //case ENTITY_NODE:
31572         //case NOTATION_NODE:
31573         default:
31574                 buf.push('??',node.nodeName);
31575         }
31576 }
31577 function importNode(doc,node,deep){
31578         var node2;
31579         switch (node.nodeType) {
31580         case ELEMENT_NODE:
31581                 node2 = node.cloneNode(false);
31582                 node2.ownerDocument = doc;
31583                 //var attrs = node2.attributes;
31584                 //var len = attrs.length;
31585                 //for(var i=0;i<len;i++){
31586                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
31587                 //}
31588         case DOCUMENT_FRAGMENT_NODE:
31589                 break;
31590         case ATTRIBUTE_NODE:
31591                 deep = true;
31592                 break;
31593         //case ENTITY_REFERENCE_NODE:
31594         //case PROCESSING_INSTRUCTION_NODE:
31595         ////case TEXT_NODE:
31596         //case CDATA_SECTION_NODE:
31597         //case COMMENT_NODE:
31598         //      deep = false;
31599         //      break;
31600         //case DOCUMENT_NODE:
31601         //case DOCUMENT_TYPE_NODE:
31602         //cannot be imported.
31603         //case ENTITY_NODE:
31604         //case NOTATION_NODE:
31605         //can not hit in level3
31606         //default:throw e;
31607         }
31608         if(!node2){
31609                 node2 = node.cloneNode(false);//false
31610         }
31611         node2.ownerDocument = doc;
31612         node2.parentNode = null;
31613         if(deep){
31614                 var child = node.firstChild;
31615                 while(child){
31616                         node2.appendChild(importNode(doc,child,deep));
31617                         child = child.nextSibling;
31618                 }
31619         }
31620         return node2;
31621 }
31622 //
31623 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
31624 //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
31625 function cloneNode(doc,node,deep){
31626         var node2 = new node.constructor();
31627         for(var n in node){
31628                 var v = node[n];
31629                 if(typeof v != 'object' ){
31630                         if(v != node2[n]){
31631                                 node2[n] = v;
31632                         }
31633                 }
31634         }
31635         if(node.childNodes){
31636                 node2.childNodes = new NodeList();
31637         }
31638         node2.ownerDocument = doc;
31639         switch (node2.nodeType) {
31640         case ELEMENT_NODE:
31641                 var attrs       = node.attributes;
31642                 var attrs2      = node2.attributes = new NamedNodeMap();
31643                 var len = attrs.length;
31644                 attrs2._ownerElement = node2;
31645                 for(var i=0;i<len;i++){
31646                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
31647                 }
31648                 break;;
31649         case ATTRIBUTE_NODE:
31650                 deep = true;
31651         }
31652         if(deep){
31653                 var child = node.firstChild;
31654                 while(child){
31655                         node2.appendChild(cloneNode(doc,child,deep));
31656                         child = child.nextSibling;
31657                 }
31658         }
31659         return node2;
31660 }
31661
31662 function __set__(object,key,value){
31663         object[key] = value;
31664 }
31665 //do dynamic
31666 try{
31667         if(Object.defineProperty){
31668                 Object.defineProperty(LiveNodeList.prototype,'length',{
31669                         get:function(){
31670                                 _updateLiveList(this);
31671                                 return this.$$length;
31672                         }
31673                 });
31674                 Object.defineProperty(Node$2.prototype,'textContent',{
31675                         get:function(){
31676                                 return getTextContent(this);
31677                         },
31678                         set:function(data){
31679                                 switch(this.nodeType){
31680                                 case ELEMENT_NODE:
31681                                 case DOCUMENT_FRAGMENT_NODE:
31682                                         while(this.firstChild){
31683                                                 this.removeChild(this.firstChild);
31684                                         }
31685                                         if(data || String(data)){
31686                                                 this.appendChild(this.ownerDocument.createTextNode(data));
31687                                         }
31688                                         break;
31689                                 default:
31690                                         //TODO:
31691                                         this.data = data;
31692                                         this.value = data;
31693                                         this.nodeValue = data;
31694                                 }
31695                         }
31696                 });
31697                 
31698                 function getTextContent(node){
31699                         switch(node.nodeType){
31700                         case ELEMENT_NODE:
31701                         case DOCUMENT_FRAGMENT_NODE:
31702                                 var buf = [];
31703                                 node = node.firstChild;
31704                                 while(node){
31705                                         if(node.nodeType!==7 && node.nodeType !==8){
31706                                                 buf.push(getTextContent(node));
31707                                         }
31708                                         node = node.nextSibling;
31709                                 }
31710                                 return buf.join('');
31711                         default:
31712                                 return node.nodeValue;
31713                         }
31714                 }
31715                 __set__ = function(object,key,value){
31716                         //console.log(value)
31717                         object['$$'+key] = value;
31718                 };
31719         }
31720 }catch(e){//ie8
31721 }
31722
31723 //if(typeof require == 'function'){
31724         var DOMImplementation_1 = DOMImplementation;
31725         var XMLSerializer_1 = XMLSerializer$1;
31726 //}
31727
31728 var dom = {
31729         DOMImplementation: DOMImplementation_1,
31730         XMLSerializer: XMLSerializer_1
31731 };
31732
31733 var domParser = createCommonjsModule(function (module, exports) {
31734 function DOMParser(options){
31735         this.options = options ||{locator:{}};
31736         
31737 }
31738 DOMParser.prototype.parseFromString = function(source,mimeType){
31739         var options = this.options;
31740         var sax$$1 =  new XMLReader();
31741         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
31742         var errorHandler = options.errorHandler;
31743         var locator = options.locator;
31744         var defaultNSMap = options.xmlns||{};
31745         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
31746         if(locator){
31747                 domBuilder.setDocumentLocator(locator);
31748         }
31749         
31750         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
31751         sax$$1.domBuilder = options.domBuilder || domBuilder;
31752         if(/\/x?html?$/.test(mimeType)){
31753                 entityMap.nbsp = '\xa0';
31754                 entityMap.copy = '\xa9';
31755                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
31756         }
31757         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
31758         if(source){
31759                 sax$$1.parse(source,defaultNSMap,entityMap);
31760         }else{
31761                 sax$$1.errorHandler.error("invalid doc source");
31762         }
31763         return domBuilder.doc;
31764 };
31765 function buildErrorHandler(errorImpl,domBuilder,locator){
31766         if(!errorImpl){
31767                 if(domBuilder instanceof DOMHandler){
31768                         return domBuilder;
31769                 }
31770                 errorImpl = domBuilder ;
31771         }
31772         var errorHandler = {};
31773         var isCallback = errorImpl instanceof Function;
31774         locator = locator||{};
31775         function build(key){
31776                 var fn = errorImpl[key];
31777                 if(!fn && isCallback){
31778                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
31779                 }
31780                 errorHandler[key] = fn && function(msg){
31781                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
31782                 }||function(){};
31783         }
31784         build('warning');
31785         build('error');
31786         build('fatalError');
31787         return errorHandler;
31788 }
31789
31790 //console.log('#\n\n\n\n\n\n\n####')
31791 /**
31792  * +ContentHandler+ErrorHandler
31793  * +LexicalHandler+EntityResolver2
31794  * -DeclHandler-DTDHandler 
31795  * 
31796  * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
31797  * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
31798  * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
31799  */
31800 function DOMHandler() {
31801     this.cdata = false;
31802 }
31803 function position(locator,node){
31804         node.lineNumber = locator.lineNumber;
31805         node.columnNumber = locator.columnNumber;
31806 }
31807 /**
31808  * @see org.xml.sax.ContentHandler#startDocument
31809  * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
31810  */ 
31811 DOMHandler.prototype = {
31812         startDocument : function() {
31813         this.doc = new DOMImplementation().createDocument(null, null, null);
31814         if (this.locator) {
31815                 this.doc.documentURI = this.locator.systemId;
31816         }
31817         },
31818         startElement:function(namespaceURI, localName, qName, attrs) {
31819                 var doc = this.doc;
31820             var el = doc.createElementNS(namespaceURI, qName||localName);
31821             var len = attrs.length;
31822             appendElement(this, el);
31823             this.currentElement = el;
31824             
31825                 this.locator && position(this.locator,el);
31826             for (var i = 0 ; i < len; i++) {
31827                 var namespaceURI = attrs.getURI(i);
31828                 var value = attrs.getValue(i);
31829                 var qName = attrs.getQName(i);
31830                         var attr = doc.createAttributeNS(namespaceURI, qName);
31831                         this.locator &&position(attrs.getLocator(i),attr);
31832                         attr.value = attr.nodeValue = value;
31833                         el.setAttributeNode(attr);
31834             }
31835         },
31836         endElement:function(namespaceURI, localName, qName) {
31837                 var current = this.currentElement;
31838                 var tagName = current.tagName;
31839                 this.currentElement = current.parentNode;
31840         },
31841         startPrefixMapping:function(prefix, uri) {
31842         },
31843         endPrefixMapping:function(prefix) {
31844         },
31845         processingInstruction:function(target, data) {
31846             var ins = this.doc.createProcessingInstruction(target, data);
31847             this.locator && position(this.locator,ins);
31848             appendElement(this, ins);
31849         },
31850         ignorableWhitespace:function(ch, start, length) {
31851         },
31852         characters:function(chars, start, length) {
31853                 chars = _toString.apply(this,arguments);
31854                 //console.log(chars)
31855                 if(chars){
31856                         if (this.cdata) {
31857                                 var charNode = this.doc.createCDATASection(chars);
31858                         } else {
31859                                 var charNode = this.doc.createTextNode(chars);
31860                         }
31861                         if(this.currentElement){
31862                                 this.currentElement.appendChild(charNode);
31863                         }else if(/^\s*$/.test(chars)){
31864                                 this.doc.appendChild(charNode);
31865                                 //process xml
31866                         }
31867                         this.locator && position(this.locator,charNode);
31868                 }
31869         },
31870         skippedEntity:function(name) {
31871         },
31872         endDocument:function() {
31873                 this.doc.normalize();
31874         },
31875         setDocumentLocator:function (locator) {
31876             if(this.locator = locator){// && !('lineNumber' in locator)){
31877                 locator.lineNumber = 0;
31878             }
31879         },
31880         //LexicalHandler
31881         comment:function(chars, start, length) {
31882                 chars = _toString.apply(this,arguments);
31883             var comm = this.doc.createComment(chars);
31884             this.locator && position(this.locator,comm);
31885             appendElement(this, comm);
31886         },
31887         
31888         startCDATA:function() {
31889             //used in characters() methods
31890             this.cdata = true;
31891         },
31892         endCDATA:function() {
31893             this.cdata = false;
31894         },
31895         
31896         startDTD:function(name, publicId, systemId) {
31897                 var impl = this.doc.implementation;
31898             if (impl && impl.createDocumentType) {
31899                 var dt = impl.createDocumentType(name, publicId, systemId);
31900                 this.locator && position(this.locator,dt);
31901                 appendElement(this, dt);
31902             }
31903         },
31904         /**
31905          * @see org.xml.sax.ErrorHandler
31906          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
31907          */
31908         warning:function(error) {
31909                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
31910         },
31911         error:function(error) {
31912                 console.error('[xmldom error]\t'+error,_locator(this.locator));
31913         },
31914         fatalError:function(error) {
31915                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
31916             throw error;
31917         }
31918 };
31919 function _locator(l){
31920         if(l){
31921                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
31922         }
31923 }
31924 function _toString(chars,start,length){
31925         if(typeof chars == 'string'){
31926                 return chars.substr(start,length)
31927         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
31928                 if(chars.length >= start+length || start){
31929                         return new java.lang.String(chars,start,length)+'';
31930                 }
31931                 return chars;
31932         }
31933 }
31934
31935 /*
31936  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
31937  * used method of org.xml.sax.ext.LexicalHandler:
31938  *  #comment(chars, start, length)
31939  *  #startCDATA()
31940  *  #endCDATA()
31941  *  #startDTD(name, publicId, systemId)
31942  *
31943  *
31944  * IGNORED method of org.xml.sax.ext.LexicalHandler:
31945  *  #endDTD()
31946  *  #startEntity(name)
31947  *  #endEntity(name)
31948  *
31949  *
31950  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
31951  * IGNORED method of org.xml.sax.ext.DeclHandler
31952  *      #attributeDecl(eName, aName, type, mode, value)
31953  *  #elementDecl(name, model)
31954  *  #externalEntityDecl(name, publicId, systemId)
31955  *  #internalEntityDecl(name, value)
31956  * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
31957  * IGNORED method of org.xml.sax.EntityResolver2
31958  *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
31959  *  #resolveEntity(publicId, systemId)
31960  *  #getExternalSubset(name, baseURI)
31961  * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
31962  * IGNORED method of org.xml.sax.DTDHandler
31963  *  #notationDecl(name, publicId, systemId) {};
31964  *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
31965  */
31966 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
31967         DOMHandler.prototype[key] = function(){return null};
31968 });
31969
31970 /* 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 */
31971 function appendElement (hander,node) {
31972     if (!hander.currentElement) {
31973         hander.doc.appendChild(node);
31974     } else {
31975         hander.currentElement.appendChild(node);
31976     }
31977 }//appendChild and setAttributeNS are preformance key
31978
31979 //if(typeof require == 'function'){
31980         var XMLReader = sax.XMLReader;
31981         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
31982         exports.XMLSerializer = dom.XMLSerializer ;
31983         exports.DOMParser = DOMParser;
31984 //}
31985 });
31986
31987 var togeojson = createCommonjsModule(function (module, exports) {
31988 var toGeoJSON = (function() {
31989     'use strict';
31990
31991     var removeSpace = /\s*/g,
31992         trimSpace = /^\s*|\s*$/g,
31993         splitSpace = /\s+/;
31994     // generate a short, numeric hash of a string
31995     function okhash(x) {
31996         if (!x || !x.length) return 0;
31997         for (var i = 0, h = 0; i < x.length; i++) {
31998             h = ((h << 5) - h) + x.charCodeAt(i) | 0;
31999         } return h;
32000     }
32001     // all Y children of X
32002     function get(x, y) { return x.getElementsByTagName(y); }
32003     function attr(x, y) { return x.getAttribute(y); }
32004     function attrf(x, y) { return parseFloat(attr(x, y)); }
32005     // one Y child of X, if any, otherwise null
32006     function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
32007     // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
32008     function norm(el) { if (el.normalize) { el.normalize(); } return el; }
32009     // cast array x into numbers
32010     function numarray(x) {
32011         for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
32012         return o;
32013     }
32014     // get the content of a text node, if any
32015     function nodeVal(x) {
32016         if (x) { norm(x); }
32017         return (x && x.textContent) || '';
32018     }
32019     // get the contents of multiple text nodes, if present
32020     function getMulti(x, ys) {
32021         var o = {}, n, k;
32022         for (k = 0; k < ys.length; k++) {
32023             n = get1(x, ys[k]);
32024             if (n) o[ys[k]] = nodeVal(n);
32025         }
32026         return o;
32027     }
32028     // add properties of Y to X, overwriting if present in both
32029     function extend(x, y) { for (var k in y) x[k] = y[k]; }
32030     // get one coordinate from a coordinate array, if any
32031     function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
32032     // get all coordinates from a coordinate array as [[],[]]
32033     function coord(v) {
32034         var coords = v.replace(trimSpace, '').split(splitSpace),
32035             o = [];
32036         for (var i = 0; i < coords.length; i++) {
32037             o.push(coord1(coords[i]));
32038         }
32039         return o;
32040     }
32041     function coordPair(x) {
32042         var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
32043             ele = get1(x, 'ele'),
32044             // handle namespaced attribute in browser
32045             heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
32046             time = get1(x, 'time'),
32047             e;
32048         if (ele) {
32049             e = parseFloat(nodeVal(ele));
32050             if (!isNaN(e)) {
32051                 ll.push(e);
32052             }
32053         }
32054         return {
32055             coordinates: ll,
32056             time: time ? nodeVal(time) : null,
32057             heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
32058         };
32059     }
32060
32061     // create a new feature collection parent object
32062     function fc() {
32063         return {
32064             type: 'FeatureCollection',
32065             features: []
32066         };
32067     }
32068
32069     var serializer;
32070     if (typeof XMLSerializer !== 'undefined') {
32071         /* istanbul ignore next */
32072         serializer = new XMLSerializer();
32073     // only require xmldom in a node environment
32074     } else if ('object' === 'object' && typeof process === 'object' && !process.browser) {
32075         serializer = new (domParser.XMLSerializer)();
32076     }
32077     function xml2str(str) {
32078         // IE9 will create a new XMLSerializer but it'll crash immediately.
32079         // This line is ignored because we don't run coverage tests in IE9
32080         /* istanbul ignore next */
32081         if (str.xml !== undefined) return str.xml;
32082         return serializer.serializeToString(str);
32083     }
32084
32085     var t = {
32086         kml: function(doc) {
32087
32088             var gj = fc(),
32089                 // styleindex keeps track of hashed styles in order to match features
32090                 styleIndex = {}, styleByHash = {},
32091                 // stylemapindex keeps track of style maps to expose in properties
32092                 styleMapIndex = {},
32093                 // atomic geospatial types supported by KML - MultiGeometry is
32094                 // handled separately
32095                 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
32096                 // all root placemarks in the file
32097                 placemarks = get(doc, 'Placemark'),
32098                 styles = get(doc, 'Style'),
32099                 styleMaps = get(doc, 'StyleMap');
32100
32101             for (var k = 0; k < styles.length; k++) {
32102                 var hash = okhash(xml2str(styles[k])).toString(16);
32103                 styleIndex['#' + attr(styles[k], 'id')] = hash;
32104                 styleByHash[hash] = styles[k];
32105             }
32106             for (var l = 0; l < styleMaps.length; l++) {
32107                 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
32108                 var pairs = get(styleMaps[l], 'Pair');
32109                 var pairsMap = {};
32110                 for (var m = 0; m < pairs.length; m++) {
32111                     pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
32112                 }
32113                 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
32114
32115             }
32116             for (var j = 0; j < placemarks.length; j++) {
32117                 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
32118             }
32119             function kmlColor(v) {
32120                 var color, opacity;
32121                 v = v || '';
32122                 if (v.substr(0, 1) === '#') { v = v.substr(1); }
32123                 if (v.length === 6 || v.length === 3) { color = v; }
32124                 if (v.length === 8) {
32125                     opacity = parseInt(v.substr(0, 2), 16) / 255;
32126                     color = '#' + v.substr(6, 2) +
32127                         v.substr(4, 2) +
32128                         v.substr(2, 2);
32129                 }
32130                 return [color, isNaN(opacity) ? undefined : opacity];
32131             }
32132             function gxCoord(v) { return numarray(v.split(' ')); }
32133             function gxCoords(root) {
32134                 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
32135                 if (elems.length === 0) elems = get(root, 'gx:coord');
32136                 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
32137                 var timeElems = get(root, 'when');
32138                 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
32139                 return {
32140                     coords: coords,
32141                     times: times
32142                 };
32143             }
32144             function getGeometry(root) {
32145                 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
32146                 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
32147                 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
32148                 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
32149                 for (i = 0; i < geotypes.length; i++) {
32150                     geomNodes = get(root, geotypes[i]);
32151                     if (geomNodes) {
32152                         for (j = 0; j < geomNodes.length; j++) {
32153                             geomNode = geomNodes[j];
32154                             if (geotypes[i] === 'Point') {
32155                                 geoms.push({
32156                                     type: 'Point',
32157                                     coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
32158                                 });
32159                             } else if (geotypes[i] === 'LineString') {
32160                                 geoms.push({
32161                                     type: 'LineString',
32162                                     coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
32163                                 });
32164                             } else if (geotypes[i] === 'Polygon') {
32165                                 var rings = get(geomNode, 'LinearRing'),
32166                                     coords = [];
32167                                 for (k = 0; k < rings.length; k++) {
32168                                     coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
32169                                 }
32170                                 geoms.push({
32171                                     type: 'Polygon',
32172                                     coordinates: coords
32173                                 });
32174                             } else if (geotypes[i] === 'Track' ||
32175                                 geotypes[i] === 'gx:Track') {
32176                                 var track = gxCoords(geomNode);
32177                                 geoms.push({
32178                                     type: 'LineString',
32179                                     coordinates: track.coords
32180                                 });
32181                                 if (track.times.length) coordTimes.push(track.times);
32182                             }
32183                         }
32184                     }
32185                 }
32186                 return {
32187                     geoms: geoms,
32188                     coordTimes: coordTimes
32189                 };
32190             }
32191             function getPlacemark(root) {
32192                 var geomsAndTimes = getGeometry(root), i, properties = {},
32193                     name = nodeVal(get1(root, 'name')),
32194                     address = nodeVal(get1(root, 'address')),
32195                     styleUrl = nodeVal(get1(root, 'styleUrl')),
32196                     description = nodeVal(get1(root, 'description')),
32197                     timeSpan = get1(root, 'TimeSpan'),
32198                     timeStamp = get1(root, 'TimeStamp'),
32199                     extendedData = get1(root, 'ExtendedData'),
32200                     lineStyle = get1(root, 'LineStyle'),
32201                     polyStyle = get1(root, 'PolyStyle'),
32202                     visibility = get1(root, 'visibility');
32203
32204                 if (!geomsAndTimes.geoms.length) return [];
32205                 if (name) properties.name = name;
32206                 if (address) properties.address = address;
32207                 if (styleUrl) {
32208                     if (styleUrl[0] !== '#') {
32209                         styleUrl = '#' + styleUrl;
32210                     }
32211
32212                     properties.styleUrl = styleUrl;
32213                     if (styleIndex[styleUrl]) {
32214                         properties.styleHash = styleIndex[styleUrl];
32215                     }
32216                     if (styleMapIndex[styleUrl]) {
32217                         properties.styleMapHash = styleMapIndex[styleUrl];
32218                         properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
32219                     }
32220                     // Try to populate the lineStyle or polyStyle since we got the style hash
32221                     var style = styleByHash[properties.styleHash];
32222                     if (style) {
32223                         if (!lineStyle) lineStyle = get1(style, 'LineStyle');
32224                         if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
32225                     }
32226                 }
32227                 if (description) properties.description = description;
32228                 if (timeSpan) {
32229                     var begin = nodeVal(get1(timeSpan, 'begin'));
32230                     var end = nodeVal(get1(timeSpan, 'end'));
32231                     properties.timespan = { begin: begin, end: end };
32232                 }
32233                 if (timeStamp) {
32234                     properties.timestamp = nodeVal(get1(timeStamp, 'when'));
32235                 }
32236                 if (lineStyle) {
32237                     var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
32238                         color = linestyles[0],
32239                         opacity = linestyles[1],
32240                         width = parseFloat(nodeVal(get1(lineStyle, 'width')));
32241                     if (color) properties.stroke = color;
32242                     if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
32243                     if (!isNaN(width)) properties['stroke-width'] = width;
32244                 }
32245                 if (polyStyle) {
32246                     var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
32247                         pcolor = polystyles[0],
32248                         popacity = polystyles[1],
32249                         fill = nodeVal(get1(polyStyle, 'fill')),
32250                         outline = nodeVal(get1(polyStyle, 'outline'));
32251                     if (pcolor) properties.fill = pcolor;
32252                     if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
32253                     if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
32254                     if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
32255                 }
32256                 if (extendedData) {
32257                     var datas = get(extendedData, 'Data'),
32258                         simpleDatas = get(extendedData, 'SimpleData');
32259
32260                     for (i = 0; i < datas.length; i++) {
32261                         properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
32262                     }
32263                     for (i = 0; i < simpleDatas.length; i++) {
32264                         properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
32265                     }
32266                 }
32267                 if (visibility) {
32268                     properties.visibility = nodeVal(visibility);
32269                 }
32270                 if (geomsAndTimes.coordTimes.length) {
32271                     properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
32272                         geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
32273                 }
32274                 var feature = {
32275                     type: 'Feature',
32276                     geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
32277                         type: 'GeometryCollection',
32278                         geometries: geomsAndTimes.geoms
32279                     },
32280                     properties: properties
32281                 };
32282                 if (attr(root, 'id')) feature.id = attr(root, 'id');
32283                 return [feature];
32284             }
32285             return gj;
32286         },
32287         gpx: function(doc) {
32288             var i,
32289                 tracks = get(doc, 'trk'),
32290                 routes = get(doc, 'rte'),
32291                 waypoints = get(doc, 'wpt'),
32292                 // a feature collection
32293                 gj = fc(),
32294                 feature;
32295             for (i = 0; i < tracks.length; i++) {
32296                 feature = getTrack(tracks[i]);
32297                 if (feature) gj.features.push(feature);
32298             }
32299             for (i = 0; i < routes.length; i++) {
32300                 feature = getRoute(routes[i]);
32301                 if (feature) gj.features.push(feature);
32302             }
32303             for (i = 0; i < waypoints.length; i++) {
32304                 gj.features.push(getPoint(waypoints[i]));
32305             }
32306             function getPoints(node, pointname) {
32307                 var pts = get(node, pointname),
32308                     line = [],
32309                     times = [],
32310                     heartRates = [],
32311                     l = pts.length;
32312                 if (l < 2) return {};  // Invalid line in GeoJSON
32313                 for (var i = 0; i < l; i++) {
32314                     var c = coordPair(pts[i]);
32315                     line.push(c.coordinates);
32316                     if (c.time) times.push(c.time);
32317                     if (c.heartRate) heartRates.push(c.heartRate);
32318                 }
32319                 return {
32320                     line: line,
32321                     times: times,
32322                     heartRates: heartRates
32323                 };
32324             }
32325             function getTrack(node) {
32326                 var segments = get(node, 'trkseg'),
32327                     track = [],
32328                     times = [],
32329                     heartRates = [],
32330                     line;
32331                 for (var i = 0; i < segments.length; i++) {
32332                     line = getPoints(segments[i], 'trkpt');
32333                     if (line) {
32334                         if (line.line) track.push(line.line);
32335                         if (line.times && line.times.length) times.push(line.times);
32336                         if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
32337                     }
32338                 }
32339                 if (track.length === 0) return;
32340                 var properties = getProperties(node);
32341                 extend(properties, getLineStyle(get1(node, 'extensions')));
32342                 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
32343                 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
32344                 return {
32345                     type: 'Feature',
32346                     properties: properties,
32347                     geometry: {
32348                         type: track.length === 1 ? 'LineString' : 'MultiLineString',
32349                         coordinates: track.length === 1 ? track[0] : track
32350                     }
32351                 };
32352             }
32353             function getRoute(node) {
32354                 var line = getPoints(node, 'rtept');
32355                 if (!line.line) return;
32356                 var prop = getProperties(node);
32357                 extend(prop, getLineStyle(get1(node, 'extensions')));
32358                 var routeObj = {
32359                     type: 'Feature',
32360                     properties: prop,
32361                     geometry: {
32362                         type: 'LineString',
32363                         coordinates: line.line
32364                     }
32365                 };
32366                 return routeObj;
32367             }
32368             function getPoint(node) {
32369                 var prop = getProperties(node);
32370                 extend(prop, getMulti(node, ['sym']));
32371                 return {
32372                     type: 'Feature',
32373                     properties: prop,
32374                     geometry: {
32375                         type: 'Point',
32376                         coordinates: coordPair(node).coordinates
32377                     }
32378                 };
32379             }
32380             function getLineStyle(extensions) {
32381                 var style = {};
32382                 if (extensions) {
32383                     var lineStyle = get1(extensions, 'line');
32384                     if (lineStyle) {
32385                         var color = nodeVal(get1(lineStyle, 'color')),
32386                             opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
32387                             width = parseFloat(nodeVal(get1(lineStyle, 'width')));
32388                         if (color) style.stroke = color;
32389                         if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
32390                         // GPX width is in mm, convert to px with 96 px per inch
32391                         if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
32392                     }
32393                 }
32394                 return style;
32395             }
32396             function getProperties(node) {
32397                 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
32398                     links = get(node, 'link');
32399                 if (links.length) prop.links = [];
32400                 for (var i = 0, link; i < links.length; i++) {
32401                     link = { href: attr(links[i], 'href') };
32402                     extend(link, getMulti(links[i], ['text', 'type']));
32403                     prop.links.push(link);
32404                 }
32405                 return prop;
32406             }
32407             return gj;
32408         }
32409     };
32410     return t;
32411 })();
32412
32413 module.exports = toGeoJSON;
32414 });
32415
32416 function svgGpx(projection$$1, context, dispatch) {
32417     var showLabels = true,
32418         detected = utilDetect(),
32419         layer;
32420
32421
32422     function init() {
32423         if (svgGpx.initialized) return;  // run once
32424
32425         svgGpx.geojson = {};
32426         svgGpx.enabled = true;
32427
32428         function over() {
32429             event.stopPropagation();
32430             event.preventDefault();
32431             event.dataTransfer.dropEffect = 'copy';
32432         }
32433
32434         d3_select('body')
32435             .attr('dropzone', 'copy')
32436             .on('drop.localgpx', function() {
32437                 event.stopPropagation();
32438                 event.preventDefault();
32439                 if (!detected.filedrop) return;
32440                 drawGpx.files(event.dataTransfer.files);
32441             })
32442             .on('dragenter.localgpx', over)
32443             .on('dragexit.localgpx', over)
32444             .on('dragover.localgpx', over);
32445
32446         svgGpx.initialized = true;
32447     }
32448
32449
32450     function drawGpx(selection$$1) {
32451         var geojson = svgGpx.geojson,
32452             enabled = svgGpx.enabled;
32453
32454         layer = selection$$1.selectAll('.layer-gpx')
32455             .data(enabled ? [0] : []);
32456
32457         layer.exit()
32458             .remove();
32459
32460         layer = layer.enter()
32461             .append('g')
32462             .attr('class', 'layer-gpx')
32463             .merge(layer);
32464
32465
32466         var paths = layer
32467             .selectAll('path')
32468             .data([geojson]);
32469
32470         paths.exit()
32471             .remove();
32472
32473         paths = paths.enter()
32474             .append('path')
32475             .attr('class', 'gpx')
32476             .merge(paths);
32477
32478
32479         var path = d3_geoPath(projection$$1);
32480
32481         paths
32482             .attr('d', path);
32483
32484
32485         var labels = layer.selectAll('text')
32486             .data(showLabels && geojson.features ? geojson.features : []);
32487
32488         labels.exit()
32489             .remove();
32490
32491         labels = labels.enter()
32492             .append('text')
32493             .attr('class', 'gpx')
32494             .merge(labels);
32495
32496         labels
32497             .text(function(d) {
32498                 return d.properties.desc || d.properties.name;
32499             })
32500             .attr('x', function(d) {
32501                 var centroid = path.centroid(d);
32502                 return centroid[0] + 7;
32503             })
32504             .attr('y', function(d) {
32505                 var centroid = path.centroid(d);
32506                 return centroid[1];
32507             });
32508
32509     }
32510
32511
32512     function toDom(x) {
32513         return (new DOMParser()).parseFromString(x, 'text/xml');
32514     }
32515
32516
32517     function getExtension(fileName) {
32518         if (isUndefined(fileName)) {
32519             return '';
32520         }
32521
32522         var lastDotIndex = fileName.lastIndexOf('.');
32523         if (lastDotIndex < 0) {
32524             return '';
32525         }
32526
32527         return fileName.substr(lastDotIndex);
32528     }
32529
32530
32531     function parseSaveAndZoom(extension, data) {
32532         switch (extension) {
32533             default:
32534                 drawGpx.geojson(togeojson.gpx(toDom(data))).fitZoom();
32535                 break;
32536             case '.kml':
32537                 drawGpx.geojson(togeojson.kml(toDom(data))).fitZoom();
32538                 break;
32539             case '.geojson':
32540             case '.json':
32541                 drawGpx.geojson(JSON.parse(data)).fitZoom();
32542                 break;
32543         }
32544     }
32545
32546
32547     drawGpx.showLabels = function(_) {
32548         if (!arguments.length) return showLabels;
32549         showLabels = _;
32550         return this;
32551     };
32552
32553
32554     drawGpx.enabled = function(_) {
32555         if (!arguments.length) return svgGpx.enabled;
32556         svgGpx.enabled = _;
32557         dispatch.call('change');
32558         return this;
32559     };
32560
32561
32562     drawGpx.hasGpx = function() {
32563         var geojson = svgGpx.geojson;
32564         return (!(isEmpty(geojson) || isEmpty(geojson.features)));
32565     };
32566
32567
32568     drawGpx.geojson = function(gj) {
32569         if (!arguments.length) return svgGpx.geojson;
32570         if (isEmpty(gj) || isEmpty(gj.features)) return this;
32571         svgGpx.geojson = gj;
32572         dispatch.call('change');
32573         return this;
32574     };
32575
32576
32577     drawGpx.url = function(url) {
32578         d3_text(url, function(err, data) {
32579             if (!err) {
32580                 var extension = getExtension(url);
32581                 parseSaveAndZoom(extension, data);
32582             }
32583         });
32584         return this;
32585     };
32586
32587
32588     drawGpx.files = function(fileList) {
32589         if (!fileList.length) return this;
32590         var f = fileList[0],
32591             reader = new FileReader();
32592
32593         reader.onload = (function(file) {
32594             var extension = getExtension(file.name);
32595
32596             return function (e) {
32597                 parseSaveAndZoom(extension, e.target.result);
32598             };
32599         })(f);
32600
32601         reader.readAsText(f);
32602         return this;
32603     };
32604
32605
32606     drawGpx.fitZoom = function() {
32607         if (!this.hasGpx()) return this;
32608         var geojson = svgGpx.geojson;
32609
32610         var map = context.map(),
32611             viewport = map.trimmedExtent().polygon(),
32612             coords = reduce(geojson.features, function(coords, feature) {
32613                 var c = feature.geometry.coordinates;
32614
32615                 /* eslint-disable no-fallthrough */
32616                 switch (feature.geometry.type) {
32617                     case 'Point':
32618                         c = [c];
32619                     case 'MultiPoint':
32620                     case 'LineString':
32621                         break;
32622
32623                     case 'MultiPolygon':
32624                         c = flatten(c);
32625                     case 'Polygon':
32626                     case 'MultiLineString':
32627                         c = flatten(c);
32628                         break;
32629                 }
32630                 /* eslint-enable no-fallthrough */
32631
32632                 return union(coords, c);
32633             }, []);
32634
32635         if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
32636             var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
32637             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
32638         }
32639
32640         return this;
32641     };
32642
32643
32644     init();
32645     return drawGpx;
32646 }
32647
32648 function svgIcon(name, svgklass, useklass) {
32649     return function drawIcon(selection) {
32650         selection.selectAll('svg')
32651             .data([0])
32652             .enter()
32653             .append('svg')
32654             .attr('class', 'icon ' + (svgklass || ''))
32655             .append('use')
32656             .attr('xlink:href', name)
32657             .attr('class', useklass);
32658     };
32659 }
32660
32661 /** Error message constants. */
32662 var FUNC_ERROR_TEXT$3 = 'Expected a function';
32663
32664 /**
32665  * Creates a throttled function that only invokes `func` at most once per
32666  * every `wait` milliseconds. The throttled function comes with a `cancel`
32667  * method to cancel delayed `func` invocations and a `flush` method to
32668  * immediately invoke them. Provide `options` to indicate whether `func`
32669  * should be invoked on the leading and/or trailing edge of the `wait`
32670  * timeout. The `func` is invoked with the last arguments provided to the
32671  * throttled function. Subsequent calls to the throttled function return the
32672  * result of the last `func` invocation.
32673  *
32674  * **Note:** If `leading` and `trailing` options are `true`, `func` is
32675  * invoked on the trailing edge of the timeout only if the throttled function
32676  * is invoked more than once during the `wait` timeout.
32677  *
32678  * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
32679  * until to the next tick, similar to `setTimeout` with a timeout of `0`.
32680  *
32681  * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
32682  * for details over the differences between `_.throttle` and `_.debounce`.
32683  *
32684  * @static
32685  * @memberOf _
32686  * @since 0.1.0
32687  * @category Function
32688  * @param {Function} func The function to throttle.
32689  * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
32690  * @param {Object} [options={}] The options object.
32691  * @param {boolean} [options.leading=true]
32692  *  Specify invoking on the leading edge of the timeout.
32693  * @param {boolean} [options.trailing=true]
32694  *  Specify invoking on the trailing edge of the timeout.
32695  * @returns {Function} Returns the new throttled function.
32696  * @example
32697  *
32698  * // Avoid excessively updating the position while scrolling.
32699  * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
32700  *
32701  * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
32702  * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
32703  * jQuery(element).on('click', throttled);
32704  *
32705  * // Cancel the trailing throttled invocation.
32706  * jQuery(window).on('popstate', throttled.cancel);
32707  */
32708 function throttle(func, wait, options) {
32709   var leading = true,
32710       trailing = true;
32711
32712   if (typeof func != 'function') {
32713     throw new TypeError(FUNC_ERROR_TEXT$3);
32714   }
32715   if (isObject(options)) {
32716     leading = 'leading' in options ? !!options.leading : leading;
32717     trailing = 'trailing' in options ? !!options.trailing : trailing;
32718   }
32719   return debounce$1(func, wait, {
32720     'leading': leading,
32721     'maxWait': wait,
32722     'trailing': trailing
32723   });
32724 }
32725
32726 function svgLabels(projection$$1, context) {
32727     var path = d3_geoPath(projection$$1),
32728         detected = utilDetect(),
32729         baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge'),
32730         rdrawn = rbush_1(),
32731         rskipped = rbush_1(),
32732         textWidthCache = {},
32733         entitybboxes = {};
32734
32735     // Listed from highest to lowest priority
32736     var labelStack = [
32737         ['line', 'aeroway', '*', 12],
32738         ['line', 'highway', 'motorway', 12],
32739         ['line', 'highway', 'trunk', 12],
32740         ['line', 'highway', 'primary', 12],
32741         ['line', 'highway', 'secondary', 12],
32742         ['line', 'highway', 'tertiary', 12],
32743         ['line', 'highway', '*', 12],
32744         ['line', 'railway', '*', 12],
32745         ['line', 'waterway', '*', 12],
32746         ['area', 'aeroway', '*', 12],
32747         ['area', 'amenity', '*', 12],
32748         ['area', 'building', '*', 12],
32749         ['area', 'historic', '*', 12],
32750         ['area', 'leisure', '*', 12],
32751         ['area', 'man_made', '*', 12],
32752         ['area', 'natural', '*', 12],
32753         ['area', 'shop', '*', 12],
32754         ['area', 'tourism', '*', 12],
32755         ['area', 'camp_site', '*', 12],
32756         ['point', 'aeroway', '*', 10],
32757         ['point', 'amenity', '*', 10],
32758         ['point', 'building', '*', 10],
32759         ['point', 'historic', '*', 10],
32760         ['point', 'leisure', '*', 10],
32761         ['point', 'man_made', '*', 10],
32762         ['point', 'natural', '*', 10],
32763         ['point', 'shop', '*', 10],
32764         ['point', 'tourism', '*', 10],
32765         ['point', 'camp_site', '*', 10],
32766         ['line', 'name', '*', 12],
32767         ['area', 'name', '*', 12],
32768         ['point', 'name', '*', 10]
32769     ];
32770
32771
32772     function blacklisted(preset) {
32773         var noIcons = ['building', 'landuse', 'natural'];
32774         return some(noIcons, function(s) {
32775             return preset.id.indexOf(s) >= 0;
32776         });
32777     }
32778
32779
32780     function get(array, prop) {
32781         return function(d, i) { return array[i][prop]; };
32782     }
32783
32784
32785     function textWidth(text, size, elem) {
32786         var c = textWidthCache[size];
32787         if (!c) c = textWidthCache[size] = {};
32788
32789         if (c[text]) {
32790             return c[text];
32791
32792         } else if (elem) {
32793             c[text] = elem.getComputedTextLength();
32794             return c[text];
32795
32796         } else {
32797             var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
32798             if (str === null) {
32799                 return size / 3 * 2 * text.length;
32800             } else {
32801                 return size / 3 * (2 * text.length + str.length);
32802             }
32803         }
32804     }
32805
32806
32807     function drawLinePaths(selection, entities, filter, classes, labels) {
32808         var paths = selection.selectAll('path')
32809             .filter(filter)
32810             .data(entities, osmEntity$$1.key);
32811
32812         paths.exit()
32813             .remove();
32814
32815         paths.enter()
32816             .append('path')
32817             .style('stroke-width', get(labels, 'font-size'))
32818             .attr('id', function(d) { return 'labelpath-' + d.id; })
32819             .attr('class', classes)
32820             .merge(paths)
32821             .attr('d', get(labels, 'lineString'));
32822     }
32823
32824
32825     function drawLineLabels(selection, entities, filter, classes, labels) {
32826         var texts = selection.selectAll('text.' + classes)
32827             .filter(filter)
32828             .data(entities, osmEntity$$1.key);
32829
32830         texts.exit()
32831             .remove();
32832
32833         texts.enter()
32834             .append('text')
32835             .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
32836             .attr('dy', baselineHack ? '0.35em' : null)
32837             .append('textPath')
32838             .attr('class', 'textpath');
32839
32840         texts = selection.selectAll('text.' + classes);
32841
32842         texts.selectAll('.textpath')
32843             .filter(filter)
32844             .data(entities, osmEntity$$1.key)
32845             .attr('startOffset', '50%')
32846             .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
32847             .text(utilDisplayNameForPath);
32848     }
32849
32850
32851     function drawPointLabels(selection, entities, filter, classes, labels) {
32852         var texts = selection.selectAll('text.' + classes)
32853             .filter(filter)
32854             .data(entities, osmEntity$$1.key);
32855
32856         texts.exit()
32857             .remove();
32858
32859         texts = texts.enter()
32860             .append('text')
32861             .attr('class', function(d, i) {
32862                 return classes + ' ' + labels[i].classes + ' ' + d.id;
32863             })
32864             .merge(texts);
32865
32866         texts
32867             .attr('x', get(labels, 'x'))
32868             .attr('y', get(labels, 'y'))
32869             .style('text-anchor', get(labels, 'textAnchor'))
32870             .text(utilDisplayName)
32871             .each(function(d, i) {
32872                 textWidth(utilDisplayName(d), labels[i].height, this);
32873             });
32874     }
32875
32876
32877     function drawAreaLabels(selection, entities, filter, classes, labels) {
32878         entities = entities.filter(hasText);
32879         labels = labels.filter(hasText);
32880         drawPointLabels(selection, entities, filter, classes, labels);
32881
32882         function hasText(d, i) {
32883             return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
32884         }
32885     }
32886
32887
32888     function drawAreaIcons(selection, entities, filter, classes, labels) {
32889         var icons = selection.selectAll('use.' + classes)
32890             .filter(filter)
32891             .data(entities, osmEntity$$1.key);
32892
32893         icons.exit()
32894             .remove();
32895
32896         icons = icons.enter()
32897             .append('use')
32898             .attr('class', 'icon ' + classes)
32899             .attr('width', '17px')
32900             .attr('height', '17px')
32901             .merge(icons);
32902
32903         icons
32904             .attr('transform', get(labels, 'transform'))
32905             .attr('xlink:href', function(d) {
32906                 var preset = context.presets().match(d, context.graph()),
32907                     picon = preset && preset.icon;
32908
32909                 if (!picon)
32910                     return '';
32911                 else {
32912                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
32913                     return '#' + picon + (isMaki ? '-15' : '');
32914                 }
32915             });
32916     }
32917
32918
32919     function drawCollisionBoxes(selection, rtree, which) {
32920         var showDebug = context.getDebug('collision'),
32921             classes = 'debug ' + which + ' ' +
32922                 (which === 'debug-skipped' ? 'orange' : 'yellow');
32923
32924         var debug = selection.selectAll('.layer-label-debug')
32925                 .data(showDebug ? [true] : []);
32926
32927         debug.exit()
32928             .remove();
32929
32930         debug = debug.enter()
32931             .append('g')
32932             .attr('class', 'layer-label-debug')
32933             .merge(debug);
32934
32935         if (showDebug) {
32936             var gj = rtree.all().map(function(d) {
32937                 return { type: 'Polygon', coordinates: [[
32938                     [d.minX, d.minY],
32939                     [d.maxX, d.minY],
32940                     [d.maxX, d.maxY],
32941                     [d.minX, d.maxY],
32942                     [d.minX, d.minY]
32943                 ]]};
32944             });
32945
32946             var debugboxes = debug.selectAll('.' + which)
32947                 .data(gj);
32948
32949             debugboxes.exit()
32950                 .remove();
32951
32952             debugboxes = debugboxes.enter()
32953                 .append('path')
32954                 .attr('class', classes)
32955                 .merge(debugboxes);
32956
32957             debugboxes
32958                 .attr('d', d3_geoPath());
32959         }
32960     }
32961
32962
32963     function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
32964         var lowZoom = context.surface().classed('low-zoom');
32965
32966         var labelable = [], i, j, k, entity, geometry;
32967         for (i = 0; i < labelStack.length; i++) {
32968             labelable.push([]);
32969         }
32970
32971         if (fullRedraw) {
32972             rdrawn.clear();
32973             rskipped.clear();
32974             entitybboxes = {};
32975         } else {
32976             for (i = 0; i < entities.length; i++) {
32977                 entity = entities[i];
32978                 var toRemove = []
32979                     .concat(entitybboxes[entity.id] || [])
32980                     .concat(entitybboxes[entity.id + 'I'] || []);
32981
32982                 for (j = 0; j < toRemove.length; j++) {
32983                     rdrawn.remove(toRemove[j]);
32984                     rskipped.remove(toRemove[j]);
32985                 }
32986             }
32987         }
32988
32989         // Split entities into groups specified by labelStack
32990         for (i = 0; i < entities.length; i++) {
32991             entity = entities[i];
32992             geometry = entity.geometry(graph);
32993             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
32994
32995             var preset = geometry === 'area' && context.presets().match(entity, graph),
32996                 icon = preset && !blacklisted(preset) && preset.icon;
32997
32998             if (!icon && !utilDisplayName(entity))
32999                 continue;
33000
33001             for (k = 0; k < labelStack.length; k++) {
33002                 var matchGeom = labelStack[k][0],
33003                     matchKey = labelStack[k][1],
33004                     matchVal = labelStack[k][2],
33005                     hasVal = entity.tags[matchKey];
33006
33007                 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
33008                     labelable[k].push(entity);
33009                     break;
33010                 }
33011             }
33012         }
33013
33014         var positions = {
33015             point: [],
33016             line: [],
33017             area: []
33018         };
33019
33020         var labelled = {
33021             point: [],
33022             line: [],
33023             area: []
33024         };
33025
33026         // Try and find a valid label for labellable entities
33027         for (k = 0; k < labelable.length; k++) {
33028             var fontSize = labelStack[k][3];
33029             for (i = 0; i < labelable[k].length; i++) {
33030                 entity = labelable[k][i];
33031                 geometry = entity.geometry(graph);
33032
33033                 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName,
33034                     name = getName(entity),
33035                     width = name && textWidth(name, fontSize),
33036                     p;
33037
33038                 if (geometry === 'point') {
33039                     p = getPointLabel(entity, width, fontSize, geometry);
33040                 } else if (geometry === 'vertex' && !lowZoom) {
33041                     // don't label vertices at low zoom because they don't have icons
33042                     p = getPointLabel(entity, width, fontSize, geometry);
33043                 } else if (geometry === 'line') {
33044                     p = getLineLabel(entity, width, fontSize);
33045                 } else if (geometry === 'area') {
33046                     p = getAreaLabel(entity, width, fontSize);
33047                 }
33048
33049                 if (p) {
33050                     if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
33051                     p.classes = geometry + ' tag-' + labelStack[k][1];
33052                     positions[geometry].push(p);
33053                     labelled[geometry].push(entity);
33054                 }
33055             }
33056         }
33057
33058
33059         function getPointLabel(entity, width, height, geometry) {
33060             var y = (geometry === 'point' ? -12 : 0),
33061                 pointOffsets = {
33062                     ltr: [15, y, 'start'],
33063                     rtl: [-15, y, 'end']
33064                 };
33065
33066             var coord = projection$$1(entity.loc),
33067                 margin = 2,
33068                 offset = pointOffsets[textDirection],
33069                 p = {
33070                     height: height,
33071                     width: width,
33072                     x: coord[0] + offset[0],
33073                     y: coord[1] + offset[1],
33074                     textAnchor: offset[2]
33075                 },
33076                 bbox;
33077
33078             if (textDirection === 'rtl') {
33079                 bbox = {
33080                     minX: p.x - width - margin,
33081                     minY: p.y - (height / 2) - margin,
33082                     maxX: p.x + margin,
33083                     maxY: p.y + (height / 2) + margin
33084                 };
33085             } else {
33086                 bbox = {
33087                     minX: p.x - margin,
33088                     minY: p.y - (height / 2) - margin,
33089                     maxX: p.x + width + margin,
33090                     maxY: p.y + (height / 2) + margin
33091                 };
33092             }
33093
33094             if (tryInsert([bbox], entity.id, true)) {
33095                 return p;
33096             }
33097         }
33098
33099
33100         function getLineLabel(entity, width, height) {
33101             var viewport = geoExtent$$1(context.projection.clipExtent()).polygon(),
33102                 nodes = map$4(graph.childNodes(entity), 'loc').map(projection$$1),
33103                 length = geoPathLength(nodes);
33104
33105             if (length < width + 20) return;
33106
33107             // % along the line to attempt to place the label
33108             var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
33109                                25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
33110             var margin = 3;
33111
33112             for (var i = 0; i < lineOffsets.length; i++) {
33113                 var offset = lineOffsets[i],
33114                     middle = offset / 100 * length,
33115                     start = middle - width / 2;
33116
33117                 if (start < 0 || start + width > length) continue;
33118
33119                 // generate subpath and ignore paths that are invalid or don't cross viewport.
33120                 var sub = subpath(nodes, start, start + width);
33121                 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
33122                     continue;
33123                 }
33124
33125                 var isReverse = reverse(sub);
33126                 if (isReverse) {
33127                     sub = sub.reverse();
33128                 }
33129
33130                 var bboxes = [],
33131                     boxsize = (height + 2) / 2;
33132
33133                 for (var j = 0; j < sub.length - 1; j++) {
33134                     var a = sub[j];
33135                     var b = sub[j + 1];
33136                     var num = Math.max(1, Math.floor(geoEuclideanDistance(a, b) / boxsize / 2));
33137
33138                     for (var box = 0; box < num; box++) {
33139                         var p = geoInterp(a, b, box / num);
33140                         var x0 = p[0] - boxsize - margin;
33141                         var y0 = p[1] - boxsize - margin;
33142                         var x1 = p[0] + boxsize + margin;
33143                         var y1 = p[1] + boxsize + margin;
33144
33145                         bboxes.push({
33146                             minX: Math.min(x0, x1),
33147                             minY: Math.min(y0, y1),
33148                             maxX: Math.max(x0, x1),
33149                             maxY: Math.max(y0, y1)
33150                         });
33151                     }
33152                 }
33153
33154                 if (tryInsert(bboxes, entity.id, false)) {
33155                     return {
33156                         'font-size': height + 2,
33157                         lineString: lineString(sub),
33158                         startOffset: offset + '%'
33159                     };
33160                 }
33161             }
33162
33163             function reverse(p) {
33164                 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
33165                 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
33166             }
33167
33168             function lineString(nodes) {
33169                 return 'M' + nodes.join('L');
33170             }
33171
33172             function subpath(nodes, from, to) {
33173                 var sofar = 0,
33174                     start, end, i0, i1;
33175
33176                 for (var i = 0; i < nodes.length - 1; i++) {
33177                     var a = nodes[i],
33178                         b = nodes[i + 1];
33179                     var current = geoEuclideanDistance(a, b);
33180                     var portion;
33181                     if (!start && sofar + current >= from) {
33182                         portion = (from - sofar) / current;
33183                         start = [
33184                             a[0] + portion * (b[0] - a[0]),
33185                             a[1] + portion * (b[1] - a[1])
33186                         ];
33187                         i0 = i + 1;
33188                     }
33189                     if (!end && sofar + current >= to) {
33190                         portion = (to - sofar) / current;
33191                         end = [
33192                             a[0] + portion * (b[0] - a[0]),
33193                             a[1] + portion * (b[1] - a[1])
33194                         ];
33195                         i1 = i + 1;
33196                     }
33197                     sofar += current;
33198                 }
33199
33200                 var ret = nodes.slice(i0, i1);
33201                 ret.unshift(start);
33202                 ret.push(end);
33203                 return ret;
33204             }
33205         }
33206
33207
33208         function getAreaLabel(entity, width, height) {
33209             var centroid = path.centroid(entity.asGeoJSON(graph, true)),
33210                 extent = entity.extent(graph),
33211                 entitywidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
33212
33213             if (isNaN(centroid[0]) || entitywidth < 20) return;
33214
33215             var iconSize = 20,
33216                 iconX = centroid[0] - (iconSize / 2),
33217                 iconY = centroid[1] - (iconSize / 2),
33218                 margin = 2,
33219                 textOffset = iconSize + margin,
33220                 p = { transform: 'translate(' + iconX + ',' + iconY + ')' };
33221
33222             var bbox = {
33223                 minX: iconX,
33224                 minY: iconY,
33225                 maxX: iconX + iconSize,
33226                 maxY: iconY + iconSize
33227             };
33228
33229             // try to add icon
33230             if (tryInsert([bbox], entity.id + 'I', true)) {
33231                 if (width && entitywidth >= width + 20) {
33232                     var labelX = centroid[0],
33233                         labelY = centroid[1] + textOffset;
33234
33235                     bbox = {
33236                         minX: labelX - (width / 2) - margin,
33237                         minY: labelY - (height / 2) - margin,
33238                         maxX: labelX + (width / 2) + margin,
33239                         maxY: labelY + (height / 2) + margin
33240                     };
33241
33242                     // try to add label
33243                     if (tryInsert([bbox], entity.id, true)) {
33244                         p.x = labelX;
33245                         p.y = labelY;
33246                         p.textAnchor = 'middle';
33247                         p.height = height;
33248                     }
33249                 }
33250
33251                 return p;
33252             }
33253         }
33254
33255
33256         function tryInsert(bboxes, id, saveSkipped) {
33257             var skipped = false,
33258                 bbox;
33259
33260             for (var i = 0; i < bboxes.length; i++) {
33261                 bbox = bboxes[i];
33262                 bbox.id = id;
33263
33264                 // Check that label is visible
33265                 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
33266                     skipped = true;
33267                     break;
33268                 }
33269                 if (rdrawn.collides(bbox)) {
33270                     skipped = true;
33271                     break;
33272                 }
33273             }
33274
33275             entitybboxes[id] = bboxes;
33276
33277             if (skipped) {
33278                 if (saveSkipped) {
33279                     rskipped.load(bboxes);
33280                 }
33281             } else {
33282                 rdrawn.load(bboxes);
33283             }
33284
33285             return !skipped;
33286         }
33287
33288
33289         var label = selection.selectAll('.layer-label'),
33290             halo = selection.selectAll('.layer-halo');
33291
33292         // points
33293         drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
33294         drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
33295
33296         // lines
33297         drawLinePaths(halo, labelled.line, filter, '', positions.line);
33298         drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
33299         drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
33300
33301         // areas
33302         drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
33303         drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
33304         drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
33305         drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
33306
33307         // debug
33308         drawCollisionBoxes(label, rskipped, 'debug-skipped');
33309         drawCollisionBoxes(label, rdrawn, 'debug-drawn');
33310
33311         selection.call(filterLabels);
33312     }
33313
33314
33315     function filterLabels(selection) {
33316         var layers = selection
33317             .selectAll('.layer-label, .layer-halo');
33318
33319         layers.selectAll('.proximate')
33320             .classed('proximate', false);
33321
33322         var mouse = context.mouse(),
33323             graph = context.graph(),
33324             selectedIDs = context.selectedIDs(),
33325             ids = [],
33326             pad, bbox;
33327
33328         // hide labels near the mouse
33329         if (mouse) {
33330             pad = 20;
33331             bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
33332             ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
33333         }
33334
33335         // hide labels along selected ways, or near selected vertices
33336         for (var i = 0; i < selectedIDs.length; i++) {
33337             var entity = graph.hasEntity(selectedIDs[i]);
33338             if (!entity) continue;
33339             var geometry = entity.geometry(graph);
33340
33341             if (geometry === 'line') {
33342                 ids.push(selectedIDs[i]);
33343             } else if (geometry === 'vertex') {
33344                 var point = context.projection(entity.loc);
33345                 pad = 10;
33346                 bbox = { minX: point[0] - pad, minY: point[1] - pad, maxX: point[0] + pad, maxY: point[1] + pad };
33347                 ids.push.apply(ids, map$4(rdrawn.search(bbox), 'id'));
33348             }
33349         }
33350
33351         layers.selectAll(utilEntitySelector(ids))
33352             .classed('proximate', true);
33353     }
33354
33355
33356     var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
33357
33358
33359     drawLabels.observe = function(selection) {
33360         var listener = function() { throttleFilterLabels(selection); };
33361         selection.on('mousemove.hidelabels', listener);
33362         context.on('enter.hidelabels', listener);
33363     };
33364
33365
33366     drawLabels.off = function(selection) {
33367         throttleFilterLabels.cancel();
33368         selection.on('mousemove.hidelabels', null);
33369         context.on('enter.hidelabels', null);
33370     };
33371
33372
33373     return drawLabels;
33374 }
33375
33376 function svgPointTransform(projection) {
33377     return function(entity) {
33378         // http://jsperf.com/short-array-join
33379         var pt = projection(entity.loc);
33380         return 'translate(' + pt[0] + ',' + pt[1] + ')';
33381     };
33382 }
33383
33384 function d3geoTile() {
33385   var size = [960, 500],
33386       scale = 256,
33387       scaleExtent = [0, 20],
33388       translate = [size[0] / 2, size[1] / 2],
33389       zoomDelta = 0;
33390
33391   function bound(_) {
33392       return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _));
33393   }
33394
33395   function tile() {
33396     var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0),
33397         z0 = bound(Math.round(z + zoomDelta)),
33398         k = Math.pow(2, z - z0 + 8),
33399         origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k],
33400         tiles = [],
33401         cols = d3_range(Math.max(0, Math.floor(-origin[0])), Math.max(0, Math.ceil(size[0] / k - origin[0]))),
33402         rows = d3_range(Math.max(0, Math.floor(-origin[1])), Math.max(0, Math.ceil(size[1] / k - origin[1])));
33403
33404     rows.forEach(function(y) {
33405       cols.forEach(function(x) {
33406         tiles.push([x, y, z0]);
33407       });
33408     });
33409
33410     tiles.translate = origin;
33411     tiles.scale = k;
33412
33413     return tiles;
33414   }
33415
33416   tile.scaleExtent = function(_) {
33417     if (!arguments.length) return scaleExtent;
33418     scaleExtent = _;
33419     return tile;
33420   };
33421
33422   tile.size = function(_) {
33423     if (!arguments.length) return size;
33424     size = _;
33425     return tile;
33426   };
33427
33428   tile.scale = function(_) {
33429     if (!arguments.length) return scale;
33430     scale = _;
33431     return tile;
33432   };
33433
33434   tile.translate = function(_) {
33435     if (!arguments.length) return translate;
33436     translate = _;
33437     return tile;
33438   };
33439
33440   tile.zoomDelta = function(_) {
33441     if (!arguments.length) return zoomDelta;
33442     zoomDelta = +_;
33443     return tile;
33444   };
33445
33446   return tile;
33447 }
33448
33449 /* global Mapillary:false */
33450 var apibase = 'https://a.mapillary.com/v3/';
33451 var viewercss = 'mapillary-js/mapillary.min.css';
33452 var viewerjs = 'mapillary-js/mapillary.min.js';
33453 var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
33454 var maxResults = 1000;
33455 var tileZoom = 14;
33456 var dispatch$1 = dispatch('loadedImages', 'loadedSigns');
33457 var mapillaryCache;
33458 var mapillaryClicks;
33459 var mapillaryImage;
33460 var mapillarySignDefs;
33461 var mapillarySignSprite;
33462 var mapillaryViewer;
33463
33464
33465 function abortRequest(i) {
33466     i.abort();
33467 }
33468
33469
33470 function nearNullIsland(x, y, z) {
33471     if (z >= 7) {
33472         var center = Math.pow(2, z - 1),
33473             width = Math.pow(2, z - 6),
33474             min$$1 = center - (width / 2),
33475             max$$1 = center + (width / 2) - 1;
33476         return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
33477     }
33478     return false;
33479 }
33480
33481
33482 function maxPageAtZoom(z) {
33483     if (z < 15)   return 2;
33484     if (z === 15) return 5;
33485     if (z === 16) return 10;
33486     if (z === 17) return 20;
33487     if (z === 18) return 40;
33488     if (z > 18)   return 80;
33489 }
33490
33491
33492 function getTiles(projection) {
33493     var s = projection.scale() * 2 * Math.PI,
33494         z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
33495         ts = 256 * Math.pow(2, z - tileZoom),
33496         origin = [
33497             s / 2 - projection.translate()[0],
33498             s / 2 - projection.translate()[1]];
33499
33500     return d3geoTile()
33501         .scaleExtent([tileZoom, tileZoom])
33502         .scale(s)
33503         .size(projection.clipExtent()[1])
33504         .translate(projection.translate())()
33505         .map(function(tile) {
33506             var x = tile[0] * ts - origin[0],
33507                 y = tile[1] * ts - origin[1];
33508
33509             return {
33510                 id: tile.toString(),
33511                 xyz: tile,
33512                 extent: geoExtent$$1(
33513                     projection.invert([x, y + ts]),
33514                     projection.invert([x + ts, y])
33515                 )
33516             };
33517         });
33518 }
33519
33520
33521 function loadTiles(which, url, projection) {
33522     var s = projection.scale() * 2 * Math.PI,
33523         currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0));
33524
33525     var tiles = getTiles(projection).filter(function(t) {
33526             return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
33527         });
33528
33529     filter(which.inflight, function(v, k) {
33530         var wanted = find$1(tiles, function(tile) { return k === (tile.id + ',0'); });
33531         if (!wanted) delete which.inflight[k];
33532         return !wanted;
33533     }).map(abortRequest);
33534
33535     tiles.forEach(function(tile) {
33536         loadNextTilePage(which, currZoom, url, tile);
33537     });
33538 }
33539
33540
33541 function loadNextTilePage(which, currZoom, url, tile) {
33542     var cache = mapillaryCache[which],
33543         rect = tile.extent.rectangle(),
33544         maxPages = maxPageAtZoom(currZoom),
33545         nextPage = cache.nextPage[tile.id] || 0,
33546         nextURL = cache.nextURL[tile.id] || url +
33547             utilQsString({
33548                 per_page: maxResults,
33549                 page: nextPage,
33550                 client_id: clientId,
33551                 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
33552             });
33553
33554     if (nextPage > maxPages) return;
33555
33556     var id = tile.id + ',' + String(nextPage);
33557     if (cache.loaded[id] || cache.inflight[id]) return;
33558     cache.inflight[id] = d3_request(nextURL)
33559         .mimeType('application/json')
33560         .response(function(xhr) {
33561             var linkHeader = xhr.getResponseHeader('Link');
33562             if (linkHeader) {
33563                 var pagination = parsePagination(xhr.getResponseHeader('Link'));
33564                 if (pagination.next) {
33565                     cache.nextURL[tile.id] = pagination.next;
33566                 }
33567             }
33568             return JSON.parse(xhr.responseText);
33569         })
33570         .get(function(err, data) {
33571             cache.loaded[id] = true;
33572             delete cache.inflight[id];
33573             if (err || !data.features || !data.features.length) return;
33574
33575             var features = data.features.map(function(feature) {
33576                 var loc = feature.geometry.coordinates,
33577                     d;
33578
33579                 if (which === 'images') {
33580                     d = {
33581                         loc: loc,
33582                         key: feature.properties.key,
33583                         ca: feature.properties.ca,
33584                         captured_at: feature.properties.captured_at,
33585                         pano: feature.properties.pano
33586                     };
33587                 } else if (which === 'objects') {
33588                     d = {
33589                         loc: loc,
33590                         key: feature.properties.key,
33591                         value: feature.properties.value,
33592                         package: feature.properties.package,
33593                         detections: feature.properties.detections
33594                     };
33595
33596                     // cache image_key -> detection_key
33597                     feature.properties.detections.forEach(function(detection) {
33598                         var ik = detection.image_key;
33599                         var dk = detection.detection_key;
33600                         if (!mapillaryCache.detections[ik]) {
33601                             mapillaryCache.detections[ik] = {};
33602                         }
33603                         if (!mapillaryCache.detections[ik][dk]) {
33604                             mapillaryCache.detections[ik][dk] = {};
33605                         }
33606                     });
33607                 }
33608
33609                 return {
33610                     minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
33611                 };
33612             });
33613
33614             cache.rtree.load(features);
33615
33616             if (which === 'images') {
33617                 dispatch$1.call('loadedImages');
33618             } else if (which === 'objects') {
33619                 dispatch$1.call('loadedSigns');
33620             }
33621
33622             if (data.features.length === maxResults) {  // more pages to load
33623                 cache.nextPage[tile.id] = nextPage + 1;
33624                 loadNextTilePage(which, currZoom, url, tile);
33625             } else {
33626                 cache.nextPage[tile.id] = Infinity;     // no more pages to load
33627             }
33628         });
33629 }
33630
33631 // extract links to pages of API results
33632 function parsePagination(links) {
33633     return links.split(',').map(function(rel) {
33634         var elements = rel.split(';');
33635         if (elements.length === 2) {
33636             return [
33637                 /<(.+)>/.exec(elements[0])[1],
33638                 /rel="(.+)"/.exec(elements[1])[1]
33639                 ];
33640         } else {
33641             return ['',''];
33642         }
33643     }).reduce(function(pagination, val) {
33644         pagination[val[1]] = val[0];
33645         return pagination;
33646     }, {});
33647 }
33648
33649
33650 // partition viewport into `psize` x `psize` regions
33651 function partitionViewport(psize, projection) {
33652     var dimensions = projection.clipExtent()[1];
33653     psize = psize || 16;
33654     var cols = d3_range(0, dimensions[0], psize),
33655         rows = d3_range(0, dimensions[1], psize),
33656         partitions = [];
33657
33658     rows.forEach(function(y) {
33659         cols.forEach(function(x) {
33660             var min$$1 = [x, y + psize],
33661                 max$$1 = [x + psize, y];
33662             partitions.push(
33663                 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
33664         });
33665     });
33666
33667     return partitions;
33668 }
33669
33670
33671 // no more than `limit` results per partition.
33672 function searchLimited(psize, limit, projection, rtree) {
33673     limit = limit || 3;
33674
33675     var partitions = partitionViewport(psize, projection);
33676     var results;
33677
33678     // console.time('previous');
33679     results =  flatten(map$4(partitions, function(extent$$1) {
33680         return rtree.search(extent$$1.bbox())
33681             .slice(0, limit)
33682             .map(function(d) { return d.data; });
33683     }));
33684     // console.timeEnd('previous');
33685
33686     // console.time('new');
33687     // results = partitions.reduce(function(result, extent) {
33688     //     var found = rtree.search(extent.bbox())
33689     //         .map(function(d) { return d.data; })
33690     //         .sort(function(a, b) {
33691     //             return a.loc[1] - b.loc[1];
33692     //             // return a.key.localeCompare(b.key);
33693     //         })
33694     //         .slice(0, limit);
33695
33696     //     return (found.length ? result.concat(found) : result);
33697     // }, []);
33698     // console.timeEnd('new');
33699
33700     return results;
33701 }
33702
33703
33704
33705 var serviceMapillary = {
33706
33707     init: function() {
33708         if (!mapillaryCache) {
33709             this.reset();
33710         }
33711
33712         this.event = utilRebind(this, dispatch$1, 'on');
33713     },
33714
33715     reset: function() {
33716         var cache = mapillaryCache;
33717
33718         if (cache) {
33719             if (cache.images && cache.images.inflight) {
33720                 forEach(cache.images.inflight, abortRequest);
33721             }
33722             if (cache.objects && cache.objects.inflight) {
33723                 forEach(cache.objects.inflight, abortRequest);
33724             }
33725         }
33726
33727         mapillaryCache = {
33728             images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
33729             objects:  { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
33730             detections: {}
33731         };
33732
33733         mapillaryImage = null;
33734         mapillaryClicks = [];
33735     },
33736
33737
33738     images: function(projection) {
33739         var psize = 16, limit = 3;
33740         return searchLimited(psize, limit, projection, mapillaryCache.images.rtree);
33741     },
33742
33743
33744     signs: function(projection) {
33745         var psize = 32, limit = 3;
33746         return searchLimited(psize, limit, projection, mapillaryCache.objects.rtree);
33747     },
33748
33749
33750     signsSupported: function() {
33751         var detected = utilDetect();
33752         if (detected.ie) return false;
33753         if ((detected.browser.toLowerCase() === 'safari') && (parseFloat(detected.version) < 10)) return false;
33754         return true;
33755     },
33756
33757
33758     signHTML: function(d) {
33759         if (!mapillarySignDefs || !mapillarySignSprite) return;
33760         var position = mapillarySignDefs[d.value];
33761         if (!position) return '<div></div>';
33762         var iconStyle = [
33763             'background-image:url(' + mapillarySignSprite + ')',
33764             'background-repeat:no-repeat',
33765             'height:' + position.height + 'px',
33766             'width:' + position.width + 'px',
33767             'background-position-x:-' + position.x + 'px',
33768             'background-position-y:-' + position.y + 'px',
33769         ];
33770
33771         return '<div style="' + iconStyle.join(';') +'"></div>';
33772     },
33773
33774
33775     loadImages: function(projection) {
33776         var url = apibase + 'images?';
33777         loadTiles('images', url, projection);
33778     },
33779
33780
33781     loadSigns: function(context, projection) {
33782         var url = apibase + 'objects?';
33783         loadTiles('objects', url, projection);
33784
33785         // load traffic sign defs
33786         if (!mapillarySignDefs) {
33787             mapillarySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
33788             mapillarySignDefs = {};
33789             d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
33790                 if (err) return;
33791                 mapillarySignDefs = data;
33792             });
33793         }
33794     },
33795
33796
33797     loadViewer: function(context) {
33798         var that = this;
33799         var wrap = d3_select('#content').selectAll('.mapillary-wrap')
33800             .data([0]);
33801
33802         var enter = wrap.enter()
33803             .append('div')
33804             .attr('class', 'mapillary-wrap')
33805             .classed('al', true)       // 'al'=left,  'ar'=right
33806             .classed('hidden', true);
33807
33808         enter
33809             .append('button')
33810             .attr('class', 'thumb-hide')
33811             .on('click', function () { that.hideViewer(); })
33812             .append('div')
33813             .call(svgIcon('#icon-close'));
33814
33815         enter
33816             .append('div')
33817             .attr('id', 'mly')
33818             .attr('class', 'mly-wrapper')
33819             .classed('active', false);
33820
33821         // load mapillary-viewercss
33822         d3_select('head').selectAll('#mapillary-viewercss')
33823             .data([0])
33824             .enter()
33825             .append('link')
33826             .attr('id', 'mapillary-viewercss')
33827             .attr('rel', 'stylesheet')
33828             .attr('href', context.asset(viewercss));
33829
33830         // load mapillary-viewerjs
33831         d3_select('head').selectAll('#mapillary-viewerjs')
33832             .data([0])
33833             .enter()
33834             .append('script')
33835             .attr('id', 'mapillary-viewerjs')
33836             .attr('src', context.asset(viewerjs));
33837     },
33838
33839
33840     showViewer: function() {
33841         d3_select('#content')
33842             .selectAll('.mapillary-wrap')
33843             .classed('hidden', false)
33844             .selectAll('.mly-wrapper')
33845             .classed('active', true);
33846
33847         return this;
33848     },
33849
33850
33851     hideViewer: function() {
33852         d3_select('#content')
33853             .selectAll('.mapillary-wrap')
33854             .classed('hidden', true)
33855             .selectAll('.mly-wrapper')
33856             .classed('active', false);
33857
33858         d3_selectAll('.layer-mapillary-images .viewfield-group, .layer-mapillary-signs .icon-sign')
33859             .classed('selected', false);
33860
33861         mapillaryImage = null;
33862         return this;
33863     },
33864
33865
33866     parsePagination: parsePagination,
33867
33868
33869     updateViewer: function(imageKey, context) {
33870         if (!imageKey) return;
33871
33872         if (!mapillaryViewer) {
33873             this.initViewer(imageKey, context);
33874         } else {
33875             mapillaryViewer.moveToKey(imageKey);
33876         }
33877
33878         return this;
33879     },
33880
33881
33882     initViewer: function(imageKey, context) {
33883         var that = this;
33884         if (Mapillary && imageKey) {
33885             var opts = {
33886                 baseImageSize: 320,
33887                 component: {
33888                     cover: false,
33889                     keyboard: false,
33890                     tag: true
33891                 }
33892             };
33893
33894             mapillaryViewer = new Mapillary.Viewer('mly', clientId, imageKey, opts);
33895             mapillaryViewer.on('nodechanged', nodeChanged);
33896         }
33897
33898         // nodeChanged: called after the viewer has changed images and is ready.
33899         //
33900         // There is some logic here to batch up clicks into a mapillaryClicks array
33901         // because the user might click on a lot of markers quickly and nodechanged
33902         // may be called out of order asychronously.
33903         //
33904         // Clicks are added to the array in `selectedImage` and removed here.
33905         //
33906         function nodeChanged(node) {
33907             mapillaryViewer.getComponent('tag').removeAll();  // remove previous detections
33908
33909             var clicks = mapillaryClicks;
33910             var index = clicks.indexOf(node.key);
33911             if (index > -1) {    // `nodechanged` initiated from clicking on a marker..
33912                 clicks.splice(index, 1);
33913                 // If `node.key` matches the current mapillaryImage, call `selectedImage()`
33914                 // one more time to update the detections and attribution..
33915                 if (node.key === mapillaryImage) {
33916                     that.selectedImage(node.key, false);
33917                 }
33918             } else {             // `nodechanged` initiated from the Mapillary viewer controls..
33919                 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
33920                 context.map().centerEase(loc);
33921                 that.selectedImage(node.key, false);
33922             }
33923         }
33924     },
33925
33926
33927     selectedImage: function(imageKey, fromClick) {
33928         if (!arguments.length) return mapillaryImage;
33929         mapillaryImage = imageKey;
33930
33931         if (fromClick) {
33932             mapillaryClicks.push(imageKey);
33933         }
33934
33935         d3_selectAll('.layer-mapillary-images .viewfield-group')
33936             .classed('selected', function(d) {
33937                 return d.key === imageKey;
33938             });
33939
33940         d3_selectAll('.layer-mapillary-signs .icon-sign')
33941             .classed('selected', function(d) {
33942                 return some(d.detections, function(detection) {
33943                     return detection.image_key === imageKey;
33944                 });
33945             });
33946
33947         if (!imageKey)  return this;
33948
33949
33950         function localeTimestamp(s) {
33951             if (!s) return null;
33952             var d = new Date(s);
33953             if (isNaN(d.getTime())) return null;
33954             return d.toLocaleString(undefined, { timeZone: 'UTC' });
33955         }
33956
33957         var selected = d3_selectAll('.layer-mapillary-images .viewfield-group.selected');
33958         if (selected.empty()) return this;
33959
33960         var datum = selected.datum();
33961         var timestamp = localeTimestamp(datum.captured_at);
33962         var attribution = d3_select('.mapillary-js-dom .Attribution');
33963         var capturedAt = attribution.selectAll('.captured-at');
33964         if (capturedAt.empty()) {
33965             attribution
33966                 .append('span')
33967                 .text('|');
33968             capturedAt = attribution
33969                 .append('span')
33970                 .attr('class', 'captured-at');
33971         }
33972         capturedAt
33973             .text(timestamp);
33974
33975         this.updateDetections();
33976
33977         return this;
33978     },
33979
33980
33981     updateDetections: function() {
33982         if (!mapillaryViewer) return;
33983
33984         var detections = mapillaryCache.detections[mapillaryImage];
33985         forEach(detections, function(data, k) {
33986             if (isEmpty(data)) {
33987                 loadDetection(k);
33988             } else {
33989                 var tag = makeTag(data);
33990                 if (tag) {
33991                     var tagComponent = mapillaryViewer.getComponent('tag');
33992                     tagComponent.add([tag]);
33993                 }
33994             }
33995         });
33996
33997
33998         function loadDetection(detectionKey) {
33999             var url = apibase + 'detections/'+
34000                 detectionKey + '?' + utilQsString({
34001                     client_id: clientId,
34002                 });
34003
34004             d3_request(url)
34005                 .mimeType('application/json')
34006                 .response(function(xhr) {
34007                     return JSON.parse(xhr.responseText);
34008                 })
34009                 .get(function(err, data) {
34010                     if (!data || !data.properties) return;
34011
34012                     var ik = data.properties.image_key;
34013                     mapillaryCache.detections[ik][detectionKey] = data;
34014
34015                     if (mapillaryImage === ik) {
34016                         var tag = makeTag(data);
34017                         if (tag) {
34018                             var tagComponent = mapillaryViewer.getComponent('tag');
34019                             tagComponent.add([tag]);
34020                         }
34021                     }
34022                 });
34023         }
34024
34025
34026         function makeTag(data) {
34027             var valueParts = data.properties.value.split('--');
34028             if (valueParts.length !== 3) return;
34029
34030             var text = valueParts[1].replace(/-/g, ' ');
34031             var tag;
34032
34033             // Currently only two shapes <Polygon|Point>
34034             if (data.properties.shape.type === 'Polygon') {
34035                 var polygonGeometry = new Mapillary
34036                     .TagComponent
34037                     .PolygonGeometry(data.properties.shape.coordinates[0]);
34038
34039                 tag = new Mapillary.TagComponent.OutlineTag(
34040                     data.properties.key,
34041                     polygonGeometry,
34042                     {
34043                         text: text,
34044                         textColor: 0xffff00,
34045                         lineColor: 0xffff00,
34046                         lineWidth: 2,
34047                         fillColor: 0xffff00,
34048                         fillOpacity: 0.3,
34049                     }
34050                 );
34051
34052             } else if (data.properties.shape.type === 'Point') {
34053                 var pointGeometry = new Mapillary
34054                     .TagComponent
34055                     .PointGeometry(data.properties.shape.coordinates[0]);
34056
34057                 tag = new Mapillary.TagComponent.SpotTag(
34058                     data.properties.key,
34059                     pointGeometry,
34060                     {
34061                         text: text,
34062                         color: 0xffff00,
34063                         textColor: 0xffff00
34064                     }
34065                 );
34066             }
34067
34068             return tag;
34069         }
34070     },
34071
34072
34073     cache: function(_) {
34074         if (!arguments.length) return mapillaryCache;
34075         mapillaryCache = _;
34076         return this;
34077     },
34078
34079
34080     signDefs: function(_) {
34081         if (!arguments.length) return mapillarySignDefs;
34082         mapillarySignDefs = _;
34083         return this;
34084     }
34085
34086 };
34087
34088 var apibase$1 = 'https://nominatim.openstreetmap.org/';
34089 var inflight = {};
34090 var nominatimCache;
34091
34092
34093 var serviceNominatim = {
34094
34095     init: function() {
34096         inflight = {};
34097         nominatimCache = rbush_1();
34098     },
34099
34100     reset: function() {
34101         forEach(inflight, function(req) { req.abort(); });
34102         inflight = {};
34103         nominatimCache = rbush_1();
34104     },
34105
34106
34107     countryCode: function (location, callback) {
34108         this.reverse(location, function(err, result) {
34109             if (err) {
34110                 return callback(err);
34111             } else if (result.address) {
34112                 return callback(null, result.address.country_code);
34113             } else {
34114                 return callback('Unable to geocode', null);
34115             }
34116         });
34117     },
34118
34119
34120     reverse: function (location, callback) {
34121         var cached = nominatimCache.search(
34122             { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
34123         );
34124
34125         if (cached.length > 0) {
34126             return callback(null, cached[0].data);
34127         }
34128
34129         var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
34130         var url = apibase$1 + 'reverse?' + utilQsString(params);
34131         if (inflight[url]) return;
34132
34133         inflight[url] = d3_json(url, function(err, result) {
34134             delete inflight[url];
34135
34136             if (err) {
34137                 return callback(err);
34138             } else if (result && result.error) {
34139                 return callback(result.error);
34140             }
34141
34142             var extent = geoExtent$$1(location).padByMeters(200);
34143             nominatimCache.insert(assign(extent.bbox(), {data: result}));
34144
34145             callback(null, result);
34146         });
34147     },
34148
34149
34150     search: function (val, callback) {
34151         var searchVal = encodeURIComponent(val);
34152         var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
34153         if (inflight[url]) return;
34154
34155         inflight[url] = d3_json(url, function(err, result) {
34156             delete inflight[url];
34157             callback(err, result);
34158         });
34159     }
34160
34161 };
34162
34163 /* Built-in method references for those with the same name as other `lodash` methods. */
34164 var nativeCeil = Math.ceil;
34165 var nativeMax$4 = Math.max;
34166
34167 /**
34168  * Creates an array of elements split into groups the length of `size`.
34169  * If `array` can't be split evenly, the final chunk will be the remaining
34170  * elements.
34171  *
34172  * @static
34173  * @memberOf _
34174  * @since 3.0.0
34175  * @category Array
34176  * @param {Array} array The array to process.
34177  * @param {number} [size=1] The length of each chunk
34178  * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
34179  * @returns {Array} Returns the new array of chunks.
34180  * @example
34181  *
34182  * _.chunk(['a', 'b', 'c', 'd'], 2);
34183  * // => [['a', 'b'], ['c', 'd']]
34184  *
34185  * _.chunk(['a', 'b', 'c', 'd'], 3);
34186  * // => [['a', 'b', 'c'], ['d']]
34187  */
34188 function chunk(array, size, guard) {
34189   if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
34190     size = 1;
34191   } else {
34192     size = nativeMax$4(toInteger(size), 0);
34193   }
34194   var length = array == null ? 0 : array.length;
34195   if (!length || size < 1) {
34196     return [];
34197   }
34198   var index = 0,
34199       resIndex = 0,
34200       result = Array(nativeCeil(length / size));
34201
34202   while (index < length) {
34203     result[resIndex++] = baseSlice(array, index, (index += size));
34204   }
34205   return result;
34206 }
34207
34208 var hashes = createCommonjsModule(function (module, exports) {
34209 /**
34210  * jshashes - https://github.com/h2non/jshashes
34211  * Released under the "New BSD" license
34212  *
34213  * Algorithms specification:
34214  *
34215  * MD5 - http://www.ietf.org/rfc/rfc1321.txt
34216  * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
34217  * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
34218  * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
34219  * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
34220  * HMAC - http://www.ietf.org/rfc/rfc2104.txt
34221  */
34222 (function() {
34223   var Hashes;
34224
34225   function utf8Encode(str) {
34226     var x, y, output = '',
34227       i = -1,
34228       l;
34229
34230     if (str && str.length) {
34231       l = str.length;
34232       while ((i += 1) < l) {
34233         /* Decode utf-16 surrogate pairs */
34234         x = str.charCodeAt(i);
34235         y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
34236         if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
34237           x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
34238           i += 1;
34239         }
34240         /* Encode output as utf-8 */
34241         if (x <= 0x7F) {
34242           output += String.fromCharCode(x);
34243         } else if (x <= 0x7FF) {
34244           output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
34245             0x80 | (x & 0x3F));
34246         } else if (x <= 0xFFFF) {
34247           output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
34248             0x80 | ((x >>> 6) & 0x3F),
34249             0x80 | (x & 0x3F));
34250         } else if (x <= 0x1FFFFF) {
34251           output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
34252             0x80 | ((x >>> 12) & 0x3F),
34253             0x80 | ((x >>> 6) & 0x3F),
34254             0x80 | (x & 0x3F));
34255         }
34256       }
34257     }
34258     return output;
34259   }
34260
34261   function utf8Decode(str) {
34262     var i, ac, c1, c2, c3, arr = [],
34263       l;
34264     i = ac = c1 = c2 = c3 = 0;
34265
34266     if (str && str.length) {
34267       l = str.length;
34268       str += '';
34269
34270       while (i < l) {
34271         c1 = str.charCodeAt(i);
34272         ac += 1;
34273         if (c1 < 128) {
34274           arr[ac] = String.fromCharCode(c1);
34275           i += 1;
34276         } else if (c1 > 191 && c1 < 224) {
34277           c2 = str.charCodeAt(i + 1);
34278           arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
34279           i += 2;
34280         } else {
34281           c2 = str.charCodeAt(i + 1);
34282           c3 = str.charCodeAt(i + 2);
34283           arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
34284           i += 3;
34285         }
34286       }
34287     }
34288     return arr.join('');
34289   }
34290
34291   /**
34292    * Add integers, wrapping at 2^32. This uses 16-bit operations internally
34293    * to work around bugs in some JS interpreters.
34294    */
34295
34296   function safe_add(x, y) {
34297     var lsw = (x & 0xFFFF) + (y & 0xFFFF),
34298       msw = (x >> 16) + (y >> 16) + (lsw >> 16);
34299     return (msw << 16) | (lsw & 0xFFFF);
34300   }
34301
34302   /**
34303    * Bitwise rotate a 32-bit number to the left.
34304    */
34305
34306   function bit_rol(num, cnt) {
34307     return (num << cnt) | (num >>> (32 - cnt));
34308   }
34309
34310   /**
34311    * Convert a raw string to a hex string
34312    */
34313
34314   function rstr2hex(input, hexcase) {
34315     var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
34316       output = '',
34317       x, i = 0,
34318       l = input.length;
34319     for (; i < l; i += 1) {
34320       x = input.charCodeAt(i);
34321       output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
34322     }
34323     return output;
34324   }
34325
34326   /**
34327    * Encode a string as utf-16
34328    */
34329
34330   function binb2rstr(input) {
34331     var i, l = input.length * 32,
34332       output = '';
34333     for (i = 0; i < l; i += 8) {
34334       output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
34335     }
34336     return output;
34337   }
34338
34339   /**
34340    * Convert an array of little-endian words to a string
34341    */
34342
34343   function binl2rstr(input) {
34344     var i, l = input.length * 32,
34345       output = '';
34346     for (i = 0; i < l; i += 8) {
34347       output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
34348     }
34349     return output;
34350   }
34351
34352   /**
34353    * Convert a raw string to an array of little-endian words
34354    * Characters >255 have their high-byte silently ignored.
34355    */
34356
34357   function rstr2binl(input) {
34358     var i, l = input.length * 8,
34359       output = Array(input.length >> 2),
34360       lo = output.length;
34361     for (i = 0; i < lo; i += 1) {
34362       output[i] = 0;
34363     }
34364     for (i = 0; i < l; i += 8) {
34365       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
34366     }
34367     return output;
34368   }
34369
34370   /**
34371    * Convert a raw string to an array of big-endian words
34372    * Characters >255 have their high-byte silently ignored.
34373    */
34374
34375   function rstr2binb(input) {
34376     var i, l = input.length * 8,
34377       output = Array(input.length >> 2),
34378       lo = output.length;
34379     for (i = 0; i < lo; i += 1) {
34380       output[i] = 0;
34381     }
34382     for (i = 0; i < l; i += 8) {
34383       output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
34384     }
34385     return output;
34386   }
34387
34388   /**
34389    * Convert a raw string to an arbitrary string encoding
34390    */
34391
34392   function rstr2any(input, encoding) {
34393     var divisor = encoding.length,
34394       remainders = Array(),
34395       i, q, x, ld, quotient, dividend, output, full_length;
34396
34397     /* Convert to an array of 16-bit big-endian values, forming the dividend */
34398     dividend = Array(Math.ceil(input.length / 2));
34399     ld = dividend.length;
34400     for (i = 0; i < ld; i += 1) {
34401       dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
34402     }
34403
34404     /**
34405      * Repeatedly perform a long division. The binary array forms the dividend,
34406      * the length of the encoding is the divisor. Once computed, the quotient
34407      * forms the dividend for the next step. We stop when the dividend is zerHashes.
34408      * All remainders are stored for later use.
34409      */
34410     while (dividend.length > 0) {
34411       quotient = Array();
34412       x = 0;
34413       for (i = 0; i < dividend.length; i += 1) {
34414         x = (x << 16) + dividend[i];
34415         q = Math.floor(x / divisor);
34416         x -= q * divisor;
34417         if (quotient.length > 0 || q > 0) {
34418           quotient[quotient.length] = q;
34419         }
34420       }
34421       remainders[remainders.length] = x;
34422       dividend = quotient;
34423     }
34424
34425     /* Convert the remainders to the output string */
34426     output = '';
34427     for (i = remainders.length - 1; i >= 0; i--) {
34428       output += encoding.charAt(remainders[i]);
34429     }
34430
34431     /* Append leading zero equivalents */
34432     full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
34433     for (i = output.length; i < full_length; i += 1) {
34434       output = encoding[0] + output;
34435     }
34436     return output;
34437   }
34438
34439   /**
34440    * Convert a raw string to a base-64 string
34441    */
34442
34443   function rstr2b64(input, b64pad) {
34444     var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
34445       output = '',
34446       len = input.length,
34447       i, j, triplet;
34448     b64pad = b64pad || '=';
34449     for (i = 0; i < len; i += 3) {
34450       triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
34451       for (j = 0; j < 4; j += 1) {
34452         if (i * 8 + j * 6 > input.length * 8) {
34453           output += b64pad;
34454         } else {
34455           output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
34456         }
34457       }
34458     }
34459     return output;
34460   }
34461
34462   Hashes = {
34463     /**
34464      * @property {String} version
34465      * @readonly
34466      */
34467     VERSION: '1.0.6',
34468     /**
34469      * @member Hashes
34470      * @class Base64
34471      * @constructor
34472      */
34473     Base64: function() {
34474       // private properties
34475       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
34476         pad = '=', // default pad according with the RFC standard
34477         url = false, // URL encoding support @todo
34478         utf8 = true; // by default enable UTF-8 support encoding
34479
34480       // public method for encoding
34481       this.encode = function(input) {
34482         var i, j, triplet,
34483           output = '',
34484           len = input.length;
34485
34486         pad = pad || '=';
34487         input = (utf8) ? utf8Encode(input) : input;
34488
34489         for (i = 0; i < len; i += 3) {
34490           triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
34491           for (j = 0; j < 4; j += 1) {
34492             if (i * 8 + j * 6 > len * 8) {
34493               output += pad;
34494             } else {
34495               output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
34496             }
34497           }
34498         }
34499         return output;
34500       };
34501
34502       // public method for decoding
34503       this.decode = function(input) {
34504         // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
34505         var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
34506           dec = '',
34507           arr = [];
34508         if (!input) {
34509           return input;
34510         }
34511
34512         i = ac = 0;
34513         input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
34514         //input += '';
34515
34516         do { // unpack four hexets into three octets using index points in b64
34517           h1 = tab.indexOf(input.charAt(i += 1));
34518           h2 = tab.indexOf(input.charAt(i += 1));
34519           h3 = tab.indexOf(input.charAt(i += 1));
34520           h4 = tab.indexOf(input.charAt(i += 1));
34521
34522           bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
34523
34524           o1 = bits >> 16 & 0xff;
34525           o2 = bits >> 8 & 0xff;
34526           o3 = bits & 0xff;
34527           ac += 1;
34528
34529           if (h3 === 64) {
34530             arr[ac] = String.fromCharCode(o1);
34531           } else if (h4 === 64) {
34532             arr[ac] = String.fromCharCode(o1, o2);
34533           } else {
34534             arr[ac] = String.fromCharCode(o1, o2, o3);
34535           }
34536         } while (i < input.length);
34537
34538         dec = arr.join('');
34539         dec = (utf8) ? utf8Decode(dec) : dec;
34540
34541         return dec;
34542       };
34543
34544       // set custom pad string
34545       this.setPad = function(str) {
34546         pad = str || pad;
34547         return this;
34548       };
34549       // set custom tab string characters
34550       this.setTab = function(str) {
34551         tab = str || tab;
34552         return this;
34553       };
34554       this.setUTF8 = function(bool) {
34555         if (typeof bool === 'boolean') {
34556           utf8 = bool;
34557         }
34558         return this;
34559       };
34560     },
34561
34562     /**
34563      * CRC-32 calculation
34564      * @member Hashes
34565      * @method CRC32
34566      * @static
34567      * @param {String} str Input String
34568      * @return {String}
34569      */
34570     CRC32: function(str) {
34571       var crc = 0,
34572         x = 0,
34573         y = 0,
34574         table, i, iTop;
34575       str = utf8Encode(str);
34576
34577       table = [
34578         '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
34579         '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
34580         '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
34581         '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
34582         'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
34583         '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
34584         'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
34585         '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
34586         'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
34587         '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
34588         'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
34589         '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
34590         'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
34591         '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
34592         '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
34593         '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
34594         '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
34595         'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
34596         '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
34597         'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
34598         '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
34599         'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
34600         '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
34601         'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
34602         '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
34603         'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
34604       ].join('');
34605
34606       crc = crc ^ (-1);
34607       for (i = 0, iTop = str.length; i < iTop; i += 1) {
34608         y = (crc ^ str.charCodeAt(i)) & 0xFF;
34609         x = '0x' + table.substr(y * 9, 8);
34610         crc = (crc >>> 8) ^ x;
34611       }
34612       // always return a positive number (that's what >>> 0 does)
34613       return (crc ^ (-1)) >>> 0;
34614     },
34615     /**
34616      * @member Hashes
34617      * @class MD5
34618      * @constructor
34619      * @param {Object} [config]
34620      *
34621      * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
34622      * Digest Algorithm, as defined in RFC 1321.
34623      * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
34624      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34625      * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
34626      */
34627     MD5: function(options) {
34628       /**
34629        * Private config properties. You may need to tweak these to be compatible with
34630        * the server-side, but the defaults work in most cases.
34631        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
34632        */
34633       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
34634         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
34635         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
34636
34637       // privileged (public) methods
34638       this.hex = function(s) {
34639         return rstr2hex(rstr(s, utf8), hexcase);
34640       };
34641       this.b64 = function(s) {
34642         return rstr2b64(rstr(s), b64pad);
34643       };
34644       this.any = function(s, e) {
34645         return rstr2any(rstr(s, utf8), e);
34646       };
34647       this.raw = function(s) {
34648         return rstr(s, utf8);
34649       };
34650       this.hex_hmac = function(k, d) {
34651         return rstr2hex(rstr_hmac(k, d), hexcase);
34652       };
34653       this.b64_hmac = function(k, d) {
34654         return rstr2b64(rstr_hmac(k, d), b64pad);
34655       };
34656       this.any_hmac = function(k, d, e) {
34657         return rstr2any(rstr_hmac(k, d), e);
34658       };
34659       /**
34660        * Perform a simple self-test to see if the VM is working
34661        * @return {String} Hexadecimal hash sample
34662        */
34663       this.vm_test = function() {
34664         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34665       };
34666       /**
34667        * Enable/disable uppercase hexadecimal returned string
34668        * @param {Boolean}
34669        * @return {Object} this
34670        */
34671       this.setUpperCase = function(a) {
34672         if (typeof a === 'boolean') {
34673           hexcase = a;
34674         }
34675         return this;
34676       };
34677       /**
34678        * Defines a base64 pad string
34679        * @param {String} Pad
34680        * @return {Object} this
34681        */
34682       this.setPad = function(a) {
34683         b64pad = a || b64pad;
34684         return this;
34685       };
34686       /**
34687        * Defines a base64 pad string
34688        * @param {Boolean}
34689        * @return {Object} [this]
34690        */
34691       this.setUTF8 = function(a) {
34692         if (typeof a === 'boolean') {
34693           utf8 = a;
34694         }
34695         return this;
34696       };
34697
34698       // private methods
34699
34700       /**
34701        * Calculate the MD5 of a raw string
34702        */
34703
34704       function rstr(s) {
34705         s = (utf8) ? utf8Encode(s) : s;
34706         return binl2rstr(binl(rstr2binl(s), s.length * 8));
34707       }
34708
34709       /**
34710        * Calculate the HMAC-MD5, of a key and some data (raw strings)
34711        */
34712
34713       function rstr_hmac(key, data) {
34714         var bkey, ipad, opad, hash, i;
34715
34716         key = (utf8) ? utf8Encode(key) : key;
34717         data = (utf8) ? utf8Encode(data) : data;
34718         bkey = rstr2binl(key);
34719         if (bkey.length > 16) {
34720           bkey = binl(bkey, key.length * 8);
34721         }
34722
34723         ipad = Array(16), opad = Array(16);
34724         for (i = 0; i < 16; i += 1) {
34725           ipad[i] = bkey[i] ^ 0x36363636;
34726           opad[i] = bkey[i] ^ 0x5C5C5C5C;
34727         }
34728         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
34729         return binl2rstr(binl(opad.concat(hash), 512 + 128));
34730       }
34731
34732       /**
34733        * Calculate the MD5 of an array of little-endian words, and a bit length.
34734        */
34735
34736       function binl(x, len) {
34737         var i, olda, oldb, oldc, oldd,
34738           a = 1732584193,
34739           b = -271733879,
34740           c = -1732584194,
34741           d = 271733878;
34742
34743         /* append padding */
34744         x[len >> 5] |= 0x80 << ((len) % 32);
34745         x[(((len + 64) >>> 9) << 4) + 14] = len;
34746
34747         for (i = 0; i < x.length; i += 16) {
34748           olda = a;
34749           oldb = b;
34750           oldc = c;
34751           oldd = d;
34752
34753           a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
34754           d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
34755           c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
34756           b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
34757           a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
34758           d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
34759           c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
34760           b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
34761           a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
34762           d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
34763           c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
34764           b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
34765           a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
34766           d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
34767           c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
34768           b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
34769
34770           a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
34771           d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
34772           c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
34773           b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
34774           a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
34775           d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
34776           c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
34777           b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
34778           a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
34779           d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
34780           c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
34781           b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
34782           a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
34783           d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
34784           c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
34785           b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
34786
34787           a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
34788           d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
34789           c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
34790           b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
34791           a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
34792           d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
34793           c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
34794           b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
34795           a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
34796           d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
34797           c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
34798           b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
34799           a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
34800           d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
34801           c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
34802           b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
34803
34804           a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
34805           d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
34806           c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
34807           b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
34808           a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
34809           d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
34810           c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
34811           b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
34812           a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
34813           d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
34814           c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
34815           b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
34816           a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
34817           d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
34818           c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
34819           b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
34820
34821           a = safe_add(a, olda);
34822           b = safe_add(b, oldb);
34823           c = safe_add(c, oldc);
34824           d = safe_add(d, oldd);
34825         }
34826         return Array(a, b, c, d);
34827       }
34828
34829       /**
34830        * These functions implement the four basic operations the algorithm uses.
34831        */
34832
34833       function md5_cmn(q, a, b, x, s, t) {
34834         return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
34835       }
34836
34837       function md5_ff(a, b, c, d, x, s, t) {
34838         return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
34839       }
34840
34841       function md5_gg(a, b, c, d, x, s, t) {
34842         return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
34843       }
34844
34845       function md5_hh(a, b, c, d, x, s, t) {
34846         return md5_cmn(b ^ c ^ d, a, b, x, s, t);
34847       }
34848
34849       function md5_ii(a, b, c, d, x, s, t) {
34850         return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
34851       }
34852     },
34853     /**
34854      * @member Hashes
34855      * @class Hashes.SHA1
34856      * @param {Object} [config]
34857      * @constructor
34858      *
34859      * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
34860      * Version 2.2 Copyright Paul Johnston 2000 - 2009.
34861      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
34862      * See http://pajhome.org.uk/crypt/md5 for details.
34863      */
34864     SHA1: function(options) {
34865       /**
34866        * Private config properties. You may need to tweak these to be compatible with
34867        * the server-side, but the defaults work in most cases.
34868        * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
34869        */
34870       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
34871         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
34872         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
34873
34874       // public methods
34875       this.hex = function(s) {
34876         return rstr2hex(rstr(s, utf8), hexcase);
34877       };
34878       this.b64 = function(s) {
34879         return rstr2b64(rstr(s, utf8), b64pad);
34880       };
34881       this.any = function(s, e) {
34882         return rstr2any(rstr(s, utf8), e);
34883       };
34884       this.raw = function(s) {
34885         return rstr(s, utf8);
34886       };
34887       this.hex_hmac = function(k, d) {
34888         return rstr2hex(rstr_hmac(k, d));
34889       };
34890       this.b64_hmac = function(k, d) {
34891         return rstr2b64(rstr_hmac(k, d), b64pad);
34892       };
34893       this.any_hmac = function(k, d, e) {
34894         return rstr2any(rstr_hmac(k, d), e);
34895       };
34896       /**
34897        * Perform a simple self-test to see if the VM is working
34898        * @return {String} Hexadecimal hash sample
34899        * @public
34900        */
34901       this.vm_test = function() {
34902         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
34903       };
34904       /**
34905        * @description Enable/disable uppercase hexadecimal returned string
34906        * @param {boolean}
34907        * @return {Object} this
34908        * @public
34909        */
34910       this.setUpperCase = function(a) {
34911         if (typeof a === 'boolean') {
34912           hexcase = a;
34913         }
34914         return this;
34915       };
34916       /**
34917        * @description Defines a base64 pad string
34918        * @param {string} Pad
34919        * @return {Object} this
34920        * @public
34921        */
34922       this.setPad = function(a) {
34923         b64pad = a || b64pad;
34924         return this;
34925       };
34926       /**
34927        * @description Defines a base64 pad string
34928        * @param {boolean}
34929        * @return {Object} this
34930        * @public
34931        */
34932       this.setUTF8 = function(a) {
34933         if (typeof a === 'boolean') {
34934           utf8 = a;
34935         }
34936         return this;
34937       };
34938
34939       // private methods
34940
34941       /**
34942        * Calculate the SHA-512 of a raw string
34943        */
34944
34945       function rstr(s) {
34946         s = (utf8) ? utf8Encode(s) : s;
34947         return binb2rstr(binb(rstr2binb(s), s.length * 8));
34948       }
34949
34950       /**
34951        * Calculate the HMAC-SHA1 of a key and some data (raw strings)
34952        */
34953
34954       function rstr_hmac(key, data) {
34955         var bkey, ipad, opad, i, hash;
34956         key = (utf8) ? utf8Encode(key) : key;
34957         data = (utf8) ? utf8Encode(data) : data;
34958         bkey = rstr2binb(key);
34959
34960         if (bkey.length > 16) {
34961           bkey = binb(bkey, key.length * 8);
34962         }
34963         ipad = Array(16), opad = Array(16);
34964         for (i = 0; i < 16; i += 1) {
34965           ipad[i] = bkey[i] ^ 0x36363636;
34966           opad[i] = bkey[i] ^ 0x5C5C5C5C;
34967         }
34968         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
34969         return binb2rstr(binb(opad.concat(hash), 512 + 160));
34970       }
34971
34972       /**
34973        * Calculate the SHA-1 of an array of big-endian words, and a bit length
34974        */
34975
34976       function binb(x, len) {
34977         var i, j, t, olda, oldb, oldc, oldd, olde,
34978           w = Array(80),
34979           a = 1732584193,
34980           b = -271733879,
34981           c = -1732584194,
34982           d = 271733878,
34983           e = -1009589776;
34984
34985         /* append padding */
34986         x[len >> 5] |= 0x80 << (24 - len % 32);
34987         x[((len + 64 >> 9) << 4) + 15] = len;
34988
34989         for (i = 0; i < x.length; i += 16) {
34990           olda = a;
34991           oldb = b;
34992           oldc = c;
34993           oldd = d;
34994           olde = e;
34995
34996           for (j = 0; j < 80; j += 1) {
34997             if (j < 16) {
34998               w[j] = x[i + j];
34999             } else {
35000               w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
35001             }
35002             t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
35003               safe_add(safe_add(e, w[j]), sha1_kt(j)));
35004             e = d;
35005             d = c;
35006             c = bit_rol(b, 30);
35007             b = a;
35008             a = t;
35009           }
35010
35011           a = safe_add(a, olda);
35012           b = safe_add(b, oldb);
35013           c = safe_add(c, oldc);
35014           d = safe_add(d, oldd);
35015           e = safe_add(e, olde);
35016         }
35017         return Array(a, b, c, d, e);
35018       }
35019
35020       /**
35021        * Perform the appropriate triplet combination function for the current
35022        * iteration
35023        */
35024
35025       function sha1_ft(t, b, c, d) {
35026         if (t < 20) {
35027           return (b & c) | ((~b) & d);
35028         }
35029         if (t < 40) {
35030           return b ^ c ^ d;
35031         }
35032         if (t < 60) {
35033           return (b & c) | (b & d) | (c & d);
35034         }
35035         return b ^ c ^ d;
35036       }
35037
35038       /**
35039        * Determine the appropriate additive constant for the current iteration
35040        */
35041
35042       function sha1_kt(t) {
35043         return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
35044           (t < 60) ? -1894007588 : -899497514;
35045       }
35046     },
35047     /**
35048      * @class Hashes.SHA256
35049      * @param {config}
35050      *
35051      * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
35052      * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
35053      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35054      * See http://pajhome.org.uk/crypt/md5 for details.
35055      * Also http://anmar.eu.org/projects/jssha2/
35056      */
35057     SHA256: function(options) {
35058       /**
35059        * Private properties configuration variables. You may need to tweak these to be compatible with
35060        * the server-side, but the defaults work in most cases.
35061        * @see this.setUpperCase() method
35062        * @see this.setPad() method
35063        */
35064       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
35065         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
35066         /* base-64 pad character. Default '=' for strict RFC compliance   */
35067         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35068         /* enable/disable utf8 encoding */
35069         sha256_K;
35070
35071       /* privileged (public) methods */
35072       this.hex = function(s) {
35073         return rstr2hex(rstr(s, utf8));
35074       };
35075       this.b64 = function(s) {
35076         return rstr2b64(rstr(s, utf8), b64pad);
35077       };
35078       this.any = function(s, e) {
35079         return rstr2any(rstr(s, utf8), e);
35080       };
35081       this.raw = function(s) {
35082         return rstr(s, utf8);
35083       };
35084       this.hex_hmac = function(k, d) {
35085         return rstr2hex(rstr_hmac(k, d));
35086       };
35087       this.b64_hmac = function(k, d) {
35088         return rstr2b64(rstr_hmac(k, d), b64pad);
35089       };
35090       this.any_hmac = function(k, d, e) {
35091         return rstr2any(rstr_hmac(k, d), e);
35092       };
35093       /**
35094        * Perform a simple self-test to see if the VM is working
35095        * @return {String} Hexadecimal hash sample
35096        * @public
35097        */
35098       this.vm_test = function() {
35099         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35100       };
35101       /**
35102        * Enable/disable uppercase hexadecimal returned string
35103        * @param {boolean}
35104        * @return {Object} this
35105        * @public
35106        */
35107       this.setUpperCase = function(a) {
35108         if (typeof a === 'boolean') {
35109           hexcase = a;
35110         }
35111         return this;
35112       };
35113       /**
35114        * @description Defines a base64 pad string
35115        * @param {string} Pad
35116        * @return {Object} this
35117        * @public
35118        */
35119       this.setPad = function(a) {
35120         b64pad = a || b64pad;
35121         return this;
35122       };
35123       /**
35124        * Defines a base64 pad string
35125        * @param {boolean}
35126        * @return {Object} this
35127        * @public
35128        */
35129       this.setUTF8 = function(a) {
35130         if (typeof a === 'boolean') {
35131           utf8 = a;
35132         }
35133         return this;
35134       };
35135
35136       // private methods
35137
35138       /**
35139        * Calculate the SHA-512 of a raw string
35140        */
35141
35142       function rstr(s, utf8) {
35143         s = (utf8) ? utf8Encode(s) : s;
35144         return binb2rstr(binb(rstr2binb(s), s.length * 8));
35145       }
35146
35147       /**
35148        * Calculate the HMAC-sha256 of a key and some data (raw strings)
35149        */
35150
35151       function rstr_hmac(key, data) {
35152         key = (utf8) ? utf8Encode(key) : key;
35153         data = (utf8) ? utf8Encode(data) : data;
35154         var hash, i = 0,
35155           bkey = rstr2binb(key),
35156           ipad = Array(16),
35157           opad = Array(16);
35158
35159         if (bkey.length > 16) {
35160           bkey = binb(bkey, key.length * 8);
35161         }
35162
35163         for (; i < 16; i += 1) {
35164           ipad[i] = bkey[i] ^ 0x36363636;
35165           opad[i] = bkey[i] ^ 0x5C5C5C5C;
35166         }
35167
35168         hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
35169         return binb2rstr(binb(opad.concat(hash), 512 + 256));
35170       }
35171
35172       /*
35173        * Main sha256 function, with its support functions
35174        */
35175
35176       function sha256_S(X, n) {
35177         return (X >>> n) | (X << (32 - n));
35178       }
35179
35180       function sha256_R(X, n) {
35181         return (X >>> n);
35182       }
35183
35184       function sha256_Ch(x, y, z) {
35185         return ((x & y) ^ ((~x) & z));
35186       }
35187
35188       function sha256_Maj(x, y, z) {
35189         return ((x & y) ^ (x & z) ^ (y & z));
35190       }
35191
35192       function sha256_Sigma0256(x) {
35193         return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
35194       }
35195
35196       function sha256_Sigma1256(x) {
35197         return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
35198       }
35199
35200       function sha256_Gamma0256(x) {
35201         return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
35202       }
35203
35204       function sha256_Gamma1256(x) {
35205         return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
35206       }
35207
35208       sha256_K = [
35209         1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
35210         1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
35211         264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
35212         113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
35213         1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
35214         430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
35215         1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
35216       ];
35217
35218       function binb(m, l) {
35219         var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
35220           1359893119, -1694144372, 528734635, 1541459225
35221         ];
35222         var W = new Array(64);
35223         var a, b, c, d, e, f, g, h;
35224         var i, j, T1, T2;
35225
35226         /* append padding */
35227         m[l >> 5] |= 0x80 << (24 - l % 32);
35228         m[((l + 64 >> 9) << 4) + 15] = l;
35229
35230         for (i = 0; i < m.length; i += 16) {
35231           a = HASH[0];
35232           b = HASH[1];
35233           c = HASH[2];
35234           d = HASH[3];
35235           e = HASH[4];
35236           f = HASH[5];
35237           g = HASH[6];
35238           h = HASH[7];
35239
35240           for (j = 0; j < 64; j += 1) {
35241             if (j < 16) {
35242               W[j] = m[j + i];
35243             } else {
35244               W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
35245                 sha256_Gamma0256(W[j - 15])), W[j - 16]);
35246             }
35247
35248             T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
35249               sha256_K[j]), W[j]);
35250             T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
35251             h = g;
35252             g = f;
35253             f = e;
35254             e = safe_add(d, T1);
35255             d = c;
35256             c = b;
35257             b = a;
35258             a = safe_add(T1, T2);
35259           }
35260
35261           HASH[0] = safe_add(a, HASH[0]);
35262           HASH[1] = safe_add(b, HASH[1]);
35263           HASH[2] = safe_add(c, HASH[2]);
35264           HASH[3] = safe_add(d, HASH[3]);
35265           HASH[4] = safe_add(e, HASH[4]);
35266           HASH[5] = safe_add(f, HASH[5]);
35267           HASH[6] = safe_add(g, HASH[6]);
35268           HASH[7] = safe_add(h, HASH[7]);
35269         }
35270         return HASH;
35271       }
35272
35273     },
35274
35275     /**
35276      * @class Hashes.SHA512
35277      * @param {config}
35278      *
35279      * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
35280      * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
35281      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35282      * See http://pajhome.org.uk/crypt/md5 for details.
35283      */
35284     SHA512: function(options) {
35285       /**
35286        * Private properties configuration variables. You may need to tweak these to be compatible with
35287        * the server-side, but the defaults work in most cases.
35288        * @see this.setUpperCase() method
35289        * @see this.setPad() method
35290        */
35291       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
35292         /* hexadecimal output case format. false - lowercase; true - uppercase  */
35293         b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
35294         /* base-64 pad character. Default '=' for strict RFC compliance   */
35295         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35296         /* enable/disable utf8 encoding */
35297         sha512_k;
35298
35299       /* privileged (public) methods */
35300       this.hex = function(s) {
35301         return rstr2hex(rstr(s));
35302       };
35303       this.b64 = function(s) {
35304         return rstr2b64(rstr(s), b64pad);
35305       };
35306       this.any = function(s, e) {
35307         return rstr2any(rstr(s), e);
35308       };
35309       this.raw = function(s) {
35310         return rstr(s, utf8);
35311       };
35312       this.hex_hmac = function(k, d) {
35313         return rstr2hex(rstr_hmac(k, d));
35314       };
35315       this.b64_hmac = function(k, d) {
35316         return rstr2b64(rstr_hmac(k, d), b64pad);
35317       };
35318       this.any_hmac = function(k, d, e) {
35319         return rstr2any(rstr_hmac(k, d), e);
35320       };
35321       /**
35322        * Perform a simple self-test to see if the VM is working
35323        * @return {String} Hexadecimal hash sample
35324        * @public
35325        */
35326       this.vm_test = function() {
35327         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35328       };
35329       /**
35330        * @description Enable/disable uppercase hexadecimal returned string
35331        * @param {boolean}
35332        * @return {Object} this
35333        * @public
35334        */
35335       this.setUpperCase = function(a) {
35336         if (typeof a === 'boolean') {
35337           hexcase = a;
35338         }
35339         return this;
35340       };
35341       /**
35342        * @description Defines a base64 pad string
35343        * @param {string} Pad
35344        * @return {Object} this
35345        * @public
35346        */
35347       this.setPad = function(a) {
35348         b64pad = a || b64pad;
35349         return this;
35350       };
35351       /**
35352        * @description Defines a base64 pad string
35353        * @param {boolean}
35354        * @return {Object} this
35355        * @public
35356        */
35357       this.setUTF8 = function(a) {
35358         if (typeof a === 'boolean') {
35359           utf8 = a;
35360         }
35361         return this;
35362       };
35363
35364       /* private methods */
35365
35366       /**
35367        * Calculate the SHA-512 of a raw string
35368        */
35369
35370       function rstr(s) {
35371         s = (utf8) ? utf8Encode(s) : s;
35372         return binb2rstr(binb(rstr2binb(s), s.length * 8));
35373       }
35374       /*
35375        * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
35376        */
35377
35378       function rstr_hmac(key, data) {
35379         key = (utf8) ? utf8Encode(key) : key;
35380         data = (utf8) ? utf8Encode(data) : data;
35381
35382         var hash, i = 0,
35383           bkey = rstr2binb(key),
35384           ipad = Array(32),
35385           opad = Array(32);
35386
35387         if (bkey.length > 32) {
35388           bkey = binb(bkey, key.length * 8);
35389         }
35390
35391         for (; i < 32; i += 1) {
35392           ipad[i] = bkey[i] ^ 0x36363636;
35393           opad[i] = bkey[i] ^ 0x5C5C5C5C;
35394         }
35395
35396         hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
35397         return binb2rstr(binb(opad.concat(hash), 1024 + 512));
35398       }
35399
35400       /**
35401        * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
35402        */
35403
35404       function binb(x, len) {
35405         var j, i, l,
35406           W = new Array(80),
35407           hash = new Array(16),
35408           //Initial hash values
35409           H = [
35410             new int64(0x6a09e667, -205731576),
35411             new int64(-1150833019, -2067093701),
35412             new int64(0x3c6ef372, -23791573),
35413             new int64(-1521486534, 0x5f1d36f1),
35414             new int64(0x510e527f, -1377402159),
35415             new int64(-1694144372, 0x2b3e6c1f),
35416             new int64(0x1f83d9ab, -79577749),
35417             new int64(0x5be0cd19, 0x137e2179)
35418           ],
35419           T1 = new int64(0, 0),
35420           T2 = new int64(0, 0),
35421           a = new int64(0, 0),
35422           b = new int64(0, 0),
35423           c = new int64(0, 0),
35424           d = new int64(0, 0),
35425           e = new int64(0, 0),
35426           f = new int64(0, 0),
35427           g = new int64(0, 0),
35428           h = new int64(0, 0),
35429           //Temporary variables not specified by the document
35430           s0 = new int64(0, 0),
35431           s1 = new int64(0, 0),
35432           Ch = new int64(0, 0),
35433           Maj = new int64(0, 0),
35434           r1 = new int64(0, 0),
35435           r2 = new int64(0, 0),
35436           r3 = new int64(0, 0);
35437
35438         if (sha512_k === undefined) {
35439           //SHA512 constants
35440           sha512_k = [
35441             new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
35442             new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
35443             new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
35444             new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
35445             new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
35446             new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
35447             new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
35448             new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
35449             new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
35450             new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
35451             new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
35452             new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
35453             new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
35454             new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
35455             new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
35456             new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
35457             new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
35458             new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
35459             new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
35460             new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
35461             new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
35462             new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
35463             new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
35464             new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
35465             new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
35466             new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
35467             new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
35468             new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
35469             new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
35470             new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
35471             new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
35472             new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
35473             new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
35474             new int64(-354779690, -840897762), new int64(-176337025, -294727304),
35475             new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
35476             new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
35477             new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
35478             new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
35479             new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
35480             new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
35481           ];
35482         }
35483
35484         for (i = 0; i < 80; i += 1) {
35485           W[i] = new int64(0, 0);
35486         }
35487
35488         // append padding to the source string. The format is described in the FIPS.
35489         x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
35490         x[((len + 128 >> 10) << 5) + 31] = len;
35491         l = x.length;
35492         for (i = 0; i < l; i += 32) { //32 dwords is the block size
35493           int64copy(a, H[0]);
35494           int64copy(b, H[1]);
35495           int64copy(c, H[2]);
35496           int64copy(d, H[3]);
35497           int64copy(e, H[4]);
35498           int64copy(f, H[5]);
35499           int64copy(g, H[6]);
35500           int64copy(h, H[7]);
35501
35502           for (j = 0; j < 16; j += 1) {
35503             W[j].h = x[i + 2 * j];
35504             W[j].l = x[i + 2 * j + 1];
35505           }
35506
35507           for (j = 16; j < 80; j += 1) {
35508             //sigma1
35509             int64rrot(r1, W[j - 2], 19);
35510             int64revrrot(r2, W[j - 2], 29);
35511             int64shr(r3, W[j - 2], 6);
35512             s1.l = r1.l ^ r2.l ^ r3.l;
35513             s1.h = r1.h ^ r2.h ^ r3.h;
35514             //sigma0
35515             int64rrot(r1, W[j - 15], 1);
35516             int64rrot(r2, W[j - 15], 8);
35517             int64shr(r3, W[j - 15], 7);
35518             s0.l = r1.l ^ r2.l ^ r3.l;
35519             s0.h = r1.h ^ r2.h ^ r3.h;
35520
35521             int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
35522           }
35523
35524           for (j = 0; j < 80; j += 1) {
35525             //Ch
35526             Ch.l = (e.l & f.l) ^ (~e.l & g.l);
35527             Ch.h = (e.h & f.h) ^ (~e.h & g.h);
35528
35529             //Sigma1
35530             int64rrot(r1, e, 14);
35531             int64rrot(r2, e, 18);
35532             int64revrrot(r3, e, 9);
35533             s1.l = r1.l ^ r2.l ^ r3.l;
35534             s1.h = r1.h ^ r2.h ^ r3.h;
35535
35536             //Sigma0
35537             int64rrot(r1, a, 28);
35538             int64revrrot(r2, a, 2);
35539             int64revrrot(r3, a, 7);
35540             s0.l = r1.l ^ r2.l ^ r3.l;
35541             s0.h = r1.h ^ r2.h ^ r3.h;
35542
35543             //Maj
35544             Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
35545             Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
35546
35547             int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
35548             int64add(T2, s0, Maj);
35549
35550             int64copy(h, g);
35551             int64copy(g, f);
35552             int64copy(f, e);
35553             int64add(e, d, T1);
35554             int64copy(d, c);
35555             int64copy(c, b);
35556             int64copy(b, a);
35557             int64add(a, T1, T2);
35558           }
35559           int64add(H[0], H[0], a);
35560           int64add(H[1], H[1], b);
35561           int64add(H[2], H[2], c);
35562           int64add(H[3], H[3], d);
35563           int64add(H[4], H[4], e);
35564           int64add(H[5], H[5], f);
35565           int64add(H[6], H[6], g);
35566           int64add(H[7], H[7], h);
35567         }
35568
35569         //represent the hash as an array of 32-bit dwords
35570         for (i = 0; i < 8; i += 1) {
35571           hash[2 * i] = H[i].h;
35572           hash[2 * i + 1] = H[i].l;
35573         }
35574         return hash;
35575       }
35576
35577       //A constructor for 64-bit numbers
35578
35579       function int64(h, l) {
35580         this.h = h;
35581         this.l = l;
35582         //this.toString = int64toString;
35583       }
35584
35585       //Copies src into dst, assuming both are 64-bit numbers
35586
35587       function int64copy(dst, src) {
35588         dst.h = src.h;
35589         dst.l = src.l;
35590       }
35591
35592       //Right-rotates a 64-bit number by shift
35593       //Won't handle cases of shift>=32
35594       //The function revrrot() is for that
35595
35596       function int64rrot(dst, x, shift) {
35597         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
35598         dst.h = (x.h >>> shift) | (x.l << (32 - shift));
35599       }
35600
35601       //Reverses the dwords of the source and then rotates right by shift.
35602       //This is equivalent to rotation by 32+shift
35603
35604       function int64revrrot(dst, x, shift) {
35605         dst.l = (x.h >>> shift) | (x.l << (32 - shift));
35606         dst.h = (x.l >>> shift) | (x.h << (32 - shift));
35607       }
35608
35609       //Bitwise-shifts right a 64-bit number by shift
35610       //Won't handle shift>=32, but it's never needed in SHA512
35611
35612       function int64shr(dst, x, shift) {
35613         dst.l = (x.l >>> shift) | (x.h << (32 - shift));
35614         dst.h = (x.h >>> shift);
35615       }
35616
35617       //Adds two 64-bit numbers
35618       //Like the original implementation, does not rely on 32-bit operations
35619
35620       function int64add(dst, x, y) {
35621         var w0 = (x.l & 0xffff) + (y.l & 0xffff);
35622         var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
35623         var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
35624         var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
35625         dst.l = (w0 & 0xffff) | (w1 << 16);
35626         dst.h = (w2 & 0xffff) | (w3 << 16);
35627       }
35628
35629       //Same, except with 4 addends. Works faster than adding them one by one.
35630
35631       function int64add4(dst, a, b, c, d) {
35632         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
35633         var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
35634         var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
35635         var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
35636         dst.l = (w0 & 0xffff) | (w1 << 16);
35637         dst.h = (w2 & 0xffff) | (w3 << 16);
35638       }
35639
35640       //Same, except with 5 addends
35641
35642       function int64add5(dst, a, b, c, d, e) {
35643         var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
35644           w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
35645           w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
35646           w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
35647         dst.l = (w0 & 0xffff) | (w1 << 16);
35648         dst.h = (w2 & 0xffff) | (w3 << 16);
35649       }
35650     },
35651     /**
35652      * @class Hashes.RMD160
35653      * @constructor
35654      * @param {Object} [config]
35655      *
35656      * A JavaScript implementation of the RIPEMD-160 Algorithm
35657      * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
35658      * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
35659      * See http://pajhome.org.uk/crypt/md5 for details.
35660      * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
35661      */
35662     RMD160: function(options) {
35663       /**
35664        * Private properties configuration variables. You may need to tweak these to be compatible with
35665        * the server-side, but the defaults work in most cases.
35666        * @see this.setUpperCase() method
35667        * @see this.setPad() method
35668        */
35669       var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
35670         /* hexadecimal output case format. false - lowercase; true - uppercase  */
35671         b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
35672         /* base-64 pad character. Default '=' for strict RFC compliance   */
35673         utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
35674         /* enable/disable utf8 encoding */
35675         rmd160_r1 = [
35676           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
35677           7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
35678           3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
35679           1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
35680           4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
35681         ],
35682         rmd160_r2 = [
35683           5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
35684           6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
35685           15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
35686           8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
35687           12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
35688         ],
35689         rmd160_s1 = [
35690           11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
35691           7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
35692           11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
35693           11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
35694           9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
35695         ],
35696         rmd160_s2 = [
35697           8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
35698           9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
35699           9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
35700           15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
35701           8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
35702         ];
35703
35704       /* privileged (public) methods */
35705       this.hex = function(s) {
35706         return rstr2hex(rstr(s, utf8));
35707       };
35708       this.b64 = function(s) {
35709         return rstr2b64(rstr(s, utf8), b64pad);
35710       };
35711       this.any = function(s, e) {
35712         return rstr2any(rstr(s, utf8), e);
35713       };
35714       this.raw = function(s) {
35715         return rstr(s, utf8);
35716       };
35717       this.hex_hmac = function(k, d) {
35718         return rstr2hex(rstr_hmac(k, d));
35719       };
35720       this.b64_hmac = function(k, d) {
35721         return rstr2b64(rstr_hmac(k, d), b64pad);
35722       };
35723       this.any_hmac = function(k, d, e) {
35724         return rstr2any(rstr_hmac(k, d), e);
35725       };
35726       /**
35727        * Perform a simple self-test to see if the VM is working
35728        * @return {String} Hexadecimal hash sample
35729        * @public
35730        */
35731       this.vm_test = function() {
35732         return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
35733       };
35734       /**
35735        * @description Enable/disable uppercase hexadecimal returned string
35736        * @param {boolean}
35737        * @return {Object} this
35738        * @public
35739        */
35740       this.setUpperCase = function(a) {
35741         if (typeof a === 'boolean') {
35742           hexcase = a;
35743         }
35744         return this;
35745       };
35746       /**
35747        * @description Defines a base64 pad string
35748        * @param {string} Pad
35749        * @return {Object} this
35750        * @public
35751        */
35752       this.setPad = function(a) {
35753         if (typeof a !== 'undefined') {
35754           b64pad = a;
35755         }
35756         return this;
35757       };
35758       /**
35759        * @description Defines a base64 pad string
35760        * @param {boolean}
35761        * @return {Object} this
35762        * @public
35763        */
35764       this.setUTF8 = function(a) {
35765         if (typeof a === 'boolean') {
35766           utf8 = a;
35767         }
35768         return this;
35769       };
35770
35771       /* private methods */
35772
35773       /**
35774        * Calculate the rmd160 of a raw string
35775        */
35776
35777       function rstr(s) {
35778         s = (utf8) ? utf8Encode(s) : s;
35779         return binl2rstr(binl(rstr2binl(s), s.length * 8));
35780       }
35781
35782       /**
35783        * Calculate the HMAC-rmd160 of a key and some data (raw strings)
35784        */
35785
35786       function rstr_hmac(key, data) {
35787         key = (utf8) ? utf8Encode(key) : key;
35788         data = (utf8) ? utf8Encode(data) : data;
35789         var i, hash,
35790           bkey = rstr2binl(key),
35791           ipad = Array(16),
35792           opad = Array(16);
35793
35794         if (bkey.length > 16) {
35795           bkey = binl(bkey, key.length * 8);
35796         }
35797
35798         for (i = 0; i < 16; i += 1) {
35799           ipad[i] = bkey[i] ^ 0x36363636;
35800           opad[i] = bkey[i] ^ 0x5C5C5C5C;
35801         }
35802         hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
35803         return binl2rstr(binl(opad.concat(hash), 512 + 160));
35804       }
35805
35806       /**
35807        * Convert an array of little-endian words to a string
35808        */
35809
35810       function binl2rstr(input) {
35811         var i, output = '',
35812           l = input.length * 32;
35813         for (i = 0; i < l; i += 8) {
35814           output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
35815         }
35816         return output;
35817       }
35818
35819       /**
35820        * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
35821        */
35822
35823       function binl(x, len) {
35824         var T, j, i, l,
35825           h0 = 0x67452301,
35826           h1 = 0xefcdab89,
35827           h2 = 0x98badcfe,
35828           h3 = 0x10325476,
35829           h4 = 0xc3d2e1f0,
35830           A1, B1, C1, D1, E1,
35831           A2, B2, C2, D2, E2;
35832
35833         /* append padding */
35834         x[len >> 5] |= 0x80 << (len % 32);
35835         x[(((len + 64) >>> 9) << 4) + 14] = len;
35836         l = x.length;
35837
35838         for (i = 0; i < l; i += 16) {
35839           A1 = A2 = h0;
35840           B1 = B2 = h1;
35841           C1 = C2 = h2;
35842           D1 = D2 = h3;
35843           E1 = E2 = h4;
35844           for (j = 0; j <= 79; j += 1) {
35845             T = safe_add(A1, rmd160_f(j, B1, C1, D1));
35846             T = safe_add(T, x[i + rmd160_r1[j]]);
35847             T = safe_add(T, rmd160_K1(j));
35848             T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
35849             A1 = E1;
35850             E1 = D1;
35851             D1 = bit_rol(C1, 10);
35852             C1 = B1;
35853             B1 = T;
35854             T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
35855             T = safe_add(T, x[i + rmd160_r2[j]]);
35856             T = safe_add(T, rmd160_K2(j));
35857             T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
35858             A2 = E2;
35859             E2 = D2;
35860             D2 = bit_rol(C2, 10);
35861             C2 = B2;
35862             B2 = T;
35863           }
35864
35865           T = safe_add(h1, safe_add(C1, D2));
35866           h1 = safe_add(h2, safe_add(D1, E2));
35867           h2 = safe_add(h3, safe_add(E1, A2));
35868           h3 = safe_add(h4, safe_add(A1, B2));
35869           h4 = safe_add(h0, safe_add(B1, C2));
35870           h0 = T;
35871         }
35872         return [h0, h1, h2, h3, h4];
35873       }
35874
35875       // specific algorithm methods
35876
35877       function rmd160_f(j, x, y, z) {
35878         return (0 <= j && j <= 15) ? (x ^ y ^ z) :
35879           (16 <= j && j <= 31) ? (x & y) | (~x & z) :
35880           (32 <= j && j <= 47) ? (x | ~y) ^ z :
35881           (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
35882           (64 <= j && j <= 79) ? x ^ (y | ~z) :
35883           'rmd160_f: j out of range';
35884       }
35885
35886       function rmd160_K1(j) {
35887         return (0 <= j && j <= 15) ? 0x00000000 :
35888           (16 <= j && j <= 31) ? 0x5a827999 :
35889           (32 <= j && j <= 47) ? 0x6ed9eba1 :
35890           (48 <= j && j <= 63) ? 0x8f1bbcdc :
35891           (64 <= j && j <= 79) ? 0xa953fd4e :
35892           'rmd160_K1: j out of range';
35893       }
35894
35895       function rmd160_K2(j) {
35896         return (0 <= j && j <= 15) ? 0x50a28be6 :
35897           (16 <= j && j <= 31) ? 0x5c4dd124 :
35898           (32 <= j && j <= 47) ? 0x6d703ef3 :
35899           (48 <= j && j <= 63) ? 0x7a6d76e9 :
35900           (64 <= j && j <= 79) ? 0x00000000 :
35901           'rmd160_K2: j out of range';
35902       }
35903     }
35904   };
35905
35906   // exposes Hashes
35907   (function(window, undefined) {
35908     var freeExports = false;
35909     {
35910       freeExports = exports;
35911       if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
35912         window = commonjsGlobal;
35913       }
35914     }
35915
35916     if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
35917       // define as an anonymous module, so, through path mapping, it can be aliased
35918       undefined(function() {
35919         return Hashes;
35920       });
35921     } else if (freeExports) {
35922       // in Node.js or RingoJS v0.8.0+
35923       if ('object' === 'object' && module && module.exports === freeExports) {
35924         module.exports = Hashes;
35925       }
35926       // in Narwhal or RingoJS v0.7.0-
35927       else {
35928         freeExports.Hashes = Hashes;
35929       }
35930     } else {
35931       // in a browser or Rhino
35932       window.Hashes = Hashes;
35933     }
35934   }(this));
35935 }()); // IIFE
35936 });
35937
35938 var immutable = extend$2;
35939
35940 var hasOwnProperty$16 = Object.prototype.hasOwnProperty;
35941
35942 function extend$2() {
35943     var target = {};
35944
35945     for (var i = 0; i < arguments.length; i++) {
35946         var source = arguments[i];
35947
35948         for (var key in source) {
35949             if (hasOwnProperty$16.call(source, key)) {
35950                 target[key] = source[key];
35951             }
35952         }
35953     }
35954
35955     return target
35956 }
35957
35958 var sha1 = new hashes.SHA1();
35959
35960 var ohauth = {};
35961
35962 ohauth.qsString = function(obj) {
35963     return Object.keys(obj).sort().map(function(key) {
35964         return ohauth.percentEncode(key) + '=' +
35965             ohauth.percentEncode(obj[key]);
35966     }).join('&');
35967 };
35968
35969 ohauth.stringQs = function(str) {
35970     return str.split('&').filter(function (pair) {
35971         return pair !== '';
35972     }).reduce(function(obj, pair){
35973         var parts = pair.split('=');
35974         obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
35975             '' : decodeURIComponent(parts[1]);
35976         return obj;
35977     }, {});
35978 };
35979
35980 ohauth.rawxhr = function(method, url, data, headers, callback) {
35981     var xhr = new XMLHttpRequest(),
35982         twoHundred = /^20\d$/;
35983     xhr.onreadystatechange = function() {
35984         if (4 === xhr.readyState && 0 !== xhr.status) {
35985             if (twoHundred.test(xhr.status)) callback(null, xhr);
35986             else return callback(xhr, null);
35987         }
35988     };
35989     xhr.onerror = function(e) { return callback(e, null); };
35990     xhr.open(method, url, true);
35991     for (var h in headers) xhr.setRequestHeader(h, headers[h]);
35992     xhr.send(data);
35993     return xhr;
35994 };
35995
35996 ohauth.xhr = function(method, url, auth, data, options, callback) {
35997     var headers = (options && options.header) || {
35998         'Content-Type': 'application/x-www-form-urlencoded'
35999     };
36000     headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
36001     return ohauth.rawxhr(method, url, data, headers, callback);
36002 };
36003
36004 ohauth.nonce = function() {
36005     for (var o = ''; o.length < 6;) {
36006         o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
36007     }
36008     return o;
36009 };
36010
36011 ohauth.authHeader = function(obj) {
36012     return Object.keys(obj).sort().map(function(key) {
36013         return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
36014     }).join(', ');
36015 };
36016
36017 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
36018
36019 ohauth.percentEncode = function(s) {
36020     return encodeURIComponent(s)
36021         .replace(/\!/g, '%21').replace(/\'/g, '%27')
36022         .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
36023 };
36024
36025 ohauth.baseString = function(method, url, params) {
36026     if (params.oauth_signature) delete params.oauth_signature;
36027     return [
36028         method,
36029         ohauth.percentEncode(url),
36030         ohauth.percentEncode(ohauth.qsString(params))].join('&');
36031 };
36032
36033 ohauth.signature = function(oauth_secret, token_secret, baseString) {
36034     return sha1.b64_hmac(
36035         ohauth.percentEncode(oauth_secret) + '&' +
36036         ohauth.percentEncode(token_secret),
36037         baseString);
36038 };
36039
36040 /**
36041  * Takes an options object for configuration (consumer_key,
36042  * consumer_secret, version, signature_method, token, token_secret)
36043  * and returns a function that generates the Authorization header
36044  * for given data.
36045  *
36046  * The returned function takes these parameters:
36047  * - method: GET/POST/...
36048  * - uri: full URI with protocol, port, path and query string
36049  * - extra_params: any extra parameters (that are passed in the POST data),
36050  *   can be an object or a from-urlencoded string.
36051  *
36052  * Returned function returns full OAuth header with "OAuth" string in it.
36053  */
36054
36055 ohauth.headerGenerator = function(options) {
36056     options = options || {};
36057     var consumer_key = options.consumer_key || '',
36058         consumer_secret = options.consumer_secret || '',
36059         signature_method = options.signature_method || 'HMAC-SHA1',
36060         version = options.version || '1.0',
36061         token = options.token || '',
36062         token_secret = options.token_secret || '';
36063
36064     return function(method, uri, extra_params) {
36065         method = method.toUpperCase();
36066         if (typeof extra_params === 'string' && extra_params.length > 0) {
36067             extra_params = ohauth.stringQs(extra_params);
36068         }
36069
36070         var uri_parts = uri.split('?', 2),
36071         base_uri = uri_parts[0];
36072
36073         var query_params = uri_parts.length === 2 ?
36074             ohauth.stringQs(uri_parts[1]) : {};
36075
36076         var oauth_params = {
36077             oauth_consumer_key: consumer_key,
36078             oauth_signature_method: signature_method,
36079             oauth_version: version,
36080             oauth_timestamp: ohauth.timestamp(),
36081             oauth_nonce: ohauth.nonce()
36082         };
36083
36084         if (token) oauth_params.oauth_token = token;
36085
36086         var all_params = immutable({}, oauth_params, query_params, extra_params),
36087             base_str = ohauth.baseString(method, base_uri, all_params);
36088
36089         oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
36090
36091         return 'OAuth ' + ohauth.authHeader(oauth_params);
36092     };
36093 };
36094
36095 var ohauth_1 = ohauth;
36096
36097 var resolveUrl = createCommonjsModule(function (module, exports) {
36098 // Copyright 2014 Simon Lydell
36099 // X11 (“MIT”) Licensed. (See LICENSE.)
36100
36101 void (function(root, factory) {
36102   if (typeof undefined === "function" && undefined.amd) {
36103     undefined(factory);
36104   } else {
36105     module.exports = factory();
36106   }
36107 }(commonjsGlobal, function() {
36108
36109   function resolveUrl(/* ...urls */) {
36110     var numUrls = arguments.length;
36111
36112     if (numUrls === 0) {
36113       throw new Error("resolveUrl requires at least one argument; got none.")
36114     }
36115
36116     var base = document.createElement("base");
36117     base.href = arguments[0];
36118
36119     if (numUrls === 1) {
36120       return base.href
36121     }
36122
36123     var head = document.getElementsByTagName("head")[0];
36124     head.insertBefore(base, head.firstChild);
36125
36126     var a = document.createElement("a");
36127     var resolved;
36128
36129     for (var index = 1; index < numUrls; index++) {
36130       a.href = arguments[index];
36131       resolved = a.href;
36132       base.href = resolved;
36133     }
36134
36135     head.removeChild(base);
36136
36137     return resolved
36138   }
36139
36140   return resolveUrl
36141
36142 }));
36143 });
36144
36145 var assign$1 = make_assign();
36146 var create$2 = make_create();
36147 var trim = make_trim();
36148 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
36149
36150 var util = {
36151         assign: assign$1,
36152         create: create$2,
36153         trim: trim,
36154         bind: bind$1,
36155         slice: slice$8,
36156         each: each$1,
36157         map: map$5,
36158         pluck: pluck$1,
36159         isList: isList$1,
36160         isFunction: isFunction$2,
36161         isObject: isObject$3,
36162         Global: Global
36163 };
36164
36165 function make_assign() {
36166         if (Object.assign) {
36167                 return Object.assign
36168         } else {
36169                 return function shimAssign(obj, props1, props2, etc) {
36170                         for (var i = 1; i < arguments.length; i++) {
36171                                 each$1(Object(arguments[i]), function(val, key) {
36172                                         obj[key] = val;
36173                                 });
36174                         }                       
36175                         return obj
36176                 }
36177         }
36178 }
36179
36180 function make_create() {
36181         if (Object.create) {
36182                 return function create(obj, assignProps1, assignProps2, etc) {
36183                         var assignArgsList = slice$8(arguments, 1);
36184                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
36185                 }
36186         } else {
36187                 function F() {} // eslint-disable-line no-inner-declarations
36188                 return function create(obj, assignProps1, assignProps2, etc) {
36189                         var assignArgsList = slice$8(arguments, 1);
36190                         F.prototype = obj;
36191                         return assign$1.apply(this, [new F()].concat(assignArgsList))
36192                 }
36193         }
36194 }
36195
36196 function make_trim() {
36197         if (String.prototype.trim) {
36198                 return function trim(str) {
36199                         return String.prototype.trim.call(str)
36200                 }
36201         } else {
36202                 return function trim(str) {
36203                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
36204                 }
36205         }
36206 }
36207
36208 function bind$1(obj, fn) {
36209         return function() {
36210                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
36211         }
36212 }
36213
36214 function slice$8(arr, index) {
36215         return Array.prototype.slice.call(arr, index || 0)
36216 }
36217
36218 function each$1(obj, fn) {
36219         pluck$1(obj, function(val, key) {
36220                 fn(val, key);
36221                 return false
36222         });
36223 }
36224
36225 function map$5(obj, fn) {
36226         var res = (isList$1(obj) ? [] : {});
36227         pluck$1(obj, function(v, k) {
36228                 res[k] = fn(v, k);
36229                 return false
36230         });
36231         return res
36232 }
36233
36234 function pluck$1(obj, fn) {
36235         if (isList$1(obj)) {
36236                 for (var i=0; i<obj.length; i++) {
36237                         if (fn(obj[i], i)) {
36238                                 return obj[i]
36239                         }
36240                 }
36241         } else {
36242                 for (var key in obj) {
36243                         if (obj.hasOwnProperty(key)) {
36244                                 if (fn(obj[key], key)) {
36245                                         return obj[key]
36246                                 }
36247                         }
36248                 }
36249         }
36250 }
36251
36252 function isList$1(val) {
36253         return (val != null && typeof val != 'function' && typeof val.length == 'number')
36254 }
36255
36256 function isFunction$2(val) {
36257         return val && {}.toString.call(val) === '[object Function]'
36258 }
36259
36260 function isObject$3(val) {
36261         return val && {}.toString.call(val) === '[object Object]'
36262 }
36263
36264 var slice$7 = util.slice;
36265 var pluck = util.pluck;
36266 var each = util.each;
36267 var bind = util.bind;
36268 var create$1 = util.create;
36269 var isList = util.isList;
36270 var isFunction$1 = util.isFunction;
36271 var isObject$2 = util.isObject;
36272
36273 var storeEngine = {
36274         createStore: createStore
36275 };
36276
36277 var storeAPI = {
36278         version: '2.0.12',
36279         enabled: false,
36280         
36281         // get returns the value of the given key. If that value
36282         // is undefined, it returns optionalDefaultValue instead.
36283         get: function(key, optionalDefaultValue) {
36284                 var data = this.storage.read(this._namespacePrefix + key);
36285                 return this._deserialize(data, optionalDefaultValue)
36286         },
36287
36288         // set will store the given value at key and returns value.
36289         // Calling set with value === undefined is equivalent to calling remove.
36290         set: function(key, value) {
36291                 if (value === undefined) {
36292                         return this.remove(key)
36293                 }
36294                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
36295                 return value
36296         },
36297
36298         // remove deletes the key and value stored at the given key.
36299         remove: function(key) {
36300                 this.storage.remove(this._namespacePrefix + key);
36301         },
36302
36303         // each will call the given callback once for each key-value pair
36304         // in this store.
36305         each: function(callback) {
36306                 var self = this;
36307                 this.storage.each(function(val, namespacedKey) {
36308                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
36309                 });
36310         },
36311
36312         // clearAll will remove all the stored key-value pairs in this store.
36313         clearAll: function() {
36314                 this.storage.clearAll();
36315         },
36316
36317         // additional functionality that can't live in plugins
36318         // ---------------------------------------------------
36319
36320         // hasNamespace returns true if this store instance has the given namespace.
36321         hasNamespace: function(namespace) {
36322                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
36323         },
36324
36325         // createStore creates a store.js instance with the first
36326         // functioning storage in the list of storage candidates,
36327         // and applies the the given mixins to the instance.
36328         createStore: function() {
36329                 return createStore.apply(this, arguments)
36330         },
36331         
36332         addPlugin: function(plugin) {
36333                 this._addPlugin(plugin);
36334         },
36335         
36336         namespace: function(namespace) {
36337                 return createStore(this.storage, this.plugins, namespace)
36338         }
36339 };
36340
36341 function _warn() {
36342         var _console = (typeof console == 'undefined' ? null : console);
36343         if (!_console) { return }
36344         var fn = (_console.warn ? _console.warn : _console.log);
36345         fn.apply(_console, arguments);
36346 }
36347
36348 function createStore(storages, plugins, namespace) {
36349         if (!namespace) {
36350                 namespace = '';
36351         }
36352         if (storages && !isList(storages)) {
36353                 storages = [storages];
36354         }
36355         if (plugins && !isList(plugins)) {
36356                 plugins = [plugins];
36357         }
36358
36359         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
36360         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
36361         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
36362         if (!legalNamespaces.test(namespace)) {
36363                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
36364         }
36365         
36366         var _privateStoreProps = {
36367                 _namespacePrefix: namespacePrefix,
36368                 _namespaceRegexp: namespaceRegexp,
36369
36370                 _testStorage: function(storage) {
36371                         try {
36372                                 var testStr = '__storejs__test__';
36373                                 storage.write(testStr, testStr);
36374                                 var ok = (storage.read(testStr) === testStr);
36375                                 storage.remove(testStr);
36376                                 return ok
36377                         } catch(e) {
36378                                 return false
36379                         }
36380                 },
36381
36382                 _assignPluginFnProp: function(pluginFnProp, propName) {
36383                         var oldFn = this[propName];
36384                         this[propName] = function pluginFn() {
36385                                 var args = slice$7(arguments, 0);
36386                                 var self = this;
36387
36388                                 // super_fn calls the old function which was overwritten by
36389                                 // this mixin.
36390                                 function super_fn() {
36391                                         if (!oldFn) { return }
36392                                         each(arguments, function(arg, i) {
36393                                                 args[i] = arg;
36394                                         });
36395                                         return oldFn.apply(self, args)
36396                                 }
36397
36398                                 // Give mixing function access to super_fn by prefixing all mixin function
36399                                 // arguments with super_fn.
36400                                 var newFnArgs = [super_fn].concat(args);
36401
36402                                 return pluginFnProp.apply(self, newFnArgs)
36403                         };
36404                 },
36405
36406                 _serialize: function(obj) {
36407                         return JSON.stringify(obj)
36408                 },
36409
36410                 _deserialize: function(strVal, defaultVal) {
36411                         if (!strVal) { return defaultVal }
36412                         // It is possible that a raw string value has been previously stored
36413                         // in a storage without using store.js, meaning it will be a raw
36414                         // string value instead of a JSON serialized string. By defaulting
36415                         // to the raw string value in case of a JSON parse error, we allow
36416                         // for past stored values to be forwards-compatible with store.js
36417                         var val = '';
36418                         try { val = JSON.parse(strVal); }
36419                         catch(e) { val = strVal; }
36420
36421                         return (val !== undefined ? val : defaultVal)
36422                 },
36423                 
36424                 _addStorage: function(storage) {
36425                         if (this.enabled) { return }
36426                         if (this._testStorage(storage)) {
36427                                 this.storage = storage;
36428                                 this.enabled = true;
36429                         }
36430                 },
36431
36432                 _addPlugin: function(plugin) {
36433                         var self = this;
36434
36435                         // If the plugin is an array, then add all plugins in the array.
36436                         // This allows for a plugin to depend on other plugins.
36437                         if (isList(plugin)) {
36438                                 each(plugin, function(plugin) {
36439                                         self._addPlugin(plugin);
36440                                 });
36441                                 return
36442                         }
36443
36444                         // Keep track of all plugins we've seen so far, so that we
36445                         // don't add any of them twice.
36446                         var seenPlugin = pluck(this.plugins, function(seenPlugin) {
36447                                 return (plugin === seenPlugin)
36448                         });
36449                         if (seenPlugin) {
36450                                 return
36451                         }
36452                         this.plugins.push(plugin);
36453
36454                         // Check that the plugin is properly formed
36455                         if (!isFunction$1(plugin)) {
36456                                 throw new Error('Plugins must be function values that return objects')
36457                         }
36458
36459                         var pluginProperties = plugin.call(this);
36460                         if (!isObject$2(pluginProperties)) {
36461                                 throw new Error('Plugins must return an object of function properties')
36462                         }
36463
36464                         // Add the plugin function properties to this store instance.
36465                         each(pluginProperties, function(pluginFnProp, propName) {
36466                                 if (!isFunction$1(pluginFnProp)) {
36467                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
36468                                 }
36469                                 self._assignPluginFnProp(pluginFnProp, propName);
36470                         });
36471                 },
36472                 
36473                 // Put deprecated properties in the private API, so as to not expose it to accidential
36474                 // discovery through inspection of the store object.
36475                 
36476                 // Deprecated: addStorage
36477                 addStorage: function(storage) {
36478                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
36479                         this._addStorage(storage);
36480                 }
36481         };
36482
36483         var store = create$1(_privateStoreProps, storeAPI, {
36484                 plugins: []
36485         });
36486         store.raw = {};
36487         each(store, function(prop, propName) {
36488                 if (isFunction$1(prop)) {
36489                         store.raw[propName] = bind(store, prop);                        
36490                 }
36491         });
36492         each(storages, function(storage) {
36493                 store._addStorage(storage);
36494         });
36495         each(plugins, function(plugin) {
36496                 store._addPlugin(plugin);
36497         });
36498         return store
36499 }
36500
36501 var Global$1 = util.Global;
36502
36503 var localStorage_1 = {
36504         name: 'localStorage',
36505         read: read,
36506         write: write,
36507         each: each$2,
36508         remove: remove$2,
36509         clearAll: clearAll,
36510 };
36511
36512 function localStorage$1() {
36513         return Global$1.localStorage
36514 }
36515
36516 function read(key) {
36517         return localStorage$1().getItem(key)
36518 }
36519
36520 function write(key, data) {
36521         return localStorage$1().setItem(key, data)
36522 }
36523
36524 function each$2(fn) {
36525         for (var i = localStorage$1().length - 1; i >= 0; i--) {
36526                 var key = localStorage$1().key(i);
36527                 fn(read(key), key);
36528         }
36529 }
36530
36531 function remove$2(key) {
36532         return localStorage$1().removeItem(key)
36533 }
36534
36535 function clearAll() {
36536         return localStorage$1().clear()
36537 }
36538
36539 // oldFF-globalStorage provides storage for Firefox
36540 // versions 6 and 7, where no localStorage, etc
36541 // is available.
36542
36543
36544 var Global$2 = util.Global;
36545
36546 var oldFFGlobalStorage = {
36547         name: 'oldFF-globalStorage',
36548         read: read$1,
36549         write: write$1,
36550         each: each$3,
36551         remove: remove$3,
36552         clearAll: clearAll$1,
36553 };
36554
36555 var globalStorage = Global$2.globalStorage;
36556
36557 function read$1(key) {
36558         return globalStorage[key]
36559 }
36560
36561 function write$1(key, data) {
36562         globalStorage[key] = data;
36563 }
36564
36565 function each$3(fn) {
36566         for (var i = globalStorage.length - 1; i >= 0; i--) {
36567                 var key = globalStorage.key(i);
36568                 fn(globalStorage[key], key);
36569         }
36570 }
36571
36572 function remove$3(key) {
36573         return globalStorage.removeItem(key)
36574 }
36575
36576 function clearAll$1() {
36577         each$3(function(key, _) {
36578                 delete globalStorage[key];
36579         });
36580 }
36581
36582 // oldIE-userDataStorage provides storage for Internet Explorer
36583 // versions 6 and 7, where no localStorage, sessionStorage, etc
36584 // is available.
36585
36586
36587 var Global$3 = util.Global;
36588
36589 var oldIEUserDataStorage = {
36590         name: 'oldIE-userDataStorage',
36591         write: write$2,
36592         read: read$2,
36593         each: each$4,
36594         remove: remove$4,
36595         clearAll: clearAll$2,
36596 };
36597
36598 var storageName = 'storejs';
36599 var doc = Global$3.document;
36600 var _withStorageEl = _makeIEStorageElFunction();
36601 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
36602
36603 function write$2(unfixedKey, data) {
36604         if (disable) { return }
36605         var fixedKey = fixKey(unfixedKey);
36606         _withStorageEl(function(storageEl) {
36607                 storageEl.setAttribute(fixedKey, data);
36608                 storageEl.save(storageName);
36609         });
36610 }
36611
36612 function read$2(unfixedKey) {
36613         if (disable) { return }
36614         var fixedKey = fixKey(unfixedKey);
36615         var res = null;
36616         _withStorageEl(function(storageEl) {
36617                 res = storageEl.getAttribute(fixedKey);
36618         });
36619         return res
36620 }
36621
36622 function each$4(callback) {
36623         _withStorageEl(function(storageEl) {
36624                 var attributes = storageEl.XMLDocument.documentElement.attributes;
36625                 for (var i=attributes.length-1; i>=0; i--) {
36626                         var attr = attributes[i];
36627                         callback(storageEl.getAttribute(attr.name), attr.name);
36628                 }
36629         });
36630 }
36631
36632 function remove$4(unfixedKey) {
36633         var fixedKey = fixKey(unfixedKey);
36634         _withStorageEl(function(storageEl) {
36635                 storageEl.removeAttribute(fixedKey);
36636                 storageEl.save(storageName);
36637         });
36638 }
36639
36640 function clearAll$2() {
36641         _withStorageEl(function(storageEl) {
36642                 var attributes = storageEl.XMLDocument.documentElement.attributes;
36643                 storageEl.load(storageName);
36644                 for (var i=attributes.length-1; i>=0; i--) {
36645                         storageEl.removeAttribute(attributes[i].name);
36646                 }
36647                 storageEl.save(storageName);
36648         });
36649 }
36650
36651 // Helpers
36652 //////////
36653
36654 // In IE7, keys cannot start with a digit or contain certain chars.
36655 // See https://github.com/marcuswestin/store.js/issues/40
36656 // See https://github.com/marcuswestin/store.js/issues/83
36657 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
36658 function fixKey(key) {
36659         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
36660 }
36661
36662 function _makeIEStorageElFunction() {
36663         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
36664                 return null
36665         }
36666         var scriptTag = 'script',
36667                 storageOwner,
36668                 storageContainer,
36669                 storageEl;
36670
36671         // Since #userData storage applies only to specific paths, we need to
36672         // somehow link our data to a specific path.  We choose /favicon.ico
36673         // as a pretty safe option, since all browsers already make a request to
36674         // this URL anyway and being a 404 will not hurt us here.  We wrap an
36675         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
36676         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
36677         // since the iframe access rules appear to allow direct access and
36678         // manipulation of the document element, even for a 404 page.  This
36679         // document can be used instead of the current document (which would
36680         // have been limited to the current path) to perform #userData storage.
36681         try {
36682                 /* global ActiveXObject */
36683                 storageContainer = new ActiveXObject('htmlfile');
36684                 storageContainer.open();
36685                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
36686                 storageContainer.close();
36687                 storageOwner = storageContainer.w.frames[0].document;
36688                 storageEl = storageOwner.createElement('div');
36689         } catch(e) {
36690                 // somehow ActiveXObject instantiation failed (perhaps some special
36691                 // security settings or otherwse), fall back to per-path storage
36692                 storageEl = doc.createElement('div');
36693                 storageOwner = doc.body;
36694         }
36695
36696         return function(storeFunction) {
36697                 var args = [].slice.call(arguments, 0);
36698                 args.unshift(storageEl);
36699                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
36700                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
36701                 storageOwner.appendChild(storageEl);
36702                 storageEl.addBehavior('#default#userData');
36703                 storageEl.load(storageName);
36704                 storeFunction.apply(this, args);
36705                 storageOwner.removeChild(storageEl);
36706                 return
36707         }
36708 }
36709
36710 // cookieStorage is useful Safari private browser mode, where localStorage
36711 // doesn't work but cookies do. This implementation is adopted from
36712 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
36713
36714
36715 var Global$4 = util.Global;
36716 var trim$1 = util.trim;
36717
36718 var cookieStorage = {
36719         name: 'cookieStorage',
36720         read: read$3,
36721         write: write$3,
36722         each: each$5,
36723         remove: remove$5,
36724         clearAll: clearAll$3,
36725 };
36726
36727 var doc$1 = Global$4.document;
36728
36729 function read$3(key) {
36730         if (!key || !_has(key)) { return null }
36731         var regexpStr = "(?:^|.*;\\s*)" +
36732                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
36733                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
36734         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
36735 }
36736
36737 function each$5(callback) {
36738         var cookies = doc$1.cookie.split(/; ?/g);
36739         for (var i = cookies.length - 1; i >= 0; i--) {
36740                 if (!trim$1(cookies[i])) {
36741                         continue
36742                 }
36743                 var kvp = cookies[i].split('=');
36744                 var key = unescape(kvp[0]);
36745                 var val = unescape(kvp[1]);
36746                 callback(val, key);
36747         }
36748 }
36749
36750 function write$3(key, data) {
36751         if(!key) { return }
36752         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
36753 }
36754
36755 function remove$5(key) {
36756         if (!key || !_has(key)) {
36757                 return
36758         }
36759         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
36760 }
36761
36762 function clearAll$3() {
36763         each$5(function(_, key) {
36764                 remove$5(key);
36765         });
36766 }
36767
36768 function _has(key) {
36769         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
36770 }
36771
36772 var Global$5 = util.Global;
36773
36774 var sessionStorage_1 = {
36775         name: 'sessionStorage',
36776         read: read$4,
36777         write: write$4,
36778         each: each$6,
36779         remove: remove$6,
36780         clearAll: clearAll$4
36781 };
36782
36783 function sessionStorage() {
36784         return Global$5.sessionStorage
36785 }
36786
36787 function read$4(key) {
36788         return sessionStorage().getItem(key)
36789 }
36790
36791 function write$4(key, data) {
36792         return sessionStorage().setItem(key, data)
36793 }
36794
36795 function each$6(fn) {
36796         for (var i = sessionStorage().length - 1; i >= 0; i--) {
36797                 var key = sessionStorage().key(i);
36798                 fn(read$4(key), key);
36799         }
36800 }
36801
36802 function remove$6(key) {
36803         return sessionStorage().removeItem(key)
36804 }
36805
36806 function clearAll$4() {
36807         return sessionStorage().clear()
36808 }
36809
36810 // memoryStorage is a useful last fallback to ensure that the store
36811 // is functions (meaning store.get(), store.set(), etc will all function).
36812 // However, stored values will not persist when the browser navigates to
36813 // a new page or reloads the current page.
36814
36815 var memoryStorage_1 = {
36816         name: 'memoryStorage',
36817         read: read$5,
36818         write: write$5,
36819         each: each$7,
36820         remove: remove$7,
36821         clearAll: clearAll$5,
36822 };
36823
36824 var memoryStorage = {};
36825
36826 function read$5(key) {
36827         return memoryStorage[key]
36828 }
36829
36830 function write$5(key, data) {
36831         memoryStorage[key] = data;
36832 }
36833
36834 function each$7(callback) {
36835         for (var key in memoryStorage) {
36836                 if (memoryStorage.hasOwnProperty(key)) {
36837                         callback(memoryStorage[key], key);
36838                 }
36839         }
36840 }
36841
36842 function remove$7(key) {
36843         delete memoryStorage[key];
36844 }
36845
36846 function clearAll$5(key) {
36847         memoryStorage = {};
36848 }
36849
36850 var all$3 = [
36851         // Listed in order of usage preference
36852         localStorage_1,
36853         oldFFGlobalStorage,
36854         oldIEUserDataStorage,
36855         cookieStorage,
36856         sessionStorage_1,
36857         memoryStorage_1
36858 ];
36859
36860 /* eslint-disable */
36861
36862 //  json2.js
36863 //  2016-10-28
36864 //  Public Domain.
36865 //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
36866 //  See http://www.JSON.org/js.html
36867 //  This code should be minified before deployment.
36868 //  See http://javascript.crockford.com/jsmin.html
36869
36870 //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
36871 //  NOT CONTROL.
36872
36873 //  This file creates a global JSON object containing two methods: stringify
36874 //  and parse. This file provides the ES5 JSON capability to ES3 systems.
36875 //  If a project might run on IE8 or earlier, then this file should be included.
36876 //  This file does nothing on ES5 systems.
36877
36878 //      JSON.stringify(value, replacer, space)
36879 //          value       any JavaScript value, usually an object or array.
36880 //          replacer    an optional parameter that determines how object
36881 //                      values are stringified for objects. It can be a
36882 //                      function or an array of strings.
36883 //          space       an optional parameter that specifies the indentation
36884 //                      of nested structures. If it is omitted, the text will
36885 //                      be packed without extra whitespace. If it is a number,
36886 //                      it will specify the number of spaces to indent at each
36887 //                      level. If it is a string (such as "\t" or "&nbsp;"),
36888 //                      it contains the characters used to indent at each level.
36889 //          This method produces a JSON text from a JavaScript value.
36890 //          When an object value is found, if the object contains a toJSON
36891 //          method, its toJSON method will be called and the result will be
36892 //          stringified. A toJSON method does not serialize: it returns the
36893 //          value represented by the name/value pair that should be serialized,
36894 //          or undefined if nothing should be serialized. The toJSON method
36895 //          will be passed the key associated with the value, and this will be
36896 //          bound to the value.
36897
36898 //          For example, this would serialize Dates as ISO strings.
36899
36900 //              Date.prototype.toJSON = function (key) {
36901 //                  function f(n) {
36902 //                      // Format integers to have at least two digits.
36903 //                      return (n < 10)
36904 //                          ? "0" + n
36905 //                          : n;
36906 //                  }
36907 //                  return this.getUTCFullYear()   + "-" +
36908 //                       f(this.getUTCMonth() + 1) + "-" +
36909 //                       f(this.getUTCDate())      + "T" +
36910 //                       f(this.getUTCHours())     + ":" +
36911 //                       f(this.getUTCMinutes())   + ":" +
36912 //                       f(this.getUTCSeconds())   + "Z";
36913 //              };
36914
36915 //          You can provide an optional replacer method. It will be passed the
36916 //          key and value of each member, with this bound to the containing
36917 //          object. The value that is returned from your method will be
36918 //          serialized. If your method returns undefined, then the member will
36919 //          be excluded from the serialization.
36920
36921 //          If the replacer parameter is an array of strings, then it will be
36922 //          used to select the members to be serialized. It filters the results
36923 //          such that only members with keys listed in the replacer array are
36924 //          stringified.
36925
36926 //          Values that do not have JSON representations, such as undefined or
36927 //          functions, will not be serialized. Such values in objects will be
36928 //          dropped; in arrays they will be replaced with null. You can use
36929 //          a replacer function to replace those with JSON values.
36930
36931 //          JSON.stringify(undefined) returns undefined.
36932
36933 //          The optional space parameter produces a stringification of the
36934 //          value that is filled with line breaks and indentation to make it
36935 //          easier to read.
36936
36937 //          If the space parameter is a non-empty string, then that string will
36938 //          be used for indentation. If the space parameter is a number, then
36939 //          the indentation will be that many spaces.
36940
36941 //          Example:
36942
36943 //          text = JSON.stringify(["e", {pluribus: "unum"}]);
36944 //          // text is '["e",{"pluribus":"unum"}]'
36945
36946 //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
36947 //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
36948
36949 //          text = JSON.stringify([new Date()], function (key, value) {
36950 //              return this[key] instanceof Date
36951 //                  ? "Date(" + this[key] + ")"
36952 //                  : value;
36953 //          });
36954 //          // text is '["Date(---current time---)"]'
36955
36956 //      JSON.parse(text, reviver)
36957 //          This method parses a JSON text to produce an object or array.
36958 //          It can throw a SyntaxError exception.
36959
36960 //          The optional reviver parameter is a function that can filter and
36961 //          transform the results. It receives each of the keys and values,
36962 //          and its return value is used instead of the original value.
36963 //          If it returns what it received, then the structure is not modified.
36964 //          If it returns undefined then the member is deleted.
36965
36966 //          Example:
36967
36968 //          // Parse the text. Values that look like ISO date strings will
36969 //          // be converted to Date objects.
36970
36971 //          myData = JSON.parse(text, function (key, value) {
36972 //              var a;
36973 //              if (typeof value === "string") {
36974 //                  a =
36975 //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
36976 //                  if (a) {
36977 //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
36978 //                          +a[5], +a[6]));
36979 //                  }
36980 //              }
36981 //              return value;
36982 //          });
36983
36984 //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
36985 //              var d;
36986 //              if (typeof value === "string" &&
36987 //                      value.slice(0, 5) === "Date(" &&
36988 //                      value.slice(-1) === ")") {
36989 //                  d = new Date(value.slice(5, -1));
36990 //                  if (d) {
36991 //                      return d;
36992 //                  }
36993 //              }
36994 //              return value;
36995 //          });
36996
36997 //  This is a reference implementation. You are free to copy, modify, or
36998 //  redistribute.
36999
37000 /*jslint
37001     eval, for, this
37002 */
37003
37004 /*property
37005     JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
37006     getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
37007     lastIndex, length, parse, prototype, push, replace, slice, stringify,
37008     test, toJSON, toString, valueOf
37009 */
37010
37011
37012 // Create a JSON object only if one does not already exist. We create the
37013 // methods in a closure to avoid creating global variables.
37014
37015 if (typeof JSON !== "object") {
37016     JSON = {};
37017 }
37018
37019 (function () {
37020     "use strict";
37021
37022     var rx_one = /^[\],:{}\s]*$/;
37023     var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
37024     var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
37025     var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
37026     var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
37027     var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
37028
37029     function f(n) {
37030         // Format integers to have at least two digits.
37031         return n < 10
37032             ? "0" + n
37033             : n;
37034     }
37035
37036     function this_value() {
37037         return this.valueOf();
37038     }
37039
37040     if (typeof Date.prototype.toJSON !== "function") {
37041
37042         Date.prototype.toJSON = function () {
37043
37044             return isFinite(this.valueOf())
37045                 ? this.getUTCFullYear() + "-" +
37046                         f(this.getUTCMonth() + 1) + "-" +
37047                         f(this.getUTCDate()) + "T" +
37048                         f(this.getUTCHours()) + ":" +
37049                         f(this.getUTCMinutes()) + ":" +
37050                         f(this.getUTCSeconds()) + "Z"
37051                 : null;
37052         };
37053
37054         Boolean.prototype.toJSON = this_value;
37055         Number.prototype.toJSON = this_value;
37056         String.prototype.toJSON = this_value;
37057     }
37058
37059     var gap;
37060     var indent;
37061     var meta;
37062     var rep;
37063
37064
37065     function quote(string) {
37066
37067 // If the string contains no control characters, no quote characters, and no
37068 // backslash characters, then we can safely slap some quotes around it.
37069 // Otherwise we must also replace the offending characters with safe escape
37070 // sequences.
37071
37072         rx_escapable.lastIndex = 0;
37073         return rx_escapable.test(string)
37074             ? "\"" + string.replace(rx_escapable, function (a) {
37075                 var c = meta[a];
37076                 return typeof c === "string"
37077                     ? c
37078                     : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
37079             }) + "\""
37080             : "\"" + string + "\"";
37081     }
37082
37083
37084     function str(key, holder) {
37085
37086 // Produce a string from holder[key].
37087
37088         var i;          // The loop counter.
37089         var k;          // The member key.
37090         var v;          // The member value.
37091         var length;
37092         var mind = gap;
37093         var partial;
37094         var value = holder[key];
37095
37096 // If the value has a toJSON method, call it to obtain a replacement value.
37097
37098         if (value && typeof value === "object" &&
37099                 typeof value.toJSON === "function") {
37100             value = value.toJSON(key);
37101         }
37102
37103 // If we were called with a replacer function, then call the replacer to
37104 // obtain a replacement value.
37105
37106         if (typeof rep === "function") {
37107             value = rep.call(holder, key, value);
37108         }
37109
37110 // What happens next depends on the value's type.
37111
37112         switch (typeof value) {
37113         case "string":
37114             return quote(value);
37115
37116         case "number":
37117
37118 // JSON numbers must be finite. Encode non-finite numbers as null.
37119
37120             return isFinite(value)
37121                 ? String(value)
37122                 : "null";
37123
37124         case "boolean":
37125         case "null":
37126
37127 // If the value is a boolean or null, convert it to a string. Note:
37128 // typeof null does not produce "null". The case is included here in
37129 // the remote chance that this gets fixed someday.
37130
37131             return String(value);
37132
37133 // If the type is "object", we might be dealing with an object or an array or
37134 // null.
37135
37136         case "object":
37137
37138 // Due to a specification blunder in ECMAScript, typeof null is "object",
37139 // so watch out for that case.
37140
37141             if (!value) {
37142                 return "null";
37143             }
37144
37145 // Make an array to hold the partial results of stringifying this object value.
37146
37147             gap += indent;
37148             partial = [];
37149
37150 // Is the value an array?
37151
37152             if (Object.prototype.toString.apply(value) === "[object Array]") {
37153
37154 // The value is an array. Stringify every element. Use null as a placeholder
37155 // for non-JSON values.
37156
37157                 length = value.length;
37158                 for (i = 0; i < length; i += 1) {
37159                     partial[i] = str(i, value) || "null";
37160                 }
37161
37162 // Join all of the elements together, separated with commas, and wrap them in
37163 // brackets.
37164
37165                 v = partial.length === 0
37166                     ? "[]"
37167                     : gap
37168                         ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
37169                         : "[" + partial.join(",") + "]";
37170                 gap = mind;
37171                 return v;
37172             }
37173
37174 // If the replacer is an array, use it to select the members to be stringified.
37175
37176             if (rep && typeof rep === "object") {
37177                 length = rep.length;
37178                 for (i = 0; i < length; i += 1) {
37179                     if (typeof rep[i] === "string") {
37180                         k = rep[i];
37181                         v = str(k, value);
37182                         if (v) {
37183                             partial.push(quote(k) + (
37184                                 gap
37185                                     ? ": "
37186                                     : ":"
37187                             ) + v);
37188                         }
37189                     }
37190                 }
37191             } else {
37192
37193 // Otherwise, iterate through all of the keys in the object.
37194
37195                 for (k in value) {
37196                     if (Object.prototype.hasOwnProperty.call(value, k)) {
37197                         v = str(k, value);
37198                         if (v) {
37199                             partial.push(quote(k) + (
37200                                 gap
37201                                     ? ": "
37202                                     : ":"
37203                             ) + v);
37204                         }
37205                     }
37206                 }
37207             }
37208
37209 // Join all of the member texts together, separated with commas,
37210 // and wrap them in braces.
37211
37212             v = partial.length === 0
37213                 ? "{}"
37214                 : gap
37215                     ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
37216                     : "{" + partial.join(",") + "}";
37217             gap = mind;
37218             return v;
37219         }
37220     }
37221
37222 // If the JSON object does not yet have a stringify method, give it one.
37223
37224     if (typeof JSON.stringify !== "function") {
37225         meta = {    // table of character substitutions
37226             "\b": "\\b",
37227             "\t": "\\t",
37228             "\n": "\\n",
37229             "\f": "\\f",
37230             "\r": "\\r",
37231             "\"": "\\\"",
37232             "\\": "\\\\"
37233         };
37234         JSON.stringify = function (value, replacer, space) {
37235
37236 // The stringify method takes a value and an optional replacer, and an optional
37237 // space parameter, and returns a JSON text. The replacer can be a function
37238 // that can replace values, or an array of strings that will select the keys.
37239 // A default replacer method can be provided. Use of the space parameter can
37240 // produce text that is more easily readable.
37241
37242             var i;
37243             gap = "";
37244             indent = "";
37245
37246 // If the space parameter is a number, make an indent string containing that
37247 // many spaces.
37248
37249             if (typeof space === "number") {
37250                 for (i = 0; i < space; i += 1) {
37251                     indent += " ";
37252                 }
37253
37254 // If the space parameter is a string, it will be used as the indent string.
37255
37256             } else if (typeof space === "string") {
37257                 indent = space;
37258             }
37259
37260 // If there is a replacer, it must be a function or an array.
37261 // Otherwise, throw an error.
37262
37263             rep = replacer;
37264             if (replacer && typeof replacer !== "function" &&
37265                     (typeof replacer !== "object" ||
37266                     typeof replacer.length !== "number")) {
37267                 throw new Error("JSON.stringify");
37268             }
37269
37270 // Make a fake root object containing our value under the key of "".
37271 // Return the result of stringifying the value.
37272
37273             return str("", {"": value});
37274         };
37275     }
37276
37277
37278 // If the JSON object does not yet have a parse method, give it one.
37279
37280     if (typeof JSON.parse !== "function") {
37281         JSON.parse = function (text, reviver) {
37282
37283 // The parse method takes a text and an optional reviver function, and returns
37284 // a JavaScript value if the text is a valid JSON text.
37285
37286             var j;
37287
37288             function walk(holder, key) {
37289
37290 // The walk method is used to recursively walk the resulting structure so
37291 // that modifications can be made.
37292
37293                 var k;
37294                 var v;
37295                 var value = holder[key];
37296                 if (value && typeof value === "object") {
37297                     for (k in value) {
37298                         if (Object.prototype.hasOwnProperty.call(value, k)) {
37299                             v = walk(value, k);
37300                             if (v !== undefined) {
37301                                 value[k] = v;
37302                             } else {
37303                                 delete value[k];
37304                             }
37305                         }
37306                     }
37307                 }
37308                 return reviver.call(holder, key, value);
37309             }
37310
37311
37312 // Parsing happens in four stages. In the first stage, we replace certain
37313 // Unicode characters with escape sequences. JavaScript handles many characters
37314 // incorrectly, either silently deleting them, or treating them as line endings.
37315
37316             text = String(text);
37317             rx_dangerous.lastIndex = 0;
37318             if (rx_dangerous.test(text)) {
37319                 text = text.replace(rx_dangerous, function (a) {
37320                     return "\\u" +
37321                             ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
37322                 });
37323             }
37324
37325 // In the second stage, we run the text against regular expressions that look
37326 // for non-JSON patterns. We are especially concerned with "()" and "new"
37327 // because they can cause invocation, and "=" because it can cause mutation.
37328 // But just to be safe, we want to reject all unexpected forms.
37329
37330 // We split the second stage into 4 regexp operations in order to work around
37331 // crippling inefficiencies in IE's and Safari's regexp engines. First we
37332 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
37333 // replace all simple value tokens with "]" characters. Third, we delete all
37334 // open brackets that follow a colon or comma or that begin the text. Finally,
37335 // we look to see that the remaining characters are only whitespace or "]" or
37336 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
37337
37338             if (
37339                 rx_one.test(
37340                     text
37341                         .replace(rx_two, "@")
37342                         .replace(rx_three, "]")
37343                         .replace(rx_four, "")
37344                 )
37345             ) {
37346
37347 // In the third stage we use the eval function to compile the text into a
37348 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
37349 // in JavaScript: it can begin a block or an object literal. We wrap the text
37350 // in parens to eliminate the ambiguity.
37351
37352                 j = eval("(" + text + ")");
37353
37354 // In the optional fourth stage, we recursively walk the new structure, passing
37355 // each name/value pair to a reviver function for possible transformation.
37356
37357                 return (typeof reviver === "function")
37358                     ? walk({"": j}, "")
37359                     : j;
37360             }
37361
37362 // If the text is not JSON parseable, then a SyntaxError is thrown.
37363
37364             throw new SyntaxError("JSON.parse");
37365         };
37366     }
37367 }());
37368
37369 var json2 = json2Plugin;
37370
37371 function json2Plugin() {
37372         
37373         return {}
37374 }
37375
37376 var plugins = [json2];
37377
37378 var store_legacy = storeEngine.createStore(all$3, plugins);
37379
37380 // # osm-auth
37381 //
37382 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
37383 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
37384 // does not support custom headers, which this uses everywhere.
37385 var osmAuth = function(o) {
37386
37387     var oauth = {};
37388
37389     // authenticated users will also have a request token secret, but it's
37390     // not used in transactions with the server
37391     oauth.authenticated = function() {
37392         return !!(token('oauth_token') && token('oauth_token_secret'));
37393     };
37394
37395     oauth.logout = function() {
37396         token('oauth_token', '');
37397         token('oauth_token_secret', '');
37398         token('oauth_request_token_secret', '');
37399         return oauth;
37400     };
37401
37402     // TODO: detect lack of click event
37403     oauth.authenticate = function(callback) {
37404         if (oauth.authenticated()) return callback();
37405
37406         oauth.logout();
37407
37408         // ## Getting a request token
37409         var params = timenonce(getAuth(o)),
37410             url = o.url + '/oauth/request_token';
37411
37412         params.oauth_signature = ohauth_1.signature(
37413             o.oauth_secret, '',
37414             ohauth_1.baseString('POST', url, params));
37415
37416         if (!o.singlepage) {
37417             // Create a 600x550 popup window in the center of the screen
37418             var w = 600, h = 550,
37419                 settings = [
37420                     ['width', w], ['height', h],
37421                     ['left', screen.width / 2 - w / 2],
37422                     ['top', screen.height / 2 - h / 2]].map(function(x) {
37423                         return x.join('=');
37424                     }).join(','),
37425                 popup = window.open('about:blank', 'oauth_window', settings);
37426         }
37427
37428         // Request a request token. When this is complete, the popup
37429         // window is redirected to OSM's authorization page.
37430         ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
37431         o.loading();
37432
37433         function reqTokenDone(err, xhr) {
37434             o.done();
37435             if (err) return callback(err);
37436             var resp = ohauth_1.stringQs(xhr.response);
37437             token('oauth_request_token_secret', resp.oauth_token_secret);
37438             var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
37439                 oauth_token: resp.oauth_token,
37440                 oauth_callback: resolveUrl(o.landing)
37441             });
37442
37443             if (o.singlepage) {
37444                 location.href = authorize_url;
37445             } else {
37446                 popup.location = authorize_url;
37447             }
37448         }
37449
37450         // Called by a function in a landing page, in the popup window. The
37451         // window closes itself.
37452         window.authComplete = function(token) {
37453             var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
37454             get_access_token(oauth_token.oauth_token);
37455             delete window.authComplete;
37456         };
37457
37458         // ## Getting an request token
37459         //
37460         // At this point we have an `oauth_token`, brought in from a function
37461         // call on a landing page popup.
37462         function get_access_token(oauth_token) {
37463             var url = o.url + '/oauth/access_token',
37464                 params = timenonce(getAuth(o)),
37465                 request_token_secret = token('oauth_request_token_secret');
37466             params.oauth_token = oauth_token;
37467             params.oauth_signature = ohauth_1.signature(
37468                 o.oauth_secret,
37469                 request_token_secret,
37470                 ohauth_1.baseString('POST', url, params));
37471
37472             // ## Getting an access token
37473             //
37474             // The final token required for authentication. At this point
37475             // we have a `request token secret`
37476             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
37477             o.loading();
37478         }
37479
37480         function accessTokenDone(err, xhr) {
37481             o.done();
37482             if (err) return callback(err);
37483             var access_token = ohauth_1.stringQs(xhr.response);
37484             token('oauth_token', access_token.oauth_token);
37485             token('oauth_token_secret', access_token.oauth_token_secret);
37486             callback(null, oauth);
37487         }
37488     };
37489
37490     oauth.bootstrapToken = function(oauth_token, callback) {
37491         // ## Getting an request token
37492         // At this point we have an `oauth_token`, brought in from a function
37493         // call on a landing page popup.
37494         function get_access_token(oauth_token) {
37495             var url = o.url + '/oauth/access_token',
37496                 params = timenonce(getAuth(o)),
37497                 request_token_secret = token('oauth_request_token_secret');
37498             params.oauth_token = oauth_token;
37499             params.oauth_signature = ohauth_1.signature(
37500                 o.oauth_secret,
37501                 request_token_secret,
37502                 ohauth_1.baseString('POST', url, params));
37503
37504             // ## Getting an access token
37505             // The final token required for authentication. At this point
37506             // we have a `request token secret`
37507             ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
37508             o.loading();
37509         }
37510
37511         function accessTokenDone(err, xhr) {
37512             o.done();
37513             if (err) return callback(err);
37514             var access_token = ohauth_1.stringQs(xhr.response);
37515             token('oauth_token', access_token.oauth_token);
37516             token('oauth_token_secret', access_token.oauth_token_secret);
37517             callback(null, oauth);
37518         }
37519
37520         get_access_token(oauth_token);
37521     };
37522
37523     // # xhr
37524     //
37525     // A single XMLHttpRequest wrapper that does authenticated calls if the
37526     // user has logged in.
37527     oauth.xhr = function(options, callback) {
37528         if (!oauth.authenticated()) {
37529             if (o.auto) {
37530                 return oauth.authenticate(run);
37531             } else {
37532                 callback('not authenticated', null);
37533                 return;
37534             }
37535         } else {
37536             return run();
37537         }
37538
37539         function run() {
37540             var params = timenonce(getAuth(o)),
37541                 oauth_token_secret = token('oauth_token_secret'),
37542                 url = (options.prefix !== false) ? o.url + options.path : options.path,
37543                 url_parts = url.replace(/#.*$/, '').split('?', 2),
37544                 base_url = url_parts[0],
37545                 query = (url_parts.length === 2) ? url_parts[1] : '';
37546
37547             // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
37548             if ((!options.options || !options.options.header ||
37549                 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
37550                 options.content) {
37551                 params = immutable(params, ohauth_1.stringQs(options.content));
37552             }
37553
37554             params.oauth_token = token('oauth_token');
37555             params.oauth_signature = ohauth_1.signature(
37556                 o.oauth_secret,
37557                 oauth_token_secret,
37558                 ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
37559             );
37560
37561             return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
37562         }
37563
37564         function done(err, xhr) {
37565             if (err) return callback(err);
37566             else if (xhr.responseXML) return callback(err, xhr.responseXML);
37567             else return callback(err, xhr.response);
37568         }
37569     };
37570
37571     // pre-authorize this object, if we can just get a token and token_secret
37572     // from the start
37573     oauth.preauth = function(c) {
37574         if (!c) return;
37575         if (c.oauth_token) token('oauth_token', c.oauth_token);
37576         if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
37577         return oauth;
37578     };
37579
37580     oauth.options = function(_) {
37581         if (!arguments.length) return o;
37582
37583         o = _;
37584         o.url = o.url || 'https://www.openstreetmap.org';
37585         o.landing = o.landing || 'land.html';
37586         o.singlepage = o.singlepage || false;
37587
37588         // Optional loading and loading-done functions for nice UI feedback.
37589         // by default, no-ops
37590         o.loading = o.loading || function() {};
37591         o.done = o.done || function() {};
37592
37593         return oauth.preauth(o);
37594     };
37595
37596     // 'stamp' an authentication object from `getAuth()`
37597     // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
37598     // and timestamp
37599     function timenonce(o) {
37600         o.oauth_timestamp = ohauth_1.timestamp();
37601         o.oauth_nonce = ohauth_1.nonce();
37602         return o;
37603     }
37604
37605     // get/set tokens. These are prefixed with the base URL so that `osm-auth`
37606     // can be used with multiple APIs and the keys in `localStorage`
37607     // will not clash
37608     var token;
37609
37610     if (store_legacy.enabled) {
37611         token = function (x, y) {
37612             if (arguments.length === 1) return store_legacy.get(o.url + x);
37613             else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
37614         };
37615     } else {
37616         var storage = {};
37617         token = function (x, y) {
37618             if (arguments.length === 1) return storage[o.url + x];
37619             else if (arguments.length === 2) return storage[o.url + x] = y;
37620         };
37621     }
37622
37623     // Get an authentication object. If you just add and remove properties
37624     // from a single object, you'll need to use `delete` to make sure that
37625     // it doesn't contain undesired properties for authentication
37626     function getAuth(o) {
37627         return {
37628             oauth_consumer_key: o.oauth_consumer_key,
37629             oauth_signature_method: 'HMAC-SHA1'
37630         };
37631     }
37632
37633     // potentially pre-authorize
37634     oauth.options(o);
37635
37636     return oauth;
37637 };
37638
37639 var JXON = new (function () {
37640   var
37641     sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
37642     aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
37643
37644   function parseText (sValue) {
37645     if (rIsNull.test(sValue)) { return null; }
37646     if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
37647     if (isFinite(sValue)) { return parseFloat(sValue); }
37648     if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
37649     return sValue;
37650   }
37651
37652   function EmptyTree () { }
37653   EmptyTree.prototype.toString = function () { return 'null'; };
37654   EmptyTree.prototype.valueOf = function () { return null; };
37655
37656   function objectify (vValue) {
37657     return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
37658   }
37659
37660   function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
37661     var
37662       nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
37663       bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
37664
37665     var
37666       sProp, vContent, nLength = 0, sCollectedTxt = '',
37667       vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
37668
37669     if (bChildren) {
37670       for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
37671         oNode = oParentNode.childNodes.item(nItem);
37672         if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
37673         else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
37674         else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
37675       }
37676     }
37677
37678     var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
37679
37680     if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
37681
37682     for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
37683       sProp = aCache[nElId].nodeName.toLowerCase();
37684       vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
37685       if (vResult.hasOwnProperty(sProp)) {
37686         if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
37687         vResult[sProp].push(vContent);
37688       } else {
37689         vResult[sProp] = vContent;
37690         nLength++;
37691       }
37692     }
37693
37694     if (bAttributes) {
37695       var
37696         nAttrLen = oParentNode.attributes.length,
37697         sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
37698
37699       for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
37700         oAttrib = oParentNode.attributes.item(nAttrib);
37701         oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
37702       }
37703
37704       if (bNesteAttr) {
37705         if (bFreeze) { Object.freeze(oAttrParent); }
37706         vResult[sAttributesProp] = oAttrParent;
37707         nLength -= nAttrLen - 1;
37708       }
37709     }
37710
37711     if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
37712       vResult[sValueProp] = vBuiltVal;
37713     } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
37714       vResult = vBuiltVal;
37715     }
37716
37717     if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
37718
37719     aCache.length = nLevelStart;
37720
37721     return vResult;
37722   }
37723
37724   function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
37725     var vValue, oChild;
37726
37727     if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
37728       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
37729     } else if (oParentObj.constructor === Date) {
37730       oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
37731     }
37732
37733     for (var sName in oParentObj) {
37734       vValue = oParentObj[sName];
37735       if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
37736       if (sName === sValueProp) {
37737         if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
37738       } else if (sName === sAttributesProp) { /* verbosity level is 3 */
37739         for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
37740       } else if (sName.charAt(0) === sAttrPref) {
37741         oParentEl.setAttribute(sName.slice(1), vValue);
37742       } else if (vValue.constructor === Array) {
37743         for (var nItem = 0; nItem < vValue.length; nItem++) {
37744           oChild = oXMLDoc.createElement(sName);
37745           loadObjTree(oXMLDoc, oChild, vValue[nItem]);
37746           oParentEl.appendChild(oChild);
37747         }
37748       } else {
37749         oChild = oXMLDoc.createElement(sName);
37750         if (vValue instanceof Object) {
37751           loadObjTree(oXMLDoc, oChild, vValue);
37752         } else if (vValue !== null && vValue !== true) {
37753           oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
37754         }
37755         oParentEl.appendChild(oChild);
37756      }
37757    }
37758   }
37759
37760   this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
37761     var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
37762     return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
37763   };
37764
37765   this.unbuild = function (oObjTree) {    
37766     var oNewDoc = document.implementation.createDocument('', '', null);
37767     loadObjTree(oNewDoc, oNewDoc, oObjTree);
37768     return oNewDoc;
37769   };
37770
37771   this.stringify = function (oObjTree) {
37772     return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
37773   };
37774 })();
37775
37776 // var myObject = JXON.build(doc);
37777 // we got our javascript object! try: alert(JSON.stringify(myObject));
37778
37779 // var newDoc = JXON.unbuild(myObject);
37780 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
37781
37782 var dispatch$2 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded');
37783 var urlroot = 'https://www.openstreetmap.org';
37784 var blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
37785 var inflight$1 = {};
37786 var loadedTiles = {};
37787 var entityCache = {};
37788 var tileZoom$1 = 16;
37789 var oauth = osmAuth({
37790         url: urlroot,
37791         oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
37792         oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
37793         loading: authLoading,
37794         done: authDone
37795     });
37796 var rateLimitError;
37797 var userChangesets;
37798 var userDetails;
37799 var off;
37800
37801
37802 function authLoading() {
37803     dispatch$2.call('authLoading');
37804 }
37805
37806
37807 function authDone() {
37808     dispatch$2.call('authDone');
37809 }
37810
37811
37812 function abortRequest$1(i) {
37813     if (i) {
37814         i.abort();
37815     }
37816 }
37817
37818
37819 function getLoc(attrs) {
37820     var lon = attrs.lon && attrs.lon.value,
37821         lat = attrs.lat && attrs.lat.value;
37822     return [parseFloat(lon), parseFloat(lat)];
37823 }
37824
37825
37826 function getNodes(obj) {
37827     var elems = obj.getElementsByTagName('nd'),
37828         nodes = new Array(elems.length);
37829     for (var i = 0, l = elems.length; i < l; i++) {
37830         nodes[i] = 'n' + elems[i].attributes.ref.value;
37831     }
37832     return nodes;
37833 }
37834
37835
37836 function getTags(obj) {
37837     var elems = obj.getElementsByTagName('tag'),
37838         tags = {};
37839     for (var i = 0, l = elems.length; i < l; i++) {
37840         var attrs = elems[i].attributes;
37841         tags[attrs.k.value] = attrs.v.value;
37842     }
37843
37844     return tags;
37845 }
37846
37847
37848 function getMembers(obj) {
37849     var elems = obj.getElementsByTagName('member'),
37850         members = new Array(elems.length);
37851     for (var i = 0, l = elems.length; i < l; i++) {
37852         var attrs = elems[i].attributes;
37853         members[i] = {
37854             id: attrs.type.value[0] + attrs.ref.value,
37855             type: attrs.type.value,
37856             role: attrs.role.value
37857         };
37858     }
37859     return members;
37860 }
37861
37862
37863 function getVisible(attrs) {
37864     return (!attrs.visible || attrs.visible.value !== 'false');
37865 }
37866
37867
37868 var parsers = {
37869     node: function nodeData(obj, uid) {
37870         var attrs = obj.attributes;
37871         return new osmNode({
37872             id:uid,
37873             visible: getVisible(attrs),
37874             version: attrs.version.value,
37875             changeset: attrs.changeset && attrs.changeset.value,
37876             timestamp: attrs.timestamp && attrs.timestamp.value,
37877             user: attrs.user && attrs.user.value,
37878             uid: attrs.uid && attrs.uid.value,
37879             loc: getLoc(attrs),
37880             tags: getTags(obj)
37881         });
37882     },
37883
37884     way: function wayData(obj, uid) {
37885         var attrs = obj.attributes;
37886         return new osmWay({
37887             id: uid,
37888             visible: getVisible(attrs),
37889             version: attrs.version.value,
37890             changeset: attrs.changeset && attrs.changeset.value,
37891             timestamp: attrs.timestamp && attrs.timestamp.value,
37892             user: attrs.user && attrs.user.value,
37893             uid: attrs.uid && attrs.uid.value,
37894             tags: getTags(obj),
37895             nodes: getNodes(obj),
37896         });
37897     },
37898
37899     relation: function relationData(obj, uid) {
37900         var attrs = obj.attributes;
37901         return new osmRelation({
37902             id: uid,
37903             visible: getVisible(attrs),
37904             version: attrs.version.value,
37905             changeset: attrs.changeset && attrs.changeset.value,
37906             timestamp: attrs.timestamp && attrs.timestamp.value,
37907             user: attrs.user && attrs.user.value,
37908             uid: attrs.uid && attrs.uid.value,
37909             tags: getTags(obj),
37910             members: getMembers(obj)
37911         });
37912     }
37913 };
37914
37915
37916 function parse$1(xml, callback, options) {
37917     options = assignIn$1({ cache: true }, options);
37918     if (!xml || !xml.childNodes) return;
37919
37920     var root = xml.childNodes[0],
37921         children = root.childNodes;
37922
37923     function parseChild(child) {
37924         var parser = parsers[child.nodeName];
37925         if (parser) {
37926             var uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
37927             if (options.cache && entityCache[uid]) {
37928                 return null;
37929             }
37930             return parser(child, uid);
37931         }
37932     }
37933
37934     utilIdleWorker(children, parseChild, callback);
37935 }
37936
37937
37938 var serviceOsm = {
37939
37940     init: function() {
37941         utilRebind(this, dispatch$2, 'on');
37942     },
37943
37944
37945     reset: function() {
37946         userChangesets = undefined;
37947         userDetails = undefined;
37948         rateLimitError = undefined;
37949         forEach(inflight$1, abortRequest$1);
37950         entityCache = {};
37951         loadedTiles = {};
37952         inflight$1 = {};
37953         return this;
37954     },
37955
37956
37957     changesetURL: function(changesetId) {
37958         return urlroot + '/changeset/' + changesetId;
37959     },
37960
37961
37962     changesetsURL: function(center, zoom) {
37963         var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
37964         return urlroot + '/history#map=' +
37965             Math.floor(zoom) + '/' +
37966             center[1].toFixed(precision) + '/' +
37967             center[0].toFixed(precision);
37968     },
37969
37970
37971     entityURL: function(entity) {
37972         return urlroot + '/' + entity.type + '/' + entity.osmId();
37973     },
37974
37975
37976     historyURL: function(entity) {
37977         return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
37978     },
37979
37980
37981     userURL: function(username) {
37982         return urlroot + '/user/' + username;
37983     },
37984
37985
37986     loadFromAPI: function(path, callback, options) {
37987         options = assignIn$1({ cache: true }, options);
37988         var that = this;
37989
37990         function done(err, xml) {
37991             var isAuthenticated = that.authenticated();
37992
37993             // 400 Bad Request, 401 Unauthorized, 403 Forbidden
37994             // Logout and retry the request..
37995             if (isAuthenticated && err &&
37996                     (err.status === 400 || err.status === 401 || err.status === 403)) {
37997                 that.logout();
37998                 that.loadFromAPI(path, callback);
37999
38000             // else, no retry..
38001             } else {
38002                 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
38003                 // Set the rateLimitError flag and trigger a warning..
38004                 if (!isAuthenticated && !rateLimitError && err &&
38005                         (err.status === 509 || err.status === 429)) {
38006                     rateLimitError = err;
38007                     dispatch$2.call('change');
38008                 }
38009
38010                 if (callback) {
38011                     if (err) return callback(err, null);
38012                     parse$1(xml, function (entities) {
38013                         if (options.cache) {
38014                             for (var i in entities) {
38015                                 entityCache[entities[i].id] = true;
38016                             }
38017                         }
38018                         callback(null, entities);
38019                     }, options);
38020                 }
38021             }
38022         }
38023
38024         if (this.authenticated()) {
38025             return oauth.xhr({ method: 'GET', path: path }, done);
38026         } else {
38027             var url = urlroot + path;
38028             return d3_xml(url).get(done);
38029         }
38030     },
38031
38032
38033     loadEntity: function(id, callback) {
38034         var type = osmEntity$$1.id.type(id),
38035             osmID = osmEntity$$1.id.toOSM(id),
38036             options = { cache: false };
38037
38038         this.loadFromAPI(
38039             '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
38040             function(err, entities) {
38041                 if (callback) callback(err, { data: entities });
38042             },
38043             options
38044         );
38045     },
38046
38047
38048     loadEntityVersion: function(id, version, callback) {
38049         var type = osmEntity$$1.id.type(id),
38050             osmID = osmEntity$$1.id.toOSM(id),
38051             options = { cache: false };
38052
38053         this.loadFromAPI(
38054             '/api/0.6/' + type + '/' + osmID + '/' + version,
38055             function(err, entities) {
38056                 if (callback) callback(err, { data: entities });
38057             },
38058             options
38059         );
38060     },
38061
38062
38063     loadMultiple: function(ids, callback) {
38064         var that = this;
38065
38066         forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
38067             var type = k + 's',
38068                 osmIDs = map$4(v, osmEntity$$1.id.toOSM),
38069                 options = { cache: false };
38070
38071             forEach(chunk(osmIDs, 150), function(arr) {
38072                 that.loadFromAPI(
38073                     '/api/0.6/' + type + '?' + type + '=' + arr.join(),
38074                     function(err, entities) {
38075                         if (callback) callback(err, { data: entities });
38076                     },
38077                     options
38078                 );
38079             });
38080         });
38081     },
38082
38083
38084     authenticated: function() {
38085         return oauth.authenticated();
38086     },
38087
38088
38089     putChangeset: function(changeset, changes, callback) {
38090
38091         // Create the changeset..
38092         oauth.xhr({
38093             method: 'PUT',
38094             path: '/api/0.6/changeset/create',
38095             options: { header: { 'Content-Type': 'text/xml' } },
38096             content: JXON.stringify(changeset.asJXON())
38097         }, createdChangeset);
38098
38099
38100         function createdChangeset(err, changeset_id) {
38101             if (err) return callback(err);
38102             changeset = changeset.update({ id: changeset_id });
38103
38104             // Upload the changeset..
38105             oauth.xhr({
38106                 method: 'POST',
38107                 path: '/api/0.6/changeset/' + changeset_id + '/upload',
38108                 options: { header: { 'Content-Type': 'text/xml' } },
38109                 content: JXON.stringify(changeset.osmChangeJXON(changes))
38110             }, uploadedChangeset);
38111         }
38112
38113
38114         function uploadedChangeset(err) {
38115             if (err) return callback(err);
38116
38117             // Upload was successful, safe to call the callback.
38118             // Add delay to allow for postgres replication #1646 #2678
38119             window.setTimeout(function() {
38120                 callback(null, changeset);
38121             }, 2500);
38122
38123             // Still attempt to close changeset, but ignore response because #2667
38124             oauth.xhr({
38125                 method: 'PUT',
38126                 path: '/api/0.6/changeset/' + changeset.id + '/close',
38127                 options: { header: { 'Content-Type': 'text/xml' } }
38128             }, function() { return true; });
38129         }
38130     },
38131
38132
38133     userDetails: function(callback) {
38134         if (userDetails) {
38135             callback(undefined, userDetails);
38136             return;
38137         }
38138
38139         function done(err, user_details) {
38140             if (err) return callback(err);
38141
38142             var u = user_details.getElementsByTagName('user')[0],
38143                 img = u.getElementsByTagName('img'),
38144                 image_url = '';
38145
38146             if (img && img[0] && img[0].getAttribute('href')) {
38147                 image_url = img[0].getAttribute('href');
38148             }
38149
38150             var changesets = u.getElementsByTagName('changesets'),
38151                 changesets_count = 0;
38152
38153             if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
38154                 changesets_count = changesets[0].getAttribute('count');
38155             }
38156
38157             userDetails = {
38158                 id: u.attributes.id.value,
38159                 display_name: u.attributes.display_name.value,
38160                 image_url: image_url,
38161                 changesets_count: changesets_count
38162             };
38163
38164             callback(undefined, userDetails);
38165         }
38166
38167         oauth.xhr({ method: 'GET', path: '/api/0.6/user/details' }, done);
38168     },
38169
38170
38171     userChangesets: function(callback) {
38172         if (userChangesets) {
38173             callback(undefined, userChangesets);
38174             return;
38175         }
38176
38177         this.userDetails(function(err, user) {
38178             if (err) {
38179                 callback(err);
38180                 return;
38181             }
38182
38183             function done(err, changesets) {
38184                 if (err) {
38185                     callback(err);
38186                 } else {
38187                     userChangesets = Array.prototype.map.call(
38188                         changesets.getElementsByTagName('changeset'),
38189                         function (changeset) {
38190                             return { tags: getTags(changeset) };
38191                         }
38192                     ).filter(function (changeset) {
38193                         var comment = changeset.tags.comment;
38194                         return comment && comment !== '';
38195                     });
38196                     callback(undefined, userChangesets);
38197                 }
38198             }
38199
38200             oauth.xhr({ method: 'GET', path: '/api/0.6/changesets?user=' + user.id }, done);
38201         });
38202     },
38203
38204
38205     status: function(callback) {
38206         function done(xml) {
38207             // update blacklists
38208             var elements = xml.getElementsByTagName('blacklist'),
38209                 regexes = [];
38210             for (var i = 0; i < elements.length; i++) {
38211                 var regex = elements[i].getAttribute('regex');  // needs unencode?
38212                 if (regex) {
38213                     regexes.push(regex);
38214                 }
38215             }
38216             if (regexes.length) {
38217                 blacklists = regexes;
38218             }
38219
38220
38221             if (rateLimitError) {
38222                 callback(rateLimitError, 'rateLimited');
38223             } else {
38224                 var apiStatus = xml.getElementsByTagName('status'),
38225                     val = apiStatus[0].getAttribute('api');
38226
38227                 callback(undefined, val);
38228             }
38229         }
38230
38231         d3_xml(urlroot + '/api/capabilities').get()
38232             .on('load', done)
38233             .on('error', callback);
38234     },
38235
38236
38237     imageryBlacklists: function() {
38238         return blacklists;
38239     },
38240
38241
38242     tileZoom: function(_) {
38243         if (!arguments.length) return tileZoom$1;
38244         tileZoom$1 = _;
38245         return this;
38246     },
38247
38248
38249     loadTiles: function(projection, dimensions, callback) {
38250         if (off) return;
38251
38252         var that = this,
38253             s = projection.scale() * 2 * Math.PI,
38254             z = Math.max(Math.log(s) / Math.log(2) - 8, 0),
38255             ts = 256 * Math.pow(2, z - tileZoom$1),
38256             origin = [
38257                 s / 2 - projection.translate()[0],
38258                 s / 2 - projection.translate()[1]
38259             ];
38260
38261         var tiles = d3geoTile()
38262             .scaleExtent([tileZoom$1, tileZoom$1])
38263             .scale(s)
38264             .size(dimensions)
38265             .translate(projection.translate())()
38266             .map(function(tile) {
38267                 var x = tile[0] * ts - origin[0],
38268                     y = tile[1] * ts - origin[1];
38269
38270                 return {
38271                     id: tile.toString(),
38272                     extent: geoExtent$$1(
38273                         projection.invert([x, y + ts]),
38274                         projection.invert([x + ts, y]))
38275                 };
38276             });
38277
38278         filter(inflight$1, function(v, i) {
38279             var wanted = find$1(tiles, function(tile) {
38280                 return i === tile.id;
38281             });
38282             if (!wanted) delete inflight$1[i];
38283             return !wanted;
38284         }).map(abortRequest$1);
38285
38286         tiles.forEach(function(tile) {
38287             var id = tile.id;
38288
38289             if (loadedTiles[id] || inflight$1[id]) return;
38290
38291             if (isEmpty(inflight$1)) {
38292                 dispatch$2.call('loading');
38293             }
38294
38295             inflight$1[id] = that.loadFromAPI(
38296                 '/api/0.6/map?bbox=' + tile.extent.toParam(),
38297                 function(err, parsed) {
38298                     delete inflight$1[id];
38299                     if (!err) {
38300                         loadedTiles[id] = true;
38301                     }
38302
38303                     if (callback) {
38304                         callback(err, assignIn$1({ data: parsed }, tile));
38305                     }
38306
38307                     if (isEmpty(inflight$1)) {
38308                         dispatch$2.call('loaded');
38309                     }
38310                 }
38311             );
38312         });
38313     },
38314
38315
38316     switch: function(options) {
38317         urlroot = options.urlroot;
38318
38319         oauth.options(assignIn$1({
38320             url: urlroot,
38321             loading: authLoading,
38322             done: authDone
38323         }, options));
38324
38325         dispatch$2.call('change');
38326         this.reset();
38327         this.userChangesets(function() {});  // eagerly load user details/changesets
38328         return this;
38329     },
38330
38331
38332     toggle: function(_) {
38333         off = !_;
38334         return this;
38335     },
38336
38337
38338     loadedTiles: function(_) {
38339         if (!arguments.length) return loadedTiles;
38340         loadedTiles = _;
38341         return this;
38342     },
38343
38344
38345     logout: function() {
38346         userChangesets = undefined;
38347         userDetails = undefined;
38348         oauth.logout();
38349         dispatch$2.call('change');
38350         return this;
38351     },
38352
38353
38354     authenticate: function(callback) {
38355         var that = this;
38356         userChangesets = undefined;
38357         userDetails = undefined;
38358
38359         function done(err, res) {
38360             rateLimitError = undefined;
38361             dispatch$2.call('change');
38362             if (callback) callback(err, res);
38363             that.userChangesets(function() {});  // eagerly load user details/changesets
38364         }
38365
38366         return oauth.authenticate(done);
38367     }
38368 };
38369
38370 var apibase$2 = 'https://taginfo.openstreetmap.org/api/4/';
38371 var inflight$2 = {};
38372 var popularKeys = {};
38373 var taginfoCache = {};
38374 var tag_sorts = {
38375         point: 'count_nodes',
38376         vertex: 'count_nodes',
38377         area: 'count_ways',
38378         line: 'count_ways'
38379     };
38380 var tag_sort_members = {
38381         point: 'count_node_members',
38382         vertex: 'count_node_members',
38383         area: 'count_way_members',
38384         line: 'count_way_members',
38385         relation: 'count_relation_members'
38386     };
38387 var tag_filters = {
38388         point: 'nodes',
38389         vertex: 'nodes',
38390         area: 'ways',
38391         line: 'ways'
38392     };
38393 var tag_members_fractions = {
38394         point: 'count_node_members_fraction',
38395         vertex: 'count_node_members_fraction',
38396         area: 'count_way_members_fraction',
38397         line: 'count_way_members_fraction',
38398         relation: 'count_relation_members_fraction'
38399     };
38400
38401
38402 function sets(params, n, o) {
38403     if (params.geometry && o[params.geometry]) {
38404         params[n] = o[params.geometry];
38405     }
38406     return params;
38407 }
38408
38409
38410 function setFilter(params) {
38411     return sets(params, 'filter', tag_filters);
38412 }
38413
38414
38415 function setSort(params) {
38416     return sets(params, 'sortname', tag_sorts);
38417 }
38418
38419
38420 function setSortMembers(params) {
38421     return sets(params, 'sortname', tag_sort_members);
38422 }
38423
38424
38425 function clean(params) {
38426     return omit(params, ['geometry', 'debounce']);
38427 }
38428
38429
38430 function filterKeys(type) {
38431     var count_type = type ? 'count_' + type : 'count_all';
38432     return function(d) {
38433         return parseFloat(d[count_type]) > 2500 || d.in_wiki;
38434     };
38435 }
38436
38437
38438 function filterMultikeys(prefix) {
38439     return function(d) {
38440         // d.key begins with prefix, and d.key contains no additional ':'s
38441         var re = new RegExp('^' + prefix + '(.*)$');
38442         var matches = d.key.match(re) || [];
38443         return (matches.length === 2 && matches[1].indexOf(':') === -1);
38444     };
38445 }
38446
38447
38448 function filterValues(allowUpperCase) {
38449     return function(d) {
38450         if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
38451         if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
38452         return parseFloat(d.fraction) > 0.0 || d.in_wiki;
38453     };
38454 }
38455
38456
38457 function filterRoles(geometry) {
38458     return function(d) {
38459         if (d.role === '') return false; // exclude empty role
38460         if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
38461         return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
38462     };
38463 }
38464
38465
38466 function valKey(d) {
38467     return {
38468         value: d.key,
38469         title: d.key
38470     };
38471 }
38472
38473
38474 function valKeyDescription(d) {
38475     return {
38476         value: d.value,
38477         title: d.description || d.value
38478     };
38479 }
38480
38481
38482 function roleKey(d) {
38483     return {
38484         value: d.role,
38485         title: d.role
38486     };
38487 }
38488
38489
38490 // sort keys with ':' lower than keys without ':'
38491 function sortKeys(a, b) {
38492     return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
38493         : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
38494         : 0;
38495 }
38496
38497
38498 var debouncedRequest = debounce$1(request, 500, { leading: false });
38499
38500 function request(url, params, exactMatch, callback, loaded) {
38501     if (inflight$2[url]) return;
38502
38503     if (checkCache(url, params, exactMatch, callback)) return;
38504
38505     inflight$2[url] = d3_json(url, function (err, data) {
38506         delete inflight$2[url];
38507         loaded(err, data);
38508     });
38509 }
38510
38511
38512 function checkCache(url, params, exactMatch, callback) {
38513     var rp = params.rp || 25,
38514         testQuery = params.query || '',
38515         testUrl = url;
38516
38517     do {
38518         var hit = taginfoCache[testUrl];
38519
38520         // exact match, or shorter match yielding fewer than max results (rp)
38521         if (hit && (url === testUrl || hit.length < rp)) {
38522             callback(null, hit);
38523             return true;
38524         }
38525
38526         // don't try to shorten the query
38527         if (exactMatch || !testQuery.length) return false;
38528
38529         // do shorten the query to see if we already have a cached result
38530         // that has returned fewer than max results (rp)
38531         testQuery = testQuery.slice(0, -1);
38532         testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
38533     } while (testQuery.length >= 0);
38534
38535     return false;
38536 }
38537
38538
38539 var serviceTaginfo = {
38540
38541     init: function() {
38542         inflight$2 = {};
38543         taginfoCache = {};
38544         popularKeys = {};
38545
38546         // Fetch popular keys.  We'll exclude these from `values`
38547         // lookups because they stress taginfo, and they aren't likely
38548         // to yield meaningful autocomplete results.. see #3955
38549         var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
38550         this.keys(params, function(err, data) {
38551             if (err) return;
38552             data.forEach(function(d) {
38553                 if (d.value === 'opening_hours') return;  // exception
38554                 popularKeys[d.value] = true;
38555             });
38556         });
38557     },
38558
38559
38560     reset: function() {
38561         forEach(inflight$2, function(req) { req.abort(); });
38562         inflight$2 = {};
38563     },
38564
38565
38566     keys: function(params, callback) {
38567         var doRequest = params.debounce ? debouncedRequest : request;
38568         params = clean(setSort(params));
38569         params = assignIn$1({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38570
38571         var url = apibase$2 + 'keys/all?' + utilQsString(params);
38572         doRequest(url, params, false, callback, function(err, d) {
38573             if (err) {
38574                 callback(err);
38575             } else {
38576                 var f = filterKeys(params.filter);
38577                 var result = d.data.filter(f).sort(sortKeys).map(valKey);
38578                 taginfoCache[url] = result;
38579                 callback(null, result);
38580             }
38581         });
38582     },
38583
38584
38585     multikeys: function(params, callback) {
38586         var doRequest = params.debounce ? debouncedRequest : request;
38587         params = clean(setSort(params));
38588         params = assignIn$1({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38589         var prefix = params.query;
38590
38591         var url = apibase$2 + 'keys/all?' + utilQsString(params);
38592         doRequest(url, params, true, callback, function(err, d) {
38593             if (err) {
38594                 callback(err);
38595             } else {
38596                 var f = filterMultikeys(prefix);
38597                 var result = d.data.filter(f).map(valKey);
38598                 taginfoCache[url] = result;
38599                 callback(null, result);
38600             }
38601         });
38602     },
38603
38604
38605     values: function(params, callback) {
38606         // Exclude popular keys from values lookups.. see #3955
38607         var key = params.key;
38608         if (key && popularKeys[key]) {
38609             callback(null, []);
38610             return;
38611         }
38612
38613         var doRequest = params.debounce ? debouncedRequest : request;
38614         params = clean(setSort(setFilter(params)));
38615         params = assignIn$1({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
38616
38617         var url = apibase$2 + 'key/values?' + utilQsString(params);
38618         doRequest(url, params, false, callback, function(err, d) {
38619             if (err) {
38620                 callback(err);
38621             } else {
38622                 // In most cases we prefer taginfo value results with lowercase letters.
38623                 // A few OSM keys expect values to contain uppercase values (see #3377).
38624                 // This is not an exhaustive list (e.g. `name` also has uppercase values)
38625                 // but these are the fields where taginfo value lookup is most useful.
38626                 var re = /network|taxon|genus|species|brand|grape_variety|_hours|_times/;
38627                 var allowUpperCase = (params.key.match(re) !== null);
38628                 var f = filterValues(allowUpperCase);
38629
38630                 var result = d.data.filter(f).map(valKeyDescription);
38631                 taginfoCache[url] = result;
38632                 callback(null, result);
38633             }
38634         });
38635     },
38636
38637
38638     roles: function(params, callback) {
38639         var doRequest = params.debounce ? debouncedRequest : request;
38640         var geometry = params.geometry;
38641         params = clean(setSortMembers(params));
38642         params = assignIn$1({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
38643
38644         var url = apibase$2 + 'relation/roles?' + utilQsString(params);
38645         doRequest(url, params, true, callback, function(err, d) {
38646             if (err) {
38647                 callback(err);
38648             } else {
38649                 var f = filterRoles(geometry);
38650                 var result = d.data.filter(f).map(roleKey);
38651                 taginfoCache[url] = result;
38652                 callback(null, result);
38653             }
38654         });
38655     },
38656
38657
38658     docs: function(params, callback) {
38659         var doRequest = params.debounce ? debouncedRequest : request;
38660         params = clean(setSort(params));
38661
38662         var path = 'key/wiki_pages?';
38663         if (params.value) path = 'tag/wiki_pages?';
38664         else if (params.rtype) path = 'relation/wiki_pages?';
38665
38666         var url = apibase$2 + path + utilQsString(params);
38667         doRequest(url, params, true, callback, function(err, d) {
38668             if (err) {
38669                 callback(err);
38670             } else {
38671                 taginfoCache[url] = d.data;
38672                 callback(null, d.data);
38673             }
38674         });
38675     },
38676
38677
38678     apibase: function(_) {
38679         if (!arguments.length) return apibase$2;
38680         apibase$2 = _;
38681         return this;
38682     }
38683
38684 };
38685
38686 var jsonpCache = {};
38687 window.jsonpCache = jsonpCache;
38688
38689 function jsonpRequest(url, callback) {
38690
38691   if (window.JSONP_FIX) {
38692     if (window.JSONP_DELAY === 0) {
38693       callback(window.JSONP_FIX);
38694     } else {
38695       setTimeout(function() {
38696         callback(window.JSONP_FIX);
38697       }, window.JSONP_DELAY || 0);
38698     }
38699     return;
38700   }
38701
38702   function rand() {
38703     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
38704       c = '', i = -1;
38705     while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
38706     return c;
38707   }
38708
38709   function create(url) {
38710     var e = url.match(/callback=(\w+)/),
38711       c = e ? e[1] : rand();
38712     jsonpCache[c] = function(data) {
38713       callback(data);
38714       delete jsonpCache[c];
38715       script.remove();
38716     };
38717     return 'jsonpCache.' + c;
38718   }
38719
38720   var cb = create(url),
38721     script = d3_select('head')
38722     .append('script')
38723     .attr('type', 'text/javascript')
38724     .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
38725 }
38726
38727 var endpoint = 'https://www.wikidata.org/w/api.php?';
38728
38729 var serviceWikidata = {
38730
38731     init: function() {},
38732     reset: function() {},
38733
38734
38735     // Given a Wikipedia language and article title, return an array of
38736     // corresponding Wikidata entities.
38737     itemsByTitle: function(lang, title, callback) {
38738         if (!title) {
38739             callback('', {});
38740             return;
38741         }
38742
38743         lang = lang || 'en';
38744         jsonpRequest(endpoint + utilQsString({
38745             action: 'wbgetentities',
38746             format: 'json',
38747             sites: lang.replace(/-/g, '_') + 'wiki',
38748             titles: title,
38749             languages: 'en', // shrink response by filtering to one language
38750             callback: '{callback}'
38751         }), function(data) {
38752             if (!data || data.error) {
38753                 callback('', {});
38754             } else {
38755                 callback(title, data.entities || {});
38756             }
38757         });
38758     }
38759
38760 };
38761
38762 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
38763
38764 var serviceWikipedia = {
38765
38766     init: function() {},
38767     reset: function() {},
38768
38769
38770     search: function(lang, query, callback) {
38771         if (!query) {
38772             callback('', []);
38773             return;
38774         }
38775
38776         lang = lang || 'en';
38777         jsonpRequest(endpoint$1.replace('en', lang) +
38778             utilQsString({
38779                 action: 'query',
38780                 list: 'search',
38781                 srlimit: '10',
38782                 srinfo: 'suggestion',
38783                 format: 'json',
38784                 callback: '{callback}',
38785                 srsearch: query
38786             }), function(data) {
38787                 if (!data || !data.query || !data.query.search || data.error) {
38788                     callback('', []);
38789                 } else {
38790                     var results = data.query.search.map(function(d) { return d.title; });
38791                     callback(query, results);
38792                 }
38793             }
38794         );
38795     },
38796
38797
38798     suggestions: function(lang, query, callback) {
38799         if (!query) {
38800             callback('', []);
38801             return;
38802         }
38803
38804         lang = lang || 'en';
38805         jsonpRequest(endpoint$1.replace('en', lang) +
38806             utilQsString({
38807                 action: 'opensearch',
38808                 namespace: 0,
38809                 suggest: '',
38810                 format: 'json',
38811                 callback: '{callback}',
38812                 search: query
38813             }), function(data) {
38814                 if (!data || data.error) {
38815                     callback('', []);
38816                 } else {
38817                     callback(data[0], data[1] || []);
38818                 }
38819             }
38820         );
38821     },
38822
38823
38824     translations: function(lang, title, callback) {
38825         if (!title) {
38826             callback({});
38827             return;
38828         }
38829
38830         jsonpRequest(endpoint$1.replace('en', lang) +
38831             utilQsString({
38832                 action: 'query',
38833                 prop: 'langlinks',
38834                 format: 'json',
38835                 callback: '{callback}',
38836                 lllimit: 500,
38837                 titles: title
38838             }), function(data) {
38839                 if (!data || !data.query || !data.query.pages || data.error) {
38840                     callback({});
38841                 } else {
38842                     var list = data.query.pages[Object.keys(data.query.pages)[0]],
38843                         translations = {};
38844                     if (list && list.langlinks) {
38845                         list.langlinks.forEach(function(d) {
38846                             translations[d.lang] = d['*'];
38847                         });
38848                     }
38849                     callback(translations);
38850                 }
38851             }
38852         );
38853     }
38854
38855 };
38856
38857 var services = {
38858     mapillary: serviceMapillary,
38859     geocoder: serviceNominatim,
38860     osm: serviceOsm,
38861     taginfo: serviceTaginfo,
38862     wikidata: serviceWikidata,
38863     wikipedia: serviceWikipedia
38864 };
38865
38866 function svgMapillaryImages(projection, context, dispatch) {
38867     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
38868         minZoom = 12,
38869         minViewfieldZoom = 17,
38870         layer = d3_select(null),
38871         _mapillary;
38872
38873
38874     function init() {
38875         if (svgMapillaryImages.initialized) return;  // run once
38876         svgMapillaryImages.enabled = false;
38877         svgMapillaryImages.initialized = true;
38878     }
38879
38880
38881     function getMapillary() {
38882         if (services.mapillary && !_mapillary) {
38883             _mapillary = services.mapillary;
38884             _mapillary.event.on('loadedImages', throttledRedraw);
38885         } else if (!services.mapillary && _mapillary) {
38886             _mapillary = null;
38887         }
38888
38889         return _mapillary;
38890     }
38891
38892
38893     function showLayer() {
38894         var mapillary = getMapillary();
38895         if (!mapillary) return;
38896
38897         mapillary.loadViewer(context);
38898         editOn();
38899
38900         layer
38901             .style('opacity', 0)
38902             .transition()
38903             .duration(250)
38904             .style('opacity', 1)
38905             .on('end', function () { dispatch.call('change'); });
38906     }
38907
38908
38909     function hideLayer() {
38910         var mapillary = getMapillary();
38911         if (mapillary) {
38912             mapillary.hideViewer();
38913         }
38914
38915         throttledRedraw.cancel();
38916
38917         layer
38918             .transition()
38919             .duration(250)
38920             .style('opacity', 0)
38921             .on('end', editOff);
38922     }
38923
38924
38925     function editOn() {
38926         layer.style('display', 'block');
38927     }
38928
38929
38930     function editOff() {
38931         layer.selectAll('.viewfield-group').remove();
38932         layer.style('display', 'none');
38933     }
38934
38935
38936     function click(d) {
38937         var mapillary = getMapillary();
38938         if (!mapillary) return;
38939
38940         context.map().centerEase(d.loc);
38941
38942         mapillary
38943             .selectedImage(d.key, true)
38944             .updateViewer(d.key, context)
38945             .showViewer();
38946     }
38947
38948
38949     function transform(d) {
38950         var t = svgPointTransform(projection)(d);
38951         if (d.ca) t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
38952         return t;
38953     }
38954
38955
38956     function update() {
38957         var mapillary = getMapillary(),
38958             data = (mapillary ? mapillary.images(projection) : []),
38959             imageKey = mapillary ? mapillary.selectedImage() : null;
38960
38961         var markers = layer.selectAll('.viewfield-group')
38962             .data(data, function(d) { return d.key; });
38963
38964         markers.exit()
38965             .remove();
38966
38967         var enter = markers.enter()
38968             .append('g')
38969             .attr('class', 'viewfield-group')
38970             .classed('selected', function(d) { return d.key === imageKey; })
38971             .on('click', click);
38972
38973         markers = markers
38974             .merge(enter)
38975             .attr('transform', transform);
38976
38977
38978        var viewfields = markers.selectAll('.viewfield')
38979             .data(~~context.map().zoom() >= minViewfieldZoom ? [0] : []);
38980
38981         viewfields.exit()
38982             .remove();
38983
38984         viewfields.enter()
38985             .append('path')
38986             .attr('class', 'viewfield')
38987             .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
38988             .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');
38989
38990         markers.selectAll('circle')
38991             .data([0])
38992             .enter()
38993             .append('circle')
38994             .attr('dx', '0')
38995             .attr('dy', '0')
38996             .attr('r', '6');
38997     }
38998
38999
39000     function drawImages(selection$$1) {
39001         var enabled = svgMapillaryImages.enabled,
39002             mapillary = getMapillary();
39003
39004         layer = selection$$1.selectAll('.layer-mapillary-images')
39005             .data(mapillary ? [0] : []);
39006
39007         layer.exit()
39008             .remove();
39009
39010         layer = layer.enter()
39011             .append('g')
39012             .attr('class', 'layer-mapillary-images')
39013             .style('display', enabled ? 'block' : 'none')
39014             .merge(layer);
39015
39016         if (enabled) {
39017             if (mapillary && ~~context.map().zoom() >= minZoom) {
39018                 editOn();
39019                 update();
39020                 mapillary.loadImages(projection);
39021             } else {
39022                 editOff();
39023             }
39024         }
39025     }
39026
39027
39028     drawImages.enabled = function(_) {
39029         if (!arguments.length) return svgMapillaryImages.enabled;
39030         svgMapillaryImages.enabled = _;
39031         if (svgMapillaryImages.enabled) {
39032             showLayer();
39033         } else {
39034             hideLayer();
39035         }
39036         dispatch.call('change');
39037         return this;
39038     };
39039
39040
39041     drawImages.supported = function() {
39042         return !!getMapillary();
39043     };
39044
39045
39046     init();
39047     return drawImages;
39048 }
39049
39050 function svgMapillarySigns(projection, context, dispatch) {
39051     var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000),
39052         minZoom = 12,
39053         layer = d3_select(null),
39054         _mapillary;
39055
39056
39057     function init() {
39058         if (svgMapillarySigns.initialized) return;  // run once
39059         svgMapillarySigns.enabled = false;
39060         svgMapillarySigns.initialized = true;
39061     }
39062
39063
39064     function getMapillary() {
39065         if (services.mapillary && !_mapillary) {
39066             _mapillary = services.mapillary;
39067             _mapillary.event.on('loadedSigns', throttledRedraw);
39068         } else if (!services.mapillary && _mapillary) {
39069             _mapillary = null;
39070         }
39071         return _mapillary;
39072     }
39073
39074
39075     function showLayer() {
39076         editOn();
39077     }
39078
39079
39080     function hideLayer() {
39081         throttledRedraw.cancel();
39082         editOff();
39083     }
39084
39085
39086     function editOn() {
39087         layer.style('display', 'block');
39088     }
39089
39090
39091     function editOff() {
39092         layer.selectAll('.icon-sign').remove();
39093         layer.style('display', 'none');
39094     }
39095
39096
39097     function click(d) {
39098         var mapillary = getMapillary();
39099         if (!mapillary) return;
39100
39101         context.map().centerEase(d.loc);
39102
39103         var selected = mapillary.selectedImage(),
39104             imageKey;
39105
39106         // Pick one of the images the sign was detected in,
39107         // preference given to an image already selected.
39108         d.detections.forEach(function(detection) {
39109             if (!imageKey || selected === detection.image_key) {
39110                 imageKey = detection.image_key;
39111             }
39112         });
39113
39114         mapillary
39115             .selectedImage(imageKey, true)
39116             .updateViewer(imageKey, context)
39117             .showViewer();
39118     }
39119
39120
39121     function update() {
39122         var mapillary = getMapillary(),
39123             data = (mapillary ? mapillary.signs(projection) : []),
39124             imageKey = mapillary ? mapillary.selectedImage() : null;
39125
39126         var signs = layer.selectAll('.icon-sign')
39127             .data(data, function(d) { return d.key; });
39128
39129         signs.exit()
39130             .remove();
39131
39132         var enter = signs.enter()
39133             .append('foreignObject')
39134             .attr('class', 'icon-sign')
39135             .attr('width', '24px')      // for Firefox
39136             .attr('height', '24px')     // for Firefox
39137             .classed('selected', function(d) {
39138                 return some(d.detections, function(detection) {
39139                     return detection.image_key === imageKey;
39140                 });
39141             })
39142             .on('click', click);
39143
39144         enter
39145             .append('xhtml:body')
39146             .attr('class', 'icon-sign-body')
39147             .html(mapillary.signHTML);
39148
39149         signs
39150             .merge(enter)
39151             .attr('x', function(d) { return projection(d.loc)[0] - 12; })   // offset by -12px to
39152             .attr('y', function(d) { return projection(d.loc)[1] - 12; });  // center signs on loc
39153     }
39154
39155
39156     function drawSigns(selection$$1) {
39157         var enabled = svgMapillarySigns.enabled,
39158             mapillary = getMapillary();
39159
39160         layer = selection$$1.selectAll('.layer-mapillary-signs')
39161             .data(mapillary ? [0] : []);
39162
39163         layer.exit()
39164             .remove();
39165
39166         layer = layer.enter()
39167             .append('g')
39168             .attr('class', 'layer-mapillary-signs')
39169             .style('display', enabled ? 'block' : 'none')
39170             .merge(layer);
39171
39172         if (enabled) {
39173             if (mapillary && ~~context.map().zoom() >= minZoom) {
39174                 editOn();
39175                 update();
39176                 mapillary.loadSigns(context, projection);
39177             } else {
39178                 editOff();
39179             }
39180         }
39181     }
39182
39183
39184     drawSigns.enabled = function(_) {
39185         if (!arguments.length) return svgMapillarySigns.enabled;
39186         svgMapillarySigns.enabled = _;
39187         if (svgMapillarySigns.enabled) {
39188             showLayer();
39189         } else {
39190             hideLayer();
39191         }
39192         dispatch.call('change');
39193         return this;
39194     };
39195
39196
39197     drawSigns.supported = function() {
39198         var mapillary = getMapillary();
39199         return (mapillary && mapillary.signsSupported());
39200     };
39201
39202
39203     init();
39204     return drawSigns;
39205 }
39206
39207 function svgOsm(projection, context, dispatch) {
39208     var enabled = true;
39209
39210
39211     function drawOsm(selection) {
39212         selection.selectAll('.layer-osm')
39213             .data(['areas', 'lines', 'hit', 'halo', 'label'])
39214             .enter()
39215             .append('g')
39216             .attr('class', function(d) { return 'layer-osm layer-' + d; });
39217     }
39218
39219
39220     function showLayer() {
39221         var layer = context.surface().selectAll('.data-layer-osm');
39222         layer.interrupt();
39223
39224         layer
39225             .classed('disabled', false)
39226             .style('opacity', 0)
39227             .transition()
39228             .duration(250)
39229             .style('opacity', 1)
39230             .on('end interrupt', function () {
39231                 dispatch.call('change');
39232             });
39233     }
39234
39235
39236     function hideLayer() {
39237         var layer = context.surface().selectAll('.data-layer-osm');
39238         layer.interrupt();
39239
39240         layer
39241             .transition()
39242             .duration(250)
39243             .style('opacity', 0)
39244             .on('end interrupt', function () {
39245                 layer.classed('disabled', true);
39246                 dispatch.call('change');
39247             });
39248     }
39249
39250
39251     drawOsm.enabled = function(_) {
39252         if (!arguments.length) return enabled;
39253         enabled = _;
39254
39255         if (enabled) {
39256             showLayer();
39257         } else {
39258             hideLayer();
39259         }
39260
39261         dispatch.call('change');
39262         return this;
39263     };
39264
39265
39266     return drawOsm;
39267 }
39268
39269 function refresh(selection, node) {
39270     var cr = node.getBoundingClientRect();
39271     var prop = [cr.width, cr.height];
39272     selection.property('__dimensions__', prop);
39273     return prop;
39274 }
39275
39276 function utilGetDimensions(selection, force) {
39277     if (!selection || selection.empty()) {
39278         return [0, 0];
39279     }
39280     var node = selection.node(),
39281         cached = selection.property('__dimensions__');
39282     return (!cached || force) ? refresh(selection, node) : cached;
39283 }
39284
39285
39286 function utilSetDimensions(selection, dimensions) {
39287     if (!selection || selection.empty()) {
39288         return selection;
39289     }
39290     var node = selection.node();
39291     if (dimensions === null) {
39292         refresh(selection, node);
39293         return selection;
39294     }
39295     return selection
39296         .property('__dimensions__', [dimensions[0], dimensions[1]])
39297         .attr('width', dimensions[0])
39298         .attr('height', dimensions[1]);
39299 }
39300
39301 function svgLayers(projection, context) {
39302     var dispatch$$1 = dispatch('change'),
39303         svg = d3_select(null),
39304         layers = [
39305             { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
39306             { id: 'gpx', layer: svgGpx(projection, context, dispatch$$1) },
39307             { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch$$1) },
39308             { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$$1) },
39309             { id: 'debug', layer: svgDebug(projection, context, dispatch$$1) }
39310         ];
39311
39312
39313     function drawLayers(selection$$1) {
39314         svg = selection$$1.selectAll('.surface')
39315             .data([0]);
39316
39317         svg = svg.enter()
39318             .append('svg')
39319             .attr('class', 'surface')
39320             .merge(svg);
39321
39322         var defs = svg.selectAll('.surface-defs')
39323             .data([0]);
39324
39325         defs.enter()
39326             .append('defs')
39327             .attr('class', 'surface-defs');
39328
39329         var groups = svg.selectAll('.data-layer')
39330             .data(layers);
39331
39332         groups.exit()
39333             .remove();
39334
39335         groups.enter()
39336             .append('g')
39337             .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
39338             .merge(groups)
39339             .each(function(d) { d3_select(this).call(d.layer); });
39340     }
39341
39342
39343     drawLayers.all = function() {
39344         return layers;
39345     };
39346
39347
39348     drawLayers.layer = function(id) {
39349         var obj = find$1(layers, function(o) {return o.id === id;});
39350         return obj && obj.layer;
39351     };
39352
39353
39354     drawLayers.only = function(what) {
39355         var arr = [].concat(what);
39356         drawLayers.remove(difference(map$4(layers, 'id'), arr));
39357         return this;
39358     };
39359
39360
39361     drawLayers.remove = function(what) {
39362         var arr = [].concat(what);
39363         arr.forEach(function(id) {
39364             layers = reject(layers, function(o) {return o.id === id;});
39365         });
39366         dispatch$$1.call('change');
39367         return this;
39368     };
39369
39370
39371     drawLayers.add = function(what) {
39372         var arr = [].concat(what);
39373         arr.forEach(function(obj) {
39374             if ('id' in obj && 'layer' in obj) {
39375                 layers.push(obj);
39376             }
39377         });
39378         dispatch$$1.call('change');
39379         return this;
39380     };
39381
39382
39383     drawLayers.dimensions = function(_) {
39384         if (!arguments.length) return utilGetDimensions(svg);
39385         utilSetDimensions(svg, _);
39386         return this;
39387     };
39388
39389
39390     return utilRebind(drawLayers, dispatch$$1, 'on');
39391 }
39392
39393 function svgLines$$1(projection, context) {
39394     var detected = utilDetect();
39395
39396     var highway_stack = {
39397         motorway: 0,
39398         motorway_link: 1,
39399         trunk: 2,
39400         trunk_link: 3,
39401         primary: 4,
39402         primary_link: 5,
39403         secondary: 6,
39404         tertiary: 7,
39405         unclassified: 8,
39406         residential: 9,
39407         service: 10,
39408         footway: 11
39409     };
39410
39411
39412     function drawLines(selection, graph, entities, filter$$1) {
39413
39414
39415         function waystack(a, b) {
39416             var selected = context.selectedIDs(),
39417                 scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0,
39418                 scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
39419
39420             if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
39421             if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
39422             return scoreA - scoreB;
39423         }
39424
39425
39426         function drawLineGroup(selection, klass, isSelected) {
39427             var lines = selection
39428                 .selectAll('path')
39429                 .filter(filter$$1)
39430                 .data(getPathData(isSelected), osmEntity$$1.key);
39431
39432             lines.exit()
39433                 .remove();
39434
39435             // Optimization: call simple TagClasses only on enter selection. This
39436             // works because osmEntity.key is defined to include the entity v attribute.
39437             lines.enter()
39438                 .append('path')
39439                 .attr('class', function(d) {
39440                     return 'way line ' + klass + ' ' + d.id + (isSelected ? ' selected' : '') +
39441                         (oldMultiPolygonOuters[d.id] ? ' old-multipolygon' : '');
39442                 })
39443                 .call(svgTagClasses())
39444                 .merge(lines)
39445                 .sort(waystack)
39446                 .attr('d', getPath)
39447                 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
39448
39449             return selection;
39450         }
39451
39452
39453         function getPathData(isSelected) {
39454             return function() {
39455                 var layer = this.parentNode.__data__;
39456                 var data = pathdata[layer] || [];
39457                 return data.filter(function(d) {
39458                     if (isSelected)
39459                         return context.selectedIDs().indexOf(d.id) !== -1;
39460                     else
39461                         return context.selectedIDs().indexOf(d.id) === -1;
39462                 });
39463             };
39464         }
39465
39466
39467         var getPath = svgPath(projection, graph),
39468             ways = [],
39469             pathdata = {},
39470             onewaydata = {},
39471             oldMultiPolygonOuters = {};
39472
39473         for (var i = 0; i < entities.length; i++) {
39474             var entity = entities[i],
39475                 outer = osmSimpleMultipolygonOuterMember(entity, graph);
39476             if (outer) {
39477                 ways.push(entity.mergeTags(outer.tags));
39478                 oldMultiPolygonOuters[outer.id] = true;
39479             } else if (entity.geometry(graph) === 'line') {
39480                 ways.push(entity);
39481             }
39482         }
39483
39484         ways = ways.filter(getPath);
39485         pathdata = groupBy(ways, function(way) { return way.layer(); });
39486
39487         forOwn(pathdata, function(v, k) {
39488             var arr = filter(v, function(d) { return d.isOneWay(); });
39489             onewaydata[k] = flatten(map$4(arr, svgOneWaySegments(projection, graph, 35)));
39490         });
39491
39492
39493         var layer = selection.selectAll('.layer-lines');
39494
39495         var layergroup = layer
39496             .selectAll('g.layergroup')
39497             .data(d3_range(-10, 11));
39498
39499         layergroup = layergroup.enter()
39500             .append('g')
39501             .attr('class', function(d) { return 'layergroup layer' + String(d); })
39502             .merge(layergroup);
39503
39504         layergroup
39505             .selectAll('g.linegroup')
39506             .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
39507             .enter()
39508             .append('g')
39509             .attr('class', function(d) { return 'linegroup line-' + d; });
39510
39511
39512         layergroup.selectAll('g.line-shadow')
39513             .call(drawLineGroup, 'shadow', false);
39514         layergroup.selectAll('g.line-casing')
39515             .call(drawLineGroup, 'casing', false);
39516         layergroup.selectAll('g.line-stroke')
39517             .call(drawLineGroup, 'stroke', false);
39518
39519         layergroup.selectAll('g.line-shadow-highlighted')
39520             .call(drawLineGroup, 'shadow', true);
39521         layergroup.selectAll('g.line-casing-highlighted')
39522             .call(drawLineGroup, 'casing', true);
39523         layergroup.selectAll('g.line-stroke-highlighted')
39524             .call(drawLineGroup, 'stroke', true);
39525
39526
39527         var onewaygroup = layergroup
39528             .selectAll('g.onewaygroup')
39529             .data(['oneway']);
39530
39531         onewaygroup = onewaygroup.enter()
39532             .append('g')
39533             .attr('class', 'onewaygroup')
39534             .merge(onewaygroup);
39535
39536         var oneways = onewaygroup
39537             .selectAll('path')
39538             .filter(filter$$1)
39539             .data(
39540                 function() { return onewaydata[this.parentNode.__data__] || []; },
39541                 function(d) { return [d.id, d.index]; }
39542             );
39543
39544         oneways.exit()
39545             .remove();
39546
39547         oneways = oneways.enter()
39548             .append('path')
39549             .attr('class', 'oneway')
39550             .attr('marker-mid', 'url(#oneway-marker)')
39551             .merge(oneways)
39552             .attr('d', function(d) { return d.d; });
39553
39554         if (detected.ie) {
39555             oneways.each(function() { this.parentNode.insertBefore(this, this); });
39556         }
39557     }
39558
39559
39560     return drawLines;
39561 }
39562
39563 function svgMidpoints$$1(projection, context) {
39564
39565     return function drawMidpoints(selection, graph, entities, filter, extent) {
39566         var layer = selection.selectAll('.layer-hit');
39567
39568         var mode = context.mode();
39569         if (mode && mode.id !== 'select') {
39570             layer.selectAll('g.midpoint').remove();
39571             return;
39572         }
39573
39574         var poly = extent.polygon(),
39575             midpoints = {};
39576
39577         for (var i = 0; i < entities.length; i++) {
39578             var entity = entities[i];
39579
39580             if (entity.type !== 'way')
39581                 continue;
39582             if (!filter(entity))
39583                 continue;
39584             if (context.selectedIDs().indexOf(entity.id) < 0)
39585                 continue;
39586
39587             var nodes = graph.childNodes(entity);
39588             for (var j = 0; j < nodes.length - 1; j++) {
39589
39590                 var a = nodes[j],
39591                     b = nodes[j + 1],
39592                     id = [a.id, b.id].sort().join('-');
39593
39594                 if (midpoints[id]) {
39595                     midpoints[id].parents.push(entity);
39596                 } else {
39597                     if (geoEuclideanDistance(projection(a.loc), projection(b.loc)) > 40) {
39598                         var point = geoInterp(a.loc, b.loc, 0.5),
39599                             loc = null;
39600
39601                         if (extent.intersects(point)) {
39602                             loc = point;
39603                         } else {
39604                             for (var k = 0; k < 4; k++) {
39605                                 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
39606                                 if (point &&
39607                                     geoEuclideanDistance(projection(a.loc), projection(point)) > 20 &&
39608                                     geoEuclideanDistance(projection(b.loc), projection(point)) > 20)
39609                                 {
39610                                     loc = point;
39611                                     break;
39612                                 }
39613                             }
39614                         }
39615
39616                         if (loc) {
39617                             midpoints[id] = {
39618                                 type: 'midpoint',
39619                                 id: id,
39620                                 loc: loc,
39621                                 edge: [a.id, b.id],
39622                                 parents: [entity]
39623                             };
39624                         }
39625                     }
39626                 }
39627             }
39628         }
39629
39630
39631         function midpointFilter(d) {
39632             if (midpoints[d.id])
39633                 return true;
39634
39635             for (var i = 0; i < d.parents.length; i++) {
39636                 if (filter(d.parents[i])) {
39637                     return true;
39638                 }
39639             }
39640
39641             return false;
39642         }
39643
39644
39645         var groups = layer
39646             .selectAll('g.midpoint')
39647             .filter(midpointFilter)
39648             .data(values$1(midpoints), function(d) { return d.id; });
39649
39650         groups.exit()
39651             .remove();
39652
39653         var enter = groups.enter()
39654             .insert('g', ':first-child')
39655             .attr('class', 'midpoint');
39656
39657         enter.append('polygon')
39658             .attr('points', '-6,8 10,0 -6,-8')
39659             .attr('class', 'shadow');
39660
39661         enter.append('polygon')
39662             .attr('points', '-3,4 5,0 -3,-4')
39663             .attr('class', 'fill');
39664
39665         groups = groups
39666             .merge(enter)
39667             .attr('transform', function(d) {
39668                 var translate = svgPointTransform(projection),
39669                     a = graph.entity(d.edge[0]),
39670                     b = graph.entity(d.edge[1]),
39671                     angleVal = Math.round(geoAngle(a, b, projection) * (180 / Math.PI));
39672                 return translate(d) + ' rotate(' + angleVal + ')';
39673             })
39674             .call(svgTagClasses().tags(
39675                 function(d) { return d.parents[0].tags; }
39676             ));
39677
39678         // Propagate data bindings.
39679         groups.select('polygon.shadow');
39680         groups.select('polygon.fill');
39681
39682     };
39683 }
39684
39685 function svgOneWaySegments(projection$$1, graph, dt) {
39686     return function(entity) {
39687         var a,
39688             b,
39689             i = 0,
39690             offset = dt,
39691             segments = [],
39692             clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream,
39693             coordinates = graph.childNodes(entity).map(function(n) {
39694                 return n.loc;
39695             });
39696
39697         if (entity.tags.oneway === '-1') coordinates.reverse();
39698
39699         d3_geoStream({
39700             type: 'LineString',
39701             coordinates: coordinates
39702         }, projection$$1.stream(clip({
39703             lineStart: function() {},
39704             lineEnd: function() {
39705                 a = null;
39706             },
39707             point: function(x, y) {
39708                 b = [x, y];
39709
39710                 if (a) {
39711                     var span = geoEuclideanDistance(a, b) - offset;
39712
39713                     if (span >= 0) {
39714                         var angle = Math.atan2(b[1] - a[1], b[0] - a[0]),
39715                             dx = dt * Math.cos(angle),
39716                             dy = dt * Math.sin(angle),
39717                             p = [a[0] + offset * Math.cos(angle),
39718                                  a[1] + offset * Math.sin(angle)];
39719
39720                         var segment = 'M' + a[0] + ',' + a[1] +
39721                                       'L' + p[0] + ',' + p[1];
39722
39723                         for (span -= dt; span >= 0; span -= dt) {
39724                             p[0] += dx;
39725                             p[1] += dy;
39726                             segment += 'L' + p[0] + ',' + p[1];
39727                         }
39728
39729                         segment += 'L' + b[0] + ',' + b[1];
39730                         segments.push({id: entity.id, index: i, d: segment});
39731                     }
39732
39733                     offset = -span;
39734                     i++;
39735                 }
39736
39737                 a = b;
39738             }
39739         })));
39740
39741         return segments;
39742     };
39743 }
39744
39745 function svgPath(projection$$1, graph, isArea) {
39746
39747     // Explanation of magic numbers:
39748     // "padding" here allows space for strokes to extend beyond the viewport,
39749     // so that the stroke isn't drawn along the edge of the viewport when
39750     // the shape is clipped.
39751     //
39752     // When drawing lines, pad viewport by 5px.
39753     // When drawing areas, pad viewport by 65px in each direction to allow
39754     // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
39755
39756     var cache = {},
39757         padding = isArea ? 65 : 5,
39758         viewport = projection$$1.clipExtent(),
39759         paddedExtent = [
39760             [viewport[0][0] - padding, viewport[0][1] - padding],
39761             [viewport[1][0] + padding, viewport[1][1] + padding]
39762         ],
39763         clip = d3_geoIdentity().clipExtent(paddedExtent).stream,
39764         project = projection$$1.stream,
39765         path = d3_geoPath()
39766             .projection({stream: function(output) { return project(clip(output)); }});
39767
39768     return function(entity) {
39769         if (entity.id in cache) {
39770             return cache[entity.id];
39771         } else {
39772             return cache[entity.id] = path(entity.asGeoJSON(graph));
39773         }
39774     };
39775 }
39776
39777 function svgPoints$$1(projection, context) {
39778
39779     function markerPath(selection, klass) {
39780         selection
39781             .attr('class', klass)
39782             .attr('transform', 'translate(-8, -23)')
39783             .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');
39784     }
39785
39786     function sortY(a, b) {
39787         return b.loc[1] - a.loc[1];
39788     }
39789
39790
39791     return function drawPoints(selection, graph, entities, filter$$1) {
39792         var wireframe = context.surface().classed('fill-wireframe'),
39793             points = wireframe ? [] : filter(entities, function(e) {
39794                 return e.geometry(graph) === 'point';
39795             });
39796
39797         points.sort(sortY);
39798
39799         var layer = selection.selectAll('.layer-hit');
39800
39801         var groups = layer.selectAll('g.point')
39802             .filter(filter$$1)
39803             .data(points, osmEntity$$1.key);
39804
39805         groups.exit()
39806             .remove();
39807
39808         var enter = groups.enter()
39809             .append('g')
39810             .attr('class', function(d) { return 'node point ' + d.id; })
39811             .order();
39812
39813         enter.append('path')
39814             .call(markerPath, 'shadow');
39815
39816         enter.append('ellipse')
39817             .attr('cx', 0.5)
39818             .attr('cy', 1)
39819             .attr('rx', 6.5)
39820             .attr('ry', 3)
39821             .attr('class', 'stroke');
39822
39823         enter.append('path')
39824             .call(markerPath, 'stroke');
39825
39826         enter.append('use')
39827             .attr('transform', 'translate(-5, -19)')
39828             .attr('class', 'icon')
39829             .attr('width', '11px')
39830             .attr('height', '11px');
39831
39832         groups = groups
39833             .merge(enter)
39834             .attr('transform', svgPointTransform(projection))
39835             .call(svgTagClasses());
39836
39837         // Selecting the following implicitly
39838         // sets the data (point entity) on the element
39839         groups.select('.shadow');
39840         groups.select('.stroke');
39841         groups.select('.icon')
39842             .attr('xlink:href', function(entity) {
39843                 var preset = context.presets().match(entity, graph),
39844                     picon = preset && preset.icon;
39845
39846                 if (!picon)
39847                     return '';
39848                 else {
39849                     var isMaki = dataFeatureIcons.indexOf(picon) !== -1;
39850                     return '#' + picon + (isMaki ? '-11' : '');
39851                 }
39852             });
39853     };
39854 }
39855
39856 function svgRelationMemberTags(graph) {
39857     return function(entity) {
39858         var tags = entity.tags;
39859         graph.parentRelations(entity).forEach(function(relation) {
39860             var type = relation.tags.type;
39861             if (type === 'multipolygon' || type === 'boundary') {
39862                 tags = assignIn$1({}, relation.tags, tags);
39863             }
39864         });
39865         return tags;
39866     };
39867 }
39868
39869 function svgTagClasses() {
39870     var primaries = [
39871             'building', 'highway', 'railway', 'waterway', 'aeroway',
39872             'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
39873             'leisure', 'military', 'place'
39874         ],
39875         statuses = [
39876             'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
39877             'razed', 'demolished', 'obliterated', 'intermittent'
39878         ],
39879         secondaries = [
39880             'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
39881             'surface', 'tracktype', 'crossing', 'service', 'sport'
39882         ],
39883         tagClassRe = /^tag-/,
39884         tags = function(entity) { return entity.tags; };
39885
39886
39887     var tagClasses = function(selection$$1) {
39888         selection$$1.each(function tagClassesEach(entity) {
39889             var value = this.className,
39890                 classes, primary, status;
39891
39892             if (value.baseVal !== undefined) value = value.baseVal;
39893
39894             classes = value.trim().split(/\s+/).filter(function(name) {
39895                 return name.length && !tagClassRe.test(name);
39896             }).join(' ');
39897
39898             var t = tags(entity), i, k, v;
39899
39900             // pick at most one primary classification tag..
39901             for (i = 0; i < primaries.length; i++) {
39902                 k = primaries[i];
39903                 v = t[k];
39904                 if (!v || v === 'no') continue;
39905
39906                 primary = k;
39907                 if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
39908                     status = v;
39909                     classes += ' tag-' + k;
39910                 } else {
39911                     classes += ' tag-' + k + ' tag-' + k + '-' + v;
39912                 }
39913
39914                 break;
39915             }
39916
39917             // add at most one status tag, only if relates to primary tag..
39918             if (!status) {
39919                 for (i = 0; i < statuses.length; i++) {
39920                     k = statuses[i];
39921                     v = t[k];
39922                     if (!v || v === 'no') continue;
39923
39924                     if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
39925                         status = k;
39926                     }
39927                     else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
39928                         status = k;
39929                     } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
39930                         status = k;
39931                         primary = v;
39932                         classes += ' tag-' + v;
39933                     }  // else ignore e.g.  `highway=path + abandoned=railway`
39934
39935                     if (status) break;
39936                 }
39937             }
39938
39939             if (status) {
39940                 classes += ' tag-status tag-status-' + status;
39941             }
39942
39943             // add any secondary (structure) tags
39944             for (i = 0; i < secondaries.length; i++) {
39945                 k = secondaries[i];
39946                 v = t[k];
39947                 if (!v || v === 'no') continue;
39948                 classes += ' tag-' + k + ' tag-' + k + '-' + v;
39949             }
39950
39951             // For highways, look for surface tagging..
39952             if (primary === 'highway') {
39953                 var paved = (t.highway !== 'track');
39954                 for (k in t) {
39955                     v = t[k];
39956                     if (k in osmPavedTags) {
39957                         paved = !!osmPavedTags[k][v];
39958                         break;
39959                     }
39960                 }
39961                 if (!paved) {
39962                     classes += ' tag-unpaved';
39963                 }
39964             }
39965
39966             classes = classes.trim();
39967
39968             if (classes !== value) {
39969                 d3_select(this).attr('class', classes);
39970             }
39971         });
39972     };
39973
39974
39975     tagClasses.tags = function(_) {
39976         if (!arguments.length) return tags;
39977         tags = _;
39978         return tagClasses;
39979     };
39980
39981     return tagClasses;
39982 }
39983
39984 function svgTurns(projection) {
39985
39986     return function drawTurns(selection, graph, turns) {
39987
39988         function key(turn) {
39989             return [turn.from.node + turn.via.node + turn.to.node].join('-');
39990         }
39991
39992         function icon(turn) {
39993             var u = turn.u ? '-u' : '';
39994             if (!turn.restriction)
39995                 return '#turn-yes' + u;
39996             var restriction = graph.entity(turn.restriction).tags.restriction;
39997             return '#turn-' +
39998                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
39999         }
40000
40001         var groups = selection.selectAll('.layer-hit').selectAll('g.turn')
40002             .data(turns, key);
40003
40004         groups.exit()
40005             .remove();
40006
40007
40008         var enter = groups.enter()
40009             .append('g')
40010             .attr('class', 'turn');
40011
40012         var nEnter = enter
40013             .filter(function (turn) { return !turn.u; });
40014
40015         nEnter.append('rect')
40016             .attr('transform', 'translate(-22, -12)')
40017             .attr('width', '44')
40018             .attr('height', '24');
40019
40020         nEnter.append('use')
40021             .attr('transform', 'translate(-22, -12)')
40022             .attr('width', '44')
40023             .attr('height', '24');
40024
40025
40026         var uEnter = enter
40027             .filter(function (turn) { return turn.u; });
40028
40029         uEnter.append('circle')
40030             .attr('r', '16');
40031
40032         uEnter.append('use')
40033             .attr('transform', 'translate(-16, -16)')
40034             .attr('width', '32')
40035             .attr('height', '32');
40036
40037
40038         groups = groups
40039             .merge(enter);
40040
40041         groups
40042             .attr('transform', function (turn) {
40043                 var v = graph.entity(turn.via.node),
40044                     t = graph.entity(turn.to.node),
40045                     a = geoAngle(v, t, projection),
40046                     p = projection(v.loc),
40047                     r = turn.u ? 0 : 60;
40048
40049                 return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' +
40050                     'rotate(' + a * 180 / Math.PI + ')';
40051             });
40052
40053         groups.select('use')
40054             .attr('xlink:href', icon);
40055
40056         groups.select('rect');
40057         groups.select('circle');
40058
40059         return this;
40060     };
40061 }
40062
40063 function svgVertices$$1(projection, context) {
40064     var radiuses = {
40065         //       z16-, z17, z18+, tagged
40066         shadow: [6,    7.5,   7.5,  11.5],
40067         stroke: [2.5,  3.5,   3.5,  7],
40068         fill:   [1,    1.5,   1.5,  1.5]
40069     };
40070
40071     var hover;
40072
40073
40074     function siblingAndChildVertices(ids, graph, extent) {
40075         var vertices = {};
40076
40077         function addChildVertices(entity) {
40078             if (!context.features().isHiddenFeature(entity, graph, entity.geometry(graph))) {
40079                 var i;
40080                 if (entity.type === 'way') {
40081                     for (i = 0; i < entity.nodes.length; i++) {
40082                         addChildVertices(graph.entity(entity.nodes[i]));
40083                     }
40084                 } else if (entity.type === 'relation') {
40085                     for (i = 0; i < entity.members.length; i++) {
40086                         var member = context.hasEntity(entity.members[i].id);
40087                         if (member) {
40088                             addChildVertices(member);
40089                         }
40090                     }
40091                 } else if (entity.intersects(extent, graph)) {
40092                     vertices[entity.id] = entity;
40093                 }
40094             }
40095         }
40096
40097         ids.forEach(function(id) {
40098             var entity = context.hasEntity(id);
40099             if (entity && entity.type === 'node') {
40100                 vertices[entity.id] = entity;
40101                 context.graph().parentWays(entity).forEach(function(entity) {
40102                     addChildVertices(entity);
40103                 });
40104             } else if (entity) {
40105                 addChildVertices(entity);
40106             }
40107         });
40108
40109         return vertices;
40110     }
40111
40112
40113     function draw(selection, vertices, klass, graph, zoom, siblings) {
40114
40115         function icon(entity) {
40116             if (entity.id in icons) return icons[entity.id];
40117             icons[entity.id] =
40118                 entity.hasInterestingTags() &&
40119                 context.presets().match(entity, graph).icon;
40120             return icons[entity.id];
40121         }
40122
40123         function setClass(klass) {
40124             return function(entity) {
40125                 this.setAttribute('class', 'node vertex ' + klass + ' ' + entity.id);
40126             };
40127         }
40128
40129         function setAttributes(selection) {
40130             ['shadow','stroke','fill'].forEach(function(klass) {
40131                 var rads = radiuses[klass];
40132                 selection.selectAll('.' + klass)
40133                     .each(function(entity) {
40134                         var i = z && icon(entity),
40135                             c = i ? 0.5 : 0,
40136                             r = rads[i ? 3 : z];
40137
40138                         // slightly increase the size of unconnected endpoints #3775
40139                         if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
40140                             r += 1.5;
40141                         }
40142
40143                         this.setAttribute('cx', c);
40144                         this.setAttribute('cy', -c);
40145                         this.setAttribute('r', r);
40146                         if (i && klass === 'fill') {
40147                             this.setAttribute('visibility', 'hidden');
40148                         } else {
40149                             this.removeAttribute('visibility');
40150                         }
40151                     });
40152             });
40153
40154             selection.selectAll('use')
40155                 .each(function() {
40156                     if (z) {
40157                         this.removeAttribute('visibility');
40158                     } else {
40159                         this.setAttribute('visibility', 'hidden');
40160                     }
40161                 });
40162         }
40163
40164
40165         siblings = siblings || {};
40166
40167         var icons = {},
40168             z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
40169
40170         var groups = selection
40171             .data(vertices, osmEntity$$1.key);
40172
40173         groups.exit()
40174             .remove();
40175
40176         var enter = groups.enter()
40177             .append('g')
40178             .attr('class', function(d) { return 'node vertex ' + klass + ' ' + d.id; });
40179
40180         enter.append('circle')
40181             .each(setClass('shadow'));
40182
40183         enter.append('circle')
40184             .each(setClass('stroke'));
40185
40186         // Vertices with icons get a `use`.
40187         enter.filter(function(d) { return icon(d); })
40188             .append('use')
40189             .attr('transform', 'translate(-5, -6)')
40190             .attr('xlink:href', function(d) {
40191                 var picon = icon(d),
40192                     isMaki = dataFeatureIcons.indexOf(picon) !== -1;
40193                 return '#' + picon + (isMaki ? '-11' : '');
40194             })
40195             .attr('width', '11px')
40196             .attr('height', '11px')
40197             .each(setClass('icon'));
40198
40199         // Vertices with tags get a fill.
40200         enter.filter(function(d) { return d.hasInterestingTags(); })
40201             .append('circle')
40202             .each(setClass('fill'));
40203
40204         groups
40205             .merge(enter)
40206             .attr('transform', svgPointTransform(projection))
40207             .classed('sibling', function(entity) { return entity.id in siblings; })
40208             .classed('shared', function(entity) { return graph.isShared(entity); })
40209             .classed('endpoint', function(entity) { return entity.isEndpoint(graph); })
40210             .call(setAttributes);
40211     }
40212
40213
40214     function drawVertices(selection, graph, entities, filter, extent, zoom) {
40215         var siblings = siblingAndChildVertices(context.selectedIDs(), graph, extent),
40216             wireframe = context.surface().classed('fill-wireframe'),
40217             vertices = [];
40218
40219         for (var i = 0; i < entities.length; i++) {
40220             var entity = entities[i],
40221                 geometry = entity.geometry(graph);
40222
40223             if (wireframe && geometry === 'point') {
40224                 vertices.push(entity);
40225                 continue;
40226             }
40227
40228             if (geometry !== 'vertex')
40229                 continue;
40230
40231             if (entity.id in siblings ||
40232                 entity.hasInterestingTags() ||
40233                 entity.isEndpoint(graph) ||
40234                 entity.isConnected(graph)) {
40235                 vertices.push(entity);
40236             }
40237         }
40238
40239         var layer = selection.selectAll('.layer-hit');
40240         layer.selectAll('g.vertex.vertex-persistent')
40241             .filter(filter)
40242             .call(draw, vertices, 'vertex-persistent', graph, zoom, siblings);
40243
40244         drawHover(selection, graph, extent, zoom);
40245     }
40246
40247
40248     function drawHover(selection, graph, extent, zoom) {
40249         var hovered = hover ? siblingAndChildVertices([hover.id], graph, extent) : {};
40250         var layer = selection.selectAll('.layer-hit');
40251
40252         layer.selectAll('g.vertex.vertex-hover')
40253             .call(draw, values$1(hovered), 'vertex-hover', graph, zoom);
40254     }
40255
40256
40257     drawVertices.drawHover = function(selection, graph, target, extent, zoom) {
40258         if (target === hover) return;
40259         hover = target;
40260         drawHover(selection, graph, extent, zoom);
40261     };
40262
40263     return drawVertices;
40264 }
40265
40266 function behaviorEdit(context) {
40267
40268     function edit() {
40269         context.map()
40270             .minzoom(context.minEditableZoom());
40271     }
40272
40273
40274     edit.off = function() {
40275         context.map()
40276             .minzoom(0);
40277     };
40278
40279
40280     return edit;
40281 }
40282
40283 /*
40284    The hover behavior adds the `.hover` class on mouseover to all elements to which
40285    the identical datum is bound, and removes it on mouseout.
40286
40287    The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
40288    representation may consist of several elements scattered throughout the DOM hierarchy.
40289    Only one of these elements can have the :hover pseudo-class, but all of them will
40290    have the .hover class.
40291  */
40292 function behaviorHover(context) {
40293     var dispatch$$1 = dispatch('hover'),
40294         _selection = d3_select(null),
40295         newId = null,
40296         buttonDown,
40297         altDisables,
40298         target;
40299
40300
40301     function keydown() {
40302         if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
40303             _selection.selectAll('.hover')
40304                 .classed('hover-suppressed', true)
40305                 .classed('hover', false);
40306
40307             _selection
40308                 .classed('hover-disabled', true);
40309
40310             dispatch$$1.call('hover', this, null);
40311         }
40312     }
40313
40314
40315     function keyup() {
40316         if (altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
40317             _selection.selectAll('.hover-suppressed')
40318                 .classed('hover-suppressed', false)
40319                 .classed('hover', true);
40320
40321             _selection
40322                 .classed('hover-disabled', false);
40323
40324             dispatch$$1.call('hover', this, target ? target.id : null);
40325         }
40326     }
40327
40328
40329     var hover = function(selection$$1) {
40330         _selection = selection$$1;
40331         newId = null;
40332
40333         _selection
40334             .on('mouseover.hover', mouseover)
40335             .on('mouseout.hover', mouseout)
40336             .on('mousedown.hover', mousedown);
40337
40338         d3_select(window)
40339             .on('keydown.hover', keydown)
40340             .on('keyup.hover', keyup);
40341
40342
40343         function mouseover() {
40344             if (buttonDown) return;
40345             var target = event.target;
40346             enter(target ? target.__data__ : null);
40347         }
40348
40349
40350         function mouseout() {
40351             if (buttonDown) return;
40352             var target = event.relatedTarget;
40353             enter(target ? target.__data__ : null);
40354         }
40355
40356
40357         function mousedown() {
40358             buttonDown = true;
40359             d3_select(window)
40360                 .on('mouseup.hover', mouseup, true);
40361         }
40362
40363
40364         function mouseup() {
40365             buttonDown = false;
40366             d3_select(window)
40367                 .on('mouseup.hover', null, true);
40368         }
40369
40370
40371         function enter(d) {
40372             if (d === target) return;
40373             target = d;
40374
40375             _selection.selectAll('.hover')
40376                 .classed('hover', false);
40377             _selection.selectAll('.hover-suppressed')
40378                 .classed('hover-suppressed', false);
40379
40380             if (target instanceof osmEntity$$1 && target.id !== newId) {
40381
40382                 // If drawing a way, don't hover on a node that was just placed. #3974
40383                 var mode = context.mode() && context.mode().id;
40384                 if ((mode === 'draw-line' || mode === 'draw-area') && !newId && target.type === 'node') {
40385                     newId = target.id;
40386                     return;
40387                 }
40388
40389                 var selector$$1 = '.' + target.id;
40390
40391                 if (target.type === 'relation') {
40392                     target.members.forEach(function(member) {
40393                         selector$$1 += ', .' + member.id;
40394                     });
40395                 }
40396
40397                 var suppressed = altDisables && event && event.altKey;
40398
40399                 _selection.selectAll(selector$$1)
40400                     .classed(suppressed ? 'hover-suppressed' : 'hover', true);
40401
40402                 dispatch$$1.call('hover', this, !suppressed && target.id);
40403
40404             } else {
40405                 dispatch$$1.call('hover', this, null);
40406             }
40407         }
40408
40409     };
40410
40411
40412     hover.off = function(selection$$1) {
40413         selection$$1.selectAll('.hover')
40414             .classed('hover', false);
40415         selection$$1.selectAll('.hover-suppressed')
40416             .classed('hover-suppressed', false);
40417         selection$$1
40418             .classed('hover-disabled', false);
40419
40420
40421         selection$$1
40422             .on('mouseover.hover', null)
40423             .on('mouseout.hover', null)
40424             .on('mousedown.hover', null);
40425
40426         d3_select(window)
40427             .on('keydown.hover', null)
40428             .on('keyup.hover', null);
40429     };
40430
40431
40432     hover.altDisables = function(_) {
40433         if (!arguments.length) return altDisables;
40434         altDisables = _;
40435         return hover;
40436     };
40437
40438
40439     return utilRebind(hover, dispatch$$1, 'on');
40440 }
40441
40442 function behaviorTail() {
40443     var text,
40444         container,
40445         xmargin = 25,
40446         tooltipSize = [0, 0],
40447         selectionSize = [0, 0];
40448
40449
40450     function tail(selection$$1) {
40451         if (!text) return;
40452
40453         d3_select(window)
40454             .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
40455
40456         container = d3_select(document.body)
40457             .append('div')
40458             .style('display', 'none')
40459             .attr('class', 'tail tooltip-inner');
40460
40461         container.append('div')
40462             .text(text);
40463
40464         selection$$1
40465             .on('mousemove.tail', mousemove)
40466             .on('mouseenter.tail', mouseenter)
40467             .on('mouseleave.tail', mouseleave);
40468
40469         container
40470             .on('mousemove.tail', mousemove);
40471
40472         tooltipSize = utilGetDimensions(container);
40473         selectionSize = utilGetDimensions(selection$$1);
40474
40475
40476         function show() {
40477             container.style('display', 'block');
40478             tooltipSize = utilGetDimensions(container);
40479         }
40480
40481
40482         function mousemove() {
40483             if (container.style('display') === 'none') show();
40484             var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
40485                 -tooltipSize[0] - xmargin : xmargin;
40486             container.classed('left', xoffset > 0);
40487             utilSetTransform(container, event.clientX + xoffset, event.clientY);
40488         }
40489
40490
40491         function mouseleave() {
40492             if (event.relatedTarget !== container.node()) {
40493                 container.style('display', 'none');
40494             }
40495         }
40496
40497
40498         function mouseenter() {
40499             if (event.relatedTarget !== container.node()) {
40500                 show();
40501             }
40502         }
40503     }
40504
40505
40506     tail.off = function(selection$$1) {
40507         if (!text) return;
40508
40509         container
40510             .on('mousemove.tail', null)
40511             .remove();
40512
40513         selection$$1
40514             .on('mousemove.tail', null)
40515             .on('mouseenter.tail', null)
40516             .on('mouseleave.tail', null);
40517
40518         d3_select(window)
40519             .on('resize.tail', null);
40520     };
40521
40522
40523     tail.text = function(_) {
40524         if (!arguments.length) return text;
40525         text = _;
40526         return tail;
40527     };
40528
40529
40530     return tail;
40531 }
40532
40533 var usedTails = {};
40534 var disableSpace = false;
40535 var lastSpace = null;
40536
40537
40538 function behaviorDraw(context) {
40539     var dispatch$$1 = dispatch('move', 'click', 'clickWay',
40540             'clickNode', 'undo', 'cancel', 'finish'),
40541         keybinding = d3keybinding('draw'),
40542         hover = behaviorHover(context)
40543             .altDisables(true)
40544             .on('hover', context.ui().sidebar.hover),
40545         tail = behaviorTail(),
40546         edit = behaviorEdit(context),
40547         closeTolerance = 4,
40548         tolerance = 12,
40549         mouseLeave = false,
40550         lastMouse = null;
40551
40552
40553     function datum() {
40554         if (event.altKey) return {};
40555
40556         if (event.type === 'keydown') {
40557             return (lastMouse && lastMouse.target.__data__) || {};
40558         } else {
40559             return event.target.__data__ || {};
40560         }
40561     }
40562
40563
40564     function mousedown() {
40565
40566         function point() {
40567             var p = context.container().node();
40568             return touchId !== null ? d3_touches(p).filter(function(p) {
40569                 return p.identifier === touchId;
40570             })[0] : d3_mouse(p);
40571         }
40572
40573         var element = d3_select(this),
40574             touchId = event.touches ? event.changedTouches[0].identifier : null,
40575             t1 = +new Date(),
40576             p1 = point();
40577
40578         element.on('mousemove.draw', null);
40579
40580         d3_select(window).on('mouseup.draw', function() {
40581             var t2 = +new Date(),
40582                 p2 = point(),
40583                 dist = geoEuclideanDistance(p1, p2);
40584
40585             element.on('mousemove.draw', mousemove);
40586             d3_select(window).on('mouseup.draw', null);
40587
40588             if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
40589                 // Prevent a quick second click
40590                 d3_select(window).on('click.draw-block', function() {
40591                     event.stopPropagation();
40592                 }, true);
40593
40594                 context.map().dblclickEnable(false);
40595
40596                 window.setTimeout(function() {
40597                     context.map().dblclickEnable(true);
40598                     d3_select(window).on('click.draw-block', null);
40599                 }, 500);
40600
40601                 click();
40602             }
40603         }, true);
40604     }
40605
40606
40607     function mousemove() {
40608         lastMouse = event;
40609         dispatch$$1.call('move', this, datum());
40610     }
40611
40612
40613     function mouseenter() {
40614         mouseLeave = false;
40615     }
40616
40617
40618     function mouseleave() {
40619         mouseLeave = true;
40620     }
40621
40622
40623     function click() {
40624         var d = datum();
40625         if (d.type === 'way') {
40626             var dims = context.map().dimensions(),
40627                 mouse = context.mouse(),
40628                 pad = 5,
40629                 trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
40630                     mouse[1] > pad && mouse[1] < dims[1] - pad;
40631
40632             if (trySnap) {
40633                 var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection),
40634                     edge = [d.nodes[choice.index - 1], d.nodes[choice.index]];
40635                 dispatch$$1.call('clickWay', this, choice.loc, edge);
40636             } else {
40637                 dispatch$$1.call('click', this, context.map().mouseCoordinates());
40638             }
40639
40640         } else if (d.type === 'node') {
40641             dispatch$$1.call('clickNode', this, d);
40642
40643         } else {
40644             dispatch$$1.call('click', this, context.map().mouseCoordinates());
40645         }
40646     }
40647
40648
40649     function space() {
40650         event.preventDefault();
40651         event.stopPropagation();
40652
40653         var currSpace = context.mouse();
40654         if (disableSpace && lastSpace) {
40655             var dist = geoEuclideanDistance(lastSpace, currSpace);
40656             if (dist > tolerance) {
40657                 disableSpace = false;
40658             }
40659         }
40660
40661         if (disableSpace || mouseLeave || !lastMouse) return;
40662
40663         // user must move mouse or release space bar to allow another click
40664         lastSpace = currSpace;
40665         disableSpace = true;
40666
40667         d3_select(window).on('keyup.space-block', function() {
40668             event.preventDefault();
40669             event.stopPropagation();
40670             disableSpace = false;
40671             d3_select(window).on('keyup.space-block', null);
40672         });
40673
40674         click();
40675     }
40676
40677
40678     function backspace() {
40679         event.preventDefault();
40680         dispatch$$1.call('undo');
40681     }
40682
40683
40684     function del() {
40685         event.preventDefault();
40686         dispatch$$1.call('cancel');
40687     }
40688
40689
40690     function ret() {
40691         event.preventDefault();
40692         dispatch$$1.call('finish');
40693     }
40694
40695
40696     function draw(selection$$1) {
40697         context.install(hover);
40698         context.install(edit);
40699
40700         if (!context.inIntro() && !usedTails[tail.text()]) {
40701             context.install(tail);
40702         }
40703
40704         keybinding
40705             .on('⌫', backspace)
40706             .on('⌦', del)
40707             .on('⎋', ret)
40708             .on('↩', ret)
40709             .on('space', space)
40710             .on('⌥space', space);
40711
40712         selection$$1
40713             .on('mouseenter.draw', mouseenter)
40714             .on('mouseleave.draw', mouseleave)
40715             .on('mousedown.draw', mousedown)
40716             .on('mousemove.draw', mousemove);
40717
40718         d3_select(document)
40719             .call(keybinding);
40720
40721         return draw;
40722     }
40723
40724
40725     draw.off = function(selection$$1) {
40726         context.ui().sidebar.hover.cancel();
40727         context.uninstall(hover);
40728         context.uninstall(edit);
40729
40730         if (!context.inIntro() && !usedTails[tail.text()]) {
40731             context.uninstall(tail);
40732             usedTails[tail.text()] = true;
40733         }
40734
40735         selection$$1
40736             .on('mouseenter.draw', null)
40737             .on('mouseleave.draw', null)
40738             .on('mousedown.draw', null)
40739             .on('mousemove.draw', null);
40740
40741         d3_select(window)
40742             .on('mouseup.draw', null);
40743             // note: keyup.space-block, click.draw-block should remain
40744
40745         d3_select(document)
40746             .call(keybinding.off);
40747     };
40748
40749
40750     draw.tail = function(_) {
40751         tail.text(_);
40752         return draw;
40753     };
40754
40755
40756     return utilRebind(draw, dispatch$$1, 'on');
40757 }
40758
40759 function behaviorAddWay(context) {
40760     var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
40761         draw = behaviorDraw(context);
40762
40763     var addWay = function(surface) {
40764         draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
40765             .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
40766             .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
40767             .on('cancel', addWay.cancel)
40768             .on('finish', addWay.cancel);
40769
40770         context.map()
40771             .dblclickEnable(false);
40772
40773         surface.call(draw);
40774     };
40775
40776
40777     addWay.off = function(surface) {
40778         surface.call(draw.off);
40779     };
40780
40781
40782     addWay.cancel = function() {
40783         window.setTimeout(function() {
40784             context.map().dblclickEnable(true);
40785         }, 1000);
40786
40787         context.enter(modeBrowse(context));
40788     };
40789
40790
40791     addWay.tail = function(text) {
40792         draw.tail(text);
40793         return addWay;
40794     };
40795
40796
40797     return utilRebind(addWay, dispatch$$1, 'on');
40798 }
40799
40800 function behaviorBreathe() {
40801     var duration = 800,
40802         steps = 4,
40803         selector$$1 = '.selected.shadow, .selected .shadow',
40804         selected = d3_select(null),
40805         classed = '',
40806         params = {},
40807         done = false,
40808         timer$$1;
40809
40810
40811     function ratchetyInterpolator(a, b, steps, units) {
40812         a = parseFloat(a);
40813         b = parseFloat(b);
40814         var sample = quantize()
40815             .domain([0, 1])
40816             .range(d3_quantize(d3_interpolateNumber(a, b), steps));
40817
40818         return function(t) {
40819             return String(sample(t)) + (units || '');
40820         };
40821     }
40822
40823
40824     function reset(selection$$1) {
40825         selection$$1
40826             .style('stroke-opacity', null)
40827             .style('stroke-width', null)
40828             .style('fill-opacity', null)
40829             .style('r', null);
40830     }
40831
40832
40833     function setAnimationParams(transition, fromTo) {
40834         var toFrom = (fromTo === 'from' ? 'to' : 'from');
40835
40836         transition
40837             .styleTween('stroke-opacity', function(d) {
40838                 return ratchetyInterpolator(
40839                     params[d.id][toFrom].opacity,
40840                     params[d.id][fromTo].opacity,
40841                     steps
40842                 );
40843             })
40844             .styleTween('stroke-width', function(d) {
40845                 return ratchetyInterpolator(
40846                     params[d.id][toFrom].width,
40847                     params[d.id][fromTo].width,
40848                     steps,
40849                     'px'
40850                 );
40851             })
40852             .styleTween('fill-opacity', function(d) {
40853                 return ratchetyInterpolator(
40854                     params[d.id][toFrom].opacity,
40855                     params[d.id][fromTo].opacity,
40856                     steps
40857                 );
40858             })
40859             .styleTween('r', function(d) {
40860                 return ratchetyInterpolator(
40861                     params[d.id][toFrom].width,
40862                     params[d.id][fromTo].width,
40863                     steps,
40864                     'px'
40865                 );
40866             });
40867     }
40868
40869
40870     function calcAnimationParams(selection$$1) {
40871         selection$$1
40872             .call(reset)
40873             .each(function(d) {
40874                 var s = d3_select(this),
40875                     tag = s.node().tagName,
40876                     p = {'from': {}, 'to': {}},
40877                     opacity, width;
40878
40879                 // determine base opacity and width
40880                 if (tag === 'circle') {
40881                     opacity = parseFloat(s.style('fill-opacity') || 0.5);
40882                     width = parseFloat(s.style('r') || 15.5);
40883                 } else {
40884                     opacity = parseFloat(s.style('stroke-opacity') || 0.7);
40885                     width = parseFloat(s.style('stroke-width') || 10);
40886                 }
40887
40888                 // calculate from/to interpolation params..
40889                 p.tag = tag;
40890                 p.from.opacity = opacity * 0.6;
40891                 p.to.opacity = opacity * 1.25;
40892                 p.from.width = width * 0.7;
40893                 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
40894                 params[d.id] = p;
40895             });
40896     }
40897
40898
40899     function run(surface, fromTo) {
40900         var toFrom = (fromTo === 'from' ? 'to' : 'from'),
40901             currSelected = surface.selectAll(selector$$1),
40902             currClassed = surface.attr('class');
40903
40904         if (done || currSelected.empty()) {
40905             selected.call(reset);
40906             return;
40907         }
40908
40909         if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
40910             selected.call(reset);
40911             classed = currClassed;
40912             selected = currSelected.call(calcAnimationParams);
40913         }
40914
40915         selected
40916             .transition()
40917             .duration(duration)
40918             .call(setAnimationParams, fromTo)
40919             .on('end', function() {
40920                 surface.call(run, toFrom);
40921             });
40922     }
40923
40924
40925     var breathe = function(surface) {
40926         done = false;
40927         timer$$1 = timer(function() {
40928             // wait for elements to actually become selected
40929             if (surface.selectAll(selector$$1).empty()) {
40930                 return false;
40931             }
40932
40933             surface.call(run, 'from');
40934             timer$$1.stop();
40935             return true;
40936         }, 20);
40937     };
40938
40939
40940     breathe.off = function() {
40941         done = true;
40942         if (timer$$1) {
40943             timer$$1.stop();
40944         }
40945         selected
40946             .interrupt()
40947             .call(reset);
40948     };
40949
40950
40951     return breathe;
40952 }
40953
40954 function behaviorCopy(context) {
40955     var keybinding = d3keybinding('copy');
40956
40957
40958     function groupEntities(ids, graph) {
40959         var entities = ids.map(function (id) { return graph.entity(id); });
40960         return assignIn$1({relation: [], way: [], node: []},
40961             groupBy(entities, function(entity) { return entity.type; }));
40962     }
40963
40964
40965     function getDescendants(id, graph, descendants) {
40966         var entity = graph.entity(id),
40967             i, children;
40968
40969         descendants = descendants || {};
40970
40971         if (entity.type === 'relation') {
40972             children = map$4(entity.members, 'id');
40973         } else if (entity.type === 'way') {
40974             children = entity.nodes;
40975         } else {
40976             children = [];
40977         }
40978
40979         for (i = 0; i < children.length; i++) {
40980             if (!descendants[children[i]]) {
40981                 descendants[children[i]] = true;
40982                 descendants = getDescendants(children[i], graph, descendants);
40983             }
40984         }
40985
40986         return descendants;
40987     }
40988
40989
40990     function doCopy() {
40991         event.preventDefault();
40992
40993         var graph = context.graph(),
40994             selected = groupEntities(context.selectedIDs(), graph),
40995             canCopy = [],
40996             skip = {},
40997             i, entity;
40998
40999         for (i = 0; i < selected.relation.length; i++) {
41000             entity = selected.relation[i];
41001             if (!skip[entity.id] && entity.isComplete(graph)) {
41002                 canCopy.push(entity.id);
41003                 skip = getDescendants(entity.id, graph, skip);
41004             }
41005         }
41006         for (i = 0; i < selected.way.length; i++) {
41007             entity = selected.way[i];
41008             if (!skip[entity.id]) {
41009                 canCopy.push(entity.id);
41010                 skip = getDescendants(entity.id, graph, skip);
41011             }
41012         }
41013         for (i = 0; i < selected.node.length; i++) {
41014             entity = selected.node[i];
41015             if (!skip[entity.id]) {
41016                 canCopy.push(entity.id);
41017             }
41018         }
41019
41020         context.copyIDs(canCopy);
41021     }
41022
41023
41024     function copy() {
41025         keybinding.on(uiCmd('⌘C'), doCopy);
41026         d3_select(document).call(keybinding);
41027         return copy;
41028     }
41029
41030
41031     copy.off = function() {
41032         d3_select(document).call(keybinding.off);
41033     };
41034
41035
41036     return copy;
41037 }
41038
41039 /*
41040     `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
41041
41042     * The `origin` function is expected to return an [x, y] tuple rather than an
41043       {x, y} object.
41044     * The events are `start`, `move`, and `end`.
41045       (https://github.com/mbostock/d3/issues/563)
41046     * The `start` event is not dispatched until the first cursor movement occurs.
41047       (https://github.com/mbostock/d3/pull/368)
41048     * The `move` event has a `point` and `delta` [x, y] tuple properties rather
41049       than `x`, `y`, `dx`, and `dy` properties.
41050     * The `end` event is not dispatched if no movement occurs.
41051     * An `off` function is available that unbinds the drag's internal event handlers.
41052  */
41053
41054 function behaviorDrag() {
41055     var event$$1 = dispatch('start', 'move', 'end'),
41056         origin = null,
41057         selector$$1 = '',
41058         filter = null,
41059         event_, target, surface;
41060
41061
41062     var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect'),
41063         d3_event_userSelectSuppress = function() {
41064             var selection$$1 = selection(),
41065                 select = selection$$1.style(d3_event_userSelectProperty);
41066             selection$$1.style(d3_event_userSelectProperty, 'none');
41067             return function() {
41068                 selection$$1.style(d3_event_userSelectProperty, select);
41069             };
41070         };
41071
41072
41073     function d3_eventCancel() {
41074         event.stopPropagation();
41075         event.preventDefault();
41076     }
41077
41078
41079     function eventOf(thiz, argumentz) {
41080         return function(e1) {
41081             e1.target = drag;
41082             customEvent(e1, event$$1.apply, event$$1, [e1.type, thiz, argumentz]);
41083         };
41084     }
41085
41086
41087     function dragstart() {
41088         target = this;
41089         event_ = eventOf(target, arguments);
41090
41091         var eventTarget = event.target,
41092             touchId = event.touches ? event.changedTouches[0].identifier : null,
41093             offset,
41094             origin_ = point(),
41095             started = false,
41096             selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
41097
41098         d3_select(window)
41099             .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
41100             .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
41101
41102         if (origin) {
41103             offset = origin.apply(target, arguments);
41104             offset = [offset[0] - origin_[0], offset[1] - origin_[1]];
41105         } else {
41106             offset = [0, 0];
41107         }
41108
41109         if (touchId === null) {
41110             event.stopPropagation();
41111         }
41112
41113
41114         function point() {
41115             var p = surface || target.parentNode;
41116             return touchId !== null ? d3_touches(p).filter(function(p) {
41117                 return p.identifier === touchId;
41118             })[0] : d3_mouse(p);
41119         }
41120
41121
41122         function dragmove() {
41123             var p = point(),
41124                 dx = p[0] - origin_[0],
41125                 dy = p[1] - origin_[1];
41126
41127             if (dx === 0 && dy === 0)
41128                 return;
41129
41130             if (!started) {
41131                 started = true;
41132                 event_({ type: 'start' });
41133             }
41134
41135             origin_ = p;
41136             d3_eventCancel();
41137
41138             event_({
41139                 type: 'move',
41140                 point: [p[0] + offset[0],  p[1] + offset[1]],
41141                 delta: [dx, dy]
41142             });
41143         }
41144
41145
41146         function dragend() {
41147             if (started) {
41148                 event_({ type: 'end' });
41149
41150                 d3_eventCancel();
41151                 if (event.target === eventTarget) {
41152                     d3_select(window)
41153                         .on('click.drag', click, true);
41154                 }
41155             }
41156
41157             d3_select(window)
41158                 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
41159                 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
41160
41161             selectEnable();
41162         }
41163
41164
41165         function click() {
41166             d3_eventCancel();
41167             d3_select(window)
41168                 .on('click.drag', null);
41169         }
41170     }
41171
41172
41173     function drag(selection$$1) {
41174         var matchesSelector = utilPrefixDOMProperty('matchesSelector'),
41175             delegate = dragstart;
41176
41177         if (selector$$1) {
41178             delegate = function() {
41179                 var root = this,
41180                     target = event.target;
41181                 for (; target && target !== root; target = target.parentNode) {
41182                     if (target[matchesSelector](selector$$1) &&
41183                             (!filter || filter(target.__data__))) {
41184                         return dragstart.call(target, target.__data__);
41185                     }
41186                 }
41187             };
41188         }
41189
41190         selection$$1
41191             .on('mousedown.drag' + selector$$1, delegate)
41192             .on('touchstart.drag' + selector$$1, delegate);
41193     }
41194
41195
41196     drag.off = function(selection$$1) {
41197         selection$$1
41198             .on('mousedown.drag' + selector$$1, null)
41199             .on('touchstart.drag' + selector$$1, null);
41200     };
41201
41202
41203     drag.selector = function(_) {
41204         if (!arguments.length) return selector$$1;
41205         selector$$1 = _;
41206         return drag;
41207     };
41208
41209
41210     drag.filter = function(_) {
41211         if (!arguments.length) return origin;
41212         filter = _;
41213         return drag;
41214     };
41215
41216
41217     drag.origin = function (_) {
41218         if (!arguments.length) return origin;
41219         origin = _;
41220         return drag;
41221     };
41222
41223
41224     drag.cancel = function() {
41225         d3_select(window)
41226             .on('mousemove.drag', null)
41227             .on('mouseup.drag', null);
41228         return drag;
41229     };
41230
41231
41232     drag.target = function() {
41233         if (!arguments.length) return target;
41234         target = arguments[0];
41235         event_ = eventOf(target, Array.prototype.slice.call(arguments, 1));
41236         return drag;
41237     };
41238
41239
41240     drag.surface = function() {
41241         if (!arguments.length) return surface;
41242         surface = arguments[0];
41243         return drag;
41244     };
41245
41246
41247     return utilRebind(drag, event$$1, 'on');
41248 }
41249
41250 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
41251
41252     var origWay = context.entity(wayId),
41253         isArea = context.geometry(wayId) === 'area',
41254         tempEdits = 0,
41255         annotation = t((origWay.isDegenerate() ?
41256             'operations.start.annotation.' :
41257             'operations.continue.annotation.') + context.geometry(wayId)),
41258         draw = behaviorDraw(context),
41259         startIndex,
41260         start,
41261         end,
41262         segment;
41263
41264
41265     // initialize the temporary drawing entities
41266     if (!isArea) {
41267         startIndex = typeof index === 'undefined' ? origWay.nodes.length - 1 : 0;
41268         start = osmNode({ id: 'nStart', loc: context.entity(origWay.nodes[startIndex]).loc });
41269         end = osmNode({ id: 'nEnd', loc: context.map().mouseCoordinates() });
41270         segment = osmWay({ id: 'wTemp',
41271             nodes: typeof index === 'undefined' ? [start.id, end.id] : [end.id, start.id],
41272             tags: clone(origWay.tags)
41273         });
41274     } else {
41275         end = osmNode({ loc: context.map().mouseCoordinates() });
41276     }
41277
41278     // Push an annotated state for undo to return back to.
41279     // We must make sure to remove this edit later.
41280     context.perform(actionNoop(), annotation);
41281     tempEdits++;
41282
41283     // Add the temporary drawing entities to the graph.
41284     // We must make sure to remove this edit later.
41285     context.perform(AddDrawEntities());
41286     tempEdits++;
41287
41288
41289     function move(datum) {
41290         var loc;
41291
41292         if (datum.type === 'node' && datum.id !== end.id) {
41293             loc = datum.loc;
41294
41295         } else if (datum.type === 'way') {
41296             var dims = context.map().dimensions(),
41297                 mouse = context.mouse(),
41298                 pad = 5,
41299                 trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad &&
41300                     mouse[1] > pad && mouse[1] < dims[1] - pad;
41301
41302             if (trySnap) {
41303                 loc = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc;
41304             }
41305         }
41306
41307         if (!loc) {
41308             loc = context.map().mouseCoordinates();
41309         }
41310
41311         context.replace(actionMoveNode(end.id, loc));
41312         end = context.entity(end.id);
41313     }
41314
41315
41316     function undone() {
41317         // Undo popped the history back to the initial annotated no-op edit.
41318         // Remove initial no-op edit and whatever edit happened immediately before it.
41319         context.pop(2);
41320         tempEdits = 0;
41321
41322         if (context.hasEntity(wayId)) {
41323             context.enter(mode);
41324         } else {
41325             context.enter(modeBrowse(context));
41326         }
41327     }
41328
41329
41330     function setActiveElements() {
41331         var active = isArea ? [wayId, end.id] : [segment.id, start.id, end.id];
41332         context.surface().selectAll(utilEntitySelector(active))
41333             .classed('active', true);
41334     }
41335
41336
41337     var drawWay = function(surface) {
41338         draw.on('move', move)
41339             .on('click', drawWay.add)
41340             .on('clickWay', drawWay.addWay)
41341             .on('clickNode', drawWay.addNode)
41342             .on('undo', context.undo)
41343             .on('cancel', drawWay.cancel)
41344             .on('finish', drawWay.finish);
41345
41346         context.map()
41347             .dblclickEnable(false)
41348             .on('drawn.draw', setActiveElements);
41349
41350         setActiveElements();
41351
41352         surface.call(draw);
41353
41354         context.history()
41355             .on('undone.draw', undone);
41356     };
41357
41358
41359     drawWay.off = function(surface) {
41360         // Drawing was interrupted unexpectedly.
41361         // This can happen if the user changes modes,
41362         // clicks geolocate button, a hashchange event occurs, etc.
41363         if (tempEdits) {
41364             context.pop(tempEdits);
41365             while (context.graph() !== startGraph) {
41366                 context.pop();
41367             }
41368         }
41369
41370         context.map()
41371             .on('drawn.draw', null);
41372
41373         surface.call(draw.off)
41374             .selectAll('.active')
41375             .classed('active', false);
41376
41377         context.history()
41378             .on('undone.draw', null);
41379     };
41380
41381
41382     function AddDrawEntities() {
41383         return function(graph) {
41384             if (isArea) {
41385                 // For area drawing, there is no need for a temporary node.
41386                 // `end` gets inserted into the way as the penultimate node.
41387                 return graph
41388                     .replace(end)
41389                     .replace(origWay.addNode(end.id));
41390             } else {
41391                 // For line drawing, add a temporary start, end, and segment to the graph.
41392                 // This allows us to class the new segment as `active`, but still
41393                 // connect it back to parts of the way that have already been drawn.
41394                 return graph
41395                     .replace(start)
41396                     .replace(end)
41397                     .replace(segment);
41398             }
41399         };
41400     }
41401
41402
41403     function ReplaceDrawEntities(newNode) {
41404         return function(graph) {
41405             if (isArea) {
41406                 // For area drawing, we didn't create a temporary node.
41407                 // `newNode` gets inserted into the _original_ way as the penultimate node.
41408                 return graph
41409                     .replace(origWay.addNode(newNode.id))
41410                     .remove(end);
41411             } else {
41412                 // For line drawing, add the `newNode` to the way at specified index,
41413                 // and remove the temporary start, end, and segment.
41414                 return graph
41415                     .replace(origWay.addNode(newNode.id, index))
41416                     .remove(end)
41417                     .remove(segment)
41418                     .remove(start);
41419             }
41420         };
41421     }
41422
41423
41424     // Accept the current position of the temporary node and continue drawing.
41425     drawWay.add = function(loc) {
41426         // prevent duplicate nodes
41427         var last = context.hasEntity(origWay.nodes[origWay.nodes.length - (isArea ? 2 : 1)]);
41428         if (last && last.loc[0] === loc[0] && last.loc[1] === loc[1]) return;
41429
41430         context.pop(tempEdits);
41431
41432         if (isArea) {
41433             context.perform(
41434                 AddDrawEntities(),
41435                 annotation
41436             );
41437         } else {
41438             var newNode = osmNode({loc: loc});
41439             context.perform(
41440                 actionAddEntity(newNode),
41441                 ReplaceDrawEntities(newNode),
41442                 annotation
41443             );
41444         }
41445
41446         tempEdits = 0;
41447         context.enter(mode);
41448     };
41449
41450
41451     // Connect the way to an existing way.
41452     drawWay.addWay = function(loc, edge) {
41453         if (isArea) {
41454             context.pop(tempEdits);
41455
41456             context.perform(
41457                 AddDrawEntities(),
41458                 actionAddMidpoint({ loc: loc, edge: edge}, end),
41459                 annotation
41460             );
41461         } else {
41462             var previousEdge = startIndex ?
41463                 [origWay.nodes[startIndex], origWay.nodes[startIndex - 1]] :
41464                 [origWay.nodes[0], origWay.nodes[1]];
41465
41466             // Avoid creating duplicate segments
41467             if (geoEdgeEqual(edge, previousEdge))
41468                 return;
41469
41470             context.pop(tempEdits);
41471
41472             var newNode = osmNode({ loc: loc });
41473             context.perform(
41474                 actionAddMidpoint({ loc: loc, edge: edge}, newNode),
41475                 ReplaceDrawEntities(newNode),
41476                 annotation
41477             );
41478         }
41479
41480         tempEdits = 0;
41481         context.enter(mode);
41482     };
41483
41484
41485     // Connect the way to an existing node and continue drawing.
41486     drawWay.addNode = function(node) {
41487         // Avoid creating duplicate segments
41488         if (origWay.areAdjacent(node.id, origWay.nodes[origWay.nodes.length - 1])) return;
41489
41490         // Clicks should not occur on the drawing node, however a space keypress can
41491         // sometimes grab that node's datum (before it gets classed as `active`?)  #4016
41492         if (node.id === end.id) {
41493             drawWay.add(node.loc);
41494             return;
41495         }
41496
41497         context.pop(tempEdits);
41498
41499         context.perform(
41500             ReplaceDrawEntities(node),
41501             annotation
41502         );
41503
41504         tempEdits = 0;
41505         context.enter(mode);
41506     };
41507
41508
41509     // Finish the draw operation, removing the temporary edits.
41510     // If the way has enough nodes to be valid, it's selected.
41511     // Otherwise, delete everything and return to browse mode.
41512     drawWay.finish = function() {
41513         context.pop(tempEdits);
41514         tempEdits = 0;
41515
41516         var way = context.hasEntity(wayId);
41517         if (!way || way.isDegenerate()) {
41518             drawWay.cancel();
41519             return;
41520         }
41521
41522         window.setTimeout(function() {
41523             context.map().dblclickEnable(true);
41524         }, 1000);
41525
41526         context.enter(modeSelect(context, [wayId]).newFeature(true));
41527     };
41528
41529
41530     // Cancel the draw operation, delete everything, and return to browse mode.
41531     drawWay.cancel = function() {
41532         context.pop(tempEdits);
41533         tempEdits = 0;
41534
41535         while (context.graph() !== startGraph) {
41536             context.pop();
41537         }
41538
41539         window.setTimeout(function() {
41540             context.map().dblclickEnable(true);
41541         }, 1000);
41542
41543         context.enter(modeBrowse(context));
41544     };
41545
41546
41547     drawWay.tail = function(text) {
41548         draw.tail(text);
41549         return drawWay;
41550     };
41551
41552
41553     return drawWay;
41554 }
41555
41556 function behaviorHash(context) {
41557     var s0 = null, // cached window.location.hash
41558         lat = 90 - 1e-8; // allowable latitude range
41559
41560
41561     var parser = function(map, s) {
41562         var q = utilStringQs(s);
41563         var args = (q.map || '').split('/').map(Number);
41564
41565         if (args.length < 3 || args.some(isNaN)) {
41566             return true; // replace bogus hash
41567
41568         } else if (s !== formatter(map).slice(1)) {   // hash has changed
41569             var mode = context.mode(),
41570                 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
41571                 maxdist = 500;
41572
41573             // Don't allow the hash location to change too much while drawing
41574             // This can happen if the user accidently hit the back button.  #3996
41575             if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
41576                 context.enter(modeBrowse(context));
41577             }
41578
41579             map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
41580         }
41581     };
41582
41583
41584     var formatter = function(map) {
41585         var center = map.center(),
41586             zoom = map.zoom(),
41587             precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
41588             q = omit(utilStringQs(window.location.hash.substring(1)),
41589                 ['comment', 'hashtags', 'walkthrough']
41590             ),
41591             newParams = {};
41592
41593         delete q.id;
41594         var selected = context.selectedIDs().filter(function(id) {
41595             return !context.entity(id).isNew();
41596         });
41597         if (selected.length) {
41598             newParams.id = selected.join(',');
41599         }
41600
41601         newParams.map = zoom.toFixed(2) +
41602             '/' + center[1].toFixed(precision) +
41603             '/' + center[0].toFixed(precision);
41604
41605         return '#' + utilQsString(assign(q, newParams), true);
41606     };
41607
41608
41609     function update() {
41610         if (context.inIntro()) return;
41611         var s1 = formatter(context.map());
41612         if (s0 !== s1) {
41613             window.location.replace(s0 = s1);  // don't recenter the map!
41614         }
41615     }
41616
41617
41618     var throttledUpdate = throttle(update, 500);
41619
41620
41621     function hashchange() {
41622         if (window.location.hash === s0) return;  // ignore spurious hashchange events
41623         if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
41624             update(); // replace bogus hash
41625         }
41626     }
41627
41628
41629     function hash() {
41630         context.map()
41631             .on('move.hash', throttledUpdate);
41632
41633         context
41634             .on('enter.hash', throttledUpdate);
41635
41636         d3_select(window)
41637             .on('hashchange.hash', hashchange);
41638
41639         if (window.location.hash) {
41640
41641             var q = utilStringQs(window.location.hash.substring(1));
41642
41643             if (q.id) {
41644                 context.zoomToEntity(q.id.split(',')[0], !q.map);
41645             }
41646
41647             if (q.comment) {
41648                 context.storage('comment', q.comment);
41649                 context.storage('commentDate', Date.now());
41650             }
41651
41652             if (q.hashtags) {
41653                 context.storage('hashtags', q.hashtags);
41654             }
41655
41656             if (q.walkthrough === 'true') {
41657                 hash.startWalkthrough = true;
41658             }
41659
41660             hashchange();
41661
41662             if (q.map) {
41663                 hash.hadHash = true;
41664             }
41665         }
41666     }
41667
41668
41669     hash.off = function() {
41670         throttledUpdate.cancel();
41671
41672         context.map()
41673             .on('move.hash', null);
41674
41675         context
41676             .on('enter.hash', null);
41677
41678         d3_select(window)
41679             .on('hashchange.hash', null);
41680
41681         window.location.hash = '';
41682     };
41683
41684
41685     return hash;
41686 }
41687
41688 function behaviorLasso(context) {
41689
41690     var behavior = function(selection$$1) {
41691         var lasso;
41692
41693
41694         function mousedown() {
41695             var button = 0;  // left
41696             if (event.button === button && event.shiftKey === true) {
41697                 lasso = null;
41698
41699                 d3_select(window)
41700                     .on('mousemove.lasso', mousemove)
41701                     .on('mouseup.lasso', mouseup);
41702
41703                 event.stopPropagation();
41704             }
41705         }
41706
41707
41708         function mousemove() {
41709             if (!lasso) {
41710                 lasso = uiLasso(context);
41711                 context.surface().call(lasso);
41712             }
41713
41714             lasso.p(context.mouse());
41715         }
41716
41717
41718         function normalize(a, b) {
41719             return [
41720                 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
41721                 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
41722         }
41723
41724
41725         function lassoed() {
41726             if (!lasso) return [];
41727
41728             var graph = context.graph(),
41729                 bounds = lasso.extent().map(context.projection.invert),
41730                 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
41731
41732             return map$4(context.intersects(extent).filter(function(entity) {
41733                 return entity.type === 'node' &&
41734                     geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
41735                     !context.features().isHidden(entity, graph, entity.geometry(graph));
41736             }), 'id');
41737         }
41738
41739
41740         function mouseup() {
41741             d3_select(window)
41742                 .on('mousemove.lasso', null)
41743                 .on('mouseup.lasso', null);
41744
41745             if (!lasso) return;
41746
41747             var ids = lassoed();
41748             lasso.close();
41749
41750             if (ids.length) {
41751                 context.enter(modeSelect(context, ids));
41752             }
41753         }
41754
41755         selection$$1
41756             .on('mousedown.lasso', mousedown);
41757     };
41758
41759
41760     behavior.off = function(selection$$1) {
41761         selection$$1.on('mousedown.lasso', null);
41762     };
41763
41764
41765     return behavior;
41766 }
41767
41768 /* Creates a keybinding behavior for an operation */
41769 function behaviorOperation() {
41770     var which, keybinding;
41771
41772
41773     function drawIcon(selection$$1) {
41774         var button = selection$$1
41775             .append('svg')
41776             .attr('class', 'operation-icon')
41777             .append('g')
41778             .attr('class', 'radial-menu-item radial-menu-item-' + which.id)
41779             .attr('transform', 'translate(10,10)')
41780             .classed('disabled', which.disabled());
41781
41782         button
41783             .append('circle')
41784             .attr('r', 9);
41785
41786         button
41787             .append('use')
41788             .attr('transform', 'translate(-7,-7)')
41789             .attr('width', '14')
41790             .attr('height', '14')
41791             .attr('xlink:href', '#operation-' + which.id);
41792
41793         return selection$$1;
41794     }
41795
41796
41797     var behavior = function () {
41798         if (which && which.available()) {
41799             keybinding = d3keybinding('behavior.key.' + which.id);
41800             keybinding.on(which.keys, function() {
41801                 event.preventDefault();
41802                 var disabled = which.disabled();
41803
41804                 if (disabled) {
41805                     uiFlash(3000)
41806                         .html('')
41807                         .call(drawIcon)
41808                         .append('div')
41809                         .attr('class', 'operation-tip')
41810                         .text(which.tooltip);
41811
41812                 } else {
41813                     uiFlash(1500)
41814                         .html('')
41815                         .call(drawIcon)
41816                         .append('div')
41817                         .attr('class', 'operation-tip')
41818                         .text(which.annotation() || which.title);
41819
41820                     which();
41821                 }
41822             });
41823             d3_select(document).call(keybinding);
41824         }
41825         return behavior;
41826     };
41827
41828
41829     behavior.off = function() {
41830         if (keybinding) {
41831             d3_select(document).call(keybinding.off);
41832         }
41833     };
41834
41835
41836     behavior.which = function (_) {
41837         if (!arguments.length) return which;
41838         which = _;
41839         return behavior;
41840     };
41841
41842
41843     return behavior;
41844 }
41845
41846 /**
41847  * The base implementation of `_.invert` and `_.invertBy` which inverts
41848  * `object` with values transformed by `iteratee` and set by `setter`.
41849  *
41850  * @private
41851  * @param {Object} object The object to iterate over.
41852  * @param {Function} setter The function to set `accumulator` values.
41853  * @param {Function} iteratee The iteratee to transform values.
41854  * @param {Object} accumulator The initial inverted object.
41855  * @returns {Function} Returns `accumulator`.
41856  */
41857 function baseInverter(object, setter, iteratee, accumulator) {
41858   baseForOwn(object, function(value, key, object) {
41859     setter(accumulator, iteratee(value), key, object);
41860   });
41861   return accumulator;
41862 }
41863
41864 /**
41865  * Creates a function like `_.invertBy`.
41866  *
41867  * @private
41868  * @param {Function} setter The function to set accumulator values.
41869  * @param {Function} toIteratee The function to resolve iteratees.
41870  * @returns {Function} Returns the new inverter function.
41871  */
41872 function createInverter(setter, toIteratee) {
41873   return function(object, iteratee) {
41874     return baseInverter(object, setter, toIteratee(iteratee), {});
41875   };
41876 }
41877
41878 /**
41879  * Creates an object composed of the inverted keys and values of `object`.
41880  * If `object` contains duplicate values, subsequent values overwrite
41881  * property assignments of previous values.
41882  *
41883  * @static
41884  * @memberOf _
41885  * @since 0.7.0
41886  * @category Object
41887  * @param {Object} object The object to invert.
41888  * @returns {Object} Returns the new inverted object.
41889  * @example
41890  *
41891  * var object = { 'a': 1, 'b': 2, 'c': 1 };
41892  *
41893  * _.invert(object);
41894  * // => { '1': 'c', '2': 'b' }
41895  */
41896 var invert = createInverter(function(result, value, key) {
41897   result[value] = key;
41898 }, constant$13(identity$8));
41899
41900 /**
41901  * Creates an object with the same keys as `object` and values generated
41902  * by running each own enumerable string keyed property of `object` thru
41903  * `iteratee`. The iteratee is invoked with three arguments:
41904  * (value, key, object).
41905  *
41906  * @static
41907  * @memberOf _
41908  * @since 2.4.0
41909  * @category Object
41910  * @param {Object} object The object to iterate over.
41911  * @param {Function} [iteratee=_.identity] The function invoked per iteration.
41912  * @returns {Object} Returns the new mapped object.
41913  * @see _.mapKeys
41914  * @example
41915  *
41916  * var users = {
41917  *   'fred':    { 'user': 'fred',    'age': 40 },
41918  *   'pebbles': { 'user': 'pebbles', 'age': 1 }
41919  * };
41920  *
41921  * _.mapValues(users, function(o) { return o.age; });
41922  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
41923  *
41924  * // The `_.property` iteratee shorthand.
41925  * _.mapValues(users, 'age');
41926  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
41927  */
41928 function mapValues(object, iteratee) {
41929   var result = {};
41930   iteratee = baseIteratee(iteratee, 3);
41931
41932   baseForOwn(object, function(value, key, object) {
41933     baseAssignValue(result, key, iteratee(value, key, object));
41934   });
41935   return result;
41936 }
41937
41938 function behaviorPaste(context) {
41939     var keybinding = d3keybinding('paste');
41940
41941
41942     function doPaste() {
41943         event.preventDefault();
41944
41945         var baseGraph = context.graph(),
41946             mouse = context.mouse(),
41947             projection = context.projection,
41948             viewport = geoExtent$$1(projection.clipExtent()).polygon();
41949
41950         if (!geoPointInPolygon(mouse, viewport)) return;
41951
41952         var extent = geoExtent$$1(),
41953             oldIDs = context.copyIDs(),
41954             oldGraph = context.copyGraph(),
41955             newIDs = [];
41956
41957         if (!oldIDs.length) return;
41958
41959         var action = actionCopyEntities(oldIDs, oldGraph);
41960         context.perform(action);
41961
41962         var copies = action.copies();
41963         var originals = invert(mapValues(copies, 'id'));
41964         for (var id in copies) {
41965             var oldEntity = oldGraph.entity(id),
41966                 newEntity = copies[id];
41967
41968             extent._extend(oldEntity.extent(oldGraph));
41969
41970             // Exclude child nodes from newIDs if their parent way was also copied.
41971             var parents = context.graph().parentWays(newEntity),
41972                 parentCopied = false;
41973             for (var i = 0; i < parents.length; i++) {
41974                 if (originals[parents[i].id]) {
41975                     parentCopied = true;
41976                     break;
41977                 }
41978             }
41979
41980             if (!parentCopied) {
41981                 newIDs.push(newEntity.id);
41982             }
41983         }
41984
41985         // Put pasted objects where mouse pointer is..
41986         var center = projection(extent.center()),
41987             delta = [ mouse[0] - center[0], mouse[1] - center[1] ];
41988
41989         context.perform(actionMove(newIDs, delta, projection));
41990         context.enter(modeMove$$1(context, newIDs, baseGraph));
41991     }
41992
41993
41994     function paste() {
41995         keybinding.on(uiCmd('⌘V'), doPaste);
41996         d3_select(document).call(keybinding);
41997         return paste;
41998     }
41999
42000
42001     paste.off = function() {
42002         d3_select(document).call(keybinding.off);
42003     };
42004
42005
42006     return paste;
42007 }
42008
42009 function behaviorSelect(context) {
42010     var lastMouse = null,
42011         suppressMenu = true,
42012         tolerance = 4,
42013         p1 = null;
42014
42015
42016     function point() {
42017         return d3_mouse(context.container().node());
42018     }
42019
42020
42021     function keydown() {
42022         var e = event;
42023         if (e && e.shiftKey) {
42024             context.surface()
42025                 .classed('behavior-multiselect', true);
42026         }
42027
42028         if (e && e.keyCode === 93) {  // context menu
42029             e.preventDefault();
42030             e.stopPropagation();
42031         }
42032     }
42033
42034
42035     function keyup() {
42036         var e = event;
42037         if (!e || !e.shiftKey) {
42038             context.surface()
42039                 .classed('behavior-multiselect', false);
42040         }
42041
42042
42043         if (e && e.keyCode === 93) {  // context menu
42044             e.preventDefault();
42045             e.stopPropagation();
42046             contextmenu();
42047         }
42048     }
42049
42050
42051     function mousedown() {
42052         if (!p1) p1 = point();
42053         d3_select(window)
42054             .on('mouseup.select', mouseup, true);
42055
42056         var isShowAlways = +context.storage('edit-menu-show-always') === 1;
42057         suppressMenu = !isShowAlways;
42058     }
42059
42060
42061     function mousemove() {
42062         if (event) lastMouse = event;
42063     }
42064
42065
42066     function mouseup() {
42067         click();
42068     }
42069
42070
42071     function contextmenu() {
42072         var e = event;
42073         e.preventDefault();
42074         e.stopPropagation();
42075
42076         if (!+e.clientX && !+e.clientY) {
42077             if (lastMouse) {
42078                 e.sourceEvent = lastMouse;
42079             } else {
42080                 return;
42081             }
42082         }
42083
42084         if (!p1) p1 = point();
42085         suppressMenu = false;
42086         click();
42087     }
42088
42089
42090     function click() {
42091         d3_select(window)
42092             .on('mouseup.select', null, true);
42093
42094         if (!p1) return;
42095         var p2 = point(),
42096             dist = geoEuclideanDistance(p1, p2);
42097
42098         p1 = null;
42099         if (dist > tolerance) {
42100             return;
42101         }
42102
42103         var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node(),
42104             isShowAlways = +context.storage('edit-menu-show-always') === 1,
42105             datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__),
42106             mode = context.mode();
42107
42108
42109         if (datum && datum.type === 'midpoint') {
42110             datum = datum.parents[0];
42111         }
42112
42113         if (!(datum instanceof osmEntity$$1)) {
42114             // clicked nothing..
42115             if (!isMultiselect && mode.id !== 'browse') {
42116                 context.enter(modeBrowse(context));
42117             }
42118
42119         } else {
42120             // clicked an entity..
42121             var selectedIDs = context.selectedIDs();
42122
42123             if (!isMultiselect) {
42124                 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
42125                     // multiple things already selected, just show the menu...
42126                     mode.suppressMenu(false).reselect();
42127                 } else {
42128                     // select a single thing..
42129                     context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
42130                 }
42131
42132             } else {
42133                 if (selectedIDs.indexOf(datum.id) !== -1) {
42134                     // clicked entity is already in the selectedIDs list..
42135                     if (!suppressMenu && !isShowAlways) {
42136                         // don't deselect clicked entity, just show the menu.
42137                         mode.suppressMenu(false).reselect();
42138                     } else {
42139                         // deselect clicked entity, then reenter select mode or return to browse mode..
42140                         selectedIDs = without(selectedIDs, datum.id);
42141                         context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
42142                     }
42143                 } else {
42144                     // clicked entity is not in the selected list, add it..
42145                     selectedIDs = selectedIDs.concat([datum.id]);
42146                     context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
42147                 }
42148             }
42149         }
42150
42151         // reset for next time..
42152         suppressMenu = true;
42153     }
42154
42155
42156     var behavior = function(selection$$1) {
42157         lastMouse = null;
42158         suppressMenu = true;
42159         p1 = null;
42160
42161         d3_select(window)
42162             .on('keydown.select', keydown)
42163             .on('keyup.select', keyup)
42164             .on('contextmenu.select-window', function() {
42165                 // Edge and IE really like to show the contextmenu on the
42166                 // menubar when user presses a keyboard menu button
42167                 // even after we've already preventdefaulted the key event.
42168                 var e = event;
42169                 if (+e.clientX === 0 && +e.clientY === 0) {
42170                     event.preventDefault();
42171                     event.stopPropagation();
42172                 }
42173             });
42174
42175         selection$$1
42176             .on('mousedown.select', mousedown)
42177             .on('mousemove.select', mousemove)
42178             .on('contextmenu.select', contextmenu);
42179
42180         if (event && event.shiftKey) {
42181             context.surface()
42182                 .classed('behavior-multiselect', true);
42183         }
42184     };
42185
42186
42187     behavior.off = function(selection$$1) {
42188         d3_select(window)
42189             .on('keydown.select', null)
42190             .on('keyup.select', null)
42191             .on('contextmenu.select-window', null)
42192             .on('mouseup.select', null, true);
42193
42194         selection$$1
42195             .on('mousedown.select', null)
42196             .on('mousemove.select', null)
42197             .on('contextmenu.select', null);
42198
42199         context.surface()
42200             .classed('behavior-multiselect', false);
42201     };
42202
42203
42204     return behavior;
42205 }
42206
42207 function modeAddArea$$1(context) {
42208     var mode = {
42209         id: 'add-area',
42210         button: 'area',
42211         title: t('modes.add_area.title'),
42212         description: t('modes.add_area.description'),
42213         key: '3'
42214     };
42215
42216     var behavior = behaviorAddWay(context)
42217             .tail(t('modes.add_area.tail'))
42218             .on('start', start)
42219             .on('startFromWay', startFromWay)
42220             .on('startFromNode', startFromNode),
42221         defaultTags = { area: 'yes' };
42222
42223
42224     function actionClose(wayId) {
42225         return function (graph) {
42226             return graph.replace(graph.entity(wayId).close());
42227         };
42228     }
42229
42230
42231     function start(loc) {
42232         var startGraph = context.graph(),
42233             node = osmNode({ loc: loc }),
42234             way = osmWay({ tags: defaultTags });
42235
42236         context.perform(
42237             actionAddEntity(node),
42238             actionAddEntity(way),
42239             actionAddVertex(way.id, node.id),
42240             actionClose(way.id)
42241         );
42242
42243         context.enter(modeDrawArea(context, way.id, startGraph));
42244     }
42245
42246
42247     function startFromWay(loc, edge) {
42248         var startGraph = context.graph(),
42249             node = osmNode({ loc: loc }),
42250             way = osmWay({ tags: defaultTags });
42251
42252         context.perform(
42253             actionAddEntity(node),
42254             actionAddEntity(way),
42255             actionAddVertex(way.id, node.id),
42256             actionClose(way.id),
42257             actionAddMidpoint({ loc: loc, edge: edge }, node)
42258         );
42259
42260         context.enter(modeDrawArea(context, way.id, startGraph));
42261     }
42262
42263
42264     function startFromNode(node) {
42265         var startGraph = context.graph(),
42266             way = osmWay({ tags: defaultTags });
42267
42268         context.perform(
42269             actionAddEntity(way),
42270             actionAddVertex(way.id, node.id),
42271             actionClose(way.id)
42272         );
42273
42274         context.enter(modeDrawArea(context, way.id, startGraph));
42275     }
42276
42277
42278     mode.enter = function() {
42279         context.install(behavior);
42280     };
42281
42282
42283     mode.exit = function() {
42284         context.uninstall(behavior);
42285     };
42286
42287
42288     return mode;
42289 }
42290
42291 function modeAddLine$$1(context) {
42292     var mode = {
42293         id: 'add-line',
42294         button: 'line',
42295         title: t('modes.add_line.title'),
42296         description: t('modes.add_line.description'),
42297         key: '2'
42298     };
42299
42300     var behavior = behaviorAddWay(context)
42301         .tail(t('modes.add_line.tail'))
42302         .on('start', start)
42303         .on('startFromWay', startFromWay)
42304         .on('startFromNode', startFromNode);
42305
42306
42307     function start(loc) {
42308         var startGraph = context.graph(),
42309             node = osmNode({ loc: loc }),
42310             way = osmWay();
42311
42312         context.perform(
42313             actionAddEntity(node),
42314             actionAddEntity(way),
42315             actionAddVertex(way.id, node.id)
42316         );
42317
42318         context.enter(modeDrawLine(context, way.id, startGraph));
42319     }
42320
42321
42322     function startFromWay(loc, edge) {
42323         var startGraph = context.graph(),
42324             node = osmNode({ loc: loc }),
42325             way = osmWay();
42326
42327         context.perform(
42328             actionAddEntity(node),
42329             actionAddEntity(way),
42330             actionAddVertex(way.id, node.id),
42331             actionAddMidpoint({ loc: loc, edge: edge }, node)
42332         );
42333
42334         context.enter(modeDrawLine(context, way.id, startGraph));
42335     }
42336
42337
42338     function startFromNode(node) {
42339         var startGraph = context.graph(),
42340             way = osmWay();
42341
42342         context.perform(
42343             actionAddEntity(way),
42344             actionAddVertex(way.id, node.id)
42345         );
42346
42347         context.enter(modeDrawLine(context, way.id, startGraph));
42348     }
42349
42350
42351     mode.enter = function() {
42352         context.install(behavior);
42353     };
42354
42355
42356     mode.exit = function() {
42357         context.uninstall(behavior);
42358     };
42359
42360     return mode;
42361 }
42362
42363 function modeAddPoint$$1(context) {
42364     var mode = {
42365         id: 'add-point',
42366         button: 'point',
42367         title: t('modes.add_point.title'),
42368         description: t('modes.add_point.description'),
42369         key: '1'
42370     };
42371
42372     var behavior = behaviorDraw(context)
42373         .tail(t('modes.add_point.tail'))
42374         .on('click', add)
42375         .on('clickWay', addWay)
42376         .on('clickNode', addNode)
42377         .on('cancel', cancel)
42378         .on('finish', cancel);
42379
42380
42381     function add(loc) {
42382         var node = osmNode({ loc: loc });
42383
42384         context.perform(
42385             actionAddEntity(node),
42386             t('operations.add.annotation.point')
42387         );
42388
42389         context.enter(
42390             modeSelect(context, [node.id]).newFeature(true)
42391         );
42392     }
42393
42394
42395     function addWay(loc) {
42396         add(loc);
42397     }
42398
42399
42400     function addNode(node) {
42401         add(node.loc);
42402     }
42403
42404
42405     function cancel() {
42406         context.enter(modeBrowse(context));
42407     }
42408
42409
42410     mode.enter = function() {
42411         context.install(behavior);
42412     };
42413
42414
42415     mode.exit = function() {
42416         context.uninstall(behavior);
42417     };
42418
42419
42420     return mode;
42421 }
42422
42423 function modeDragNode$$1(context) {
42424     var mode = {
42425         id: 'drag-node',
42426         button: 'browse'
42427     };
42428
42429     var nudgeInterval,
42430         activeIDs,
42431         wasMidpoint,
42432         isCancelled,
42433         lastLoc,
42434         selectedIDs = [],
42435         hover = behaviorHover(context).altDisables(true).on('hover', context.ui().sidebar.hover),
42436         edit = behaviorEdit(context);
42437
42438
42439     function vecSub(a, b) {
42440         return [a[0] - b[0], a[1] - b[1]];
42441     }
42442
42443     function edge(point, size) {
42444         var pad = [80, 20, 50, 20],   // top, right, bottom, left
42445             x = 0,
42446             y = 0;
42447
42448         if (point[0] > size[0] - pad[1])
42449             x = -10;
42450         if (point[0] < pad[3])
42451             x = 10;
42452         if (point[1] > size[1] - pad[2])
42453             y = -10;
42454         if (point[1] < pad[0])
42455             y = 10;
42456
42457         if (x || y) {
42458             return [x, y];
42459         } else {
42460             return null;
42461         }
42462     }
42463
42464
42465     function startNudge(entity, nudge) {
42466         if (nudgeInterval) window.clearInterval(nudgeInterval);
42467         nudgeInterval = window.setInterval(function() {
42468             context.pan(nudge);
42469             doMove(entity, nudge);
42470         }, 50);
42471     }
42472
42473
42474     function stopNudge() {
42475         if (nudgeInterval) {
42476             window.clearInterval(nudgeInterval);
42477             nudgeInterval = null;
42478         }
42479     }
42480
42481
42482     function moveAnnotation(entity) {
42483         return t('operations.move.annotation.' + entity.geometry(context.graph()));
42484     }
42485
42486
42487     function connectAnnotation(entity) {
42488         return t('operations.connect.annotation.' + entity.geometry(context.graph()));
42489     }
42490
42491
42492     function origin(entity) {
42493         return context.projection(entity.loc);
42494     }
42495
42496
42497     function start(entity) {
42498         wasMidpoint = entity.type === 'midpoint';
42499
42500         isCancelled = event.sourceEvent.shiftKey ||
42501             context.features().hasHiddenConnections(entity, context.graph());
42502
42503         if (isCancelled) {
42504             return behavior.cancel();
42505         }
42506
42507         if (wasMidpoint) {
42508             var midpoint = entity;
42509             entity = osmNode();
42510             context.perform(actionAddMidpoint(midpoint, entity));
42511
42512             var vertex = context.surface().selectAll('.' + entity.id);
42513             behavior.target(vertex.node(), entity);
42514
42515         } else {
42516             context.perform(actionNoop());
42517         }
42518
42519         // activeIDs generate no pointer events.  This prevents the node or vertex
42520         // being dragged from trying to connect to itself or its parent element.
42521         activeIDs = map$4(context.graph().parentWays(entity), 'id');
42522         activeIDs.push(entity.id);
42523         setActiveElements();
42524
42525         context.enter(mode);
42526     }
42527
42528
42529     function datum() {
42530         var event$$1 = event && event.sourceEvent;
42531         if (!event$$1 || event$$1.altKey) {
42532             return {};
42533         } else {
42534             return event$$1.target.__data__ || {};
42535         }
42536     }
42537
42538
42539     function doMove(entity, nudge) {
42540         nudge = nudge || [0, 0];
42541
42542         var currPoint = (event && event.point) || context.projection(lastLoc),
42543             currMouse = vecSub(currPoint, nudge),
42544             loc = context.projection.invert(currMouse),
42545             d = datum();
42546
42547         if (!nudgeInterval) {
42548             if (d.type === 'node' && d.id !== entity.id) {
42549                 loc = d.loc;
42550             } else if (d.type === 'way' && !d3_select(event.sourceEvent.target).classed('fill')) {
42551                 loc = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection).loc;
42552             }
42553         }
42554
42555         context.replace(
42556             actionMoveNode(entity.id, loc),
42557             moveAnnotation(entity)
42558         );
42559
42560         lastLoc = loc;
42561     }
42562
42563
42564     function move(entity) {
42565         if (isCancelled) return;
42566         event.sourceEvent.stopPropagation();
42567         lastLoc = context.projection.invert(event.point);
42568
42569         doMove(entity);
42570         var nudge = edge(event.point, context.map().dimensions());
42571         if (nudge) {
42572             startNudge(entity, nudge);
42573         } else {
42574             stopNudge();
42575         }
42576     }
42577
42578
42579     function end(entity) {
42580         if (isCancelled) return;
42581
42582         var d = datum();
42583
42584         if (d.type === 'way') {
42585             var choice = geoChooseEdge(context.childNodes(d), context.mouse(), context.projection);
42586             context.replace(
42587                 actionAddMidpoint({ loc: choice.loc, edge: [d.nodes[choice.index - 1], d.nodes[choice.index]] }, entity),
42588                 connectAnnotation(d)
42589             );
42590
42591         } else if (d.type === 'node' && d.id !== entity.id) {
42592             context.replace(
42593                 actionConnect([d.id, entity.id]),
42594                 connectAnnotation(d)
42595             );
42596
42597         } else if (wasMidpoint) {
42598             context.replace(
42599                 actionNoop(),
42600                 t('operations.add.annotation.vertex')
42601             );
42602
42603         } else {
42604             context.replace(
42605                 actionNoop(),
42606                 moveAnnotation(entity)
42607             );
42608         }
42609
42610         var reselection = selectedIDs.filter(function(id) {
42611             return context.graph().hasEntity(id);
42612         });
42613
42614         if (reselection.length) {
42615             context.enter(modeSelect(context, reselection));
42616         } else {
42617             context.enter(modeBrowse(context));
42618         }
42619     }
42620
42621
42622     function cancel() {
42623         behavior.cancel();
42624         context.enter(modeBrowse(context));
42625     }
42626
42627
42628     function setActiveElements() {
42629         context.surface().selectAll(utilEntitySelector(activeIDs))
42630             .classed('active', true);
42631     }
42632
42633
42634     var behavior = behaviorDrag()
42635         .selector('g.node, g.point, g.midpoint')
42636         .surface(d3_select('#map').node())
42637         .origin(origin)
42638         .on('start', start)
42639         .on('move', move)
42640         .on('end', end);
42641
42642
42643     mode.enter = function() {
42644         context.install(hover);
42645         context.install(edit);
42646
42647         context.history()
42648             .on('undone.drag-node', cancel);
42649
42650         context.map()
42651             .on('drawn.drag-node', setActiveElements);
42652
42653         setActiveElements();
42654     };
42655
42656
42657     mode.exit = function() {
42658         context.ui().sidebar.hover.cancel();
42659         context.uninstall(hover);
42660         context.uninstall(edit);
42661
42662         context.history()
42663             .on('undone.drag-node', null);
42664
42665         context.map()
42666             .on('drawn.drag-node', null);
42667
42668         context.surface()
42669             .selectAll('.active')
42670             .classed('active', false);
42671
42672         stopNudge();
42673     };
42674
42675
42676     mode.selectedIDs = function(_) {
42677         if (!arguments.length) return selectedIDs;
42678         selectedIDs = _;
42679         return mode;
42680     };
42681
42682
42683     mode.behavior = behavior;
42684
42685
42686     return mode;
42687 }
42688
42689 function modeBrowse(context) {
42690     var mode = {
42691         button: 'browse',
42692         id: 'browse',
42693         title: t('modes.browse.title'),
42694         description: t('modes.browse.description')
42695     }, sidebar;
42696
42697     var behaviors = [
42698         behaviorPaste(context),
42699         behaviorHover(context).on('hover', context.ui().sidebar.hover),
42700         behaviorSelect(context),
42701         behaviorLasso(context),
42702         modeDragNode$$1(context).behavior
42703     ];
42704
42705
42706     mode.enter = function() {
42707         behaviors.forEach(function(behavior) {
42708             context.install(behavior);
42709         });
42710
42711         // Get focus on the body.
42712         if (document.activeElement && document.activeElement.blur) {
42713             document.activeElement.blur();
42714         }
42715
42716         if (sidebar) {
42717             context.ui().sidebar.show(sidebar);
42718         } else {
42719             context.ui().sidebar.select(null);
42720         }
42721     };
42722
42723
42724     mode.exit = function() {
42725         context.ui().sidebar.hover.cancel();
42726         behaviors.forEach(function(behavior) {
42727             context.uninstall(behavior);
42728         });
42729
42730         if (sidebar) {
42731             context.ui().sidebar.hide();
42732         }
42733     };
42734
42735
42736     mode.sidebar = function(_) {
42737         if (!arguments.length) return sidebar;
42738         sidebar = _;
42739         return mode;
42740     };
42741
42742
42743     return mode;
42744 }
42745
42746 function modeDrawArea(context, wayId, startGraph) {
42747     var mode = {
42748         button: 'area',
42749         id: 'draw-area'
42750     };
42751
42752     var behavior;
42753
42754
42755     mode.enter = function() {
42756         var way = context.entity(wayId);
42757
42758         behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
42759             .tail(t('modes.draw_area.tail'));
42760
42761         var addNode = behavior.addNode;
42762
42763         behavior.addNode = function(node) {
42764             var length = way.nodes.length,
42765                 penultimate = length > 2 ? way.nodes[length - 2] : null;
42766
42767             if (node.id === way.first() || node.id === penultimate) {
42768                 behavior.finish();
42769             } else {
42770                 addNode(node);
42771             }
42772         };
42773
42774         context.install(behavior);
42775     };
42776
42777
42778     mode.exit = function() {
42779         context.uninstall(behavior);
42780     };
42781
42782
42783     mode.selectedIDs = function() {
42784         return [wayId];
42785     };
42786
42787
42788     return mode;
42789 }
42790
42791 function modeDrawLine(context, wayId, startGraph, affix) {
42792     var mode = {
42793         button: 'line',
42794         id: 'draw-line'
42795     };
42796
42797     var behavior;
42798
42799
42800     mode.enter = function() {
42801         var way = context.entity(wayId),
42802             index = (affix === 'prefix') ? 0 : undefined,
42803             headId = (affix === 'prefix') ? way.first() : way.last();
42804
42805         behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
42806             .tail(t('modes.draw_line.tail'));
42807
42808         var addNode = behavior.addNode;
42809
42810         behavior.addNode = function(node) {
42811             if (node.id === headId) {
42812                 behavior.finish();
42813             } else {
42814                 addNode(node);
42815             }
42816         };
42817
42818         context.install(behavior);
42819     };
42820
42821
42822     mode.exit = function() {
42823         context.uninstall(behavior);
42824     };
42825
42826
42827     mode.selectedIDs = function() {
42828         return [wayId];
42829     };
42830
42831
42832     return mode;
42833 }
42834
42835 function operationCircularize(selectedIDs, context) {
42836     var entityId = selectedIDs[0],
42837         entity = context.entity(entityId),
42838         extent = entity.extent(context.graph()),
42839         geometry = context.geometry(entityId),
42840         action = actionCircularize(entityId, context.projection);
42841
42842
42843     var operation = function() {
42844         context.perform(action, operation.annotation());
42845     };
42846
42847
42848     operation.available = function() {
42849         return selectedIDs.length === 1 &&
42850             entity.type === 'way' &&
42851             uniq(entity.nodes).length > 1;
42852     };
42853
42854
42855     operation.disabled = function() {
42856         var reason;
42857         if (extent.percentContainedIn(context.extent()) < 0.8) {
42858             reason = 'too_large';
42859         } else if (context.hasHiddenConnections(entityId)) {
42860             reason = 'connected_to_hidden';
42861         }
42862         return action.disabled(context.graph()) || reason;
42863     };
42864
42865
42866     operation.tooltip = function() {
42867         var disable = operation.disabled();
42868         return disable ?
42869             t('operations.circularize.' + disable) :
42870             t('operations.circularize.description.' + geometry);
42871     };
42872
42873
42874     operation.annotation = function() {
42875         return t('operations.circularize.annotation.' + geometry);
42876     };
42877
42878
42879     operation.id = 'circularize';
42880     operation.keys = [t('operations.circularize.key')];
42881     operation.title = t('operations.circularize.title');
42882     operation.behavior = behaviorOperation(context).which(operation);
42883
42884     return operation;
42885 }
42886
42887 function operationContinue(selectedIDs, context) {
42888     var graph = context.graph(),
42889         entities = selectedIDs.map(function(id) { return graph.entity(id); }),
42890         geometries = assignIn$1({ line: [], vertex: [] },
42891             groupBy(entities, function(entity) { return entity.geometry(graph); })),
42892         vertex = geometries.vertex[0];
42893
42894
42895     function candidateWays() {
42896         return graph.parentWays(vertex).filter(function(parent) {
42897             return parent.geometry(graph) === 'line' &&
42898                 !parent.isClosed() &&
42899                 parent.affix(vertex.id) &&
42900                 (geometries.line.length === 0 || geometries.line[0] === parent);
42901         });
42902     }
42903
42904
42905     var operation = function() {
42906         var candidate = candidateWays()[0];
42907         context.enter(
42908             modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
42909         );
42910     };
42911
42912
42913     operation.available = function() {
42914         return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
42915             !context.features().hasHiddenConnections(vertex, context.graph());
42916     };
42917
42918
42919     operation.disabled = function() {
42920         var candidates = candidateWays();
42921         if (candidates.length === 0)
42922             return 'not_eligible';
42923         if (candidates.length > 1)
42924             return 'multiple';
42925     };
42926
42927
42928     operation.tooltip = function() {
42929         var disable = operation.disabled();
42930         return disable ?
42931             t('operations.continue.' + disable) :
42932             t('operations.continue.description');
42933     };
42934
42935
42936     operation.annotation = function() {
42937         return t('operations.continue.annotation.line');
42938     };
42939
42940
42941     operation.id = 'continue';
42942     operation.keys = [t('operations.continue.key')];
42943     operation.title = t('operations.continue.title');
42944     operation.behavior = behaviorOperation(context).which(operation);
42945
42946     return operation;
42947 }
42948
42949 function operationDelete(selectedIDs, context) {
42950     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
42951         action = actionDeleteMultiple(selectedIDs),
42952         extent = selectedIDs.reduce(function(extent, id) {
42953                 return extent.extend(context.entity(id).extent(context.graph()));
42954             }, geoExtent$$1());
42955
42956
42957     var operation = function() {
42958         var nextSelectedID;
42959
42960         if (selectedIDs.length === 1) {
42961             var id = selectedIDs[0],
42962                 entity = context.entity(id),
42963                 geometry = context.geometry(id),
42964                 parents = context.graph().parentWays(entity),
42965                 parent = parents[0];
42966
42967             // Select the next closest node in the way.
42968             if (geometry === 'vertex' && parent.nodes.length > 2) {
42969                 var nodes = parent.nodes,
42970                     i = nodes.indexOf(id);
42971
42972                 if (i === 0) {
42973                     i++;
42974                 } else if (i === nodes.length - 1) {
42975                     i--;
42976                 } else {
42977                     var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
42978                         b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
42979                     i = a < b ? i - 1 : i + 1;
42980                 }
42981
42982                 nextSelectedID = nodes[i];
42983             }
42984         }
42985
42986         context.perform(action, operation.annotation());
42987
42988         if (nextSelectedID && context.hasEntity(nextSelectedID)) {
42989             context.enter(modeSelect(context, [nextSelectedID]).follow(true));
42990         } else {
42991             context.enter(modeBrowse(context));
42992         }
42993
42994     };
42995
42996
42997     operation.available = function() {
42998         return true;
42999     };
43000
43001
43002     operation.disabled = function() {
43003         var reason;
43004         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43005             reason = 'too_large';
43006         } else if (some(selectedIDs, context.hasHiddenConnections)) {
43007             reason = 'connected_to_hidden';
43008         } else if (some(selectedIDs, protectedMember)) {
43009             reason = 'part_of_relation';
43010         } else if (some(selectedIDs, incompleteRelation)) {
43011             reason = 'incomplete_relation';
43012         }
43013         return reason;
43014
43015         function incompleteRelation(id) {
43016             var entity = context.entity(id);
43017             return entity.type === 'relation' && !entity.isComplete(context.graph());
43018         }
43019
43020         function protectedMember(id) {
43021             var entity = context.entity(id);
43022             if (entity.type !== 'way') return false;
43023
43024             var parents = context.graph().parentRelations(entity);
43025             for (var i = 0; i < parents.length; i++) {
43026                 var parent = parents[i],
43027                     type = parent.tags.type,
43028                     role = parent.memberById(id).role || 'outer';
43029                 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
43030                     return true;
43031                 }
43032             }
43033             return false;
43034         }
43035
43036     };
43037
43038
43039     operation.tooltip = function() {
43040         var disable = operation.disabled();
43041         return disable ?
43042             t('operations.delete.' + disable + '.' + multi) :
43043             t('operations.delete.description' + '.' + multi);
43044     };
43045
43046
43047     operation.annotation = function() {
43048         return selectedIDs.length === 1 ?
43049             t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
43050             t('operations.delete.annotation.multiple', { n: selectedIDs.length });
43051     };
43052
43053
43054     operation.id = 'delete';
43055     operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
43056     operation.title = t('operations.delete.title');
43057     operation.behavior = behaviorOperation(context).which(operation);
43058
43059     return operation;
43060 }
43061
43062 function operationDisconnect(selectedIDs, context) {
43063     var vertices = filter(selectedIDs, function(entityId) {
43064         return context.geometry(entityId) === 'vertex';
43065     });
43066
43067     var entityId = vertices[0],
43068         action = actionDisconnect(entityId);
43069
43070     if (selectedIDs.length > 1) {
43071         action.limitWays(without(selectedIDs, entityId));
43072     }
43073
43074
43075     var operation = function() {
43076         context.perform(action, operation.annotation());
43077     };
43078
43079
43080     operation.available = function() {
43081         return vertices.length === 1;
43082     };
43083
43084
43085     operation.disabled = function() {
43086         var reason;
43087         if (some(selectedIDs, context.hasHiddenConnections)) {
43088             reason = 'connected_to_hidden';
43089         }
43090         return action.disabled(context.graph()) || reason;
43091     };
43092
43093
43094     operation.tooltip = function() {
43095         var disable = operation.disabled();
43096         return disable ?
43097             t('operations.disconnect.' + disable) :
43098             t('operations.disconnect.description');
43099     };
43100
43101
43102     operation.annotation = function() {
43103         return t('operations.disconnect.annotation');
43104     };
43105
43106
43107     operation.id = 'disconnect';
43108     operation.keys = [t('operations.disconnect.key')];
43109     operation.title = t('operations.disconnect.title');
43110     operation.behavior = behaviorOperation(context).which(operation);
43111
43112     return operation;
43113 }
43114
43115 function operationMerge(selectedIDs, context) {
43116
43117     function updatePresetTags(newGraph, ids) {
43118         var id = ids[0],
43119             newEntity = newGraph.hasEntity(id);
43120
43121         if (!newEntity) return;
43122
43123         var newPreset = context.presets().match(newEntity, newGraph);
43124
43125         context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
43126     }
43127
43128
43129     var join = actionJoin(selectedIDs),
43130         merge = actionMerge(selectedIDs),
43131         mergePolygon = actionMergePolygon(selectedIDs);
43132
43133
43134     var operation = function() {
43135         var origGraph = context.graph(),
43136             action;
43137
43138         if (!join.disabled(origGraph)) {
43139             action = join;
43140         } else if (!merge.disabled(origGraph)) {
43141             action = merge;
43142         } else {
43143             action = mergePolygon;
43144         }
43145
43146         context.perform(action, operation.annotation());
43147
43148         var ids = selectedIDs.filter(function(id) {
43149             var entity = context.hasEntity(id);
43150             return entity && entity.type !== 'node';
43151         });
43152
43153         // if we merged tags, rematch preset to update tags if necessary (#3851)
43154         if (action === merge) {
43155             updatePresetTags(context.graph(), ids);
43156         }
43157
43158         context.enter(modeSelect(context, ids));
43159     };
43160
43161
43162     operation.available = function() {
43163         return selectedIDs.length >= 2;
43164     };
43165
43166
43167     operation.disabled = function() {
43168         return join.disabled(context.graph()) &&
43169             merge.disabled(context.graph()) &&
43170             mergePolygon.disabled(context.graph());
43171     };
43172
43173
43174     operation.tooltip = function() {
43175         var j = join.disabled(context.graph()),
43176             m = merge.disabled(context.graph()),
43177             p = mergePolygon.disabled(context.graph());
43178
43179         if (j === 'restriction' && m && p) {
43180             return t('operations.merge.restriction',
43181                 { relation: context.presets().item('type/restriction').name() });
43182         }
43183
43184         if (p === 'incomplete_relation' && j && m) {
43185             return t('operations.merge.incomplete_relation');
43186         }
43187
43188         if (j && m && p) {
43189             return t('operations.merge.' + j);
43190         }
43191
43192         return t('operations.merge.description');
43193     };
43194
43195
43196     operation.annotation = function() {
43197         return t('operations.merge.annotation', { n: selectedIDs.length });
43198     };
43199
43200
43201     operation.id = 'merge';
43202     operation.keys = [t('operations.merge.key')];
43203     operation.title = t('operations.merge.title');
43204     operation.behavior = behaviorOperation(context).which(operation);
43205
43206     return operation;
43207 }
43208
43209 function operationMove(selectedIDs, context) {
43210     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43211         extent = selectedIDs.reduce(function(extent, id) {
43212             return extent.extend(context.entity(id).extent(context.graph()));
43213         }, geoExtent$$1());
43214
43215
43216     var operation = function() {
43217         context.enter(modeMove$$1(context, selectedIDs));
43218     };
43219
43220
43221     operation.available = function() {
43222         return selectedIDs.length > 1 ||
43223             context.entity(selectedIDs[0]).type !== 'node';
43224     };
43225
43226
43227     operation.disabled = function() {
43228         var reason;
43229         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43230             reason = 'too_large';
43231         } else if (some(selectedIDs, context.hasHiddenConnections)) {
43232             reason = 'connected_to_hidden';
43233         } else if (some(selectedIDs, incompleteRelation)) {
43234             reason = 'incomplete_relation';
43235         }
43236         return reason;
43237
43238         function incompleteRelation(id) {
43239             var entity = context.entity(id);
43240             return entity.type === 'relation' && !entity.isComplete(context.graph());
43241         }
43242     };
43243
43244
43245     operation.tooltip = function() {
43246         var disable = operation.disabled();
43247         return disable ?
43248             t('operations.move.' + disable + '.' + multi) :
43249             t('operations.move.description.' + multi);
43250     };
43251
43252
43253     operation.annotation = function() {
43254         return selectedIDs.length === 1 ?
43255             t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
43256             t('operations.move.annotation.multiple');
43257     };
43258
43259
43260     operation.id = 'move';
43261     operation.keys = [t('operations.move.key')];
43262     operation.title = t('operations.move.title');
43263     operation.behavior = behaviorOperation(context).which(operation);
43264
43265     return operation;
43266 }
43267
43268 function operationOrthogonalize(selectedIDs, context) {
43269     var entityId = selectedIDs[0],
43270         entity = context.entity(entityId),
43271         extent = entity.extent(context.graph()),
43272         geometry = context.geometry(entityId),
43273         action = actionOrthogonalize(entityId, context.projection);
43274
43275
43276     var operation = function() {
43277         context.perform(action, operation.annotation());
43278     };
43279
43280
43281     operation.available = function() {
43282         return selectedIDs.length === 1 &&
43283             entity.type === 'way' &&
43284             entity.isClosed() &&
43285             uniq(entity.nodes).length > 2;
43286     };
43287
43288
43289     operation.disabled = function() {
43290         var reason;
43291         if (extent.percentContainedIn(context.extent()) < 0.8) {
43292             reason = 'too_large';
43293         } else if (context.hasHiddenConnections(entityId)) {
43294             reason = 'connected_to_hidden';
43295         }
43296         return action.disabled(context.graph()) || reason;
43297     };
43298
43299
43300     operation.tooltip = function() {
43301         var disable = operation.disabled();
43302         return disable ?
43303             t('operations.orthogonalize.' + disable) :
43304             t('operations.orthogonalize.description.' + geometry);
43305     };
43306
43307
43308     operation.annotation = function() {
43309         return t('operations.orthogonalize.annotation.' + geometry);
43310     };
43311
43312
43313     operation.id = 'orthogonalize';
43314     operation.keys = [t('operations.orthogonalize.key')];
43315     operation.title = t('operations.orthogonalize.title');
43316     operation.behavior = behaviorOperation(context).which(operation);
43317
43318     return operation;
43319 }
43320
43321 /**
43322  * This method is like `_.uniq` except that it accepts `iteratee` which is
43323  * invoked for each element in `array` to generate the criterion by which
43324  * uniqueness is computed. The order of result values is determined by the
43325  * order they occur in the array. The iteratee is invoked with one argument:
43326  * (value).
43327  *
43328  * @static
43329  * @memberOf _
43330  * @since 4.0.0
43331  * @category Array
43332  * @param {Array} array The array to inspect.
43333  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43334  * @returns {Array} Returns the new duplicate free array.
43335  * @example
43336  *
43337  * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
43338  * // => [2.1, 1.2]
43339  *
43340  * // The `_.property` iteratee shorthand.
43341  * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
43342  * // => [{ 'x': 1 }, { 'x': 2 }]
43343  */
43344 function uniqBy(array, iteratee) {
43345   return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
43346 }
43347
43348 function operationReflectShort(selectedIDs, context) {
43349     return operationReflect(selectedIDs, context, 'short');
43350 }
43351
43352
43353 function operationReflectLong(selectedIDs, context) {
43354     return operationReflect(selectedIDs, context, 'long');
43355 }
43356
43357
43358 function operationReflect(selectedIDs, context, axis) {
43359     axis = axis || 'long';
43360     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43361         extent = selectedIDs.reduce(function(extent, id) {
43362             return extent.extend(context.entity(id).extent(context.graph()));
43363         }, geoExtent$$1());
43364
43365
43366     var operation = function() {
43367         var action = actionReflect(selectedIDs, context.projection)
43368             .useLongAxis(Boolean(axis === 'long'));
43369         context.perform(action, operation.annotation());
43370     };
43371
43372
43373     operation.available = function() {
43374         var nodes = utilGetAllNodes(selectedIDs, context.graph());
43375         return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
43376     };
43377
43378
43379     operation.disabled = function() {
43380         var reason;
43381         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43382             reason = 'too_large';
43383         } else if (some(selectedIDs, context.hasHiddenConnections)) {
43384             reason = 'connected_to_hidden';
43385         } else if (some(selectedIDs, incompleteRelation)) {
43386             reason = 'incomplete_relation';
43387         }
43388         return reason;
43389
43390         function incompleteRelation(id) {
43391             var entity = context.entity(id);
43392             return entity.type === 'relation' && !entity.isComplete(context.graph());
43393         }
43394     };
43395
43396
43397     operation.tooltip = function() {
43398         var disable = operation.disabled();
43399         return disable ?
43400             t('operations.reflect.' + disable + '.' + multi) :
43401             t('operations.reflect.description.' + axis + '.' + multi);
43402     };
43403
43404
43405     operation.annotation = function() {
43406         return t('operations.reflect.annotation.' + axis + '.' + multi);
43407     };
43408
43409
43410     operation.id = 'reflect-' + axis;
43411     operation.keys = [t('operations.reflect.key.' + axis)];
43412     operation.title = t('operations.reflect.title.' + axis);
43413     operation.behavior = behaviorOperation(context).which(operation);
43414
43415     return operation;
43416 }
43417
43418 function operationReverse(selectedIDs, context) {
43419     var entityId = selectedIDs[0];
43420
43421     var operation = function() {
43422         context.perform(actionReverse(entityId), operation.annotation());
43423     };
43424
43425
43426     operation.available = function() {
43427         return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
43428     };
43429
43430
43431     operation.disabled = function() {
43432         return false;
43433     };
43434
43435
43436     operation.tooltip = function() {
43437         return t('operations.reverse.description');
43438     };
43439
43440
43441     operation.annotation = function() {
43442         return t('operations.reverse.annotation');
43443     };
43444
43445
43446     operation.id = 'reverse';
43447     operation.keys = [t('operations.reverse.key')];
43448     operation.title = t('operations.reverse.title');
43449     operation.behavior = behaviorOperation(context).which(operation);
43450
43451     return operation;
43452 }
43453
43454 function operationRotate(selectedIDs, context) {
43455     var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43456         extent = selectedIDs.reduce(function(extent, id) {
43457             return extent.extend(context.entity(id).extent(context.graph()));
43458         }, geoExtent$$1());
43459
43460
43461     var operation = function() {
43462         context.enter(modeRotate$$1(context, selectedIDs));
43463     };
43464
43465
43466     operation.available = function() {
43467         var nodes = utilGetAllNodes(selectedIDs, context.graph());
43468         return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
43469     };
43470
43471
43472     operation.disabled = function() {
43473         var reason;
43474         if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43475             reason = 'too_large';
43476         } else if (some(selectedIDs, context.hasHiddenConnections)) {
43477             reason = 'connected_to_hidden';
43478         } else if (some(selectedIDs, incompleteRelation)) {
43479             reason = 'incomplete_relation';
43480         }
43481         return reason;
43482
43483         function incompleteRelation(id) {
43484             var entity = context.entity(id);
43485             return entity.type === 'relation' && !entity.isComplete(context.graph());
43486         }
43487     };
43488
43489
43490     operation.tooltip = function() {
43491         var disable = operation.disabled();
43492         return disable ?
43493             t('operations.rotate.' + disable + '.' + multi) :
43494             t('operations.rotate.description.' + multi);
43495     };
43496
43497
43498     operation.annotation = function() {
43499         return selectedIDs.length === 1 ?
43500             t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
43501             t('operations.rotate.annotation.multiple');
43502     };
43503
43504
43505     operation.id = 'rotate';
43506     operation.keys = [t('operations.rotate.key')];
43507     operation.title = t('operations.rotate.title');
43508     operation.behavior = behaviorOperation(context).which(operation);
43509
43510     return operation;
43511 }
43512
43513 function operationSplit(selectedIDs, context) {
43514     var vertices = filter(selectedIDs, function(entityId) {
43515         return context.geometry(entityId) === 'vertex';
43516     });
43517
43518     var entityId = vertices[0],
43519         action = actionSplit(entityId),
43520         ways = [];
43521
43522     if (vertices.length === 1) {
43523         if (selectedIDs.length > 1) {
43524             action.limitWays(without(selectedIDs, entityId));
43525         }
43526         ways = action.ways(context.graph());
43527     }
43528
43529
43530     var operation = function() {
43531         var difference = context.perform(action, operation.annotation());
43532         context.enter(modeSelect(context, difference.extantIDs()));
43533     };
43534
43535
43536     operation.available = function() {
43537         return vertices.length === 1;
43538     };
43539
43540
43541     operation.disabled = function() {
43542         var reason;
43543         if (some(selectedIDs, context.hasHiddenConnections)) {
43544             reason = 'connected_to_hidden';
43545         }
43546         return action.disabled(context.graph()) || reason;
43547     };
43548
43549
43550     operation.tooltip = function() {
43551         var disable = operation.disabled();
43552         if (disable) {
43553             return t('operations.split.' + disable);
43554         }
43555         if (ways.length === 1) {
43556             return t('operations.split.description.' + context.geometry(ways[0].id));
43557         } else {
43558             return t('operations.split.description.multiple');
43559         }
43560     };
43561
43562
43563     operation.annotation = function() {
43564         return ways.length === 1 ?
43565             t('operations.split.annotation.' + context.geometry(ways[0].id)) :
43566             t('operations.split.annotation.multiple', { n: ways.length });
43567     };
43568
43569
43570     operation.id = 'split';
43571     operation.keys = [t('operations.split.key')];
43572     operation.title = t('operations.split.title');
43573     operation.behavior = behaviorOperation(context).which(operation);
43574
43575     return operation;
43576 }
43577
43578 function operationStraighten(selectedIDs, context) {
43579     var entityId = selectedIDs[0],
43580         action = actionStraighten(entityId, context.projection);
43581
43582
43583     function operation() {
43584         context.perform(action, operation.annotation());
43585     }
43586
43587
43588     operation.available = function() {
43589         var entity = context.entity(entityId);
43590         return selectedIDs.length === 1 &&
43591             entity.type === 'way' &&
43592             !entity.isClosed() &&
43593             uniq(entity.nodes).length > 2;
43594     };
43595
43596
43597     operation.disabled = function() {
43598         var reason;
43599         if (context.hasHiddenConnections(entityId)) {
43600             reason = 'connected_to_hidden';
43601         }
43602         return action.disabled(context.graph()) || reason;
43603     };
43604
43605
43606     operation.tooltip = function() {
43607         var disable = operation.disabled();
43608         return disable ?
43609             t('operations.straighten.' + disable) :
43610             t('operations.straighten.description');
43611     };
43612
43613
43614     operation.annotation = function() {
43615         return t('operations.straighten.annotation');
43616     };
43617
43618
43619     operation.id = 'straighten';
43620     operation.keys = [t('operations.straighten.key')];
43621     operation.title = t('operations.straighten.title');
43622     operation.behavior = behaviorOperation(context).which(operation);
43623
43624     return operation;
43625 }
43626
43627
43628
43629 var Operations = Object.freeze({
43630         operationCircularize: operationCircularize,
43631         operationContinue: operationContinue,
43632         operationDelete: operationDelete,
43633         operationDisconnect: operationDisconnect,
43634         operationMerge: operationMerge,
43635         operationMove: operationMove,
43636         operationOrthogonalize: operationOrthogonalize,
43637         operationReflectShort: operationReflectShort,
43638         operationReflectLong: operationReflectLong,
43639         operationReverse: operationReverse,
43640         operationRotate: operationRotate,
43641         operationSplit: operationSplit,
43642         operationStraighten: operationStraighten
43643 });
43644
43645 function modeMove$$1(context, entityIDs, baseGraph) {
43646     var mode = {
43647         id: 'move',
43648         button: 'browse'
43649     };
43650
43651     var keybinding = d3keybinding('move'),
43652         behaviors = [
43653             behaviorEdit(context),
43654             operationCircularize(entityIDs, context).behavior,
43655             operationDelete(entityIDs, context).behavior,
43656             operationOrthogonalize(entityIDs, context).behavior,
43657             operationReflectLong(entityIDs, context).behavior,
43658             operationReflectShort(entityIDs, context).behavior,
43659             operationRotate(entityIDs, context).behavior
43660         ],
43661         annotation = entityIDs.length === 1 ?
43662             t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
43663             t('operations.move.annotation.multiple'),
43664         prevGraph,
43665         cache,
43666         origin,
43667         nudgeInterval;
43668
43669
43670     function vecSub(a, b) {
43671         return [a[0] - b[0], a[1] - b[1]];
43672     }
43673
43674
43675     function edge(point, size) {
43676         var pad = [80, 20, 50, 20],   // top, right, bottom, left
43677             x = 0,
43678             y = 0;
43679
43680         if (point[0] > size[0] - pad[1])
43681             x = -10;
43682         if (point[0] < pad[3])
43683             x = 10;
43684         if (point[1] > size[1] - pad[2])
43685             y = -10;
43686         if (point[1] < pad[0])
43687             y = 10;
43688
43689         if (x || y) {
43690             return [x, y];
43691         } else {
43692             return null;
43693         }
43694     }
43695
43696
43697     function doMove(nudge) {
43698         nudge = nudge || [0, 0];
43699
43700         var fn;
43701         if (prevGraph !== context.graph()) {
43702             cache = {};
43703             origin = context.map().mouseCoordinates();
43704             fn = context.perform;
43705         } else {
43706             fn = context.overwrite;
43707         }
43708
43709         var currMouse = context.mouse(),
43710             origMouse = context.projection(origin),
43711             delta = vecSub(vecSub(currMouse, origMouse), nudge);
43712
43713         fn(actionMove(entityIDs, delta, context.projection, cache), annotation);
43714         prevGraph = context.graph();
43715     }
43716
43717
43718     function startNudge(nudge) {
43719         if (nudgeInterval) window.clearInterval(nudgeInterval);
43720         nudgeInterval = window.setInterval(function() {
43721             context.pan(nudge);
43722             doMove(nudge);
43723         }, 50);
43724     }
43725
43726
43727     function stopNudge() {
43728         if (nudgeInterval) {
43729             window.clearInterval(nudgeInterval);
43730             nudgeInterval = null;
43731         }
43732     }
43733
43734
43735     function move() {
43736         doMove();
43737         var nudge = edge(context.mouse(), context.map().dimensions());
43738         if (nudge) {
43739             startNudge(nudge);
43740         } else {
43741             stopNudge();
43742         }
43743     }
43744
43745
43746     function finish() {
43747         event.stopPropagation();
43748         context.enter(modeSelect(context, entityIDs));
43749         stopNudge();
43750     }
43751
43752
43753     function cancel() {
43754         if (baseGraph) {
43755             while (context.graph() !== baseGraph) context.pop();
43756             context.enter(modeBrowse(context));
43757         } else {
43758             context.pop();
43759             context.enter(modeSelect(context, entityIDs));
43760         }
43761         stopNudge();
43762     }
43763
43764
43765     function undone() {
43766         context.enter(modeBrowse(context));
43767     }
43768
43769
43770     mode.enter = function() {
43771         origin = context.map().mouseCoordinates();
43772         prevGraph = null;
43773         cache = {};
43774
43775         behaviors.forEach(function(behavior) {
43776             context.install(behavior);
43777         });
43778
43779         context.surface()
43780             .on('mousemove.move', move)
43781             .on('click.move', finish);
43782
43783         context.history()
43784             .on('undone.move', undone);
43785
43786         keybinding
43787             .on('⎋', cancel)
43788             .on('↩', finish);
43789
43790         d3_select(document)
43791             .call(keybinding);
43792     };
43793
43794
43795     mode.exit = function() {
43796         stopNudge();
43797
43798         behaviors.forEach(function(behavior) {
43799             context.uninstall(behavior);
43800         });
43801
43802         context.surface()
43803             .on('mousemove.move', null)
43804             .on('click.move', null);
43805
43806         context.history()
43807             .on('undone.move', null);
43808
43809         keybinding.off();
43810     };
43811
43812
43813     return mode;
43814 }
43815
43816 function modeRotate$$1(context, entityIDs) {
43817     var mode = {
43818         id: 'rotate',
43819         button: 'browse'
43820     };
43821
43822     var keybinding = d3keybinding('rotate'),
43823         behaviors = [
43824             behaviorEdit(context),
43825             operationCircularize(entityIDs, context).behavior,
43826             operationDelete(entityIDs, context).behavior,
43827             operationMove(entityIDs, context).behavior,
43828             operationOrthogonalize(entityIDs, context).behavior,
43829             operationReflectLong(entityIDs, context).behavior,
43830             operationReflectShort(entityIDs, context).behavior
43831         ],
43832         annotation = entityIDs.length === 1 ?
43833             t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
43834             t('operations.rotate.annotation.multiple'),
43835         prevGraph,
43836         prevAngle,
43837         prevTransform,
43838         pivot;
43839
43840
43841     function doRotate() {
43842         var fn;
43843         if (context.graph() !== prevGraph) {
43844             fn = context.perform;
43845         } else {
43846             fn = context.replace;
43847         }
43848
43849         // projection changed, recalculate pivot
43850         var projection = context.projection;
43851         var currTransform = projection.transform();
43852         if (!prevTransform ||
43853             currTransform.k !== prevTransform.k ||
43854             currTransform.x !== prevTransform.x ||
43855             currTransform.y !== prevTransform.y) {
43856
43857             var nodes = utilGetAllNodes(entityIDs, context.graph()),
43858                 points = nodes.map(function(n) { return projection(n.loc); });
43859
43860             if (points.length === 1) {  // degenerate case
43861                 pivot = points[0];
43862             } else if (points.length === 2) {
43863                 pivot = geoInterp(points[0], points[1], 0.5);
43864             } else {
43865                 pivot = d3_polygonCentroid(d3_polygonHull(points));
43866             }
43867             prevAngle = undefined;
43868         }
43869
43870
43871         var currMouse = context.mouse(),
43872             currAngle = Math.atan2(currMouse[1] - pivot[1], currMouse[0] - pivot[0]);
43873
43874         if (typeof prevAngle === 'undefined') prevAngle = currAngle;
43875         var delta = currAngle - prevAngle;
43876
43877         fn(actionRotate(entityIDs, pivot, delta, projection), annotation);
43878
43879         prevTransform = currTransform;
43880         prevAngle = currAngle;
43881         prevGraph = context.graph();
43882     }
43883
43884
43885     function finish() {
43886         event.stopPropagation();
43887         context.enter(modeSelect(context, entityIDs));
43888     }
43889
43890
43891     function cancel() {
43892         context.pop();
43893         context.enter(modeSelect(context, entityIDs));
43894     }
43895
43896
43897     function undone() {
43898         context.enter(modeBrowse(context));
43899     }
43900
43901
43902     mode.enter = function() {
43903         behaviors.forEach(function(behavior) {
43904             context.install(behavior);
43905         });
43906
43907         context.surface()
43908             .on('mousemove.rotate', doRotate)
43909             .on('click.rotate', finish);
43910
43911         context.history()
43912             .on('undone.rotate', undone);
43913
43914         keybinding
43915             .on('⎋', cancel)
43916             .on('↩', finish);
43917
43918         d3_select(document)
43919             .call(keybinding);
43920     };
43921
43922
43923     mode.exit = function() {
43924         behaviors.forEach(function(behavior) {
43925             context.uninstall(behavior);
43926         });
43927
43928         context.surface()
43929             .on('mousemove.rotate', null)
43930             .on('click.rotate', null);
43931
43932         context.history()
43933             .on('undone.rotate', null);
43934
43935         keybinding.off();
43936     };
43937
43938
43939     return mode;
43940 }
43941
43942 function modeSave$$1(context) {
43943     var mode = {
43944         id: 'save'
43945     };
43946
43947     var keybinding = d3keybinding('select');
43948
43949     var commit = uiCommit(context)
43950         .on('cancel', cancel)
43951         .on('save', save);
43952
43953
43954     function cancel() {
43955         context.enter(modeBrowse(context));
43956     }
43957
43958
43959     function save(changeset, tryAgain) {
43960
43961         var osm = context.connection(),
43962             loading = uiLoading(context).message(t('save.uploading')).blocking(true),
43963             history = context.history(),
43964             origChanges = history.changes(actionDiscardTags(history.difference())),
43965             localGraph = context.graph(),
43966             remoteGraph = coreGraph$$1(history.base(), true),
43967             modified = filter(history.difference().summary(), {changeType: 'modified'}),
43968             toCheck = map$4(map$4(modified, 'entity'), 'id'),
43969             toLoad = withChildNodes(toCheck, localGraph),
43970             conflicts = [],
43971             errors = [];
43972
43973         if (!osm) return;
43974
43975         if (!tryAgain) {
43976             history.perform(actionNoop());  // checkpoint
43977         }
43978
43979         context.container().call(loading);
43980
43981         if (toCheck.length) {
43982             osm.loadMultiple(toLoad, loaded);
43983         } else {
43984             upload();
43985         }
43986
43987
43988         function withChildNodes(ids, graph) {
43989             return uniq(reduce(ids, function(result, id) {
43990                 var entity = graph.entity(id);
43991                 if (entity.type === 'way') {
43992                     try {
43993                         var cn = graph.childNodes(entity);
43994                         result.push.apply(result, map$4(filter(cn, 'version'), 'id'));
43995                     } catch (err) {
43996                         /* eslint-disable no-console */
43997                         if (typeof console !== 'undefined') console.error(err);
43998                         /* eslint-enable no-console */
43999                     }
44000                 }
44001                 return result;
44002             }, clone(ids)));
44003         }
44004
44005
44006         // Reload modified entities into an alternate graph and check for conflicts..
44007         function loaded(err, result) {
44008             if (errors.length) return;
44009
44010             if (err) {
44011                 errors.push({
44012                     msg: err.responseText,
44013                     details: [ t('save.status_code', { code: err.status }) ]
44014                 });
44015                 showErrors();
44016
44017             } else {
44018                 var loadMore = [];
44019                 forEach(result.data, function(entity) {
44020                     remoteGraph.replace(entity);
44021                     toLoad = without(toLoad, entity.id);
44022
44023                     // Because loadMultiple doesn't download /full like loadEntity,
44024                     // need to also load children that aren't already being checked..
44025                     if (!entity.visible) return;
44026                     if (entity.type === 'way') {
44027                         loadMore.push.apply(loadMore,
44028                             difference(entity.nodes, toCheck, toLoad, loadMore));
44029                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
44030                         loadMore.push.apply(loadMore,
44031                             difference(map$4(entity.members, 'id'), toCheck, toLoad, loadMore));
44032                     }
44033                 });
44034
44035                 if (loadMore.length) {
44036                     toLoad.push.apply(toLoad, loadMore);
44037                     osm.loadMultiple(loadMore, loaded);
44038                 }
44039
44040                 if (!toLoad.length) {
44041                     checkConflicts();
44042                 }
44043             }
44044         }
44045
44046
44047         function checkConflicts() {
44048             function choice(id, text, action) {
44049                 return { id: id, text: text, action: function() { history.replace(action); } };
44050             }
44051             function formatUser(d) {
44052                 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
44053             }
44054             function entityName(entity) {
44055                 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
44056             }
44057
44058             function compareVersions(local, remote) {
44059                 if (local.version !== remote.version) return false;
44060
44061                 if (local.type === 'way') {
44062                     var children = union(local.nodes, remote.nodes);
44063
44064                     for (var i = 0; i < children.length; i++) {
44065                         var a = localGraph.hasEntity(children[i]),
44066                             b = remoteGraph.hasEntity(children[i]);
44067
44068                         if (a && b && a.version !== b.version) return false;
44069                     }
44070                 }
44071
44072                 return true;
44073             }
44074
44075             forEach(toCheck, function(id) {
44076                 var local = localGraph.entity(id),
44077                     remote = remoteGraph.entity(id);
44078
44079                 if (compareVersions(local, remote)) return;
44080
44081                 var action = actionMergeRemoteChanges,
44082                     merge = action(id, localGraph, remoteGraph, formatUser);
44083
44084                 history.replace(merge);
44085
44086                 var mergeConflicts = merge.conflicts();
44087                 if (!mergeConflicts.length) return;  // merged safely
44088
44089                 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local'),
44090                     forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote'),
44091                     keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore')),
44092                     keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
44093
44094                 conflicts.push({
44095                     id: id,
44096                     name: entityName(local),
44097                     details: mergeConflicts,
44098                     chosen: 1,
44099                     choices: [
44100                         choice(id, keepMine, forceLocal),
44101                         choice(id, keepTheirs, forceRemote)
44102                     ]
44103                 });
44104             });
44105
44106             upload();
44107         }
44108
44109
44110         function upload() {
44111             if (conflicts.length) {
44112                 conflicts.sort(function(a,b) { return b.id.localeCompare(a.id); });
44113                 showConflicts();
44114             } else if (errors.length) {
44115                 showErrors();
44116             } else {
44117                 var changes = history.changes(actionDiscardTags(history.difference()));
44118                 if (changes.modified.length || changes.created.length || changes.deleted.length) {
44119                     osm.putChangeset(changeset, changes, uploadCallback);
44120                 } else {        // changes were insignificant or reverted by user
44121                     d3_select('.inspector-wrap *').remove();
44122                     loading.close();
44123                     context.flush();
44124                     cancel();
44125                 }
44126             }
44127         }
44128
44129
44130         function uploadCallback(err, changeset) {
44131             if (err) {
44132                 errors.push({
44133                     msg: err.responseText,
44134                     details: [ t('save.status_code', { code: err.status }) ]
44135                 });
44136                 showErrors();
44137             } else {
44138                 history.clearSaved();
44139                 success(changeset);
44140                 // Add delay to allow for postgres replication #1646 #2678
44141                 window.setTimeout(function() {
44142                     d3_select('.inspector-wrap *').remove();
44143                     loading.close();
44144                     context.flush();
44145                 }, 2500);
44146             }
44147         }
44148
44149
44150         function showConflicts() {
44151             var selection$$1 = context.container()
44152                 .select('#sidebar')
44153                 .append('div')
44154                 .attr('class','sidebar-component');
44155
44156             loading.close();
44157
44158             selection$$1.call(uiConflicts(context)
44159                 .list(conflicts)
44160                 .origChanges(origChanges)
44161                 .on('cancel', function() {
44162                     history.pop();
44163                     selection$$1.remove();
44164                 })
44165                 .on('save', function() {
44166                     for (var i = 0; i < conflicts.length; i++) {
44167                         if (conflicts[i].chosen === 1) {  // user chose "keep theirs"
44168                             var entity = context.hasEntity(conflicts[i].id);
44169                             if (entity && entity.type === 'way') {
44170                                 var children = uniq(entity.nodes);
44171                                 for (var j = 0; j < children.length; j++) {
44172                                     history.replace(actionRevert(children[j]));
44173                                 }
44174                             }
44175                             history.replace(actionRevert(conflicts[i].id));
44176                         }
44177                     }
44178
44179                     selection$$1.remove();
44180                     save(changeset, true);
44181                 })
44182             );
44183         }
44184
44185
44186         function showErrors() {
44187             var selection$$1 = uiConfirm(context.container());
44188
44189             history.pop();
44190             loading.close();
44191
44192             selection$$1
44193                 .select('.modal-section.header')
44194                 .append('h3')
44195                 .text(t('save.error'));
44196
44197             addErrors(selection$$1, errors);
44198             selection$$1.okButton();
44199         }
44200
44201
44202         function addErrors(selection$$1, data) {
44203             var message = selection$$1
44204                 .select('.modal-section.message-text');
44205
44206             var items = message
44207                 .selectAll('.error-container')
44208                 .data(data);
44209
44210             var enter = items.enter()
44211                 .append('div')
44212                 .attr('class', 'error-container');
44213
44214             enter
44215                 .append('a')
44216                 .attr('class', 'error-description')
44217                 .attr('href', '#')
44218                 .classed('hide-toggle', true)
44219                 .text(function(d) { return d.msg || t('save.unknown_error_details'); })
44220                 .on('click', function() {
44221                     var error = d3_select(this),
44222                         detail = d3_select(this.nextElementSibling),
44223                         exp = error.classed('expanded');
44224
44225                     detail.style('display', exp ? 'none' : 'block');
44226                     error.classed('expanded', !exp);
44227
44228                     event.preventDefault();
44229                 });
44230
44231             var details = enter
44232                 .append('div')
44233                 .attr('class', 'error-detail-container')
44234                 .style('display', 'none');
44235
44236             details
44237                 .append('ul')
44238                 .attr('class', 'error-detail-list')
44239                 .selectAll('li')
44240                 .data(function(d) { return d.details || []; })
44241                 .enter()
44242                 .append('li')
44243                 .attr('class', 'error-detail-item')
44244                 .text(function(d) { return d; });
44245
44246             items.exit()
44247                 .remove();
44248         }
44249
44250     }
44251
44252
44253     function success(changeset) {
44254         commit.reset();
44255         context.enter(modeBrowse(context)
44256             .sidebar(uiSuccess(context)
44257                 .changeset(changeset)
44258                 .on('cancel', function() {
44259                     context.ui().sidebar.hide();
44260                 })
44261             )
44262         );
44263     }
44264
44265
44266     mode.enter = function() {
44267         function done() {
44268             context.ui().sidebar.show(commit);
44269         }
44270
44271         keybinding
44272             .on('⎋', cancel, true);
44273
44274         d3_select(document)
44275             .call(keybinding);
44276
44277         context.container().selectAll('#content')
44278             .attr('class', 'inactive');
44279
44280         var osm = context.connection();
44281         if (!osm) return;
44282
44283         if (osm.authenticated()) {
44284             done();
44285         } else {
44286             osm.authenticate(function(err) {
44287                 if (err) {
44288                     cancel();
44289                 } else {
44290                     done();
44291                 }
44292             });
44293         }
44294     };
44295
44296
44297     mode.exit = function() {
44298         keybinding.off();
44299
44300         context.container().selectAll('#content')
44301             .attr('class', 'active');
44302
44303         context.ui().sidebar.hide();
44304     };
44305
44306     return mode;
44307 }
44308
44309 /* Built-in method references for those with the same name as other `lodash` methods. */
44310 var nativeMin$1 = Math.min;
44311
44312 /**
44313  * The base implementation of methods like `_.intersection`, without support
44314  * for iteratee shorthands, that accepts an array of arrays to inspect.
44315  *
44316  * @private
44317  * @param {Array} arrays The arrays to inspect.
44318  * @param {Function} [iteratee] The iteratee invoked per element.
44319  * @param {Function} [comparator] The comparator invoked per element.
44320  * @returns {Array} Returns the new array of shared values.
44321  */
44322 function baseIntersection(arrays, iteratee, comparator) {
44323   var includes = comparator ? arrayIncludesWith : arrayIncludes,
44324       length = arrays[0].length,
44325       othLength = arrays.length,
44326       othIndex = othLength,
44327       caches = Array(othLength),
44328       maxLength = Infinity,
44329       result = [];
44330
44331   while (othIndex--) {
44332     var array = arrays[othIndex];
44333     if (othIndex && iteratee) {
44334       array = arrayMap(array, baseUnary(iteratee));
44335     }
44336     maxLength = nativeMin$1(array.length, maxLength);
44337     caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
44338       ? new SetCache(othIndex && array)
44339       : undefined;
44340   }
44341   array = arrays[0];
44342
44343   var index = -1,
44344       seen = caches[0];
44345
44346   outer:
44347   while (++index < length && result.length < maxLength) {
44348     var value = array[index],
44349         computed = iteratee ? iteratee(value) : value;
44350
44351     value = (comparator || value !== 0) ? value : 0;
44352     if (!(seen
44353           ? cacheHas(seen, computed)
44354           : includes(result, computed, comparator)
44355         )) {
44356       othIndex = othLength;
44357       while (--othIndex) {
44358         var cache = caches[othIndex];
44359         if (!(cache
44360               ? cacheHas(cache, computed)
44361               : includes(arrays[othIndex], computed, comparator))
44362             ) {
44363           continue outer;
44364         }
44365       }
44366       if (seen) {
44367         seen.push(computed);
44368       }
44369       result.push(value);
44370     }
44371   }
44372   return result;
44373 }
44374
44375 /**
44376  * Casts `value` to an empty array if it's not an array like object.
44377  *
44378  * @private
44379  * @param {*} value The value to inspect.
44380  * @returns {Array|Object} Returns the cast array-like object.
44381  */
44382 function castArrayLikeObject(value) {
44383   return isArrayLikeObject(value) ? value : [];
44384 }
44385
44386 /**
44387  * Creates an array of unique values that are included in all given arrays
44388  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
44389  * for equality comparisons. The order and references of result values are
44390  * determined by the first array.
44391  *
44392  * @static
44393  * @memberOf _
44394  * @since 0.1.0
44395  * @category Array
44396  * @param {...Array} [arrays] The arrays to inspect.
44397  * @returns {Array} Returns the new array of intersecting values.
44398  * @example
44399  *
44400  * _.intersection([2, 1], [2, 3]);
44401  * // => [2]
44402  */
44403 var intersection = baseRest(function(arrays) {
44404   var mapped = arrayMap(arrays, castArrayLikeObject);
44405   return (mapped.length && mapped[0] === arrays[0])
44406     ? baseIntersection(mapped)
44407     : [];
44408 });
44409
44410 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
44411 // For example, ⌘Z -> Ctrl+Z
44412 var uiCmd = function (code) {
44413     var detected = utilDetect();
44414
44415     if (detected.os === 'mac') {
44416         return code;
44417     }
44418
44419     if (detected.os === 'win') {
44420         if (code === '⌘⇧Z') return 'Ctrl+Y';
44421     }
44422
44423     var result = '',
44424         replacements = {
44425             '⌘': 'Ctrl',
44426             '⇧': 'Shift',
44427             '⌥': 'Alt',
44428             '⌫': 'Backspace',
44429             '⌦': 'Delete'
44430         };
44431
44432     for (var i = 0; i < code.length; i++) {
44433         if (code[i] in replacements) {
44434             result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
44435         } else {
44436             result += code[i];
44437         }
44438     }
44439
44440     return result;
44441 };
44442
44443
44444 // return a display-focused string for a given keyboard code
44445 uiCmd.display = function(code) {
44446     if (code.length !== 1) return code;
44447
44448     var detected = utilDetect();
44449     var mac = (detected.os === 'mac');
44450     var replacements = {
44451         '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
44452         '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
44453         '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
44454         '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
44455         '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
44456         '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
44457         '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
44458         '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
44459         '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
44460         '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
44461         '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
44462         '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
44463     };
44464
44465     return replacements[code] || code;
44466 };
44467
44468 // deprecation warning - Radial Menu to be removed in iD v3
44469 var relatedParent;
44470
44471
44472 function modeSelect(context, selectedIDs) {
44473     var mode = {
44474         id: 'select',
44475         button: 'browse'
44476     };
44477
44478     var keybinding = d3keybinding('select'),
44479         timeout = null,
44480         behaviors = [
44481             behaviorCopy(context),
44482             behaviorPaste(context),
44483             behaviorBreathe(context),
44484             behaviorHover(context),
44485             behaviorSelect(context),
44486             behaviorLasso(context),
44487             modeDragNode$$1(context).selectedIDs(selectedIDs).behavior
44488         ],
44489         inspector,
44490         editMenu,
44491         newFeature = false,
44492         suppressMenu = true,
44493         follow = false;
44494
44495
44496     var wrap = context.container()
44497         .select('.inspector-wrap');
44498
44499
44500     function singular() {
44501         if (selectedIDs.length === 1) {
44502             return context.hasEntity(selectedIDs[0]);
44503         }
44504     }
44505
44506
44507     function checkSelectedIDs() {
44508         var ids = [];
44509         if (Array.isArray(selectedIDs)) {
44510             ids = selectedIDs.filter(function(id) {
44511                 return context.hasEntity(id);
44512             });
44513         }
44514
44515         if (ids.length) {
44516             selectedIDs = ids;
44517         } else {
44518             context.enter(modeBrowse(context));
44519         }
44520         return !!ids.length;
44521     }
44522
44523
44524     // find the common parent ways for nextVertex, previousVertex
44525     function commonParents() {
44526         var graph = context.graph(),
44527             commonParents = [];
44528
44529         for (var i = 0; i < selectedIDs.length; i++) {
44530             var entity = context.hasEntity(selectedIDs[i]);
44531             if (!entity || entity.geometry(graph) !== 'vertex') {
44532                 return [];  // selection includes some not vertexes
44533             }
44534
44535             var currParents = map$4(graph.parentWays(entity), 'id');
44536             if (!commonParents.length) {
44537                 commonParents = currParents;
44538                 continue;
44539             }
44540
44541             commonParents = intersection(commonParents, currParents);
44542             if (!commonParents.length) {
44543                 return [];
44544             }
44545         }
44546
44547         return commonParents;
44548     }
44549
44550
44551     function singularParent() {
44552         var parents = commonParents();
44553         if (!parents || parents.length === 0) {
44554             relatedParent = null;
44555             return null;
44556         }
44557
44558         // relatedParent is used when we visit a vertex with multiple
44559         // parents, and we want to remember which parent line we started on.
44560
44561         if (parents.length === 1) {
44562             relatedParent = parents[0];  // remember this parent for later
44563             return relatedParent;
44564         }
44565
44566         if (parents.indexOf(relatedParent) !== -1) {
44567             return relatedParent;   // prefer the previously seen parent
44568         }
44569
44570         return parents[0];
44571     }
44572
44573
44574     function closeMenu() {
44575         if (editMenu) {
44576             context.surface().call(editMenu.close);
44577         }
44578     }
44579
44580
44581     function positionMenu() {
44582         if (!editMenu) { return; }
44583
44584         var entity = singular();
44585         if (entity && context.geometry(entity.id) === 'relation') {
44586             suppressMenu = true;
44587         } else {
44588             var point = context.mouse(),
44589                 viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
44590
44591             if (point && geoPointInPolygon(point, viewport)) {
44592                 editMenu.center(point);
44593             } else {
44594                 suppressMenu = true;
44595             }
44596         }
44597     }
44598
44599
44600     function showMenu() {
44601         closeMenu();
44602         if (editMenu) {
44603             context.surface().call(editMenu);
44604         }
44605     }
44606
44607
44608     function toggleMenu() {
44609         // deprecation warning - Radial Menu to be removed in iD v3
44610         if (d3_select('.edit-menu, .radial-menu').empty()) {
44611             positionMenu();
44612             showMenu();
44613         } else {
44614             closeMenu();
44615         }
44616     }
44617
44618
44619     mode.selectedIDs = function() {
44620         return selectedIDs;
44621     };
44622
44623
44624     mode.reselect = function() {
44625         if (!checkSelectedIDs()) return;
44626
44627         var surfaceNode = context.surface().node();
44628         if (surfaceNode.focus) {   // FF doesn't support it
44629             surfaceNode.focus();
44630         }
44631
44632         positionMenu();
44633         if (!suppressMenu) {
44634             showMenu();
44635         }
44636     };
44637
44638
44639     mode.newFeature = function(_) {
44640         if (!arguments.length) return newFeature;
44641         newFeature = _;
44642         return mode;
44643     };
44644
44645
44646     mode.suppressMenu = function(_) {
44647         if (!arguments.length) return suppressMenu;
44648         suppressMenu = _;
44649         return mode;
44650     };
44651
44652
44653     mode.follow = function(_) {
44654         if (!arguments.length) return follow;
44655         follow = _;
44656         return mode;
44657     };
44658
44659
44660     mode.enter = function() {
44661
44662         function update() {
44663             closeMenu();
44664             checkSelectedIDs();
44665         }
44666
44667
44668         function dblclick() {
44669             var target = d3_select(event.target),
44670                 datum = target.datum();
44671
44672             if (datum instanceof osmWay && !target.classed('fill')) {
44673                 var choice = geoChooseEdge(context.childNodes(datum), context.mouse(), context.projection),
44674                     prev = datum.nodes[choice.index - 1],
44675                     next = datum.nodes[choice.index];
44676
44677                 context.perform(
44678                     actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
44679                     t('operations.add.annotation.vertex')
44680                 );
44681
44682                 event.preventDefault();
44683                 event.stopPropagation();
44684
44685             } else if (datum.type === 'midpoint') {
44686                 context.perform(
44687                     actionAddMidpoint({loc: datum.loc, edge: datum.edge}, osmNode()),
44688                     t('operations.add.annotation.vertex'));
44689
44690                 event.preventDefault();
44691                 event.stopPropagation();
44692             }
44693         }
44694
44695
44696         function selectElements(drawn) {
44697             if (!checkSelectedIDs()) return;
44698
44699             var surface = context.surface(),
44700                 entity = singular();
44701
44702             if (entity && context.geometry(entity.id) === 'relation') {
44703                 suppressMenu = true;
44704                 return;
44705             }
44706
44707             surface.selectAll('.related')
44708                 .classed('related', false);
44709
44710             singularParent();
44711             if (relatedParent) {
44712                 surface.selectAll(utilEntitySelector([relatedParent]))
44713                     .classed('related', true);
44714             }
44715
44716             var selection$$1 = context.surface()
44717                 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
44718
44719             if (selection$$1.empty()) {
44720                 // Return to browse mode if selected DOM elements have
44721                 // disappeared because the user moved them out of view..
44722                 var source = event && event.type === 'zoom' && event.sourceEvent;
44723                 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
44724                     context.enter(modeBrowse(context));
44725                 }
44726             } else {
44727                 selection$$1
44728                     .classed('selected', true);
44729             }
44730         }
44731
44732
44733         function esc() {
44734             context.enter(modeBrowse(context));
44735         }
44736
44737
44738         function firstVertex() {
44739             event.preventDefault();
44740             var parent = singularParent();
44741             if (parent) {
44742                 var way = context.entity(parent);
44743                 context.enter(
44744                     modeSelect(context, [way.first()]).follow(true)
44745                 );
44746             }
44747         }
44748
44749
44750         function lastVertex() {
44751             event.preventDefault();
44752             var parent = singularParent();
44753             if (parent) {
44754                 var way = context.entity(parent);
44755                 context.enter(
44756                     modeSelect(context, [way.last()]).follow(true)
44757                 );
44758             }
44759         }
44760
44761
44762         function previousVertex() {
44763             event.preventDefault();
44764             var parent = singularParent();
44765             if (!parent) return;
44766
44767             var way = context.entity(parent),
44768                 length = way.nodes.length,
44769                 curr = way.nodes.indexOf(selectedIDs[0]),
44770                 index = -1;
44771
44772             if (curr > 0) {
44773                 index = curr - 1;
44774             } else if (way.isClosed()) {
44775                 index = length - 2;
44776             }
44777
44778             if (index !== -1) {
44779                 context.enter(
44780                     modeSelect(context, [way.nodes[index]]).follow(true)
44781                 );
44782             }
44783         }
44784
44785
44786         function nextVertex() {
44787             event.preventDefault();
44788             var parent = singularParent();
44789             if (!parent) return;
44790
44791             var way = context.entity(parent),
44792                 length = way.nodes.length,
44793                 curr = way.nodes.indexOf(selectedIDs[0]),
44794                 index = -1;
44795
44796             if (curr < length - 1) {
44797                 index = curr + 1;
44798             } else if (way.isClosed()) {
44799                 index = 0;
44800             }
44801
44802             if (index !== -1) {
44803                 context.enter(
44804                     modeSelect(context, [way.nodes[index]]).follow(true)
44805                 );
44806             }
44807         }
44808
44809
44810         function nextParent() {
44811             event.preventDefault();
44812             var parents = uniq(commonParents());
44813             if (!parents || parents.length < 2) return;
44814
44815             var index = parents.indexOf(relatedParent);
44816             if (index < 0 || index > parents.length - 2) {
44817                 relatedParent = parents[0];
44818             } else {
44819                 relatedParent = parents[index + 1];
44820             }
44821
44822             var surface = context.surface();
44823             surface.selectAll('.related')
44824                 .classed('related', false);
44825
44826             if (relatedParent) {
44827                 surface.selectAll(utilEntitySelector([relatedParent]))
44828                     .classed('related', true);
44829             }
44830         }
44831
44832
44833         if (!checkSelectedIDs()) return;
44834
44835         var operations = without(values$1(Operations), operationDelete)
44836                 .map(function(o) { return o(selectedIDs, context); })
44837                 .filter(function(o) { return o.available(); });
44838
44839         // deprecation warning - Radial Menu to be removed in iD v3
44840         var isRadialMenu = context.storage('edit-menu-style') === 'radial';
44841         if (isRadialMenu) {
44842             operations = operations.slice(0,7);
44843             operations.unshift(operationDelete(selectedIDs, context));
44844         } else {
44845             operations.push(operationDelete(selectedIDs, context));
44846         }
44847
44848         operations.forEach(function(operation) {
44849             if (operation.behavior) {
44850                 behaviors.push(operation.behavior);
44851             }
44852         });
44853
44854         behaviors.forEach(function(behavior) {
44855             context.install(behavior);
44856         });
44857
44858         keybinding
44859             .on(['[', 'pgup'], previousVertex)
44860             .on([']', 'pgdown'], nextVertex)
44861             .on(['{', uiCmd('⌘['), 'home'], firstVertex)
44862             .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
44863             .on(['\\', 'pause'], nextParent)
44864             .on('⎋', esc, true)
44865             .on('space', toggleMenu);
44866
44867         d3_select(document)
44868             .call(keybinding);
44869
44870
44871         // deprecation warning - Radial Menu to be removed in iD v3
44872         editMenu = isRadialMenu
44873             ? uiRadialMenu(context, operations)
44874             : uiEditMenu(context, operations);
44875
44876         context.ui().sidebar
44877             .select(singular() ? singular().id : null, newFeature);
44878
44879         context.history()
44880             .on('undone.select', update)
44881             .on('redone.select', update);
44882
44883         context.map()
44884             .on('move.select', closeMenu)
44885             .on('drawn.select', selectElements);
44886
44887         context.surface()
44888             .on('dblclick.select', dblclick);
44889
44890
44891         selectElements();
44892
44893         if (selectedIDs.length > 1) {
44894             var entities = uiSelectionList(context, selectedIDs);
44895             context.ui().sidebar.show(entities);
44896         }
44897
44898         if (follow) {
44899             var extent = geoExtent$$1(),
44900                 graph = context.graph();
44901             selectedIDs.forEach(function(id) {
44902                 var entity = context.entity(id);
44903                 extent._extend(entity.extent(graph));
44904             });
44905
44906             var loc = extent.center();
44907             context.map().centerEase(loc);
44908         } else if (singular() && singular().type === 'way') {
44909             context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
44910         }
44911
44912         timeout = window.setTimeout(function() {
44913             positionMenu();
44914             if (!suppressMenu) {
44915                 showMenu();
44916             }
44917         }, 270);  /* after any centerEase completes */
44918
44919     };
44920
44921
44922     mode.exit = function() {
44923         if (timeout) window.clearTimeout(timeout);
44924
44925         if (inspector) wrap.call(inspector.close);
44926
44927         behaviors.forEach(function(behavior) {
44928             context.uninstall(behavior);
44929         });
44930
44931         keybinding.off();
44932         closeMenu();
44933         editMenu = undefined;
44934
44935         context.history()
44936             .on('undone.select', null)
44937             .on('redone.select', null);
44938
44939         var surface = context.surface();
44940
44941         surface
44942             .on('dblclick.select', null);
44943
44944         surface
44945             .selectAll('.selected')
44946             .classed('selected', false);
44947
44948         surface
44949             .selectAll('.related')
44950             .classed('related', false);
44951
44952         context.map().on('drawn.select', null);
44953         context.ui().sidebar.hide();
44954     };
44955
44956
44957     return mode;
44958 }
44959
44960 function uiAccount(context) {
44961     var osm = context.connection();
44962
44963
44964     function update(selection$$1) {
44965         if (!osm) return;
44966
44967         if (!osm.authenticated()) {
44968             selection$$1.selectAll('#userLink, #logoutLink')
44969                 .classed('hide', true);
44970             return;
44971         }
44972
44973         osm.userDetails(function(err, details) {
44974             var userLink = selection$$1.select('#userLink'),
44975                 logoutLink = selection$$1.select('#logoutLink');
44976
44977             userLink.html('');
44978             logoutLink.html('');
44979
44980             if (err) return;
44981
44982             selection$$1.selectAll('#userLink, #logoutLink')
44983                 .classed('hide', false);
44984
44985             // Link
44986             userLink.append('a')
44987                 .attr('href', osm.userURL(details.display_name))
44988                 .attr('target', '_blank');
44989
44990             // Add thumbnail or dont
44991             if (details.image_url) {
44992                 userLink.append('img')
44993                     .attr('class', 'icon pre-text user-icon')
44994                     .attr('src', details.image_url);
44995             } else {
44996                 userLink
44997                     .call(svgIcon('#icon-avatar', 'pre-text light'));
44998             }
44999
45000             // Add user name
45001             userLink.append('span')
45002                 .attr('class', 'label')
45003                 .text(details.display_name);
45004
45005             logoutLink.append('a')
45006                 .attr('class', 'logout')
45007                 .attr('href', '#')
45008                 .text(t('logout'))
45009                 .on('click.logout', function() {
45010                     event.preventDefault();
45011                     osm.logout();
45012                 });
45013         });
45014     }
45015
45016
45017     return function(selection$$1) {
45018         selection$$1.append('li')
45019             .attr('id', 'logoutLink')
45020             .classed('hide', true);
45021
45022         selection$$1.append('li')
45023             .attr('id', 'userLink')
45024             .classed('hide', true);
45025
45026         if (osm) {
45027             osm.on('change.account', function() { update(selection$$1); });
45028             update(selection$$1);
45029         }
45030     };
45031 }
45032
45033 function uiAttribution(context) {
45034     var selection$$1;
45035
45036
45037     function attribution(data, klass) {
45038         var div = selection$$1.selectAll('.' + klass)
45039             .data([0]);
45040
45041         div = div.enter()
45042             .append('div')
45043             .attr('class', klass)
45044             .merge(div);
45045
45046
45047         var background = div.selectAll('.attribution')
45048             .data(data, function(d) { return d.name(); });
45049
45050         background.exit()
45051             .remove();
45052
45053         background = background.enter()
45054             .append('span')
45055             .attr('class', 'attribution')
45056             .each(function(d) {
45057                 if (d.terms_html) {
45058                     d3_select(this)
45059                         .html(d.terms_html);
45060                     return;
45061                 }
45062
45063                 var selection$$1;
45064                 if (d.terms_url) {
45065                     selection$$1 = d3_select(this)
45066                         .append('a')
45067                         .attr('href', d.terms_url)
45068                         .attr('target', '_blank');
45069                 } else {
45070                     selection$$1 = d3_select(this);
45071                 }
45072
45073
45074                 var id_safe = d.id.replace('.', '<TX_DOT>');
45075                 var terms_text = t('imagery.' + id_safe + '.attribution.text',
45076                     { default: d.terms_text || d.id || d.name() }
45077                 );
45078
45079                 if (d.icon && !d.overlay) {
45080                     selection$$1
45081                         .append('img')
45082                         .attr('class', 'source-image')
45083                         .attr('src', d.icon);
45084                 }
45085
45086                 selection$$1
45087                     .append('span')
45088                     .attr('class', 'attribution-text')
45089                     .text(terms_text);
45090             })
45091             .merge(background);
45092
45093
45094         var copyright = background.selectAll('.copyright-notice')
45095             .data(function(d) {
45096                 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
45097                 return notice ? [notice] : [];
45098             });
45099
45100         copyright.exit()
45101             .remove();
45102
45103         copyright = copyright.enter()
45104             .append('span')
45105             .attr('class', 'copyright-notice')
45106             .merge(copyright);
45107
45108         copyright
45109             .text(String);
45110     }
45111
45112
45113     function update() {
45114         attribution([context.background().baseLayerSource()], 'base-layer-attribution');
45115         attribution(context.background().overlayLayerSources().filter(function (s) {
45116             return s.validZoom(context.map().zoom());
45117         }), 'overlay-layer-attribution');
45118     }
45119
45120
45121     return function(select) {
45122         selection$$1 = select;
45123
45124         context.background()
45125             .on('change.attribution', update);
45126
45127         context.map()
45128             .on('move.attribution', throttle(update, 400, {leading: false}));
45129
45130         update();
45131     };
45132 }
45133
45134 function localeDateString(s) {
45135     if (!s) return null;
45136     var d = new Date(s);
45137     if (isNaN(d.getTime())) return null;
45138     return d.toLocaleDateString();
45139 }
45140
45141 function vintageRange(vintage) {
45142     var s;
45143     if (vintage.start || vintage.end) {
45144         s = (vintage.start || '?');
45145         if (vintage.start !== vintage.end) {
45146             s += ' - ' + (vintage.end || '?');
45147         }
45148     }
45149     return s;
45150 }
45151
45152
45153 function rendererBackgroundSource(data) {
45154     var source = clone(data),
45155         offset = [0, 0],
45156         name = source.name,
45157         description = source.description,
45158         best = !!source.best,
45159         template = source.template;
45160
45161     source.scaleExtent = data.scaleExtent || [0, 20];
45162     source.overzoom = data.overzoom !== false;
45163
45164
45165     source.offset = function(_) {
45166         if (!arguments.length) return offset;
45167         offset = _;
45168         return source;
45169     };
45170
45171
45172     source.nudge = function(_, zoomlevel) {
45173         offset[0] += _[0] / Math.pow(2, zoomlevel);
45174         offset[1] += _[1] / Math.pow(2, zoomlevel);
45175         return source;
45176     };
45177
45178
45179     source.name = function() {
45180         var id_safe = source.id.replace('.', '<TX_DOT>');
45181         return t('imagery.' + id_safe + '.name', { default: name });
45182     };
45183
45184
45185     source.description = function() {
45186         var id_safe = source.id.replace('.', '<TX_DOT>');
45187         return t('imagery.' + id_safe + '.description', { default: description });
45188     };
45189
45190
45191     source.best = function() {
45192         return best;
45193     };
45194
45195
45196     source.area = function() {
45197         if (!data.polygon) return Number.MAX_VALUE;  // worldwide
45198         var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
45199         return isNaN(area) ? 0 : area;
45200     };
45201
45202
45203     source.imageryUsed = function() {
45204         return name || source.id;
45205     };
45206
45207
45208     source.template = function(_) {
45209         if (!arguments.length) return template;
45210         if (source.id === 'custom') template = _;
45211         return source;
45212     };
45213
45214
45215     source.url = function(coord) {
45216         return template
45217             .replace('{x}', coord[0])
45218             .replace('{y}', coord[1])
45219             // TMS-flipped y coordinate
45220             .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
45221             .replace(/\{z(oom)?\}/, coord[2])
45222             .replace(/\{switch:([^}]+)\}/, function(s, r) {
45223                 var subdomains = r.split(',');
45224                 return subdomains[(coord[0] + coord[1]) % subdomains.length];
45225             })
45226             .replace('{u}', function() {
45227                 var u = '';
45228                 for (var zoom = coord[2]; zoom > 0; zoom--) {
45229                     var b = 0;
45230                     var mask = 1 << (zoom - 1);
45231                     if ((coord[0] & mask) !== 0) b++;
45232                     if ((coord[1] & mask) !== 0) b += 2;
45233                     u += b.toString();
45234                 }
45235                 return u;
45236             });
45237     };
45238
45239
45240     source.intersects = function(extent) {
45241         extent = extent.polygon();
45242         return !data.polygon || data.polygon.some(function(polygon) {
45243             return geoPolygonIntersectsPolygon(polygon, extent, true);
45244         });
45245     };
45246
45247
45248     source.validZoom = function(z) {
45249         return source.scaleExtent[0] <= z &&
45250             (source.overzoom || source.scaleExtent[1] > z);
45251     };
45252
45253
45254     source.isLocatorOverlay = function() {
45255         return source.id === 'mapbox_locator_overlay';
45256     };
45257
45258
45259     source.copyrightNotices = function() {};
45260
45261
45262     source.getMetadata = function(center, tileCoord, callback) {
45263         var vintage = {
45264             start: localeDateString(source.startDate),
45265             end: localeDateString(source.endDate)
45266         };
45267         vintage.range = vintageRange(vintage);
45268
45269         var metadata = { vintage: vintage };
45270         callback(null, metadata);
45271     };
45272
45273
45274     return source;
45275 }
45276
45277
45278 rendererBackgroundSource.Bing = function(data, dispatch) {
45279     // http://msdn.microsoft.com/en-us/library/ff701716.aspx
45280     // http://msdn.microsoft.com/en-us/library/ff701701.aspx
45281
45282     data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
45283
45284     var bing = rendererBackgroundSource(data),
45285         key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU', // Same as P2 and JOSM
45286         url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
45287             key + '&jsonp={callback}',
45288         cache = {},
45289         inflight = {},
45290         providers = [];
45291
45292     jsonpRequest(url, function(json) {
45293         providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
45294             return {
45295                 attribution: provider.attribution,
45296                 areas: provider.coverageAreas.map(function(area) {
45297                     return {
45298                         zoom: [area.zoomMin, area.zoomMax],
45299                         extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
45300                     };
45301                 })
45302             };
45303         });
45304         dispatch.call('change');
45305     });
45306
45307
45308     bing.copyrightNotices = function(zoom, extent) {
45309         zoom = Math.min(zoom, 21);
45310         return providers.filter(function(provider) {
45311             return some(provider.areas, function(area) {
45312                 return extent.intersects(area.extent) &&
45313                     area.zoom[0] <= zoom &&
45314                     area.zoom[1] >= zoom;
45315             });
45316         }).map(function(provider) {
45317             return provider.attribution;
45318         }).join(', ');
45319     };
45320
45321
45322     bing.getMetadata = function(center, tileCoord, callback) {
45323         var tileId = tileCoord.slice(0, 3).join('/'),
45324             zoom = Math.min(tileCoord[2], 21),
45325             centerPoint = center[1] + ',' + center[0],  // lat,lng
45326             url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
45327                 '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
45328
45329         if (inflight[tileId]) return;
45330
45331         if (!cache[tileId]) {
45332             cache[tileId] = {};
45333         }
45334         if (cache[tileId] && cache[tileId].metadata) {
45335             return callback(null, cache[tileId].metadata);
45336         }
45337
45338         inflight[tileId] = true;
45339         jsonpRequest(url, function(result) {
45340             delete inflight[tileId];
45341
45342             var err = (!result && 'Unknown Error') || result.errorDetails;
45343             if (err) {
45344                 return callback(err);
45345             } else {
45346                 var vintage = {
45347                     start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
45348                     end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
45349                 };
45350                 vintage.range = vintageRange(vintage);
45351
45352                 var metadata = { vintage: vintage };
45353                 cache[tileId].metadata = metadata;
45354                 return callback(null, metadata);
45355             }
45356         });
45357     };
45358
45359
45360     bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
45361
45362
45363     return bing;
45364 };
45365
45366
45367
45368 rendererBackgroundSource.Esri = function(data) {
45369
45370     // don't request blank tiles, instead overzoom real tiles - #4327
45371     // deprecated technique, but it works (for now)
45372     if (data.template.match(/blankTile/) === null) {
45373         data.template = data.template + '?blankTile=false';
45374     }
45375
45376     var esri = rendererBackgroundSource(data),
45377         cache = {},
45378         inflight = {};
45379
45380     esri.getMetadata = function(center, tileCoord, callback) {
45381         var tileId = tileCoord.slice(0, 3).join('/'),
45382             zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
45383             centerPoint = center[0] + ',' + center[1],  // long, lat (as it should be)
45384             unknown = t('info_panels.background.unknown'),
45385             metadataLayer,
45386             vintage = {},
45387             metadata = {};
45388
45389         if (inflight[tileId]) return;
45390
45391         switch (true) {
45392             case zoom >= 19:
45393                 metadataLayer = 3;
45394                 break;
45395             case zoom >= 17:
45396                 metadataLayer = 2;
45397                 break;
45398             case zoom >= 13:
45399                 metadataLayer = 0;
45400                 break;
45401             default:
45402                 metadataLayer = 99;
45403         }
45404
45405         // build up query using the layer appropriate to the current zoom
45406         var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/' + metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
45407
45408         if (!cache[tileId]) {
45409             cache[tileId] = {};
45410         }
45411         if (cache[tileId] && cache[tileId].metadata) {
45412             return callback(null, cache[tileId].metadata);
45413         }
45414
45415         // accurate metadata is only available >= 13
45416         if (metadataLayer === 99) {
45417             vintage = {
45418                 start: null,
45419                 end: null,
45420                 range: null
45421             };
45422             metadata = {
45423                 vintage: null,
45424                 source: unknown,
45425                 description: unknown,
45426                 resolution: unknown,
45427                 accuracy: unknown
45428             };
45429
45430             callback(null, metadata);
45431
45432         } else {
45433             inflight[tileId] = true;
45434             jsonpRequest(url, function(result) {
45435                 delete inflight[tileId];
45436
45437                 var err;
45438                 if (!result) {
45439                     err = 'Unknown Error';
45440                 } else if (result.features && result.features.length < 1) {
45441                     err = 'No Results';
45442                 } else if (result.error && result.error.message) {
45443                     err = result.error.message;
45444                 }
45445
45446                 if (err) {
45447                     return callback(err);
45448                 } else {
45449                     // pass through the discrete capture date from metadata
45450                     var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
45451                     vintage = {
45452                         start: captureDate,
45453                         end: captureDate,
45454                         range: captureDate
45455                     };
45456                     metadata = {
45457                         vintage: vintage,
45458                         source: clean(result.features[0].attributes.NICE_NAME),
45459                         description: clean(result.features[0].attributes.NICE_DESC),
45460                         resolution: clean(result.features[0].attributes.SRC_RES),
45461                         accuracy: clean(result.features[0].attributes.SRC_ACC)
45462                     };
45463
45464                     // append units - meters
45465                     if (isFinite(metadata.resolution)) {
45466                         metadata.resolution += ' m';
45467                     }
45468                     if (isFinite(metadata.accuracy)) {
45469                         metadata.accuracy += ' m';
45470                     }
45471
45472                     cache[tileId].metadata = metadata;
45473                     return callback(null, metadata);
45474                 }
45475             });
45476         }
45477
45478
45479         function clean(val) {
45480             return String(val).trim() || unknown;
45481         }
45482     };
45483
45484     return esri;
45485 };
45486
45487
45488 rendererBackgroundSource.None = function() {
45489     var source = rendererBackgroundSource({ id: 'none', template: '' });
45490
45491
45492     source.name = function() {
45493         return t('background.none');
45494     };
45495
45496
45497     source.imageryUsed = function() {
45498         return 'None';
45499     };
45500
45501
45502     source.area = function() {
45503         return -1;  // sources in background pane are sorted by area
45504     };
45505
45506
45507     return source;
45508 };
45509
45510
45511 rendererBackgroundSource.Custom = function(template) {
45512     var source = rendererBackgroundSource({ id: 'custom', template: template });
45513
45514
45515     source.name = function() {
45516         return t('background.custom');
45517     };
45518
45519
45520     source.imageryUsed = function() {
45521         return 'Custom (' + source.template() + ')';
45522     };
45523
45524
45525     source.area = function() {
45526         return -2;  // sources in background pane are sorted by area
45527     };
45528
45529
45530     return source;
45531 };
45532
45533 function rendererTileLayer(context) {
45534     var tileSize = 256,
45535         geotile = d3geoTile(),
45536         projection,
45537         cache = {},
45538         tileOrigin,
45539         z,
45540         transformProp = utilPrefixCSSProperty('Transform'),
45541         source;
45542
45543
45544     // blacklist overlay tiles around Null Island..
45545     function nearNullIsland(x, y, z) {
45546         if (z >= 7) {
45547             var center = Math.pow(2, z - 1),
45548                 width = Math.pow(2, z - 6),
45549                 min = center - (width / 2),
45550                 max = center + (width / 2) - 1;
45551             return x >= min && x <= max && y >= min && y <= max;
45552         }
45553         return false;
45554     }
45555
45556
45557     function tileSizeAtZoom(d, z) {
45558         var epsilon = 0.002;
45559         return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + epsilon;
45560     }
45561
45562
45563     function atZoom(t$$1, distance) {
45564         var power = Math.pow(2, distance);
45565         return [
45566             Math.floor(t$$1[0] * power),
45567             Math.floor(t$$1[1] * power),
45568             t$$1[2] + distance
45569         ];
45570     }
45571
45572
45573     function lookUp(d) {
45574         for (var up = -1; up > -d[2]; up--) {
45575             var tile = atZoom(d, up);
45576             if (cache[source.url(tile)] !== false) {
45577                 return tile;
45578             }
45579         }
45580     }
45581
45582
45583     function uniqueBy(a, n) {
45584         var o = [], seen = {};
45585         for (var i = 0; i < a.length; i++) {
45586             if (seen[a[i][n]] === undefined) {
45587                 o.push(a[i]);
45588                 seen[a[i][n]] = true;
45589             }
45590         }
45591         return o;
45592     }
45593
45594
45595     function addSource(d) {
45596         d.push(source.url(d));
45597         return d;
45598     }
45599
45600
45601     // Update tiles based on current state of `projection`.
45602     function background(selection$$1) {
45603         z = Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.log(2) - 8, 0);
45604
45605         var pixelOffset;
45606         if (source) {
45607             pixelOffset = [
45608                 source.offset()[0] * Math.pow(2, z),
45609                 source.offset()[1] * Math.pow(2, z)
45610             ];
45611         } else {
45612             pixelOffset = [0, 0];
45613         }
45614
45615         var translate = [
45616             projection.translate()[0] + pixelOffset[0],
45617             projection.translate()[1] + pixelOffset[1]
45618         ];
45619
45620         geotile
45621             .scale(projection.scale() * 2 * Math.PI)
45622             .translate(translate);
45623
45624         tileOrigin = [
45625             projection.scale() * Math.PI - translate[0],
45626             projection.scale() * Math.PI - translate[1]
45627         ];
45628
45629         render(selection$$1);
45630     }
45631
45632
45633     // Derive the tiles onscreen, remove those offscreen and position them.
45634     // Important that this part not depend on `projection` because it's
45635     // rentered when tiles load/error (see #644).
45636     function render(selection$$1) {
45637         if (!source) return;
45638         var requests = [];
45639         var showDebug = context.getDebug('tile') && !source.overlay;
45640
45641         if (source.validZoom(z)) {
45642             geotile().forEach(function(d) {
45643                 addSource(d);
45644                 if (d[3] === '') return;
45645                 if (typeof d[3] !== 'string') return; // Workaround for #2295
45646                 requests.push(d);
45647                 if (cache[d[3]] === false && lookUp(d)) {
45648                     requests.push(addSource(lookUp(d)));
45649                 }
45650             });
45651
45652             requests = uniqueBy(requests, 3).filter(function(r) {
45653                 if (!!source.overlay && nearNullIsland(r[0], r[1], r[2])) {
45654                     return false;
45655                 }
45656                 // don't re-request tiles which have failed in the past
45657                 return cache[r[3]] !== false;
45658             });
45659         }
45660
45661
45662         function load(d) {
45663             cache[d[3]] = true;
45664             d3_select(this)
45665                 .on('error', null)
45666                 .on('load', null)
45667                 .classed('tile-loaded', true);
45668             render(selection$$1);
45669         }
45670
45671         function error(d) {
45672             cache[d[3]] = false;
45673             d3_select(this)
45674                 .on('error', null)
45675                 .on('load', null)
45676                 .remove();
45677             render(selection$$1);
45678         }
45679
45680         function imageTransform(d) {
45681             var _ts = tileSize * Math.pow(2, z - d[2]);
45682             var scale = tileSizeAtZoom(d, z);
45683             return 'translate(' +
45684                 ((d[0] * _ts) - tileOrigin[0]) + 'px,' +
45685                 ((d[1] * _ts) - tileOrigin[1]) + 'px) ' +
45686                 'scale(' + scale + ',' + scale + ')';
45687         }
45688
45689         function tileCenter(d) {
45690             var _ts = tileSize * Math.pow(2, z - d[2]);
45691             return [
45692                 ((d[0] * _ts) - tileOrigin[0] + (_ts / 2)),
45693                 ((d[1] * _ts) - tileOrigin[1] + (_ts / 2))
45694             ];
45695         }
45696
45697         function debugTransform(d) {
45698             var coord = tileCenter(d);
45699             return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
45700         }
45701
45702
45703         // Pick a representative tile near the center of the viewport
45704         // (This is useful for sampling the imagery vintage)
45705         var dims = geotile.size(),
45706             mapCenter = [dims[0] / 2, dims[1] / 2],
45707             minDist = Math.max(dims[0], dims[1]),
45708             nearCenter;
45709
45710         requests.forEach(function(d) {
45711             var c = tileCenter(d);
45712             var dist = geoEuclideanDistance(c, mapCenter);
45713             if (dist < minDist) {
45714                 minDist = dist;
45715                 nearCenter = d;
45716             }
45717         });
45718
45719
45720         var image = selection$$1.selectAll('img')
45721             .data(requests, function(d) { return d[3]; });
45722
45723         image.exit()
45724             .style(transformProp, imageTransform)
45725             .classed('tile-removing', true)
45726             .classed('tile-center', false)
45727             .each(function() {
45728                 var tile = d3_select(this);
45729                 window.setTimeout(function() {
45730                     if (tile.classed('tile-removing')) {
45731                         tile.remove();
45732                     }
45733                 }, 300);
45734             });
45735
45736         image.enter()
45737           .append('img')
45738             .attr('class', 'tile')
45739             .attr('src', function(d) { return d[3]; })
45740             .on('error', error)
45741             .on('load', load)
45742           .merge(image)
45743             .style(transformProp, imageTransform)
45744             .classed('tile-debug', showDebug)
45745             .classed('tile-removing', false)
45746             .classed('tile-center', function(d) { return d === nearCenter; });
45747
45748
45749
45750         var debug = selection$$1.selectAll('.tile-label-debug')
45751             .data(showDebug ? requests : [], function(d) { return d[3]; });
45752
45753         debug.exit()
45754             .remove();
45755
45756         if (showDebug) {
45757             var debugEnter = debug.enter()
45758                 .append('div')
45759                 .attr('class', 'tile-label-debug');
45760
45761             debugEnter
45762                 .append('div')
45763                 .attr('class', 'tile-label-debug-coord');
45764
45765             debugEnter
45766                 .append('div')
45767                 .attr('class', 'tile-label-debug-vintage');
45768
45769             debug = debug.merge(debugEnter);
45770
45771             debug
45772                 .style(transformProp, debugTransform);
45773
45774             debug
45775                 .selectAll('.tile-label-debug-coord')
45776                 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
45777
45778             debug
45779                 .selectAll('.tile-label-debug-vintage')
45780                 .each(function(d) {
45781                     var span = d3_select(this);
45782                     var center = context.projection.invert(tileCenter(d));
45783                     source.getMetadata(center, d, function(err, result) {
45784                         span.text((result && result.vintage && result.vintage.range) ||
45785                             t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
45786                         );
45787                     });
45788                 });
45789         }
45790
45791     }
45792
45793
45794     background.projection = function(_) {
45795         if (!arguments.length) return projection;
45796         projection = _;
45797         return background;
45798     };
45799
45800
45801     background.dimensions = function(_) {
45802         if (!arguments.length) return geotile.size();
45803         geotile.size(_);
45804         return background;
45805     };
45806
45807
45808     background.source = function(_) {
45809         if (!arguments.length) return source;
45810         source = _;
45811         cache = {};
45812         geotile.scaleExtent(source.scaleExtent);
45813         return background;
45814     };
45815
45816
45817     return background;
45818 }
45819
45820 function rendererBackground(context) {
45821     var dispatch$$1 = dispatch('change'),
45822         baseLayer = rendererTileLayer(context).projection(context.projection),
45823         overlayLayers = [],
45824         backgroundSources;
45825
45826
45827     function background(selection$$1) {
45828         var base = selection$$1.selectAll('.layer-background')
45829             .data([0]);
45830
45831         base.enter()
45832             .insert('div', '.layer-data')
45833             .attr('class', 'layer layer-background')
45834             .merge(base)
45835             .call(baseLayer);
45836
45837         var overlays = selection$$1.selectAll('.layer-overlay')
45838             .data(overlayLayers, function(d) { return d.source().name(); });
45839
45840         overlays.exit()
45841             .remove();
45842
45843         overlays.enter()
45844             .insert('div', '.layer-data')
45845             .attr('class', 'layer layer-overlay')
45846             .merge(overlays)
45847             .each(function(layer) { d3_select(this).call(layer); });
45848     }
45849
45850
45851     background.updateImagery = function() {
45852         if (context.inIntro()) return;
45853
45854         var b = background.baseLayerSource(),
45855             o = overlayLayers
45856                 .filter(function (d) { return !d.source().isLocatorOverlay(); })
45857                 .map(function (d) { return d.source().id; })
45858                 .join(','),
45859             meters = geoOffsetToMeters(b.offset()),
45860             epsilon = 0.01,
45861             x = +meters[0].toFixed(2),
45862             y = +meters[1].toFixed(2),
45863             q = utilStringQs(window.location.hash.substring(1));
45864
45865         var id = b.id;
45866         if (id === 'custom') {
45867             id = 'custom:' + b.template();
45868         }
45869
45870         if (id) {
45871             q.background = id;
45872         } else {
45873             delete q.background;
45874         }
45875
45876         if (o) {
45877             q.overlays = o;
45878         } else {
45879             delete q.overlays;
45880         }
45881
45882         if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
45883             q.offset = x + ',' + y;
45884         } else {
45885             delete q.offset;
45886         }
45887
45888         if (!window.mocha) {
45889             window.location.replace('#' + utilQsString(q, true));
45890         }
45891
45892         var imageryUsed = [b.imageryUsed()];
45893
45894         overlayLayers
45895             .filter(function (d) { return !d.source().isLocatorOverlay(); })
45896             .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
45897
45898         var gpx = context.layers().layer('gpx');
45899         if (gpx && gpx.enabled() && gpx.hasGpx()) {
45900             imageryUsed.push('Local GPX');
45901         }
45902
45903         var mapillary_images = context.layers().layer('mapillary-images');
45904         if (mapillary_images && mapillary_images.enabled()) {
45905             imageryUsed.push('Mapillary Images');
45906         }
45907
45908         var mapillary_signs = context.layers().layer('mapillary-signs');
45909         if (mapillary_signs && mapillary_signs.enabled()) {
45910             imageryUsed.push('Mapillary Signs');
45911         }
45912
45913         context.history().imageryUsed(imageryUsed);
45914     };
45915
45916
45917     background.sources = function(extent) {
45918         return backgroundSources.filter(function(source) {
45919             return source.intersects(extent);
45920         });
45921     };
45922
45923
45924     background.dimensions = function(_) {
45925         if (!_) return;
45926         baseLayer.dimensions(_);
45927
45928         overlayLayers.forEach(function(layer) {
45929             layer.dimensions(_);
45930         });
45931     };
45932
45933
45934     background.baseLayerSource = function(d) {
45935         if (!arguments.length) return baseLayer.source();
45936
45937         // test source against OSM imagery blacklists..
45938         var osm = context.connection();
45939         if (!osm) return background;
45940
45941         var blacklists = context.connection().imageryBlacklists();
45942
45943         var template = d.template(),
45944             fail = false,
45945             tested = 0,
45946             regex, i;
45947
45948         for (i = 0; i < blacklists.length; i++) {
45949             try {
45950                 regex = new RegExp(blacklists[i]);
45951                 fail = regex.test(template);
45952                 tested++;
45953                 if (fail) break;
45954             } catch (e) {
45955                 /* noop */
45956             }
45957         }
45958
45959         // ensure at least one test was run.
45960         if (!tested) {
45961             regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
45962             fail = regex.test(template);
45963         }
45964
45965         baseLayer.source(!fail ? d : background.findSource('none'));
45966         dispatch$$1.call('change');
45967         background.updateImagery();
45968         return background;
45969     };
45970
45971
45972     background.findSource = function(id) {
45973         return find$1(backgroundSources, function(d) {
45974             return d.id && d.id === id;
45975         });
45976     };
45977
45978
45979     background.bing = function() {
45980         background.baseLayerSource(background.findSource('Bing'));
45981     };
45982
45983
45984     background.showsLayer = function(d) {
45985         return d.id === baseLayer.source().id ||
45986             overlayLayers.some(function(layer) { return d.id === layer.source().id; });
45987     };
45988
45989
45990     background.overlayLayerSources = function() {
45991         return overlayLayers.map(function (l) { return l.source(); });
45992     };
45993
45994
45995     background.toggleOverlayLayer = function(d) {
45996         var layer;
45997
45998         for (var i = 0; i < overlayLayers.length; i++) {
45999             layer = overlayLayers[i];
46000             if (layer.source() === d) {
46001                 overlayLayers.splice(i, 1);
46002                 dispatch$$1.call('change');
46003                 background.updateImagery();
46004                 return;
46005             }
46006         }
46007
46008         layer = rendererTileLayer(context)
46009             .source(d)
46010             .projection(context.projection)
46011             .dimensions(baseLayer.dimensions());
46012
46013         overlayLayers.push(layer);
46014         dispatch$$1.call('change');
46015         background.updateImagery();
46016     };
46017
46018
46019     background.nudge = function(d, zoom) {
46020         baseLayer.source().nudge(d, zoom);
46021         dispatch$$1.call('change');
46022         background.updateImagery();
46023         return background;
46024     };
46025
46026
46027     background.offset = function(d) {
46028         if (!arguments.length) return baseLayer.source().offset();
46029         baseLayer.source().offset(d);
46030         dispatch$$1.call('change');
46031         background.updateImagery();
46032         return background;
46033     };
46034
46035
46036     background.init = function() {
46037         function parseMap(qmap) {
46038             if (!qmap) return false;
46039             var args = qmap.split('/').map(Number);
46040             if (args.length < 3 || args.some(isNaN)) return false;
46041             return geoExtent$$1([args[2], args[1]]);
46042         }
46043
46044         var dataImagery = data.imagery || [],
46045             q = utilStringQs(window.location.hash.substring(1)),
46046             requested = q.background || q.layer,
46047             extent = parseMap(q.map),
46048             first,
46049             best;
46050
46051         // Add all the available imagery sources
46052         backgroundSources = dataImagery.map(function(source) {
46053             if (source.type === 'bing') {
46054                 return rendererBackgroundSource.Bing(source, dispatch$$1);
46055             } else if (source.id === 'EsriWorldImagery') {
46056                 return rendererBackgroundSource.Esri(source);
46057             } else {
46058                 return rendererBackgroundSource(source);
46059             }
46060         });
46061
46062         first = backgroundSources.length && backgroundSources[0];
46063
46064         // Add 'None'
46065         backgroundSources.unshift(rendererBackgroundSource.None());
46066
46067         // Add 'Custom'
46068         var template = context.storage('background-custom-template') || '';
46069         var custom = rendererBackgroundSource.Custom(template);
46070         backgroundSources.unshift(custom);
46071
46072
46073         // Decide which background layer to display
46074         if (!requested && extent) {
46075             best = find$1(this.sources(extent), function(s) { return s.best(); });
46076         }
46077         if (requested && requested.indexOf('custom:') === 0) {
46078             template = requested.replace(/^custom:/, '');
46079             background.baseLayerSource(custom.template(template));
46080             context.storage('background-custom-template', template);
46081         } else {
46082             background.baseLayerSource(
46083                 background.findSource(requested) ||
46084                 best ||
46085                 background.findSource('Bing') ||
46086                 first ||
46087                 background.findSource('none')
46088             );
46089         }
46090
46091         var locator = find$1(backgroundSources, function(d) {
46092             return d.overlay && d.default;
46093         });
46094
46095         if (locator) {
46096             background.toggleOverlayLayer(locator);
46097         }
46098
46099         var overlays = (q.overlays || '').split(',');
46100         overlays.forEach(function(overlay) {
46101             overlay = background.findSource(overlay);
46102             if (overlay) {
46103                 background.toggleOverlayLayer(overlay);
46104             }
46105         });
46106
46107         if (q.gpx) {
46108             var gpx = context.layers().layer('gpx');
46109             if (gpx) {
46110                 gpx.url(q.gpx);
46111             }
46112         }
46113
46114         if (q.offset) {
46115             var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
46116                 return !isNaN(n) && n;
46117             });
46118
46119             if (offset.length === 2) {
46120                 background.offset(geoMetersToOffset(offset));
46121             }
46122         }
46123     };
46124
46125
46126     return utilRebind(background, dispatch$$1, 'on');
46127 }
46128
46129 function rendererFeatures(context) {
46130     var traffic_roads = {
46131         'motorway': true,
46132         'motorway_link': true,
46133         'trunk': true,
46134         'trunk_link': true,
46135         'primary': true,
46136         'primary_link': true,
46137         'secondary': true,
46138         'secondary_link': true,
46139         'tertiary': true,
46140         'tertiary_link': true,
46141         'residential': true,
46142         'unclassified': true,
46143         'living_street': true
46144     };
46145
46146     var service_roads = {
46147         'service': true,
46148         'road': true,
46149         'track': true
46150     };
46151
46152     var paths = {
46153         'path': true,
46154         'footway': true,
46155         'cycleway': true,
46156         'bridleway': true,
46157         'steps': true,
46158         'pedestrian': true,
46159         'corridor': true
46160     };
46161
46162     var past_futures = {
46163         'proposed': true,
46164         'construction': true,
46165         'abandoned': true,
46166         'dismantled': true,
46167         'disused': true,
46168         'razed': true,
46169         'demolished': true,
46170         'obliterated': true
46171     };
46172
46173     var dispatch$$1 = dispatch('change', 'redraw'),
46174         _cullFactor = 1,
46175         _cache = {},
46176         _features = {},
46177         _stats = {},
46178         _keys = [],
46179         _hidden = [];
46180
46181
46182     function update() {
46183         _hidden = features.hidden();
46184         dispatch$$1.call('change');
46185         dispatch$$1.call('redraw');
46186     }
46187
46188
46189     function defineFeature(k, filter, max) {
46190         _keys.push(k);
46191         _features[k] = {
46192             filter: filter,
46193             enabled: true,   // whether the user wants it enabled..
46194             count: 0,
46195             currentMax: (max || Infinity),
46196             defaultMax: (max || Infinity),
46197             enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
46198             disable: function() { this.enabled = false; this.currentMax = 0; },
46199             hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
46200             autoHidden: function() { return this.hidden() && this.currentMax > 0; }
46201         };
46202     }
46203
46204
46205     defineFeature('points', function isPoint(entity, resolver, geometry) {
46206         return geometry === 'point';
46207     }, 200);
46208
46209     defineFeature('traffic_roads', function isTrafficRoad(entity) {
46210         return traffic_roads[entity.tags.highway];
46211     });
46212
46213     defineFeature('service_roads', function isServiceRoad(entity) {
46214         return service_roads[entity.tags.highway];
46215     });
46216
46217     defineFeature('paths', function isPath(entity) {
46218         return paths[entity.tags.highway];
46219     });
46220
46221     defineFeature('buildings', function isBuilding(entity) {
46222         return (
46223             !!entity.tags['building:part'] ||
46224             (!!entity.tags.building && entity.tags.building !== 'no') ||
46225             entity.tags.amenity === 'shelter' ||
46226             entity.tags.parking === 'multi-storey' ||
46227             entity.tags.parking === 'sheds' ||
46228             entity.tags.parking === 'carports' ||
46229             entity.tags.parking === 'garage_boxes'
46230         );
46231     }, 250);
46232
46233     defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
46234         return geometry === 'area' &&
46235             !_features.buildings.filter(entity) &&
46236             !_features.water.filter(entity);
46237     });
46238
46239     defineFeature('boundaries', function isBoundary(entity) {
46240         return !!entity.tags.boundary;
46241     });
46242
46243     defineFeature('water', function isWater(entity) {
46244         return (
46245             !!entity.tags.waterway ||
46246             entity.tags.natural === 'water' ||
46247             entity.tags.natural === 'coastline' ||
46248             entity.tags.natural === 'bay' ||
46249             entity.tags.landuse === 'pond' ||
46250             entity.tags.landuse === 'basin' ||
46251             entity.tags.landuse === 'reservoir' ||
46252             entity.tags.landuse === 'salt_pond'
46253         );
46254     });
46255
46256     defineFeature('rail', function isRail(entity) {
46257         return (
46258             !!entity.tags.railway ||
46259             entity.tags.landuse === 'railway'
46260         ) && !(
46261             traffic_roads[entity.tags.highway] ||
46262             service_roads[entity.tags.highway] ||
46263             paths[entity.tags.highway]
46264         );
46265     });
46266
46267     defineFeature('power', function isPower(entity) {
46268         return !!entity.tags.power;
46269     });
46270
46271     // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
46272     defineFeature('past_future', function isPastFuture(entity) {
46273         if (
46274             traffic_roads[entity.tags.highway] ||
46275             service_roads[entity.tags.highway] ||
46276             paths[entity.tags.highway]
46277         ) { return false; }
46278
46279         var strings = Object.keys(entity.tags);
46280
46281         for (var i = 0; i < strings.length; i++) {
46282             var s = strings[i];
46283             if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
46284         }
46285         return false;
46286     });
46287
46288     // Lines or areas that don't match another feature filter.
46289     // IMPORTANT: The 'others' feature must be the last one defined,
46290     //   so that code in getMatches can skip this test if `hasMatch = true`
46291     defineFeature('others', function isOther(entity, resolver, geometry) {
46292         return (geometry === 'line' || geometry === 'area');
46293     });
46294
46295
46296     function features() {}
46297
46298
46299     features.features = function() {
46300         return _features;
46301     };
46302
46303
46304     features.keys = function() {
46305         return _keys;
46306     };
46307
46308
46309     features.enabled = function(k) {
46310         if (!arguments.length) {
46311             return _keys.filter(function(k) { return _features[k].enabled; });
46312         }
46313         return _features[k] && _features[k].enabled;
46314     };
46315
46316
46317     features.disabled = function(k) {
46318         if (!arguments.length) {
46319             return _keys.filter(function(k) { return !_features[k].enabled; });
46320         }
46321         return _features[k] && !_features[k].enabled;
46322     };
46323
46324
46325     features.hidden = function(k) {
46326         if (!arguments.length) {
46327             return _keys.filter(function(k) { return _features[k].hidden(); });
46328         }
46329         return _features[k] && _features[k].hidden();
46330     };
46331
46332
46333     features.autoHidden = function(k) {
46334         if (!arguments.length) {
46335             return _keys.filter(function(k) { return _features[k].autoHidden(); });
46336         }
46337         return _features[k] && _features[k].autoHidden();
46338     };
46339
46340
46341     features.enable = function(k) {
46342         if (_features[k] && !_features[k].enabled) {
46343             _features[k].enable();
46344             update();
46345         }
46346     };
46347
46348
46349     features.disable = function(k) {
46350         if (_features[k] && _features[k].enabled) {
46351             _features[k].disable();
46352             update();
46353         }
46354     };
46355
46356
46357     features.toggle = function(k) {
46358         if (_features[k]) {
46359             (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
46360             update();
46361         }
46362     };
46363
46364
46365     features.resetStats = function() {
46366         for (var i = 0; i < _keys.length; i++) {
46367             _features[_keys[i]].count = 0;
46368         }
46369         dispatch$$1.call('change');
46370     };
46371
46372
46373     features.gatherStats = function(d, resolver, dimensions) {
46374         var needsRedraw = false,
46375             type = groupBy(d, function(ent) { return ent.type; }),
46376             entities = [].concat(type.relation || [], type.way || [], type.node || []),
46377             currHidden, geometry, matches, i, j;
46378
46379         for (i = 0; i < _keys.length; i++) {
46380             _features[_keys[i]].count = 0;
46381         }
46382
46383         // adjust the threshold for point/building culling based on viewport size..
46384         // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
46385         _cullFactor = dimensions[0] * dimensions[1] / 1000000;
46386
46387         for (i = 0; i < entities.length; i++) {
46388             geometry = entities[i].geometry(resolver);
46389             if (!(geometry === 'vertex' || geometry === 'relation')) {
46390                 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
46391                 for (j = 0; j < matches.length; j++) {
46392                     _features[matches[j]].count++;
46393                 }
46394             }
46395         }
46396
46397         currHidden = features.hidden();
46398         if (currHidden !== _hidden) {
46399             _hidden = currHidden;
46400             needsRedraw = true;
46401             dispatch$$1.call('change');
46402         }
46403
46404         return needsRedraw;
46405     };
46406
46407
46408     features.stats = function() {
46409         for (var i = 0; i < _keys.length; i++) {
46410             _stats[_keys[i]] = _features[_keys[i]].count;
46411         }
46412
46413         return _stats;
46414     };
46415
46416
46417     features.clear = function(d) {
46418         for (var i = 0; i < d.length; i++) {
46419             features.clearEntity(d[i]);
46420         }
46421     };
46422
46423
46424     features.clearEntity = function(entity) {
46425         delete _cache[osmEntity$$1.key(entity)];
46426     };
46427
46428
46429     features.reset = function() {
46430         _cache = {};
46431     };
46432
46433
46434     features.getMatches = function(entity, resolver, geometry) {
46435         if (geometry === 'vertex' || geometry === 'relation') return {};
46436
46437         var ent = osmEntity$$1.key(entity);
46438         if (!_cache[ent]) {
46439             _cache[ent] = {};
46440         }
46441
46442         if (!_cache[ent].matches) {
46443             var matches = {},
46444                 hasMatch = false;
46445
46446             for (var i = 0; i < _keys.length; i++) {
46447                 if (_keys[i] === 'others') {
46448                     if (hasMatch) continue;
46449
46450                     // Multipolygon members:
46451                     // If an entity...
46452                     //   1. is a way that hasn't matched other 'interesting' feature rules,
46453                     //   2. and it belongs to a single parent multipolygon relation
46454                     // ...then match whatever feature rules the parent multipolygon has matched.
46455                     // see #2548, #2887
46456                     //
46457                     // IMPORTANT:
46458                     // For this to work, getMatches must be called on relations before ways.
46459                     //
46460                     if (entity.type === 'way') {
46461                         var parents = features.getParents(entity, resolver, geometry);
46462                         if (parents.length === 1 && parents[0].isMultipolygon()) {
46463                             var pkey = osmEntity$$1.key(parents[0]);
46464                             if (_cache[pkey] && _cache[pkey].matches) {
46465                                 matches = clone(_cache[pkey].matches);
46466                                 continue;
46467                             }
46468                         }
46469                     }
46470                 }
46471
46472                 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
46473                     matches[_keys[i]] = hasMatch = true;
46474                 }
46475             }
46476             _cache[ent].matches = matches;
46477         }
46478
46479         return _cache[ent].matches;
46480     };
46481
46482
46483     features.getParents = function(entity, resolver, geometry) {
46484         if (geometry === 'point') return [];
46485
46486         var ent = osmEntity$$1.key(entity);
46487         if (!_cache[ent]) {
46488             _cache[ent] = {};
46489         }
46490
46491         if (!_cache[ent].parents) {
46492             var parents = [];
46493             if (geometry === 'vertex') {
46494                 parents = resolver.parentWays(entity);
46495             } else {   // 'line', 'area', 'relation'
46496                 parents = resolver.parentRelations(entity);
46497             }
46498             _cache[ent].parents = parents;
46499         }
46500         return _cache[ent].parents;
46501     };
46502
46503
46504     features.isHiddenFeature = function(entity, resolver, geometry) {
46505         if (!_hidden.length) return false;
46506         if (!entity.version) return false;
46507
46508         var matches = features.getMatches(entity, resolver, geometry);
46509
46510         for (var i = 0; i < _hidden.length; i++) {
46511             if (matches[_hidden[i]]) return true;
46512         }
46513         return false;
46514     };
46515
46516
46517     features.isHiddenChild = function(entity, resolver, geometry) {
46518         if (!_hidden.length) return false;
46519         if (!entity.version || geometry === 'point') return false;
46520
46521         var parents = features.getParents(entity, resolver, geometry);
46522         if (!parents.length) return false;
46523
46524         for (var i = 0; i < parents.length; i++) {
46525             if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
46526                 return false;
46527             }
46528         }
46529         return true;
46530     };
46531
46532
46533     features.hasHiddenConnections = function(entity, resolver) {
46534         if (!_hidden.length) return false;
46535         var childNodes, connections;
46536
46537         if (entity.type === 'midpoint') {
46538             childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
46539             connections = [];
46540         } else {
46541             childNodes = entity.nodes ? resolver.childNodes(entity) : [];
46542             connections = features.getParents(entity, resolver, entity.geometry(resolver));
46543         }
46544
46545         // gather ways connected to child nodes..
46546         connections = reduce(childNodes, function(result, e) {
46547             return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
46548         }, connections);
46549
46550         return connections.length ? some(connections, function(e) {
46551             return features.isHidden(e, resolver, e.geometry(resolver));
46552         }) : false;
46553     };
46554
46555
46556     features.isHidden = function(entity, resolver, geometry) {
46557         if (!_hidden.length) return false;
46558         if (!entity.version) return false;
46559
46560         var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
46561         return fn(entity, resolver, geometry);
46562     };
46563
46564
46565     features.filter = function(d, resolver) {
46566         if (!_hidden.length) return d;
46567
46568         var result = [];
46569         for (var i = 0; i < d.length; i++) {
46570             var entity = d[i];
46571             if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
46572                 result.push(entity);
46573             }
46574         }
46575         return result;
46576     };
46577
46578
46579     return utilRebind(features, dispatch$$1, 'on');
46580 }
46581
46582 function utilBindOnce(target, type, listener, capture) {
46583     var typeOnce = type + '.once';
46584     function one() {
46585         target.on(typeOnce, null);
46586         listener.apply(this, arguments);
46587     }
46588     target.on(typeOnce, one, capture);
46589     return this;
46590 }
46591
46592 function rendererMap(context) {
46593
46594     var dimensions = [1, 1],
46595         dispatch$$1 = dispatch('move', 'drawn'),
46596         projection = context.projection,
46597         curtainProjection = context.curtainProjection,
46598         dblclickEnabled = true,
46599         redrawEnabled = true,
46600         transformStart = projection.transform(),
46601         transformLast,
46602         transformed = false,
46603         minzoom = 0,
46604         drawLayers = svgLayers(projection, context),
46605         drawPoints = svgPoints$$1(projection, context),
46606         drawVertices = svgVertices$$1(projection, context),
46607         drawLines = svgLines$$1(projection, context),
46608         drawAreas = svgAreas$$1(projection, context),
46609         drawMidpoints = svgMidpoints$$1(projection, context),
46610         drawLabels = svgLabels(projection, context),
46611         supersurface = d3_select(null),
46612         wrapper = d3_select(null),
46613         surface = d3_select(null),
46614         mouse,
46615         mousemove;
46616
46617     var zoom = d3_zoom()
46618             .scaleExtent([ztok(2), ztok(24)])
46619             .interpolate(d3_interpolate)
46620             .filter(zoomEventFilter)
46621             .on('zoom', zoomPan);
46622
46623     var _selection = d3_select(null);
46624     var isRedrawScheduled = false;
46625     var pendingRedrawCall;
46626
46627     function scheduleRedraw() {
46628         // Only schedule the redraw if one has not already been set.
46629         if (isRedrawScheduled) return;
46630         isRedrawScheduled = true;
46631         var that = this;
46632         var args = arguments;
46633         pendingRedrawCall = requestIdleCallback(function () {
46634             // Reset the boolean so future redraws can be set.
46635             isRedrawScheduled = false;
46636             redraw.apply(that, args);
46637         }, { timeout: 1400 });
46638     }
46639
46640     function cancelPendingRedraw() {
46641         isRedrawScheduled = false;
46642         window.cancelIdleCallback(pendingRedrawCall);
46643     }
46644
46645     function map(selection$$1) {
46646
46647         _selection = selection$$1;
46648
46649         context
46650             .on('change.map', immediateRedraw);
46651
46652         var osm = context.connection();
46653         if (osm) {
46654             osm.on('change.map', immediateRedraw);
46655         }
46656
46657         context.history()
46658             .on('change.map', immediateRedraw)
46659             .on('undone.map redone.map', function(stack) {
46660                 var mode = context.mode().id;
46661                 if (mode !== 'browse' && mode !== 'select') return;
46662
46663                 var followSelected = false;
46664                 if (Array.isArray(stack.selectedIDs)) {
46665                     followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
46666                     context.enter(
46667                         modeSelect(context, stack.selectedIDs).follow(followSelected)
46668                     );
46669                 }
46670                 if (!followSelected && stack.transform) {
46671                     map.transformEase(stack.transform);
46672                 }
46673             });
46674
46675         context.background()
46676             .on('change.map', immediateRedraw);
46677
46678         context.features()
46679             .on('redraw.map', immediateRedraw);
46680
46681         drawLayers
46682             .on('change.map', function() {
46683                 context.background().updateImagery();
46684                 immediateRedraw();
46685             });
46686
46687         selection$$1
46688             .on('dblclick.map', dblClick)
46689             .call(zoom)
46690             .call(zoom.transform, projection.transform());
46691
46692         supersurface = selection$$1.append('div')
46693             .attr('id', 'supersurface')
46694             .call(utilSetTransform, 0, 0);
46695
46696         // Need a wrapper div because Opera can't cope with an absolutely positioned
46697         // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
46698         wrapper = supersurface
46699             .append('div')
46700             .attr('class', 'layer layer-data');
46701
46702         map.surface = surface = wrapper
46703             .call(drawLayers)
46704             .selectAll('.surface')
46705             .attr('id', 'surface');
46706
46707         surface
46708             .call(drawLabels.observe)
46709             .on('mousedown.zoom', function() {
46710                 if (event.button === 2) {
46711                     event.stopPropagation();
46712                 }
46713             }, true)
46714             .on('mouseup.zoom', function() {
46715                 if (resetTransform()) immediateRedraw();
46716             })
46717             .on('mousemove.map', function() {
46718                 mousemove = event;
46719             })
46720             .on('mouseover.vertices', function() {
46721                 if (map.editable() && !transformed) {
46722                     var hover = event.target.__data__;
46723                     surface.selectAll('.data-layer-osm')
46724                         .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
46725                     dispatch$$1.call('drawn', this, {full: false});
46726                 }
46727             })
46728             .on('mouseout.vertices', function() {
46729                 if (map.editable() && !transformed) {
46730                     var hover = event.relatedTarget && event.relatedTarget.__data__;
46731                     surface.selectAll('.data-layer-osm')
46732                         .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom());
46733                     dispatch$$1.call('drawn', this, {full: false});
46734                 }
46735             });
46736
46737         supersurface
46738             .call(context.background());
46739
46740         context.on('enter.map', function() {
46741             if (map.editable() && !transformed) {
46742                 var all = context.intersects(map.extent()),
46743                     filter = utilFunctor(true),
46744                     graph = context.graph();
46745
46746                 all = context.features().filter(all, graph);
46747                 surface.selectAll('.data-layer-osm')
46748                     .call(drawVertices, graph, all, filter, map.extent(), map.zoom())
46749                     .call(drawMidpoints, graph, all, filter, map.trimmedExtent());
46750                 dispatch$$1.call('drawn', this, {full: false});
46751             }
46752         });
46753
46754         map.dimensions(utilGetDimensions(selection$$1));
46755     }
46756
46757
46758     function zoomEventFilter() {
46759         // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
46760         // Intercept `mousedown` and check if there is an orphaned zoom gesture.
46761         // This can happen if a previous `mousedown` occurred without a `mouseup`.
46762         // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
46763         // so that d3-zoom won't stop propagation of new `mousedown` events.
46764         if (event.type === 'mousedown') {
46765             var hasOrphan = false;
46766             var listeners = window.__on;
46767             for (var i = 0; i < listeners.length; i++) {
46768                 var listener = listeners[i];
46769                 if (listener.name === 'zoom' && listener.type === 'mouseup') {
46770                     hasOrphan = true;
46771                     break;
46772                 }
46773             }
46774             if (hasOrphan) {
46775                 var event$$1 = window.CustomEvent;
46776                 if (event$$1) {
46777                     event$$1 = new event$$1('mouseup');
46778                 } else {
46779                     event$$1 = window.document.createEvent('Event');
46780                     event$$1.initEvent('mouseup', false, false);
46781                 }
46782                 // Event needs to be dispatched with an event.view property.
46783                 event$$1.view = window;
46784                 window.dispatchEvent(event$$1);
46785             }
46786         }
46787
46788         return event.button !== 2;   // ignore right clicks
46789     }
46790
46791
46792     function ztok(z) {
46793         return 256 * Math.pow(2, z);
46794     }
46795
46796     function ktoz(k) {
46797         return Math.max(Math.log(k) / Math.LN2 - 8, 0);
46798     }
46799
46800     function pxCenter() {
46801         return [dimensions[0] / 2, dimensions[1] / 2];
46802     }
46803
46804
46805     function drawVector(difference, extent) {
46806         var graph = context.graph(),
46807             features = context.features(),
46808             all = context.intersects(map.extent()),
46809             data, filter;
46810
46811         if (difference) {
46812             var complete = difference.complete(map.extent());
46813             data = compact(values$1(complete));
46814             filter = function(d) { return d.id in complete; };
46815             features.clear(data);
46816
46817         } else {
46818             // force a full redraw if gatherStats detects that a feature
46819             // should be auto-hidden (e.g. points or buildings)..
46820             if (features.gatherStats(all, graph, dimensions)) {
46821                 extent = undefined;
46822             }
46823
46824             if (extent) {
46825                 data = context.intersects(map.extent().intersection(extent));
46826                 var set = set$2(map$4(data, 'id'));
46827                 filter = function(d) { return set.has(d.id); };
46828
46829             } else {
46830                 data = all;
46831                 filter = utilFunctor(true);
46832             }
46833         }
46834
46835         data = features.filter(data, graph);
46836
46837         surface.selectAll('.data-layer-osm')
46838             .call(drawVertices, graph, data, filter, map.extent(), map.zoom())
46839             .call(drawLines, graph, data, filter)
46840             .call(drawAreas, graph, data, filter)
46841             .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
46842             .call(drawLabels, graph, data, filter, dimensions, !difference && !extent)
46843             .call(drawPoints, graph, data, filter);
46844
46845         dispatch$$1.call('drawn', this, {full: true});
46846     }
46847
46848
46849     function editOff() {
46850         context.features().resetStats();
46851         surface.selectAll('.layer-osm *').remove();
46852         context.enter(modeBrowse(context));
46853         dispatch$$1.call('drawn', this, {full: true});
46854     }
46855
46856
46857     function dblClick() {
46858         if (!dblclickEnabled) {
46859             event.preventDefault();
46860             event.stopImmediatePropagation();
46861         }
46862     }
46863
46864
46865     function zoomPan(manualEvent) {
46866         var event$$1 = (manualEvent || event),
46867             source = event$$1.sourceEvent,
46868             eventTransform = event$$1.transform;
46869
46870         if (transformStart.x === eventTransform.x &&
46871             transformStart.y === eventTransform.y &&
46872             transformStart.k === eventTransform.k) {
46873             return;  // no change
46874         }
46875
46876         // Normalize mousewheel - #3029
46877         // If wheel delta is provided in LINE units, recalculate it in PIXEL units
46878         // We are essentially redoing the calculations that occur here:
46879         //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
46880         // See this for more info:
46881         //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
46882         if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
46883             // pick sensible scroll amount if user scrolling fast or slow..
46884             var lines = Math.abs(source.deltaY),
46885                 scroll = lines > 2 ? 40 : lines * 10;
46886
46887             var t0 = transformed ? transformLast : transformStart,
46888                 p0 = mouse(source),
46889                 p1 = t0.invert(p0),
46890                 k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500),
46891                 x2 = p0[0] - p1[0] * k2,
46892                 y2 = p0[1] - p1[1] * k2;
46893
46894             eventTransform = identity$7.translate(x2,y2).scale(k2);
46895             _selection.node().__zoom = eventTransform;
46896         }
46897
46898         if (ktoz(eventTransform.k * 2 * Math.PI) < minzoom) {
46899             surface.interrupt();
46900             uiFlash().text(t('cannot_zoom'));
46901             setZoom(context.minEditableZoom(), true);
46902             scheduleRedraw();
46903             dispatch$$1.call('move', this, map);
46904             return;
46905         }
46906
46907         projection.transform(eventTransform);
46908
46909         var scale = eventTransform.k / transformStart.k,
46910             tX = (eventTransform.x / scale - transformStart.x) * scale,
46911             tY = (eventTransform.y / scale - transformStart.y) * scale;
46912
46913         if (context.inIntro()) {
46914             curtainProjection.transform({
46915                 x: eventTransform.x - tX,
46916                 y: eventTransform.y - tY,
46917                 k: eventTransform.k
46918             });
46919         }
46920
46921         mousemove = event$$1;
46922         transformed = true;
46923         transformLast = eventTransform;
46924         utilSetTransform(supersurface, tX, tY, scale);
46925         scheduleRedraw();
46926
46927         dispatch$$1.call('move', this, map);
46928     }
46929
46930
46931     function resetTransform() {
46932         if (!transformed) return false;
46933
46934         // deprecation warning - Radial Menu to be removed in iD v3
46935         surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
46936         utilSetTransform(supersurface, 0, 0);
46937         transformed = false;
46938         if (context.inIntro()) {
46939             curtainProjection.transform(projection.transform());
46940         }
46941         return true;
46942     }
46943
46944
46945     function redraw(difference, extent) {
46946         if (surface.empty() || !redrawEnabled) return;
46947
46948         // If we are in the middle of a zoom/pan, we can't do differenced redraws.
46949         // It would result in artifacts where differenced entities are redrawn with
46950         // one transform and unchanged entities with another.
46951         if (resetTransform()) {
46952             difference = extent = undefined;
46953         }
46954
46955         var z = String(~~map.zoom());
46956         if (surface.attr('data-zoom') !== z) {
46957             surface.attr('data-zoom', z)
46958                 .classed('low-zoom', z <= 16);
46959         }
46960
46961         if (!difference) {
46962             supersurface.call(context.background());
46963         }
46964
46965         wrapper
46966             .call(drawLayers);
46967
46968         // OSM
46969         if (map.editable()) {
46970             context.loadTiles(projection, dimensions);
46971             drawVector(difference, extent);
46972         } else {
46973             editOff();
46974         }
46975
46976         transformStart = projection.transform();
46977
46978         return map;
46979     }
46980
46981
46982
46983     var immediateRedraw = function(difference, extent) {
46984         if (!difference && !extent) cancelPendingRedraw();
46985         redraw(difference, extent);
46986     };
46987
46988
46989     function pointLocation(p) {
46990         var translate = projection.translate(),
46991             scale = projection.scale() * 2 * Math.PI;
46992         return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
46993     }
46994
46995
46996     function locationPoint(l) {
46997         var translate = projection.translate(),
46998             scale = projection.scale() * 2 * Math.PI;
46999         return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
47000     }
47001
47002
47003     map.mouse = function() {
47004         var event$$1 = mousemove || event;
47005         if (event$$1) {
47006             var s;
47007             while ((s = event$$1.sourceEvent)) { event$$1 = s; }
47008             return mouse(event$$1);
47009         }
47010         return null;
47011     };
47012
47013
47014     map.mouseCoordinates = function() {
47015         return projection.invert(map.mouse());
47016     };
47017
47018
47019     map.dblclickEnable = function(_) {
47020         if (!arguments.length) return dblclickEnabled;
47021         dblclickEnabled = _;
47022         return map;
47023     };
47024
47025
47026     map.redrawEnable = function(_) {
47027         if (!arguments.length) return redrawEnabled;
47028         redrawEnabled = _;
47029         return map;
47030     };
47031
47032
47033     function setTransform(t2, duration, force) {
47034         var t$$1 = projection.transform();
47035         if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
47036             return false;
47037         }
47038
47039         if (duration) {
47040             _selection
47041                 .transition()
47042                 .duration(duration)
47043                 .on('start', function() { map.startEase(); })
47044                 .call(zoom.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
47045         } else {
47046             projection.transform(t2);
47047             transformStart = t2;
47048             _selection.call(zoom.transform, transformStart);
47049         }
47050     }
47051
47052
47053     function setZoom(z2, force, duration) {
47054         if (z2 === map.zoom() && !force) {
47055             return false;
47056         }
47057
47058         var k = projection.scale(),
47059             k2 = Math.max(ztok(2), Math.min(ztok(24), ztok(z2))) / (2 * Math.PI),
47060             center = pxCenter(),
47061             l = pointLocation(center);
47062
47063         projection.scale(k2);
47064
47065         var t$$1 = projection.translate();
47066         l = locationPoint(l);
47067
47068         t$$1[0] += center[0] - l[0];
47069         t$$1[1] += center[1] - l[1];
47070
47071         if (duration) {
47072             projection.scale(k);  // reset scale
47073             _selection
47074                 .transition()
47075                 .duration(duration)
47076                 .on('start', function() { map.startEase(); })
47077                 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
47078         } else {
47079             projection.translate(t$$1);
47080             transformStart = projection.transform();
47081             _selection.call(zoom.transform, transformStart);
47082         }
47083
47084         return true;
47085     }
47086
47087
47088     function setCenter(loc2, duration) {
47089         var c = map.center();
47090         if (loc2[0] === c[0] && loc2[1] === c[1]) {
47091             return false;
47092         }
47093
47094         var t$$1 = projection.translate(),
47095             k = projection.scale(),
47096             pxC = pxCenter(),
47097             ll = projection(loc2);
47098
47099         t$$1[0] = t$$1[0] - ll[0] + pxC[0];
47100         t$$1[1] = t$$1[1] - ll[1] + pxC[1];
47101
47102         if (duration) {
47103             _selection
47104                 .transition()
47105                 .duration(duration)
47106                 .on('start', function() { map.startEase(); })
47107                 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
47108         } else {
47109             projection.translate(t$$1);
47110             transformStart = projection.transform();
47111             _selection.call(zoom.transform, transformStart);
47112         }
47113
47114         return true;
47115     }
47116
47117
47118     map.pan = function(delta, duration) {
47119         var t$$1 = projection.translate(),
47120             k = projection.scale();
47121
47122         t$$1[0] += delta[0];
47123         t$$1[1] += delta[1];
47124
47125         if (duration) {
47126             _selection
47127                 .transition()
47128                 .duration(duration)
47129                 .on('start', function() { map.startEase(); })
47130                 .call(zoom.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
47131         } else {
47132             projection.translate(t$$1);
47133             transformStart = projection.transform();
47134             _selection.call(zoom.transform, transformStart);
47135             dispatch$$1.call('move', this, map);
47136             immediateRedraw();
47137         }
47138
47139         return map;
47140     };
47141
47142
47143     map.dimensions = function(_) {
47144         if (!arguments.length) return dimensions;
47145         var center = map.center();
47146         dimensions = _;
47147         drawLayers.dimensions(dimensions);
47148         context.background().dimensions(dimensions);
47149         projection.clipExtent([[0, 0], dimensions]);
47150         mouse = utilFastMouse(supersurface.node());
47151         setCenter(center);
47152
47153         scheduleRedraw();
47154         return map;
47155     };
47156
47157
47158     function zoomIn(delta) {
47159         setZoom(~~map.zoom() + delta, true, 250);
47160     }
47161
47162     function zoomOut(delta) {
47163         setZoom(~~map.zoom() - delta, true, 250);
47164     }
47165
47166     map.zoomIn = function() { zoomIn(1); };
47167     map.zoomInFurther = function() { zoomIn(4); };
47168
47169     map.zoomOut = function() { zoomOut(1); };
47170     map.zoomOutFurther = function() { zoomOut(4); };
47171
47172
47173     map.center = function(loc2) {
47174         if (!arguments.length) {
47175             return projection.invert(pxCenter());
47176         }
47177
47178         if (setCenter(loc2)) {
47179             dispatch$$1.call('move', this, map);
47180         }
47181
47182         scheduleRedraw();
47183         return map;
47184     };
47185
47186
47187     map.zoom = function(z2) {
47188         if (!arguments.length) {
47189             return Math.max(ktoz(projection.scale() * 2 * Math.PI), 0);
47190         }
47191
47192         if (z2 < minzoom) {
47193             surface.interrupt();
47194             uiFlash().text(t('cannot_zoom'));
47195             z2 = context.minEditableZoom();
47196         }
47197
47198         if (setZoom(z2)) {
47199             dispatch$$1.call('move', this, map);
47200         }
47201
47202         scheduleRedraw();
47203         return map;
47204     };
47205
47206
47207     map.zoomTo = function(entity, zoomLimits) {
47208         var extent = entity.extent(context.graph());
47209         if (!isFinite(extent.area())) return;
47210
47211         var z2 = map.trimmedExtentZoom(extent);
47212         zoomLimits = zoomLimits || [context.minEditableZoom(), 20];
47213         map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
47214     };
47215
47216
47217     map.centerZoom = function(loc2, z2) {
47218         var centered = setCenter(loc2),
47219             zoomed   = setZoom(z2);
47220
47221         if (centered || zoomed) {
47222             dispatch$$1.call('move', this, map);
47223         }
47224
47225         scheduleRedraw();
47226         return map;
47227     };
47228
47229
47230     map.centerEase = function(loc2, duration) {
47231         duration = duration || 250;
47232         setCenter(loc2, duration);
47233         return map;
47234     };
47235
47236
47237     map.zoomEase = function(z2, duration) {
47238         duration = duration || 250;
47239         setZoom(z2, false, duration);
47240         return map;
47241     };
47242
47243
47244     map.transformEase = function(t2, duration) {
47245         duration = duration || 250;
47246         setTransform(t2, duration, false);
47247         return map;
47248     };
47249
47250
47251     map.startEase = function() {
47252         utilBindOnce(surface, 'mousedown.ease', function() {
47253             map.cancelEase();
47254         });
47255         return map;
47256     };
47257
47258
47259     map.cancelEase = function() {
47260         _selection.interrupt();
47261         return map;
47262     };
47263
47264
47265     map.extent = function(_) {
47266         if (!arguments.length) {
47267             return new geoExtent$$1(projection.invert([0, dimensions[1]]),
47268                                  projection.invert([dimensions[0], 0]));
47269         } else {
47270             var extent = geoExtent$$1(_);
47271             map.centerZoom(extent.center(), map.extentZoom(extent));
47272         }
47273     };
47274
47275
47276     map.trimmedExtent = function(_) {
47277         if (!arguments.length) {
47278             var headerY = 60, footerY = 30, pad = 10;
47279             return new geoExtent$$1(projection.invert([pad, dimensions[1] - footerY - pad]),
47280                                  projection.invert([dimensions[0] - pad, headerY + pad]));
47281         } else {
47282             var extent = geoExtent$$1(_);
47283             map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
47284         }
47285     };
47286
47287
47288     function calcZoom(extent, dim) {
47289         var tl = projection([extent[0][0], extent[1][1]]),
47290             br = projection([extent[1][0], extent[0][1]]);
47291
47292         // Calculate maximum zoom that fits extent
47293         var hFactor = (br[0] - tl[0]) / dim[0],
47294             vFactor = (br[1] - tl[1]) / dim[1],
47295             hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2,
47296             vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2,
47297             newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
47298
47299         return newZoom;
47300     }
47301
47302
47303     map.extentZoom = function(_) {
47304         return calcZoom(geoExtent$$1(_), dimensions);
47305     };
47306
47307
47308     map.trimmedExtentZoom = function(_) {
47309         var trimY = 120, trimX = 40,
47310             trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
47311         return calcZoom(geoExtent$$1(_), trimmed);
47312     };
47313
47314
47315     map.editable = function() {
47316         var osmLayer = surface.selectAll('.data-layer-osm');
47317         if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
47318
47319         return map.zoom() >= context.minEditableZoom();
47320     };
47321
47322
47323     map.minzoom = function(_) {
47324         if (!arguments.length) return minzoom;
47325         minzoom = _;
47326         return map;
47327     };
47328
47329
47330     map.layers = drawLayers;
47331
47332
47333     return utilRebind(map, dispatch$$1, 'on');
47334 }
47335
47336 var TAU = 2 * Math.PI;
47337 function ztok(z) { return 256 * Math.pow(2, z) / TAU; }
47338 function ktoz(k) { return Math.log(k * TAU) / Math.LN2 - 8; }
47339 function vecSub(a, b) { return [ a[0] - b[0], a[1] - b[1] ]; }
47340 function vecScale(a, b) { return [ a[0] * b, a[1] * b ]; }
47341
47342
47343 function uiMapInMap(context) {
47344
47345
47346     function map_in_map(selection$$1) {
47347         var backgroundLayer = rendererTileLayer(context),
47348             overlayLayers = {},
47349             projection$$1 = geoRawMercator(),
47350             gpxLayer = svgGpx(projection$$1, context).showLabels(false),
47351             debugLayer = svgDebug(projection$$1, context),
47352             zoom = d3_zoom()
47353                 .scaleExtent([ztok(0.5), ztok(24)])
47354                 .on('start', zoomStarted)
47355                 .on('zoom', zoomed)
47356                 .on('end', zoomEnded),
47357             isTransformed = false,
47358             isHidden = true,
47359             skipEvents = false,
47360             gesture = null,
47361             zDiff = 6,    // by default, minimap renders at (main zoom - 6)
47362             wrap = d3_select(null),
47363             tiles = d3_select(null),
47364             viewport = d3_select(null),
47365             tStart,  // transform at start of gesture
47366             tCurr,   // transform at most recent event
47367             timeoutId;
47368
47369
47370         function zoomStarted() {
47371             if (skipEvents) return;
47372             tStart = tCurr = projection$$1.transform();
47373             gesture = null;
47374         }
47375
47376
47377         function zoomed() {
47378             if (skipEvents) return;
47379
47380             var x = event.transform.x,
47381                 y = event.transform.y,
47382                 k = event.transform.k,
47383                 isZooming = (k !== tStart.k),
47384                 isPanning = (x !== tStart.x || y !== tStart.y);
47385
47386             if (!isZooming && !isPanning) {
47387                 return;  // no change
47388             }
47389
47390             // lock in either zooming or panning, don't allow both in minimap.
47391             if (!gesture) {
47392                 gesture = isZooming ? 'zoom' : 'pan';
47393             }
47394
47395             var tMini = projection$$1.transform(),
47396                 tX, tY, scale;
47397
47398             if (gesture === 'zoom') {
47399                 var dMini = utilGetDimensions(wrap),
47400                     cMini = vecScale(dMini, 0.5);
47401                 scale = k / tMini.k;
47402                 tX = (cMini[0] / scale - cMini[0]) * scale;
47403                 tY = (cMini[1] / scale - cMini[1]) * scale;
47404             } else {
47405                 k = tMini.k;
47406                 scale = 1;
47407                 tX = x - tMini.x;
47408                 tY = y - tMini.y;
47409             }
47410
47411             utilSetTransform(tiles, tX, tY, scale);
47412             utilSetTransform(viewport, 0, 0, scale);
47413             isTransformed = true;
47414             tCurr = identity$7.translate(x, y).scale(k);
47415
47416             var zMain = ktoz(context.projection.scale()),
47417                 zMini = ktoz(k);
47418
47419             zDiff = zMain - zMini;
47420
47421             queueRedraw();
47422         }
47423
47424
47425         function zoomEnded() {
47426             if (skipEvents) return;
47427             if (gesture !== 'pan') return;
47428
47429             updateProjection();
47430             gesture = null;
47431             var dMini = utilGetDimensions(wrap),
47432                 cMini = vecScale(dMini, 0.5);
47433             context.map().center(projection$$1.invert(cMini));   // recenter main map..
47434         }
47435
47436
47437         function updateProjection() {
47438             var loc = context.map().center(),
47439                 dMini = utilGetDimensions(wrap),
47440                 cMini = vecScale(dMini, 0.5),
47441                 tMain = context.projection.transform(),
47442                 zMain = ktoz(tMain.k),
47443                 zMini = Math.max(zMain - zDiff, 0.5),
47444                 kMini = ztok(zMini);
47445
47446             projection$$1
47447                 .translate([tMain.x, tMain.y])
47448                 .scale(kMini);
47449
47450             var point = projection$$1(loc),
47451                 mouse = (gesture === 'pan') ? vecSub([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0],
47452                 xMini = cMini[0] - point[0] + tMain.x + mouse[0],
47453                 yMini = cMini[1] - point[1] + tMain.y + mouse[1];
47454
47455             projection$$1
47456                 .translate([xMini, yMini])
47457                 .clipExtent([[0, 0], dMini]);
47458
47459             tCurr = projection$$1.transform();
47460
47461             if (isTransformed) {
47462                 utilSetTransform(tiles, 0, 0);
47463                 utilSetTransform(viewport, 0, 0);
47464                 isTransformed = false;
47465             }
47466
47467             zoom
47468                 .scaleExtent([ztok(0.5), ztok(zMain - 3)]);
47469
47470             skipEvents = true;
47471             wrap.call(zoom.transform, tCurr);
47472             skipEvents = false;
47473         }
47474
47475
47476         function redraw() {
47477             clearTimeout(timeoutId);
47478             if (isHidden) return;
47479
47480             updateProjection();
47481
47482             var dMini = utilGetDimensions(wrap),
47483                 zMini = ktoz(projection$$1.scale());
47484
47485             // setup tile container
47486             tiles = wrap
47487                 .selectAll('.map-in-map-tiles')
47488                 .data([0]);
47489
47490             tiles = tiles.enter()
47491                 .append('div')
47492                 .attr('class', 'map-in-map-tiles')
47493                 .merge(tiles);
47494
47495             // redraw background
47496             backgroundLayer
47497                 .source(context.background().baseLayerSource())
47498                 .projection(projection$$1)
47499                 .dimensions(dMini);
47500
47501             var background = tiles
47502                 .selectAll('.map-in-map-background')
47503                 .data([0]);
47504
47505             background.enter()
47506                 .append('div')
47507                 .attr('class', 'map-in-map-background')
47508                 .merge(background)
47509                 .call(backgroundLayer);
47510
47511
47512             // redraw overlay
47513             var overlaySources = context.background().overlayLayerSources();
47514             var activeOverlayLayers = [];
47515             for (var i = 0; i < overlaySources.length; i++) {
47516                 if (overlaySources[i].validZoom(zMini)) {
47517                     if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
47518                     activeOverlayLayers.push(overlayLayers[i]
47519                         .source(overlaySources[i])
47520                         .projection(projection$$1)
47521                         .dimensions(dMini));
47522                 }
47523             }
47524
47525             var overlay = tiles
47526                 .selectAll('.map-in-map-overlay')
47527                 .data([0]);
47528
47529             overlay = overlay.enter()
47530                 .append('div')
47531                 .attr('class', 'map-in-map-overlay')
47532                 .merge(overlay);
47533
47534
47535             var overlays = overlay
47536                 .selectAll('div')
47537                 .data(activeOverlayLayers, function(d) { return d.source().name(); });
47538
47539             overlays.exit()
47540                 .remove();
47541
47542             overlays = overlays.enter()
47543                 .append('div')
47544                 .merge(overlays)
47545                 .each(function(layer) { d3_select(this).call(layer); });
47546
47547
47548             var dataLayers = tiles
47549                 .selectAll('.map-in-map-data')
47550                 .data([0]);
47551
47552             dataLayers.exit()
47553                 .remove();
47554
47555             dataLayers = dataLayers.enter()
47556                 .append('svg')
47557                 .attr('class', 'map-in-map-data')
47558                 .merge(dataLayers)
47559                 .call(gpxLayer)
47560                 .call(debugLayer);
47561
47562
47563             // redraw viewport bounding box
47564             if (gesture !== 'pan') {
47565                 var getPath = d3_geoPath(projection$$1),
47566                     bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
47567
47568                 viewport = wrap.selectAll('.map-in-map-viewport')
47569                     .data([0]);
47570
47571                 viewport = viewport.enter()
47572                     .append('svg')
47573                     .attr('class', 'map-in-map-viewport')
47574                     .merge(viewport);
47575
47576
47577                 var path = viewport.selectAll('.map-in-map-bbox')
47578                     .data([bbox]);
47579
47580                 path.enter()
47581                     .append('path')
47582                     .attr('class', 'map-in-map-bbox')
47583                     .merge(path)
47584                     .attr('d', getPath)
47585                     .classed('thick', function(d) { return getPath.area(d) < 30; });
47586             }
47587         }
47588
47589
47590         function queueRedraw() {
47591             clearTimeout(timeoutId);
47592             timeoutId = setTimeout(function() { redraw(); }, 750);
47593         }
47594
47595
47596         function toggle() {
47597             if (event) event.preventDefault();
47598
47599             isHidden = !isHidden;
47600
47601             var label = d3_select('.minimap-toggle');
47602             label.classed('active', !isHidden)
47603                 .select('input').property('checked', !isHidden);
47604
47605             if (isHidden) {
47606                 wrap
47607                     .style('display', 'block')
47608                     .style('opacity', '1')
47609                     .transition()
47610                     .duration(200)
47611                     .style('opacity', '0')
47612                     .on('end', function() {
47613                         selection$$1.selectAll('.map-in-map')
47614                             .style('display', 'none');
47615                     });
47616             } else {
47617                 wrap
47618                     .style('display', 'block')
47619                     .style('opacity', '0')
47620                     .transition()
47621                     .duration(200)
47622                     .style('opacity', '1')
47623                     .on('end', function() {
47624                         redraw();
47625                     });
47626             }
47627         }
47628
47629
47630         uiMapInMap.toggle = toggle;
47631
47632         wrap = selection$$1.selectAll('.map-in-map')
47633             .data([0]);
47634
47635         wrap = wrap.enter()
47636             .append('div')
47637             .attr('class', 'map-in-map')
47638             .style('display', (isHidden ? 'none' : 'block'))
47639             .call(zoom)
47640             .on('dblclick.zoom', null)
47641             .merge(wrap);
47642
47643         context.map()
47644             .on('drawn.map-in-map', function(drawn) {
47645                 if (drawn.full === true) {
47646                     redraw();
47647                 }
47648             });
47649
47650         redraw();
47651
47652         var keybinding = d3keybinding('map-in-map')
47653             .on(t('background.minimap.key'), toggle);
47654
47655         d3_select(document)
47656             .call(keybinding);
47657     }
47658
47659     return map_in_map;
47660 }
47661
47662 function uiTooltipHtml(text, key, heading) {
47663     var s = '';
47664
47665     if (heading) {
47666         s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
47667     }
47668     if (text) {
47669         s += '<div class="tooltip-text"><span>' + text + '</span></div>';
47670     }
47671     if (key) {
47672         s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
47673             '<span class="keyhint">' + key + '</span></div>';
47674     }
47675
47676     return s;
47677 }
47678
47679 function uiBackground(context) {
47680     var key = t('background.key'),
47681         detected = utilDetect(),
47682         opacities = [1, 0.75, 0.5, 0.25],
47683         directions = [
47684             ['right', [0.5, 0]],
47685             ['top', [0, -0.5]],
47686             ['left', [-0.5, 0]],
47687             ['bottom', [0, 0.5]]],
47688         opacityDefault = (context.storage('background-opacity') !== null) ?
47689             (+context.storage('background-opacity')) : 1.0,
47690         customSource = context.background().findSource('custom'),
47691         previous;
47692
47693     // Can be 0 from <1.3.0 use or due to issue #1923.
47694     if (opacityDefault === 0) opacityDefault = 1.0;
47695
47696
47697     function background(selection$$1) {
47698
47699         function sortSources(a, b) {
47700             return a.best() && !b.best() ? -1
47701                 : b.best() && !a.best() ? 1
47702                 : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
47703         }
47704
47705
47706         function setOpacity(d) {
47707             var bg = context.container().selectAll('.layer-background')
47708                 .transition()
47709                 .style('opacity', d)
47710                 .attr('data-opacity', d);
47711
47712             if (!detected.opera) {
47713                 utilSetTransform(bg, 0, 0);
47714             }
47715
47716             opacityList.selectAll('li')
47717                 .classed('active', function(_) { return _ === d; });
47718
47719             context.storage('background-opacity', d);
47720         }
47721
47722
47723         function setTooltips(selection$$1) {
47724             selection$$1.each(function(d, i, nodes) {
47725                 var item = d3_select(this).select('label'),
47726                     span = item.select('span'),
47727                     placement = (i < nodes.length / 2) ? 'bottom' : 'top',
47728                     description = d.description(),
47729                     isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
47730
47731                 if (d === previous) {
47732                     item.call(tooltip()
47733                         .placement(placement)
47734                         .html(true)
47735                         .title(function() {
47736                             var tip = '<div>' + t('background.switch') + '</div>';
47737                             return uiTooltipHtml(tip, uiCmd('⌘' + key));
47738                         })
47739                     );
47740                 } else if (description || isOverflowing) {
47741                     item.call(tooltip()
47742                         .placement(placement)
47743                         .title(description || d.name())
47744                     );
47745                 } else {
47746                     item.call(tooltip().destroy);
47747                 }
47748             });
47749         }
47750
47751
47752         function selectLayer() {
47753             function active(d) {
47754                 return context.background().showsLayer(d);
47755             }
47756
47757             content.selectAll('.layer')
47758                 .classed('active', active)
47759                 .classed('switch', function(d) { return d === previous; })
47760                 .call(setTooltips)
47761                 .selectAll('input')
47762                 .property('checked', active);
47763         }
47764
47765
47766         function clickSetSource(d) {
47767             if (d.id === 'custom' && !d.template()) {
47768                 return editCustom();
47769             }
47770
47771             event.preventDefault();
47772             previous = context.background().baseLayerSource();
47773             context.background().baseLayerSource(d);
47774             selectLayer();
47775             document.activeElement.blur();
47776         }
47777
47778
47779         function editCustom() {
47780             event.preventDefault();
47781             var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
47782             var template = window.prompt(
47783                 t('background.custom_prompt', { example: example }),
47784                 customSource.template() || example
47785             );
47786
47787             if (template) {
47788                 context.storage('background-custom-template', template);
47789                 customSource.template(template);
47790                 clickSetSource(customSource);
47791             } else {
47792                 selectLayer();
47793             }
47794         }
47795
47796
47797         function clickSetOverlay(d) {
47798             event.preventDefault();
47799             context.background().toggleOverlayLayer(d);
47800             selectLayer();
47801             document.activeElement.blur();
47802         }
47803
47804
47805         function drawList(layerList, type, change, filter) {
47806             var sources = context.background()
47807                 .sources(context.map().extent())
47808                 .filter(filter);
47809
47810             var layerLinks = layerList.selectAll('li.layer')
47811                 .data(sources, function(d) { return d.name(); });
47812
47813             layerLinks.exit()
47814                 .remove();
47815
47816             var enter = layerLinks.enter()
47817                 .append('li')
47818                 .attr('class', 'layer')
47819                 .classed('layer-custom', function(d) { return d.id === 'custom'; })
47820                 .classed('best', function(d) { return d.best(); });
47821
47822             enter.filter(function(d) { return d.id === 'custom'; })
47823                 .append('button')
47824                 .attr('class', 'layer-browse')
47825                 .call(tooltip()
47826                     .title(t('background.custom_button'))
47827                     .placement((textDirection === 'rtl') ? 'right' : 'left'))
47828                 .on('click', editCustom)
47829                 .call(svgIcon('#icon-search'));
47830
47831             enter.filter(function(d) { return d.best(); })
47832                 .append('div')
47833                 .attr('class', 'best')
47834                 .call(tooltip()
47835                     .title(t('background.best_imagery'))
47836                     .placement((textDirection === 'rtl') ? 'right' : 'left'))
47837                 .append('span')
47838                 .html('&#9733;');
47839
47840             var label = enter
47841                 .append('label');
47842
47843             label
47844                 .append('input')
47845                 .attr('type', type)
47846                 .attr('name', 'layers')
47847                 .on('change', change);
47848
47849             label
47850                 .append('span')
47851                 .text(function(d) { return d.name(); });
47852
47853
47854             layerList.selectAll('li.layer')
47855                 .sort(sortSources)
47856                 .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
47857         }
47858
47859
47860         function update() {
47861             backgroundList.call(drawList, 'radio', clickSetSource, function(d) { return !d.overlay; });
47862             overlayList.call(drawList, 'checkbox', clickSetOverlay, function(d) { return d.overlay; });
47863
47864             selectLayer();
47865             updateOffsetVal();
47866         }
47867
47868
47869         function updateOffsetVal() {
47870             var meters = geoOffsetToMeters(context.background().offset()),
47871                 x = +meters[0].toFixed(2),
47872                 y = +meters[1].toFixed(2);
47873
47874             d3_selectAll('.nudge-inner-rect')
47875                 .select('input')
47876                 .classed('error', false)
47877                 .property('value', x + ', ' + y);
47878
47879             d3_selectAll('.nudge-reset')
47880                 .classed('disabled', function() {
47881                     return (x === 0 && y === 0);
47882                 });
47883         }
47884
47885
47886         function resetOffset() {
47887             if (event.button !== 0) return;
47888             context.background().offset([0, 0]);
47889             updateOffsetVal();
47890         }
47891
47892
47893         function nudge(d) {
47894             context.background().nudge(d, context.map().zoom());
47895             updateOffsetVal();
47896         }
47897
47898
47899         function buttonOffset(d) {
47900             if (event.button !== 0) return;
47901             var timeout = window.setTimeout(function() {
47902                     interval = window.setInterval(nudge.bind(null, d), 100);
47903                 }, 500),
47904                 interval;
47905
47906             function doneNudge() {
47907                 window.clearTimeout(timeout);
47908                 window.clearInterval(interval);
47909                 d3_select(window)
47910                     .on('mouseup.buttonoffset', null, true)
47911                     .on('mousedown.buttonoffset', null, true);
47912             }
47913
47914             d3_select(window)
47915                 .on('mouseup.buttonoffset', doneNudge, true)
47916                 .on('mousedown.buttonoffset', doneNudge, true);
47917
47918             nudge(d);
47919         }
47920
47921
47922         function inputOffset() {
47923             if (event.button !== 0) return;
47924             var input = d3_select(this);
47925             var d = input.node().value;
47926
47927             if (d === '') return resetOffset();
47928
47929             d = d.replace(/;/g, ',').split(',').map(function(n) {
47930                 // if n is NaN, it will always get mapped to false.
47931                 return !isNaN(n) && n;
47932             });
47933
47934             if (d.length !== 2 || !d[0] || !d[1]) {
47935                 input.classed('error', true);
47936                 return;
47937             }
47938
47939             context.background().offset(geoMetersToOffset(d));
47940             updateOffsetVal();
47941         }
47942
47943
47944         function dragOffset() {
47945             if (event.button !== 0) return;
47946             var origin = [event.clientX, event.clientY];
47947
47948             context.container()
47949                 .append('div')
47950                 .attr('class', 'nudge-surface');
47951
47952             d3_select(window)
47953                 .on('mousemove.offset', function() {
47954                     var latest = [event.clientX, event.clientY];
47955                     var d = [
47956                         -(origin[0] - latest[0]) / 4,
47957                         -(origin[1] - latest[1]) / 4
47958                     ];
47959
47960                     origin = latest;
47961                     nudge(d);
47962                 })
47963                 .on('mouseup.offset', function() {
47964                     if (event.button !== 0) return;
47965                     d3_selectAll('.nudge-surface')
47966                         .remove();
47967
47968                     d3_select(window)
47969                         .on('mousemove.offset', null)
47970                         .on('mouseup.offset', null);
47971                 });
47972
47973             event.preventDefault();
47974         }
47975
47976
47977         function hide() {
47978             setVisible(false);
47979         }
47980
47981
47982         function toggle() {
47983             if (event) {
47984                 event.preventDefault();
47985             }
47986             tooltipBehavior.hide(button);
47987             setVisible(!button.classed('active'));
47988         }
47989
47990
47991         function quickSwitch() {
47992             if (event) {
47993                 event.stopImmediatePropagation();
47994                 event.preventDefault();
47995             }
47996             if (previous) {
47997                 clickSetSource(previous);
47998             }
47999         }
48000
48001
48002         function setVisible(show) {
48003             if (show !== shown) {
48004                 button.classed('active', show);
48005                 shown = show;
48006
48007                 if (show) {
48008                     selection$$1
48009                         .on('mousedown.background-inside', function() {
48010                             event.stopPropagation();
48011                         });
48012
48013                     content
48014                         .style('display', 'block')
48015                         .style('right', '-300px')
48016                         .transition()
48017                         .duration(200)
48018                         .style('right', '0px');
48019
48020                     content.selectAll('.layer')
48021                         .call(setTooltips);
48022
48023                 } else {
48024                     content
48025                         .style('display', 'block')
48026                         .style('right', '0px')
48027                         .transition()
48028                         .duration(200)
48029                         .style('right', '-300px')
48030                         .on('end', function() {
48031                             d3_select(this).style('display', 'none');
48032                         });
48033
48034                     selection$$1
48035                         .on('mousedown.background-inside', null);
48036                 }
48037             }
48038         }
48039
48040
48041         var content = selection$$1
48042                 .append('div')
48043                 .attr('class', 'fillL map-overlay col3 content hide'),
48044             tooltipBehavior = tooltip()
48045                 .placement((textDirection === 'rtl') ? 'right' : 'left')
48046                 .html(true)
48047                 .title(uiTooltipHtml(t('background.description'), key)),
48048             button = selection$$1
48049                 .append('button')
48050                 .attr('tabindex', -1)
48051                 .on('click', toggle)
48052                 .call(svgIcon('#icon-layers', 'light'))
48053                 .call(tooltipBehavior),
48054             shown = false;
48055
48056
48057         /* opacity switcher */
48058
48059         var opawrap = content
48060                 .append('div')
48061                 .attr('class', 'opacity-options-wrapper');
48062
48063         opawrap
48064             .append('h4')
48065             .text(t('background.title'));
48066
48067         var opacityList = opawrap
48068             .append('ul')
48069             .attr('class', 'opacity-options');
48070
48071         opacityList.selectAll('div.opacity')
48072             .data(opacities)
48073             .enter()
48074             .append('li')
48075             .attr('data-original-title', function(d) {
48076                 return t('background.percent_brightness', { opacity: (d * 100) });
48077             })
48078             .on('click.set-opacity', setOpacity)
48079             .html('<div class="select-box"></div>')
48080             .call(tooltip()
48081                 .placement((textDirection === 'rtl') ? 'right' : 'left'))
48082             .append('div')
48083             .attr('class', 'opacity')
48084             .style('opacity', function(d) { return 1.25 - d; });
48085
48086
48087         /* background list */
48088
48089         var backgroundList = content
48090             .append('ul')
48091             .attr('class', 'layer-list')
48092             .attr('dir', 'auto');
48093
48094         content
48095             .append('div')
48096             .attr('class', 'imagery-faq')
48097             .append('a')
48098             .attr('target', '_blank')
48099             .attr('tabindex', -1)
48100             .call(svgIcon('#icon-out-link', 'inline'))
48101             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
48102             .append('span')
48103             .text(t('background.imagery_source_faq'));
48104
48105
48106         /* overlay list */
48107
48108         var overlayList = content
48109             .append('ul')
48110             .attr('class', 'layer-list');
48111
48112         var controls = content
48113             .append('div')
48114             .attr('class', 'controls-list');
48115
48116
48117         /* minimap toggle */
48118
48119         var minimapLabel = controls
48120             .append('label')
48121             .call(tooltip()
48122                 .html(true)
48123                 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
48124                 .placement('top')
48125             );
48126
48127         minimapLabel
48128             .classed('minimap-toggle', true)
48129             .append('input')
48130             .attr('type', 'checkbox')
48131             .on('change', function() {
48132                 uiMapInMap.toggle();
48133                 event.preventDefault();
48134             });
48135
48136         minimapLabel
48137             .append('span')
48138             .text(t('background.minimap.description'));
48139
48140
48141         /* imagery offset controls */
48142
48143         var adjustments = content
48144             .append('div')
48145             .attr('class', 'adjustments');
48146
48147         adjustments
48148             .append('a')
48149             .text(t('background.fix_misalignment'))
48150             .attr('href', '#')
48151             .classed('hide-toggle', true)
48152             .classed('expanded', false)
48153             .on('click', function() {
48154                 if (event.button !== 0) return;
48155                 var exp = d3_select(this).classed('expanded');
48156                 nudgeContainer.style('display', exp ? 'none' : 'block');
48157                 d3_select(this).classed('expanded', !exp);
48158                 event.preventDefault();
48159             });
48160
48161         var nudgeContainer = adjustments
48162             .append('div')
48163             .attr('class', 'nudge-container cf')
48164             .style('display', 'none');
48165
48166         nudgeContainer
48167             .append('div')
48168             .attr('class', 'nudge-instructions')
48169             .text(t('background.offset'));
48170
48171         var nudgeRect = nudgeContainer
48172             .append('div')
48173             .attr('class', 'nudge-outer-rect')
48174             .on('mousedown', dragOffset);
48175
48176         nudgeRect
48177             .append('div')
48178             .attr('class', 'nudge-inner-rect')
48179             .append('input')
48180             .on('change', inputOffset)
48181             .on('mousedown', function() {
48182                 if (event.button !== 0) return;
48183                 event.stopPropagation();
48184             });
48185
48186         nudgeContainer
48187             .append('div')
48188             .selectAll('button')
48189             .data(directions).enter()
48190             .append('button')
48191             .attr('class', function(d) { return d[0] + ' nudge'; })
48192             .on('mousedown', function(d) {
48193                 if (event.button !== 0) return;
48194                 buttonOffset(d[1]);
48195             });
48196
48197         nudgeContainer
48198             .append('button')
48199             .attr('title', t('background.reset'))
48200             .attr('class', 'nudge-reset disabled')
48201             .on('click', resetOffset)
48202             .call(
48203                 (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
48204             );
48205
48206         context.map()
48207             .on('move.background-update', debounce$1(utilCallWhenIdle(update), 1000));
48208
48209         context.background()
48210             .on('change.background-update', update);
48211
48212
48213         update();
48214         setOpacity(opacityDefault);
48215
48216         var keybinding = d3keybinding('background')
48217             .on(key, toggle)
48218             .on(uiCmd('⌘' + key), quickSwitch)
48219             .on([t('map_data.key'), t('help.key')], hide);
48220
48221         d3_select(document)
48222             .call(keybinding);
48223
48224         context.surface().on('mousedown.background-outside', hide);
48225         context.container().on('mousedown.background-outside', hide);
48226     }
48227
48228     return background;
48229 }
48230
48231 function uiContributors(context) {
48232     var osm = context.connection(),
48233         debouncedUpdate = debounce$1(function() { update(); }, 1000),
48234         limit = 4,
48235         hidden = false,
48236         wrap = d3_select(null);
48237
48238
48239     function update() {
48240         if (!osm) return;
48241
48242         var users = {},
48243             entities = context.intersects(context.map().extent());
48244
48245         entities.forEach(function(entity) {
48246             if (entity && entity.user) users[entity.user] = true;
48247         });
48248
48249         var u = Object.keys(users),
48250             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
48251
48252         wrap.html('')
48253             .call(svgIcon('#icon-nearby', 'pre-text light'));
48254
48255         var userList = d3_select(document.createElement('span'));
48256
48257         userList.selectAll()
48258             .data(subset)
48259             .enter()
48260             .append('a')
48261             .attr('class', 'user-link')
48262             .attr('href', function(d) { return osm.userURL(d); })
48263             .attr('target', '_blank')
48264             .attr('tabindex', -1)
48265             .text(String);
48266
48267         if (u.length > limit) {
48268             var count = d3_select(document.createElement('span'));
48269
48270             count.append('a')
48271                 .attr('target', '_blank')
48272                 .attr('tabindex', -1)
48273                 .attr('href', function() {
48274                     return osm.changesetsURL(context.map().center(), context.map().zoom());
48275                 })
48276                 .text(u.length - limit + 1);
48277
48278             wrap.append('span')
48279                 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
48280
48281         } else {
48282             wrap.append('span')
48283                 .html(t('contributors.list', { users: userList.html() }));
48284         }
48285
48286         if (!u.length) {
48287             hidden = true;
48288             wrap
48289                 .transition()
48290                 .style('opacity', 0);
48291
48292         } else if (hidden) {
48293             wrap
48294                 .transition()
48295                 .style('opacity', 1);
48296         }
48297     }
48298
48299
48300     return function(selection$$1) {
48301         if (!osm) return;
48302         wrap = selection$$1;
48303         update();
48304
48305         osm.on('loaded.contributors', debouncedUpdate);
48306         context.map().on('move.contributors', debouncedUpdate);
48307     };
48308 }
48309
48310 function uiFeatureInfo(context) {
48311     function update(selection$$1) {
48312         var features = context.features(),
48313             stats = features.stats(),
48314             count = 0,
48315             hiddenList = compact(map$4(features.hidden(), function(k) {
48316                 if (stats[k]) {
48317                     count += stats[k];
48318                     return String(stats[k]) + ' ' + t('feature.' + k + '.description');
48319                 }
48320             }));
48321
48322         selection$$1.html('');
48323
48324         if (hiddenList.length) {
48325             var tooltipBehavior = tooltip()
48326                 .placement('top')
48327                 .html(true)
48328                 .title(function() {
48329                     return uiTooltipHtml(hiddenList.join('<br/>'));
48330                 });
48331
48332             var warning = selection$$1.append('a')
48333                 .attr('href', '#')
48334                 .attr('tabindex', -1)
48335                 .html(t('feature_info.hidden_warning', { count: count }))
48336                 .call(tooltipBehavior)
48337                 .on('click', function() {
48338                     tooltipBehavior.hide(warning);
48339                     // open map data panel?
48340                     event.preventDefault();
48341                 });
48342         }
48343
48344         selection$$1
48345             .classed('hide', !hiddenList.length);
48346     }
48347
48348
48349     return function(selection$$1) {
48350         update(selection$$1);
48351
48352         context.features().on('change.feature_info', function() {
48353             update(selection$$1);
48354         });
48355     };
48356 }
48357
48358 function uiFullScreen(context) {
48359     var element = context.container().node(),
48360         keybinding = d3keybinding('full-screen');
48361         // button;
48362
48363
48364     function getFullScreenFn() {
48365         if (element.requestFullscreen) {
48366             return element.requestFullscreen;
48367         } else if (element.msRequestFullscreen) {
48368             return element.msRequestFullscreen;
48369         } else if (element.mozRequestFullScreen) {
48370             return element.mozRequestFullScreen;
48371         } else if (element.webkitRequestFullscreen) {
48372             return element.webkitRequestFullscreen;
48373         }
48374     }
48375
48376
48377     function getExitFullScreenFn() {
48378         if (document.exitFullscreen) {
48379             return document.exitFullscreen;
48380         } else if (document.msExitFullscreen) {
48381             return document.msExitFullscreen;
48382         } else if (document.mozCancelFullScreen) {
48383             return document.mozCancelFullScreen;
48384         } else if (document.webkitExitFullscreen) {
48385             return document.webkitExitFullscreen;
48386         }
48387     }
48388
48389
48390     function isFullScreen() {
48391         return document.fullscreenElement ||
48392             document.mozFullScreenElement ||
48393             document.webkitFullscreenElement ||
48394             document.msFullscreenElement;
48395     }
48396
48397
48398     function isSupported() {
48399         return !!getFullScreenFn();
48400     }
48401
48402
48403     function fullScreen() {
48404         event.preventDefault();
48405         if (!isFullScreen()) {
48406             // button.classed('active', true);
48407             getFullScreenFn().apply(element);
48408         } else {
48409             // button.classed('active', false);
48410             getExitFullScreenFn().apply(document);
48411         }
48412     }
48413
48414
48415     return function() { // selection) {
48416         if (!isSupported())
48417             return;
48418
48419         // button = selection.append('button')
48420         //     .attr('title', t('full_screen'))
48421         //     .attr('tabindex', -1)
48422         //     .on('click', fullScreen)
48423         //     .call(tooltip);
48424
48425         // button.append('span')
48426         //     .attr('class', 'icon full-screen');
48427
48428         var detected = utilDetect();
48429         var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
48430         keybinding.on(keys, fullScreen);
48431
48432         d3_select(document)
48433             .call(keybinding);
48434     };
48435 }
48436
48437 function uiModal(selection$$1, blocking) {
48438     var keybinding = d3keybinding('modal');
48439     var previous = selection$$1.select('div.modal');
48440     var animate = previous.empty();
48441
48442     previous.transition()
48443         .duration(200)
48444         .style('opacity', 0)
48445         .remove();
48446
48447     var shaded = selection$$1
48448         .append('div')
48449         .attr('class', 'shaded')
48450         .style('opacity', 0);
48451
48452     shaded.close = function() {
48453         shaded
48454             .transition()
48455             .duration(200)
48456             .style('opacity',0)
48457             .remove();
48458
48459         modal
48460             .transition()
48461             .duration(200)
48462             .style('top','0px');
48463
48464         keybinding.off();
48465     };
48466
48467
48468     var modal = shaded
48469         .append('div')
48470         .attr('class', 'modal fillL col6');
48471
48472     if (!blocking) {
48473         shaded.on('click.remove-modal', function() {
48474             if (event.target === this) {
48475                 shaded.close();
48476             }
48477         });
48478
48479         modal.append('button')
48480             .attr('class', 'close')
48481             .on('click', shaded.close)
48482             .call(svgIcon('#icon-close'));
48483
48484         keybinding
48485             .on('⌫', shaded.close)
48486             .on('⎋', shaded.close);
48487
48488         d3_select(document)
48489             .call(keybinding);
48490     }
48491
48492     modal
48493         .append('div')
48494         .attr('class', 'content');
48495
48496     if (animate) {
48497         shaded.transition().style('opacity', 1);
48498     } else {
48499         shaded.style('opacity', 1);
48500     }
48501
48502
48503     return shaded;
48504 }
48505
48506 function uiLoading(context) {
48507     var message = '',
48508         blocking = false,
48509         modalSelection;
48510
48511
48512     var loading = function(selection) {
48513         modalSelection = uiModal(selection, blocking);
48514
48515         var loadertext = modalSelection.select('.content')
48516             .classed('loading-modal', true)
48517             .append('div')
48518             .attr('class', 'modal-section fillL');
48519
48520         loadertext
48521             .append('img')
48522             .attr('class', 'loader')
48523             .attr('src', context.imagePath('loader-white.gif'));
48524
48525         loadertext
48526             .append('h3')
48527             .text(message);
48528
48529         modalSelection.select('button.close')
48530             .attr('class', 'hide');
48531
48532         return loading;
48533     };
48534
48535
48536     loading.message = function(_) {
48537         if (!arguments.length) return message;
48538         message = _;
48539         return loading;
48540     };
48541
48542
48543     loading.blocking = function(_) {
48544         if (!arguments.length) return blocking;
48545         blocking = _;
48546         return loading;
48547     };
48548
48549
48550     loading.close = function() {
48551         modalSelection.remove();
48552     };
48553
48554
48555     return loading;
48556 }
48557
48558 function uiGeolocate(context) {
48559     var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
48560         locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
48561         timeoutId;
48562
48563
48564     function click() {
48565         if (context.inIntro()) return;
48566         context.enter(modeBrowse(context));
48567         context.container().call(locating);
48568         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
48569
48570         // This timeout ensures that we still call finish() even if
48571         // the user declines to share their location in Firefox
48572         timeoutId = setTimeout(finish, 10000 /* 10sec */ );
48573     }
48574
48575
48576     function success(position) {
48577         var map = context.map(),
48578             extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
48579                 .padByMeters(position.coords.accuracy);
48580
48581         map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
48582         finish();
48583     }
48584
48585
48586     function error() {
48587         finish();
48588     }
48589
48590
48591     function finish() {
48592         locating.close();  // unblock ui
48593         if (timeoutId) { clearTimeout(timeoutId); }
48594         timeoutId = undefined;
48595     }
48596
48597
48598     return function(selection) {
48599         if (!navigator.geolocation) return;
48600
48601         selection
48602             .append('button')
48603             .attr('tabindex', -1)
48604             .attr('title', t('geolocate.title'))
48605             .on('click', click)
48606             .call(svgIcon('#icon-geolocate', 'light'))
48607             .call(tooltip()
48608                 .placement((textDirection === 'rtl') ? 'right' : 'left'));
48609     };
48610 }
48611
48612 var marked = createCommonjsModule(function (module, exports) {
48613 /**
48614  * marked - a markdown parser
48615  * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
48616  * https://github.com/chjj/marked
48617  */
48618
48619 (function() {
48620
48621 /**
48622  * Block-Level Grammar
48623  */
48624
48625 var block = {
48626   newline: /^\n+/,
48627   code: /^( {4}[^\n]+\n*)+/,
48628   fences: noop,
48629   hr: /^( *[-*_]){3,} *(?:\n+|$)/,
48630   heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
48631   nptable: noop,
48632   lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
48633   blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
48634   list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
48635   html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
48636   def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
48637   table: noop,
48638   paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
48639   text: /^[^\n]+/
48640 };
48641
48642 block.bullet = /(?:[*+-]|\d+\.)/;
48643 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
48644 block.item = replace(block.item, 'gm')
48645   (/bull/g, block.bullet)
48646   ();
48647
48648 block.list = replace(block.list)
48649   (/bull/g, block.bullet)
48650   ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
48651   ('def', '\\n+(?=' + block.def.source + ')')
48652   ();
48653
48654 block.blockquote = replace(block.blockquote)
48655   ('def', block.def)
48656   ();
48657
48658 block._tag = '(?!(?:'
48659   + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
48660   + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
48661   + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
48662
48663 block.html = replace(block.html)
48664   ('comment', /<!--[\s\S]*?-->/)
48665   ('closed', /<(tag)[\s\S]+?<\/\1>/)
48666   ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
48667   (/tag/g, block._tag)
48668   ();
48669
48670 block.paragraph = replace(block.paragraph)
48671   ('hr', block.hr)
48672   ('heading', block.heading)
48673   ('lheading', block.lheading)
48674   ('blockquote', block.blockquote)
48675   ('tag', '<' + block._tag)
48676   ('def', block.def)
48677   ();
48678
48679 /**
48680  * Normal Block Grammar
48681  */
48682
48683 block.normal = merge({}, block);
48684
48685 /**
48686  * GFM Block Grammar
48687  */
48688
48689 block.gfm = merge({}, block.normal, {
48690   fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
48691   paragraph: /^/,
48692   heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
48693 });
48694
48695 block.gfm.paragraph = replace(block.paragraph)
48696   ('(?!', '(?!'
48697     + block.gfm.fences.source.replace('\\1', '\\2') + '|'
48698     + block.list.source.replace('\\1', '\\3') + '|')
48699   ();
48700
48701 /**
48702  * GFM + Tables Block Grammar
48703  */
48704
48705 block.tables = merge({}, block.gfm, {
48706   nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
48707   table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
48708 });
48709
48710 /**
48711  * Block Lexer
48712  */
48713
48714 function Lexer(options) {
48715   this.tokens = [];
48716   this.tokens.links = {};
48717   this.options = options || marked.defaults;
48718   this.rules = block.normal;
48719
48720   if (this.options.gfm) {
48721     if (this.options.tables) {
48722       this.rules = block.tables;
48723     } else {
48724       this.rules = block.gfm;
48725     }
48726   }
48727 }
48728
48729 /**
48730  * Expose Block Rules
48731  */
48732
48733 Lexer.rules = block;
48734
48735 /**
48736  * Static Lex Method
48737  */
48738
48739 Lexer.lex = function(src, options) {
48740   var lexer = new Lexer(options);
48741   return lexer.lex(src);
48742 };
48743
48744 /**
48745  * Preprocessing
48746  */
48747
48748 Lexer.prototype.lex = function(src) {
48749   src = src
48750     .replace(/\r\n|\r/g, '\n')
48751     .replace(/\t/g, '    ')
48752     .replace(/\u00a0/g, ' ')
48753     .replace(/\u2424/g, '\n');
48754
48755   return this.token(src, true);
48756 };
48757
48758 /**
48759  * Lexing
48760  */
48761
48762 Lexer.prototype.token = function(src, top, bq) {
48763   var src = src.replace(/^ +$/gm, '')
48764     , next
48765     , loose
48766     , cap
48767     , bull
48768     , b
48769     , item
48770     , space
48771     , i
48772     , l;
48773
48774   while (src) {
48775     // newline
48776     if (cap = this.rules.newline.exec(src)) {
48777       src = src.substring(cap[0].length);
48778       if (cap[0].length > 1) {
48779         this.tokens.push({
48780           type: 'space'
48781         });
48782       }
48783     }
48784
48785     // code
48786     if (cap = this.rules.code.exec(src)) {
48787       src = src.substring(cap[0].length);
48788       cap = cap[0].replace(/^ {4}/gm, '');
48789       this.tokens.push({
48790         type: 'code',
48791         text: !this.options.pedantic
48792           ? cap.replace(/\n+$/, '')
48793           : cap
48794       });
48795       continue;
48796     }
48797
48798     // fences (gfm)
48799     if (cap = this.rules.fences.exec(src)) {
48800       src = src.substring(cap[0].length);
48801       this.tokens.push({
48802         type: 'code',
48803         lang: cap[2],
48804         text: cap[3] || ''
48805       });
48806       continue;
48807     }
48808
48809     // heading
48810     if (cap = this.rules.heading.exec(src)) {
48811       src = src.substring(cap[0].length);
48812       this.tokens.push({
48813         type: 'heading',
48814         depth: cap[1].length,
48815         text: cap[2]
48816       });
48817       continue;
48818     }
48819
48820     // table no leading pipe (gfm)
48821     if (top && (cap = this.rules.nptable.exec(src))) {
48822       src = src.substring(cap[0].length);
48823
48824       item = {
48825         type: 'table',
48826         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48827         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
48828         cells: cap[3].replace(/\n$/, '').split('\n')
48829       };
48830
48831       for (i = 0; i < item.align.length; i++) {
48832         if (/^ *-+: *$/.test(item.align[i])) {
48833           item.align[i] = 'right';
48834         } else if (/^ *:-+: *$/.test(item.align[i])) {
48835           item.align[i] = 'center';
48836         } else if (/^ *:-+ *$/.test(item.align[i])) {
48837           item.align[i] = 'left';
48838         } else {
48839           item.align[i] = null;
48840         }
48841       }
48842
48843       for (i = 0; i < item.cells.length; i++) {
48844         item.cells[i] = item.cells[i].split(/ *\| */);
48845       }
48846
48847       this.tokens.push(item);
48848
48849       continue;
48850     }
48851
48852     // lheading
48853     if (cap = this.rules.lheading.exec(src)) {
48854       src = src.substring(cap[0].length);
48855       this.tokens.push({
48856         type: 'heading',
48857         depth: cap[2] === '=' ? 1 : 2,
48858         text: cap[1]
48859       });
48860       continue;
48861     }
48862
48863     // hr
48864     if (cap = this.rules.hr.exec(src)) {
48865       src = src.substring(cap[0].length);
48866       this.tokens.push({
48867         type: 'hr'
48868       });
48869       continue;
48870     }
48871
48872     // blockquote
48873     if (cap = this.rules.blockquote.exec(src)) {
48874       src = src.substring(cap[0].length);
48875
48876       this.tokens.push({
48877         type: 'blockquote_start'
48878       });
48879
48880       cap = cap[0].replace(/^ *> ?/gm, '');
48881
48882       // Pass `top` to keep the current
48883       // "toplevel" state. This is exactly
48884       // how markdown.pl works.
48885       this.token(cap, top, true);
48886
48887       this.tokens.push({
48888         type: 'blockquote_end'
48889       });
48890
48891       continue;
48892     }
48893
48894     // list
48895     if (cap = this.rules.list.exec(src)) {
48896       src = src.substring(cap[0].length);
48897       bull = cap[2];
48898
48899       this.tokens.push({
48900         type: 'list_start',
48901         ordered: bull.length > 1
48902       });
48903
48904       // Get each top-level item.
48905       cap = cap[0].match(this.rules.item);
48906
48907       next = false;
48908       l = cap.length;
48909       i = 0;
48910
48911       for (; i < l; i++) {
48912         item = cap[i];
48913
48914         // Remove the list item's bullet
48915         // so it is seen as the next token.
48916         space = item.length;
48917         item = item.replace(/^ *([*+-]|\d+\.) +/, '');
48918
48919         // Outdent whatever the
48920         // list item contains. Hacky.
48921         if (~item.indexOf('\n ')) {
48922           space -= item.length;
48923           item = !this.options.pedantic
48924             ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
48925             : item.replace(/^ {1,4}/gm, '');
48926         }
48927
48928         // Determine whether the next list item belongs here.
48929         // Backpedal if it does not belong in this list.
48930         if (this.options.smartLists && i !== l - 1) {
48931           b = block.bullet.exec(cap[i + 1])[0];
48932           if (bull !== b && !(bull.length > 1 && b.length > 1)) {
48933             src = cap.slice(i + 1).join('\n') + src;
48934             i = l - 1;
48935           }
48936         }
48937
48938         // Determine whether item is loose or not.
48939         // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
48940         // for discount behavior.
48941         loose = next || /\n\n(?!\s*$)/.test(item);
48942         if (i !== l - 1) {
48943           next = item.charAt(item.length - 1) === '\n';
48944           if (!loose) loose = next;
48945         }
48946
48947         this.tokens.push({
48948           type: loose
48949             ? 'loose_item_start'
48950             : 'list_item_start'
48951         });
48952
48953         // Recurse.
48954         this.token(item, false, bq);
48955
48956         this.tokens.push({
48957           type: 'list_item_end'
48958         });
48959       }
48960
48961       this.tokens.push({
48962         type: 'list_end'
48963       });
48964
48965       continue;
48966     }
48967
48968     // html
48969     if (cap = this.rules.html.exec(src)) {
48970       src = src.substring(cap[0].length);
48971       this.tokens.push({
48972         type: this.options.sanitize
48973           ? 'paragraph'
48974           : 'html',
48975         pre: !this.options.sanitizer
48976           && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
48977         text: cap[0]
48978       });
48979       continue;
48980     }
48981
48982     // def
48983     if ((!bq && top) && (cap = this.rules.def.exec(src))) {
48984       src = src.substring(cap[0].length);
48985       this.tokens.links[cap[1].toLowerCase()] = {
48986         href: cap[2],
48987         title: cap[3]
48988       };
48989       continue;
48990     }
48991
48992     // table (gfm)
48993     if (top && (cap = this.rules.table.exec(src))) {
48994       src = src.substring(cap[0].length);
48995
48996       item = {
48997         type: 'table',
48998         header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
48999         align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
49000         cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
49001       };
49002
49003       for (i = 0; i < item.align.length; i++) {
49004         if (/^ *-+: *$/.test(item.align[i])) {
49005           item.align[i] = 'right';
49006         } else if (/^ *:-+: *$/.test(item.align[i])) {
49007           item.align[i] = 'center';
49008         } else if (/^ *:-+ *$/.test(item.align[i])) {
49009           item.align[i] = 'left';
49010         } else {
49011           item.align[i] = null;
49012         }
49013       }
49014
49015       for (i = 0; i < item.cells.length; i++) {
49016         item.cells[i] = item.cells[i]
49017           .replace(/^ *\| *| *\| *$/g, '')
49018           .split(/ *\| */);
49019       }
49020
49021       this.tokens.push(item);
49022
49023       continue;
49024     }
49025
49026     // top-level paragraph
49027     if (top && (cap = this.rules.paragraph.exec(src))) {
49028       src = src.substring(cap[0].length);
49029       this.tokens.push({
49030         type: 'paragraph',
49031         text: cap[1].charAt(cap[1].length - 1) === '\n'
49032           ? cap[1].slice(0, -1)
49033           : cap[1]
49034       });
49035       continue;
49036     }
49037
49038     // text
49039     if (cap = this.rules.text.exec(src)) {
49040       // Top-level should never reach here.
49041       src = src.substring(cap[0].length);
49042       this.tokens.push({
49043         type: 'text',
49044         text: cap[0]
49045       });
49046       continue;
49047     }
49048
49049     if (src) {
49050       throw new
49051         Error('Infinite loop on byte: ' + src.charCodeAt(0));
49052     }
49053   }
49054
49055   return this.tokens;
49056 };
49057
49058 /**
49059  * Inline-Level Grammar
49060  */
49061
49062 var inline = {
49063   escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
49064   autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
49065   url: noop,
49066   tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
49067   link: /^!?\[(inside)\]\(href\)/,
49068   reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
49069   nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
49070   strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
49071   em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
49072   code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
49073   br: /^ {2,}\n(?!\s*$)/,
49074   del: noop,
49075   text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
49076 };
49077
49078 inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
49079 inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
49080
49081 inline.link = replace(inline.link)
49082   ('inside', inline._inside)
49083   ('href', inline._href)
49084   ();
49085
49086 inline.reflink = replace(inline.reflink)
49087   ('inside', inline._inside)
49088   ();
49089
49090 /**
49091  * Normal Inline Grammar
49092  */
49093
49094 inline.normal = merge({}, inline);
49095
49096 /**
49097  * Pedantic Inline Grammar
49098  */
49099
49100 inline.pedantic = merge({}, inline.normal, {
49101   strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
49102   em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
49103 });
49104
49105 /**
49106  * GFM Inline Grammar
49107  */
49108
49109 inline.gfm = merge({}, inline.normal, {
49110   escape: replace(inline.escape)('])', '~|])')(),
49111   url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
49112   del: /^~~(?=\S)([\s\S]*?\S)~~/,
49113   text: replace(inline.text)
49114     (']|', '~]|')
49115     ('|', '|https?://|')
49116     ()
49117 });
49118
49119 /**
49120  * GFM + Line Breaks Inline Grammar
49121  */
49122
49123 inline.breaks = merge({}, inline.gfm, {
49124   br: replace(inline.br)('{2,}', '*')(),
49125   text: replace(inline.gfm.text)('{2,}', '*')()
49126 });
49127
49128 /**
49129  * Inline Lexer & Compiler
49130  */
49131
49132 function InlineLexer(links, options) {
49133   this.options = options || marked.defaults;
49134   this.links = links;
49135   this.rules = inline.normal;
49136   this.renderer = this.options.renderer || new Renderer;
49137   this.renderer.options = this.options;
49138
49139   if (!this.links) {
49140     throw new
49141       Error('Tokens array requires a `links` property.');
49142   }
49143
49144   if (this.options.gfm) {
49145     if (this.options.breaks) {
49146       this.rules = inline.breaks;
49147     } else {
49148       this.rules = inline.gfm;
49149     }
49150   } else if (this.options.pedantic) {
49151     this.rules = inline.pedantic;
49152   }
49153 }
49154
49155 /**
49156  * Expose Inline Rules
49157  */
49158
49159 InlineLexer.rules = inline;
49160
49161 /**
49162  * Static Lexing/Compiling Method
49163  */
49164
49165 InlineLexer.output = function(src, links, options) {
49166   var inline = new InlineLexer(links, options);
49167   return inline.output(src);
49168 };
49169
49170 /**
49171  * Lexing/Compiling
49172  */
49173
49174 InlineLexer.prototype.output = function(src) {
49175   var out = ''
49176     , link
49177     , text
49178     , href
49179     , cap;
49180
49181   while (src) {
49182     // escape
49183     if (cap = this.rules.escape.exec(src)) {
49184       src = src.substring(cap[0].length);
49185       out += cap[1];
49186       continue;
49187     }
49188
49189     // autolink
49190     if (cap = this.rules.autolink.exec(src)) {
49191       src = src.substring(cap[0].length);
49192       if (cap[2] === '@') {
49193         text = cap[1].charAt(6) === ':'
49194           ? this.mangle(cap[1].substring(7))
49195           : this.mangle(cap[1]);
49196         href = this.mangle('mailto:') + text;
49197       } else {
49198         text = escape(cap[1]);
49199         href = text;
49200       }
49201       out += this.renderer.link(href, null, text);
49202       continue;
49203     }
49204
49205     // url (gfm)
49206     if (!this.inLink && (cap = this.rules.url.exec(src))) {
49207       src = src.substring(cap[0].length);
49208       text = escape(cap[1]);
49209       href = text;
49210       out += this.renderer.link(href, null, text);
49211       continue;
49212     }
49213
49214     // tag
49215     if (cap = this.rules.tag.exec(src)) {
49216       if (!this.inLink && /^<a /i.test(cap[0])) {
49217         this.inLink = true;
49218       } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
49219         this.inLink = false;
49220       }
49221       src = src.substring(cap[0].length);
49222       out += this.options.sanitize
49223         ? this.options.sanitizer
49224           ? this.options.sanitizer(cap[0])
49225           : escape(cap[0])
49226         : cap[0];
49227       continue;
49228     }
49229
49230     // link
49231     if (cap = this.rules.link.exec(src)) {
49232       src = src.substring(cap[0].length);
49233       this.inLink = true;
49234       out += this.outputLink(cap, {
49235         href: cap[2],
49236         title: cap[3]
49237       });
49238       this.inLink = false;
49239       continue;
49240     }
49241
49242     // reflink, nolink
49243     if ((cap = this.rules.reflink.exec(src))
49244         || (cap = this.rules.nolink.exec(src))) {
49245       src = src.substring(cap[0].length);
49246       link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
49247       link = this.links[link.toLowerCase()];
49248       if (!link || !link.href) {
49249         out += cap[0].charAt(0);
49250         src = cap[0].substring(1) + src;
49251         continue;
49252       }
49253       this.inLink = true;
49254       out += this.outputLink(cap, link);
49255       this.inLink = false;
49256       continue;
49257     }
49258
49259     // strong
49260     if (cap = this.rules.strong.exec(src)) {
49261       src = src.substring(cap[0].length);
49262       out += this.renderer.strong(this.output(cap[2] || cap[1]));
49263       continue;
49264     }
49265
49266     // em
49267     if (cap = this.rules.em.exec(src)) {
49268       src = src.substring(cap[0].length);
49269       out += this.renderer.em(this.output(cap[2] || cap[1]));
49270       continue;
49271     }
49272
49273     // code
49274     if (cap = this.rules.code.exec(src)) {
49275       src = src.substring(cap[0].length);
49276       out += this.renderer.codespan(escape(cap[2], true));
49277       continue;
49278     }
49279
49280     // br
49281     if (cap = this.rules.br.exec(src)) {
49282       src = src.substring(cap[0].length);
49283       out += this.renderer.br();
49284       continue;
49285     }
49286
49287     // del (gfm)
49288     if (cap = this.rules.del.exec(src)) {
49289       src = src.substring(cap[0].length);
49290       out += this.renderer.del(this.output(cap[1]));
49291       continue;
49292     }
49293
49294     // text
49295     if (cap = this.rules.text.exec(src)) {
49296       src = src.substring(cap[0].length);
49297       out += this.renderer.text(escape(this.smartypants(cap[0])));
49298       continue;
49299     }
49300
49301     if (src) {
49302       throw new
49303         Error('Infinite loop on byte: ' + src.charCodeAt(0));
49304     }
49305   }
49306
49307   return out;
49308 };
49309
49310 /**
49311  * Compile Link
49312  */
49313
49314 InlineLexer.prototype.outputLink = function(cap, link) {
49315   var href = escape(link.href)
49316     , title = link.title ? escape(link.title) : null;
49317
49318   return cap[0].charAt(0) !== '!'
49319     ? this.renderer.link(href, title, this.output(cap[1]))
49320     : this.renderer.image(href, title, escape(cap[1]));
49321 };
49322
49323 /**
49324  * Smartypants Transformations
49325  */
49326
49327 InlineLexer.prototype.smartypants = function(text) {
49328   if (!this.options.smartypants) return text;
49329   return text
49330     // em-dashes
49331     .replace(/---/g, '\u2014')
49332     // en-dashes
49333     .replace(/--/g, '\u2013')
49334     // opening singles
49335     .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
49336     // closing singles & apostrophes
49337     .replace(/'/g, '\u2019')
49338     // opening doubles
49339     .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
49340     // closing doubles
49341     .replace(/"/g, '\u201d')
49342     // ellipses
49343     .replace(/\.{3}/g, '\u2026');
49344 };
49345
49346 /**
49347  * Mangle Links
49348  */
49349
49350 InlineLexer.prototype.mangle = function(text) {
49351   if (!this.options.mangle) return text;
49352   var out = ''
49353     , l = text.length
49354     , i = 0
49355     , ch;
49356
49357   for (; i < l; i++) {
49358     ch = text.charCodeAt(i);
49359     if (Math.random() > 0.5) {
49360       ch = 'x' + ch.toString(16);
49361     }
49362     out += '&#' + ch + ';';
49363   }
49364
49365   return out;
49366 };
49367
49368 /**
49369  * Renderer
49370  */
49371
49372 function Renderer(options) {
49373   this.options = options || {};
49374 }
49375
49376 Renderer.prototype.code = function(code, lang, escaped) {
49377   if (this.options.highlight) {
49378     var out = this.options.highlight(code, lang);
49379     if (out != null && out !== code) {
49380       escaped = true;
49381       code = out;
49382     }
49383   }
49384
49385   if (!lang) {
49386     return '<pre><code>'
49387       + (escaped ? code : escape(code, true))
49388       + '\n</code></pre>';
49389   }
49390
49391   return '<pre><code class="'
49392     + this.options.langPrefix
49393     + escape(lang, true)
49394     + '">'
49395     + (escaped ? code : escape(code, true))
49396     + '\n</code></pre>\n';
49397 };
49398
49399 Renderer.prototype.blockquote = function(quote) {
49400   return '<blockquote>\n' + quote + '</blockquote>\n';
49401 };
49402
49403 Renderer.prototype.html = function(html) {
49404   return html;
49405 };
49406
49407 Renderer.prototype.heading = function(text, level, raw) {
49408   return '<h'
49409     + level
49410     + ' id="'
49411     + this.options.headerPrefix
49412     + raw.toLowerCase().replace(/[^\w]+/g, '-')
49413     + '">'
49414     + text
49415     + '</h'
49416     + level
49417     + '>\n';
49418 };
49419
49420 Renderer.prototype.hr = function() {
49421   return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
49422 };
49423
49424 Renderer.prototype.list = function(body, ordered) {
49425   var type = ordered ? 'ol' : 'ul';
49426   return '<' + type + '>\n' + body + '</' + type + '>\n';
49427 };
49428
49429 Renderer.prototype.listitem = function(text) {
49430   return '<li>' + text + '</li>\n';
49431 };
49432
49433 Renderer.prototype.paragraph = function(text) {
49434   return '<p>' + text + '</p>\n';
49435 };
49436
49437 Renderer.prototype.table = function(header, body) {
49438   return '<table>\n'
49439     + '<thead>\n'
49440     + header
49441     + '</thead>\n'
49442     + '<tbody>\n'
49443     + body
49444     + '</tbody>\n'
49445     + '</table>\n';
49446 };
49447
49448 Renderer.prototype.tablerow = function(content) {
49449   return '<tr>\n' + content + '</tr>\n';
49450 };
49451
49452 Renderer.prototype.tablecell = function(content, flags) {
49453   var type = flags.header ? 'th' : 'td';
49454   var tag = flags.align
49455     ? '<' + type + ' style="text-align:' + flags.align + '">'
49456     : '<' + type + '>';
49457   return tag + content + '</' + type + '>\n';
49458 };
49459
49460 // span level renderer
49461 Renderer.prototype.strong = function(text) {
49462   return '<strong>' + text + '</strong>';
49463 };
49464
49465 Renderer.prototype.em = function(text) {
49466   return '<em>' + text + '</em>';
49467 };
49468
49469 Renderer.prototype.codespan = function(text) {
49470   return '<code>' + text + '</code>';
49471 };
49472
49473 Renderer.prototype.br = function() {
49474   return this.options.xhtml ? '<br/>' : '<br>';
49475 };
49476
49477 Renderer.prototype.del = function(text) {
49478   return '<del>' + text + '</del>';
49479 };
49480
49481 Renderer.prototype.link = function(href, title, text) {
49482   if (this.options.sanitize) {
49483     try {
49484       var prot = decodeURIComponent(unescape(href))
49485         .replace(/[^\w:]/g, '')
49486         .toLowerCase();
49487     } catch (e) {
49488       return '';
49489     }
49490     if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
49491       return '';
49492     }
49493   }
49494   var out = '<a href="' + href + '"';
49495   if (title) {
49496     out += ' title="' + title + '"';
49497   }
49498   out += '>' + text + '</a>';
49499   return out;
49500 };
49501
49502 Renderer.prototype.image = function(href, title, text) {
49503   var out = '<img src="' + href + '" alt="' + text + '"';
49504   if (title) {
49505     out += ' title="' + title + '"';
49506   }
49507   out += this.options.xhtml ? '/>' : '>';
49508   return out;
49509 };
49510
49511 Renderer.prototype.text = function(text) {
49512   return text;
49513 };
49514
49515 /**
49516  * Parsing & Compiling
49517  */
49518
49519 function Parser(options) {
49520   this.tokens = [];
49521   this.token = null;
49522   this.options = options || marked.defaults;
49523   this.options.renderer = this.options.renderer || new Renderer;
49524   this.renderer = this.options.renderer;
49525   this.renderer.options = this.options;
49526 }
49527
49528 /**
49529  * Static Parse Method
49530  */
49531
49532 Parser.parse = function(src, options, renderer) {
49533   var parser = new Parser(options, renderer);
49534   return parser.parse(src);
49535 };
49536
49537 /**
49538  * Parse Loop
49539  */
49540
49541 Parser.prototype.parse = function(src) {
49542   this.inline = new InlineLexer(src.links, this.options, this.renderer);
49543   this.tokens = src.reverse();
49544
49545   var out = '';
49546   while (this.next()) {
49547     out += this.tok();
49548   }
49549
49550   return out;
49551 };
49552
49553 /**
49554  * Next Token
49555  */
49556
49557 Parser.prototype.next = function() {
49558   return this.token = this.tokens.pop();
49559 };
49560
49561 /**
49562  * Preview Next Token
49563  */
49564
49565 Parser.prototype.peek = function() {
49566   return this.tokens[this.tokens.length - 1] || 0;
49567 };
49568
49569 /**
49570  * Parse Text Tokens
49571  */
49572
49573 Parser.prototype.parseText = function() {
49574   var body = this.token.text;
49575
49576   while (this.peek().type === 'text') {
49577     body += '\n' + this.next().text;
49578   }
49579
49580   return this.inline.output(body);
49581 };
49582
49583 /**
49584  * Parse Current Token
49585  */
49586
49587 Parser.prototype.tok = function() {
49588   switch (this.token.type) {
49589     case 'space': {
49590       return '';
49591     }
49592     case 'hr': {
49593       return this.renderer.hr();
49594     }
49595     case 'heading': {
49596       return this.renderer.heading(
49597         this.inline.output(this.token.text),
49598         this.token.depth,
49599         this.token.text);
49600     }
49601     case 'code': {
49602       return this.renderer.code(this.token.text,
49603         this.token.lang,
49604         this.token.escaped);
49605     }
49606     case 'table': {
49607       var header = ''
49608         , body = ''
49609         , i
49610         , row
49611         , cell
49612         , flags
49613         , j;
49614
49615       // header
49616       cell = '';
49617       for (i = 0; i < this.token.header.length; i++) {
49618         flags = { header: true, align: this.token.align[i] };
49619         cell += this.renderer.tablecell(
49620           this.inline.output(this.token.header[i]),
49621           { header: true, align: this.token.align[i] }
49622         );
49623       }
49624       header += this.renderer.tablerow(cell);
49625
49626       for (i = 0; i < this.token.cells.length; i++) {
49627         row = this.token.cells[i];
49628
49629         cell = '';
49630         for (j = 0; j < row.length; j++) {
49631           cell += this.renderer.tablecell(
49632             this.inline.output(row[j]),
49633             { header: false, align: this.token.align[j] }
49634           );
49635         }
49636
49637         body += this.renderer.tablerow(cell);
49638       }
49639       return this.renderer.table(header, body);
49640     }
49641     case 'blockquote_start': {
49642       var body = '';
49643
49644       while (this.next().type !== 'blockquote_end') {
49645         body += this.tok();
49646       }
49647
49648       return this.renderer.blockquote(body);
49649     }
49650     case 'list_start': {
49651       var body = ''
49652         , ordered = this.token.ordered;
49653
49654       while (this.next().type !== 'list_end') {
49655         body += this.tok();
49656       }
49657
49658       return this.renderer.list(body, ordered);
49659     }
49660     case 'list_item_start': {
49661       var body = '';
49662
49663       while (this.next().type !== 'list_item_end') {
49664         body += this.token.type === 'text'
49665           ? this.parseText()
49666           : this.tok();
49667       }
49668
49669       return this.renderer.listitem(body);
49670     }
49671     case 'loose_item_start': {
49672       var body = '';
49673
49674       while (this.next().type !== 'list_item_end') {
49675         body += this.tok();
49676       }
49677
49678       return this.renderer.listitem(body);
49679     }
49680     case 'html': {
49681       var html = !this.token.pre && !this.options.pedantic
49682         ? this.inline.output(this.token.text)
49683         : this.token.text;
49684       return this.renderer.html(html);
49685     }
49686     case 'paragraph': {
49687       return this.renderer.paragraph(this.inline.output(this.token.text));
49688     }
49689     case 'text': {
49690       return this.renderer.paragraph(this.parseText());
49691     }
49692   }
49693 };
49694
49695 /**
49696  * Helpers
49697  */
49698
49699 function escape(html, encode) {
49700   return html
49701     .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
49702     .replace(/</g, '&lt;')
49703     .replace(/>/g, '&gt;')
49704     .replace(/"/g, '&quot;')
49705     .replace(/'/g, '&#39;');
49706 }
49707
49708 function unescape(html) {
49709         // explicitly match decimal, hex, and named HTML entities 
49710   return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) {
49711     n = n.toLowerCase();
49712     if (n === 'colon') return ':';
49713     if (n.charAt(0) === '#') {
49714       return n.charAt(1) === 'x'
49715         ? String.fromCharCode(parseInt(n.substring(2), 16))
49716         : String.fromCharCode(+n.substring(1));
49717     }
49718     return '';
49719   });
49720 }
49721
49722 function replace(regex, opt) {
49723   regex = regex.source;
49724   opt = opt || '';
49725   return function self(name, val) {
49726     if (!name) return new RegExp(regex, opt);
49727     val = val.source || val;
49728     val = val.replace(/(^|[^\[])\^/g, '$1');
49729     regex = regex.replace(name, val);
49730     return self;
49731   };
49732 }
49733
49734 function noop() {}
49735 noop.exec = noop;
49736
49737 function merge(obj) {
49738   var i = 1
49739     , target
49740     , key;
49741
49742   for (; i < arguments.length; i++) {
49743     target = arguments[i];
49744     for (key in target) {
49745       if (Object.prototype.hasOwnProperty.call(target, key)) {
49746         obj[key] = target[key];
49747       }
49748     }
49749   }
49750
49751   return obj;
49752 }
49753
49754
49755 /**
49756  * Marked
49757  */
49758
49759 function marked(src, opt, callback) {
49760   if (callback || typeof opt === 'function') {
49761     if (!callback) {
49762       callback = opt;
49763       opt = null;
49764     }
49765
49766     opt = merge({}, marked.defaults, opt || {});
49767
49768     var highlight = opt.highlight
49769       , tokens
49770       , pending
49771       , i = 0;
49772
49773     try {
49774       tokens = Lexer.lex(src, opt);
49775     } catch (e) {
49776       return callback(e);
49777     }
49778
49779     pending = tokens.length;
49780
49781     var done = function(err) {
49782       if (err) {
49783         opt.highlight = highlight;
49784         return callback(err);
49785       }
49786
49787       var out;
49788
49789       try {
49790         out = Parser.parse(tokens, opt);
49791       } catch (e) {
49792         err = e;
49793       }
49794
49795       opt.highlight = highlight;
49796
49797       return err
49798         ? callback(err)
49799         : callback(null, out);
49800     };
49801
49802     if (!highlight || highlight.length < 3) {
49803       return done();
49804     }
49805
49806     delete opt.highlight;
49807
49808     if (!pending) return done();
49809
49810     for (; i < tokens.length; i++) {
49811       (function(token) {
49812         if (token.type !== 'code') {
49813           return --pending || done();
49814         }
49815         return highlight(token.text, token.lang, function(err, code) {
49816           if (err) return done(err);
49817           if (code == null || code === token.text) {
49818             return --pending || done();
49819           }
49820           token.text = code;
49821           token.escaped = true;
49822           --pending || done();
49823         });
49824       })(tokens[i]);
49825     }
49826
49827     return;
49828   }
49829   try {
49830     if (opt) opt = merge({}, marked.defaults, opt);
49831     return Parser.parse(Lexer.lex(src, opt), opt);
49832   } catch (e) {
49833     e.message += '\nPlease report this to https://github.com/chjj/marked.';
49834     if ((opt || marked.defaults).silent) {
49835       return '<p>An error occured:</p><pre>'
49836         + escape(e.message + '', true)
49837         + '</pre>';
49838     }
49839     throw e;
49840   }
49841 }
49842
49843 /**
49844  * Options
49845  */
49846
49847 marked.options =
49848 marked.setOptions = function(opt) {
49849   merge(marked.defaults, opt);
49850   return marked;
49851 };
49852
49853 marked.defaults = {
49854   gfm: true,
49855   tables: true,
49856   breaks: false,
49857   pedantic: false,
49858   sanitize: false,
49859   sanitizer: null,
49860   mangle: true,
49861   smartLists: false,
49862   silent: false,
49863   highlight: null,
49864   langPrefix: 'lang-',
49865   smartypants: false,
49866   headerPrefix: '',
49867   renderer: new Renderer,
49868   xhtml: false
49869 };
49870
49871 /**
49872  * Expose
49873  */
49874
49875 marked.Parser = Parser;
49876 marked.parser = Parser.parse;
49877
49878 marked.Renderer = Renderer;
49879
49880 marked.Lexer = Lexer;
49881 marked.lexer = Lexer.lex;
49882
49883 marked.InlineLexer = InlineLexer;
49884 marked.inlineLexer = InlineLexer.output;
49885
49886 marked.parse = marked;
49887
49888 {
49889   module.exports = marked;
49890 }
49891
49892 }).call(function() {
49893   return this || (typeof window !== 'undefined' ? window : commonjsGlobal);
49894 }());
49895 });
49896
49897 function pointBox(loc, context) {
49898     var rect = context.surfaceRect();
49899     var point = context.curtainProjection(loc);
49900     return {
49901         left: point[0] + rect.left - 40,
49902         top: point[1] + rect.top - 60,
49903         width: 80,
49904         height: 90
49905     };
49906 }
49907
49908
49909 function pad$1(locOrBox, padding, context) {
49910     var box;
49911     if (locOrBox instanceof Array) {
49912         var rect = context.surfaceRect();
49913         var point = context.curtainProjection(locOrBox);
49914         box = {
49915             left: point[0] + rect.left,
49916             top: point[1] + rect.top
49917         };
49918     } else {
49919         box = locOrBox;
49920     }
49921
49922     return {
49923         left: box.left - padding,
49924         top: box.top - padding,
49925         width: (box.width || 0) + 2 * padding,
49926         height: (box.width || 0) + 2 * padding
49927     };
49928 }
49929
49930
49931 function icon(name, svgklass) {
49932     return '<svg class="icon ' + (svgklass || '') + '">' +
49933          '<use xlink:href="' + name + '"></use></svg>';
49934 }
49935
49936
49937 function slugify(text) {
49938     return text.toString().toLowerCase()
49939         .replace(/\s+/g, '-')           // Replace spaces with -
49940         .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
49941         .replace(/\-\-+/g, '-')         // Replace multiple - with single -
49942         .replace(/^-+/, '')             // Trim - from start of text
49943         .replace(/-+$/, '');            // Trim - from end of text
49944 }
49945
49946
49947 // console warning for missing walkthrough names
49948 var missingStrings = {};
49949 function checkKey(key, text) {
49950     if (t(key, { default: undefined}) === undefined) {
49951         if (missingStrings.hasOwnProperty(key)) return;  // warn once
49952         missingStrings[key] = text;
49953         var missing = key + ': ' + text;
49954         if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
49955     }
49956 }
49957
49958
49959 function localize(obj) {
49960     var key;
49961
49962     // Assign name if entity has one..
49963     var name = obj.tags && obj.tags.name;
49964     if (name) {
49965         key = 'intro.graph.name.' + slugify(name);
49966         obj.tags.name = t(key, { default: name });
49967         checkKey(key, name);
49968     }
49969
49970     // Assign street name if entity has one..
49971     var street = obj.tags && obj.tags['addr:street'];
49972     if (street) {
49973         key = 'intro.graph.name.' + slugify(street);
49974         obj.tags['addr:street'] = t(key, { default: street });
49975         checkKey(key, street);
49976
49977         // Add address details common across walkthrough..
49978         var addrTags = [
49979             'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
49980             'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
49981         ];
49982         addrTags.forEach(function(k) {
49983             var key = 'intro.graph.' + k,
49984                 tag = 'addr:' + k,
49985                 val = obj.tags && obj.tags[tag],
49986                 str = t(key, { default: val });
49987
49988             if (str) {
49989                 if (str.match(/^<.*>$/) !== null) {
49990                     delete obj.tags[tag];
49991                 } else {
49992                     obj.tags[tag] = str;
49993                 }
49994             }
49995         });
49996     }
49997
49998     return obj;
49999 }
50000
50001
50002 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
50003 function isMostlySquare(points) {
50004     // note: uses 15 here instead of the 12 from actionOrthogonalize because
50005     // actionOrthogonalize can actually straighten some larger angles as it iterates
50006     var threshold = 15, // degrees within right or straight
50007         lowerBound = Math.cos((90 - threshold) * Math.PI / 180),  // near right
50008         upperBound = Math.cos(threshold * Math.PI / 180),         // near straight
50009         mag;
50010
50011     for (var i = 0; i < points.length; i++) {
50012         mag = Math.abs(normalizedDotProduct(i, points));
50013         if (mag > lowerBound && mag < upperBound) {
50014             return false;
50015         }
50016     }
50017
50018     return true;
50019
50020
50021     function normalizedDotProduct(i, points) {
50022         var a = points[(i - 1 + points.length) % points.length],
50023             b = points[i],
50024             c = points[(i + 1) % points.length],
50025             p = subtractPoints(a, b),
50026             q = subtractPoints(c, b);
50027
50028         p = normalizePoint(p);
50029         q = normalizePoint(q);
50030
50031         return p[0] * q[0] + p[1] * q[1];
50032
50033
50034         function subtractPoints(a, b) {
50035             return [a[0] - b[0], a[1] - b[1]];
50036         }
50037
50038         function normalizePoint(point) {
50039             var vector = [0, 0];
50040             var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
50041             if (length !== 0) {
50042                 vector[0] = point[0] / length;
50043                 vector[1] = point[1] / length;
50044             }
50045             return vector;
50046         }
50047     }
50048 }
50049
50050
50051 function selectMenuItem(operation) {
50052     var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
50053         ', .radial-menu .radial-menu-item-' + operation;
50054     return d3_select(selector$$1);
50055 }
50056
50057
50058 function transitionTime(point1, point2) {
50059     var distance = geoSphericalDistance(point1, point2);
50060     if (distance === 0)
50061         return 0;
50062     else if (distance < 80)
50063         return 500;
50064     else
50065         return 1000;
50066 }
50067
50068 var dataIntroGraph = {"n1":{"id":"n1","loc":[-85.631039,41.948829]},"n10":{"id":"n10","loc":[-85.634733,41.941588]},"n100":{"id":"n100","loc":[-85.637395,41.942252]},"n1000":{"id":"n1000","loc":[-85.632699,41.944763]},"n1001":{"id":"n1001","loc":[-85.632685,41.944763]},"n1002":{"id":"n1002","loc":[-85.632673,41.944755]},"n1003":{"id":"n1003","loc":[-85.632595,41.944682]},"n1004":{"id":"n1004","loc":[-85.632576,41.944673]},"n1005":{"id":"n1005","loc":[-85.632551,41.944667]},"n1006":{"id":"n1006","loc":[-85.63253,41.944667]},"n1007":{"id":"n1007","loc":[-85.632502,41.944669]},"n1008":{"id":"n1008","loc":[-85.632483,41.944677]},"n1009":{"id":"n1009","loc":[-85.632383,41.944731]},"n101":{"id":"n101","loc":[-85.637357,41.942252]},"n1010":{"id":"n1010","loc":[-85.63349,41.944976],"tags":{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Sherwin-Williams","shop":"paint"}},"n1011":{"id":"n1011","loc":[-85.633548,41.945034],"tags":{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Unique Jewelry","shop":"jewelry"}},"n1012":{"id":"n1012","loc":[-85.633683,41.945129],"tags":{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"World Fare","shop":"gift"}},"n1013":{"id":"n1013","loc":[-85.634563,41.945469],"tags":{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Golden Finch Framing","shop":"frame"}},"n1014":{"id":"n1014","loc":[-85.634469,41.945379],"tags":{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Dollar Tree","shop":"second_hand"}},"n1015":{"id":"n1015","loc":[-85.634227,41.945159],"tags":{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"theatre","name":"Riviera Theatre"}},"n1016":{"id":"n1016","loc":[-85.634057,41.945012],"tags":{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"River City Appliance","shop":"appliance"}},"n1017":{"id":"n1017","loc":[-85.633879,41.945325],"tags":{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paparazzi Tattoo","shop":"tattoo"}},"n1018":{"id":"n1018","loc":[-85.634914,41.945839],"tags":{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"bank","name":"Southern Michigan Bank"}},"n1019":{"id":"n1019","loc":[-85.634514,41.946176]},"n102":{"id":"n102","loc":[-85.637357,41.942216]},"n1020":{"id":"n1020","loc":[-85.634087,41.946178]},"n1021":{"id":"n1021","loc":[-85.634357,41.945805]},"n1022":{"id":"n1022","loc":[-85.634389,41.945788]},"n1023":{"id":"n1023","loc":[-85.634491,41.94581]},"n1024":{"id":"n1024","loc":[-85.634513,41.945853]},"n1025":{"id":"n1025","loc":[-85.634506,41.94583]},"n1026":{"id":"n1026","loc":[-85.634762,41.946056],"tags":{"crossing":"zebra","highway":"crossing"}},"n1027":{"id":"n1027","loc":[-85.634767,41.946172]},"n1028":{"id":"n1028","loc":[-85.634622,41.946175],"tags":{"crossing":"zebra","highway":"crossing"}},"n1029":{"id":"n1029","loc":[-85.640655,41.942057]},"n103":{"id":"n103","loc":[-85.637386,41.942054]},"n1030":{"id":"n1030","loc":[-85.640947,41.942057]},"n1031":{"id":"n1031","loc":[-85.640957,41.942593]},"n1032":{"id":"n1032","loc":[-85.630953,41.960873]},"n1033":{"id":"n1033","loc":[-85.632174,41.960679]},"n1034":{"id":"n1034","loc":[-85.638785,41.943066]},"n1035":{"id":"n1035","loc":[-85.638853,41.943065]},"n1036":{"id":"n1036","loc":[-85.638855,41.943183]},"n1037":{"id":"n1037","loc":[-85.638552,41.943189]},"n1038":{"id":"n1038","loc":[-85.63855,41.943149]},"n1039":{"id":"n1039","loc":[-85.638638,41.943068]},"n104":{"id":"n104","loc":[-85.637387,41.942125]},"n1040":{"id":"n1040","loc":[-85.638638,41.943078]},"n1041":{"id":"n1041","loc":[-85.638813,41.943163]},"n1042":{"id":"n1042","loc":[-85.638684,41.943165]},"n1043":{"id":"n1043","loc":[-85.638682,41.943105]},"n1044":{"id":"n1044","loc":[-85.638706,41.943105]},"n1045":{"id":"n1045","loc":[-85.638707,41.943117]},"n1046":{"id":"n1046","loc":[-85.638812,41.943115]},"n1047":{"id":"n1047","loc":[-85.638769,41.943407]},"n1048":{"id":"n1048","loc":[-85.638549,41.943407]},"n1049":{"id":"n1049","loc":[-85.638567,41.943555]},"n105":{"id":"n105","loc":[-85.637319,41.942125]},"n1050":{"id":"n1050","loc":[-85.638426,41.943554]},"n1051":{"id":"n1051","loc":[-85.638427,41.94346]},"n1052":{"id":"n1052","loc":[-85.638568,41.943461]},"n1053":{"id":"n1053","loc":[-85.639264,41.943415]},"n1054":{"id":"n1054","loc":[-85.639082,41.943417]},"n1055":{"id":"n1055","loc":[-85.63908,41.943331]},"n1056":{"id":"n1056","loc":[-85.639136,41.94333]},"n1057":{"id":"n1057","loc":[-85.639158,41.943312]},"n1058":{"id":"n1058","loc":[-85.639188,41.943313]},"n1059":{"id":"n1059","loc":[-85.639211,41.943331]},"n106":{"id":"n106","loc":[-85.637319,41.942137]},"n1060":{"id":"n1060","loc":[-85.639262,41.943331]},"n1061":{"id":"n1061","loc":[-85.638986,41.943515]},"n1062":{"id":"n1062","loc":[-85.63888,41.943521]},"n1063":{"id":"n1063","loc":[-85.638871,41.943436]},"n1064":{"id":"n1064","loc":[-85.638958,41.943431]},"n1065":{"id":"n1065","loc":[-85.638979,41.943443]},"n1066":{"id":"n1066","loc":[-85.63926,41.943703]},"n1067":{"id":"n1067","loc":[-85.639152,41.943704]},"n1068":{"id":"n1068","loc":[-85.639152,41.943691]},"n1069":{"id":"n1069","loc":[-85.639063,41.943691]},"n107":{"id":"n107","loc":[-85.637259,41.942137]},"n1070":{"id":"n1070","loc":[-85.639062,41.943613]},"n1071":{"id":"n1071","loc":[-85.639259,41.943611]},"n1072":{"id":"n1072","loc":[-85.639117,41.943726]},"n1073":{"id":"n1073","loc":[-85.639118,41.943767]},"n1074":{"id":"n1074","loc":[-85.639051,41.943768]},"n1075":{"id":"n1075","loc":[-85.63905,41.943727]},"n1076":{"id":"n1076","loc":[-85.638627,41.943716]},"n1077":{"id":"n1077","loc":[-85.63863,41.943634]},"n1078":{"id":"n1078","loc":[-85.63844,41.943631]},"n1079":{"id":"n1079","loc":[-85.638437,41.943729]},"n108":{"id":"n108","loc":[-85.637259,41.942126]},"n1080":{"id":"n1080","loc":[-85.638533,41.94373]},"n1081":{"id":"n1081","loc":[-85.638534,41.943715]},"n1082":{"id":"n1082","loc":[-85.638678,41.943941]},"n1083":{"id":"n1083","loc":[-85.638522,41.943944]},"n1084":{"id":"n1084","loc":[-85.63852,41.943864]},"n1085":{"id":"n1085","loc":[-85.638676,41.943861]},"n1086":{"id":"n1086","loc":[-85.638663,41.944059]},"n1087":{"id":"n1087","loc":[-85.638513,41.944061]},"n1088":{"id":"n1088","loc":[-85.638511,41.943991]},"n1089":{"id":"n1089","loc":[-85.638661,41.943989]},"n109":{"id":"n109","loc":[-85.637193,41.942126]},"n1090":{"id":"n1090","loc":[-85.63865,41.944134]},"n1091":{"id":"n1091","loc":[-85.638429,41.944144]},"n1092":{"id":"n1092","loc":[-85.638426,41.944106]},"n1093":{"id":"n1093","loc":[-85.638476,41.944104]},"n1094":{"id":"n1094","loc":[-85.638475,41.94409]},"n1095":{"id":"n1095","loc":[-85.638594,41.944084]},"n1096":{"id":"n1096","loc":[-85.638595,41.944101]},"n1097":{"id":"n1097","loc":[-85.638647,41.944099]},"n1098":{"id":"n1098","loc":[-85.63829,41.944154]},"n1099":{"id":"n1099","loc":[-85.638558,41.944155]},"n11":{"id":"n11","loc":[-85.634602,41.941523]},"n110":{"id":"n110","loc":[-85.637192,41.942053]},"n1100":{"id":"n1100","loc":[-85.638558,41.944338]},"n1101":{"id":"n1101","loc":[-85.638851,41.944408]},"n1102":{"id":"n1102","loc":[-85.637771,41.943989]},"n1103":{"id":"n1103","loc":[-85.639345,41.943964]},"n1104":{"id":"n1104","loc":[-85.638515,41.94397]},"n1105":{"id":"n1105","loc":[-85.639256,41.943928]},"n1106":{"id":"n1106","loc":[-85.639157,41.943929]},"n1107":{"id":"n1107","loc":[-85.639156,41.9439]},"n1108":{"id":"n1108","loc":[-85.639118,41.9439]},"n1109":{"id":"n1109","loc":[-85.639116,41.94382]},"n111":{"id":"n111","loc":[-85.637248,41.942053]},"n1110":{"id":"n1110","loc":[-85.639202,41.943819]},"n1111":{"id":"n1111","loc":[-85.639202,41.943837]},"n1112":{"id":"n1112","loc":[-85.639293,41.943836]},"n1113":{"id":"n1113","loc":[-85.639295,41.943898]},"n1114":{"id":"n1114","loc":[-85.639255,41.943898]},"n1115":{"id":"n1115","loc":[-85.639296,41.944083]},"n1116":{"id":"n1116","loc":[-85.639144,41.944084]},"n1117":{"id":"n1117","loc":[-85.639143,41.944026]},"n1118":{"id":"n1118","loc":[-85.639162,41.944026]},"n1119":{"id":"n1119","loc":[-85.639162,41.944]},"n112":{"id":"n112","loc":[-85.637248,41.942042]},"n1120":{"id":"n1120","loc":[-85.639295,41.943999]},"n1121":{"id":"n1121","loc":[-85.639131,41.944139]},"n1122":{"id":"n1122","loc":[-85.63901,41.94414]},"n1123":{"id":"n1123","loc":[-85.63901,41.944076]},"n1124":{"id":"n1124","loc":[-85.63913,41.944075]},"n1125":{"id":"n1125","loc":[-85.639092,41.944155]},"n1126":{"id":"n1126","loc":[-85.639093,41.944308]},"n1127":{"id":"n1127","loc":[-85.639225,41.944308]},"n1128":{"id":"n1128","loc":[-85.639225,41.94429]},"n1129":{"id":"n1129","loc":[-85.639253,41.944289]},"n113":{"id":"n113","loc":[-85.637338,41.942041]},"n1130":{"id":"n1130","loc":[-85.639253,41.944269]},"n1131":{"id":"n1131","loc":[-85.639243,41.944269]},"n1132":{"id":"n1132","loc":[-85.639243,41.944229]},"n1133":{"id":"n1133","loc":[-85.639224,41.944229]},"n1134":{"id":"n1134","loc":[-85.639224,41.944196]},"n1135":{"id":"n1135","loc":[-85.639195,41.944196]},"n1136":{"id":"n1136","loc":[-85.639195,41.944155]},"n1137":{"id":"n1137","loc":[-85.639072,41.944154]},"n1138":{"id":"n1138","loc":[-85.638865,41.944154]},"n1139":{"id":"n1139","loc":[-85.638863,41.943967]},"n114":{"id":"n114","loc":[-85.637338,41.942055]},"n1140":{"id":"n1140","loc":[-85.6386,41.942698]},"n1141":{"id":"n1141","loc":[-85.639348,41.942698]},"n1142":{"id":"n1142","loc":[-85.639377,41.944984]},"n1143":{"id":"n1143","loc":[-85.63937,41.945013]},"n1144":{"id":"n1144","loc":[-85.639357,41.945033]},"n1145":{"id":"n1145","loc":[-85.639353,41.945053]},"n1146":{"id":"n1146","loc":[-85.639352,41.945084]},"n1147":{"id":"n1147","loc":[-85.638278,41.945516]},"n1148":{"id":"n1148","loc":[-85.637505,41.945801]},"n1149":{"id":"n1149","loc":[-85.637327,41.945857]},"n115":{"id":"n115","loc":[-85.637583,41.941943]},"n1150":{"id":"n1150","loc":[-85.637168,41.945899]},"n1151":{"id":"n1151","loc":[-85.637017,41.94593]},"n1152":{"id":"n1152","loc":[-85.637185,41.945938]},"n1153":{"id":"n1153","loc":[-85.63682,41.945963]},"n1154":{"id":"n1154","loc":[-85.636639,41.945984]},"n1155":{"id":"n1155","loc":[-85.636439,41.945999]},"n1156":{"id":"n1156","loc":[-85.635801,41.945999]},"n1157":{"id":"n1157","loc":[-85.635769,41.945908]},"n1158":{"id":"n1158","loc":[-85.635953,41.946154]},"n1159":{"id":"n1159","loc":[-85.635472,41.94598]},"n116":{"id":"n116","loc":[-85.637584,41.941983]},"n1160":{"id":"n1160","loc":[-85.635409,41.945981]},"n1161":{"id":"n1161","loc":[-85.635583,41.945987]},"n1162":{"id":"n1162","loc":[-85.636452,41.945805]},"n1163":{"id":"n1163","loc":[-85.636425,41.94582]},"n1164":{"id":"n1164","loc":[-85.636396,41.945817]},"n1165":{"id":"n1165","loc":[-85.636368,41.945797]},"n1166":{"id":"n1166","loc":[-85.636346,41.945767]},"n1167":{"id":"n1167","loc":[-85.636307,41.945745]},"n1168":{"id":"n1168","loc":[-85.636194,41.94565]},"n1169":{"id":"n1169","loc":[-85.636121,41.945579]},"n117":{"id":"n117","loc":[-85.63751,41.941983]},"n1170":{"id":"n1170","loc":[-85.635995,41.945432]},"n1171":{"id":"n1171","loc":[-85.637564,41.943538]},"n1172":{"id":"n1172","loc":[-85.63756,41.943505]},"n1173":{"id":"n1173","loc":[-85.637435,41.943489]},"n1174":{"id":"n1174","loc":[-85.637093,41.943556]},"n1175":{"id":"n1175","loc":[-85.634836,41.941574]},"n1176":{"id":"n1176","loc":[-85.634692,41.9415]},"n1177":{"id":"n1177","loc":[-85.634261,41.941337]},"n1178":{"id":"n1178","loc":[-85.634208,41.940962]},"n1179":{"id":"n1179","loc":[-85.635247,41.940968]},"n118":{"id":"n118","loc":[-85.637509,41.941944]},"n1180":{"id":"n1180","loc":[-85.63514,41.941205]},"n1181":{"id":"n1181","loc":[-85.634858,41.941511]},"n1182":{"id":"n1182","loc":[-85.630725,41.943465]},"n1183":{"id":"n1183","loc":[-85.632591,41.942826]},"n1184":{"id":"n1184","loc":[-85.634487,41.941928]},"n1185":{"id":"n1185","loc":[-85.634499,41.942056]},"n1186":{"id":"n1186","loc":[-85.63433,41.943102]},"n1187":{"id":"n1187","loc":[-85.634158,41.943151]},"n1188":{"id":"n1188","loc":[-85.634107,41.94305]},"n1189":{"id":"n1189","loc":[-85.634279,41.943002]},"n119":{"id":"n119","loc":[-85.637724,41.941973]},"n1190":{"id":"n1190","loc":[-85.634362,41.943762]},"n1191":{"id":"n1191","loc":[-85.634331,41.943731]},"n1192":{"id":"n1192","loc":[-85.634396,41.943695]},"n1193":{"id":"n1193","loc":[-85.634426,41.943726]},"n1194":{"id":"n1194","loc":[-85.621569,41.956021]},"n1195":{"id":"n1195","loc":[-85.621574,41.956164]},"n1196":{"id":"n1196","loc":[-85.621489,41.956165]},"n1197":{"id":"n1197","loc":[-85.621488,41.956136]},"n1198":{"id":"n1198","loc":[-85.621372,41.956139]},"n1199":{"id":"n1199","loc":[-85.621369,41.956049]},"n12":{"id":"n12","loc":[-85.63359,41.941093]},"n120":{"id":"n120","loc":[-85.637633,41.941973]},"n1200":{"id":"n1200","loc":[-85.621493,41.956047]},"n1201":{"id":"n1201","loc":[-85.621492,41.956022]},"n1202":{"id":"n1202","loc":[-85.619744,41.953192]},"n1203":{"id":"n1203","loc":[-85.619059,41.953902]},"n1204":{"id":"n1204","loc":[-85.623984,41.95469]},"n1205":{"id":"n1205","loc":[-85.630159,41.958208]},"n1206":{"id":"n1206","loc":[-85.63002,41.958208]},"n1207":{"id":"n1207","loc":[-85.630021,41.95814]},"n1208":{"id":"n1208","loc":[-85.63,41.95814]},"n1209":{"id":"n1209","loc":[-85.63,41.958043]},"n121":{"id":"n121","loc":[-85.637633,41.941853]},"n1210":{"id":"n1210","loc":[-85.630159,41.958043]},"n1211":{"id":"n1211","loc":[-85.630304,41.957566]},"n1212":{"id":"n1212","loc":[-85.630303,41.957684]},"n1213":{"id":"n1213","loc":[-85.630073,41.957683]},"n1214":{"id":"n1214","loc":[-85.630072,41.957721]},"n1215":{"id":"n1215","loc":[-85.629993,41.95772]},"n1216":{"id":"n1216","loc":[-85.629993,41.95768]},"n1217":{"id":"n1217","loc":[-85.629968,41.95768]},"n1218":{"id":"n1218","loc":[-85.629969,41.957588]},"n1219":{"id":"n1219","loc":[-85.630219,41.95759]},"n122":{"id":"n122","loc":[-85.637724,41.941853]},"n1220":{"id":"n1220","loc":[-85.630219,41.957566]},"n1221":{"id":"n1221","loc":[-85.630717,41.957744]},"n1222":{"id":"n1222","loc":[-85.630596,41.957745]},"n1223":{"id":"n1223","loc":[-85.630598,41.957553]},"n1224":{"id":"n1224","loc":[-85.630717,41.957555]},"n1225":{"id":"n1225","loc":[-85.630609,41.957745]},"n1226":{"id":"n1226","loc":[-85.63061,41.957789]},"n1227":{"id":"n1227","loc":[-85.630327,41.957791]},"n1228":{"id":"n1228","loc":[-85.630324,41.95752]},"n1229":{"id":"n1229","loc":[-85.630325,41.95756]},"n123":{"id":"n123","loc":[-85.637773,41.941988]},"n1230":{"id":"n1230","loc":[-85.63057,41.95756]},"n1231":{"id":"n1231","loc":[-85.63069,41.958016]},"n1232":{"id":"n1232","loc":[-85.630586,41.958017]},"n1233":{"id":"n1233","loc":[-85.630584,41.957956]},"n1234":{"id":"n1234","loc":[-85.630614,41.957956]},"n1235":{"id":"n1235","loc":[-85.630611,41.957835]},"n1236":{"id":"n1236","loc":[-85.630737,41.957833]},"n1237":{"id":"n1237","loc":[-85.630739,41.957921]},"n1238":{"id":"n1238","loc":[-85.630688,41.957922]},"n1239":{"id":"n1239","loc":[-85.630719,41.958291]},"n124":{"id":"n124","loc":[-85.637773,41.942046]},"n1240":{"id":"n1240","loc":[-85.630592,41.958291]},"n1241":{"id":"n1241","loc":[-85.630593,41.958108]},"n1242":{"id":"n1242","loc":[-85.630701,41.958109]},"n1243":{"id":"n1243","loc":[-85.6307,41.958173]},"n1244":{"id":"n1244","loc":[-85.630711,41.958173]},"n1245":{"id":"n1245","loc":[-85.630711,41.958233]},"n1246":{"id":"n1246","loc":[-85.630719,41.958233]},"n1247":{"id":"n1247","loc":[-85.630523,41.958329]},"n1248":{"id":"n1248","loc":[-85.630388,41.958329]},"n1249":{"id":"n1249","loc":[-85.630387,41.958262]},"n125":{"id":"n125","loc":[-85.637693,41.942047]},"n1250":{"id":"n1250","loc":[-85.630523,41.958261]},"n1251":{"id":"n1251","loc":[-85.63072,41.958636]},"n1252":{"id":"n1252","loc":[-85.630721,41.958709]},"n1253":{"id":"n1253","loc":[-85.630503,41.958712]},"n1254":{"id":"n1254","loc":[-85.630498,41.958511]},"n1255":{"id":"n1255","loc":[-85.630635,41.95851]},"n1256":{"id":"n1256","loc":[-85.630638,41.958636]},"n1257":{"id":"n1257","loc":[-85.630437,41.958822]},"n1258":{"id":"n1258","loc":[-85.630437,41.958849]},"n1259":{"id":"n1259","loc":[-85.630393,41.958849]},"n126":{"id":"n126","loc":[-85.637692,41.941988]},"n1260":{"id":"n1260","loc":[-85.630393,41.958822]},"n1261":{"id":"n1261","loc":[-85.630605,41.959102]},"n1262":{"id":"n1262","loc":[-85.63049,41.959104]},"n1263":{"id":"n1263","loc":[-85.630487,41.958996]},"n1264":{"id":"n1264","loc":[-85.630462,41.958996]},"n1265":{"id":"n1265","loc":[-85.63046,41.958922]},"n1266":{"id":"n1266","loc":[-85.630562,41.958921]},"n1267":{"id":"n1267","loc":[-85.630564,41.958992]},"n1268":{"id":"n1268","loc":[-85.630602,41.958992]},"n1269":{"id":"n1269","loc":[-85.630126,41.957096]},"n127":{"id":"n127","loc":[-85.637604,41.941994]},"n1270":{"id":"n1270","loc":[-85.630129,41.957283]},"n1271":{"id":"n1271","loc":[-85.629993,41.957284]},"n1272":{"id":"n1272","loc":[-85.629992,41.957216]},"n1273":{"id":"n1273","loc":[-85.630015,41.957215]},"n1274":{"id":"n1274","loc":[-85.630013,41.957097]},"n1275":{"id":"n1275","loc":[-85.630211,41.956592]},"n1276":{"id":"n1276","loc":[-85.630211,41.956676]},"n1277":{"id":"n1277","loc":[-85.630162,41.956676]},"n1278":{"id":"n1278","loc":[-85.630162,41.95676]},"n1279":{"id":"n1279","loc":[-85.630037,41.956761]},"n128":{"id":"n128","loc":[-85.637604,41.942057]},"n1280":{"id":"n1280","loc":[-85.630037,41.956592]},"n1281":{"id":"n1281","loc":[-85.630309,41.95653]},"n1282":{"id":"n1282","loc":[-85.630326,41.957065]},"n1283":{"id":"n1283","loc":[-85.630118,41.957065]},"n1284":{"id":"n1284","loc":[-85.630119,41.957096]},"n1285":{"id":"n1285","loc":[-85.63067,41.957307]},"n1286":{"id":"n1286","loc":[-85.630536,41.957308]},"n1287":{"id":"n1287","loc":[-85.630533,41.957111]},"n1288":{"id":"n1288","loc":[-85.630667,41.95711]},"n1289":{"id":"n1289","loc":[-85.630676,41.956808]},"n129":{"id":"n129","loc":[-85.63748,41.942057]},"n1290":{"id":"n1290","loc":[-85.630551,41.956808]},"n1291":{"id":"n1291","loc":[-85.630552,41.956982]},"n1292":{"id":"n1292","loc":[-85.63059,41.956982]},"n1293":{"id":"n1293","loc":[-85.63059,41.957001]},"n1294":{"id":"n1294","loc":[-85.630692,41.957001]},"n1295":{"id":"n1295","loc":[-85.630692,41.956936]},"n1296":{"id":"n1296","loc":[-85.630676,41.956936]},"n1297":{"id":"n1297","loc":[-85.630496,41.956889]},"n1298":{"id":"n1298","loc":[-85.630501,41.956947]},"n1299":{"id":"n1299","loc":[-85.630377,41.956953]},"n13":{"id":"n13","loc":[-85.633643,41.941143]},"n130":{"id":"n130","loc":[-85.63748,41.941994]},"n1300":{"id":"n1300","loc":[-85.630359,41.956938]},"n1301":{"id":"n1301","loc":[-85.630359,41.956912]},"n1302":{"id":"n1302","loc":[-85.63038,41.956894]},"n1303":{"id":"n1303","loc":[-85.630679,41.956747]},"n1304":{"id":"n1304","loc":[-85.630572,41.956748]},"n1305":{"id":"n1305","loc":[-85.63057,41.956668]},"n1306":{"id":"n1306","loc":[-85.630501,41.956669]},"n1307":{"id":"n1307","loc":[-85.630499,41.95659]},"n1308":{"id":"n1308","loc":[-85.630565,41.956589]},"n1309":{"id":"n1309","loc":[-85.630564,41.956541]},"n131":{"id":"n131","loc":[-85.637431,41.941832]},"n1310":{"id":"n1310","loc":[-85.630686,41.956539]},"n1311":{"id":"n1311","loc":[-85.630688,41.956631]},"n1312":{"id":"n1312","loc":[-85.630676,41.956631]},"n1313":{"id":"n1313","loc":[-85.630686,41.956487]},"n1314":{"id":"n1314","loc":[-85.63059,41.956487]},"n1315":{"id":"n1315","loc":[-85.63059,41.956396]},"n1316":{"id":"n1316","loc":[-85.630686,41.956396]},"n1317":{"id":"n1317","loc":[-85.630643,41.9563]},"n1318":{"id":"n1318","loc":[-85.630548,41.956301]},"n1319":{"id":"n1319","loc":[-85.630545,41.956217]},"n132":{"id":"n132","loc":[-85.637432,41.94189]},"n1320":{"id":"n1320","loc":[-85.630529,41.956214]},"n1321":{"id":"n1321","loc":[-85.630521,41.956202]},"n1322":{"id":"n1322","loc":[-85.63052,41.95618]},"n1323":{"id":"n1323","loc":[-85.630527,41.956169]},"n1324":{"id":"n1324","loc":[-85.630544,41.956163]},"n1325":{"id":"n1325","loc":[-85.630543,41.956094]},"n1326":{"id":"n1326","loc":[-85.630641,41.956093]},"n1327":{"id":"n1327","loc":[-85.630642,41.956134]},"n1328":{"id":"n1328","loc":[-85.630656,41.956134]},"n1329":{"id":"n1329","loc":[-85.630657,41.956252]},"n133":{"id":"n133","loc":[-85.637412,41.94189]},"n1330":{"id":"n1330","loc":[-85.630643,41.956252]},"n1331":{"id":"n1331","loc":[-85.630409,41.956044]},"n1332":{"id":"n1332","loc":[-85.630409,41.956075]},"n1333":{"id":"n1333","loc":[-85.630195,41.956078]},"n1334":{"id":"n1334","loc":[-85.630195,41.9561]},"n1335":{"id":"n1335","loc":[-85.630088,41.956101]},"n1336":{"id":"n1336","loc":[-85.630087,41.956048]},"n1337":{"id":"n1337","loc":[-85.630345,41.956114]},"n1338":{"id":"n1338","loc":[-85.630328,41.956113]},"n1339":{"id":"n1339","loc":[-85.63034,41.956189]},"n134":{"id":"n134","loc":[-85.637413,41.941938]},"n1340":{"id":"n1340","loc":[-85.630355,41.956185]},"n1341":{"id":"n1341","loc":[-85.630311,41.956117]},"n1342":{"id":"n1342","loc":[-85.630297,41.956125]},"n1343":{"id":"n1343","loc":[-85.630287,41.956136]},"n1344":{"id":"n1344","loc":[-85.630283,41.956149]},"n1345":{"id":"n1345","loc":[-85.630285,41.956162]},"n1346":{"id":"n1346","loc":[-85.630293,41.956174]},"n1347":{"id":"n1347","loc":[-85.630306,41.956183]},"n1348":{"id":"n1348","loc":[-85.630322,41.956188]},"n1349":{"id":"n1349","loc":[-85.630368,41.956179]},"n135":{"id":"n135","loc":[-85.637342,41.941939]},"n1350":{"id":"n1350","loc":[-85.630378,41.95617]},"n1351":{"id":"n1351","loc":[-85.630384,41.956159]},"n1352":{"id":"n1352","loc":[-85.630385,41.956147]},"n1353":{"id":"n1353","loc":[-85.630381,41.956136]},"n1354":{"id":"n1354","loc":[-85.630372,41.956126]},"n1355":{"id":"n1355","loc":[-85.63036,41.956118]},"n1356":{"id":"n1356","loc":[-85.630776,41.956041]},"n1357":{"id":"n1357","loc":[-85.630195,41.956036]},"n1358":{"id":"n1358","loc":[-85.630137,41.956037]},"n1359":{"id":"n1359","loc":[-85.630136,41.956006]},"n136":{"id":"n136","loc":[-85.637342,41.941914]},"n1360":{"id":"n1360","loc":[-85.630194,41.956005]},"n1361":{"id":"n1361","loc":[-85.629864,41.956039]},"n1362":{"id":"n1362","loc":[-85.629864,41.955862]},"n1363":{"id":"n1363","loc":[-85.629541,41.958291]},"n1364":{"id":"n1364","loc":[-85.629419,41.958292]},"n1365":{"id":"n1365","loc":[-85.629417,41.958168]},"n1366":{"id":"n1366","loc":[-85.629445,41.958168]},"n1367":{"id":"n1367","loc":[-85.629444,41.958109]},"n1368":{"id":"n1368","loc":[-85.629537,41.958108]},"n1369":{"id":"n1369","loc":[-85.629351,41.958136]},"n137":{"id":"n137","loc":[-85.637212,41.941916]},"n1370":{"id":"n1370","loc":[-85.629352,41.958202]},"n1371":{"id":"n1371","loc":[-85.629365,41.958202]},"n1372":{"id":"n1372","loc":[-85.629365,41.958223]},"n1373":{"id":"n1373","loc":[-85.629291,41.958224]},"n1374":{"id":"n1374","loc":[-85.62929,41.958137]},"n1375":{"id":"n1375","loc":[-85.629443,41.958073]},"n1376":{"id":"n1376","loc":[-85.629252,41.958075]},"n1377":{"id":"n1377","loc":[-85.629253,41.95827]},"n1378":{"id":"n1378","loc":[-85.629566,41.957585]},"n1379":{"id":"n1379","loc":[-85.629566,41.957692]},"n138":{"id":"n138","loc":[-85.637211,41.941835]},"n1380":{"id":"n1380","loc":[-85.629281,41.957693]},"n1381":{"id":"n1381","loc":[-85.62928,41.957585]},"n1382":{"id":"n1382","loc":[-85.629004,41.957599]},"n1383":{"id":"n1383","loc":[-85.629004,41.957682]},"n1384":{"id":"n1384","loc":[-85.628902,41.957682]},"n1385":{"id":"n1385","loc":[-85.628902,41.957723]},"n1386":{"id":"n1386","loc":[-85.628731,41.957724]},"n1387":{"id":"n1387","loc":[-85.628731,41.9576]},"n1388":{"id":"n1388","loc":[-85.62836,41.957679]},"n1389":{"id":"n1389","loc":[-85.628359,41.957759]},"n139":{"id":"n139","loc":[-85.637293,41.941834]},"n1390":{"id":"n1390","loc":[-85.628062,41.957757]},"n1391":{"id":"n1391","loc":[-85.628063,41.957657]},"n1392":{"id":"n1392","loc":[-85.628198,41.957657]},"n1393":{"id":"n1393","loc":[-85.628198,41.957678]},"n1394":{"id":"n1394","loc":[-85.627775,41.958095]},"n1395":{"id":"n1395","loc":[-85.627608,41.958095]},"n1396":{"id":"n1396","loc":[-85.627606,41.957829]},"n1397":{"id":"n1397","loc":[-85.627774,41.957829]},"n1398":{"id":"n1398","loc":[-85.626816,41.957636]},"n1399":{"id":"n1399","loc":[-85.626787,41.957681]},"n14":{"id":"n14","loc":[-85.633643,41.940122]},"n140":{"id":"n140","loc":[-85.637293,41.941823]},"n1400":{"id":"n1400","loc":[-85.626673,41.95764]},"n1401":{"id":"n1401","loc":[-85.626703,41.957594]},"n1402":{"id":"n1402","loc":[-85.62694,41.95752]},"n1403":{"id":"n1403","loc":[-85.62688,41.957611]},"n1404":{"id":"n1404","loc":[-85.626798,41.957582]},"n1405":{"id":"n1405","loc":[-85.626793,41.95759]},"n1406":{"id":"n1406","loc":[-85.626657,41.95754]},"n1407":{"id":"n1407","loc":[-85.626666,41.957526]},"n1408":{"id":"n1408","loc":[-85.626584,41.957497]},"n1409":{"id":"n1409","loc":[-85.626638,41.957415]},"n141":{"id":"n141","loc":[-85.637363,41.941822]},"n1410":{"id":"n1410","loc":[-85.626731,41.957449]},"n1411":{"id":"n1411","loc":[-85.626725,41.957457]},"n1412":{"id":"n1412","loc":[-85.626843,41.9575]},"n1413":{"id":"n1413","loc":[-85.626851,41.957487]},"n1414":{"id":"n1414","loc":[-85.626579,41.957521]},"n1415":{"id":"n1415","loc":[-85.626537,41.957587]},"n1416":{"id":"n1416","loc":[-85.626427,41.957551]},"n1417":{"id":"n1417","loc":[-85.626468,41.957483]},"n1418":{"id":"n1418","loc":[-85.626592,41.957639]},"n1419":{"id":"n1419","loc":[-85.626807,41.957713]},"n142":{"id":"n142","loc":[-85.637364,41.941833]},"n1420":{"id":"n1420","loc":[-85.627129,41.957401]},"n1421":{"id":"n1421","loc":[-85.627209,41.95742]},"n1422":{"id":"n1422","loc":[-85.627302,41.957435]},"n1423":{"id":"n1423","loc":[-85.629566,41.957048]},"n1424":{"id":"n1424","loc":[-85.629568,41.957215]},"n1425":{"id":"n1425","loc":[-85.629383,41.957216]},"n1426":{"id":"n1426","loc":[-85.629384,41.95727]},"n1427":{"id":"n1427","loc":[-85.629231,41.957271]},"n1428":{"id":"n1428","loc":[-85.62923,41.957198]},"n1429":{"id":"n1429","loc":[-85.629322,41.957198]},"n143":{"id":"n143","loc":[-85.637559,41.942448]},"n1430":{"id":"n1430","loc":[-85.629321,41.957108]},"n1431":{"id":"n1431","loc":[-85.629441,41.957108]},"n1432":{"id":"n1432","loc":[-85.62944,41.957049]},"n1433":{"id":"n1433","loc":[-85.629337,41.957018]},"n1434":{"id":"n1434","loc":[-85.629366,41.957028]},"n1435":{"id":"n1435","loc":[-85.629375,41.957044]},"n1436":{"id":"n1436","loc":[-85.629354,41.957071]},"n1437":{"id":"n1437","loc":[-85.629317,41.957071]},"n1438":{"id":"n1438","loc":[-85.62929,41.957074]},"n1439":{"id":"n1439","loc":[-85.62927,41.957084]},"n144":{"id":"n144","loc":[-85.637036,41.942454]},"n1440":{"id":"n1440","loc":[-85.629232,41.957081]},"n1441":{"id":"n1441","loc":[-85.629222,41.957057]},"n1442":{"id":"n1442","loc":[-85.629259,41.957025]},"n1443":{"id":"n1443","loc":[-85.629293,41.957017]},"n1444":{"id":"n1444","loc":[-85.629251,41.957085]},"n1445":{"id":"n1445","loc":[-85.629235,41.957041]},"n1446":{"id":"n1446","loc":[-85.62937,41.95706]},"n1447":{"id":"n1447","loc":[-85.629531,41.956909]},"n1448":{"id":"n1448","loc":[-85.629408,41.956909]},"n1449":{"id":"n1449","loc":[-85.629402,41.956681]},"n145":{"id":"n145","loc":[-85.636692,41.942828]},"n1450":{"id":"n1450","loc":[-85.62953,41.956681]},"n1451":{"id":"n1451","loc":[-85.629402,41.956728]},"n1452":{"id":"n1452","loc":[-85.629408,41.956845]},"n1453":{"id":"n1453","loc":[-85.629385,41.956845]},"n1454":{"id":"n1454","loc":[-85.629384,41.956728]},"n1455":{"id":"n1455","loc":[-85.629063,41.956973]},"n1456":{"id":"n1456","loc":[-85.629064,41.957009]},"n1457":{"id":"n1457","loc":[-85.62902,41.957009]},"n1458":{"id":"n1458","loc":[-85.629019,41.956973]},"n1459":{"id":"n1459","loc":[-85.629136,41.956633]},"n146":{"id":"n146","loc":[-85.635929,41.942826]},"n1460":{"id":"n1460","loc":[-85.629084,41.956632]},"n1461":{"id":"n1461","loc":[-85.629084,41.956605]},"n1462":{"id":"n1462","loc":[-85.629136,41.956605]},"n1463":{"id":"n1463","loc":[-85.629153,41.956657]},"n1464":{"id":"n1464","loc":[-85.627914,41.956661]},"n1465":{"id":"n1465","loc":[-85.630096,41.956101]},"n1466":{"id":"n1466","loc":[-85.630097,41.95612]},"n1467":{"id":"n1467","loc":[-85.630011,41.956121]},"n1468":{"id":"n1468","loc":[-85.630015,41.956374]},"n1469":{"id":"n1469","loc":[-85.629148,41.95626]},"n147":{"id":"n147","loc":[-85.636433,41.942828]},"n1470":{"id":"n1470","loc":[-85.629527,41.956591]},"n1471":{"id":"n1471","loc":[-85.629405,41.956591]},"n1472":{"id":"n1472","loc":[-85.629405,41.956459]},"n1473":{"id":"n1473","loc":[-85.629369,41.956459]},"n1474":{"id":"n1474","loc":[-85.629369,41.956424]},"n1475":{"id":"n1475","loc":[-85.629413,41.956424]},"n1476":{"id":"n1476","loc":[-85.629414,41.956326]},"n1477":{"id":"n1477","loc":[-85.629522,41.956326]},"n1478":{"id":"n1478","loc":[-85.629522,41.956487]},"n1479":{"id":"n1479","loc":[-85.629527,41.956487]},"n148":{"id":"n148","loc":[-85.636435,41.942864],"tags":{"entrance":"yes"}},"n1480":{"id":"n1480","loc":[-85.629414,41.95634]},"n1481":{"id":"n1481","loc":[-85.629149,41.956338]},"n1482":{"id":"n1482","loc":[-85.62931,41.956531]},"n1483":{"id":"n1483","loc":[-85.629291,41.95655]},"n1484":{"id":"n1484","loc":[-85.629255,41.95655]},"n1485":{"id":"n1485","loc":[-85.629236,41.956533]},"n1486":{"id":"n1486","loc":[-85.629237,41.956461]},"n1487":{"id":"n1487","loc":[-85.629257,41.956445]},"n1488":{"id":"n1488","loc":[-85.629257,41.956428]},"n1489":{"id":"n1489","loc":[-85.629287,41.956428]},"n149":{"id":"n149","loc":[-85.637235,41.942622]},"n1490":{"id":"n1490","loc":[-85.629287,41.956445]},"n1491":{"id":"n1491","loc":[-85.62931,41.95646]},"n1492":{"id":"n1492","loc":[-85.629049,41.956425]},"n1493":{"id":"n1493","loc":[-85.628907,41.956427]},"n1494":{"id":"n1494","loc":[-85.628907,41.956455]},"n1495":{"id":"n1495","loc":[-85.628841,41.956455]},"n1496":{"id":"n1496","loc":[-85.62884,41.956424]},"n1497":{"id":"n1497","loc":[-85.628764,41.956425]},"n1498":{"id":"n1498","loc":[-85.628762,41.956323]},"n1499":{"id":"n1499","loc":[-85.628808,41.956323]},"n15":{"id":"n15","loc":[-85.633477,41.940187]},"n150":{"id":"n150","loc":[-85.637247,41.943116]},"n1500":{"id":"n1500","loc":[-85.628808,41.956314]},"n1501":{"id":"n1501","loc":[-85.628911,41.956313]},"n1502":{"id":"n1502","loc":[-85.628911,41.956322]},"n1503":{"id":"n1503","loc":[-85.62896,41.956322]},"n1504":{"id":"n1504","loc":[-85.62896,41.956348]},"n1505":{"id":"n1505","loc":[-85.629047,41.956347]},"n1506":{"id":"n1506","loc":[-85.628893,41.957263]},"n1507":{"id":"n1507","loc":[-85.628788,41.957264]},"n1508":{"id":"n1508","loc":[-85.628786,41.95711]},"n1509":{"id":"n1509","loc":[-85.628894,41.957109]},"n151":{"id":"n151","loc":[-85.637564,41.943116]},"n1510":{"id":"n1510","loc":[-85.628893,41.957075]},"n1511":{"id":"n1511","loc":[-85.628965,41.957075]},"n1512":{"id":"n1512","loc":[-85.628965,41.957111]},"n1513":{"id":"n1513","loc":[-85.629035,41.95711]},"n1514":{"id":"n1514","loc":[-85.629036,41.957209]},"n1515":{"id":"n1515","loc":[-85.628893,41.95721]},"n1516":{"id":"n1516","loc":[-85.631348,41.95773]},"n1517":{"id":"n1517","loc":[-85.631101,41.957732]},"n1518":{"id":"n1518","loc":[-85.631099,41.957558]},"n1519":{"id":"n1519","loc":[-85.63123,41.957557]},"n152":{"id":"n152","loc":[-85.637552,41.942619]},"n1520":{"id":"n1520","loc":[-85.631231,41.957618]},"n1521":{"id":"n1521","loc":[-85.63129,41.957618]},"n1522":{"id":"n1522","loc":[-85.63129,41.957651]},"n1523":{"id":"n1523","loc":[-85.631346,41.957651]},"n1524":{"id":"n1524","loc":[-85.631366,41.95802]},"n1525":{"id":"n1525","loc":[-85.631141,41.958021]},"n1526":{"id":"n1526","loc":[-85.63114,41.957943]},"n1527":{"id":"n1527","loc":[-85.631167,41.957943]},"n1528":{"id":"n1528","loc":[-85.631166,41.957808]},"n1529":{"id":"n1529","loc":[-85.631301,41.957807]},"n153":{"id":"n153","loc":[-85.63763,41.942528]},"n1530":{"id":"n1530","loc":[-85.631302,41.95789]},"n1531":{"id":"n1531","loc":[-85.631364,41.95789]},"n1532":{"id":"n1532","loc":[-85.631539,41.957754]},"n1533":{"id":"n1533","loc":[-85.631069,41.957756]},"n1534":{"id":"n1534","loc":[-85.631536,41.957518]},"n1535":{"id":"n1535","loc":[-85.631543,41.957995]},"n1536":{"id":"n1536","loc":[-85.631531,41.957748]},"n1537":{"id":"n1537","loc":[-85.631485,41.957748]},"n1538":{"id":"n1538","loc":[-85.631484,41.957698]},"n1539":{"id":"n1539","loc":[-85.631531,41.957698]},"n154":{"id":"n154","loc":[-85.637151,41.94253]},"n1540":{"id":"n1540","loc":[-85.631586,41.957742]},"n1541":{"id":"n1541","loc":[-85.63155,41.957742]},"n1542":{"id":"n1542","loc":[-85.631551,41.957702]},"n1543":{"id":"n1543","loc":[-85.631587,41.957702]},"n1544":{"id":"n1544","loc":[-85.631534,41.95807]},"n1545":{"id":"n1545","loc":[-85.631534,41.958097]},"n1546":{"id":"n1546","loc":[-85.631491,41.958097]},"n1547":{"id":"n1547","loc":[-85.631491,41.95807]},"n1548":{"id":"n1548","loc":[-85.631304,41.958861]},"n1549":{"id":"n1549","loc":[-85.631186,41.958862]},"n155":{"id":"n155","loc":[-85.63715,41.942424]},"n1550":{"id":"n1550","loc":[-85.631182,41.958653]},"n1551":{"id":"n1551","loc":[-85.6313,41.958651]},"n1552":{"id":"n1552","loc":[-85.631293,41.95854]},"n1553":{"id":"n1553","loc":[-85.631176,41.958539]},"n1554":{"id":"n1554","loc":[-85.631176,41.958377]},"n1555":{"id":"n1555","loc":[-85.631297,41.958377]},"n1556":{"id":"n1556","loc":[-85.631297,41.958422]},"n1557":{"id":"n1557","loc":[-85.631333,41.958422]},"n1558":{"id":"n1558","loc":[-85.631333,41.958479]},"n1559":{"id":"n1559","loc":[-85.631293,41.958479]},"n156":{"id":"n156","loc":[-85.637629,41.942422]},"n1560":{"id":"n1560","loc":[-85.631951,41.958908]},"n1561":{"id":"n1561","loc":[-85.631838,41.958909]},"n1562":{"id":"n1562","loc":[-85.631837,41.958847]},"n1563":{"id":"n1563","loc":[-85.631859,41.958847]},"n1564":{"id":"n1564","loc":[-85.631858,41.958746]},"n1565":{"id":"n1565","loc":[-85.631961,41.958745]},"n1566":{"id":"n1566","loc":[-85.631962,41.958812]},"n1567":{"id":"n1567","loc":[-85.631949,41.958813]},"n1568":{"id":"n1568","loc":[-85.631579,41.958913]},"n1569":{"id":"n1569","loc":[-85.631567,41.95864]},"n157":{"id":"n157","loc":[-85.638232,41.942477]},"n1570":{"id":"n1570","loc":[-85.631942,41.958639]},"n1571":{"id":"n1571","loc":[-85.631543,41.958594]},"n1572":{"id":"n1572","loc":[-85.631543,41.958065]},"n1573":{"id":"n1573","loc":[-85.631888,41.958546]},"n1574":{"id":"n1574","loc":[-85.631804,41.958546]},"n1575":{"id":"n1575","loc":[-85.631803,41.95841]},"n1576":{"id":"n1576","loc":[-85.631886,41.958409]},"n1577":{"id":"n1577","loc":[-85.631897,41.958125]},"n1578":{"id":"n1578","loc":[-85.631755,41.958126]},"n1579":{"id":"n1579","loc":[-85.631756,41.958174]},"n158":{"id":"n158","loc":[-85.637775,41.942483]},"n1580":{"id":"n1580","loc":[-85.63178,41.958174]},"n1581":{"id":"n1581","loc":[-85.631782,41.958272]},"n1582":{"id":"n1582","loc":[-85.631922,41.958271]},"n1583":{"id":"n1583","loc":[-85.631922,41.958244]},"n1584":{"id":"n1584","loc":[-85.631883,41.958245]},"n1585":{"id":"n1585","loc":[-85.631882,41.958175]},"n1586":{"id":"n1586","loc":[-85.631898,41.958175]},"n1587":{"id":"n1587","loc":[-85.631924,41.958032]},"n1588":{"id":"n1588","loc":[-85.631762,41.958032]},"n1589":{"id":"n1589","loc":[-85.63176,41.957827]},"n159":{"id":"n159","loc":[-85.638107,41.942512]},"n1590":{"id":"n1590","loc":[-85.631888,41.957826]},"n1591":{"id":"n1591","loc":[-85.631888,41.957892]},"n1592":{"id":"n1592","loc":[-85.631871,41.957892]},"n1593":{"id":"n1593","loc":[-85.631872,41.957949]},"n1594":{"id":"n1594","loc":[-85.631923,41.957949]},"n1595":{"id":"n1595","loc":[-85.631695,41.95795]},"n1596":{"id":"n1596","loc":[-85.631666,41.957975]},"n1597":{"id":"n1597","loc":[-85.63163,41.957975]},"n1598":{"id":"n1598","loc":[-85.6316,41.957951]},"n1599":{"id":"n1599","loc":[-85.6316,41.95785]},"n16":{"id":"n16","loc":[-85.63341,41.94032]},"n160":{"id":"n160","loc":[-85.637763,41.942514]},"n1600":{"id":"n1600","loc":[-85.63166,41.95785]},"n1601":{"id":"n1601","loc":[-85.631696,41.957873]},"n1602":{"id":"n1602","loc":[-85.631924,41.957762]},"n1603":{"id":"n1603","loc":[-85.631762,41.957762]},"n1604":{"id":"n1604","loc":[-85.631762,41.957708]},"n1605":{"id":"n1605","loc":[-85.631785,41.957708]},"n1606":{"id":"n1606","loc":[-85.631785,41.957606]},"n1607":{"id":"n1607","loc":[-85.631734,41.957606]},"n1608":{"id":"n1608","loc":[-85.631734,41.957538]},"n1609":{"id":"n1609","loc":[-85.631821,41.957538]},"n161":{"id":"n161","loc":[-85.637763,41.942445]},"n1610":{"id":"n1610","loc":[-85.631935,41.957545]},"n1611":{"id":"n1611","loc":[-85.631821,41.957544]},"n1612":{"id":"n1612","loc":[-85.631935,41.957645]},"n1613":{"id":"n1613","loc":[-85.631924,41.957645]},"n1614":{"id":"n1614","loc":[-85.627135,41.953828]},"n1615":{"id":"n1615","loc":[-85.633517,41.941353],"tags":{"man_made":"lighthouse"}},"n1616":{"id":"n1616","loc":[-85.633659,41.942041],"tags":{"amenity":"bbq"}},"n1617":{"id":"n1617","loc":[-85.63662,41.942911],"tags":{"amenity":"toilets"}},"n1618":{"id":"n1618","loc":[-85.637487,41.943876],"tags":{"amenity":"toilets"}},"n1619":{"id":"n1619","loc":[-85.634938,41.941917],"tags":{"amenity":"toilets"}},"n162":{"id":"n162","loc":[-85.638107,41.942443]},"n1620":{"id":"n1620","loc":[-85.632427,41.941678],"tags":{"amenity":"bbq"}},"n1621":{"id":"n1621","loc":[-85.638033,41.944568],"tags":{"amenity":"bbq"}},"n1622":{"id":"n1622","loc":[-85.638052,41.944522],"tags":{"amenity":"bbq"}},"n1623":{"id":"n1623","loc":[-85.635001,41.941965]},"n1624":{"id":"n1624","loc":[-85.634635,41.941884]},"n1625":{"id":"n1625","loc":[-85.634667,41.941894]},"n1626":{"id":"n1626","loc":[-85.634791,41.942011]},"n1627":{"id":"n1627","loc":[-85.634749,41.941938]},"n1628":{"id":"n1628","loc":[-85.627295,41.953946],"tags":{"barrier":"gate"}},"n1629":{"id":"n1629","loc":[-85.629076,41.954689]},"n163":{"id":"n163","loc":[-85.638813,41.942475]},"n1630":{"id":"n1630","loc":[-85.640667,41.942595]},"n1631":{"id":"n1631","loc":[-85.639455,41.94261]},"n1632":{"id":"n1632","loc":[-85.643407,41.942336]},"n1633":{"id":"n1633","loc":[-85.641845,41.941316]},"n1634":{"id":"n1634","loc":[-85.643322,41.942224]},"n1635":{"id":"n1635","loc":[-85.643301,41.942124]},"n1636":{"id":"n1636","loc":[-85.640639,41.941326]},"n1637":{"id":"n1637","loc":[-85.640614,41.940058]},"n1638":{"id":"n1638","loc":[-85.639428,41.941335]},"n1639":{"id":"n1639","loc":[-85.643078,41.941293]},"n164":{"id":"n164","loc":[-85.63883,41.942422]},"n1640":{"id":"n1640","loc":[-85.64371,41.942302]},"n1641":{"id":"n1641","loc":[-85.643056,41.94001]},"n1642":{"id":"n1642","loc":[-85.643097,41.942575],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"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"}},"n1835":{"id":"n1835","loc":[-85.634873,41.943044]},"n1836":{"id":"n1836","loc":[-85.643482,41.941976]},"n1837":{"id":"n1837","loc":[-85.64345,41.941945]},"n1838":{"id":"n1838","loc":[-85.641885,41.943851]},"n1839":{"id":"n1839","loc":[-85.641915,41.945121]},"n184":{"id":"n184","loc":[-85.637953,41.94184]},"n1840":{"id":"n1840","loc":[-85.639454,41.943871]},"n1841":{"id":"n1841","loc":[-85.639491,41.945191]},"n1842":{"id":"n1842","loc":[-85.635768,41.940113]},"n1843":{"id":"n1843","loc":[-85.638206,41.941345]},"n1844":{"id":"n1844","loc":[-85.640721,41.94513]},"n1845":{"id":"n1845","loc":[-85.643137,41.945103]},"n1846":{"id":"n1846","loc":[-85.638199,41.940079]},"n1847":{"id":"n1847","loc":[-85.640688,41.943861]},"n1848":{"id":"n1848","loc":[-85.643397,41.941924]},"n1849":{"id":"n1849","loc":[-85.643117,41.943841]},"n185":{"id":"n185","loc":[-85.637953,41.941866]},"n1850":{"id":"n1850","loc":[-85.636731,41.94263]},"n1851":{"id":"n1851","loc":[-85.63518,41.942955],"tags":{"highway":"crossing"}},"n1852":{"id":"n1852","loc":[-85.636152,41.942695]},"n1853":{"id":"n1853","loc":[-85.644202,41.941499]},"n1854":{"id":"n1854","loc":[-85.644211,41.942116]},"n1855":{"id":"n1855","loc":[-85.644233,41.942404]},"n1856":{"id":"n1856","loc":[-85.644231,41.942223]},"n1857":{"id":"n1857","loc":[-85.644133,41.941315]},"n1858":{"id":"n1858","loc":[-85.644136,41.941493]},"n1859":{"id":"n1859","loc":[-85.644345,41.942307]},"n186":{"id":"n186","loc":[-85.637873,41.941867]},"n1860":{"id":"n1860","loc":[-85.644232,41.942304]},"n1861":{"id":"n1861","loc":[-85.644134,41.941403]},"n1862":{"id":"n1862","loc":[-85.63607,41.943005],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"fire_station","name":"Three Rivers Fire Department"}},"n1863":{"id":"n1863","loc":[-85.637,41.941236]},"n1864":{"id":"n1864","loc":[-85.634476,41.941475]},"n1865":{"id":"n1865","loc":[-85.635036,41.941858]},"n1866":{"id":"n1866","loc":[-85.635362,41.941962]},"n1867":{"id":"n1867","loc":[-85.635796,41.941962]},"n1868":{"id":"n1868","loc":[-85.63295,41.943006]},"n1869":{"id":"n1869","loc":[-85.634692,41.943098]},"n187":{"id":"n187","loc":[-85.637877,41.941975]},"n1870":{"id":"n1870","loc":[-85.633128,41.940484]},"n1871":{"id":"n1871","loc":[-85.633117,41.942798]},"n1872":{"id":"n1872","loc":[-85.633303,41.942412]},"n1873":{"id":"n1873","loc":[-85.633482,41.941912]},"n1874":{"id":"n1874","loc":[-85.633455,41.941359]},"n1875":{"id":"n1875","loc":[-85.633162,41.942679]},"n1876":{"id":"n1876","loc":[-85.634274,41.943479]},"n1877":{"id":"n1877","loc":[-85.634678,41.942909]},"n1878":{"id":"n1878","loc":[-85.6339,41.941453]},"n1879":{"id":"n1879","loc":[-85.634571,41.942774]},"n188":{"id":"n188","loc":[-85.636855,41.942488]},"n1880":{"id":"n1880","loc":[-85.63419,41.941732]},"n1881":{"id":"n1881","loc":[-85.634067,41.941565]},"n1882":{"id":"n1882","loc":[-85.63436,41.942358]},"n1883":{"id":"n1883","loc":[-85.634327,41.942247]},"n1884":{"id":"n1884","loc":[-85.633391,41.941231]},"n1885":{"id":"n1885","loc":[-85.634303,41.941972]},"n1886":{"id":"n1886","loc":[-85.633541,41.940147]},"n1887":{"id":"n1887","loc":[-85.633433,41.940252]},"n1888":{"id":"n1888","loc":[-85.633402,41.940411]},"n1889":{"id":"n1889","loc":[-85.633551,41.941023]},"n189":{"id":"n189","loc":[-85.636702,41.942488]},"n1890":{"id":"n1890","loc":[-85.633719,41.941186]},"n1891":{"id":"n1891","loc":[-85.633067,41.941845]},"n1892":{"id":"n1892","loc":[-85.634902,41.942766]},"n1893":{"id":"n1893","loc":[-85.634603,41.942202]},"n1894":{"id":"n1894","loc":[-85.634858,41.942152]},"n1895":{"id":"n1895","loc":[-85.634842,41.942269]},"n1896":{"id":"n1896","loc":[-85.634907,41.942313]},"n1897":{"id":"n1897","loc":[-85.635049,41.942331]},"n1898":{"id":"n1898","loc":[-85.635101,41.942281]},"n1899":{"id":"n1899","loc":[-85.635129,41.942144]},"n19":{"id":"n19","loc":[-85.633009,41.942229]},"n190":{"id":"n190","loc":[-85.636702,41.942434]},"n1900":{"id":"n1900","loc":[-85.635531,41.942143]},"n1901":{"id":"n1901","loc":[-85.635534,41.942577]},"n1902":{"id":"n1902","loc":[-85.635158,41.942656]},"n1903":{"id":"n1903","loc":[-85.635121,41.942703]},"n1904":{"id":"n1904","loc":[-85.635087,41.941508]},"n1905":{"id":"n1905","loc":[-85.63536,41.941106]},"n1906":{"id":"n1906","loc":[-85.635442,41.941094]},"n1907":{"id":"n1907","loc":[-85.635508,41.941104]},"n1908":{"id":"n1908","loc":[-85.635569,41.941125]},"n1909":{"id":"n1909","loc":[-85.635583,41.941106]},"n191":{"id":"n191","loc":[-85.636761,41.942434]},"n1910":{"id":"n1910","loc":[-85.635555,41.940976]},"n1911":{"id":"n1911","loc":[-85.635501,41.940915]},"n1912":{"id":"n1912","loc":[-85.635392,41.940922]},"n1913":{"id":"n1913","loc":[-85.635276,41.940974]},"n1914":{"id":"n1914","loc":[-85.63517,41.941204]},"n1915":{"id":"n1915","loc":[-85.634888,41.941517]},"n1916":{"id":"n1916","loc":[-85.634897,41.941576]},"n1917":{"id":"n1917","loc":[-85.634961,41.94164]},"n1918":{"id":"n1918","loc":[-85.635028,41.941659]},"n1919":{"id":"n1919","loc":[-85.635118,41.941621]},"n192":{"id":"n192","loc":[-85.636761,41.942369]},"n1920":{"id":"n1920","loc":[-85.635085,41.941558]},"n1921":{"id":"n1921","loc":[-85.63504,41.94136]},"n1922":{"id":"n1922","loc":[-85.635221,41.941077]},"n1923":{"id":"n1923","loc":[-85.634387,41.941559]},"n1924":{"id":"n1924","loc":[-85.634351,41.941587]},"n1925":{"id":"n1925","loc":[-85.634416,41.941756]},"n1926":{"id":"n1926","loc":[-85.634461,41.941797]},"n1927":{"id":"n1927","loc":[-85.634501,41.941819]},"n1928":{"id":"n1928","loc":[-85.634597,41.941816]},"n1929":{"id":"n1929","loc":[-85.634732,41.941724]},"n193":{"id":"n193","loc":[-85.636855,41.942369]},"n1930":{"id":"n1930","loc":[-85.634672,41.941775]},"n1931":{"id":"n1931","loc":[-85.633403,41.939101]},"n1932":{"id":"n1932","loc":[-85.633297,41.939397]},"n1933":{"id":"n1933","loc":[-85.633205,41.939674]},"n1934":{"id":"n1934","loc":[-85.63322,41.939777]},"n1935":{"id":"n1935","loc":[-85.633345,41.939936]},"n1936":{"id":"n1936","loc":[-85.633376,41.940002]},"n1937":{"id":"n1937","loc":[-85.633266,41.940228]},"n1938":{"id":"n1938","loc":[-85.633236,41.940352]},"n1939":{"id":"n1939","loc":[-85.633282,41.94063]},"n194":{"id":"n194","loc":[-85.636645,41.94249]},"n1940":{"id":"n1940","loc":[-85.633364,41.940874]},"n1941":{"id":"n1941","loc":[-85.633439,41.941052]},"n1942":{"id":"n1942","loc":[-85.633582,41.941172]},"n1943":{"id":"n1943","loc":[-85.633748,41.941273]},"n1944":{"id":"n1944","loc":[-85.634317,41.941527]},"n1945":{"id":"n1945","loc":[-85.634389,41.94174]},"n1946":{"id":"n1946","loc":[-85.634441,41.941801]},"n1947":{"id":"n1947","loc":[-85.634514,41.941837]},"n1948":{"id":"n1948","loc":[-85.634485,41.942005]},"n1949":{"id":"n1949","loc":[-85.63457,41.942202]},"n195":{"id":"n195","loc":[-85.636565,41.94249]},"n1950":{"id":"n1950","loc":[-85.634869,41.942769]},"n1951":{"id":"n1951","loc":[-85.634943,41.942792]},"n1952":{"id":"n1952","loc":[-85.635139,41.942882]},"n1953":{"id":"n1953","loc":[-85.634962,41.943161]},"n1954":{"id":"n1954","loc":[-85.635002,41.943131]},"n1955":{"id":"n1955","loc":[-85.635005,41.943091]},"n1956":{"id":"n1956","loc":[-85.635216,41.943033]},"n1957":{"id":"n1957","loc":[-85.634817,41.94267]},"n1958":{"id":"n1958","loc":[-85.634614,41.942599]},"n1959":{"id":"n1959","loc":[-85.634494,41.942381]},"n196":{"id":"n196","loc":[-85.636565,41.942474]},"n1960":{"id":"n1960","loc":[-85.634486,41.9423]},"n1961":{"id":"n1961","loc":[-85.634671,41.941795]},"n1962":{"id":"n1962","loc":[-85.634595,41.941831]},"n1963":{"id":"n1963","loc":[-85.634332,41.941866]},"n1964":{"id":"n1964","loc":[-85.634207,41.941885]},"n1965":{"id":"n1965","loc":[-85.634133,41.941892]},"n1966":{"id":"n1966","loc":[-85.634131,41.942203]},"n1967":{"id":"n1967","loc":[-85.634047,41.942327]},"n1968":{"id":"n1968","loc":[-85.634219,41.942793]},"n1969":{"id":"n1969","loc":[-85.634061,41.942392]},"n197":{"id":"n197","loc":[-85.636514,41.942474]},"n1970":{"id":"n1970","loc":[-85.633989,41.942407]},"n1971":{"id":"n1971","loc":[-85.633971,41.942356]},"n1972":{"id":"n1972","loc":[-85.63361,41.942423]},"n1973":{"id":"n1973","loc":[-85.633714,41.942682]},"n1974":{"id":"n1974","loc":[-85.633698,41.942863]},"n1975":{"id":"n1975","loc":[-85.633882,41.942865]},"n1976":{"id":"n1976","loc":[-85.633941,41.943007]},"n1977":{"id":"n1977","loc":[-85.633887,41.943035]},"n1978":{"id":"n1978","loc":[-85.633768,41.942815]},"n1979":{"id":"n1979","loc":[-85.633682,41.942351]},"n198":{"id":"n198","loc":[-85.636514,41.942326]},"n1980":{"id":"n1980","loc":[-85.634037,41.942273]},"n1981":{"id":"n1981","loc":[-85.634029,41.942252]},"n1982":{"id":"n1982","loc":[-85.633673,41.942331]},"n1983":{"id":"n1983","loc":[-85.634219,41.942571]},"n1984":{"id":"n1984","loc":[-85.634252,41.942565]},"n1985":{"id":"n1985","loc":[-85.634144,41.942299]},"n1986":{"id":"n1986","loc":[-85.634115,41.942306]},"n1987":{"id":"n1987","loc":[-85.634059,41.943094]},"n1988":{"id":"n1988","loc":[-85.633944,41.942903]},"n1989":{"id":"n1989","loc":[-85.634311,41.942821]},"n199":{"id":"n199","loc":[-85.636561,41.942326]},"n1990":{"id":"n1990","loc":[-85.634351,41.94277]},"n1991":{"id":"n1991","loc":[-85.634153,41.942254]},"n1992":{"id":"n1992","loc":[-85.634092,41.94222]},"n1993":{"id":"n1993","loc":[-85.633571,41.942336]},"n1994":{"id":"n1994","loc":[-85.633513,41.942387]},"n1995":{"id":"n1995","loc":[-85.633509,41.942455]},"n1996":{"id":"n1996","loc":[-85.63363,41.942665]},"n1997":{"id":"n1997","loc":[-85.63414,41.94286]},"n1998":{"id":"n1998","loc":[-85.63397,41.942449]},"n1999":{"id":"n1999","loc":[-85.633551,41.942529]},"n2":{"id":"n2","loc":[-85.627421,41.953877]},"n20":{"id":"n20","loc":[-85.633013,41.941438]},"n200":{"id":"n200","loc":[-85.636561,41.942311]},"n2000":{"id":"n2000","loc":[-85.633741,41.942493]},"n2001":{"id":"n2001","loc":[-85.633894,41.942869]},"n2002":{"id":"n2002","loc":[-85.634132,41.941954]},"n2003":{"id":"n2003","loc":[-85.634032,41.942038]},"n2004":{"id":"n2004","loc":[-85.633765,41.942238]},"n2005":{"id":"n2005","loc":[-85.63376,41.942268]},"n2006":{"id":"n2006","loc":[-85.633768,41.942293]},"n2007":{"id":"n2007","loc":[-85.633808,41.942386]},"n2008":{"id":"n2008","loc":[-85.634946,41.941663]},"n2009":{"id":"n2009","loc":[-85.63511,41.941697]},"n201":{"id":"n201","loc":[-85.636621,41.942311]},"n2010":{"id":"n2010","loc":[-85.635337,41.94168]},"n2011":{"id":"n2011","loc":[-85.634997,41.942251]},"n2012":{"id":"n2012","loc":[-85.635013,41.942173]},"n2013":{"id":"n2013","loc":[-85.634876,41.942157]},"n2014":{"id":"n2014","loc":[-85.634859,41.942235]},"n2015":{"id":"n2015","loc":[-85.634992,41.941951]},"n2016":{"id":"n2016","loc":[-85.634952,41.941877]},"n2017":{"id":"n2017","loc":[-85.634844,41.94191]},"n2018":{"id":"n2018","loc":[-85.634884,41.941983]},"n2019":{"id":"n2019","loc":[-85.635189,41.941691]},"n202":{"id":"n202","loc":[-85.636621,41.942351]},"n2020":{"id":"n2020","loc":[-85.635089,41.941896]},"n2021":{"id":"n2021","loc":[-85.635077,41.941964]},"n2022":{"id":"n2022","loc":[-85.635058,41.942147]},"n2023":{"id":"n2023","loc":[-85.635099,41.942161]},"n2024":{"id":"n2024","loc":[-85.635099,41.942213]},"n2025":{"id":"n2025","loc":[-85.635079,41.942285]},"n2026":{"id":"n2026","loc":[-85.635047,41.942316]},"n2027":{"id":"n2027","loc":[-85.634925,41.9423]},"n2028":{"id":"n2028","loc":[-85.634911,41.942276]},"n2029":{"id":"n2029","loc":[-85.634917,41.942242]},"n203":{"id":"n203","loc":[-85.63666,41.942351]},"n2030":{"id":"n2030","loc":[-85.634698,41.941898]},"n2031":{"id":"n2031","loc":[-85.634964,41.941878]},"n2032":{"id":"n2032","loc":[-85.635025,41.941929]},"n2033":{"id":"n2033","loc":[-85.634862,41.941887]},"n2034":{"id":"n2034","loc":[-85.634811,41.94181]},"n2035":{"id":"n2035","loc":[-85.634731,41.941745]},"n2036":{"id":"n2036","loc":[-85.634933,41.94176]},"n2037":{"id":"n2037","loc":[-85.634942,41.942145]},"n2038":{"id":"n2038","loc":[-85.634944,41.942065]},"n2039":{"id":"n2039","loc":[-85.634914,41.941996]},"n204":{"id":"n204","loc":[-85.63666,41.942453]},"n2040":{"id":"n2040","loc":[-85.634981,41.941979]},"n2041":{"id":"n2041","loc":[-85.633419,41.942172]},"n2042":{"id":"n2042","loc":[-85.633509,41.941631]},"n2043":{"id":"n2043","loc":[-85.633686,41.942937]},"n2044":{"id":"n2044","loc":[-85.633371,41.942722]},"n2045":{"id":"n2045","loc":[-85.633291,41.942538]},"n2046":{"id":"n2046","loc":[-85.633902,41.940941]},"n2047":{"id":"n2047","loc":[-85.635254,41.940939]},"n2048":{"id":"n2048","loc":[-85.635686,41.940829]},"n2049":{"id":"n2049","loc":[-85.635712,41.942681]},"n205":{"id":"n205","loc":[-85.636645,41.942453]},"n2050":{"id":"n2050","loc":[-85.633721,41.942118]},"n2051":{"id":"n2051","loc":[-85.633698,41.942057]},"n2052":{"id":"n2052","loc":[-85.633591,41.942079]},"n2053":{"id":"n2053","loc":[-85.633614,41.94214]},"n2054":{"id":"n2054","loc":[-85.633968,41.941099]},"n2055":{"id":"n2055","loc":[-85.633907,41.941138]},"n2056":{"id":"n2056","loc":[-85.633968,41.941197]},"n2057":{"id":"n2057","loc":[-85.63404,41.941162]},"n2058":{"id":"n2058","loc":[-85.634839,41.941665]},"n2059":{"id":"n2059","loc":[-85.635314,41.943035]},"n206":{"id":"n206","loc":[-85.636394,41.942471]},"n2060":{"id":"n2060","loc":[-85.634919,41.943142]},"n2061":{"id":"n2061","loc":[-85.636433,41.942959],"tags":{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"townhall","name":"Three Rivers City Hall"}},"n2062":{"id":"n2062","loc":[-85.637039,41.942789]},"n2063":{"id":"n2063","loc":[-85.636333,41.94279]},"n2064":{"id":"n2064","loc":[-85.634484,41.940726]},"n2065":{"id":"n2065","loc":[-85.634483,41.940603]},"n2066":{"id":"n2066","loc":[-85.634908,41.940601]},"n2067":{"id":"n2067","loc":[-85.634908,41.94053]},"n2068":{"id":"n2068","loc":[-85.634934,41.94053]},"n2069":{"id":"n2069","loc":[-85.634934,41.940496]},"n207":{"id":"n207","loc":[-85.636262,41.942472]},"n2070":{"id":"n2070","loc":[-85.63504,41.940495]},"n2071":{"id":"n2071","loc":[-85.63504,41.940531]},"n2072":{"id":"n2072","loc":[-85.635068,41.940531]},"n2073":{"id":"n2073","loc":[-85.635071,41.940794]},"n2074":{"id":"n2074","loc":[-85.635183,41.940793]},"n2075":{"id":"n2075","loc":[-85.635185,41.940916]},"n2076":{"id":"n2076","loc":[-85.634799,41.940919]},"n2077":{"id":"n2077","loc":[-85.634798,41.940798]},"n2078":{"id":"n2078","loc":[-85.634925,41.940797]},"n2079":{"id":"n2079","loc":[-85.634924,41.940724]},"n208":{"id":"n208","loc":[-85.636261,41.94233]},"n2080":{"id":"n2080","loc":[-85.637448,41.938233]},"n2081":{"id":"n2081","loc":[-85.634168,41.943279]},"n2082":{"id":"n2082","loc":[-85.635744,41.938248]},"n2083":{"id":"n2083","loc":[-85.638744,41.951211]},"n2084":{"id":"n2084","loc":[-85.636421,41.946392]},"n2085":{"id":"n2085","loc":[-85.635965,41.945809]},"n2086":{"id":"n2086","loc":[-85.635683,41.945449]},"n2087":{"id":"n2087","loc":[-85.635281,41.945025]},"n2088":{"id":"n2088","loc":[-85.632443,41.942574]},"n2089":{"id":"n2089","loc":[-85.638243,41.943674]},"n209":{"id":"n209","loc":[-85.636353,41.942329]},"n2090":{"id":"n2090","loc":[-85.638228,41.943747]},"n2091":{"id":"n2091","loc":[-85.638163,41.943797]},"n2092":{"id":"n2092","loc":[-85.638089,41.943832]},"n2093":{"id":"n2093","loc":[-85.637969,41.943841]},"n2094":{"id":"n2094","loc":[-85.637841,41.943833]},"n2095":{"id":"n2095","loc":[-85.637342,41.943734]},"n2096":{"id":"n2096","loc":[-85.637232,41.943707]},"n2097":{"id":"n2097","loc":[-85.637163,41.943668]},"n2098":{"id":"n2098","loc":[-85.637118,41.943615]},"n2099":{"id":"n2099","loc":[-85.637078,41.943494]},"n21":{"id":"n21","loc":[-85.634126,41.942228]},"n210":{"id":"n210","loc":[-85.636354,41.94239]},"n2100":{"id":"n2100","loc":[-85.632903,41.998429],"tags":{"railway":"level_crossing"}},"n2101":{"id":"n2101","loc":[-85.633616,41.943581],"tags":{"railway":"level_crossing"}},"n2102":{"id":"n2102","loc":[-85.636943,41.947311]},"n2103":{"id":"n2103","loc":[-85.6376,41.94854]},"n2104":{"id":"n2104","loc":[-85.634565,41.93631]},"n2105":{"id":"n2105","loc":[-85.629597,41.942562]},"n2106":{"id":"n2106","loc":[-85.630821,41.943077]},"n2107":{"id":"n2107","loc":[-85.627473,41.940659]},"n2108":{"id":"n2108","loc":[-85.629708,41.942872]},"n2109":{"id":"n2109","loc":[-85.634093,41.935448]},"n211":{"id":"n211","loc":[-85.636393,41.94239]},"n2110":{"id":"n2110","loc":[-85.630413,41.94366]},"n2111":{"id":"n2111","loc":[-85.630488,41.942662]},"n2112":{"id":"n2112","loc":[-85.63361,41.936749]},"n2113":{"id":"n2113","loc":[-85.630038,41.941808]},"n2114":{"id":"n2114","loc":[-85.632016,41.942922]},"n2115":{"id":"n2115","loc":[-85.631525,41.944303]},"n2116":{"id":"n2116","loc":[-85.626862,41.94022]},"n2117":{"id":"n2117","loc":[-85.629673,41.94121]},"n2118":{"id":"n2118","loc":[-85.632752,41.943101]},"n2119":{"id":"n2119","loc":[-85.631147,41.943201]},"n212":{"id":"n212","loc":[-85.63444,41.943176]},"n2120":{"id":"n2120","loc":[-85.624974,41.940579]},"n2121":{"id":"n2121","loc":[-85.629518,41.941783]},"n2122":{"id":"n2122","loc":[-85.632349,41.942699]},"n2123":{"id":"n2123","loc":[-85.628418,41.940356]},"n2124":{"id":"n2124","loc":[-85.629147,41.94129]},"n2125":{"id":"n2125","loc":[-85.631111,41.943979]},"n2126":{"id":"n2126","loc":[-85.632087,41.940013]},"n2127":{"id":"n2127","loc":[-85.634469,41.935057]},"n2128":{"id":"n2128","loc":[-85.630097,41.943449]},"n2129":{"id":"n2129","loc":[-85.6331,41.937878]},"n213":{"id":"n213","loc":[-85.63375,41.942814]},"n2130":{"id":"n2130","loc":[-85.625274,41.941114]},"n2131":{"id":"n2131","loc":[-85.632632,41.941217]},"n2132":{"id":"n2132","loc":[-85.632739,41.941926]},"n2133":{"id":"n2133","loc":[-85.631647,41.94366]},"n2134":{"id":"n2134","loc":[-85.635059,41.935456]},"n2135":{"id":"n2135","loc":[-85.631259,41.944349]},"n2136":{"id":"n2136","loc":[-85.626336,41.940811]},"n2137":{"id":"n2137","loc":[-85.631507,41.943875]},"n2138":{"id":"n2138","loc":[-85.625081,41.940859]},"n2139":{"id":"n2139","loc":[-85.625778,41.940093]},"n214":{"id":"n214","loc":[-85.633674,41.942869]},"n2140":{"id":"n2140","loc":[-85.632641,41.942436]},"n2141":{"id":"n2141","loc":[-85.628825,41.941034]},"n2142":{"id":"n2142","loc":[-85.627913,41.940292]},"n2143":{"id":"n2143","loc":[-85.628943,41.940516]},"n2144":{"id":"n2144","loc":[-85.63139,41.943941]},"n2145":{"id":"n2145","loc":[-85.630081,41.94204]},"n2146":{"id":"n2146","loc":[-85.632194,41.93963]},"n2147":{"id":"n2147","loc":[-85.632913,41.93939]},"n2148":{"id":"n2148","loc":[-85.632001,41.943492]},"n2149":{"id":"n2149","loc":[-85.63149,41.943154]},"n215":{"id":"n215","loc":[-85.633542,41.942768]},"n2150":{"id":"n2150","loc":[-85.625167,41.940117]},"n2151":{"id":"n2151","loc":[-85.63287,41.939941]},"n2152":{"id":"n2152","loc":[-85.630789,41.943732]},"n2153":{"id":"n2153","loc":[-85.632173,41.940348]},"n2154":{"id":"n2154","loc":[-85.626587,41.940113]},"n2155":{"id":"n2155","loc":[-85.62684,41.940667]},"n2156":{"id":"n2156","loc":[-85.632527,41.938904]},"n2157":{"id":"n2157","loc":[-85.624866,41.94018]},"n2158":{"id":"n2158","loc":[-85.633267,41.93872]},"n2159":{"id":"n2159","loc":[-85.62934,41.940843]},"n216":{"id":"n216","loc":[-85.633618,41.942714]},"n2160":{"id":"n2160","loc":[-85.62272,41.953817]},"n2161":{"id":"n2161","loc":[-85.622555,41.954453]},"n2162":{"id":"n2162","loc":[-85.637225,41.944128]},"n2163":{"id":"n2163","loc":[-85.622628,41.953683]},"n2164":{"id":"n2164","loc":[-85.635441,41.943989]},"n2165":{"id":"n2165","loc":[-85.622629,41.953807]},"n2166":{"id":"n2166","loc":[-85.62262,41.953807]},"n2167":{"id":"n2167","loc":[-85.62262,41.953837]},"n2168":{"id":"n2168","loc":[-85.622532,41.953838]},"n2169":{"id":"n2169","loc":[-85.637469,41.944579]},"n217":{"id":"n217","loc":[-85.634001,41.942336]},"n2170":{"id":"n2170","loc":[-85.63688,41.943935]},"n2171":{"id":"n2171","loc":[-85.638263,41.946367]},"n2172":{"id":"n2172","loc":[-85.622532,41.953807]},"n2173":{"id":"n2173","loc":[-85.622353,41.953808]},"n2174":{"id":"n2174","loc":[-85.622352,41.953685]},"n2175":{"id":"n2175","loc":[-85.622464,41.953684]},"n2176":{"id":"n2176","loc":[-85.622464,41.953648]},"n2177":{"id":"n2177","loc":[-85.637136,41.94576]},"n2178":{"id":"n2178","loc":[-85.622521,41.953648]},"n2179":{"id":"n2179","loc":[-85.637129,41.945415]},"n218":{"id":"n218","loc":[-85.633825,41.942376]},"n2180":{"id":"n2180","loc":[-85.637473,41.94607]},"n2181":{"id":"n2181","loc":[-85.622521,41.953683]},"n2182":{"id":"n2182","loc":[-85.622717,41.954104]},"n2183":{"id":"n2183","loc":[-85.637769,41.946095]},"n2184":{"id":"n2184","loc":[-85.623872,41.953515]},"n2185":{"id":"n2185","loc":[-85.623851,41.953588]},"n2186":{"id":"n2186","loc":[-85.631385,41.94433]},"n2187":{"id":"n2187","loc":[-85.623608,41.953543]},"n2188":{"id":"n2188","loc":[-85.637308,41.944882]},"n2189":{"id":"n2189","loc":[-85.634898,41.944041]},"n219":{"id":"n219","loc":[-85.633807,41.942334]},"n2190":{"id":"n2190","loc":[-85.623604,41.953442]},"n2191":{"id":"n2191","loc":[-85.623705,41.953442]},"n2192":{"id":"n2192","loc":[-85.623708,41.953493]},"n2193":{"id":"n2193","loc":[-85.624064,41.952655]},"n2194":{"id":"n2194","loc":[-85.62395,41.952654]},"n2195":{"id":"n2195","loc":[-85.623951,41.952579]},"n2196":{"id":"n2196","loc":[-85.637435,41.944342]},"n2197":{"id":"n2197","loc":[-85.624064,41.952579]},"n2198":{"id":"n2198","loc":[-85.623812,41.952648]},"n2199":{"id":"n2199","loc":[-85.623813,41.952705]},"n22":{"id":"n22","loc":[-85.633531,41.942357]},"n220":{"id":"n220","loc":[-85.633983,41.942294]},"n2200":{"id":"n2200","loc":[-85.637169,41.945098]},"n2201":{"id":"n2201","loc":[-85.623552,41.952707]},"n2202":{"id":"n2202","loc":[-85.623551,41.95263]},"n2203":{"id":"n2203","loc":[-85.623701,41.952629]},"n2204":{"id":"n2204","loc":[-85.635894,41.943719]},"n2205":{"id":"n2205","loc":[-85.637297,41.945992]},"n2206":{"id":"n2206","loc":[-85.623724,41.952648]},"n2207":{"id":"n2207","loc":[-85.623812,41.952438]},"n2208":{"id":"n2208","loc":[-85.625239,41.952197]},"n2209":{"id":"n2209","loc":[-85.625232,41.952257]},"n221":{"id":"n221","loc":[-85.634182,41.942495]},"n2210":{"id":"n2210","loc":[-85.635175,41.94408]},"n2211":{"id":"n2211","loc":[-85.636381,41.943761]},"n2212":{"id":"n2212","loc":[-85.625115,41.952249]},"n2213":{"id":"n2213","loc":[-85.638578,41.946644]},"n2214":{"id":"n2214","loc":[-85.625122,41.952189]},"n2215":{"id":"n2215","loc":[-85.625085,41.952031]},"n2216":{"id":"n2216","loc":[-85.636126,41.943713]},"n2217":{"id":"n2217","loc":[-85.635005,41.944041]},"n2218":{"id":"n2218","loc":[-85.63714,41.945328]},"n2219":{"id":"n2219","loc":[-85.634871,41.943292]},"n222":{"id":"n222","loc":[-85.634149,41.942503]},"n2220":{"id":"n2220","loc":[-85.635705,41.943799]},"n2221":{"id":"n2221","loc":[-85.634995,41.943576]},"n2222":{"id":"n2222","loc":[-85.635026,41.943829]},"n2223":{"id":"n2223","loc":[-85.632874,41.941031]},"n2224":{"id":"n2224","loc":[-85.632531,41.940233]},"n2225":{"id":"n2225","loc":[-85.634247,41.936003]},"n2226":{"id":"n2226","loc":[-85.62929,41.941127]},"n2227":{"id":"n2227","loc":[-85.630428,41.943266]},"n2228":{"id":"n2228","loc":[-85.631608,41.943425]},"n2229":{"id":"n2229","loc":[-85.632316,41.943042]},"n223":{"id":"n223","loc":[-85.634098,41.942373]},"n2230":{"id":"n2230","loc":[-85.628711,41.940744]},"n2231":{"id":"n2231","loc":[-85.627831,41.940536]},"n2232":{"id":"n2232","loc":[-85.625514,41.94052]},"n2233":{"id":"n2233","loc":[-85.631127,41.943545]},"n2234":{"id":"n2234","loc":[-85.632909,41.942531]},"n2235":{"id":"n2235","loc":[-85.632917,41.938796]},"n2236":{"id":"n2236","loc":[-85.626716,41.94044]},"n2237":{"id":"n2237","loc":[-85.630122,41.942852]},"n2238":{"id":"n2238","loc":[-85.632509,41.939674]},"n2239":{"id":"n2239","loc":[-85.634762,41.935237]},"n224":{"id":"n224","loc":[-85.634131,41.942366]},"n2240":{"id":"n2240","loc":[-85.63384,41.937025]},"n2241":{"id":"n2241","loc":[-85.629741,41.941909]},"n2242":{"id":"n2242","loc":[-85.635254,41.945001],"tags":{"railway":"level_crossing"}},"n2243":{"id":"n2243","loc":[-85.634005,41.938168]},"n2244":{"id":"n2244","loc":[-85.63393,41.938335]},"n2245":{"id":"n2245","loc":[-85.633859,41.93846]},"n2246":{"id":"n2246","loc":[-85.633663,41.938776]},"n2247":{"id":"n2247","loc":[-85.633513,41.938936]},"n2248":{"id":"n2248","loc":[-85.635295,41.943225]},"n2249":{"id":"n2249","loc":[-85.635393,41.943293]},"n225":{"id":"n225","loc":[-85.635986,41.94177]},"n2250":{"id":"n2250","loc":[-85.635645,41.94332]},"n2251":{"id":"n2251","loc":[-85.63629,41.943328]},"n2252":{"id":"n2252","loc":[-85.636554,41.943372]},"n2253":{"id":"n2253","loc":[-85.636869,41.943526]},"n2254":{"id":"n2254","loc":[-85.637099,41.943704]},"n2255":{"id":"n2255","loc":[-85.637268,41.943773]},"n2256":{"id":"n2256","loc":[-85.637483,41.943821]},"n2257":{"id":"n2257","loc":[-85.637616,41.943929]},"n2258":{"id":"n2258","loc":[-85.637752,41.944114]},"n2259":{"id":"n2259","loc":[-85.638399,41.944308]},"n226":{"id":"n226","loc":[-85.635982,41.941523]},"n2260":{"id":"n2260","loc":[-85.638573,41.944451]},"n2261":{"id":"n2261","loc":[-85.638702,41.944574]},"n2262":{"id":"n2262","loc":[-85.638718,41.944652]},"n2263":{"id":"n2263","loc":[-85.638715,41.944809]},"n2264":{"id":"n2264","loc":[-85.638766,41.944988]},"n2265":{"id":"n2265","loc":[-85.638773,41.945136]},"n2266":{"id":"n2266","loc":[-85.638705,41.945251]},"n2267":{"id":"n2267","loc":[-85.638335,41.944291]},"n2268":{"id":"n2268","loc":[-85.638474,41.944352]},"n2269":{"id":"n2269","loc":[-85.635408,41.943429]},"n227":{"id":"n227","loc":[-85.636108,41.941521]},"n2270":{"id":"n2270","loc":[-85.635271,41.943654]},"n2271":{"id":"n2271","loc":[-85.635266,41.943744]},"n2272":{"id":"n2272","loc":[-85.635271,41.943819]},"n2273":{"id":"n2273","loc":[-85.635192,41.943876]},"n2274":{"id":"n2274","loc":[-85.635129,41.943857]},"n2275":{"id":"n2275","loc":[-85.635122,41.943764]},"n2276":{"id":"n2276","loc":[-85.635124,41.943664]},"n2277":{"id":"n2277","loc":[-85.63515,41.943611]},"n2278":{"id":"n2278","loc":[-85.635106,41.943534]},"n2279":{"id":"n2279","loc":[-85.634972,41.943197]},"n228":{"id":"n228","loc":[-85.636109,41.941559]},"n2280":{"id":"n2280","loc":[-85.633978,41.938227]},"n2281":{"id":"n2281","loc":[-85.634216,41.943255]},"n2282":{"id":"n2282","loc":[-85.634434,41.943622]},"n2283":{"id":"n2283","loc":[-85.632406,41.940854]},"n2284":{"id":"n2284","loc":[-85.632488,41.941063],"tags":{"leisure":"slipway"}},"n2285":{"id":"n2285","loc":[-85.632726,41.941537]},"n2286":{"id":"n2286","loc":[-85.632639,41.94136]},"n2287":{"id":"n2287","loc":[-85.632704,41.941439]},"n2288":{"id":"n2288","loc":[-85.632289,41.940601]},"n2289":{"id":"n2289","loc":[-85.632541,41.942526]},"n229":{"id":"n229","loc":[-85.636145,41.941559]},"n2290":{"id":"n2290","loc":[-85.634058,41.943173]},"n2291":{"id":"n2291","loc":[-85.636175,41.945974]},"n2292":{"id":"n2292","loc":[-85.636528,41.945975]},"n2293":{"id":"n2293","loc":[-85.637092,41.945893]},"n2294":{"id":"n2294","loc":[-85.637881,41.945647]},"n2295":{"id":"n2295","loc":[-85.639329,41.945162]},"n2296":{"id":"n2296","loc":[-85.639323,41.945026]},"n2297":{"id":"n2297","loc":[-85.638826,41.945032]},"n2298":{"id":"n2298","loc":[-85.638817,41.944174]},"n2299":{"id":"n2299","loc":[-85.638291,41.94418]},"n23":{"id":"n23","loc":[-85.633504,41.942418]},"n230":{"id":"n230","loc":[-85.636145,41.941551]},"n2300":{"id":"n2300","loc":[-85.63828,41.943811]},"n2301":{"id":"n2301","loc":[-85.638195,41.943601]},"n2302":{"id":"n2302","loc":[-85.63719,41.943592]},"n2303":{"id":"n2303","loc":[-85.636697,41.943273]},"n2304":{"id":"n2304","loc":[-85.635375,41.943274]},"n2305":{"id":"n2305","loc":[-85.635091,41.943547]},"n2306":{"id":"n2306","loc":[-85.63442,41.944117]},"n2307":{"id":"n2307","loc":[-85.635117,41.943717]},"n2308":{"id":"n2308","loc":[-85.635601,41.945177]},"n2309":{"id":"n2309","loc":[-85.635819,41.945494]},"n231":{"id":"n231","loc":[-85.636312,41.941549]},"n2310":{"id":"n2310","loc":[-85.635303,41.944891]},"n2311":{"id":"n2311","loc":[-85.637674,41.943802]},"n2312":{"id":"n2312","loc":[-85.638263,41.944272]},"n2313":{"id":"n2313","loc":[-85.634267,41.935266]},"n2314":{"id":"n2314","loc":[-85.639788,41.945152]},"n2315":{"id":"n2315","loc":[-85.639645,41.945167]},"n2316":{"id":"n2316","loc":[-85.639362,41.945233]},"n2317":{"id":"n2317","loc":[-85.638616,41.945163]},"n2318":{"id":"n2318","loc":[-85.638514,41.944936]},"n2319":{"id":"n2319","loc":[-85.638578,41.94503]},"n232":{"id":"n232","loc":[-85.636314,41.941649]},"n2320":{"id":"n2320","loc":[-85.638578,41.945215]},"n2321":{"id":"n2321","loc":[-85.640495,41.947015]},"n2322":{"id":"n2322","loc":[-85.639577,41.946495]},"n2323":{"id":"n2323","loc":[-85.638935,41.946087]},"n2324":{"id":"n2324","loc":[-85.637535,41.94584]},"n2325":{"id":"n2325","loc":[-85.638357,41.945404]},"n2326":{"id":"n2326","loc":[-85.638051,41.94553]},"n2327":{"id":"n2327","loc":[-85.637732,41.945555]},"n2328":{"id":"n2328","loc":[-85.637657,41.945524]},"n2329":{"id":"n2329","loc":[-85.637598,41.945467]},"n233":{"id":"n233","loc":[-85.636152,41.94165]},"n2330":{"id":"n2330","loc":[-85.637669,41.945318]},"n2331":{"id":"n2331","loc":[-85.637894,41.945171]},"n2332":{"id":"n2332","loc":[-85.637923,41.945082]},"n2333":{"id":"n2333","loc":[-85.63793,41.944756]},"n2334":{"id":"n2334","loc":[-85.637976,41.944696]},"n2335":{"id":"n2335","loc":[-85.638044,41.944671]},"n2336":{"id":"n2336","loc":[-85.638129,41.944597]},"n2337":{"id":"n2337","loc":[-85.638252,41.944413]},"n2338":{"id":"n2338","loc":[-85.638092,41.945442]},"n2339":{"id":"n2339","loc":[-85.638409,41.945315]},"n234":{"id":"n234","loc":[-85.636152,41.941628]},"n2340":{"id":"n2340","loc":[-85.638325,41.944771]},"n2341":{"id":"n2341","loc":[-85.638103,41.944744]},"n2342":{"id":"n2342","loc":[-85.637976,41.944781]},"n2343":{"id":"n2343","loc":[-85.637983,41.944865]},"n2344":{"id":"n2344","loc":[-85.638063,41.945074]},"n2345":{"id":"n2345","loc":[-85.638041,41.945206]},"n2346":{"id":"n2346","loc":[-85.637907,41.945309]},"n2347":{"id":"n2347","loc":[-85.637925,41.94539]},"n2348":{"id":"n2348","loc":[-85.637998,41.94545]},"n2349":{"id":"n2349","loc":[-85.637135,41.946254]},"n235":{"id":"n235","loc":[-85.63611,41.941628]},"n2350":{"id":"n2350","loc":[-85.636837,41.946615]},"n2351":{"id":"n2351","loc":[-85.637954,41.948909]},"n2352":{"id":"n2352","loc":[-85.638382,41.949786]},"n2353":{"id":"n2353","loc":[-85.639367,41.951242]},"n2354":{"id":"n2354","loc":[-85.640554,41.951777]},"n2355":{"id":"n2355","loc":[-85.6411,41.952234]},"n2356":{"id":"n2356","loc":[-85.641742,41.952657]},"n2357":{"id":"n2357","loc":[-85.642321,41.952941]},"n2358":{"id":"n2358","loc":[-85.64277,41.953228]},"n2359":{"id":"n2359","loc":[-85.643333,41.953825]},"n236":{"id":"n236","loc":[-85.636113,41.941768]},"n2360":{"id":"n2360","loc":[-85.643579,41.954365]},"n2361":{"id":"n2361","loc":[-85.644439,41.954105]},"n2362":{"id":"n2362","loc":[-85.64506,41.954]},"n2363":{"id":"n2363","loc":[-85.645483,41.953911]},"n2364":{"id":"n2364","loc":[-85.646046,41.953853]},"n2365":{"id":"n2365","loc":[-85.646318,41.953717]},"n2366":{"id":"n2366","loc":[-85.646276,41.953414]},"n2367":{"id":"n2367","loc":[-85.631063,41.957478],"tags":{"emergency":"fire_hydrant"}},"n2368":{"id":"n2368","loc":[-85.630996,41.955857],"tags":{"emergency":"fire_hydrant"}},"n2369":{"id":"n2369","loc":[-85.630976,41.954608],"tags":{"emergency":"fire_hydrant"}},"n237":{"id":"n237","loc":[-85.635983,41.941589],"tags":{"entrance":"yes"}},"n2370":{"id":"n2370","loc":[-85.646,41.953154]},"n2371":{"id":"n2371","loc":[-85.645222,41.953193]},"n2372":{"id":"n2372","loc":[-85.644732,41.953181]},"n2373":{"id":"n2373","loc":[-85.644064,41.953298]},"n2374":{"id":"n2374","loc":[-85.643818,41.953177]},"n2375":{"id":"n2375","loc":[-85.644001,41.95284]},"n2376":{"id":"n2376","loc":[-85.628174,41.95456],"tags":{"emergency":"fire_hydrant"}},"n2377":{"id":"n2377","loc":[-85.644267,41.952591]},"n2378":{"id":"n2378","loc":[-85.644288,41.952328]},"n2379":{"id":"n2379","loc":[-85.627276,41.953987],"tags":{"emergency":"fire_hydrant"}},"n238":{"id":"n238","loc":[-85.635906,41.94159]},"n2380":{"id":"n2380","loc":[-85.644262,41.952153]},"n2381":{"id":"n2381","loc":[-85.644168,41.95204]},"n2382":{"id":"n2382","loc":[-85.64421,41.951749]},"n2383":{"id":"n2383","loc":[-85.64385,41.951586]},"n2384":{"id":"n2384","loc":[-85.62736,41.955964],"tags":{"emergency":"fire_hydrant"}},"n2385":{"id":"n2385","loc":[-85.626307,41.957198],"tags":{"emergency":"fire_hydrant"}},"n2386":{"id":"n2386","loc":[-85.643589,41.951323]},"n2387":{"id":"n2387","loc":[-85.62747,41.957509],"tags":{"emergency":"fire_hydrant"}},"n2388":{"id":"n2388","loc":[-85.628665,41.957492],"tags":{"emergency":"fire_hydrant"}},"n2389":{"id":"n2389","loc":[-85.642535,41.951031]},"n239":{"id":"n239","loc":[-85.635883,41.940182]},"n2390":{"id":"n2390","loc":[-85.642269,41.95088]},"n2391":{"id":"n2391","loc":[-85.641878,41.950814]},"n2392":{"id":"n2392","loc":[-85.641549,41.950806]},"n2393":{"id":"n2393","loc":[-85.641103,41.950549]},"n2394":{"id":"n2394","loc":[-85.630864,41.959046],"tags":{"emergency":"fire_hydrant"}},"n2395":{"id":"n2395","loc":[-85.632249,41.958969],"tags":{"emergency":"fire_hydrant"}},"n2396":{"id":"n2396","loc":[-85.641037,41.949821]},"n2397":{"id":"n2397","loc":[-85.641006,41.949433]},"n2398":{"id":"n2398","loc":[-85.632232,41.95859],"tags":{"emergency":"fire_hydrant"}},"n2399":{"id":"n2399","loc":[-85.632071,41.958345],"tags":{"emergency":"fire_hydrant"}},"n24":{"id":"n24","loc":[-85.634346,41.942792]},"n240":{"id":"n240","loc":[-85.635916,41.94264]},"n2400":{"id":"n2400","loc":[-85.632228,41.9573],"tags":{"emergency":"fire_hydrant"}},"n2401":{"id":"n2401","loc":[-85.641152,41.948257]},"n2402":{"id":"n2402","loc":[-85.641055,41.947304]},"n2403":{"id":"n2403","loc":[-85.638022,41.945897]},"n2404":{"id":"n2404","loc":[-85.638672,41.950778]},"n2405":{"id":"n2405","loc":[-85.63666,41.944492],"tags":{"name":"Memory Isle","place":"island"}},"n2406":{"id":"n2406","loc":[-85.635,41.946389],"tags":{"amenity":"post_office","name":"Three Rivers Post Office"}},"n2407":{"id":"n2407","loc":[-85.633676,41.946036]},"n2408":{"id":"n2408","loc":[-85.633736,41.946078]},"n2409":{"id":"n2409","loc":[-85.633997,41.946185]},"n241":{"id":"n241","loc":[-85.635795,41.941906]},"n2410":{"id":"n2410","loc":[-85.634448,41.945626],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2411":{"id":"n2411","loc":[-85.63456,41.945731],"tags":{"crossing":"zebra","highway":"crossing"}},"n2412":{"id":"n2412","loc":[-85.634592,41.94578]},"n2413":{"id":"n2413","loc":[-85.634607,41.945815]},"n2414":{"id":"n2414","loc":[-85.634614,41.945864]},"n2415":{"id":"n2415","loc":[-85.636066,41.946185]},"n2416":{"id":"n2416","loc":[-85.636128,41.946352]},"n2417":{"id":"n2417","loc":[-85.636142,41.946452]},"n2418":{"id":"n2418","loc":[-85.635327,41.945292]},"n2419":{"id":"n2419","loc":[-85.635648,41.94558]},"n242":{"id":"n242","loc":[-85.635909,41.941906]},"n2420":{"id":"n2420","loc":[-85.635769,41.945729]},"n2421":{"id":"n2421","loc":[-85.637349,41.945897]},"n2422":{"id":"n2422","loc":[-85.632211,41.95596],"tags":{"emergency":"fire_hydrant"}},"n2423":{"id":"n2423","loc":[-85.635942,41.94598]},"n2424":{"id":"n2424","loc":[-85.636443,41.946042]},"n2425":{"id":"n2425","loc":[-85.635819,41.946052]},"n2426":{"id":"n2426","loc":[-85.636669,41.946025]},"n2427":{"id":"n2427","loc":[-85.636832,41.946005]},"n2428":{"id":"n2428","loc":[-85.637039,41.945968]},"n2429":{"id":"n2429","loc":[-85.636291,41.946046]},"n243":{"id":"n243","loc":[-85.636359,41.941904]},"n2430":{"id":"n2430","loc":[-85.634005,41.943367]},"n2431":{"id":"n2431","loc":[-85.633366,41.943724]},"n2432":{"id":"n2432","loc":[-85.634617,41.946057]},"n2433":{"id":"n2433","loc":[-85.636534,41.944793]},"n2434":{"id":"n2434","loc":[-85.637055,41.945188]},"n2435":{"id":"n2435","loc":[-85.636153,41.944618]},"n2436":{"id":"n2436","loc":[-85.636803,41.944944]},"n2437":{"id":"n2437","loc":[-85.633389,41.945735]},"n2438":{"id":"n2438","loc":[-85.633536,41.94585]},"n2439":{"id":"n2439","loc":[-85.63363,41.945993]},"n244":{"id":"n244","loc":[-85.636351,41.941438]},"n2440":{"id":"n2440","loc":[-85.633268,41.94568]},"n2441":{"id":"n2441","loc":[-85.635947,41.94546]},"n2442":{"id":"n2442","loc":[-85.636277,41.945268]},"n2443":{"id":"n2443","loc":[-85.635203,41.944287]},"n2444":{"id":"n2444","loc":[-85.634876,41.944477]},"n2445":{"id":"n2445","loc":[-85.634975,41.944419]},"n2446":{"id":"n2446","loc":[-85.633877,41.943438]},"n2447":{"id":"n2447","loc":[-85.63508,41.945113]},"n2448":{"id":"n2448","loc":[-85.635372,41.944932]},"n2449":{"id":"n2449","loc":[-85.636594,41.945935]},"n245":{"id":"n245","loc":[-85.635903,41.941436]},"n2450":{"id":"n2450","loc":[-85.636901,41.945747]},"n2451":{"id":"n2451","loc":[-85.636329,41.945228]},"n2452":{"id":"n2452","loc":[-85.636025,41.945417]},"n2453":{"id":"n2453","loc":[-85.634002,41.944644]},"n2454":{"id":"n2454","loc":[-85.63407,41.944692]},"n2455":{"id":"n2455","loc":[-85.634114,41.944756]},"n2456":{"id":"n2456","loc":[-85.633762,41.944809]},"n2457":{"id":"n2457","loc":[-85.634184,41.944807]},"n2458":{"id":"n2458","loc":[-85.634291,41.944819]},"n2459":{"id":"n2459","loc":[-85.634639,41.944845]},"n246":{"id":"n246","loc":[-85.635788,41.941436]},"n2460":{"id":"n2460","loc":[-85.633822,41.944861]},"n2461":{"id":"n2461","loc":[-85.63411,41.944855]},"n2462":{"id":"n2462","loc":[-85.63435,41.944872]},"n2463":{"id":"n2463","loc":[-85.63441,41.944903]},"n2464":{"id":"n2464","loc":[-85.633883,41.944913]},"n2465":{"id":"n2465","loc":[-85.634164,41.944896]},"n2466":{"id":"n2466","loc":[-85.633487,41.944926]},"n2467":{"id":"n2467","loc":[-85.634736,41.944929]},"n2468":{"id":"n2468","loc":[-85.633944,41.944965]},"n2469":{"id":"n2469","loc":[-85.633555,41.944983]},"n247":{"id":"n247","loc":[-85.635929,41.941511]},"n2470":{"id":"n2470","loc":[-85.633995,41.945013]},"n2471":{"id":"n2471","loc":[-85.633614,41.945037]},"n2472":{"id":"n2472","loc":[-85.634848,41.945031]},"n2473":{"id":"n2473","loc":[-85.634049,41.945061]},"n2474":{"id":"n2474","loc":[-85.633678,41.945094]},"n2475":{"id":"n2475","loc":[-85.63317,41.945111]},"n2476":{"id":"n2476","loc":[-85.633357,41.945103]},"n2477":{"id":"n2477","loc":[-85.633728,41.945136]},"n2478":{"id":"n2478","loc":[-85.634146,41.945148]},"n2479":{"id":"n2479","loc":[-85.633416,41.945157]},"n248":{"id":"n248","loc":[-85.635929,41.941317]},"n2480":{"id":"n2480","loc":[-85.634625,41.945172]},"n2481":{"id":"n2481","loc":[-85.633239,41.945174]},"n2482":{"id":"n2482","loc":[-85.63469,41.945185]},"n2483":{"id":"n2483","loc":[-85.634661,41.945203]},"n2484":{"id":"n2484","loc":[-85.63348,41.945214]},"n2485":{"id":"n2485","loc":[-85.633578,41.945221]},"n2486":{"id":"n2486","loc":[-85.634742,41.945231]},"n2487":{"id":"n2487","loc":[-85.634251,41.94525]},"n2488":{"id":"n2488","loc":[-85.633524,41.945254]},"n2489":{"id":"n2489","loc":[-85.63468,41.945271]},"n249":{"id":"n249","loc":[-85.636414,41.941316]},"n2490":{"id":"n2490","loc":[-85.633885,41.945272]},"n2491":{"id":"n2491","loc":[-85.634795,41.945288]},"n2492":{"id":"n2492","loc":[-85.634742,41.94532]},"n2493":{"id":"n2493","loc":[-85.633946,41.945327]},"n2494":{"id":"n2494","loc":[-85.634844,41.945331]},"n2495":{"id":"n2495","loc":[-85.63435,41.945349]},"n2496":{"id":"n2496","loc":[-85.633733,41.945357]},"n2497":{"id":"n2497","loc":[-85.633987,41.945375]},"n2498":{"id":"n2498","loc":[-85.634911,41.945419]},"n2499":{"id":"n2499","loc":[-85.634049,41.945431]},"n25":{"id":"n25","loc":[-85.634333,41.942809]},"n250":{"id":"n250","loc":[-85.636414,41.941511]},"n2500":{"id":"n2500","loc":[-85.633705,41.945461]},"n2501":{"id":"n2501","loc":[-85.633642,41.945408]},"n2502":{"id":"n2502","loc":[-85.634493,41.945475]},"n2503":{"id":"n2503","loc":[-85.634106,41.945484]},"n2504":{"id":"n2504","loc":[-85.635008,41.945505]},"n2505":{"id":"n2505","loc":[-85.633757,41.945506]},"n2506":{"id":"n2506","loc":[-85.634542,41.945519]},"n2507":{"id":"n2507","loc":[-85.634162,41.945536]},"n2508":{"id":"n2508","loc":[-85.633843,41.945547]},"n2509":{"id":"n2509","loc":[-85.634919,41.94556]},"n251":{"id":"n251","loc":[-85.636819,41.941617]},"n2510":{"id":"n2510","loc":[-85.633818,41.945561]},"n2511":{"id":"n2511","loc":[-85.634638,41.94559]},"n2512":{"id":"n2512","loc":[-85.633901,41.945598]},"n2513":{"id":"n2513","loc":[-85.634257,41.945626]},"n2514":{"id":"n2514","loc":[-85.633967,41.945652]},"n2515":{"id":"n2515","loc":[-85.634735,41.945676]},"n2516":{"id":"n2516","loc":[-85.635057,41.945683]},"n2517":{"id":"n2517","loc":[-85.635296,41.945703]},"n2518":{"id":"n2518","loc":[-85.635112,41.945703]},"n2519":{"id":"n2519","loc":[-85.634782,41.945729]},"n252":{"id":"n252","loc":[-85.636718,41.941619]},"n2520":{"id":"n2520","loc":[-85.634052,41.945747]},"n2521":{"id":"n2521","loc":[-85.635296,41.945757]},"n2522":{"id":"n2522","loc":[-85.635314,41.945757]},"n2523":{"id":"n2523","loc":[-85.635112,41.945761]},"n2524":{"id":"n2524","loc":[-85.63484,41.945778]},"n2525":{"id":"n2525","loc":[-85.635314,41.945938]},"n2526":{"id":"n2526","loc":[-85.63484,41.945922]},"n2527":{"id":"n2527","loc":[-85.635461,41.944879]},"n2528":{"id":"n2528","loc":[-85.636024,41.945384]},"n2529":{"id":"n2529","loc":[-85.636145,41.945312]},"n253":{"id":"n253","loc":[-85.636716,41.941509]},"n2530":{"id":"n2530","loc":[-85.6356,41.944797]},"n2531":{"id":"n2531","loc":[-85.635135,41.944354]},"n2532":{"id":"n2532","loc":[-85.632988,41.945369]},"n2533":{"id":"n2533","loc":[-85.633376,41.94563]},"n2534":{"id":"n2534","loc":[-85.633539,41.945534]},"n2535":{"id":"n2535","loc":[-85.633238,41.945248]},"n2536":{"id":"n2536","loc":[-85.633166,41.945216]},"n2537":{"id":"n2537","loc":[-85.633114,41.945188]},"n2538":{"id":"n2538","loc":[-85.633078,41.945127]},"n2539":{"id":"n2539","loc":[-85.633066,41.94508]},"n254":{"id":"n254","loc":[-85.636732,41.941509]},"n2540":{"id":"n2540","loc":[-85.633222,41.945358]},"n2541":{"id":"n2541","loc":[-85.633425,41.945541]},"n2542":{"id":"n2542","loc":[-85.63299,41.9455]},"n2543":{"id":"n2543","loc":[-85.634374,41.944327]},"n2544":{"id":"n2544","loc":[-85.633648,41.943697]},"n2545":{"id":"n2545","loc":[-85.633533,41.943764]},"n2546":{"id":"n2546","loc":[-85.634239,41.944417]},"n2547":{"id":"n2547","loc":[-85.634122,41.944395]},"n2548":{"id":"n2548","loc":[-85.634235,41.944326]},"n2549":{"id":"n2549","loc":[-85.633613,41.943787]},"n255":{"id":"n255","loc":[-85.636731,41.941461]},"n2550":{"id":"n2550","loc":[-85.633915,41.943613]},"n2551":{"id":"n2551","loc":[-85.634015,41.943555]},"n2552":{"id":"n2552","loc":[-85.63433,41.943839]},"n2553":{"id":"n2553","loc":[-85.634236,41.943894]},"n2554":{"id":"n2554","loc":[-85.635413,41.946052]},"n2555":{"id":"n2555","loc":[-85.635405,41.94569]},"n2556":{"id":"n2556","loc":[-85.635684,41.945925]},"n2557":{"id":"n2557","loc":[-85.635614,41.945742]},"n2558":{"id":"n2558","loc":[-85.635401,41.945745]},"n2559":{"id":"n2559","loc":[-85.635406,41.945928]},"n256":{"id":"n256","loc":[-85.636799,41.941461]},"n2560":{"id":"n2560","loc":[-85.633478,41.943663]},"n2561":{"id":"n2561","loc":[-85.633291,41.943526]},"n2562":{"id":"n2562","loc":[-85.633094,41.943541]},"n2563":{"id":"n2563","loc":[-85.633302,41.943492]},"n2564":{"id":"n2564","loc":[-85.633047,41.943623]},"n2565":{"id":"n2565","loc":[-85.633275,41.943562]},"n2566":{"id":"n2566","loc":[-85.633351,41.943518]},"n2567":{"id":"n2567","loc":[-85.633224,41.9434]},"n2568":{"id":"n2568","loc":[-85.633235,41.943369]},"n2569":{"id":"n2569","loc":[-85.635179,41.943911]},"n257":{"id":"n257","loc":[-85.6368,41.9415]},"n2570":{"id":"n2570","loc":[-85.635146,41.943918]},"n2571":{"id":"n2571","loc":[-85.634888,41.943905]},"n2572":{"id":"n2572","loc":[-85.634832,41.943911]},"n2573":{"id":"n2573","loc":[-85.634638,41.944007]},"n2574":{"id":"n2574","loc":[-85.634568,41.94405]},"n2575":{"id":"n2575","loc":[-85.635994,41.94501]},"n2576":{"id":"n2576","loc":[-85.636388,41.944608]},"n2577":{"id":"n2577","loc":[-85.636215,41.944787]},"n2578":{"id":"n2578","loc":[-85.637948,41.944587]},"n2579":{"id":"n2579","loc":[-85.637849,41.944567]},"n258":{"id":"n258","loc":[-85.636814,41.9415]},"n2580":{"id":"n2580","loc":[-85.637895,41.944455]},"n2581":{"id":"n2581","loc":[-85.637996,41.944477]},"n2582":{"id":"n2582","loc":[-85.635525,41.94337]},"n2583":{"id":"n2583","loc":[-85.637847,41.943923]},"n2584":{"id":"n2584","loc":[-85.637891,41.944124]},"n2585":{"id":"n2585","loc":[-85.638167,41.944229]},"n2586":{"id":"n2586","loc":[-85.638236,41.944097]},"n2587":{"id":"n2587","loc":[-85.638207,41.944025]},"n2588":{"id":"n2588","loc":[-85.638141,41.943997]},"n2589":{"id":"n2589","loc":[-85.638057,41.944015]},"n259":{"id":"n259","loc":[-85.636815,41.941538]},"n2590":{"id":"n2590","loc":[-85.637902,41.944231]},"n2591":{"id":"n2591","loc":[-85.638134,41.944307]},"n2592":{"id":"n2592","loc":[-85.638242,41.944294]},"n2593":{"id":"n2593","loc":[-85.638274,41.944222]},"n2594":{"id":"n2594","loc":[-85.638236,41.944174]},"n2595":{"id":"n2595","loc":[-85.638207,41.944157]},"n2596":{"id":"n2596","loc":[-85.637818,41.943984]},"n2597":{"id":"n2597","loc":[-85.634996,41.944439]},"n2598":{"id":"n2598","loc":[-85.633946,41.945804]},"n2599":{"id":"n2599","loc":[-85.634102,41.945864]},"n26":{"id":"n26","loc":[-85.634346,41.942744]},"n260":{"id":"n260","loc":[-85.636827,41.941538]},"n2600":{"id":"n2600","loc":[-85.633819,41.945756]},"n2601":{"id":"n2601","loc":[-85.634025,41.945975]},"n2602":{"id":"n2602","loc":[-85.633742,41.945867]},"n2603":{"id":"n2603","loc":[-85.63373,41.946004]},"n2604":{"id":"n2604","loc":[-85.633947,41.946081]},"n2605":{"id":"n2605","loc":[-85.633872,41.945917]},"n2606":{"id":"n2606","loc":[-85.633825,41.945985]},"n2607":{"id":"n2607","loc":[-85.633762,41.94596]},"n2608":{"id":"n2608","loc":[-85.634224,41.946037]},"n2609":{"id":"n2609","loc":[-85.634357,41.945851]},"n261":{"id":"n261","loc":[-85.636828,41.941584]},"n2610":{"id":"n2610","loc":[-85.634398,41.945813]},"n2611":{"id":"n2611","loc":[-85.634461,41.945812]},"n2612":{"id":"n2612","loc":[-85.634501,41.945852]},"n2613":{"id":"n2613","loc":[-85.634503,41.94597]},"n2614":{"id":"n2614","loc":[-85.634462,41.945971]},"n2615":{"id":"n2615","loc":[-85.634465,41.946036]},"n2616":{"id":"n2616","loc":[-85.634235,41.946072]},"n2617":{"id":"n2617","loc":[-85.634447,41.946036]},"n2618":{"id":"n2618","loc":[-85.634448,41.946052]},"n2619":{"id":"n2619","loc":[-85.634494,41.946051]},"n262":{"id":"n262","loc":[-85.636819,41.941585]},"n2620":{"id":"n2620","loc":[-85.634497,41.946144]},"n2621":{"id":"n2621","loc":[-85.634453,41.946144]},"n2622":{"id":"n2622","loc":[-85.634454,41.94616]},"n2623":{"id":"n2623","loc":[-85.634393,41.946161]},"n2624":{"id":"n2624","loc":[-85.634394,41.94618]},"n2625":{"id":"n2625","loc":[-85.634345,41.94618]},"n2626":{"id":"n2626","loc":[-85.634344,41.946162]},"n2627":{"id":"n2627","loc":[-85.63427,41.946163]},"n2628":{"id":"n2628","loc":[-85.634266,41.946071]},"n2629":{"id":"n2629","loc":[-85.634148,41.946163]},"n263":{"id":"n263","loc":[-85.636854,41.941714]},"n2630":{"id":"n2630","loc":[-85.634213,41.946072]},"n2631":{"id":"n2631","loc":[-85.633293,41.946309]},"n2632":{"id":"n2632","loc":[-85.633122,41.946239]},"n2633":{"id":"n2633","loc":[-85.633295,41.946005]},"n2634":{"id":"n2634","loc":[-85.633395,41.946047]},"n2635":{"id":"n2635","loc":[-85.633404,41.946035]},"n2636":{"id":"n2636","loc":[-85.633459,41.946057]},"n2637":{"id":"n2637","loc":[-85.633387,41.946154]},"n2638":{"id":"n2638","loc":[-85.633403,41.946161]},"n2639":{"id":"n2639","loc":[-85.634176,41.946415]},"n264":{"id":"n264","loc":[-85.636855,41.941774]},"n2640":{"id":"n2640","loc":[-85.634179,41.946339]},"n2641":{"id":"n2641","loc":[-85.634455,41.946345]},"n2642":{"id":"n2642","loc":[-85.634452,41.946422]},"n2643":{"id":"n2643","loc":[-85.63437,41.946421]},"n2644":{"id":"n2644","loc":[-85.634367,41.946497]},"n2645":{"id":"n2645","loc":[-85.634289,41.946495]},"n2646":{"id":"n2646","loc":[-85.634291,41.946448]},"n2647":{"id":"n2647","loc":[-85.634269,41.946448]},"n2648":{"id":"n2648","loc":[-85.63427,41.946417]},"n2649":{"id":"n2649","loc":[-85.63484,41.946328]},"n265":{"id":"n265","loc":[-85.636822,41.941774]},"n2650":{"id":"n2650","loc":[-85.634839,41.946187]},"n2651":{"id":"n2651","loc":[-85.635148,41.946186]},"n2652":{"id":"n2652","loc":[-85.635148,41.946216]},"n2653":{"id":"n2653","loc":[-85.63521,41.946216]},"n2654":{"id":"n2654","loc":[-85.63521,41.946348]},"n2655":{"id":"n2655","loc":[-85.635154,41.946348]},"n2656":{"id":"n2656","loc":[-85.635153,41.946327]},"n2657":{"id":"n2657","loc":[-85.634037,41.946957]},"n2658":{"id":"n2658","loc":[-85.634253,41.946953]},"n2659":{"id":"n2659","loc":[-85.63481,41.946543]},"n266":{"id":"n266","loc":[-85.636822,41.941778]},"n2660":{"id":"n2660","loc":[-85.634809,41.946459]},"n2661":{"id":"n2661","loc":[-85.635154,41.946458]},"n2662":{"id":"n2662","loc":[-85.635155,41.946554]},"n2663":{"id":"n2663","loc":[-85.635022,41.946547]},"n2664":{"id":"n2664","loc":[-85.635022,41.946573]},"n2665":{"id":"n2665","loc":[-85.634909,41.946574]},"n2666":{"id":"n2666","loc":[-85.634909,41.946561]},"n2667":{"id":"n2667","loc":[-85.634896,41.947159]},"n2668":{"id":"n2668","loc":[-85.634894,41.947032]},"n2669":{"id":"n2669","loc":[-85.635024,41.947031]},"n267":{"id":"n267","loc":[-85.636756,41.941779]},"n2670":{"id":"n2670","loc":[-85.635026,41.947158]},"n2671":{"id":"n2671","loc":[-85.635233,41.947105]},"n2672":{"id":"n2672","loc":[-85.635236,41.946991]},"n2673":{"id":"n2673","loc":[-85.635369,41.946993]},"n2674":{"id":"n2674","loc":[-85.635366,41.947107]},"n2675":{"id":"n2675","loc":[-85.634824,41.946929]},"n2676":{"id":"n2676","loc":[-85.634825,41.946818]},"n2677":{"id":"n2677","loc":[-85.63512,41.946819]},"n2678":{"id":"n2678","loc":[-85.635119,41.94693]},"n2679":{"id":"n2679","loc":[-85.634796,41.946806]},"n268":{"id":"n268","loc":[-85.636756,41.941774]},"n2680":{"id":"n2680","loc":[-85.634792,41.946604]},"n2681":{"id":"n2681","loc":[-85.634948,41.946602]},"n2682":{"id":"n2682","loc":[-85.634949,41.946645]},"n2683":{"id":"n2683","loc":[-85.634975,41.946644]},"n2684":{"id":"n2684","loc":[-85.634974,41.946599]},"n2685":{"id":"n2685","loc":[-85.635117,41.946598]},"n2686":{"id":"n2686","loc":[-85.635122,41.946801]},"n2687":{"id":"n2687","loc":[-85.634981,41.946803]},"n2688":{"id":"n2688","loc":[-85.634979,41.946752]},"n2689":{"id":"n2689","loc":[-85.634952,41.946752]},"n269":{"id":"n269","loc":[-85.636721,41.941774]},"n2690":{"id":"n2690","loc":[-85.634953,41.946804]},"n2691":{"id":"n2691","loc":[-85.634649,41.946841]},"n2692":{"id":"n2692","loc":[-85.634331,41.94684]},"n2693":{"id":"n2693","loc":[-85.634183,41.946809]},"n2694":{"id":"n2694","loc":[-85.633699,41.946607]},"n2695":{"id":"n2695","loc":[-85.634487,41.946664]},"n2696":{"id":"n2696","loc":[-85.634486,41.946598]},"n2697":{"id":"n2697","loc":[-85.63423,41.946599]},"n2698":{"id":"n2698","loc":[-85.634231,41.946662]},"n2699":{"id":"n2699","loc":[-85.634284,41.946662]},"n27":{"id":"n27","loc":[-85.634136,41.943183]},"n270":{"id":"n270","loc":[-85.63672,41.941714]},"n2700":{"id":"n2700","loc":[-85.634284,41.946679]},"n2701":{"id":"n2701","loc":[-85.634365,41.946679]},"n2702":{"id":"n2702","loc":[-85.634365,41.946664]},"n2703":{"id":"n2703","loc":[-85.635443,41.947015]},"n2704":{"id":"n2704","loc":[-85.635442,41.946801]},"n2705":{"id":"n2705","loc":[-85.63603,41.9468]},"n2706":{"id":"n2706","loc":[-85.636028,41.947016]},"n2707":{"id":"n2707","loc":[-85.635457,41.946582]},"n2708":{"id":"n2708","loc":[-85.635455,41.946211]},"n2709":{"id":"n2709","loc":[-85.635636,41.946579]},"n271":{"id":"n271","loc":[-85.636767,41.941713]},"n2710":{"id":"n2710","loc":[-85.635716,41.9468]},"n2711":{"id":"n2711","loc":[-85.635969,41.9468]},"n2712":{"id":"n2712","loc":[-85.635973,41.946295]},"n2713":{"id":"n2713","loc":[-85.636019,41.946484]},"n2714":{"id":"n2714","loc":[-85.636022,41.946388]},"n2715":{"id":"n2715","loc":[-85.635961,41.946493]},"n2716":{"id":"n2716","loc":[-85.635713,41.94621]},"n2717":{"id":"n2717","loc":[-85.635416,41.946142]},"n2718":{"id":"n2718","loc":[-85.635759,41.946203]},"n2719":{"id":"n2719","loc":[-85.636153,41.946747]},"n272":{"id":"n272","loc":[-85.636767,41.941706]},"n2720":{"id":"n2720","loc":[-85.635417,41.946915]},"n2721":{"id":"n2721","loc":[-85.636154,41.946915]},"n2722":{"id":"n2722","loc":[-85.635866,41.946473]},"n2723":{"id":"n2723","loc":[-85.635717,41.946633]},"n2724":{"id":"n2724","loc":[-85.635556,41.946166]},"n2725":{"id":"n2725","loc":[-85.63556,41.946556]},"n2726":{"id":"n2726","loc":[-85.635731,41.946594]},"n2727":{"id":"n2727","loc":[-85.635866,41.946595]},"n2728":{"id":"n2728","loc":[-85.635456,41.947028]},"n2729":{"id":"n2729","loc":[-85.635796,41.947023]},"n273":{"id":"n273","loc":[-85.636779,41.941698]},"n2730":{"id":"n2730","loc":[-85.635798,41.947091]},"n2731":{"id":"n2731","loc":[-85.63573,41.947092]},"n2732":{"id":"n2732","loc":[-85.635733,41.947233]},"n2733":{"id":"n2733","loc":[-85.636283,41.946863]},"n2734":{"id":"n2734","loc":[-85.63628,41.946706]},"n2735":{"id":"n2735","loc":[-85.636341,41.946705]},"n2736":{"id":"n2736","loc":[-85.636273,41.946584]},"n2737":{"id":"n2737","loc":[-85.636396,41.946545]},"n2738":{"id":"n2738","loc":[-85.636474,41.946684]},"n2739":{"id":"n2739","loc":[-85.636511,41.946861]},"n274":{"id":"n274","loc":[-85.636798,41.941697]},"n2740":{"id":"n2740","loc":[-85.633713,41.947184]},"n2741":{"id":"n2741","loc":[-85.633651,41.94716]},"n2742":{"id":"n2742","loc":[-85.633704,41.947085]},"n2743":{"id":"n2743","loc":[-85.6336,41.947044]},"n2744":{"id":"n2744","loc":[-85.633506,41.947177]},"n2745":{"id":"n2745","loc":[-85.629586,41.952469]},"n2746":{"id":"n2746","loc":[-85.634723,41.953681]},"n2747":{"id":"n2747","loc":[-85.63478,41.959007]},"n2748":{"id":"n2748","loc":[-85.632793,41.94405],"tags":{"highway":"traffic_signals","traffic_signals":"signal"}},"n2749":{"id":"n2749","loc":[-85.634648,41.947325]},"n275":{"id":"n275","loc":[-85.63681,41.941705]},"n2750":{"id":"n2750","loc":[-85.625078,41.952097]},"n2751":{"id":"n2751","loc":[-85.633195,41.94734]},"n2752":{"id":"n2752","loc":[-85.626447,41.957168]},"n2753":{"id":"n2753","loc":[-85.632023,41.949012]},"n2754":{"id":"n2754","loc":[-85.630835,41.950656]},"n2755":{"id":"n2755","loc":[-85.634655,41.948612]},"n2756":{"id":"n2756","loc":[-85.636182,41.948605]},"n2757":{"id":"n2757","loc":[-85.634729,41.954667]},"n2758":{"id":"n2758","loc":[-85.634686,41.951159]},"n2759":{"id":"n2759","loc":[-85.636206,41.951146]},"n276":{"id":"n276","loc":[-85.63681,41.941714]},"n2760":{"id":"n2760","loc":[-85.634668,41.949891]},"n2761":{"id":"n2761","loc":[-85.634701,41.952422]},"n2762":{"id":"n2762","loc":[-85.634747,41.955907]},"n2763":{"id":"n2763","loc":[-85.627975,41.954695]},"n2764":{"id":"n2764","loc":[-85.626832,41.954698]},"n2765":{"id":"n2765","loc":[-85.632278,41.948624]},"n2766":{"id":"n2766","loc":[-85.628639,41.953725]},"n2767":{"id":"n2767","loc":[-85.636233,41.95241]},"n2768":{"id":"n2768","loc":[-85.631385,41.949913]},"n2769":{"id":"n2769","loc":[-85.630486,41.951194]},"n277":{"id":"n277","loc":[-85.636861,41.942041]},"n2770":{"id":"n2770","loc":[-85.624937,41.952088]},"n2771":{"id":"n2771","loc":[-85.624945,41.952022]},"n2772":{"id":"n2772","loc":[-85.636162,41.94731]},"n2773":{"id":"n2773","loc":[-85.636188,41.949881]},"n2774":{"id":"n2774","loc":[-85.631422,41.948294]},"n2775":{"id":"n2775","loc":[-85.632844,41.945547]},"n2776":{"id":"n2776","loc":[-85.632484,41.945344]},"n2777":{"id":"n2777","loc":[-85.631775,41.944636]},"n2778":{"id":"n2778","loc":[-85.632656,41.945471]},"n2779":{"id":"n2779","loc":[-85.631959,41.944827]},"n278":{"id":"n278","loc":[-85.636862,41.942099]},"n2780":{"id":"n2780","loc":[-85.631679,41.94438]},"n2781":{"id":"n2781","loc":[-85.625129,41.959272]},"n2782":{"id":"n2782","loc":[-85.632446,41.944861]},"n2783":{"id":"n2783","loc":[-85.632804,41.945477]},"n2784":{"id":"n2784","loc":[-85.632255,41.944962]},"n2785":{"id":"n2785","loc":[-85.632736,41.944757]},"n2786":{"id":"n2786","loc":[-85.632543,41.94486]},"n2787":{"id":"n2787","loc":[-85.632889,41.945561]},"n2788":{"id":"n2788","loc":[-85.632091,41.944949]},"n2789":{"id":"n2789","loc":[-85.632537,41.944713]},"n279":{"id":"n279","loc":[-85.636807,41.942099]},"n2790":{"id":"n2790","loc":[-85.632279,41.94485]},"n2791":{"id":"n2791","loc":[-85.632749,41.943247]},"n2792":{"id":"n2792","loc":[-85.632824,41.943152]},"n2793":{"id":"n2793","loc":[-85.632929,41.94317]},"n2794":{"id":"n2794","loc":[-85.632897,41.943078]},"n2795":{"id":"n2795","loc":[-85.632626,41.943231]},"n2796":{"id":"n2796","loc":[-85.634048,41.947257]},"n2797":{"id":"n2797","loc":[-85.634264,41.947252]},"n2798":{"id":"n2798","loc":[-85.635418,41.947317]},"n2799":{"id":"n2799","loc":[-85.635461,41.947237]},"n28":{"id":"n28","loc":[-85.63821,41.944308]},"n280":{"id":"n280","loc":[-85.636807,41.942126]},"n2800":{"id":"n2800","loc":[-85.632868,41.946229]},"n2801":{"id":"n2801","loc":[-85.633673,41.947242]},"n2802":{"id":"n2802","loc":[-85.623604,41.945881],"tags":{"amenity":"school","name":"Barrows School"}},"n2803":{"id":"n2803","loc":[-85.627401,41.943496]},"n2804":{"id":"n2804","loc":[-85.627403,41.943625]},"n2805":{"id":"n2805","loc":[-85.626409,41.943215]},"n2806":{"id":"n2806","loc":[-85.624884,41.943508]},"n2807":{"id":"n2807","loc":[-85.625191,41.943509]},"n2808":{"id":"n2808","loc":[-85.624882,41.94382]},"n2809":{"id":"n2809","loc":[-85.624893,41.945618]},"n281":{"id":"n281","loc":[-85.636726,41.942126]},"n2810":{"id":"n2810","loc":[-85.624912,41.946524]},"n2811":{"id":"n2811","loc":[-85.622721,41.946535]},"n2812":{"id":"n2812","loc":[-85.627399,41.94469]},"n2813":{"id":"n2813","loc":[-85.622716,41.945622]},"n2814":{"id":"n2814","loc":[-85.624886,41.944724]},"n2815":{"id":"n2815","loc":[-85.622674,41.944737]},"n2816":{"id":"n2816","loc":[-85.625092,41.945063]},"n2817":{"id":"n2817","loc":[-85.625233,41.945064]},"n2818":{"id":"n2818","loc":[-85.625229,41.944871]},"n2819":{"id":"n2819","loc":[-85.625066,41.944871]},"n282":{"id":"n282","loc":[-85.636726,41.942098]},"n2820":{"id":"n2820","loc":[-85.625024,41.944901]},"n2821":{"id":"n2821","loc":[-85.625025,41.944924]},"n2822":{"id":"n2822","loc":[-85.625087,41.944926]},"n2823":{"id":"n2823","loc":[-85.625349,41.944506]},"n2824":{"id":"n2824","loc":[-85.625347,41.944388]},"n2825":{"id":"n2825","loc":[-85.625152,41.94439]},"n2826":{"id":"n2826","loc":[-85.625152,41.944431]},"n2827":{"id":"n2827","loc":[-85.625134,41.944431]},"n2828":{"id":"n2828","loc":[-85.625136,41.944508]},"n2829":{"id":"n2829","loc":[-85.623236,41.946341]},"n283":{"id":"n283","loc":[-85.636708,41.942098]},"n2830":{"id":"n2830","loc":[-85.623241,41.946067]},"n2831":{"id":"n2831","loc":[-85.623207,41.946067]},"n2832":{"id":"n2832","loc":[-85.623212,41.945827]},"n2833":{"id":"n2833","loc":[-85.622981,41.945825]},"n2834":{"id":"n2834","loc":[-85.622976,41.946063]},"n2835":{"id":"n2835","loc":[-85.623006,41.946063]},"n2836":{"id":"n2836","loc":[-85.623002,41.946256]},"n2837":{"id":"n2837","loc":[-85.623075,41.946256]},"n2838":{"id":"n2838","loc":[-85.623074,41.946339]},"n2839":{"id":"n2839","loc":[-85.624574,41.951755]},"n284":{"id":"n284","loc":[-85.636708,41.942041]},"n2840":{"id":"n2840","loc":[-85.62498,41.951844]},"n2841":{"id":"n2841","loc":[-85.625086,41.95188]},"n2842":{"id":"n2842","loc":[-85.625135,41.951922]},"n2843":{"id":"n2843","loc":[-85.615273,41.945637]},"n2844":{"id":"n2844","loc":[-85.620172,41.945627]},"n2845":{"id":"n2845","loc":[-85.625167,41.951985]},"n2846":{"id":"n2846","loc":[-85.622741,41.947437]},"n2847":{"id":"n2847","loc":[-85.624907,41.947428]},"n2848":{"id":"n2848","loc":[-85.627046,41.940995]},"n2849":{"id":"n2849","loc":[-85.627295,41.941304]},"n285":{"id":"n285","loc":[-85.635618,41.941852]},"n2850":{"id":"n2850","loc":[-85.627352,41.94148]},"n2851":{"id":"n2851","loc":[-85.62737,41.942261]},"n2852":{"id":"n2852","loc":[-85.6264,41.942263]},"n2853":{"id":"n2853","loc":[-85.622769,41.949228]},"n2854":{"id":"n2854","loc":[-85.624937,41.949218]},"n2855":{"id":"n2855","loc":[-85.630001,41.944664]},"n2856":{"id":"n2856","loc":[-85.624873,41.942022]},"n2857":{"id":"n2857","loc":[-85.622761,41.948333]},"n2858":{"id":"n2858","loc":[-85.624924,41.948334]},"n2859":{"id":"n2859","loc":[-85.620051,41.94383]},"n286":{"id":"n286","loc":[-85.635621,41.94202]},"n2860":{"id":"n2860","loc":[-85.627629,41.946498]},"n2861":{"id":"n2861","loc":[-85.622757,41.950111]},"n2862":{"id":"n2862","loc":[-85.623685,41.954624]},"n2863":{"id":"n2863","loc":[-85.621459,41.944756]},"n2864":{"id":"n2864","loc":[-85.628637,41.944676]},"n2865":{"id":"n2865","loc":[-85.630125,41.944654]},"n2866":{"id":"n2866","loc":[-85.625196,41.952097]},"n2867":{"id":"n2867","loc":[-85.630257,41.944637]},"n2868":{"id":"n2868","loc":[-85.631247,41.944459]},"n2869":{"id":"n2869","loc":[-85.624867,41.94159]},"n287":{"id":"n287","loc":[-85.63524,41.942023]},"n2870":{"id":"n2870","loc":[-85.624958,41.950343]},"n2871":{"id":"n2871","loc":[-85.624948,41.950484]},"n2872":{"id":"n2872","loc":[-85.624813,41.950983]},"n2873":{"id":"n2873","loc":[-85.624723,41.951789]},"n2874":{"id":"n2874","loc":[-85.624262,41.9512]},"n2875":{"id":"n2875","loc":[-85.62414,41.951201]},"n2876":{"id":"n2876","loc":[-85.624139,41.95112]},"n2877":{"id":"n2877","loc":[-85.628481,41.945611]},"n2878":{"id":"n2878","loc":[-85.620072,41.946538]},"n2879":{"id":"n2879","loc":[-85.622763,41.95099]},"n288":{"id":"n288","loc":[-85.635237,41.941855]},"n2880":{"id":"n2880","loc":[-85.62814,41.946963]},"n2881":{"id":"n2881","loc":[-85.628245,41.947031]},"n2882":{"id":"n2882","loc":[-85.628331,41.947066]},"n2883":{"id":"n2883","loc":[-85.629722,41.944444],"tags":{"leisure":"park","name":"Scouter Park"}},"n2884":{"id":"n2884","loc":[-85.629977,41.943907]},"n2885":{"id":"n2885","loc":[-85.629947,41.943775]},"n2886":{"id":"n2886","loc":[-85.629899,41.943625]},"n2887":{"id":"n2887","loc":[-85.632286,41.944257]},"n2888":{"id":"n2888","loc":[-85.632523,41.944179]},"n2889":{"id":"n2889","loc":[-85.632141,41.944293]},"n289":{"id":"n289","loc":[-85.635568,41.940475]},"n2890":{"id":"n2890","loc":[-85.631571,41.9444]},"n2891":{"id":"n2891","loc":[-85.643236,41.941895]},"n2892":{"id":"n2892","loc":[-85.62865,41.945353]},"n2893":{"id":"n2893","loc":[-85.628594,41.945481]},"n2894":{"id":"n2894","loc":[-85.628581,41.947169]},"n2895":{"id":"n2895","loc":[-85.631843,41.943793]},"n2896":{"id":"n2896","loc":[-85.632299,41.943472]},"n2897":{"id":"n2897","loc":[-85.631519,41.944881]},"n2898":{"id":"n2898","loc":[-85.628429,41.947219]},"n2899":{"id":"n2899","loc":[-85.63145,41.945162]},"n29":{"id":"n29","loc":[-85.637963,41.944263]},"n290":{"id":"n290","loc":[-85.634584,41.940477]},"n2900":{"id":"n2900","loc":[-85.630939,41.945519]},"n2901":{"id":"n2901","loc":[-85.62903,41.945719]},"n2902":{"id":"n2902","loc":[-85.630521,41.945559]},"n2903":{"id":"n2903","loc":[-85.629294,41.945585]},"n2904":{"id":"n2904","loc":[-85.629845,41.945543]},"n2905":{"id":"n2905","loc":[-85.631497,41.944625]},"n2906":{"id":"n2906","loc":[-85.630281,41.945553]},"n2907":{"id":"n2907","loc":[-85.628553,41.946973]},"n2908":{"id":"n2908","loc":[-85.631383,41.945338]},"n2909":{"id":"n2909","loc":[-85.628843,41.946103]},"n291":{"id":"n291","loc":[-85.634583,41.940203]},"n2910":{"id":"n2910","loc":[-85.631193,41.945473]},"n2911":{"id":"n2911","loc":[-85.628897,41.945944]},"n2912":{"id":"n2912","loc":[-85.628789,41.946454]},"n2913":{"id":"n2913","loc":[-85.632548,41.944563]},"n2914":{"id":"n2914","loc":[-85.627527,41.944555]},"n2915":{"id":"n2915","loc":[-85.62752,41.943726]},"n2916":{"id":"n2916","loc":[-85.627894,41.943723]},"n2917":{"id":"n2917","loc":[-85.627897,41.943919]},"n2918":{"id":"n2918","loc":[-85.627991,41.943934]},"n2919":{"id":"n2919","loc":[-85.628082,41.943966]},"n292":{"id":"n292","loc":[-85.635567,41.940201]},"n2920":{"id":"n2920","loc":[-85.628177,41.944015]},"n2921":{"id":"n2921","loc":[-85.628193,41.944048]},"n2922":{"id":"n2922","loc":[-85.628167,41.944054]},"n2923":{"id":"n2923","loc":[-85.628193,41.944094]},"n2924":{"id":"n2924","loc":[-85.628213,41.944144]},"n2925":{"id":"n2925","loc":[-85.628214,41.944199]},"n2926":{"id":"n2926","loc":[-85.62833,41.944196]},"n2927":{"id":"n2927","loc":[-85.628328,41.944262]},"n2928":{"id":"n2928","loc":[-85.628173,41.944262]},"n2929":{"id":"n2929","loc":[-85.628171,41.944293]},"n293":{"id":"n293","loc":[-85.635816,41.942673],"tags":{"crossing":"zebra","highway":"crossing"}},"n2930":{"id":"n2930","loc":[-85.628039,41.944296]},"n2931":{"id":"n2931","loc":[-85.62804,41.944329]},"n2932":{"id":"n2932","loc":[-85.627829,41.944335]},"n2933":{"id":"n2933","loc":[-85.627835,41.94455]},"n2936":{"id":"n2936","loc":[-85.632823,41.945994]},"n294":{"id":"n294","loc":[-85.635696,41.942712]},"n2940":{"id":"n2940","loc":[-85.632192,41.945973]},"n2941":{"id":"n2941","loc":[-85.63226,41.94587]},"n2942":{"id":"n2942","loc":[-85.632721,41.946036]},"n2943":{"id":"n2943","loc":[-85.632641,41.946142]},"n2944":{"id":"n2944","loc":[-85.62937,41.947467]},"n2945":{"id":"n2945","loc":[-85.62959,41.942936]},"n2946":{"id":"n2946","loc":[-85.629551,41.94284]},"n2947":{"id":"n2947","loc":[-85.629501,41.942704]},"n2948":{"id":"n2948","loc":[-85.629472,41.942578]},"n2949":{"id":"n2949","loc":[-85.629361,41.941801]},"n295":{"id":"n295","loc":[-85.635679,41.941962]},"n2950":{"id":"n2950","loc":[-85.629339,41.941716]},"n2951":{"id":"n2951","loc":[-85.629315,41.94166]},"n2952":{"id":"n2952","loc":[-85.629279,41.941602]},"n2953":{"id":"n2953","loc":[-85.629227,41.941556]},"n2954":{"id":"n2954","loc":[-85.624261,41.95112]},"n2955":{"id":"n2955","loc":[-85.629153,41.941524]},"n2956":{"id":"n2956","loc":[-85.626904,41.941098]},"n2957":{"id":"n2957","loc":[-85.624588,41.951294]},"n2958":{"id":"n2958","loc":[-85.631844,41.942945]},"n2959":{"id":"n2959","loc":[-85.625854,41.949222]},"n296":{"id":"n296","loc":[-85.635672,41.941337]},"n2960":{"id":"n2960","loc":[-85.625146,41.955238]},"n2961":{"id":"n2961","loc":[-85.626745,41.948296]},"n2962":{"id":"n2962","loc":[-85.625721,41.95524]},"n2963":{"id":"n2963","loc":[-85.624706,41.952317]},"n2964":{"id":"n2964","loc":[-85.62609,41.956147]},"n2965":{"id":"n2965","loc":[-85.624401,41.954928]},"n2966":{"id":"n2966","loc":[-85.626558,41.955367]},"n2967":{"id":"n2967","loc":[-85.62468,41.955096]},"n2968":{"id":"n2968","loc":[-85.624159,41.953929]},"n2969":{"id":"n2969","loc":[-85.62506,41.951113]},"n297":{"id":"n297","loc":[-85.635658,41.941284]},"n2970":{"id":"n2970","loc":[-85.624942,41.951591]},"n2971":{"id":"n2971","loc":[-85.627399,41.947546]},"n2972":{"id":"n2972","loc":[-85.627695,41.947404]},"n2973":{"id":"n2973","loc":[-85.625925,41.94896]},"n2974":{"id":"n2974","loc":[-85.625725,41.950211]},"n2975":{"id":"n2975","loc":[-85.627008,41.947963]},"n2976":{"id":"n2976","loc":[-85.624373,41.953458]},"n2977":{"id":"n2977","loc":[-85.624137,41.954392]},"n2978":{"id":"n2978","loc":[-85.628257,41.947307]},"n2979":{"id":"n2979","loc":[-85.625281,41.95066]},"n298":{"id":"n298","loc":[-85.635602,41.941166]},"n2980":{"id":"n2980","loc":[-85.625865,41.949804]},"n2981":{"id":"n2981","loc":[-85.626508,41.955932]},"n2982":{"id":"n2982","loc":[-85.626333,41.955216]},"n2983":{"id":"n2983","loc":[-85.626637,41.955676]},"n2984":{"id":"n2984","loc":[-85.624223,41.954599]},"n2985":{"id":"n2985","loc":[-85.626219,41.948671]},"n2986":{"id":"n2986","loc":[-85.624556,41.953043]},"n2987":{"id":"n2987","loc":[-85.625598,41.956302]},"n2988":{"id":"n2988","loc":[-85.624571,41.952971]},"n2989":{"id":"n2989","loc":[-85.627141,41.940727]},"n299":{"id":"n299","loc":[-85.635598,41.941138]},"n2990":{"id":"n2990","loc":[-85.627102,41.939144]},"n2991":{"id":"n2991","loc":[-85.627127,41.940086]},"n2992":{"id":"n2992","loc":[-85.627116,41.940843]},"n2993":{"id":"n2993","loc":[-85.627132,41.9402]},"n2994":{"id":"n2994","loc":[-85.629734,41.940078]},"n2995":{"id":"n2995","loc":[-85.6276,41.937412]},"n2996":{"id":"n2996","loc":[-85.627451,41.937549]},"n2997":{"id":"n2997","loc":[-85.627375,41.937618]},"n2998":{"id":"n2998","loc":[-85.627278,41.937728]},"n2999":{"id":"n2999","loc":[-85.627199,41.937842]},"n3":{"id":"n3","loc":[-85.627345,41.953983]},"n30":{"id":"n30","loc":[-85.637882,41.944205]},"n300":{"id":"n300","loc":[-85.635614,41.941076]},"n3000":{"id":"n3000","loc":[-85.627141,41.937981]},"n3001":{"id":"n3001","loc":[-85.627109,41.938153]},"n3002":{"id":"n3002","loc":[-85.627101,41.938699]},"n3003":{"id":"n3003","loc":[-85.628311,41.942261]},"n3004":{"id":"n3004","loc":[-85.628439,41.940082]},"n3005":{"id":"n3005","loc":[-85.619538,41.942622],"tags":{"leisure":"slipway"}},"n3006":{"id":"n3006","loc":[-85.619872,41.942618]},"n3007":{"id":"n3007","loc":[-85.619755,41.942612]},"n3008":{"id":"n3008","loc":[-85.619647,41.942628]},"n3009":{"id":"n3009","loc":[-85.619415,41.942626]},"n301":{"id":"n301","loc":[-85.635659,41.940956]},"n3010":{"id":"n3010","loc":[-85.619212,41.942623]},"n3011":{"id":"n3011","loc":[-85.631485,41.942472]},"n3012":{"id":"n3012","loc":[-85.630986,41.941786]},"n3013":{"id":"n3013","loc":[-85.631797,41.942006]},"n3014":{"id":"n3014","loc":[-85.630972,41.941162]},"n3015":{"id":"n3015","loc":[-85.631396,41.941611],"tags":{"railway":"level_crossing"}},"n3016":{"id":"n3016","loc":[-85.631878,41.941545]},"n3017":{"id":"n3017","loc":[-85.630461,41.94055]},"n3018":{"id":"n3018","loc":[-85.629751,41.939539],"tags":{"railway":"level_crossing"}},"n3019":{"id":"n3019","loc":[-85.631663,41.941513]},"n302":{"id":"n302","loc":[-85.635666,41.940922]},"n3020":{"id":"n3020","loc":[-85.631328,41.941375]},"n3021":{"id":"n3021","loc":[-85.632554,41.941779]},"n3022":{"id":"n3022","loc":[-85.63245,41.941769]},"n3023":{"id":"n3023","loc":[-85.632475,41.941644]},"n3024":{"id":"n3024","loc":[-85.632581,41.941654]},"n3025":{"id":"n3025","loc":[-85.631957,41.941352]},"n3026":{"id":"n3026","loc":[-85.632293,41.941139]},"n3027":{"id":"n3027","loc":[-85.632315,41.941153]},"n3028":{"id":"n3028","loc":[-85.632302,41.941262]},"n3029":{"id":"n3029","loc":[-85.63237,41.941267]},"n303":{"id":"n303","loc":[-85.635667,41.940877]},"n3030":{"id":"n3030","loc":[-85.632356,41.941538]},"n3031":{"id":"n3031","loc":[-85.632134,41.941678]},"n3032":{"id":"n3032","loc":[-85.631942,41.941687]},"n3033":{"id":"n3033","loc":[-85.63203,41.941694]},"n3034":{"id":"n3034","loc":[-85.632166,41.941555]},"n3035":{"id":"n3035","loc":[-85.632412,41.941416]},"n3036":{"id":"n3036","loc":[-85.63248,41.941342]},"n3037":{"id":"n3037","loc":[-85.632502,41.941259]},"n3038":{"id":"n3038","loc":[-85.632453,41.941161]},"n3039":{"id":"n3039","loc":[-85.63235,41.941103]},"n304":{"id":"n304","loc":[-85.635668,41.940655]},"n3040":{"id":"n3040","loc":[-85.632236,41.941118]},"n3041":{"id":"n3041","loc":[-85.631894,41.941355]},"n3042":{"id":"n3042","loc":[-85.631859,41.941411]},"n3043":{"id":"n3043","loc":[-85.632011,41.941587]},"n3044":{"id":"n3044","loc":[-85.632446,41.941379]},"n3045":{"id":"n3045","loc":[-85.632511,41.941416]},"n3046":{"id":"n3046","loc":[-85.632545,41.941634]},"n3047":{"id":"n3047","loc":[-85.632612,41.94164]},"n3048":{"id":"n3048","loc":[-85.632595,41.942197]},"n3049":{"id":"n3049","loc":[-85.632565,41.942241]},"n305":{"id":"n305","loc":[-85.635628,41.940617]},"n3050":{"id":"n3050","loc":[-85.632515,41.942256]},"n3051":{"id":"n3051","loc":[-85.63245,41.94223]},"n3052":{"id":"n3052","loc":[-85.632401,41.942174]},"n3053":{"id":"n3053","loc":[-85.632391,41.942115]},"n3054":{"id":"n3054","loc":[-85.632029,41.941859]},"n3055":{"id":"n3055","loc":[-85.631828,41.941639]},"n3056":{"id":"n3056","loc":[-85.631829,41.941508]},"n3057":{"id":"n3057","loc":[-85.631281,41.94312]},"n3058":{"id":"n3058","loc":[-85.631421,41.943065]},"n3059":{"id":"n3059","loc":[-85.631339,41.942949]},"n306":{"id":"n306","loc":[-85.635623,41.940272]},"n3060":{"id":"n3060","loc":[-85.631199,41.943004]},"n3061":{"id":"n3061","loc":[-85.631102,41.942931]},"n3062":{"id":"n3062","loc":[-85.631009,41.942809]},"n3063":{"id":"n3063","loc":[-85.631383,41.94265]},"n3064":{"id":"n3064","loc":[-85.631477,41.942773]},"n3065":{"id":"n3065","loc":[-85.630638,41.942809]},"n3066":{"id":"n3066","loc":[-85.630738,41.942943]},"n3067":{"id":"n3067","loc":[-85.630841,41.9429]},"n3068":{"id":"n3068","loc":[-85.630741,41.942766]},"n3069":{"id":"n3069","loc":[-85.63054,41.942603]},"n307":{"id":"n307","loc":[-85.635651,41.940183]},"n3070":{"id":"n3070","loc":[-85.630498,41.942619]},"n3071":{"id":"n3071","loc":[-85.630567,41.942718]},"n3072":{"id":"n3072","loc":[-85.630616,41.942698]},"n3073":{"id":"n3073","loc":[-85.630642,41.94273]},"n3074":{"id":"n3074","loc":[-85.630686,41.942714]},"n3075":{"id":"n3075","loc":[-85.630715,41.942754]},"n3076":{"id":"n3076","loc":[-85.6309,41.942681]},"n3077":{"id":"n3077","loc":[-85.630843,41.942605]},"n3078":{"id":"n3078","loc":[-85.6309,41.942581]},"n3079":{"id":"n3079","loc":[-85.630832,41.942487]},"n308":{"id":"n308","loc":[-85.63577,41.940183],"tags":{"crossing":"zebra","highway":"crossing"}},"n3080":{"id":"n3080","loc":[-85.630773,41.942509]},"n3081":{"id":"n3081","loc":[-85.630718,41.942436]},"n3082":{"id":"n3082","loc":[-85.630485,41.942524]},"n3083":{"id":"n3083","loc":[-85.631468,41.941233]},"n3084":{"id":"n3084","loc":[-85.631334,41.94114]},"n3085":{"id":"n3085","loc":[-85.632052,41.940568]},"n3086":{"id":"n3086","loc":[-85.63219,41.940663]},"n3087":{"id":"n3087","loc":[-85.631323,41.940834]},"n3088":{"id":"n3088","loc":[-85.631122,41.941002]},"n3089":{"id":"n3089","loc":[-85.631321,41.941133]},"n309":{"id":"n309","loc":[-85.636939,41.942544]},"n3090":{"id":"n3090","loc":[-85.631521,41.940966]},"n3091":{"id":"n3091","loc":[-85.631103,41.940253]},"n3092":{"id":"n3092","loc":[-85.631226,41.940211]},"n3093":{"id":"n3093","loc":[-85.631597,41.940805]},"n3094":{"id":"n3094","loc":[-85.631474,41.940847]},"n3095":{"id":"n3095","loc":[-85.631811,41.940534]},"n3096":{"id":"n3096","loc":[-85.631588,41.94061]},"n3097":{"id":"n3097","loc":[-85.631438,41.940366]},"n3098":{"id":"n3098","loc":[-85.631661,41.94029]},"n3099":{"id":"n3099","loc":[-85.630621,41.940041]},"n31":{"id":"n31","loc":[-85.63827,41.944203]},"n310":{"id":"n310","loc":[-85.636323,41.942552]},"n3100":{"id":"n3100","loc":[-85.630436,41.939773]},"n3101":{"id":"n3101","loc":[-85.63059,41.939714]},"n3102":{"id":"n3102","loc":[-85.630775,41.939983]},"n3103":{"id":"n3103","loc":[-85.63047,41.940167]},"n3104":{"id":"n3104","loc":[-85.63013,41.939686]},"n3105":{"id":"n3105","loc":[-85.630302,41.939618]},"n3106":{"id":"n3106","loc":[-85.630641,41.9401]},"n3107":{"id":"n3107","loc":[-85.630966,41.940619]},"n3108":{"id":"n3108","loc":[-85.630874,41.940493]},"n3109":{"id":"n3109","loc":[-85.630933,41.940469]},"n311":{"id":"n311","loc":[-85.636257,41.942555]},"n3110":{"id":"n3110","loc":[-85.630763,41.940236]},"n3111":{"id":"n3111","loc":[-85.63088,41.940189]},"n3112":{"id":"n3112","loc":[-85.631142,41.940548]},"n3113":{"id":"n3113","loc":[-85.630958,41.940871]},"n3114":{"id":"n3114","loc":[-85.630874,41.940778]},"n3115":{"id":"n3115","loc":[-85.631062,41.940684]},"n3116":{"id":"n3116","loc":[-85.631146,41.940777]},"n3117":{"id":"n3117","loc":[-85.632031,41.940575]},"n3118":{"id":"n3118","loc":[-85.631777,41.940186]},"n3119":{"id":"n3119","loc":[-85.631346,41.940179]},"n312":{"id":"n312","loc":[-85.636208,41.942561]},"n3120":{"id":"n3120","loc":[-85.631342,41.94012]},"n3121":{"id":"n3121","loc":[-85.631831,41.940118]},"n3122":{"id":"n3122","loc":[-85.632115,41.940543]},"n3123":{"id":"n3123","loc":[-85.631031,41.941683]},"n3124":{"id":"n3124","loc":[-85.630981,41.941608]},"n3125":{"id":"n3125","loc":[-85.631209,41.941516]},"n3126":{"id":"n3126","loc":[-85.631264,41.941586]},"n3127":{"id":"n3127","loc":[-85.630938,41.94155]},"n3128":{"id":"n3128","loc":[-85.631156,41.941462]},"n3129":{"id":"n3129","loc":[-85.631197,41.94152]},"n313":{"id":"n313","loc":[-85.636159,41.942573]},"n3130":{"id":"n3130","loc":[-85.630895,41.941485]},"n3131":{"id":"n3131","loc":[-85.630824,41.941389]},"n3132":{"id":"n3132","loc":[-85.630986,41.941323]},"n3133":{"id":"n3133","loc":[-85.631057,41.941419]},"n3134":{"id":"n3134","loc":[-85.630777,41.941328]},"n3135":{"id":"n3135","loc":[-85.630907,41.941274]},"n3136":{"id":"n3136","loc":[-85.630953,41.941335]},"n3137":{"id":"n3137","loc":[-85.630797,41.941247]},"n3138":{"id":"n3138","loc":[-85.630701,41.94117]},"n3139":{"id":"n3139","loc":[-85.630829,41.941113]},"n314":{"id":"n314","loc":[-85.635743,41.942881]},"n3140":{"id":"n3140","loc":[-85.6309,41.941201]},"n3141":{"id":"n3141","loc":[-85.630765,41.941206]},"n3142":{"id":"n3142","loc":[-85.630739,41.941218]},"n3143":{"id":"n3143","loc":[-85.630582,41.941039]},"n3144":{"id":"n3144","loc":[-85.630412,41.940818]},"n3145":{"id":"n3145","loc":[-85.630509,41.940777]},"n3146":{"id":"n3146","loc":[-85.630678,41.941004]},"n3147":{"id":"n3147","loc":[-85.630773,41.942166]},"n3148":{"id":"n3148","loc":[-85.630708,41.942074]},"n3149":{"id":"n3149","loc":[-85.630863,41.942013]},"n315":{"id":"n315","loc":[-85.635452,41.942966]},"n3150":{"id":"n3150","loc":[-85.630928,41.942105]},"n3151":{"id":"n3151","loc":[-85.630701,41.942026]},"n3152":{"id":"n3152","loc":[-85.630665,41.941971]},"n3153":{"id":"n3153","loc":[-85.630793,41.941918]},"n3154":{"id":"n3154","loc":[-85.630837,41.94197]},"n3155":{"id":"n3155","loc":[-85.630757,41.941871]},"n3156":{"id":"n3156","loc":[-85.630629,41.941923]},"n3157":{"id":"n3157","loc":[-85.630694,41.941783]},"n3158":{"id":"n3158","loc":[-85.630534,41.941847]},"n3159":{"id":"n3159","loc":[-85.630598,41.941935]},"n316":{"id":"n316","loc":[-85.634911,41.943118]},"n3160":{"id":"n3160","loc":[-85.631548,41.93938]},"n3161":{"id":"n3161","loc":[-85.631525,41.939919]},"n3162":{"id":"n3162","loc":[-85.631648,41.940043]},"n3163":{"id":"n3163","loc":[-85.624586,41.951121]},"n3164":{"id":"n3164","loc":[-85.622139,41.952064]},"n3165":{"id":"n3165","loc":[-85.622141,41.952144]},"n3166":{"id":"n3166","loc":[-85.621977,41.952146]},"n3167":{"id":"n3167","loc":[-85.621978,41.952211]},"n3168":{"id":"n3168","loc":[-85.62191,41.952212]},"n3169":{"id":"n3169","loc":[-85.633628,41.935437]},"n317":{"id":"n317","loc":[-85.634743,41.943167]},"n3170":{"id":"n3170","loc":[-85.632849,41.935518]},"n3171":{"id":"n3171","loc":[-85.632376,41.93574]},"n3172":{"id":"n3172","loc":[-85.631517,41.935897]},"n3173":{"id":"n3173","loc":[-85.630433,41.936124]},"n3174":{"id":"n3174","loc":[-85.630207,41.936427]},"n3175":{"id":"n3175","loc":[-85.630346,41.936795]},"n3176":{"id":"n3176","loc":[-85.62996,41.936974]},"n3177":{"id":"n3177","loc":[-85.629916,41.937488]},"n3178":{"id":"n3178","loc":[-85.629946,41.937802]},"n3179":{"id":"n3179","loc":[-85.629977,41.937905]},"n318":{"id":"n318","loc":[-85.634401,41.94328]},"n3180":{"id":"n3180","loc":[-85.63016,41.937909]},"n3181":{"id":"n3181","loc":[-85.630804,41.937791]},"n3182":{"id":"n3182","loc":[-85.631688,41.937808]},"n3183":{"id":"n3183","loc":[-85.631685,41.938008]},"n3184":{"id":"n3184","loc":[-85.631845,41.938116]},"n3185":{"id":"n3185","loc":[-85.63207,41.938181]},"n3186":{"id":"n3186","loc":[-85.632143,41.938371]},"n3187":{"id":"n3187","loc":[-85.632056,41.938435]},"n3188":{"id":"n3188","loc":[-85.631787,41.938457]},"n3189":{"id":"n3189","loc":[-85.631657,41.938728]},"n319":{"id":"n319","loc":[-85.634345,41.943299]},"n3190":{"id":"n3190","loc":[-85.631595,41.93775]},"n3191":{"id":"n3191","loc":[-85.630264,41.937839]},"n3192":{"id":"n3192","loc":[-85.628591,41.948536]},"n3193":{"id":"n3193","loc":[-85.63205,41.951181]},"n3194":{"id":"n3194","loc":[-85.632034,41.949909]},"n3195":{"id":"n3195","loc":[-85.630841,41.951191]},"n3196":{"id":"n3196","loc":[-85.632083,41.9537]},"n3197":{"id":"n3197","loc":[-85.630929,41.959037]},"n3198":{"id":"n3198","loc":[-85.632151,41.959028]},"n3199":{"id":"n3199","loc":[-85.630911,41.957428]},"n32":{"id":"n32","loc":[-85.638273,41.944246]},"n320":{"id":"n320","loc":[-85.634287,41.943326]},"n3200":{"id":"n3200","loc":[-85.63213,41.957427]},"n3201":{"id":"n3201","loc":[-85.632072,41.952447]},"n3202":{"id":"n3202","loc":[-85.632095,41.954677]},"n3203":{"id":"n3203","loc":[-85.632111,41.955911]},"n3204":{"id":"n3204","loc":[-85.630855,41.952457]},"n3205":{"id":"n3205","loc":[-85.630869,41.953709]},"n3206":{"id":"n3206","loc":[-85.63088,41.954682]},"n3207":{"id":"n3207","loc":[-85.630894,41.955913]},"n3208":{"id":"n3208","loc":[-85.633214,41.948619]},"n3209":{"id":"n3209","loc":[-85.633253,41.951171]},"n321":{"id":"n321","loc":[-85.634233,41.943354]},"n3210":{"id":"n3210","loc":[-85.633234,41.949901]},"n3211":{"id":"n3211","loc":[-85.633922,41.948616]},"n3212":{"id":"n3212","loc":[-85.625188,41.947832]},"n3213":{"id":"n3213","loc":[-85.625208,41.947775]},"n3214":{"id":"n3214","loc":[-85.625229,41.94776]},"n3215":{"id":"n3215","loc":[-85.625201,41.947749]},"n3216":{"id":"n3216","loc":[-85.625168,41.947707]},"n3217":{"id":"n3217","loc":[-85.625171,41.947609]},"n3218":{"id":"n3218","loc":[-85.625213,41.947564]},"n3219":{"id":"n3219","loc":[-85.62529,41.94756]},"n322":{"id":"n322","loc":[-85.634099,41.943429]},"n3220":{"id":"n3220","loc":[-85.625303,41.947533]},"n3221":{"id":"n3221","loc":[-85.625344,41.947482]},"n3222":{"id":"n3222","loc":[-85.625442,41.947468]},"n3223":{"id":"n3223","loc":[-85.62565,41.947494]},"n3224":{"id":"n3224","loc":[-85.625726,41.947613]},"n3225":{"id":"n3225","loc":[-85.625703,41.947728]},"n3226":{"id":"n3226","loc":[-85.625534,41.94781]},"n3227":{"id":"n3227","loc":[-85.625391,41.947822]},"n3228":{"id":"n3228","loc":[-85.625304,41.947859]},"n3229":{"id":"n3229","loc":[-85.625203,41.947885]},"n323":{"id":"n323","loc":[-85.633958,41.943507],"tags":{"highway":"crossing"}},"n3230":{"id":"n3230","loc":[-85.624691,41.948659]},"n3231":{"id":"n3231","loc":[-85.624328,41.948661]},"n3232":{"id":"n3232","loc":[-85.624331,41.949046]},"n3233":{"id":"n3233","loc":[-85.624694,41.949045]},"n3234":{"id":"n3234","loc":[-85.623623,41.949606]},"n3235":{"id":"n3235","loc":[-85.623623,41.9497]},"n3236":{"id":"n3236","loc":[-85.623357,41.9497]},"n3237":{"id":"n3237","loc":[-85.623357,41.949614]},"n3238":{"id":"n3238","loc":[-85.623974,41.949429]},"n3239":{"id":"n3239","loc":[-85.623974,41.949605]},"n324":{"id":"n324","loc":[-85.633698,41.943651],"tags":{"railway":"crossing"}},"n3240":{"id":"n3240","loc":[-85.624501,41.951226]},"n3241":{"id":"n3241","loc":[-85.624501,41.951123]},"n3242":{"id":"n3242","loc":[-85.624319,41.951123]},"n3243":{"id":"n3243","loc":[-85.624319,41.951226]},"n3244":{"id":"n3244","loc":[-85.624121,41.950866]},"n3245":{"id":"n3245","loc":[-85.624115,41.950525]},"n3246":{"id":"n3246","loc":[-85.624315,41.950523]},"n3247":{"id":"n3247","loc":[-85.62432,41.950865]},"n3248":{"id":"n3248","loc":[-85.624393,41.950867]},"n3249":{"id":"n3249","loc":[-85.62439,41.950596]},"n325":{"id":"n325","loc":[-85.633508,41.943757]},"n3250":{"id":"n3250","loc":[-85.624673,41.950594]},"n3251":{"id":"n3251","loc":[-85.624675,41.95082]},"n3252":{"id":"n3252","loc":[-85.62451,41.950821]},"n3253":{"id":"n3253","loc":[-85.62451,41.950866]},"n3254":{"id":"n3254","loc":[-85.624101,41.949346]},"n3255":{"id":"n3255","loc":[-85.624244,41.949346]},"n3256":{"id":"n3256","loc":[-85.624244,41.949368]},"n3257":{"id":"n3257","loc":[-85.62434,41.949368]},"n3258":{"id":"n3258","loc":[-85.624342,41.949351]},"n3259":{"id":"n3259","loc":[-85.624725,41.949348]},"n326":{"id":"n326","loc":[-85.634839,41.942974]},"n3260":{"id":"n3260","loc":[-85.624755,41.950495]},"n3261":{"id":"n3261","loc":[-85.624121,41.950502]},"n3262":{"id":"n3262","loc":[-85.625453,41.950163]},"n3263":{"id":"n3263","loc":[-85.625454,41.949976]},"n3264":{"id":"n3264","loc":[-85.625549,41.949977]},"n3265":{"id":"n3265","loc":[-85.62555,41.949833]},"n3266":{"id":"n3266","loc":[-85.625577,41.949833]},"n3267":{"id":"n3267","loc":[-85.625578,41.949656]},"n3268":{"id":"n3268","loc":[-85.625195,41.949655]},"n3269":{"id":"n3269","loc":[-85.625192,41.950162]},"n327":{"id":"n327","loc":[-85.634657,41.943028]},"n3270":{"id":"n3270","loc":[-85.622992,41.949614]},"n3271":{"id":"n3271","loc":[-85.622991,41.949431]},"n3272":{"id":"n3272","loc":[-85.620103,41.951]},"n3273":{"id":"n3273","loc":[-85.605644,41.947468]},"n3274":{"id":"n3274","loc":[-85.617421,41.947457]},"n3275":{"id":"n3275","loc":[-85.620078,41.947444]},"n3276":{"id":"n3276","loc":[-85.620087,41.94924]},"n3277":{"id":"n3277","loc":[-85.62156,41.948333]},"n3278":{"id":"n3278","loc":[-85.620106,41.950132]},"n3279":{"id":"n3279","loc":[-85.637412,41.951136]},"n328":{"id":"n328","loc":[-85.634222,41.943152]},"n3280":{"id":"n3280","loc":[-85.635429,41.948608]},"n3281":{"id":"n3281","loc":[-85.635047,41.947788]},"n3282":{"id":"n3282","loc":[-85.635048,41.947796]},"n3283":{"id":"n3283","loc":[-85.635002,41.947797]},"n3284":{"id":"n3284","loc":[-85.635002,41.947788]},"n3285":{"id":"n3285","loc":[-85.634914,41.94779]},"n3286":{"id":"n3286","loc":[-85.634913,41.947753]},"n3287":{"id":"n3287","loc":[-85.63494,41.947753]},"n3288":{"id":"n3288","loc":[-85.634938,41.947708]},"n3289":{"id":"n3289","loc":[-85.635124,41.947705]},"n329":{"id":"n329","loc":[-85.634099,41.943202]},"n3290":{"id":"n3290","loc":[-85.635126,41.947787]},"n3291":{"id":"n3291","loc":[-85.634972,41.947599]},"n3292":{"id":"n3292","loc":[-85.634921,41.9476]},"n3293":{"id":"n3293","loc":[-85.63485,41.947546]},"n3294":{"id":"n3294","loc":[-85.63485,41.947508]},"n3295":{"id":"n3295","loc":[-85.634924,41.947457]},"n3296":{"id":"n3296","loc":[-85.634967,41.947456]},"n3297":{"id":"n3297","loc":[-85.635041,41.947512]},"n3298":{"id":"n3298","loc":[-85.635041,41.947542]},"n3299":{"id":"n3299","loc":[-85.634244,41.947839]},"n33":{"id":"n33","loc":[-85.638257,41.944188]},"n330":{"id":"n330","loc":[-85.634093,41.943138]},"n3300":{"id":"n3300","loc":[-85.634243,41.947793]},"n3301":{"id":"n3301","loc":[-85.634244,41.947686]},"n3302":{"id":"n3302","loc":[-85.634243,41.947657]},"n3303":{"id":"n3303","loc":[-85.634462,41.947653]},"n3304":{"id":"n3304","loc":[-85.634468,41.947835]},"n3305":{"id":"n3305","loc":[-85.634416,41.948006]},"n3306":{"id":"n3306","loc":[-85.634415,41.947898]},"n3307":{"id":"n3307","loc":[-85.634275,41.947899]},"n3308":{"id":"n3308","loc":[-85.634275,41.947927]},"n3309":{"id":"n3309","loc":[-85.63425,41.947927]},"n331":{"id":"n331","loc":[-85.633938,41.943291]},"n3310":{"id":"n3310","loc":[-85.63425,41.947976]},"n3311":{"id":"n3311","loc":[-85.634274,41.947976]},"n3312":{"id":"n3312","loc":[-85.634275,41.948007]},"n3313":{"id":"n3313","loc":[-85.634342,41.947635]},"n3314":{"id":"n3314","loc":[-85.634339,41.947497]},"n3315":{"id":"n3315","loc":[-85.634313,41.94748]},"n3316":{"id":"n3316","loc":[-85.634287,41.947474]},"n3317":{"id":"n3317","loc":[-85.63498,41.94815]},"n3318":{"id":"n3318","loc":[-85.634891,41.94815]},"n3319":{"id":"n3319","loc":[-85.634892,41.948169]},"n332":{"id":"n332","loc":[-85.633535,41.943511],"tags":{"railway":"crossing"}},"n3320":{"id":"n3320","loc":[-85.634852,41.948169]},"n3321":{"id":"n3321","loc":[-85.634853,41.948268]},"n3322":{"id":"n3322","loc":[-85.634832,41.948268]},"n3323":{"id":"n3323","loc":[-85.634832,41.948296]},"n3324":{"id":"n3324","loc":[-85.634965,41.948295]},"n3325":{"id":"n3325","loc":[-85.634966,41.948321]},"n3326":{"id":"n3326","loc":[-85.634999,41.948321]},"n3327":{"id":"n3327","loc":[-85.634999,41.948295]},"n3328":{"id":"n3328","loc":[-85.635175,41.948293]},"n3329":{"id":"n3329","loc":[-85.635175,41.948262]},"n333":{"id":"n333","loc":[-85.63339,41.943596]},"n3330":{"id":"n3330","loc":[-85.635159,41.948262]},"n3331":{"id":"n3331","loc":[-85.635158,41.948152]},"n3332":{"id":"n3332","loc":[-85.635067,41.948152]},"n3333":{"id":"n3333","loc":[-85.635065,41.947966]},"n3334":{"id":"n3334","loc":[-85.634979,41.947966]},"n3335":{"id":"n3335","loc":[-85.634307,41.948326]},"n3336":{"id":"n3336","loc":[-85.634305,41.948298]},"n3337":{"id":"n3337","loc":[-85.634331,41.948055]},"n3338":{"id":"n3338","loc":[-85.634331,41.948046]},"n3339":{"id":"n3339","loc":[-85.634435,41.948047]},"n334":{"id":"n334","loc":[-85.632842,41.943895]},"n3340":{"id":"n3340","loc":[-85.634434,41.948375]},"n3341":{"id":"n3341","loc":[-85.634463,41.948373]},"n3342":{"id":"n3342","loc":[-85.634464,41.948456]},"n3343":{"id":"n3343","loc":[-85.63443,41.948457]},"n3344":{"id":"n3344","loc":[-85.634432,41.948505]},"n3345":{"id":"n3345","loc":[-85.637386,41.94906]},"n3346":{"id":"n3346","loc":[-85.637113,41.9486]},"n3347":{"id":"n3347","loc":[-85.635448,41.949424]},"n335":{"id":"n335","loc":[-85.633856,41.943315]},"n3352":{"id":"n3352","loc":[-85.635457,41.949787]},"n3353":{"id":"n3353","loc":[-85.635459,41.949886]},"n336":{"id":"n336","loc":[-85.633697,41.943405]},"n337":{"id":"n337","loc":[-85.63347,41.943181]},"n3372":{"id":"n3372","loc":[-85.634423,41.950964]},"n3373":{"id":"n3373","loc":[-85.634424,41.95074]},"n3374":{"id":"n3374","loc":[-85.634394,41.950284]},"n3375":{"id":"n3375","loc":[-85.634398,41.950626]},"n3376":{"id":"n3376","loc":[-85.63452,41.951063]},"n3377":{"id":"n3377","loc":[-85.634511,41.949977]},"n3378":{"id":"n3378","loc":[-85.637409,41.949873]},"n3379":{"id":"n3379","loc":[-85.634824,41.94996]},"n338":{"id":"n338","loc":[-85.633597,41.943109]},"n3380":{"id":"n3380","loc":[-85.635437,41.949954]},"n3381":{"id":"n3381","loc":[-85.634844,41.951064]},"n3382":{"id":"n3382","loc":[-85.635458,41.951058]},"n3383":{"id":"n3383","loc":[-85.633921,41.947333]},"n3384":{"id":"n3384","loc":[-85.634208,41.947793]},"n3385":{"id":"n3385","loc":[-85.634204,41.947687]},"n3386":{"id":"n3386","loc":[-85.63424,41.947475]},"n3387":{"id":"n3387","loc":[-85.63424,41.947635]},"n3388":{"id":"n3388","loc":[-85.634089,41.948328]},"n3389":{"id":"n3389","loc":[-85.63424,41.948299]},"n339":{"id":"n339","loc":[-85.633673,41.943184]},"n3390":{"id":"n3390","loc":[-85.634239,41.948212]},"n3391":{"id":"n3391","loc":[-85.634086,41.948214]},"n3392":{"id":"n3392","loc":[-85.63408,41.948056]},"n3393":{"id":"n3393","loc":[-85.634093,41.948506]},"n3394":{"id":"n3394","loc":[-85.64344,41.941866]},"n3395":{"id":"n3395","loc":[-85.63378,41.95099]},"n3396":{"id":"n3396","loc":[-85.633779,41.950967]},"n3397":{"id":"n3397","loc":[-85.63375,41.950746]},"n3398":{"id":"n3398","loc":[-85.63375,41.950697]},"n3399":{"id":"n3399","loc":[-85.633903,41.950696]},"n34":{"id":"n34","loc":[-85.638176,41.944312]},"n340":{"id":"n340","loc":[-85.633714,41.94316]},"n3400":{"id":"n3400","loc":[-85.633901,41.950436]},"n3401":{"id":"n3401","loc":[-85.633492,41.950438]},"n3402":{"id":"n3402","loc":[-85.633494,41.950756]},"n3403":{"id":"n3403","loc":[-85.633454,41.950756]},"n3404":{"id":"n3404","loc":[-85.633456,41.950992]},"n3405":{"id":"n3405","loc":[-85.633994,41.950284]},"n3406":{"id":"n3406","loc":[-85.633998,41.950628]},"n3407":{"id":"n3407","loc":[-85.633364,41.951068]},"n3408":{"id":"n3408","loc":[-85.633356,41.949982]},"n3409":{"id":"n3409","loc":[-85.643327,41.941903]},"n341":{"id":"n341","loc":[-85.633811,41.943256]},"n3410":{"id":"n3410","loc":[-85.633292,41.953691]},"n3411":{"id":"n3411","loc":[-85.637432,41.952399]},"n3412":{"id":"n3412","loc":[-85.633349,41.957422]},"n3413":{"id":"n3413","loc":[-85.633326,41.955909]},"n3414":{"id":"n3414","loc":[-85.633307,41.954673]},"n3415":{"id":"n3415","loc":[-85.633273,41.952436]},"n3416":{"id":"n3416","loc":[-85.633361,41.95823],"tags":{"highway":"turning_circle"}},"n3417":{"id":"n3417","loc":[-85.619899,41.945527]},"n3418":{"id":"n3418","loc":[-85.643422,41.941946]},"n3419":{"id":"n3419","loc":[-85.643505,41.942033]},"n342":{"id":"n342","loc":[-85.633801,41.943261]},"n3420":{"id":"n3420","loc":[-85.620088,41.945571]},"n3421":{"id":"n3421","loc":[-85.620051,41.945505]},"n3422":{"id":"n3422","loc":[-85.62001,41.94541]},"n3423":{"id":"n3423","loc":[-85.620982,41.944742]},"n3424":{"id":"n3424","loc":[-85.621305,41.944782]},"n3425":{"id":"n3425","loc":[-85.621174,41.944819]},"n3426":{"id":"n3426","loc":[-85.621029,41.944871]},"n3427":{"id":"n3427","loc":[-85.620741,41.945011]},"n3428":{"id":"n3428","loc":[-85.620616,41.945085]},"n3429":{"id":"n3429","loc":[-85.620506,41.945172]},"n343":{"id":"n343","loc":[-85.63374,41.943514]},"n3430":{"id":"n3430","loc":[-85.620394,41.945273]},"n3431":{"id":"n3431","loc":[-85.620316,41.94536]},"n3432":{"id":"n3432","loc":[-85.620257,41.945452]},"n3433":{"id":"n3433","loc":[-85.620212,41.945535]},"n3434":{"id":"n3434","loc":[-85.620101,41.945811]},"n3435":{"id":"n3435","loc":[-85.620081,41.945937]},"n3436":{"id":"n3436","loc":[-85.619899,41.943718]},"n3437":{"id":"n3437","loc":[-85.619969,41.943211]},"n3438":{"id":"n3438","loc":[-85.619894,41.943292]},"n3439":{"id":"n3439","loc":[-85.620047,41.944738]},"n344":{"id":"n344","loc":[-85.633665,41.943441]},"n3440":{"id":"n3440","loc":[-85.620226,41.946088]},"n3441":{"id":"n3441","loc":[-85.620225,41.945864]},"n3442":{"id":"n3442","loc":[-85.620518,41.945863]},"n3443":{"id":"n3443","loc":[-85.620519,41.945944]},"n3444":{"id":"n3444","loc":[-85.620388,41.945944]},"n3445":{"id":"n3445","loc":[-85.620389,41.946088]},"n3446":{"id":"n3446","loc":[-85.618405,41.946566]},"n3447":{"id":"n3447","loc":[-85.619156,41.946562]},"n3448":{"id":"n3448","loc":[-85.619154,41.946319]},"n3449":{"id":"n3449","loc":[-85.618736,41.946322]},"n345":{"id":"n345","loc":[-85.633162,41.942947]},"n3450":{"id":"n3450","loc":[-85.618733,41.94612]},"n3451":{"id":"n3451","loc":[-85.619317,41.946116]},"n3452":{"id":"n3452","loc":[-85.619316,41.946023]},"n3453":{"id":"n3453","loc":[-85.619622,41.946021]},"n3454":{"id":"n3454","loc":[-85.619624,41.946171]},"n3455":{"id":"n3455","loc":[-85.61977,41.94617]},"n3456":{"id":"n3456","loc":[-85.619769,41.94602]},"n3457":{"id":"n3457","loc":[-85.619732,41.94602]},"n3458":{"id":"n3458","loc":[-85.619731,41.945856]},"n3459":{"id":"n3459","loc":[-85.619617,41.945857]},"n346":{"id":"n346","loc":[-85.633598,41.943083]},"n3460":{"id":"n3460","loc":[-85.619616,41.945776]},"n3461":{"id":"n3461","loc":[-85.619447,41.945777]},"n3462":{"id":"n3462","loc":[-85.619415,41.945778]},"n3463":{"id":"n3463","loc":[-85.618378,41.945788]},"n3464":{"id":"n3464","loc":[-85.618384,41.946132]},"n3465":{"id":"n3465","loc":[-85.618503,41.94613]},"n3466":{"id":"n3466","loc":[-85.618506,41.946319]},"n3467":{"id":"n3467","loc":[-85.6184,41.94632]},"n3468":{"id":"n3468","loc":[-85.618248,41.946416]},"n3469":{"id":"n3469","loc":[-85.618247,41.946319]},"n347":{"id":"n347","loc":[-85.63343,41.943179]},"n3470":{"id":"n3470","loc":[-85.618039,41.946321]},"n3471":{"id":"n3471","loc":[-85.61804,41.946418]},"n3472":{"id":"n3472","loc":[-85.620118,41.951895]},"n3473":{"id":"n3473","loc":[-85.617075,41.95469]},"n3474":{"id":"n3474","loc":[-85.620107,41.952113]},"n3475":{"id":"n3475","loc":[-85.620091,41.95232]},"n3476":{"id":"n3476","loc":[-85.620047,41.952505]},"n3477":{"id":"n3477","loc":[-85.61998,41.952715]},"n3478":{"id":"n3478","loc":[-85.619861,41.952986]},"n3479":{"id":"n3479","loc":[-85.619622,41.953365]},"n348":{"id":"n348","loc":[-85.633669,41.94341]},"n3480":{"id":"n3480","loc":[-85.619441,41.953567]},"n3481":{"id":"n3481","loc":[-85.619259,41.953741]},"n3482":{"id":"n3482","loc":[-85.618835,41.954056]},"n3483":{"id":"n3483","loc":[-85.618602,41.954194]},"n3484":{"id":"n3484","loc":[-85.618305,41.954347]},"n3485":{"id":"n3485","loc":[-85.618006,41.954466]},"n3486":{"id":"n3486","loc":[-85.617611,41.954587]},"n3487":{"id":"n3487","loc":[-85.615094,41.943412]},"n3488":{"id":"n3488","loc":[-85.619337,41.943025]},"n3489":{"id":"n3489","loc":[-85.610477,41.945527]},"n349":{"id":"n349","loc":[-85.633566,41.943466]},"n3490":{"id":"n3490","loc":[-85.610477,41.943718]},"n3491":{"id":"n3491","loc":[-85.619804,41.942976]},"n3492":{"id":"n3492","loc":[-85.61921,41.942672]},"n3493":{"id":"n3493","loc":[-85.619862,41.942836]},"n3494":{"id":"n3494","loc":[-85.616326,41.942769]},"n3495":{"id":"n3495","loc":[-85.617953,41.942917]},"n3496":{"id":"n3496","loc":[-85.61972,41.942728]},"n3497":{"id":"n3497","loc":[-85.61944,41.942784]},"n3498":{"id":"n3498","loc":[-85.615323,41.942841]},"n3499":{"id":"n3499","loc":[-85.612923,41.943718]},"n35":{"id":"n35","loc":[-85.637928,41.944249]},"n350":{"id":"n350","loc":[-85.633031,41.942986]},"n3500":{"id":"n3500","loc":[-85.61958,41.942756]},"n3501":{"id":"n3501","loc":[-85.619643,41.942647],"tags":{"leisure":"fishing"}},"n3502":{"id":"n3502","loc":[-85.619935,41.942962]},"n3503":{"id":"n3503","loc":[-85.629677,41.954687]},"n3504":{"id":"n3504","loc":[-85.629083,41.953722]},"n3505":{"id":"n3505","loc":[-85.621907,41.952067]},"n3506":{"id":"n3506","loc":[-85.621788,41.952058]},"n3507":{"id":"n3507","loc":[-85.629665,41.953718]},"n3508":{"id":"n3508","loc":[-85.624454,41.954707]},"n3509":{"id":"n3509","loc":[-85.634609,41.954585]},"n351":{"id":"n351","loc":[-85.633238,41.94283]},"n3510":{"id":"n3510","loc":[-85.634595,41.953772]},"n3511":{"id":"n3511","loc":[-85.633425,41.953783]},"n3512":{"id":"n3512","loc":[-85.633439,41.954596]},"n3517":{"id":"n3517","loc":[-85.621789,41.952179]},"n3518":{"id":"n3518","loc":[-85.624105,41.954704]},"n3519":{"id":"n3519","loc":[-85.623306,41.954542]},"n352":{"id":"n352","loc":[-85.633173,41.943556]},"n3520":{"id":"n3520","loc":[-85.623123,41.954502]},"n3521":{"id":"n3521","loc":[-85.622965,41.954473]},"n3522":{"id":"n3522","loc":[-85.622822,41.954455]},"n3523":{"id":"n3523","loc":[-85.62269,41.954448]},"n3524":{"id":"n3524","loc":[-85.622388,41.954467]},"n3525":{"id":"n3525","loc":[-85.62403,41.954895]},"n3526":{"id":"n3526","loc":[-85.623579,41.954855]},"n3527":{"id":"n3527","loc":[-85.623836,41.954951]},"n3528":{"id":"n3528","loc":[-85.622473,41.954592]},"n3529":{"id":"n3529","loc":[-85.622753,41.95458]},"n353":{"id":"n353","loc":[-85.633127,41.943552]},"n3530":{"id":"n3530","loc":[-85.62404,41.955078]},"n3531":{"id":"n3531","loc":[-85.624126,41.954999]},"n3532":{"id":"n3532","loc":[-85.623171,41.954687]},"n3533":{"id":"n3533","loc":[-85.624276,41.955206]},"n3534":{"id":"n3534","loc":[-85.62491,41.952801]},"n3535":{"id":"n3535","loc":[-85.625186,41.952756]},"n3536":{"id":"n3536","loc":[-85.625552,41.952792]},"n3537":{"id":"n3537","loc":[-85.626001,41.952948]},"n3538":{"id":"n3538","loc":[-85.626528,41.952984]},"n3539":{"id":"n3539","loc":[-85.626942,41.952886]},"n354":{"id":"n354","loc":[-85.632745,41.943222]},"n3540":{"id":"n3540","loc":[-85.627092,41.952685]},"n3541":{"id":"n3541","loc":[-85.627212,41.95244]},"n3542":{"id":"n3542","loc":[-85.627158,41.952226]},"n3543":{"id":"n3543","loc":[-85.627002,41.951972]},"n3544":{"id":"n3544","loc":[-85.626822,41.951838]},"n3545":{"id":"n3545","loc":[-85.626528,41.951807]},"n3546":{"id":"n3546","loc":[-85.625653,41.951852]},"n3547":{"id":"n3547","loc":[-85.625348,41.951834]},"n3548":{"id":"n3548","loc":[-85.625114,41.951767]},"n3549":{"id":"n3549","loc":[-85.620627,41.954682]},"n355":{"id":"n355","loc":[-85.632756,41.943199]},"n3550":{"id":"n3550","loc":[-85.622758,41.951884]},"n3551":{"id":"n3551","loc":[-85.618135,41.954734]},"n3552":{"id":"n3552","loc":[-85.620229,41.95472]},"n3553":{"id":"n3553","loc":[-85.624491,41.955573]},"n3554":{"id":"n3554","loc":[-85.621792,41.958314]},"n3555":{"id":"n3555","loc":[-85.623395,41.960001]},"n3556":{"id":"n3556","loc":[-85.620461,41.956212]},"n3557":{"id":"n3557","loc":[-85.62109,41.956766]},"n3558":{"id":"n3558","loc":[-85.620246,41.956224]},"n3559":{"id":"n3559","loc":[-85.625017,41.956068]},"n356":{"id":"n356","loc":[-85.632855,41.943147]},"n3560":{"id":"n3560","loc":[-85.622795,41.959702]},"n3561":{"id":"n3561","loc":[-85.621573,41.958457]},"n3562":{"id":"n3562","loc":[-85.619631,41.9573]},"n3563":{"id":"n3563","loc":[-85.62095,41.956311]},"n3564":{"id":"n3564","loc":[-85.619694,41.957408]},"n3565":{"id":"n3565","loc":[-85.621079,41.957751]},"n3566":{"id":"n3566","loc":[-85.622426,41.961142]},"n3567":{"id":"n3567","loc":[-85.623251,41.960484]},"n3568":{"id":"n3568","loc":[-85.619084,41.956291]},"n3569":{"id":"n3569","loc":[-85.622227,41.959303]},"n357":{"id":"n357","loc":[-85.632888,41.94315]},"n3570":{"id":"n3570","loc":[-85.620976,41.959104]},"n3571":{"id":"n3571","loc":[-85.621208,41.95653]},"n3572":{"id":"n3572","loc":[-85.623531,41.95951]},"n3573":{"id":"n3573","loc":[-85.623556,41.957935]},"n3574":{"id":"n3574","loc":[-85.623037,41.95746]},"n3575":{"id":"n3575","loc":[-85.621175,41.956427]},"n3576":{"id":"n3576","loc":[-85.622651,41.960109]},"n3577":{"id":"n3577","loc":[-85.621803,41.960747]},"n3578":{"id":"n3578","loc":[-85.620791,41.961874]},"n3579":{"id":"n3579","loc":[-85.625295,41.956786]},"n358":{"id":"n358","loc":[-85.633232,41.943547]},"n3580":{"id":"n3580","loc":[-85.619662,41.956894]},"n3581":{"id":"n3581","loc":[-85.622442,41.958708]},"n3582":{"id":"n3582","loc":[-85.621744,41.955864]},"n3583":{"id":"n3583","loc":[-85.621336,41.959212]},"n3584":{"id":"n3584","loc":[-85.622801,41.957304]},"n3585":{"id":"n3585","loc":[-85.619973,41.957433]},"n3586":{"id":"n3586","loc":[-85.619556,41.955717]},"n3587":{"id":"n3587","loc":[-85.622978,41.958601]},"n3588":{"id":"n3588","loc":[-85.625396,41.956264]},"n3589":{"id":"n3589","loc":[-85.623525,41.958034]},"n359":{"id":"n359","loc":[-85.633302,41.94351]},"n3590":{"id":"n3590","loc":[-85.623299,41.959631]},"n3591":{"id":"n3591","loc":[-85.622678,41.959873]},"n3592":{"id":"n3592","loc":[-85.625553,41.956179]},"n3593":{"id":"n3593","loc":[-85.623557,41.959231]},"n3594":{"id":"n3594","loc":[-85.622843,41.957373]},"n3595":{"id":"n3595","loc":[-85.619378,41.955677]},"n3596":{"id":"n3596","loc":[-85.620092,41.955425]},"n3597":{"id":"n3597","loc":[-85.622666,41.96044]},"n3598":{"id":"n3598","loc":[-85.621996,41.960256]},"n3599":{"id":"n3599","loc":[-85.623273,41.959997]},"n36":{"id":"n36","loc":[-85.637894,41.945551]},"n360":{"id":"n360","loc":[-85.633442,41.943794],"tags":{"highway":"crossing"}},"n3600":{"id":"n3600","loc":[-85.62477,41.95689]},"n3601":{"id":"n3601","loc":[-85.621641,41.955015]},"n3602":{"id":"n3602","loc":[-85.622495,41.960392]},"n3603":{"id":"n3603","loc":[-85.61918,41.955565]},"n3604":{"id":"n3604","loc":[-85.620017,41.955505]},"n3605":{"id":"n3605","loc":[-85.621739,41.956315]},"n3606":{"id":"n3606","loc":[-85.622957,41.959837]},"n3607":{"id":"n3607","loc":[-85.620912,41.960919]},"n3608":{"id":"n3608","loc":[-85.625231,41.956235]},"n3609":{"id":"n3609","loc":[-85.620976,41.961868]},"n361":{"id":"n361","loc":[-85.633381,41.94383]},"n3610":{"id":"n3610","loc":[-85.620956,41.958908]},"n3611":{"id":"n3611","loc":[-85.619035,41.956139]},"n3612":{"id":"n3612","loc":[-85.623643,41.958669]},"n3613":{"id":"n3613","loc":[-85.61949,41.956539]},"n3614":{"id":"n3614","loc":[-85.621927,41.958242]},"n3615":{"id":"n3615","loc":[-85.620826,41.955721]},"n3616":{"id":"n3616","loc":[-85.621202,41.961321]},"n3617":{"id":"n3617","loc":[-85.624877,41.95594]},"n3618":{"id":"n3618","loc":[-85.62065,41.958369]},"n3619":{"id":"n3619","loc":[-85.621524,41.956279]},"n362":{"id":"n362","loc":[-85.632977,41.944053]},"n3620":{"id":"n3620","loc":[-85.624662,41.955932]},"n3621":{"id":"n3621","loc":[-85.623048,41.958509]},"n3622":{"id":"n3622","loc":[-85.62111,41.95754]},"n3623":{"id":"n3623","loc":[-85.621508,41.954847]},"n3624":{"id":"n3624","loc":[-85.620655,41.958601]},"n3625":{"id":"n3625","loc":[-85.62154,41.954971]},"n3626":{"id":"n3626","loc":[-85.621691,41.955521]},"n3627":{"id":"n3627","loc":[-85.62154,41.954739]},"n3628":{"id":"n3628","loc":[-85.621996,41.959913]},"n3629":{"id":"n3629","loc":[-85.622286,41.960699]},"n363":{"id":"n363","loc":[-85.632915,41.943981],"tags":{"crossing":"zebra","highway":"crossing"}},"n3630":{"id":"n3630","loc":[-85.622844,41.9572]},"n3631":{"id":"n3631","loc":[-85.620252,41.955446]},"n3632":{"id":"n3632","loc":[-85.623434,41.957528]},"n3633":{"id":"n3633","loc":[-85.623429,41.956858]},"n3634":{"id":"n3634","loc":[-85.622957,41.957137]},"n3635":{"id":"n3635","loc":[-85.622554,41.959027]},"n3636":{"id":"n3636","loc":[-85.623289,41.958314]},"n3637":{"id":"n3637","loc":[-85.622977,41.960855]},"n3638":{"id":"n3638","loc":[-85.624008,41.956953]},"n3639":{"id":"n3639","loc":[-85.621278,41.960855]},"n364":{"id":"n364","loc":[-85.632724,41.943969],"tags":{"crossing":"zebra","highway":"crossing"}},"n3640":{"id":"n3640","loc":[-85.623128,41.956993]},"n3641":{"id":"n3641","loc":[-85.622452,41.959183]},"n3642":{"id":"n3642","loc":[-85.621095,41.961082]},"n3643":{"id":"n3643","loc":[-85.622011,41.960544]},"n3644":{"id":"n3644","loc":[-85.621637,41.955385]},"n3645":{"id":"n3645","loc":[-85.620999,41.959271]},"n3646":{"id":"n3646","loc":[-85.620044,41.956347]},"n3647":{"id":"n3647","loc":[-85.621936,41.959682]},"n3648":{"id":"n3648","loc":[-85.623761,41.95685]},"n3649":{"id":"n3649","loc":[-85.621239,41.959343]},"n365":{"id":"n365","loc":[-85.632621,41.944034]},"n3650":{"id":"n3650","loc":[-85.621073,41.956012]},"n3651":{"id":"n3651","loc":[-85.621271,41.956184]},"n3652":{"id":"n3652","loc":[-85.623444,41.95778]},"n3653":{"id":"n3653","loc":[-85.62125,41.96186]},"n3654":{"id":"n3654","loc":[-85.62169,41.961059]},"n3655":{"id":"n3655","loc":[-85.620012,41.955637]},"n3656":{"id":"n3656","loc":[-85.621058,41.9573]},"n3657":{"id":"n3657","loc":[-85.621138,41.957663]},"n3658":{"id":"n3658","loc":[-85.620773,41.957895]},"n3659":{"id":"n3659","loc":[-85.62007,41.957157]},"n366":{"id":"n366","loc":[-85.632684,41.944109],"tags":{"crossing":"zebra","highway":"crossing"}},"n3660":{"id":"n3660","loc":[-85.624534,41.955844]},"n3661":{"id":"n3661","loc":[-85.621932,41.960807]},"n3662":{"id":"n3662","loc":[-85.623358,41.958138]},"n3663":{"id":"n3663","loc":[-85.620456,41.955514]},"n3664":{"id":"n3664","loc":[-85.623504,41.957607]},"n3665":{"id":"n3665","loc":[-85.621444,41.960751]},"n3666":{"id":"n3666","loc":[-85.623492,41.960213]},"n3667":{"id":"n3667","loc":[-85.621669,41.954655]},"n3668":{"id":"n3668","loc":[-85.623106,41.958685]},"n3669":{"id":"n3669","loc":[-85.620922,41.957867]},"n367":{"id":"n367","loc":[-85.632738,41.944172]},"n3670":{"id":"n3670","loc":[-85.620092,41.957296]},"n3671":{"id":"n3671","loc":[-85.621669,41.955222]},"n3672":{"id":"n3672","loc":[-85.621614,41.960967]},"n3673":{"id":"n3673","loc":[-85.621691,41.955732]},"n3674":{"id":"n3674","loc":[-85.619207,41.956419]},"n3675":{"id":"n3675","loc":[-85.621116,41.956603]},"n3676":{"id":"n3676","loc":[-85.623311,41.956929]},"n3677":{"id":"n3677","loc":[-85.625671,41.956499]},"n3678":{"id":"n3678","loc":[-85.623525,41.956738]},"n3679":{"id":"n3679","loc":[-85.625381,41.956634]},"n368":{"id":"n368","loc":[-85.63287,41.944135],"tags":{"crossing":"zebra","highway":"crossing"}},"n3680":{"id":"n3680","loc":[-85.620096,41.95677]},"n3681":{"id":"n3681","loc":[-85.623803,41.958745]},"n3682":{"id":"n3682","loc":[-85.623498,41.958457]},"n3683":{"id":"n3683","loc":[-85.624223,41.957009]},"n3684":{"id":"n3684","loc":[-85.620026,41.956946]},"n3685":{"id":"n3685","loc":[-85.623005,41.960124]},"n3686":{"id":"n3686","loc":[-85.619073,41.955832]},"n3687":{"id":"n3687","loc":[-85.621744,41.95501]},"n3688":{"id":"n3688","loc":[-85.620804,41.958781]},"n3689":{"id":"n3689","loc":[-85.619844,41.957448]},"n369":{"id":"n369","loc":[-85.63298,41.944076]},"n3690":{"id":"n3690","loc":[-85.623713,41.958872]},"n3691":{"id":"n3691","loc":[-85.622329,41.960507]},"n3692":{"id":"n3692","loc":[-85.620804,41.956244]},"n3693":{"id":"n3693","loc":[-85.621818,41.955968]},"n3694":{"id":"n3694","loc":[-85.621405,41.958697]},"n3695":{"id":"n3695","loc":[-85.620998,41.960996]},"n3696":{"id":"n3696","loc":[-85.621621,41.960444]},"n3697":{"id":"n3697","loc":[-85.620941,41.961637]},"n3698":{"id":"n3698","loc":[-85.622195,41.958333]},"n3699":{"id":"n3699","loc":[-85.621668,41.961529]},"n37":{"id":"n37","loc":[-85.637611,41.945383]},"n370":{"id":"n370","loc":[-85.633191,41.944471]},"n3700":{"id":"n3700","loc":[-85.621015,41.957049]},"n3701":{"id":"n3701","loc":[-85.619368,41.955521]},"n3702":{"id":"n3702","loc":[-85.651578,41.942534]},"n3703":{"id":"n3703","loc":[-85.651541,41.943847]},"n3704":{"id":"n3704","loc":[-85.651365,41.944817]},"n3705":{"id":"n3705","loc":[-85.651076,41.945985]},"n3706":{"id":"n3706","loc":[-85.650626,41.947213]},"n3707":{"id":"n3707","loc":[-85.649669,41.949161]},"n3708":{"id":"n3708","loc":[-85.641802,41.961801]},"n3709":{"id":"n3709","loc":[-85.623333,41.961987]},"n371":{"id":"n371","loc":[-85.633132,41.94372]},"n3710":{"id":"n3710","loc":[-85.620621,41.965658]},"n3711":{"id":"n3711","loc":[-85.605673,41.965764]},"n3712":{"id":"n3712","loc":[-85.605664,41.962094]},"n3713":{"id":"n3713","loc":[-85.583774,41.962178]},"n3714":{"id":"n3714","loc":[-85.583774,41.961789]},"n3715":{"id":"n3715","loc":[-85.581303,41.961783]},"n3716":{"id":"n3716","loc":[-85.581245,41.958394]},"n3717":{"id":"n3717","loc":[-85.585299,41.955483]},"n3718":{"id":"n3718","loc":[-85.585588,41.955331]},"n3719":{"id":"n3719","loc":[-85.586053,41.955163]},"n372":{"id":"n372","loc":[-85.633011,41.943788]},"n3720":{"id":"n3720","loc":[-85.58632,41.955076]},"n3721":{"id":"n3721","loc":[-85.586478,41.955025]},"n3722":{"id":"n3722","loc":[-85.58692,41.954947]},"n3723":{"id":"n3723","loc":[-85.587345,41.954913]},"n3724":{"id":"n3724","loc":[-85.605592,41.954766]},"n3725":{"id":"n3725","loc":[-85.605303,41.936236]},"n3726":{"id":"n3726","loc":[-85.606941,41.936117]},"n3727":{"id":"n3727","loc":[-85.60876,41.935856]},"n3728":{"id":"n3728","loc":[-85.610092,41.935451]},"n3729":{"id":"n3729","loc":[-85.610681,41.935247]},"n373":{"id":"n373","loc":[-85.632854,41.943632]},"n3730":{"id":"n3730","loc":[-85.611446,41.934955]},"n3731":{"id":"n3731","loc":[-85.612057,41.934696]},"n3732":{"id":"n3732","loc":[-85.613256,41.934084]},"n3733":{"id":"n3733","loc":[-85.613948,41.933682]},"n3734":{"id":"n3734","loc":[-85.614638,41.933212]},"n3735":{"id":"n3735","loc":[-85.619801,41.929305]},"n3736":{"id":"n3736","loc":[-85.619768,41.925548]},"n3737":{"id":"n3737","loc":[-85.625761,41.925597]},"n3738":{"id":"n3738","loc":[-85.6263,41.927323]},"n3739":{"id":"n3739","loc":[-85.633708,41.927402]},"n374":{"id":"n374","loc":[-85.632974,41.943565]},"n3740":{"id":"n3740","loc":[-85.633927,41.929109]},"n3741":{"id":"n3741","loc":[-85.639213,41.929088]},"n3742":{"id":"n3742","loc":[-85.639204,41.925488]},"n3743":{"id":"n3743","loc":[-85.651425,41.925406]},"n3744":{"id":"n3744","loc":[-85.643386,41.941933]},"n3745":{"id":"n3745","loc":[-85.642776,41.941161]},"n3746":{"id":"n3746","loc":[-85.637277,41.948812]},"n3747":{"id":"n3747","loc":[-85.637366,41.94897]},"n3748":{"id":"n3748","loc":[-85.637329,41.94889]},"n3749":{"id":"n3749","loc":[-85.629649,41.952596]},"n375":{"id":"n375","loc":[-85.632741,41.943351]},"n3750":{"id":"n3750","loc":[-85.630291,41.954684]},"n3751":{"id":"n3751","loc":[-85.630284,41.953713]},"n3752":{"id":"n3752","loc":[-85.630269,41.952463]},"n3753":{"id":"n3753","loc":[-85.633933,41.949896]},"n3754":{"id":"n3754","loc":[-85.629339,41.941467]},"n3755":{"id":"n3755","loc":[-85.629857,41.94316]},"n3756":{"id":"n3756","loc":[-85.629987,41.944025]},"n3757":{"id":"n3757","loc":[-85.628538,41.948604]},"n3758":{"id":"n3758","loc":[-85.627415,41.957442]},"n3759":{"id":"n3759","loc":[-85.627019,41.957369]},"n376":{"id":"n376","loc":[-85.63251,41.943481]},"n3760":{"id":"n3760","loc":[-85.62167,41.952179]},"n3761":{"id":"n3761","loc":[-85.62167,41.952138]},"n3762":{"id":"n3762","loc":[-85.621562,41.952139]},"n3763":{"id":"n3763","loc":[-85.621562,41.952058]},"n3764":{"id":"n3764","loc":[-85.621476,41.952043]},"n3765":{"id":"n3765","loc":[-85.621477,41.952132]},"n3766":{"id":"n3766","loc":[-85.621386,41.952132]},"n3767":{"id":"n3767","loc":[-85.621387,41.95214]},"n3768":{"id":"n3768","loc":[-85.621262,41.95214]},"n3769":{"id":"n3769","loc":[-85.621261,41.952038]},"n377":{"id":"n377","loc":[-85.632706,41.943715]},"n3770":{"id":"n3770","loc":[-85.621389,41.952038]},"n3771":{"id":"n3771","loc":[-85.621389,41.952043]},"n3772":{"id":"n3772","loc":[-85.620898,41.952024]},"n3773":{"id":"n3773","loc":[-85.620898,41.952085]},"n3774":{"id":"n3774","loc":[-85.620774,41.952084]},"n3775":{"id":"n3775","loc":[-85.620774,41.952023]},"n3776":{"id":"n3776","loc":[-85.620749,41.952036]},"n3777":{"id":"n3777","loc":[-85.620723,41.952097]},"n3778":{"id":"n3778","loc":[-85.626158,41.958996]},"n3779":{"id":"n3779","loc":[-85.626319,41.958686]},"n378":{"id":"n378","loc":[-85.638683,41.943295]},"n3780":{"id":"n3780","loc":[-85.626119,41.958629]},"n3781":{"id":"n3781","loc":[-85.626064,41.958733]},"n3782":{"id":"n3782","loc":[-85.626155,41.958759]},"n3783":{"id":"n3783","loc":[-85.626048,41.958965]},"n3784":{"id":"n3784","loc":[-85.620648,41.952079]},"n3785":{"id":"n3785","loc":[-85.63826,41.961213]},"n3786":{"id":"n3786","loc":[-85.638003,41.961614]},"n3787":{"id":"n3787","loc":[-85.638817,41.961902]},"n3788":{"id":"n3788","loc":[-85.639073,41.961501]},"n3789":{"id":"n3789","loc":[-85.620674,41.952018]},"n379":{"id":"n379","loc":[-85.638684,41.94323]},"n3790":{"id":"n3790","loc":[-85.62082,41.952106]},"n3791":{"id":"n3791","loc":[-85.620819,41.952143]},"n3792":{"id":"n3792","loc":[-85.620778,41.952143]},"n3793":{"id":"n3793","loc":[-85.620778,41.952106]},"n3794":{"id":"n3794","loc":[-85.620563,41.952276]},"n3795":{"id":"n3795","loc":[-85.620543,41.95238]},"n3796":{"id":"n3796","loc":[-85.620422,41.952367]},"n3797":{"id":"n3797","loc":[-85.620441,41.952263]},"n3798":{"id":"n3798","loc":[-85.620561,41.952266]},"n3799":{"id":"n3799","loc":[-85.620444,41.952254]},"n38":{"id":"n38","loc":[-85.63879,41.943295]},"n380":{"id":"n380","loc":[-85.638627,41.94322]},"n3800":{"id":"n3800","loc":[-85.620773,41.955585]},"n3801":{"id":"n3801","loc":[-85.621265,41.955989]},"n3802":{"id":"n3802","loc":[-85.620692,41.954969]},"n3803":{"id":"n3803","loc":[-85.620691,41.955367]},"n3804":{"id":"n3804","loc":[-85.620458,41.952178]},"n3805":{"id":"n3805","loc":[-85.620575,41.95219]},"n3806":{"id":"n3806","loc":[-85.617609,41.952712]},"n3807":{"id":"n3807","loc":[-85.617533,41.952801],"tags":{"entrance":"yes"}},"n3808":{"id":"n3808","loc":[-85.616816,41.952911]},"n3809":{"id":"n3809","loc":[-85.616797,41.952901]},"n381":{"id":"n381","loc":[-85.638624,41.943294]},"n3810":{"id":"n3810","loc":[-85.616343,41.952694]},"n3811":{"id":"n3811","loc":[-85.616336,41.952729]},"n3812":{"id":"n3812","loc":[-85.616343,41.952772]},"n3813":{"id":"n3813","loc":[-85.628479,41.948649]},"n3814":{"id":"n3814","loc":[-85.628413,41.948679]},"n3815":{"id":"n3815","loc":[-85.628336,41.948694]},"n3816":{"id":"n3816","loc":[-85.62826,41.948694]},"n3817":{"id":"n3817","loc":[-85.628185,41.948679]},"n3818":{"id":"n3818","loc":[-85.628103,41.948649]},"n3819":{"id":"n3819","loc":[-85.627482,41.948395]},"n382":{"id":"n382","loc":[-85.638437,41.943291]},"n3820":{"id":"n3820","loc":[-85.619957,41.951168]},"n3821":{"id":"n3821","loc":[-85.619955,41.952077]},"n3822":{"id":"n3822","loc":[-85.619843,41.952666]},"n3823":{"id":"n3823","loc":[-85.619513,41.95324]},"n3824":{"id":"n3824","loc":[-85.619163,41.953668]},"n3825":{"id":"n3825","loc":[-85.618813,41.953947]},"n3826":{"id":"n3826","loc":[-85.618265,41.954252]},"n3827":{"id":"n3827","loc":[-85.617691,41.954458]},"n3828":{"id":"n3828","loc":[-85.616978,41.95459]},"n3829":{"id":"n3829","loc":[-85.615408,41.954628]},"n383":{"id":"n383","loc":[-85.63844,41.943209]},"n3830":{"id":"n3830","loc":[-85.615374,41.951076]},"n3831":{"id":"n3831","loc":[-85.61932,41.947564]},"n3832":{"id":"n3832","loc":[-85.610553,41.94755]},"n3833":{"id":"n3833","loc":[-85.610572,41.951065]},"n3834":{"id":"n3834","loc":[-85.617548,41.94757]},"n3835":{"id":"n3835","loc":[-85.619842,41.947939]},"n3836":{"id":"n3836","loc":[-85.619874,41.950905]},"n3837":{"id":"n3837","loc":[-85.619695,41.950911]},"n3838":{"id":"n3838","loc":[-85.617591,41.951078]},"n3839":{"id":"n3839","loc":[-85.619551,41.951065]},"n384":{"id":"n384","loc":[-85.632616,41.944021]},"n3840":{"id":"n3840","loc":[-85.626813,41.947337]},"n3841":{"id":"n3841","loc":[-85.616371,41.952814]},"n3842":{"id":"n3842","loc":[-85.617205,41.951308]},"n3843":{"id":"n3843","loc":[-85.616795,41.950953]},"n3844":{"id":"n3844","loc":[-85.617441,41.950889]},"n3845":{"id":"n3845","loc":[-85.619155,41.949377]},"n3846":{"id":"n3846","loc":[-85.618556,41.949377]},"n3847":{"id":"n3847","loc":[-85.618557,41.948372]},"n3848":{"id":"n3848","loc":[-85.619156,41.948372]},"n3849":{"id":"n3849","loc":[-85.61927,41.949796]},"n385":{"id":"n385","loc":[-85.632319,41.944172]},"n3850":{"id":"n3850","loc":[-85.61926,41.948344]},"n3851":{"id":"n3851","loc":[-85.619219,41.948264]},"n3852":{"id":"n3852","loc":[-85.619147,41.948196]},"n3853":{"id":"n3853","loc":[-85.619049,41.948144]},"n3854":{"id":"n3854","loc":[-85.618942,41.948116]},"n3855":{"id":"n3855","loc":[-85.618822,41.948109]},"n3856":{"id":"n3856","loc":[-85.618699,41.94813]},"n3857":{"id":"n3857","loc":[-85.618937,41.951943]},"n3858":{"id":"n3858","loc":[-85.616755,41.952231]},"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.616572,41.951992]},"n3867":{"id":"n3867","loc":[-85.616583,41.952076]},"n3868":{"id":"n3868","loc":[-85.616636,41.952145]},"n3869":{"id":"n3869","loc":[-85.616916,41.952279]},"n387":{"id":"n387","loc":[-85.632524,41.943912]},"n3870":{"id":"n3870","loc":[-85.617088,41.952254]},"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.616494,41.951959]},"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"}},"n40":{"id":"n40","loc":[-85.619841,41.951037]},"n400":{"id":"n400","loc":[-85.63326,41.943966]},"n4000":{"id":"n4000","loc":[-85.616761,41.950865]},"n4001":{"id":"n4001","loc":[-85.616883,41.951041]},"n4002":{"id":"n4002","loc":[-85.617004,41.951142]},"n4003":{"id":"n4003","loc":[-85.617062,41.951248]},"n4004":{"id":"n4004","loc":[-85.616809,41.949273]},"n4005":{"id":"n4005","loc":[-85.616755,41.949489]},"n4006":{"id":"n4006","loc":[-85.616759,41.949971]},"n4007":{"id":"n4007","loc":[-85.616757,41.949702]},"n4008":{"id":"n4008","loc":[-85.618456,41.94836]},"n4009":{"id":"n4009","loc":[-85.618447,41.948428]},"n401":{"id":"n401","loc":[-85.63324,41.943976]},"n4010":{"id":"n4010","loc":[-85.618437,41.949322]},"n4011":{"id":"n4011","loc":[-85.618447,41.949418]},"n4012":{"id":"n4012","loc":[-85.618478,41.949491]},"n4013":{"id":"n4013","loc":[-85.618535,41.949559]},"n4014":{"id":"n4014","loc":[-85.618623,41.94962]},"n4015":{"id":"n4015","loc":[-85.618721,41.94966]},"n4016":{"id":"n4016","loc":[-85.618838,41.949674]},"n4017":{"id":"n4017","loc":[-85.618967,41.949667]},"n4018":{"id":"n4018","loc":[-85.619065,41.949632]},"n4019":{"id":"n4019","loc":[-85.61915,41.949578]},"n402":{"id":"n402","loc":[-85.63327,41.944006]},"n4020":{"id":"n4020","loc":[-85.619216,41.949507]},"n4021":{"id":"n4021","loc":[-85.61927,41.949399]},"n4022":{"id":"n4022","loc":[-85.619074,41.947639]},"n4023":{"id":"n4023","loc":[-85.619073,41.947793]},"n4024":{"id":"n4024","loc":[-85.618912,41.947793]},"n4025":{"id":"n4025","loc":[-85.618911,41.947947]},"n4026":{"id":"n4026","loc":[-85.618752,41.947947]},"n4027":{"id":"n4027","loc":[-85.618754,41.947637]},"n4028":{"id":"n4028","loc":[-85.617896,41.947599]},"n4029":{"id":"n4029","loc":[-85.617898,41.947811]},"n403":{"id":"n403","loc":[-85.633278,41.944002]},"n4030":{"id":"n4030","loc":[-85.617717,41.947812]},"n4031":{"id":"n4031","loc":[-85.617715,41.9476]},"n4032":{"id":"n4032","loc":[-85.619003,41.949828]},"n4033":{"id":"n4033","loc":[-85.619003,41.949882]},"n4034":{"id":"n4034","loc":[-85.618926,41.949882]},"n4035":{"id":"n4035","loc":[-85.618926,41.949828]},"n4036":{"id":"n4036","loc":[-85.618861,41.949809]},"n4037":{"id":"n4037","loc":[-85.618861,41.949898]},"n4038":{"id":"n4038","loc":[-85.618688,41.949898]},"n4039":{"id":"n4039","loc":[-85.618687,41.94981]},"n404":{"id":"n404","loc":[-85.63331,41.944036]},"n4040":{"id":"n4040","loc":[-85.618349,41.949473]},"n4041":{"id":"n4041","loc":[-85.618287,41.949473]},"n4042":{"id":"n4042","loc":[-85.618287,41.94942]},"n4043":{"id":"n4043","loc":[-85.618348,41.949419]},"n4044":{"id":"n4044","loc":[-85.62316,41.951604]},"n4045":{"id":"n4045","loc":[-85.623026,41.951605]},"n4046":{"id":"n4046","loc":[-85.623023,41.951466]},"n4047":{"id":"n4047","loc":[-85.623134,41.951465]},"n4048":{"id":"n4048","loc":[-85.623136,41.951539]},"n4049":{"id":"n4049","loc":[-85.623159,41.951539]},"n405":{"id":"n405","loc":[-85.633348,41.944015]},"n4050":{"id":"n4050","loc":[-85.623025,41.95155]},"n4051":{"id":"n4051","loc":[-85.622955,41.951551]},"n4052":{"id":"n4052","loc":[-85.622953,41.951507]},"n4053":{"id":"n4053","loc":[-85.623024,41.951506]},"n4054":{"id":"n4054","loc":[-85.623318,41.951242]},"n4055":{"id":"n4055","loc":[-85.623175,41.951241]},"n4056":{"id":"n4056","loc":[-85.623176,41.951153]},"n4057":{"id":"n4057","loc":[-85.623319,41.951154]},"n4058":{"id":"n4058","loc":[-85.623077,41.951191]},"n4059":{"id":"n4059","loc":[-85.622973,41.951191]},"n406":{"id":"n406","loc":[-85.63338,41.944048]},"n4060":{"id":"n4060","loc":[-85.622972,41.951349]},"n4061":{"id":"n4061","loc":[-85.623059,41.95135]},"n4062":{"id":"n4062","loc":[-85.62306,41.951301]},"n4063":{"id":"n4063","loc":[-85.623077,41.951301]},"n4064":{"id":"n4064","loc":[-85.623117,41.951405]},"n4065":{"id":"n4065","loc":[-85.62312,41.951087]},"n4066":{"id":"n4066","loc":[-85.623118,41.951274]},"n4067":{"id":"n4067","loc":[-85.62328,41.951275]},"n4068":{"id":"n4068","loc":[-85.62328,41.951242]},"n4069":{"id":"n4069","loc":[-85.623179,41.951392]},"n407":{"id":"n407","loc":[-85.633431,41.94402]},"n4070":{"id":"n4070","loc":[-85.623141,41.951392]},"n4071":{"id":"n4071","loc":[-85.623142,41.95136]},"n4072":{"id":"n4072","loc":[-85.623179,41.951361]},"n4073":{"id":"n4073","loc":[-85.622565,41.951639]},"n4074":{"id":"n4074","loc":[-85.622565,41.951741]},"n4075":{"id":"n4075","loc":[-85.622463,41.95174]},"n4076":{"id":"n4076","loc":[-85.622463,41.95173]},"n4077":{"id":"n4077","loc":[-85.622442,41.95173]},"n4078":{"id":"n4078","loc":[-85.622442,41.951742]},"n4079":{"id":"n4079","loc":[-85.622361,41.951742]},"n408":{"id":"n408","loc":[-85.633425,41.944014]},"n4080":{"id":"n4080","loc":[-85.622362,41.951667]},"n4081":{"id":"n4081","loc":[-85.622441,41.951667]},"n4082":{"id":"n4082","loc":[-85.622441,41.951688]},"n4083":{"id":"n4083","loc":[-85.622461,41.951688]},"n4084":{"id":"n4084","loc":[-85.622461,41.951638]},"n4085":{"id":"n4085","loc":[-85.62255,41.951587]},"n4086":{"id":"n4086","loc":[-85.622449,41.95159]},"n4087":{"id":"n4087","loc":[-85.622441,41.951448]},"n4088":{"id":"n4088","loc":[-85.62253,41.951445]},"n4089":{"id":"n4089","loc":[-85.622532,41.951486]},"n409":{"id":"n409","loc":[-85.633457,41.943997]},"n4090":{"id":"n4090","loc":[-85.622555,41.951485]},"n4091":{"id":"n4091","loc":[-85.622558,41.951531]},"n4092":{"id":"n4092","loc":[-85.622547,41.951531]},"n4093":{"id":"n4093","loc":[-85.622451,41.95159]},"n4094":{"id":"n4094","loc":[-85.622452,41.95161]},"n4095":{"id":"n4095","loc":[-85.622106,41.951617]},"n4096":{"id":"n4096","loc":[-85.622133,41.951443]},"n4097":{"id":"n4097","loc":[-85.622552,41.951379]},"n4098":{"id":"n4098","loc":[-85.622443,41.95138]},"n4099":{"id":"n4099","loc":[-85.622441,41.951281]},"n41":{"id":"n41","loc":[-85.636233,41.942764]},"n410":{"id":"n410","loc":[-85.633429,41.943969]},"n4100":{"id":"n4100","loc":[-85.62255,41.95128]},"n4101":{"id":"n4101","loc":[-85.622541,41.951437]},"n4102":{"id":"n4102","loc":[-85.622441,41.951438]},"n4103":{"id":"n4103","loc":[-85.621561,41.951444]},"n4104":{"id":"n4104","loc":[-85.622302,41.951479]},"n4105":{"id":"n4105","loc":[-85.6223,41.95152]},"n4106":{"id":"n4106","loc":[-85.622169,41.951517]},"n4107":{"id":"n4107","loc":[-85.622171,41.951476]},"n4108":{"id":"n4108","loc":[-85.622543,41.951228]},"n4109":{"id":"n4109","loc":[-85.622433,41.951228]},"n411":{"id":"n411","loc":[-85.633442,41.943962]},"n4110":{"id":"n4110","loc":[-85.622433,41.951133]},"n4111":{"id":"n4111","loc":[-85.622543,41.951133]},"n4112":{"id":"n4112","loc":[-85.622356,41.951256]},"n4113":{"id":"n4113","loc":[-85.622293,41.951256]},"n4114":{"id":"n4114","loc":[-85.622292,41.9512]},"n4115":{"id":"n4115","loc":[-85.622313,41.9512]},"n4116":{"id":"n4116","loc":[-85.622312,41.951173]},"n4117":{"id":"n4117","loc":[-85.622364,41.951173]},"n4118":{"id":"n4118","loc":[-85.622365,41.951231]},"n4119":{"id":"n4119","loc":[-85.622355,41.951231]},"n412":{"id":"n412","loc":[-85.633411,41.943932]},"n4120":{"id":"n4120","loc":[-85.62197,41.951155]},"n4121":{"id":"n4121","loc":[-85.62197,41.951213]},"n4122":{"id":"n4122","loc":[-85.621848,41.951213]},"n4123":{"id":"n4123","loc":[-85.621848,41.951155]},"n4124":{"id":"n4124","loc":[-85.622193,41.951268]},"n4125":{"id":"n4125","loc":[-85.622194,41.951305]},"n4126":{"id":"n4126","loc":[-85.622121,41.951306]},"n4127":{"id":"n4127","loc":[-85.622121,41.951322]},"n4128":{"id":"n4128","loc":[-85.621984,41.951324]},"n4129":{"id":"n4129","loc":[-85.621983,41.951271]},"n413":{"id":"n413","loc":[-85.633421,41.943926]},"n4130":{"id":"n4130","loc":[-85.622171,41.9514]},"n4131":{"id":"n4131","loc":[-85.622148,41.951382]},"n4132":{"id":"n4132","loc":[-85.6221,41.951414]},"n4133":{"id":"n4133","loc":[-85.622122,41.951433]},"n4134":{"id":"n4134","loc":[-85.621782,41.951148]},"n4135":{"id":"n4135","loc":[-85.621783,41.951219]},"n4136":{"id":"n4136","loc":[-85.62164,41.951221]},"n4137":{"id":"n4137","loc":[-85.62164,41.951236]},"n4138":{"id":"n4138","loc":[-85.621556,41.951237]},"n4139":{"id":"n4139","loc":[-85.621555,41.95117]},"n414":{"id":"n414","loc":[-85.633376,41.94388]},"n4140":{"id":"n4140","loc":[-85.621644,41.951169]},"n4141":{"id":"n4141","loc":[-85.621643,41.951139]},"n4142":{"id":"n4142","loc":[-85.621719,41.951138]},"n4143":{"id":"n4143","loc":[-85.621719,41.951148]},"n4144":{"id":"n4144","loc":[-85.621409,41.951322]},"n4145":{"id":"n4145","loc":[-85.621338,41.951322]},"n4146":{"id":"n4146","loc":[-85.621336,41.95115]},"n4147":{"id":"n4147","loc":[-85.621521,41.951149]},"n4148":{"id":"n4148","loc":[-85.621522,41.951228]},"n4149":{"id":"n4149","loc":[-85.621408,41.951228]},"n415":{"id":"n415","loc":[-85.633348,41.943895]},"n4150":{"id":"n4150","loc":[-85.621284,41.951219]},"n4151":{"id":"n4151","loc":[-85.621153,41.951219]},"n4152":{"id":"n4152","loc":[-85.621152,41.951152]},"n4153":{"id":"n4153","loc":[-85.621283,41.951152]},"n4154":{"id":"n4154","loc":[-85.621159,41.951241]},"n4155":{"id":"n4155","loc":[-85.62116,41.951301]},"n4156":{"id":"n4156","loc":[-85.621088,41.951302]},"n4157":{"id":"n4157","loc":[-85.621088,41.951241]},"n4158":{"id":"n4158","loc":[-85.621049,41.951158]},"n4159":{"id":"n4159","loc":[-85.62105,41.951229]},"n416":{"id":"n416","loc":[-85.633341,41.943888]},"n4160":{"id":"n4160","loc":[-85.620976,41.951229]},"n4161":{"id":"n4161","loc":[-85.620977,41.951295]},"n4162":{"id":"n4162","loc":[-85.620887,41.951296]},"n4163":{"id":"n4163","loc":[-85.620886,41.951229]},"n4164":{"id":"n4164","loc":[-85.620862,41.951229]},"n4165":{"id":"n4165","loc":[-85.620861,41.951159]},"n4166":{"id":"n4166","loc":[-85.620626,41.951133]},"n4167":{"id":"n4167","loc":[-85.620626,41.951205]},"n4168":{"id":"n4168","loc":[-85.620412,41.951206]},"n4169":{"id":"n4169","loc":[-85.620411,41.951134]},"n417":{"id":"n417","loc":[-85.633321,41.943898]},"n4170":{"id":"n4170","loc":[-85.621775,41.951443]},"n4171":{"id":"n4171","loc":[-85.621777,41.951264]},"n4172":{"id":"n4172","loc":[-85.621565,41.951654]},"n4173":{"id":"n4173","loc":[-85.621331,41.951439]},"n4174":{"id":"n4174","loc":[-85.621031,41.951443]},"n4175":{"id":"n4175","loc":[-85.621836,41.951724]},"n4176":{"id":"n4176","loc":[-85.621834,41.951621]},"n4177":{"id":"n4177","loc":[-85.62197,41.951619]},"n4178":{"id":"n4178","loc":[-85.621972,41.951722]},"n4179":{"id":"n4179","loc":[-85.621772,41.951638]},"n418":{"id":"n418","loc":[-85.633547,41.943896]},"n4180":{"id":"n4180","loc":[-85.621772,41.951715]},"n4181":{"id":"n4181","loc":[-85.621699,41.951716]},"n4182":{"id":"n4182","loc":[-85.6217,41.951722]},"n4183":{"id":"n4183","loc":[-85.621641,41.951722]},"n4184":{"id":"n4184","loc":[-85.62164,41.951639]},"n4185":{"id":"n4185","loc":[-85.621505,41.951655]},"n4186":{"id":"n4186","loc":[-85.621505,41.951729]},"n4187":{"id":"n4187","loc":[-85.621389,41.951729]},"n4188":{"id":"n4188","loc":[-85.62139,41.951654]},"n4189":{"id":"n4189","loc":[-85.621105,41.951635]},"n419":{"id":"n419","loc":[-85.633467,41.944075]},"n4190":{"id":"n4190","loc":[-85.621104,41.951576]},"n4191":{"id":"n4191","loc":[-85.621168,41.951576]},"n4192":{"id":"n4192","loc":[-85.621168,41.951595]},"n4193":{"id":"n4193","loc":[-85.621261,41.951595]},"n4194":{"id":"n4194","loc":[-85.621261,41.951646]},"n4195":{"id":"n4195","loc":[-85.621294,41.951646]},"n4196":{"id":"n4196","loc":[-85.621294,41.951732]},"n4197":{"id":"n4197","loc":[-85.621251,41.951732]},"n4198":{"id":"n4198","loc":[-85.621251,41.95174]},"n4199":{"id":"n4199","loc":[-85.621175,41.951741]},"n42":{"id":"n42","loc":[-85.635996,41.942727]},"n420":{"id":"n420","loc":[-85.633578,41.944055]},"n4200":{"id":"n4200","loc":[-85.621175,41.951651]},"n4201":{"id":"n4201","loc":[-85.621189,41.951651]},"n4202":{"id":"n4202","loc":[-85.621189,41.951635]},"n4203":{"id":"n4203","loc":[-85.620554,41.951641]},"n4204":{"id":"n4204","loc":[-85.620555,41.951742]},"n4205":{"id":"n4205","loc":[-85.620719,41.951742]},"n4206":{"id":"n4206","loc":[-85.620719,41.951731]},"n4207":{"id":"n4207","loc":[-85.620803,41.95173]},"n4208":{"id":"n4208","loc":[-85.620803,41.951603]},"n4209":{"id":"n4209","loc":[-85.62072,41.951603]},"n421":{"id":"n421","loc":[-85.633462,41.944125]},"n4210":{"id":"n4210","loc":[-85.620721,41.951641]},"n4211":{"id":"n4211","loc":[-85.620269,41.953053]},"n4212":{"id":"n4212","loc":[-85.620229,41.953051]},"n4213":{"id":"n4213","loc":[-85.620231,41.953013]},"n4214":{"id":"n4214","loc":[-85.620271,41.953015]},"n4215":{"id":"n4215","loc":[-85.620215,41.953133]},"n4216":{"id":"n4216","loc":[-85.62013,41.953134]},"n4217":{"id":"n4217","loc":[-85.620129,41.953083]},"n4218":{"id":"n4218","loc":[-85.620214,41.953082]},"n4219":{"id":"n4219","loc":[-85.62016,41.953272]},"n422":{"id":"n422","loc":[-85.633372,41.944061]},"n4220":{"id":"n4220","loc":[-85.620046,41.953273]},"n4221":{"id":"n4221","loc":[-85.620045,41.953171]},"n4222":{"id":"n4222","loc":[-85.620088,41.953171]},"n4223":{"id":"n4223","loc":[-85.620087,41.953162]},"n4224":{"id":"n4224","loc":[-85.620121,41.953162]},"n4225":{"id":"n4225","loc":[-85.620121,41.953173]},"n4226":{"id":"n4226","loc":[-85.620157,41.953173]},"n4227":{"id":"n4227","loc":[-85.620158,41.953196]},"n4228":{"id":"n4228","loc":[-85.620189,41.953196]},"n4229":{"id":"n4229","loc":[-85.620189,41.953246]},"n423":{"id":"n423","loc":[-85.633509,41.943981]},"n4230":{"id":"n4230","loc":[-85.62016,41.953246]},"n4231":{"id":"n4231","loc":[-85.6195,41.954012]},"n4232":{"id":"n4232","loc":[-85.619438,41.954057]},"n4233":{"id":"n4233","loc":[-85.619418,41.954043]},"n4234":{"id":"n4234","loc":[-85.619381,41.954069]},"n4235":{"id":"n4235","loc":[-85.619399,41.954083]},"n4236":{"id":"n4236","loc":[-85.619339,41.954126]},"n4237":{"id":"n4237","loc":[-85.619584,41.954313]},"n4238":{"id":"n4238","loc":[-85.619743,41.954198]},"n4239":{"id":"n4239","loc":[-85.619453,41.954727]},"n424":{"id":"n424","loc":[-85.635421,41.945367]},"n4240":{"id":"n4240","loc":[-85.619503,41.954581]},"n4241":{"id":"n4241","loc":[-85.619597,41.954472]},"n4242":{"id":"n4242","loc":[-85.619862,41.95419]},"n4243":{"id":"n4243","loc":[-85.619506,41.953907]},"n4244":{"id":"n4244","loc":[-85.619261,41.9541]},"n4245":{"id":"n4245","loc":[-85.619246,41.954139]},"n4246":{"id":"n4246","loc":[-85.619244,41.9542]},"n4247":{"id":"n4247","loc":[-85.619259,41.954243]},"n4248":{"id":"n4248","loc":[-85.619285,41.954274]},"n4249":{"id":"n4249","loc":[-85.619123,41.954381]},"n425":{"id":"n425","loc":[-85.634425,41.943552]},"n4250":{"id":"n4250","loc":[-85.619641,41.954607]},"n4251":{"id":"n4251","loc":[-85.619383,41.954615]},"n4252":{"id":"n4252","loc":[-85.61896,41.954391]},"n4253":{"id":"n4253","loc":[-85.619211,41.954178]},"n4254":{"id":"n4254","loc":[-85.619115,41.954102]},"n4255":{"id":"n4255","loc":[-85.619519,41.953821]},"n4256":{"id":"n4256","loc":[-85.619956,41.954156]},"n4257":{"id":"n4257","loc":[-85.619851,41.954266]},"n4258":{"id":"n4258","loc":[-85.619779,41.95436]},"n4259":{"id":"n4259","loc":[-85.620525,41.954364]},"n426":{"id":"n426","loc":[-85.634248,41.943654]},"n4260":{"id":"n4260","loc":[-85.620398,41.954365]},"n4261":{"id":"n4261","loc":[-85.620398,41.954324]},"n4262":{"id":"n4262","loc":[-85.620525,41.954323]},"n4263":{"id":"n4263","loc":[-85.620359,41.954588]},"n4264":{"id":"n4264","loc":[-85.620321,41.954588]},"n4265":{"id":"n4265","loc":[-85.620321,41.954599]},"n4266":{"id":"n4266","loc":[-85.620296,41.954599]},"n4267":{"id":"n4267","loc":[-85.620296,41.954587]},"n4268":{"id":"n4268","loc":[-85.620262,41.954588]},"n4269":{"id":"n4269","loc":[-85.620261,41.954516]},"n427":{"id":"n427","loc":[-85.634177,41.943585]},"n4270":{"id":"n4270","loc":[-85.620282,41.954516]},"n4271":{"id":"n4271","loc":[-85.620282,41.954373]},"n4272":{"id":"n4272","loc":[-85.620378,41.954373]},"n4273":{"id":"n4273","loc":[-85.620379,41.954486]},"n4274":{"id":"n4274","loc":[-85.620348,41.954486]},"n4275":{"id":"n4275","loc":[-85.620348,41.954537]},"n4276":{"id":"n4276","loc":[-85.620359,41.954537]},"n4277":{"id":"n4277","loc":[-85.620463,41.95521]},"n4278":{"id":"n4278","loc":[-85.620409,41.955273]},"n4279":{"id":"n4279","loc":[-85.620205,41.955177]},"n428":{"id":"n428","loc":[-85.634354,41.943484]},"n4280":{"id":"n4280","loc":[-85.620288,41.955079]},"n4281":{"id":"n4281","loc":[-85.620379,41.955121]},"n4282":{"id":"n4282","loc":[-85.620349,41.955157]},"n4283":{"id":"n4283","loc":[-85.620083,41.955101]},"n4284":{"id":"n4284","loc":[-85.620083,41.954986]},"n4285":{"id":"n4285","loc":[-85.620016,41.954986]},"n4286":{"id":"n4286","loc":[-85.620016,41.954999]},"n4287":{"id":"n4287","loc":[-85.619941,41.954999]},"n4288":{"id":"n4288","loc":[-85.619941,41.954988]},"n4289":{"id":"n4289","loc":[-85.619815,41.954988]},"n429":{"id":"n429","loc":[-85.638577,41.943212]},"n4290":{"id":"n4290","loc":[-85.619815,41.955075]},"n4291":{"id":"n4291","loc":[-85.619948,41.955075]},"n4292":{"id":"n4292","loc":[-85.619948,41.955082]},"n4293":{"id":"n4293","loc":[-85.620004,41.955082]},"n4294":{"id":"n4294","loc":[-85.620004,41.955101]},"n4295":{"id":"n4295","loc":[-85.619293,41.955127]},"n4296":{"id":"n4296","loc":[-85.619208,41.955124]},"n4297":{"id":"n4297","loc":[-85.619212,41.955061]},"n4298":{"id":"n4298","loc":[-85.619297,41.955064]},"n4299":{"id":"n4299","loc":[-85.619068,41.954936]},"n43":{"id":"n43","loc":[-85.637047,41.943054]},"n430":{"id":"n430","loc":[-85.638576,41.943219]},"n4300":{"id":"n4300","loc":[-85.619003,41.954936]},"n4301":{"id":"n4301","loc":[-85.619004,41.955003]},"n4302":{"id":"n4302","loc":[-85.618994,41.955003]},"n4303":{"id":"n4303","loc":[-85.618994,41.955016]},"n4304":{"id":"n4304","loc":[-85.618973,41.955016]},"n4305":{"id":"n4305","loc":[-85.618973,41.955071]},"n4306":{"id":"n4306","loc":[-85.619061,41.955071]},"n4307":{"id":"n4307","loc":[-85.61906,41.955024]},"n4308":{"id":"n4308","loc":[-85.619105,41.955024]},"n4309":{"id":"n4309","loc":[-85.619105,41.954956]},"n431":{"id":"n431","loc":[-85.638653,41.943078]},"n4310":{"id":"n4310","loc":[-85.619068,41.954956]},"n4311":{"id":"n4311","loc":[-85.618294,41.954596]},"n4312":{"id":"n4312","loc":[-85.618235,41.954602]},"n4313":{"id":"n4313","loc":[-85.618222,41.954535]},"n4314":{"id":"n4314","loc":[-85.618281,41.954529]},"n4315":{"id":"n4315","loc":[-85.618593,41.954556]},"n4316":{"id":"n4316","loc":[-85.618551,41.954565]},"n4317":{"id":"n4317","loc":[-85.618545,41.954552]},"n4318":{"id":"n4318","loc":[-85.618493,41.954563]},"n4319":{"id":"n4319","loc":[-85.618449,41.954455]},"n432":{"id":"n432","loc":[-85.638654,41.943148]},"n4320":{"id":"n4320","loc":[-85.618544,41.954434]},"n4321":{"id":"n4321","loc":[-85.622545,41.950775]},"n4322":{"id":"n4322","loc":[-85.622546,41.950843]},"n4323":{"id":"n4323","loc":[-85.622503,41.950844]},"n4324":{"id":"n4324","loc":[-85.622503,41.950853]},"n4325":{"id":"n4325","loc":[-85.622479,41.950853]},"n4326":{"id":"n4326","loc":[-85.622478,41.950843]},"n4327":{"id":"n4327","loc":[-85.622425,41.950843]},"n4328":{"id":"n4328","loc":[-85.622425,41.950808]},"n4329":{"id":"n4329","loc":[-85.622366,41.950809]},"n433":{"id":"n433","loc":[-85.638387,41.943151]},"n4330":{"id":"n4330","loc":[-85.622364,41.950673]},"n4331":{"id":"n4331","loc":[-85.622448,41.950673]},"n4332":{"id":"n4332","loc":[-85.622449,41.950732]},"n4333":{"id":"n4333","loc":[-85.622479,41.950731]},"n4334":{"id":"n4334","loc":[-85.622479,41.950775]},"n4335":{"id":"n4335","loc":[-85.621909,41.950641]},"n4336":{"id":"n4336","loc":[-85.621864,41.950641]},"n4337":{"id":"n4337","loc":[-85.621865,41.950567]},"n4338":{"id":"n4338","loc":[-85.62191,41.950567]},"n4339":{"id":"n4339","loc":[-85.621787,41.950829]},"n434":{"id":"n434","loc":[-85.638386,41.94308]},"n4340":{"id":"n4340","loc":[-85.621786,41.950775]},"n4341":{"id":"n4341","loc":[-85.621588,41.950776]},"n4342":{"id":"n4342","loc":[-85.621589,41.950848]},"n4343":{"id":"n4343","loc":[-85.621737,41.950847]},"n4344":{"id":"n4344","loc":[-85.621737,41.950829]},"n4345":{"id":"n4345","loc":[-85.621509,41.950846]},"n4346":{"id":"n4346","loc":[-85.621399,41.950846]},"n4347":{"id":"n4347","loc":[-85.621398,41.95073]},"n4348":{"id":"n4348","loc":[-85.621509,41.95073]},"n4349":{"id":"n4349","loc":[-85.621217,41.950841]},"n435":{"id":"n435","loc":[-85.634427,41.943533]},"n4350":{"id":"n4350","loc":[-85.6211,41.95084]},"n4351":{"id":"n4351","loc":[-85.6211,41.950777]},"n4352":{"id":"n4352","loc":[-85.621218,41.950778]},"n4353":{"id":"n4353","loc":[-85.621055,41.950764]},"n4354":{"id":"n4354","loc":[-85.621054,41.950826]},"n4355":{"id":"n4355","loc":[-85.620988,41.950826]},"n4356":{"id":"n4356","loc":[-85.620988,41.950843]},"n4357":{"id":"n4357","loc":[-85.620842,41.950843]},"n4358":{"id":"n4358","loc":[-85.620842,41.950764]},"n4359":{"id":"n4359","loc":[-85.620825,41.950922]},"n436":{"id":"n436","loc":[-85.63428,41.943229]},"n4360":{"id":"n4360","loc":[-85.620824,41.950553]},"n4361":{"id":"n4361","loc":[-85.620543,41.950771]},"n4362":{"id":"n4362","loc":[-85.620431,41.950772]},"n4363":{"id":"n4363","loc":[-85.62043,41.950585]},"n4364":{"id":"n4364","loc":[-85.620542,41.950585]},"n4365":{"id":"n4365","loc":[-85.62068,41.950505]},"n4366":{"id":"n4366","loc":[-85.620681,41.950552]},"n4367":{"id":"n4367","loc":[-85.620589,41.950553]},"n4368":{"id":"n4368","loc":[-85.620588,41.950506]},"n4369":{"id":"n4369","loc":[-85.620539,41.950407]},"n437":{"id":"n437","loc":[-85.634499,41.943461]},"n4370":{"id":"n4370","loc":[-85.62054,41.950504]},"n4371":{"id":"n4371","loc":[-85.620416,41.950504]},"n4372":{"id":"n4372","loc":[-85.620416,41.950408]},"n4373":{"id":"n4373","loc":[-85.620742,41.95038]},"n4374":{"id":"n4374","loc":[-85.620527,41.95038]},"n4375":{"id":"n4375","loc":[-85.620528,41.950408]},"n4376":{"id":"n4376","loc":[-85.622449,41.950373]},"n4377":{"id":"n4377","loc":[-85.622452,41.950397]},"n4378":{"id":"n4378","loc":[-85.622336,41.950404]},"n4379":{"id":"n4379","loc":[-85.622333,41.950379]},"n438":{"id":"n438","loc":[-85.634514,41.943486]},"n4380":{"id":"n4380","loc":[-85.622263,41.950324]},"n4381":{"id":"n4381","loc":[-85.622261,41.950256]},"n4382":{"id":"n4382","loc":[-85.62236,41.950254]},"n4383":{"id":"n4383","loc":[-85.62236,41.95027]},"n4384":{"id":"n4384","loc":[-85.622402,41.950281]},"n4385":{"id":"n4385","loc":[-85.622403,41.9503]},"n4386":{"id":"n4386","loc":[-85.622439,41.950299]},"n4387":{"id":"n4387","loc":[-85.62244,41.950334]},"n4388":{"id":"n4388","loc":[-85.622414,41.950335]},"n4389":{"id":"n4389","loc":[-85.622414,41.95036]},"n439":{"id":"n439","loc":[-85.63452,41.943511]},"n4390":{"id":"n4390","loc":[-85.62231,41.950362]},"n4391":{"id":"n4391","loc":[-85.622309,41.950323]},"n4392":{"id":"n4392","loc":[-85.622015,41.950539]},"n4393":{"id":"n4393","loc":[-85.621909,41.95054]},"n4394":{"id":"n4394","loc":[-85.621909,41.950472]},"n4395":{"id":"n4395","loc":[-85.622015,41.950471]},"n4396":{"id":"n4396","loc":[-85.62199,41.950439]},"n4397":{"id":"n4397","loc":[-85.621956,41.95044]},"n4398":{"id":"n4398","loc":[-85.621955,41.950405]},"n4399":{"id":"n4399","loc":[-85.621988,41.950404]},"n44":{"id":"n44","loc":[-85.636799,41.943055]},"n440":{"id":"n440","loc":[-85.63451,41.943534]},"n4400":{"id":"n4400","loc":[-85.621668,41.950418]},"n4401":{"id":"n4401","loc":[-85.621667,41.950343]},"n4402":{"id":"n4402","loc":[-85.621745,41.950342]},"n4403":{"id":"n4403","loc":[-85.621744,41.950306]},"n4404":{"id":"n4404","loc":[-85.621764,41.950306]},"n4405":{"id":"n4405","loc":[-85.621763,41.950254]},"n4406":{"id":"n4406","loc":[-85.621861,41.950253]},"n4407":{"id":"n4407","loc":[-85.621861,41.950274]},"n4408":{"id":"n4408","loc":[-85.621896,41.950273]},"n4409":{"id":"n4409","loc":[-85.621898,41.950389]},"n441":{"id":"n441","loc":[-85.634483,41.943556]},"n4410":{"id":"n4410","loc":[-85.621843,41.95039]},"n4411":{"id":"n4411","loc":[-85.621843,41.950425]},"n4412":{"id":"n4412","loc":[-85.621789,41.950425]},"n4413":{"id":"n4413","loc":[-85.621789,41.950386]},"n4414":{"id":"n4414","loc":[-85.621752,41.950387]},"n4415":{"id":"n4415","loc":[-85.621753,41.950417]},"n4416":{"id":"n4416","loc":[-85.621556,41.950562]},"n4417":{"id":"n4417","loc":[-85.621552,41.950217]},"n4418":{"id":"n4418","loc":[-85.621788,41.950562]},"n4419":{"id":"n4419","loc":[-85.621155,41.950562]},"n442":{"id":"n442","loc":[-85.63419,41.943713]},"n4420":{"id":"n4420","loc":[-85.622473,41.950551]},"n4421":{"id":"n4421","loc":[-85.622043,41.950551]},"n4422":{"id":"n4422","loc":[-85.62142,41.950454]},"n4423":{"id":"n4423","loc":[-85.621315,41.950455]},"n4424":{"id":"n4424","loc":[-85.621313,41.950311]},"n4425":{"id":"n4425","loc":[-85.621388,41.950311]},"n4426":{"id":"n4426","loc":[-85.621387,41.950261]},"n4427":{"id":"n4427","loc":[-85.621468,41.95026]},"n4428":{"id":"n4428","loc":[-85.621468,41.950271]},"n4429":{"id":"n4429","loc":[-85.621503,41.95027]},"n443":{"id":"n443","loc":[-85.634462,41.943294]},"n4430":{"id":"n4430","loc":[-85.621505,41.950353]},"n4431":{"id":"n4431","loc":[-85.621483,41.950354]},"n4432":{"id":"n4432","loc":[-85.621483,41.950392]},"n4433":{"id":"n4433","loc":[-85.621419,41.950393]},"n4434":{"id":"n4434","loc":[-85.621213,41.95039]},"n4435":{"id":"n4435","loc":[-85.621127,41.950391]},"n4436":{"id":"n4436","loc":[-85.621126,41.950357]},"n4437":{"id":"n4437","loc":[-85.621094,41.950357]},"n4438":{"id":"n4438","loc":[-85.621094,41.950391]},"n4439":{"id":"n4439","loc":[-85.620977,41.950392]},"n444":{"id":"n444","loc":[-85.634298,41.943389]},"n4440":{"id":"n4440","loc":[-85.620975,41.950278]},"n4441":{"id":"n4441","loc":[-85.621087,41.950277]},"n4442":{"id":"n4442","loc":[-85.621088,41.950331]},"n4443":{"id":"n4443","loc":[-85.621211,41.950312]},"n4444":{"id":"n4444","loc":[-85.621104,41.950313]},"n4445":{"id":"n4445","loc":[-85.621105,41.950331]},"n4446":{"id":"n4446","loc":[-85.620706,41.950328]},"n4447":{"id":"n4447","loc":[-85.620606,41.950327]},"n4448":{"id":"n4448","loc":[-85.620607,41.950261]},"n4449":{"id":"n4449","loc":[-85.620707,41.950262]},"n445":{"id":"n445","loc":[-85.634527,41.943623]},"n4450":{"id":"n4450","loc":[-85.620599,41.950336]},"n4451":{"id":"n4451","loc":[-85.620559,41.950336]},"n4452":{"id":"n4452","loc":[-85.620559,41.950299]},"n4453":{"id":"n4453","loc":[-85.620599,41.950299]},"n4454":{"id":"n4454","loc":[-85.620545,41.950357]},"n4455":{"id":"n4455","loc":[-85.620418,41.950357]},"n4456":{"id":"n4456","loc":[-85.620417,41.950257]},"n4457":{"id":"n4457","loc":[-85.620544,41.950256]},"n4458":{"id":"n4458","loc":[-85.620246,41.950131],"tags":{"highway":"crossing"}},"n4459":{"id":"n4459","loc":[-85.620252,41.950956]},"n446":{"id":"n446","loc":[-85.634608,41.943577]},"n4460":{"id":"n4460","loc":[-85.620245,41.950179]},"n4461":{"id":"n4461","loc":[-85.620246,41.950088]},"n4462":{"id":"n4462","loc":[-85.620251,41.950885]},"n4463":{"id":"n4463","loc":[-85.620103,41.950884],"tags":{"crossing":"zebra","highway":"crossing"}},"n4464":{"id":"n4464","loc":[-85.619992,41.950884]},"n4465":{"id":"n4465","loc":[-85.619704,41.951008]},"n4466":{"id":"n4466","loc":[-85.619599,41.951122]},"n4467":{"id":"n4467","loc":[-85.619264,41.951486]},"n4468":{"id":"n4468","loc":[-85.619179,41.951573],"tags":{"highway":"crossing"}},"n4469":{"id":"n4469","loc":[-85.620251,41.950999],"tags":{"highway":"crossing"}},"n447":{"id":"n447","loc":[-85.634555,41.943531]},"n4470":{"id":"n4470","loc":[-85.620249,41.951066]},"n4471":{"id":"n4471","loc":[-85.620256,41.951374]},"n4472":{"id":"n4472","loc":[-85.620249,41.951389]},"n4473":{"id":"n4473","loc":[-85.620249,41.951407]},"n4474":{"id":"n4474","loc":[-85.620255,41.951423]},"n4475":{"id":"n4475","loc":[-85.62026,41.951853]},"n4476":{"id":"n4476","loc":[-85.620262,41.951894],"tags":{"highway":"crossing"}},"n4477":{"id":"n4477","loc":[-85.620265,41.951957]},"n4478":{"id":"n4478","loc":[-85.620262,41.952135]},"n4479":{"id":"n4479","loc":[-85.620241,41.952424]},"n448":{"id":"n448","loc":[-85.634555,41.943482]},"n4480":{"id":"n4480","loc":[-85.620213,41.952583]},"n4481":{"id":"n4481","loc":[-85.620158,41.952754]},"n4482":{"id":"n4482","loc":[-85.620065,41.952942]},"n4483":{"id":"n4483","loc":[-85.619753,41.953439]},"n4484":{"id":"n4484","loc":[-85.619605,41.953626]},"n4485":{"id":"n4485","loc":[-85.619381,41.953834]},"n4486":{"id":"n4486","loc":[-85.619069,41.954066]},"n4487":{"id":"n4487","loc":[-85.618674,41.95429]},"n4488":{"id":"n4488","loc":[-85.621816,41.952389]},"n4489":{"id":"n4489","loc":[-85.6217,41.952386]},"n449":{"id":"n449","loc":[-85.634509,41.943427]},"n4490":{"id":"n4490","loc":[-85.621705,41.952306]},"n4491":{"id":"n4491","loc":[-85.621821,41.95231]},"n4492":{"id":"n4492","loc":[-85.621819,41.952272]},"n4493":{"id":"n4493","loc":[-85.621778,41.952272]},"n4494":{"id":"n4494","loc":[-85.621778,41.952199]},"n4495":{"id":"n4495","loc":[-85.621818,41.952199]},"n4496":{"id":"n4496","loc":[-85.621754,41.952281]},"n4497":{"id":"n4497","loc":[-85.621701,41.95228]},"n4498":{"id":"n4498","loc":[-85.621702,41.952197]},"n4499":{"id":"n4499","loc":[-85.621755,41.952197]},"n45":{"id":"n45","loc":[-85.636791,41.942792]},"n450":{"id":"n450","loc":[-85.63453,41.943365]},"n4500":{"id":"n4500","loc":[-85.628201,41.954694],"tags":{"highway":"stop","stop":"all"}},"n4501":{"id":"n4501","loc":[-85.627921,41.954783],"tags":{"highway":"stop","stop":"all"}},"n4502":{"id":"n4502","loc":[-85.62775,41.954696],"tags":{"highway":"stop","stop":"all"}},"n4503":{"id":"n4503","loc":[-85.628046,41.954591],"tags":{"highway":"stop","stop":"all"}},"n4504":{"id":"n4504","loc":[-85.631074,41.957428],"tags":{"highway":"stop"}},"n4505":{"id":"n4505","loc":[-85.630768,41.957429],"tags":{"highway":"stop"}},"n4506":{"id":"n4506","loc":[-85.629888,41.957432],"tags":{"highway":"stop"}},"n4507":{"id":"n4507","loc":[-85.629565,41.957433],"tags":{"highway":"stop"}},"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"}},"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"}},"n4536":{"id":"n4536","loc":[-85.630881,41.954806],"tags":{"highway":"stop"}},"n4537":{"id":"n4537","loc":[-85.630879,41.954564],"tags":{"highway":"stop"}},"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"}},"n4544":{"id":"n4544","loc":[-85.632071,41.959029],"tags":{"highway":"stop"}},"n4545":{"id":"n4545","loc":[-85.632257,41.959027],"tags":{"highway":"stop"}},"n4546":{"id":"n4546","loc":[-85.631966,41.957427],"tags":{"highway":"stop"}},"n4547":{"id":"n4547","loc":[-85.632297,41.957426],"tags":{"highway":"stop"}},"n4548":{"id":"n4548","loc":[-85.631976,41.955911],"tags":{"highway":"give_way"}},"n4549":{"id":"n4549","loc":[-85.632272,41.955911],"tags":{"highway":"give_way"}},"n455":{"id":"n455","loc":[-85.635224,41.943869]},"n4550":{"id":"n4550","loc":[-85.632097,41.954805],"tags":{"highway":"stop"}},"n4551":{"id":"n4551","loc":[-85.632094,41.954566],"tags":{"highway":"stop"}},"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"}},"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"}},"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"}},"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"}},"n4587":{"id":"n4587","loc":[-85.620485,41.951948],"tags":{"emergency":"fire_hydrant"}},"n4588":{"id":"n4588","loc":[-85.620316,41.950999],"tags":{"highway":"stop"}},"n4589":{"id":"n4589","loc":[-85.620311,41.950131],"tags":{"highway":"stop"}},"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"}},"n4592":{"id":"n4592","loc":[-85.620278,41.947443],"tags":{"highway":"stop"}},"n4593":{"id":"n4593","loc":[-85.619844,41.947444],"tags":{"highway":"stop"}},"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"}},"n4597":{"id":"n4597","loc":[-85.622739,41.947316],"tags":{"highway":"stop"}},"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"}},"n4602":{"id":"n4602","loc":[-85.622769,41.949325],"tags":{"highway":"stop"}},"n4603":{"id":"n4603","loc":[-85.622837,41.949329],"tags":{"emergency":"fire_hydrant"}},"n4604":{"id":"n4604","loc":[-85.622614,41.950113],"tags":{"highway":"give_way"}},"n4605":{"id":"n4605","loc":[-85.624777,41.949219],"tags":{"highway":"stop"}},"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"}},"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.61823,41.9499]},"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"}},"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"}},"n4685":{"id":"n4685","loc":[-85.635961,41.940125],"tags":{"highway":"stop"}},"n4686":{"id":"n4686","loc":[-85.635883,41.94012],"tags":{"crossing":"zebra","highway":"crossing"}},"n4687":{"id":"n4687","loc":[-85.635883,41.94006]},"n4688":{"id":"n4688","loc":[-85.635768,41.940051],"tags":{"crossing":"zebra","highway":"crossing"}},"n4689":{"id":"n4689","loc":[-85.635669,41.940043]},"n469":{"id":"n469","loc":[-85.634269,41.944431]},"n4690":{"id":"n4690","loc":[-85.635661,41.940107],"tags":{"crossing":"zebra","highway":"crossing"}},"n4691":{"id":"n4691","loc":[-85.635424,41.941005],"tags":{"amenity":"fountain"}},"n4692":{"id":"n4692","loc":[-85.635542,41.941371],"tags":{"amenity":"bench"}},"n4693":{"id":"n4693","loc":[-85.635709,41.941341],"tags":{"emergency":"fire_hydrant"}},"n4694":{"id":"n4694","loc":[-85.637038,41.942513],"tags":{"highway":"stop"}},"n4695":{"id":"n4695","loc":[-85.637174,41.941354],"tags":{"highway":"stop"}},"n4696":{"id":"n4696","loc":[-85.637091,41.941273],"tags":{"emergency":"fire_hydrant"}},"n4697":{"id":"n4697","loc":[-85.638058,41.941346],"tags":{"highway":"give_way"}},"n4698":{"id":"n4698","loc":[-85.638359,41.941344],"tags":{"highway":"give_way"}},"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"}},"n4702":{"id":"n4702","loc":[-85.639548,41.941334],"tags":{"highway":"give_way"}},"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"}},"n4706":{"id":"n4706","loc":[-85.640803,41.941324],"tags":{"highway":"stop"}},"n4707":{"id":"n4707","loc":[-85.641717,41.941317],"tags":{"highway":"stop"}},"n4708":{"id":"n4708","loc":[-85.641846,41.941415],"tags":{"highway":"stop"}},"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"}},"n4711":{"id":"n4711","loc":[-85.641854,41.942455],"tags":{"highway":"stop"}},"n4712":{"id":"n4712","loc":[-85.641859,41.942739],"tags":{"highway":"stop"}},"n4713":{"id":"n4713","loc":[-85.640754,41.942707],"tags":{"emergency":"fire_hydrant"}},"n4714":{"id":"n4714","loc":[-85.640669,41.942716],"tags":{"highway":"stop"}},"n4715":{"id":"n4715","loc":[-85.640664,41.942478],"tags":{"highway":"stop"}},"n4716":{"id":"n4716","loc":[-85.63964,41.94274],"tags":{"man_made":"flagpole"}},"n4717":{"id":"n4717","loc":[-85.639455,41.942731],"tags":{"highway":"stop"}},"n4718":{"id":"n4718","loc":[-85.63945,41.942492],"tags":{"highway":"stop"}},"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"}},"n4721":{"id":"n4721","loc":[-85.638233,41.942511],"tags":{"highway":"stop"}},"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"}},"n4726":{"id":"n4726","loc":[-85.633467,41.943818],"tags":{"highway":"stop"}},"n4727":{"id":"n4727","loc":[-85.633987,41.943531],"tags":{"highway":"stop"}},"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"}},"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"}},"n4746":{"id":"n4746","loc":[-85.639635,41.94387],"tags":{"highway":"stop"}},"n4747":{"id":"n4747","loc":[-85.639549,41.943756],"tags":{"emergency":"fire_hydrant"}},"n4748":{"id":"n4748","loc":[-85.64055,41.943862],"tags":{"highway":"stop"}},"n4749":{"id":"n4749","loc":[-85.640864,41.943859],"tags":{"highway":"stop"}},"n475":{"id":"n475","loc":[-85.633906,41.943535]},"n4750":{"id":"n4750","loc":[-85.640718,41.945022],"tags":{"highway":"stop"}},"n4751":{"id":"n4751","loc":[-85.640664,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4752":{"id":"n4752","loc":[-85.641913,41.94502],"tags":{"highway":"stop"}},"n4753":{"id":"n4753","loc":[-85.641838,41.945076],"tags":{"emergency":"fire_hydrant"}},"n4754":{"id":"n4754","loc":[-85.642045,41.94385],"tags":{"highway":"give_way"}},"n4755":{"id":"n4755","loc":[-85.641738,41.943852],"tags":{"highway":"give_way"}},"n4756":{"id":"n4756","loc":[-85.642928,41.943843],"tags":{"highway":"stop"}},"n4757":{"id":"n4757","loc":[-85.64305,41.943902],"tags":{"emergency":"fire_hydrant"}},"n4758":{"id":"n4758","loc":[-85.642986,41.945105],"tags":{"highway":"stop"}},"n4759":{"id":"n4759","loc":[-85.643136,41.94502],"tags":{"highway":"stop"}},"n476":{"id":"n476","loc":[-85.63423,41.943692]},"n4760":{"id":"n4760","loc":[-85.63169,41.947812]},"n4761":{"id":"n4761","loc":[-85.631307,41.947655]},"n4762":{"id":"n4762","loc":[-85.631407,41.947413]},"n4763":{"id":"n4763","loc":[-85.631173,41.947306]},"n4764":{"id":"n4764","loc":[-85.631316,41.947145]},"n4765":{"id":"n4765","loc":[-85.631476,41.947087]},"n4766":{"id":"n4766","loc":[-85.631793,41.946871]},"n4767":{"id":"n4767","loc":[-85.631884,41.946723]},"n4768":{"id":"n4768","loc":[-85.631814,41.946397]},"n4769":{"id":"n4769","loc":[-85.631382,41.947685]},"n477":{"id":"n477","loc":[-85.635096,41.942814]},"n4770":{"id":"n4770","loc":[-85.63109,41.947819]},"n4771":{"id":"n4771","loc":[-85.630921,41.947961]},"n4772":{"id":"n4772","loc":[-85.630249,41.947709]},"n4773":{"id":"n4773","loc":[-85.630149,41.947451]},"n4774":{"id":"n4774","loc":[-85.629733,41.947339]},"n4775":{"id":"n4775","loc":[-85.629755,41.946948]},"n4776":{"id":"n4776","loc":[-85.630457,41.947103]},"n4777":{"id":"n4777","loc":[-85.630934,41.946939]},"n4778":{"id":"n4778","loc":[-85.631277,41.946852]},"n4779":{"id":"n4779","loc":[-85.63142,41.946781]},"n478":{"id":"n478","loc":[-85.635058,41.942795]},"n4780":{"id":"n4780","loc":[-85.631116,41.946474]},"n4781":{"id":"n4781","loc":[-85.63073,41.945965]},"n4782":{"id":"n4782","loc":[-85.631337,41.94571]},"n4783":{"id":"n4783","loc":[-85.631589,41.945487]},"n4784":{"id":"n4784","loc":[-85.632278,41.945784]},"n4785":{"id":"n4785","loc":[-85.632105,41.946034]},"n4786":{"id":"n4786","loc":[-85.632532,41.946198]},"n4787":{"id":"n4787","loc":[-85.632566,41.946151]},"n4788":{"id":"n4788","loc":[-85.632684,41.946196]},"n4789":{"id":"n4789","loc":[-85.628676,41.947106]},"n479":{"id":"n479","loc":[-85.635002,41.94279]},"n4790":{"id":"n4790","loc":[-85.628973,41.946476]},"n4791":{"id":"n4791","loc":[-85.629094,41.946079]},"n4792":{"id":"n4792","loc":[-85.629226,41.94578]},"n4793":{"id":"n4793","loc":[-85.629479,41.945682]},"n4794":{"id":"n4794","loc":[-85.630606,41.94569]},"n4795":{"id":"n4795","loc":[-85.631255,41.945588]},"n4796":{"id":"n4796","loc":[-85.631546,41.945281]},"n4797":{"id":"n4797","loc":[-85.631629,41.944823]},"n4798":{"id":"n4798","loc":[-85.631766,41.944958]},"n4799":{"id":"n4799","loc":[-85.631689,41.945318]},"n48":{"id":"n48","loc":[-85.636689,41.94276]},"n480":{"id":"n480","loc":[-85.634908,41.94279]},"n4800":{"id":"n4800","loc":[-85.615069,41.945527]},"n4801":{"id":"n4801","loc":[-85.615058,41.946677]},"n4802":{"id":"n4802","loc":[-85.613692,41.946689]},"n4803":{"id":"n4803","loc":[-85.613475,41.946531]},"n4804":{"id":"n4804","loc":[-85.611717,41.946252]},"n4805":{"id":"n4805","loc":[-85.611353,41.946385]},"n4806":{"id":"n4806","loc":[-85.611304,41.947397]},"n4807":{"id":"n4807","loc":[-85.610564,41.947401]},"n4808":{"id":"n4808","loc":[-85.610553,41.947122]},"n4809":{"id":"n4809","loc":[-85.610194,41.946992]},"n481":{"id":"n481","loc":[-85.634478,41.942342]},"n4810":{"id":"n4810","loc":[-85.609976,41.946628]},"n4811":{"id":"n4811","loc":[-85.609769,41.946523]},"n4812":{"id":"n4812","loc":[-85.609307,41.946523]},"n4813":{"id":"n4813","loc":[-85.609035,41.946462]},"n4814":{"id":"n4814","loc":[-85.609018,41.943277]},"n4815":{"id":"n4815","loc":[-85.609617,41.943423]},"n4816":{"id":"n4816","loc":[-85.610471,41.943447]},"n4817":{"id":"n4817","loc":[-85.621491,41.949168]},"n4818":{"id":"n4818","loc":[-85.620266,41.94917]},"n4819":{"id":"n4819","loc":[-85.620262,41.947557]},"n482":{"id":"n482","loc":[-85.634521,41.942254]},"n4820":{"id":"n4820","loc":[-85.620825,41.947556]},"n4821":{"id":"n4821","loc":[-85.620827,41.948371]},"n4822":{"id":"n4822","loc":[-85.621489,41.94837]},"n4823":{"id":"n4823","loc":[-85.622865,41.950928]},"n4824":{"id":"n4824","loc":[-85.622858,41.949744]},"n4825":{"id":"n4825","loc":[-85.623696,41.949714]},"n4826":{"id":"n4826","loc":[-85.623696,41.949647]},"n4827":{"id":"n4827","loc":[-85.624019,41.949647]},"n4828":{"id":"n4828","loc":[-85.624024,41.950093]},"n4829":{"id":"n4829","loc":[-85.622885,41.949711]},"n483":{"id":"n483","loc":[-85.63425,41.941819]},"n4830":{"id":"n4830","loc":[-85.624584,41.951049]},"n4831":{"id":"n4831","loc":[-85.624669,41.9511]},"n4832":{"id":"n4832","loc":[-85.624316,41.952218]},"n4833":{"id":"n4833","loc":[-85.623819,41.952094]},"n4834":{"id":"n4834","loc":[-85.623385,41.952101]},"n4835":{"id":"n4835","loc":[-85.623456,41.951238]},"n4836":{"id":"n4836","loc":[-85.623535,41.951051]},"n4837":{"id":"n4837","loc":[-85.624693,41.950921]},"n4838":{"id":"n4838","loc":[-85.624727,41.950897]},"n4839":{"id":"n4839","loc":[-85.624869,41.950341]},"n484":{"id":"n484","loc":[-85.634324,41.942131]},"n4840":{"id":"n4840","loc":[-85.624859,41.949284]},"n4841":{"id":"n4841","loc":[-85.624788,41.949262]},"n4842":{"id":"n4842","loc":[-85.62402,41.949265]},"n4843":{"id":"n4843","loc":[-85.610382,41.954663]},"n4844":{"id":"n4844","loc":[-85.605675,41.954667]},"n4845":{"id":"n4845","loc":[-85.605669,41.949407]},"n4846":{"id":"n4846","loc":[-85.610376,41.949404]},"n4847":{"id":"n4847","loc":[-85.605552,41.958536]},"n4848":{"id":"n4848","loc":[-85.595755,41.958588]},"n4849":{"id":"n4849","loc":[-85.595732,41.956419]},"n485":{"id":"n485","loc":[-85.634211,41.941374]},"n4850":{"id":"n4850","loc":[-85.596908,41.955605]},"n4851":{"id":"n4851","loc":[-85.597723,41.955596]},"n4852":{"id":"n4852","loc":[-85.597715,41.954967]},"n4853":{"id":"n4853","loc":[-85.5874,41.955018]},"n4854":{"id":"n4854","loc":[-85.586615,41.955124]},"n4855":{"id":"n4855","loc":[-85.58613,41.955293]},"n4856":{"id":"n4856","loc":[-85.586166,41.962122]},"n4857":{"id":"n4857","loc":[-85.587008,41.955052]},"n4858":{"id":"n4858","loc":[-85.591685,41.95499]},"n4859":{"id":"n4859","loc":[-85.591718,41.956649]},"n486":{"id":"n486","loc":[-85.634085,41.940704]},"n4860":{"id":"n4860","loc":[-85.591133,41.956649]},"n4861":{"id":"n4861","loc":[-85.591061,41.95582]},"n4862":{"id":"n4862","loc":[-85.590677,41.95613]},"n4863":{"id":"n4863","loc":[-85.590826,41.956369]},"n4864":{"id":"n4864","loc":[-85.591016,41.954991]},"n4865":{"id":"n4865","loc":[-85.587656,41.954855]},"n4866":{"id":"n4866","loc":[-85.5964,41.955274]},"n4867":{"id":"n4867","loc":[-85.58776,41.96178]},"n4868":{"id":"n4868","loc":[-85.601172,41.960448]},"n4869":{"id":"n4869","loc":[-85.589489,41.960478]},"n487":{"id":"n487","loc":[-85.635567,41.940944]},"n4870":{"id":"n4870","loc":[-85.586664,41.960493]},"n4871":{"id":"n4871","loc":[-85.591227,41.95676]},"n4872":{"id":"n4872","loc":[-85.589424,41.958093]},"n4873":{"id":"n4873","loc":[-85.588779,41.957611]},"n4874":{"id":"n4874","loc":[-85.590583,41.956278]},"n4875":{"id":"n4875","loc":[-85.590759,41.957106]},"n4876":{"id":"n4876","loc":[-85.592213,41.958218]},"n4877":{"id":"n4877","loc":[-85.592262,41.958279]},"n4878":{"id":"n4878","loc":[-85.592304,41.958358]},"n4879":{"id":"n4879","loc":[-85.592351,41.95849]},"n488":{"id":"n488","loc":[-85.635542,41.940919]},"n4880":{"id":"n4880","loc":[-85.592363,41.958605]},"n4881":{"id":"n4881","loc":[-85.592383,41.96047]},"n4882":{"id":"n4882","loc":[-85.592376,41.959808]},"n4883":{"id":"n4883","loc":[-85.600825,41.959779]},"n4884":{"id":"n4884","loc":[-85.601084,41.959844]},"n4885":{"id":"n4885","loc":[-85.601144,41.959908]},"n4886":{"id":"n4886","loc":[-85.601164,41.960008]},"n4887":{"id":"n4887","loc":[-85.601162,41.960125]},"n4888":{"id":"n4888","loc":[-85.601134,41.960221]},"n4889":{"id":"n4889","loc":[-85.600993,41.960353]},"n489":{"id":"n489","loc":[-85.635514,41.940906]},"n4890":{"id":"n4890","loc":[-85.600794,41.960449]},"n4891":{"id":"n4891","loc":[-85.60098,41.959792]},"n4892":{"id":"n4892","loc":[-85.601067,41.960294]},"n4893":{"id":"n4893","loc":[-85.596829,41.959793]},"n4894":{"id":"n4894","loc":[-85.596839,41.960459]},"n4895":{"id":"n4895","loc":[-85.589364,41.958048]},"n4896":{"id":"n4896","loc":[-85.587374,41.959511]},"n4897":{"id":"n4897","loc":[-85.587286,41.959564]},"n4898":{"id":"n4898","loc":[-85.587163,41.959632]},"n4899":{"id":"n4899","loc":[-85.586694,41.959865]},"n49":{"id":"n49","loc":[-85.637127,41.942757]},"n490":{"id":"n490","loc":[-85.635469,41.940896]},"n4900":{"id":"n4900","loc":[-85.586634,41.959921]},"n4901":{"id":"n4901","loc":[-85.586607,41.960001]},"n4902":{"id":"n4902","loc":[-85.586599,41.960099]},"n4903":{"id":"n4903","loc":[-85.586602,41.96034]},"n4904":{"id":"n4904","loc":[-85.586669,41.960439]},"n4905":{"id":"n4905","loc":[-85.586758,41.960493]},"n4906":{"id":"n4906","loc":[-85.586618,41.960391]},"n4907":{"id":"n4907","loc":[-85.591201,41.956352]},"n4908":{"id":"n4908","loc":[-85.59112,41.954843]},"n4909":{"id":"n4909","loc":[-85.591536,41.956349]},"n491":{"id":"n491","loc":[-85.635667,41.940826]},"n4910":{"id":"n4910","loc":[-85.590953,41.956354]},"n4911":{"id":"n4911","loc":[-85.591468,41.956406]},"n4912":{"id":"n4912","loc":[-85.591469,41.956478]},"n4913":{"id":"n4913","loc":[-85.591123,41.956481]},"n4914":{"id":"n4914","loc":[-85.591121,41.956409]},"n4915":{"id":"n4915","loc":[-85.590826,41.955954]},"n4916":{"id":"n4916","loc":[-85.590612,41.956115]},"n4917":{"id":"n4917","loc":[-85.590402,41.955962]},"n4918":{"id":"n4918","loc":[-85.590622,41.955804]},"n4919":{"id":"n4919","loc":[-85.59011,41.956502]},"n492":{"id":"n492","loc":[-85.636197,41.940599]},"n4920":{"id":"n4920","loc":[-85.589877,41.956668]},"n4921":{"id":"n4921","loc":[-85.589777,41.95659]},"n4922":{"id":"n4922","loc":[-85.59001,41.956424]},"n4923":{"id":"n4923","loc":[-85.589595,41.956427]},"n4924":{"id":"n4924","loc":[-85.589434,41.956549]},"n4925":{"id":"n4925","loc":[-85.589262,41.956424]},"n4926":{"id":"n4926","loc":[-85.589422,41.956302]},"n4927":{"id":"n4927","loc":[-85.589358,41.956286]},"n4928":{"id":"n4928","loc":[-85.5892,41.956408]},"n4929":{"id":"n4929","loc":[-85.589032,41.956288]},"n493":{"id":"n493","loc":[-85.6362,41.940686]},"n4930":{"id":"n4930","loc":[-85.58919,41.956166]},"n4931":{"id":"n4931","loc":[-85.589165,41.956132]},"n4932":{"id":"n4932","loc":[-85.589002,41.956253]},"n4933":{"id":"n4933","loc":[-85.588826,41.956122]},"n4934":{"id":"n4934","loc":[-85.588989,41.956001]},"n4935":{"id":"n4935","loc":[-85.588673,41.955757]},"n4936":{"id":"n4936","loc":[-85.588502,41.955882]},"n4937":{"id":"n4937","loc":[-85.588339,41.955759]},"n4938":{"id":"n4938","loc":[-85.58851,41.955633]},"n4939":{"id":"n4939","loc":[-85.590382,41.955892]},"n494":{"id":"n494","loc":[-85.635969,41.94069]},"n4940":{"id":"n4940","loc":[-85.589923,41.956231]},"n4941":{"id":"n4941","loc":[-85.58984,41.956168]},"n4942":{"id":"n4942","loc":[-85.5903,41.95583]},"n4943":{"id":"n4943","loc":[-85.589636,41.956038]},"n4944":{"id":"n4944","loc":[-85.589546,41.956105]},"n4945":{"id":"n4945","loc":[-85.589045,41.955729]},"n4946":{"id":"n4946","loc":[-85.589135,41.955662]},"n4947":{"id":"n4947","loc":[-85.590718,41.955293]},"n4948":{"id":"n4948","loc":[-85.590718,41.955374]},"n4949":{"id":"n4949","loc":[-85.589211,41.955369]},"n495":{"id":"n495","loc":[-85.635965,41.940561]},"n4950":{"id":"n4950","loc":[-85.589212,41.955287]},"n4951":{"id":"n4951","loc":[-85.589675,41.956817]},"n4952":{"id":"n4952","loc":[-85.58947,41.95697]},"n4953":{"id":"n4953","loc":[-85.589219,41.956784]},"n4954":{"id":"n4954","loc":[-85.589425,41.95663]},"n4955":{"id":"n4955","loc":[-85.589373,41.95702]},"n4956":{"id":"n4956","loc":[-85.589171,41.957172]},"n4957":{"id":"n4957","loc":[-85.588962,41.957019]},"n4958":{"id":"n4958","loc":[-85.589164,41.956867]},"n4959":{"id":"n4959","loc":[-85.588881,41.955006]},"n496":{"id":"n496","loc":[-85.636031,41.94056]},"n4960":{"id":"n4960","loc":[-85.588804,41.955006]},"n4961":{"id":"n4961","loc":[-85.604773,41.954521]},"n4962":{"id":"n4962","loc":[-85.601603,41.954527]},"n4963":{"id":"n4963","loc":[-85.600823,41.954169]},"n4964":{"id":"n4964","loc":[-85.600828,41.950191]},"n4965":{"id":"n4965","loc":[-85.601673,41.949457]},"n4966":{"id":"n4966","loc":[-85.604464,41.949488]},"n4967":{"id":"n4967","loc":[-85.60538,41.950212]},"n4968":{"id":"n4968","loc":[-85.605395,41.954108]},"n4969":{"id":"n4969","loc":[-85.604771,41.954109]},"n497":{"id":"n497","loc":[-85.636032,41.940602]},"n4970":{"id":"n4970","loc":[-85.600613,41.953916]},"n4971":{"id":"n4971","loc":[-85.599758,41.954649]},"n4972":{"id":"n4972","loc":[-85.591194,41.954663]},"n4973":{"id":"n4973","loc":[-85.591182,41.950465]},"n4974":{"id":"n4974","loc":[-85.591871,41.950464]},"n4975":{"id":"n4975","loc":[-85.591868,41.949209]},"n4976":{"id":"n4976","loc":[-85.592155,41.949209]},"n4977":{"id":"n4977","loc":[-85.592155,41.94848]},"n4978":{"id":"n4978","loc":[-85.600615,41.948482]},"n4979":{"id":"n4979","loc":[-85.605421,41.949378]},"n498":{"id":"n498","loc":[-85.635776,41.940583]},"n4980":{"id":"n4980","loc":[-85.600614,41.949373]},"n4981":{"id":"n4981","loc":[-85.601316,41.94849]},"n4982":{"id":"n4982","loc":[-85.601592,41.947641]},"n4983":{"id":"n4983","loc":[-85.60395,41.947618]},"n4984":{"id":"n4984","loc":[-85.603973,41.948114]},"n4985":{"id":"n4985","loc":[-85.605398,41.948103]},"n4986":{"id":"n4986","loc":[-85.614017,41.965566]},"n4987":{"id":"n4987","loc":[-85.605787,41.965619]},"n4988":{"id":"n4988","loc":[-85.60577,41.963821]},"n4989":{"id":"n4989","loc":[-85.612886,41.963808]},"n499":{"id":"n499","loc":[-85.63589,41.940578]},"n4990":{"id":"n4990","loc":[-85.613207,41.963705]},"n4991":{"id":"n4991","loc":[-85.613511,41.963525]},"n4992":{"id":"n4992","loc":[-85.613667,41.963305]},"n4993":{"id":"n4993","loc":[-85.613779,41.962983]},"n4994":{"id":"n4994","loc":[-85.613797,41.959709]},"n4995":{"id":"n4995","loc":[-85.613663,41.95936]},"n4996":{"id":"n4996","loc":[-85.61339,41.959064]},"n4997":{"id":"n4997","loc":[-85.610503,41.956898]},"n4998":{"id":"n4998","loc":[-85.610485,41.956595]},"n4999":{"id":"n4999","loc":[-85.613892,41.956621]},"n5":{"id":"n5","loc":[-85.622744,41.95268]},"n50":{"id":"n50","loc":[-85.636673,41.943143]},"n500":{"id":"n500","loc":[-85.636198,41.940578]},"n5000":{"id":"n5000","loc":[-85.613866,41.958574]},"n5001":{"id":"n5001","loc":[-85.615262,41.958561]},"n5002":{"id":"n5002","loc":[-85.615279,41.959541]},"n5003":{"id":"n5003","loc":[-85.615314,41.95597]},"n5004":{"id":"n5004","loc":[-85.613887,41.955988]},"n5005":{"id":"n5005","loc":[-85.613074,41.962244]},"n5006":{"id":"n5006","loc":[-85.611678,41.963354]},"n5007":{"id":"n5007","loc":[-85.611678,41.963487]},"n5008":{"id":"n5008","loc":[-85.606906,41.963502]},"n5009":{"id":"n5009","loc":[-85.605777,41.962657]},"n501":{"id":"n501","loc":[-85.636251,41.940584]},"n5010":{"id":"n5010","loc":[-85.605711,41.9599]},"n5011":{"id":"n5011","loc":[-85.608139,41.9585]},"n5012":{"id":"n5012","loc":[-85.60814,41.956306]},"n5013":{"id":"n5013","loc":[-85.608854,41.95581]},"n5014":{"id":"n5014","loc":[-85.610039,41.955883]},"n5015":{"id":"n5015","loc":[-85.610068,41.956754]},"n5016":{"id":"n5016","loc":[-85.613058,41.959411]},"n5017":{"id":"n5017","loc":[-85.610234,41.957068]},"n5018":{"id":"n5018","loc":[-85.609826,41.95581]},"n5019":{"id":"n5019","loc":[-85.606987,41.958505]},"n502":{"id":"n502","loc":[-85.636279,41.940605]},"n5020":{"id":"n5020","loc":[-85.606498,41.958846]},"n5021":{"id":"n5021","loc":[-85.606013,41.959342]},"n5022":{"id":"n5022","loc":[-85.614553,41.961581]},"n5023":{"id":"n5023","loc":[-85.61465,41.96214]},"n5024":{"id":"n5024","loc":[-85.615277,41.962442]},"n5025":{"id":"n5025","loc":[-85.615451,41.962972]},"n5026":{"id":"n5026","loc":[-85.614355,41.964826]},"n5027":{"id":"n5027","loc":[-85.615133,41.964589]},"n5028":{"id":"n5028","loc":[-85.615342,41.963818]},"n5029":{"id":"n5029","loc":[-85.615971,41.963792]},"n503":{"id":"n503","loc":[-85.636285,41.940633]},"n5030":{"id":"n5030","loc":[-85.615751,41.963122]},"n5031":{"id":"n5031","loc":[-85.616575,41.963123]},"n5032":{"id":"n5032","loc":[-85.612527,41.963846]},"n5033":{"id":"n5033","loc":[-85.630653,41.940709]},"n5034":{"id":"n5034","loc":[-85.629858,41.939568]},"n5035":{"id":"n5035","loc":[-85.629847,41.937926]},"n504":{"id":"n504","loc":[-85.636281,41.940662]},"n505":{"id":"n505","loc":[-85.636266,41.940688]},"n506":{"id":"n506","loc":[-85.636236,41.940701]},"n507":{"id":"n507","loc":[-85.63619,41.940706]},"n508":{"id":"n508","loc":[-85.635892,41.940707]},"n509":{"id":"n509","loc":[-85.635777,41.9407]},"n51":{"id":"n51","loc":[-85.636673,41.942864]},"n510":{"id":"n510","loc":[-85.636044,41.940578]},"n511":{"id":"n511","loc":[-85.635946,41.940578]},"n512":{"id":"n512","loc":[-85.636475,41.940732]},"n513":{"id":"n513","loc":[-85.636475,41.940777]},"n514":{"id":"n514","loc":[-85.636405,41.940777]},"n515":{"id":"n515","loc":[-85.636405,41.940732]},"n516":{"id":"n516","loc":[-85.636471,41.940916]},"n517":{"id":"n517","loc":[-85.636471,41.940961]},"n518":{"id":"n518","loc":[-85.636404,41.940961]},"n519":{"id":"n519","loc":[-85.636404,41.940916]},"n52":{"id":"n52","loc":[-85.636227,41.942864]},"n520":{"id":"n520","loc":[-85.636286,41.941127]},"n521":{"id":"n521","loc":[-85.636203,41.941126]},"n522":{"id":"n522","loc":[-85.636204,41.941083]},"n523":{"id":"n523","loc":[-85.636287,41.941083]},"n524":{"id":"n524","loc":[-85.636124,41.941064]},"n525":{"id":"n525","loc":[-85.636,41.941065]},"n526":{"id":"n526","loc":[-85.636,41.940964]},"n527":{"id":"n527","loc":[-85.636045,41.940964]},"n528":{"id":"n528","loc":[-85.636045,41.940928]},"n529":{"id":"n529","loc":[-85.636111,41.940928]},"n53":{"id":"n53","loc":[-85.636227,41.943143]},"n530":{"id":"n530","loc":[-85.636111,41.940961]},"n531":{"id":"n531","loc":[-85.636123,41.940961]},"n532":{"id":"n532","loc":[-85.636124,41.940997]},"n533":{"id":"n533","loc":[-85.636164,41.940997]},"n534":{"id":"n534","loc":[-85.636164,41.941044]},"n535":{"id":"n535","loc":[-85.636124,41.941044]},"n536":{"id":"n536","loc":[-85.636534,41.941256]},"n537":{"id":"n537","loc":[-85.63645,41.941246]},"n538":{"id":"n538","loc":[-85.636462,41.941189]},"n539":{"id":"n539","loc":[-85.636546,41.941199]},"n54":{"id":"n54","loc":[-85.636198,41.943119]},"n540":{"id":"n540","loc":[-85.636802,41.941226]},"n541":{"id":"n541","loc":[-85.636701,41.941215]},"n542":{"id":"n542","loc":[-85.636709,41.941174]},"n543":{"id":"n543","loc":[-85.636656,41.941168]},"n544":{"id":"n544","loc":[-85.636666,41.941122]},"n545":{"id":"n545","loc":[-85.636781,41.941136]},"n546":{"id":"n546","loc":[-85.636774,41.94117]},"n547":{"id":"n547","loc":[-85.636812,41.941175]},"n548":{"id":"n548","loc":[-85.636803,41.941047]},"n549":{"id":"n549","loc":[-85.636785,41.941047]},"n55":{"id":"n55","loc":[-85.635945,41.94312]},"n550":{"id":"n550","loc":[-85.636785,41.941058]},"n551":{"id":"n551","loc":[-85.636644,41.941059]},"n552":{"id":"n552","loc":[-85.636644,41.941038]},"n553":{"id":"n553","loc":[-85.636581,41.941039]},"n554":{"id":"n554","loc":[-85.636581,41.940995]},"n555":{"id":"n555","loc":[-85.636746,41.940995]},"n556":{"id":"n556","loc":[-85.636746,41.940978]},"n557":{"id":"n557","loc":[-85.636803,41.940978]},"n558":{"id":"n558","loc":[-85.636781,41.940768]},"n559":{"id":"n559","loc":[-85.636783,41.940828]},"n56":{"id":"n56","loc":[-85.635943,41.942909]},"n560":{"id":"n560","loc":[-85.636761,41.940828]},"n561":{"id":"n561","loc":[-85.636762,41.940857]},"n562":{"id":"n562","loc":[-85.636641,41.940859]},"n563":{"id":"n563","loc":[-85.63664,41.940805]},"n564":{"id":"n564","loc":[-85.636676,41.940804]},"n565":{"id":"n565","loc":[-85.636675,41.940769]},"n566":{"id":"n566","loc":[-85.636733,41.94033]},"n567":{"id":"n567","loc":[-85.636471,41.940334]},"n568":{"id":"n568","loc":[-85.636469,41.940262]},"n569":{"id":"n569","loc":[-85.636731,41.940257]},"n57":{"id":"n57","loc":[-85.636227,41.942909]},"n570":{"id":"n570","loc":[-85.636798,41.940419]},"n571":{"id":"n571","loc":[-85.6368,41.940524]},"n572":{"id":"n572","loc":[-85.63664,41.940526]},"n573":{"id":"n573","loc":[-85.636638,41.940421]},"n574":{"id":"n574","loc":[-85.636372,41.940551]},"n575":{"id":"n575","loc":[-85.636338,41.94055]},"n576":{"id":"n576","loc":[-85.636339,41.940524]},"n577":{"id":"n577","loc":[-85.636373,41.940525]},"n578":{"id":"n578","loc":[-85.636388,41.940435]},"n579":{"id":"n579","loc":[-85.636222,41.940436]},"n58":{"id":"n58","loc":[-85.63627,41.943175]},"n580":{"id":"n580","loc":[-85.636222,41.940366]},"n581":{"id":"n581","loc":[-85.636387,41.940365]},"n582":{"id":"n582","loc":[-85.636158,41.940482]},"n583":{"id":"n583","loc":[-85.635963,41.940484]},"n584":{"id":"n584","loc":[-85.635961,41.940399]},"n585":{"id":"n585","loc":[-85.636156,41.940397]},"n586":{"id":"n586","loc":[-85.635987,41.940314]},"n587":{"id":"n587","loc":[-85.635987,41.940268]},"n588":{"id":"n588","loc":[-85.635968,41.940268]},"n589":{"id":"n589","loc":[-85.635967,41.940212]},"n59":{"id":"n59","loc":[-85.635531,41.943176]},"n590":{"id":"n590","loc":[-85.636082,41.940211]},"n591":{"id":"n591","loc":[-85.636083,41.94027]},"n592":{"id":"n592","loc":[-85.636064,41.94027]},"n593":{"id":"n593","loc":[-85.636064,41.940313]},"n594":{"id":"n594","loc":[-85.638071,41.941562]},"n595":{"id":"n595","loc":[-85.637953,41.941562]},"n596":{"id":"n596","loc":[-85.637952,41.941522]},"n597":{"id":"n597","loc":[-85.637876,41.941523]},"n598":{"id":"n598","loc":[-85.637876,41.941471]},"n599":{"id":"n599","loc":[-85.638035,41.94147]},"n6":{"id":"n6","loc":[-85.624925,41.950604]},"n60":{"id":"n60","loc":[-85.63542,41.942883]},"n600":{"id":"n600","loc":[-85.638035,41.941513]},"n601":{"id":"n601","loc":[-85.638071,41.941512]},"n602":{"id":"n602","loc":[-85.637038,41.942543],"tags":{"crossing":"zebra","highway":"crossing"}},"n603":{"id":"n603","loc":[-85.637134,41.942542]},"n604":{"id":"n604","loc":[-85.638122,41.942532]},"n605":{"id":"n605","loc":[-85.638121,41.942478]},"n606":{"id":"n606","loc":[-85.638104,41.941424]},"n607":{"id":"n607","loc":[-85.637115,41.941438]},"n608":{"id":"n608","loc":[-85.637133,41.942453]},"n609":{"id":"n609","loc":[-85.637429,41.942004]},"n61":{"id":"n61","loc":[-85.635701,41.942802]},"n610":{"id":"n610","loc":[-85.637125,41.942004]},"n611":{"id":"n611","loc":[-85.637022,41.942004]},"n612":{"id":"n612","loc":[-85.635952,41.943579]},"n613":{"id":"n613","loc":[-85.635872,41.943594]},"n614":{"id":"n614","loc":[-85.635857,41.943551]},"n615":{"id":"n615","loc":[-85.635937,41.943535]},"n616":{"id":"n616","loc":[-85.63671,41.94344]},"n617":{"id":"n617","loc":[-85.636427,41.94334]},"n618":{"id":"n618","loc":[-85.635353,41.943279]},"n619":{"id":"n619","loc":[-85.635319,41.943257]},"n62":{"id":"n62","loc":[-85.6358,41.942997]},"n620":{"id":"n620","loc":[-85.638786,41.943105]},"n621":{"id":"n621","loc":[-85.634957,41.943146]},"n622":{"id":"n622","loc":[-85.635012,41.943119]},"n623":{"id":"n623","loc":[-85.632409,41.944222]},"n624":{"id":"n624","loc":[-85.631863,41.944749]},"n625":{"id":"n625","loc":[-85.631915,41.944722]},"n626":{"id":"n626","loc":[-85.631884,41.94464]},"n627":{"id":"n627","loc":[-85.631792,41.944359]},"n628":{"id":"n628","loc":[-85.631817,41.944703]},"n629":{"id":"n629","loc":[-85.633464,41.945787]},"n63":{"id":"n63","loc":[-85.635808,41.943176]},"n630":{"id":"n630","loc":[-85.633583,41.945919]},"n631":{"id":"n631","loc":[-85.63382,41.945698]},"n632":{"id":"n632","loc":[-85.633681,41.945571]},"n633":{"id":"n633","loc":[-85.634217,41.946824]},"n634":{"id":"n634","loc":[-85.634271,41.946836]},"n635":{"id":"n635","loc":[-85.634319,41.94573]},"n636":{"id":"n636","loc":[-85.634377,41.945672]},"n637":{"id":"n637","loc":[-85.634909,41.945354]},"n638":{"id":"n638","loc":[-85.634726,41.945493],"tags":{"artwork_type":"mural","tourism":"artwork"}},"n639":{"id":"n639","loc":[-85.63546,41.945612]},"n64":{"id":"n64","loc":[-85.63631,41.943253]},"n640":{"id":"n640","loc":[-85.635561,41.945493]},"n641":{"id":"n641","loc":[-85.635417,41.945565]},"n642":{"id":"n642","loc":[-85.635315,41.945583]},"n643":{"id":"n643","loc":[-85.63506,41.945383]},"n644":{"id":"n644","loc":[-85.635198,41.945199]},"n645":{"id":"n645","loc":[-85.635361,41.94558]},"n646":{"id":"n646","loc":[-85.635017,41.945066]},"n647":{"id":"n647","loc":[-85.634779,41.945206]},"n648":{"id":"n648","loc":[-85.63425,41.945655]},"n649":{"id":"n649","loc":[-85.634247,41.945631]},"n65":{"id":"n65","loc":[-85.635398,41.943259]},"n650":{"id":"n650","loc":[-85.634889,41.945921]},"n651":{"id":"n651","loc":[-85.634889,41.945939]},"n652":{"id":"n652","loc":[-85.634889,41.945761]},"n653":{"id":"n653","loc":[-85.634889,41.945778]},"n654":{"id":"n654","loc":[-85.635112,41.945715]},"n655":{"id":"n655","loc":[-85.635025,41.945714]},"n656":{"id":"n656","loc":[-85.635027,41.945761]},"n657":{"id":"n657","loc":[-85.635438,41.945665]},"n658":{"id":"n658","loc":[-85.635416,41.945676]},"n659":{"id":"n659","loc":[-85.635401,41.945709]},"n66":{"id":"n66","loc":[-85.635336,41.943036]},"n660":{"id":"n660","loc":[-85.635271,41.945566]},"n661":{"id":"n661","loc":[-85.636106,41.946268]},"n662":{"id":"n662","loc":[-85.635867,41.946747]},"n663":{"id":"n663","loc":[-85.636476,41.946797]},"n664":{"id":"n664","loc":[-85.63651,41.946796]},"n665":{"id":"n665","loc":[-85.635367,41.946389]},"n666":{"id":"n666","loc":[-85.635367,41.946437]},"n667":{"id":"n667","loc":[-85.634787,41.946441]},"n668":{"id":"n668","loc":[-85.6358,41.946243]},"n669":{"id":"n669","loc":[-85.635784,41.94622]},"n67":{"id":"n67","loc":[-85.635911,41.942899]},"n670":{"id":"n670","loc":[-85.635727,41.946195]},"n671":{"id":"n671","loc":[-85.635708,41.946588]},"n672":{"id":"n672","loc":[-85.635648,41.946561]},"n673":{"id":"n673","loc":[-85.635624,41.946555]},"n674":{"id":"n674","loc":[-85.635417,41.946559]},"n675":{"id":"n675","loc":[-85.634866,41.946561]},"n676":{"id":"n676","loc":[-85.634866,41.946543]},"n677":{"id":"n677","loc":[-85.635085,41.946546]},"n678":{"id":"n678","loc":[-85.635085,41.946554]},"n679":{"id":"n679","loc":[-85.634584,41.94488]},"n68":{"id":"n68","loc":[-85.635915,41.943156]},"n680":{"id":"n680","loc":[-85.634557,41.944882]},"n681":{"id":"n681","loc":[-85.634455,41.944943]},"n682":{"id":"n682","loc":[-85.634305,41.944968]},"n683":{"id":"n683","loc":[-85.634261,41.944927]},"n684":{"id":"n684","loc":[-85.634132,41.944741]},"n685":{"id":"n685","loc":[-85.633705,41.944759]},"n686":{"id":"n686","loc":[-85.633918,41.944616]},"n687":{"id":"n687","loc":[-85.633974,41.944663]},"n688":{"id":"n688","loc":[-85.6336,41.944665]},"n689":{"id":"n689","loc":[-85.633817,41.944528]},"n69":{"id":"n69","loc":[-85.63631,41.943157]},"n690":{"id":"n690","loc":[-85.633889,41.944485]},"n691":{"id":"n691","loc":[-85.633931,41.944525]},"n692":{"id":"n692","loc":[-85.633864,41.944563]},"n693":{"id":"n693","loc":[-85.633456,41.944524]},"n694":{"id":"n694","loc":[-85.633676,41.944399]},"n695":{"id":"n695","loc":[-85.633352,41.944415]},"n696":{"id":"n696","loc":[-85.633655,41.944234]},"n697":{"id":"n697","loc":[-85.633761,41.94435]},"n698":{"id":"n698","loc":[-85.633254,41.944318]},"n699":{"id":"n699","loc":[-85.633472,41.944188]},"n7":{"id":"n7","loc":[-85.638791,41.943231]},"n70":{"id":"n70","loc":[-85.63579,41.942967]},"n700":{"id":"n700","loc":[-85.633524,41.944237]},"n701":{"id":"n701","loc":[-85.633583,41.944202]},"n702":{"id":"n702","loc":[-85.633632,41.944247]},"n703":{"id":"n703","loc":[-85.633165,41.944228]},"n704":{"id":"n704","loc":[-85.633388,41.944105]},"n705":{"id":"n705","loc":[-85.633117,41.944175]},"n706":{"id":"n706","loc":[-85.633302,41.944077]},"n707":{"id":"n707","loc":[-85.633352,41.944126]},"n708":{"id":"n708","loc":[-85.633052,41.944107]},"n709":{"id":"n709","loc":[-85.633237,41.944009]},"n71":{"id":"n71","loc":[-85.637506,41.942824]},"n710":{"id":"n710","loc":[-85.633187,41.943955]},"n711":{"id":"n711","loc":[-85.633,41.944054]},"n712":{"id":"n712","loc":[-85.633155,41.944265]},"n713":{"id":"n713","loc":[-85.633669,41.944765]},"n714":{"id":"n714","loc":[-85.634468,41.945503]},"n715":{"id":"n715","loc":[-85.63455,41.945566]},"n716":{"id":"n716","loc":[-85.634737,41.945729]},"n717":{"id":"n717","loc":[-85.634753,41.945752]},"n718":{"id":"n718","loc":[-85.634756,41.945781]},"n719":{"id":"n719","loc":[-85.634758,41.945978]},"n72":{"id":"n72","loc":[-85.637511,41.943056]},"n720":{"id":"n720","loc":[-85.634363,41.945548],"tags":{"crossing":"zebra","highway":"crossing"}},"n721":{"id":"n721","loc":[-85.634245,41.945599]},"n722":{"id":"n722","loc":[-85.633474,41.944889]},"n723":{"id":"n723","loc":[-85.632997,41.944418]},"n724":{"id":"n724","loc":[-85.63278,41.944183]},"n725":{"id":"n725","loc":[-85.63331,41.944429]},"n726":{"id":"n726","loc":[-85.633568,41.944829],"tags":{"crossing":"zebra","highway":"crossing"}},"n727":{"id":"n727","loc":[-85.634669,41.94567]},"n728":{"id":"n728","loc":[-85.634462,41.945787]},"n729":{"id":"n729","loc":[-85.634272,41.945625]},"n73":{"id":"n73","loc":[-85.637361,41.943058]},"n730":{"id":"n730","loc":[-85.634344,41.945699],"tags":{"crossing":"zebra","highway":"crossing"}},"n731":{"id":"n731","loc":[-85.634426,41.945783]},"n732":{"id":"n732","loc":[-85.632425,41.944137]},"n733":{"id":"n733","loc":[-85.632302,41.944192]},"n734":{"id":"n734","loc":[-85.632762,41.944174]},"n735":{"id":"n735","loc":[-85.632713,41.944179]},"n736":{"id":"n736","loc":[-85.632411,41.944327]},"n737":{"id":"n737","loc":[-85.632362,41.944341]},"n738":{"id":"n738","loc":[-85.632236,41.944204]},"n739":{"id":"n739","loc":[-85.634939,41.942165]},"n74":{"id":"n74","loc":[-85.637356,41.942825]},"n740":{"id":"n740","loc":[-85.635079,41.941535]},"n741":{"id":"n741","loc":[-85.635112,41.941595]},"n742":{"id":"n742","loc":[-85.635113,41.941633]},"n743":{"id":"n743","loc":[-85.635067,41.941652]},"n744":{"id":"n744","loc":[-85.634989,41.941651]},"n745":{"id":"n745","loc":[-85.634921,41.941609]},"n746":{"id":"n746","loc":[-85.634881,41.941544]},"n747":{"id":"n747","loc":[-85.635537,41.940939]},"n748":{"id":"n748","loc":[-85.635573,41.941048]},"n749":{"id":"n749","loc":[-85.635453,41.94091]},"n75":{"id":"n75","loc":[-85.638097,41.942833]},"n750":{"id":"n750","loc":[-85.635319,41.940943]},"n751":{"id":"n751","loc":[-85.637057,41.943224]},"n752":{"id":"n752","loc":[-85.636989,41.943296]},"n753":{"id":"n753","loc":[-85.636851,41.943299]},"n754":{"id":"n754","loc":[-85.636848,41.94322]},"n755":{"id":"n755","loc":[-85.636986,41.943217]},"n756":{"id":"n756","loc":[-85.637569,41.943454]},"n757":{"id":"n757","loc":[-85.637437,41.943458]},"n758":{"id":"n758","loc":[-85.637432,41.943384]},"n759":{"id":"n759","loc":[-85.637564,41.94338]},"n76":{"id":"n76","loc":[-85.638098,41.942912]},"n760":{"id":"n760","loc":[-85.637213,41.943378]},"n761":{"id":"n761","loc":[-85.637217,41.943435]},"n762":{"id":"n762","loc":[-85.637235,41.943434]},"n763":{"id":"n763","loc":[-85.637237,41.943465]},"n764":{"id":"n764","loc":[-85.637424,41.943459]},"n765":{"id":"n765","loc":[-85.637418,41.943371]},"n766":{"id":"n766","loc":[-85.638094,41.943149]},"n767":{"id":"n767","loc":[-85.638096,41.943201]},"n768":{"id":"n768","loc":[-85.638041,41.943202]},"n769":{"id":"n769","loc":[-85.638042,41.943216]},"n77":{"id":"n77","loc":[-85.637705,41.942913]},"n770":{"id":"n770","loc":[-85.637927,41.943218]},"n771":{"id":"n771","loc":[-85.637926,41.943201]},"n772":{"id":"n772","loc":[-85.637897,41.943201]},"n773":{"id":"n773","loc":[-85.637896,41.943155]},"n774":{"id":"n774","loc":[-85.637962,41.943153]},"n775":{"id":"n775","loc":[-85.637962,41.943134]},"n776":{"id":"n776","loc":[-85.638017,41.943132]},"n777":{"id":"n777","loc":[-85.638018,41.943151]},"n778":{"id":"n778","loc":[-85.638045,41.943289]},"n779":{"id":"n779","loc":[-85.638048,41.943363]},"n78":{"id":"n78","loc":[-85.637705,41.942834]},"n780":{"id":"n780","loc":[-85.637842,41.943367]},"n781":{"id":"n781","loc":[-85.637839,41.943296]},"n782":{"id":"n782","loc":[-85.637896,41.943295]},"n783":{"id":"n783","loc":[-85.637897,41.943314]},"n784":{"id":"n784","loc":[-85.637957,41.943312]},"n785":{"id":"n785","loc":[-85.637957,41.943291]},"n786":{"id":"n786","loc":[-85.637816,41.943375]},"n787":{"id":"n787","loc":[-85.637815,41.943416]},"n788":{"id":"n788","loc":[-85.637715,41.943415]},"n789":{"id":"n789","loc":[-85.637716,41.943374]},"n79":{"id":"n79","loc":[-85.638071,41.942298]},"n790":{"id":"n790","loc":[-85.637912,41.943545]},"n791":{"id":"n791","loc":[-85.637909,41.943479]},"n792":{"id":"n792","loc":[-85.637967,41.943477]},"n793":{"id":"n793","loc":[-85.637967,41.94346]},"n794":{"id":"n794","loc":[-85.638077,41.943457]},"n795":{"id":"n795","loc":[-85.638078,41.943473]},"n796":{"id":"n796","loc":[-85.638124,41.943471]},"n797":{"id":"n797","loc":[-85.638126,41.943514]},"n798":{"id":"n798","loc":[-85.638079,41.943515]},"n799":{"id":"n799","loc":[-85.638079,41.943532]},"n8":{"id":"n8","loc":[-85.635241,41.941948]},"n80":{"id":"n80","loc":[-85.638074,41.942431]},"n800":{"id":"n800","loc":[-85.638028,41.943534]},"n801":{"id":"n801","loc":[-85.638028,41.943542]},"n802":{"id":"n802","loc":[-85.638845,41.942983]},"n803":{"id":"n803","loc":[-85.638846,41.94305]},"n804":{"id":"n804","loc":[-85.638661,41.943052]},"n805":{"id":"n805","loc":[-85.63866,41.942984]},"n806":{"id":"n806","loc":[-85.638579,41.942753]},"n807":{"id":"n807","loc":[-85.638445,41.942755]},"n808":{"id":"n808","loc":[-85.638452,41.942978]},"n809":{"id":"n809","loc":[-85.638545,41.942976]},"n81":{"id":"n81","loc":[-85.637836,41.942433]},"n810":{"id":"n810","loc":[-85.638543,41.942935]},"n811":{"id":"n811","loc":[-85.638571,41.942934]},"n812":{"id":"n812","loc":[-85.63857,41.942901]},"n813":{"id":"n813","loc":[-85.638611,41.9429]},"n814":{"id":"n814","loc":[-85.638607,41.942769]},"n815":{"id":"n815","loc":[-85.63858,41.94277]},"n816":{"id":"n816","loc":[-85.638597,41.942614]},"n817":{"id":"n817","loc":[-85.638601,41.94273]},"n818":{"id":"n818","loc":[-85.638686,41.942731]},"n819":{"id":"n819","loc":[-85.638689,41.942917]},"n82":{"id":"n82","loc":[-85.637835,41.94242]},"n820":{"id":"n820","loc":[-85.638558,41.943018]},"n821":{"id":"n821","loc":[-85.638243,41.943019]},"n822":{"id":"n822","loc":[-85.637536,41.943887]},"n823":{"id":"n823","loc":[-85.63749,41.943926]},"n824":{"id":"n824","loc":[-85.63743,41.943886]},"n825":{"id":"n825","loc":[-85.637476,41.943847]},"n826":{"id":"n826","loc":[-85.637527,41.943846]},"n827":{"id":"n827","loc":[-85.637141,41.943728]},"n828":{"id":"n828","loc":[-85.637201,41.943755]},"n829":{"id":"n829","loc":[-85.636987,41.943608]},"n83":{"id":"n83","loc":[-85.63776,41.942421]},"n830":{"id":"n830","loc":[-85.637441,41.943807]},"n831":{"id":"n831","loc":[-85.637673,41.94399]},"n832":{"id":"n832","loc":[-85.637783,41.944137]},"n833":{"id":"n833","loc":[-85.63845,41.944333]},"n834":{"id":"n834","loc":[-85.638159,41.944248]},"n835":{"id":"n835","loc":[-85.637859,41.94416]},"n836":{"id":"n836","loc":[-85.638685,41.944542]},"n837":{"id":"n837","loc":[-85.638714,41.944611]},"n838":{"id":"n838","loc":[-85.638711,41.944757]},"n839":{"id":"n839","loc":[-85.638774,41.945069]},"n84":{"id":"n84","loc":[-85.637758,41.942339]},"n840":{"id":"n840","loc":[-85.638742,41.945205]},"n841":{"id":"n841","loc":[-85.640267,41.942403]},"n842":{"id":"n842","loc":[-85.640154,41.942404]},"n843":{"id":"n843","loc":[-85.640152,41.942249]},"n844":{"id":"n844","loc":[-85.640266,41.942248]},"n845":{"id":"n845","loc":[-85.640366,41.942599]},"n846":{"id":"n846","loc":[-85.640362,41.942192]},"n847":{"id":"n847","loc":[-85.640146,41.942191]},"n848":{"id":"n848","loc":[-85.640122,41.942196]},"n849":{"id":"n849","loc":[-85.640108,41.942211]},"n85":{"id":"n85","loc":[-85.637836,41.942339]},"n850":{"id":"n850","loc":[-85.640101,41.942236]},"n851":{"id":"n851","loc":[-85.640103,41.94241]},"n852":{"id":"n852","loc":[-85.64011,41.942435]},"n853":{"id":"n853","loc":[-85.640126,41.942445]},"n854":{"id":"n854","loc":[-85.640153,41.942451]},"n855":{"id":"n855","loc":[-85.640183,41.942452]},"n856":{"id":"n856","loc":[-85.640364,41.942452]},"n857":{"id":"n857","loc":[-85.640007,41.942452]},"n858":{"id":"n858","loc":[-85.639449,41.942461]},"n859":{"id":"n859","loc":[-85.640049,41.942391]},"n86":{"id":"n86","loc":[-85.637835,41.942301]},"n860":{"id":"n860","loc":[-85.640052,41.942503]},"n861":{"id":"n861","loc":[-85.639575,41.94251]},"n862":{"id":"n862","loc":[-85.639572,41.942398]},"n863":{"id":"n863","loc":[-85.638782,41.942227]},"n864":{"id":"n864","loc":[-85.63843,41.942226]},"n865":{"id":"n865","loc":[-85.63823,41.942183]},"n866":{"id":"n866","loc":[-85.638363,41.942216],"tags":{"barrier":"gate"}},"n867":{"id":"n867","loc":[-85.6384,41.942223]},"n868":{"id":"n868","loc":[-85.636042,41.942797]},"n869":{"id":"n869","loc":[-85.636308,41.942752]},"n87":{"id":"n87","loc":[-85.637566,41.942367]},"n870":{"id":"n870","loc":[-85.636516,41.942729]},"n871":{"id":"n871","loc":[-85.636782,41.942712]},"n872":{"id":"n872","loc":[-85.636944,41.942706]},"n873":{"id":"n873","loc":[-85.63704,41.942706]},"n874":{"id":"n874","loc":[-85.637237,41.942703]},"n875":{"id":"n875","loc":[-85.637553,41.9427]},"n876":{"id":"n876","loc":[-85.638236,41.942697]},"n877":{"id":"n877","loc":[-85.636284,41.942781]},"n878":{"id":"n878","loc":[-85.636551,41.942641]},"n879":{"id":"n879","loc":[-85.633914,41.943693]},"n88":{"id":"n88","loc":[-85.637566,41.94241]},"n880":{"id":"n880","loc":[-85.63389,41.943708]},"n881":{"id":"n881","loc":[-85.633866,41.943686]},"n882":{"id":"n882","loc":[-85.63389,41.943671]},"n883":{"id":"n883","loc":[-85.633857,41.943609]},"n884":{"id":"n884","loc":[-85.634858,41.944474]},"n885":{"id":"n885","loc":[-85.633988,41.943234]},"n886":{"id":"n886","loc":[-85.633999,41.943485]},"n887":{"id":"n887","loc":[-85.634109,41.943449],"tags":{"emergency":"fire_hydrant"}},"n888":{"id":"n888","loc":[-85.635728,41.942655],"tags":{"emergency":"fire_hydrant"}},"n889":{"id":"n889","loc":[-85.636499,41.942845],"tags":{"man_made":"flagpole"}},"n89":{"id":"n89","loc":[-85.637455,41.94241]},"n890":{"id":"n890","loc":[-85.636197,41.943073]},"n891":{"id":"n891","loc":[-85.636227,41.943073]},"n892":{"id":"n892","loc":[-85.637433,41.942933],"tags":{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"restaurant","cuisine":"pizza","name":"Pizza Hut"}},"n893":{"id":"n893","loc":[-85.637907,41.942879],"tags":{"amenity":"car_wash"}},"n894":{"id":"n894","loc":[-85.637661,41.943018]},"n895":{"id":"n895","loc":[-85.636933,41.942733],"tags":{"emergency":"fire_hydrant"}},"n896":{"id":"n896","loc":[-85.637661,41.94304]},"n897":{"id":"n897","loc":[-85.637562,41.943041]},"n898":{"id":"n898","loc":[-85.637556,41.942725]},"n899":{"id":"n899","loc":[-85.637656,41.942724]},"n9":{"id":"n9","loc":[-85.635159,41.941926]},"n90":{"id":"n90","loc":[-85.637454,41.942367]},"n900":{"id":"n900","loc":[-85.637657,41.942779]},"n901":{"id":"n901","loc":[-85.637983,41.942777]},"n902":{"id":"n902","loc":[-85.637982,41.942616]},"n903":{"id":"n903","loc":[-85.637777,41.942778]},"n904":{"id":"n904","loc":[-85.637775,41.942699]},"n905":{"id":"n905","loc":[-85.637772,41.942618]},"n906":{"id":"n906","loc":[-85.637982,41.942698]},"n907":{"id":"n907","loc":[-85.637941,41.942378],"tags":{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Gem Pawnbroker","shop":"pawnbroker"}},"n908":{"id":"n908","loc":[-85.637515,41.942394],"tags":{"second_hand":"only","shop":"car"}},"n909":{"id":"n909","loc":[-85.638743,41.942374],"tags":{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes","shop":"car_repair"}},"n91":{"id":"n91","loc":[-85.637565,41.942341]},"n910":{"id":"n910","loc":[-85.638594,41.942357]},"n911":{"id":"n911","loc":[-85.634312,41.943562],"tags":{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","amenity":"cafe","cuisine":"coffee_shop","name":"L.A.'s Coffee Cafe","outdoor_seating":"yes"}},"n912":{"id":"n912","loc":[-85.634404,41.943512]},"n913":{"id":"n913","loc":[-85.634391,41.943519],"tags":{"entrance":"yes"}},"n914":{"id":"n914","loc":[-85.634259,41.943538],"tags":{"entrance":"yes"}},"n915":{"id":"n915","loc":[-85.634247,41.943528]},"n916":{"id":"n916","loc":[-85.633747,41.943322],"tags":{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue","name":"Preferred Insurance Services","office":"insurance"}},"n917":{"id":"n917","loc":[-85.63299,41.943686],"tags":{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lynn's Garage","service:vehicle:tyres":"yes","shop":"car_repair"}},"n918":{"id":"n918","loc":[-85.633438,41.944883]},"n919":{"id":"n919","loc":[-85.633265,41.944983]},"n92":{"id":"n92","loc":[-85.637481,41.942341]},"n920":{"id":"n920","loc":[-85.633315,41.945027]},"n921":{"id":"n921","loc":[-85.633376,41.944827]},"n922":{"id":"n922","loc":[-85.633199,41.944922]},"n923":{"id":"n923","loc":[-85.633316,41.944772]},"n924":{"id":"n924","loc":[-85.633147,41.944867]},"n925":{"id":"n925","loc":[-85.633261,41.944719]},"n926":{"id":"n926","loc":[-85.633096,41.944812]},"n927":{"id":"n927","loc":[-85.633191,41.944645]},"n928":{"id":"n928","loc":[-85.632981,41.94476]},"n929":{"id":"n929","loc":[-85.633062,41.94483]},"n93":{"id":"n93","loc":[-85.637481,41.94226]},"n930":{"id":"n930","loc":[-85.633146,41.944602]},"n931":{"id":"n931","loc":[-85.632969,41.944703]},"n932":{"id":"n932","loc":[-85.633008,41.944745]},"n933":{"id":"n933","loc":[-85.633088,41.944545]},"n934":{"id":"n934","loc":[-85.632868,41.944655]},"n935":{"id":"n935","loc":[-85.632941,41.944718]},"n936":{"id":"n936","loc":[-85.633028,41.944483]},"n937":{"id":"n937","loc":[-85.632817,41.944605]},"n938":{"id":"n938","loc":[-85.632923,41.944373]},"n939":{"id":"n939","loc":[-85.632692,41.944485]},"n94":{"id":"n94","loc":[-85.637565,41.94226]},"n940":{"id":"n940","loc":[-85.632871,41.944316]},"n941":{"id":"n941","loc":[-85.632655,41.944421]},"n942":{"id":"n942","loc":[-85.632711,41.944478]},"n943":{"id":"n943","loc":[-85.632825,41.94426]},"n944":{"id":"n944","loc":[-85.632606,41.944363]},"n945":{"id":"n945","loc":[-85.63275,41.94418]},"n946":{"id":"n946","loc":[-85.632588,41.944256]},"n947":{"id":"n947","loc":[-85.632611,41.944279]},"n948":{"id":"n948","loc":[-85.632548,41.944306]},"n949":{"id":"n949","loc":[-85.632512,41.944406]},"n95":{"id":"n95","loc":[-85.637188,41.942217]},"n950":{"id":"n950","loc":[-85.632565,41.944463]},"n951":{"id":"n951","loc":[-85.632579,41.944456]},"n952":{"id":"n952","loc":[-85.632634,41.944518]},"n953":{"id":"n953","loc":[-85.632686,41.944569]},"n954":{"id":"n954","loc":[-85.632745,41.944537]},"n955":{"id":"n955","loc":[-85.632659,41.944587]},"n956":{"id":"n956","loc":[-85.632778,41.944705]},"n957":{"id":"n957","loc":[-85.632815,41.944301],"tags":{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Access Point Employment","office":"employment_agency"}},"n958":{"id":"n958","loc":[-85.6332,41.944174],"tags":{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Paisley Emporium","shop":"second_hand"}},"n959":{"id":"n959","loc":[-85.633578,41.944568],"tags":{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","name":"Lowry's Books","shop":"books"}},"n96":{"id":"n96","loc":[-85.637189,41.942303]},"n960":{"id":"n960","loc":[-85.63344,41.944443],"tags":{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"restaurant","cuisine":"pizza","name":"Paisano's Bar and Grill"}},"n961":{"id":"n961","loc":[-85.633009,41.944542],"tags":{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","amenity":"cafe","cuisine":"american","internet_access":"yes","name":"Main Street Cafe"}},"n962":{"id":"n962","loc":[-85.633674,41.944682],"tags":{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Fitness"}},"n963":{"id":"n963","loc":[-85.633376,41.944868],"tags":{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street","leisure":"fitness_centre","name":"Main Street Barbell"}},"n964":{"id":"n964","loc":[-85.633366,41.944783]},"n965":{"id":"n965","loc":[-85.633296,41.94482]},"n966":{"id":"n966","loc":[-85.633214,41.94487]},"n967":{"id":"n967","loc":[-85.633005,41.944988]},"n968":{"id":"n968","loc":[-85.633269,41.944816]},"n969":{"id":"n969","loc":[-85.633215,41.944842]},"n97":{"id":"n97","loc":[-85.637299,41.942302]},"n970":{"id":"n970","loc":[-85.633245,41.944871]},"n971":{"id":"n971","loc":[-85.633296,41.944845]},"n972":{"id":"n972","loc":[-85.633254,41.944845],"tags":{"natural":"tree"}},"n973":{"id":"n973","loc":[-85.633557,41.945515]},"n974":{"id":"n974","loc":[-85.633279,41.945246]},"n975":{"id":"n975","loc":[-85.63324,41.945226]},"n976":{"id":"n976","loc":[-85.6332,41.945213]},"n977":{"id":"n977","loc":[-85.633133,41.945164]},"n978":{"id":"n978","loc":[-85.63312,41.945132]},"n979":{"id":"n979","loc":[-85.633095,41.945081]},"n98":{"id":"n98","loc":[-85.637299,41.942314]},"n980":{"id":"n980","loc":[-85.633064,41.945047]},"n981":{"id":"n981","loc":[-85.632739,41.944742]},"n982":{"id":"n982","loc":[-85.633281,41.945026]},"n983":{"id":"n983","loc":[-85.633155,41.944903]},"n984":{"id":"n984","loc":[-85.633079,41.944829]},"n985":{"id":"n985","loc":[-85.63304,41.944853]},"n986":{"id":"n986","loc":[-85.632949,41.944776]},"n987":{"id":"n987","loc":[-85.632921,41.944725]},"n988":{"id":"n988","loc":[-85.632859,41.944673]},"n989":{"id":"n989","loc":[-85.632895,41.94505]},"n99":{"id":"n99","loc":[-85.637396,41.942313]},"n990":{"id":"n990","loc":[-85.633336,41.945138]},"n991":{"id":"n991","loc":[-85.633466,41.945265]},"n992":{"id":"n992","loc":[-85.633367,41.945327]},"n993":{"id":"n993","loc":[-85.633163,41.945189]},"n994":{"id":"n994","loc":[-85.633678,41.945309]},"n995":{"id":"n995","loc":[-85.633619,41.945261]},"n996":{"id":"n996","loc":[-85.63355,41.945301]},"n997":{"id":"n997","loc":[-85.633607,41.945352]},"n998":{"id":"n998","loc":[-85.633579,41.945327],"tags":{"entrance":"yes"}},"n999":{"id":"n999","loc":[-85.633445,41.945404]},"r2":{"id":"r2","members":[{"id":"w225","role":"outer","type":"way"}],"tags":{"type":"multipolygon","waterway":"riverbank"}},"r5":{"id":"r5","members":[{"id":"w642","role":"outer","type":"way"}],"tags":{"admin_level":"8","border_type":"city","boundary":"administrative","name":"Three Rivers","place":"city","type":"boundary"}},"w1":{"id":"w1","nodes":["n5","n1797"],"tags":{"highway":"residential","name":"12th Avenue"}},"w10":{"id":"w10","nodes":["n54","n55","n56","n57","n891","n890","n54"],"tags":{"building":"yes"}},"w100":{"id":"w100","nodes":["n451","n915","n452"],"tags":{"highway":"footway"}},"w101":{"id":"w101","nodes":["n461","n462","n463","n464","n465","n466"],"tags":{"barrier":"fence"}},"w102":{"id":"w102","nodes":["n467","n468","n469","n470","n472","n467"],"tags":{"amenity":"parking"}},"w103":{"id":"w103","nodes":["n2597","n2444","n471","n472"],"tags":{"highway":"footway"}},"w104":{"id":"w104","nodes":["n473","n474","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w105":{"id":"w105","nodes":["n475","n324","n325"],"tags":{"footway":"sidewalk","highway":"footway"}},"w106":{"id":"w106","nodes":["n886","n452","n476"],"tags":{"footway":"sidewalk","highway":"footway"}},"w107":{"id":"w107","nodes":["n485","n4678","n486","n18"],"tags":{"highway":"service"}},"w108":{"id":"w108","nodes":["n300","n487","n488","n489","n490"],"tags":{"highway":"footway"}},"w109":{"id":"w109","nodes":["n490","n491"],"tags":{"highway":"footway"}},"w11":{"id":"w11","nodes":["n58","n63","n59","n315","n60"],"tags":{"highway":"service"}},"w110":{"id":"w110","nodes":["n492","n493","n494","n495","n496","n497","n492"],"tags":{"building":"yes"}},"w111":{"id":"w111","nodes":["n498","n499","n511"],"tags":{"highway":"service"}},"w112":{"id":"w112","nodes":["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],"tags":{"highway":"service"}},"w113":{"id":"w113","nodes":["n511","n510"],"tags":{"covered":"yes","highway":"service"}},"w114":{"id":"w114","nodes":["n512","n513","n514","n515","n512"],"tags":{"building":"yes"}},"w115":{"id":"w115","nodes":["n516","n517","n518","n519","n516"],"tags":{"building":"yes"}},"w116":{"id":"w116","nodes":["n520","n521","n522","n523","n520"],"tags":{"building":"yes"}},"w117":{"id":"w117","nodes":["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],"tags":{"building":"yes"}},"w118":{"id":"w118","nodes":["n536","n537","n538","n539","n536"],"tags":{"building":"yes"}},"w119":{"id":"w119","nodes":["n540","n541","n542","n543","n544","n545","n546","n547","n540"],"tags":{"building":"yes"}},"w12":{"id":"w12","nodes":["n61","n314","n70","n62","n63"],"tags":{"highway":"service"}},"w120":{"id":"w120","nodes":["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],"tags":{"building":"yes"}},"w121":{"id":"w121","nodes":["n558","n559","n560","n561","n562","n563","n564","n565","n558"],"tags":{"building":"yes"}},"w122":{"id":"w122","nodes":["n566","n567","n568","n569","n566"],"tags":{"building":"yes"}},"w123":{"id":"w123","nodes":["n570","n571","n572","n573","n570"],"tags":{"building":"yes"}},"w124":{"id":"w124","nodes":["n574","n575","n576","n577","n574"],"tags":{"building":"yes"}},"w125":{"id":"w125","nodes":["n578","n579","n580","n581","n578"],"tags":{"building":"yes"}},"w126":{"id":"w126","nodes":["n582","n583","n584","n585","n582"],"tags":{"building":"yes"}},"w127":{"id":"w127","nodes":["n586","n587","n588","n589","n590","n591","n592","n593","n586"],"tags":{"building":"yes"}},"w128":{"id":"w128","nodes":["n594","n595","n596","n597","n598","n599","n600","n601","n594"],"tags":{"building":"yes"}},"w129":{"id":"w129","nodes":["n309","n602","n603"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w13":{"id":"w13","nodes":["n64","n65","n66","n67","n68","n69","n64"],"tags":{"amenity":"parking"}},"w130":{"id":"w130","nodes":["n603","n604"],"tags":{"footway":"sidewalk","highway":"footway"}},"w131":{"id":"w131","nodes":["n604","n605","n606"],"tags":{"footway":"sidewalk","highway":"footway"}},"w132":{"id":"w132","nodes":["n606","n607"],"tags":{"footway":"sidewalk","highway":"footway"}},"w133":{"id":"w133","nodes":["n607","n610","n608","n603"],"tags":{"footway":"sidewalk","highway":"footway"}},"w134":{"id":"w134","nodes":["n609","n610","n611"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w135":{"id":"w135","nodes":["n244","n245","n246"],"tags":{"highway":"service"}},"w136":{"id":"w136","nodes":["n612","n613","n614","n615","n612"],"tags":{"amenity":"shelter"}},"w137":{"id":"w137","nodes":["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],"tags":{"highway":"residential","name":"Foster Street"}},"w138":{"id":"w138","nodes":["n2779","n625","n626","n627"],"tags":{"highway":"residential","name":"Foster Street","oneway":"yes"}},"w139":{"id":"w139","nodes":["n630","n631","n632","n2437"],"tags":{"highway":"service"}},"w14":{"id":"w14","nodes":["n71","n72","n73","n74","n71"],"tags":{"building":"yes"}},"w140":{"id":"w140","nodes":["n643","n637","n715","n2410"],"tags":{"highway":"footway","name":"Mural Mall"}},"w141":{"id":"w141","nodes":["n639","n2516"],"tags":{"barrier":"wall"}},"w142":{"id":"w142","nodes":["n640","n641","n645","n642","n660","n643","n644"],"tags":{"highway":"service"}},"w143":{"id":"w143","nodes":["n646","n647"],"tags":{"highway":"service"}},"w144":{"id":"w144","nodes":["n654","n655","n656"],"tags":{"barrier":"wall"}},"w145":{"id":"w145","nodes":["n665","n666","n667"],"tags":{"barrier":"wall"}},"w146":{"id":"w146","nodes":["n2727","n662","n2719"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w147":{"id":"w147","nodes":["n2725","n674"],"tags":{"highway":"service","oneway":"yes"}},"w148":{"id":"w148","nodes":["n2464","n2460","n2454","n684","n2455","n2464"],"tags":{"building":"yes"}},"w149":{"id":"w149","nodes":["n2456","n685","n686","n687","n2456"],"tags":{"building":"yes"}},"w15":{"id":"w15","nodes":["n75","n76","n77","n78","n75"],"tags":{"building":"yes"}},"w150":{"id":"w150","nodes":["n685","n688","n689","n690","n691","n692","n686","n685"],"tags":{"building":"yes"}},"w151":{"id":"w151","nodes":["n688","n693","n694","n689","n688"],"tags":{"building":"yes"}},"w152":{"id":"w152","nodes":["n693","n695","n702","n696","n697","n694","n693"],"tags":{"building":"yes"}},"w153":{"id":"w153","nodes":["n695","n698","n699","n700","n701","n702","n695"],"tags":{"building":"yes"}},"w154":{"id":"w154","nodes":["n698","n703","n707","n704","n699","n698"],"tags":{"building":"yes"}},"w155":{"id":"w155","nodes":["n703","n705","n706","n707","n703"],"tags":{"building":"yes"}},"w156":{"id":"w156","nodes":["n705","n708","n709","n706","n705"],"tags":{"building":"yes"}},"w157":{"id":"w157","nodes":["n709","n710","n711","n708","n709"],"tags":{"building":"yes"}},"w158":{"id":"w158","nodes":["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w159":{"id":"w159","nodes":["n714","n720","n721"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w16":{"id":"w16","nodes":["n79","n80","n81","n82","n83","n84","n85","n86","n79"],"tags":{"building":"yes"}},"w160":{"id":"w160","nodes":["n729","n721","n722","n964","n723","n724"],"tags":{"footway":"sidewalk","highway":"footway"}},"w161":{"id":"w161","nodes":["n713","n726","n722"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w162":{"id":"w162","nodes":["n727","n2411","n728"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w163":{"id":"w163","nodes":["n729","n730","n731"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w164":{"id":"w164","nodes":["n365","n732","n733","n738"],"tags":{"footway":"sidewalk","highway":"footway"}},"w165":{"id":"w165","nodes":["n724","n734","n367","n735","n736","n737"],"tags":{"footway":"sidewalk","highway":"footway"}},"w166":{"id":"w166","nodes":["n739","n2037","n2038","n2039","n2040","n1623","n2032"],"tags":{"highway":"footway"}},"w167":{"id":"w167","nodes":["n150","n751"],"tags":{"highway":"service"}},"w168":{"id":"w168","nodes":["n752","n753","n754","n755","n752"],"tags":{"building":"yes"}},"w169":{"id":"w169","nodes":["n756","n757","n758","n759","n756"],"tags":{"building":"yes"}},"w17":{"id":"w17","nodes":["n87","n88","n89","n90","n87"],"tags":{"building":"yes"}},"w170":{"id":"w170","nodes":["n760","n761","n762","n763","n764","n765","n760"],"tags":{"building":"yes"}},"w171":{"id":"w171","nodes":["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],"tags":{"building":"yes"}},"w172":{"id":"w172","nodes":["n778","n779","n780","n781","n782","n783","n784","n785","n778"],"tags":{"building":"yes"}},"w173":{"id":"w173","nodes":["n786","n787","n788","n789","n786"],"tags":{"building":"yes"}},"w174":{"id":"w174","nodes":["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],"tags":{"building":"yes"}},"w175":{"id":"w175","nodes":["n802","n803","n804","n805","n802"],"tags":{"building":"yes"}},"w176":{"id":"w176","nodes":["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],"tags":{"building":"yes"}},"w177":{"id":"w177","nodes":["n816","n1140","n817","n818","n819","n820","n821"],"tags":{"highway":"service"}},"w178":{"id":"w178","nodes":["n822","n823","n824","n825","n822"],"tags":{"building":"yes"}},"w179":{"id":"w179","nodes":["n841","n842","n843","n844","n841"],"tags":{"building":"yes"}},"w18":{"id":"w18","nodes":["n91","n92","n93","n94","n91"],"tags":{"building":"yes"}},"w180":{"id":"w180","nodes":["n845","n856","n846"],"tags":{"highway":"service"}},"w181":{"id":"w181","nodes":["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],"tags":{"highway":"service","oneway":"yes","service":"drive-through"}},"w182":{"id":"w182","nodes":["n857","n858"],"tags":{"highway":"service"}},"w183":{"id":"w183","nodes":["n859","n860","n861","n862","n859"],"tags":{"amenity":"parking"}},"w184":{"id":"w184","nodes":["n863","n864","n867","n866","n865"],"tags":{"highway":"service"}},"w185":{"id":"w185","nodes":["n883","n884"],"tags":{"barrier":"fence"}},"w186":{"id":"w186","nodes":["n1954","n622","n1955"],"tags":{"highway":"path","name":"Riverwalk Trail"}},"w187":{"id":"w187","nodes":["n621","n1954"],"tags":{"highway":"steps","incline":"up","name":"Riverwalk Trail","surface":"wood"}},"w188":{"id":"w188","nodes":["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"wood"}},"w189":{"id":"w189","nodes":["n2273","n2274"],"tags":{"highway":"steps","incline":"down","name":"Riverwalk Trail","surface":"wood"}},"w19":{"id":"w19","nodes":["n95","n96","n97","n98","n99","n100","n101","n102","n95"],"tags":{"building":"yes"}},"w190":{"id":"w190","nodes":["n821","n894","n900","n903","n901"],"tags":{"highway":"service"}},"w191":{"id":"w191","nodes":["n896","n897","n898","n899","n900","n894","n896"],"tags":{"amenity":"parking"}},"w192":{"id":"w192","nodes":["n903","n904","n905"],"tags":{"highway":"service"}},"w193":{"id":"w193","nodes":["n901","n906","n902"],"tags":{"highway":"service"}},"w194":{"id":"w194","nodes":["n912","n913"],"tags":{"highway":"footway"}},"w195":{"id":"w195","nodes":["n914","n915"],"tags":{"highway":"footway"}},"w196":{"id":"w196","nodes":["n2466","n918","n919","n920","n2466"],"tags":{"building":"yes"}},"w197":{"id":"w197","nodes":["n918","n921","n922","n919","n918"],"tags":{"building":"yes"}},"w198":{"id":"w198","nodes":["n923","n925","n926","n924","n923"],"tags":{"building":"yes"}},"w199":{"id":"w199","nodes":["n925","n927","n932","n928","n929","n926","n925"],"tags":{"building":"yes"}},"w2":{"id":"w2","nodes":["n3523","n2182","n2160"],"tags":{"highway":"service"}},"w20":{"id":"w20","nodes":["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],"tags":{"building":"yes"}},"w200":{"id":"w200","nodes":["n927","n930","n931","n932","n927"],"tags":{"building":"yes"}},"w201":{"id":"w201","nodes":["n930","n933","n934","n935","n931","n930"],"tags":{"building":"yes"}},"w202":{"id":"w202","nodes":["n933","n936","n937","n934","n933"],"tags":{"building":"yes"}},"w203":{"id":"w203","nodes":["n936","n938","n942","n939","n954","n937","n936"],"tags":{"building":"yes"}},"w204":{"id":"w204","nodes":["n938","n940","n941","n942","n938"],"tags":{"building":"yes"}},"w205":{"id":"w205","nodes":["n940","n943","n944","n941","n940"],"tags":{"building":"yes"}},"w206":{"id":"w206","nodes":["n943","n945","n946","n947","n948","n944","n943"],"tags":{"building":"yes"}},"w207":{"id":"w207","nodes":["n944","n949","n950","n951","n941","n944"],"tags":{"building":"yes"}},"w208":{"id":"w208","nodes":["n941","n951","n952","n939","n942","n941"],"tags":{"building":"yes"}},"w209":{"id":"w209","nodes":["n952","n953","n954","n939","n952"],"tags":{"building":"yes"}},"w21":{"id":"w21","nodes":["n115","n116","n117","n118","n115"],"tags":{"building":"yes"}},"w210":{"id":"w210","nodes":["n953","n955","n956","n934","n937","n954","n953"],"tags":{"building":"yes"}},"w211":{"id":"w211","nodes":["n964","n965"],"tags":{"highway":"footway"}},"w212":{"id":"w212","nodes":["n966","n983","n967","n989"],"tags":{"highway":"footway"}},"w213":{"id":"w213","nodes":["n965","n968","n969","n966","n970","n971","n965"],"tags":{"highway":"footway"}},"w214":{"id":"w214","nodes":["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],"tags":{"footway":"sidewalk","highway":"footway"}},"w215":{"id":"w215","nodes":["n978","n982","n983","n984","n985","n986","n987","n988","n981"],"tags":{"highway":"footway"}},"w216":{"id":"w216","nodes":["n976","n990","n991","n992"],"tags":{"highway":"footway"}},"w217":{"id":"w217","nodes":["n998","n999"],"tags":{"highway":"footway"}},"w218":{"id":"w218","nodes":["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],"tags":{"footway":"sidewalk","highway":"footway"}},"w219":{"id":"w219","nodes":["n719","n1026","n1027"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w22":{"id":"w22","nodes":["n119","n120","n121","n122","n119"],"tags":{"building":"yes"}},"w220":{"id":"w220","nodes":["n1027","n1028","n1019"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w221":{"id":"w221","nodes":["n2080","n1828","n1863","n1829"],"tags":{"highway":"tertiary","name":"Constantine Street"}},"w222":{"id":"w222","nodes":["n1029","n1030","n1031"],"tags":{"highway":"service"}},"w223":{"id":"w223","nodes":["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],"tags":{"name":"Rocky River","waterway":"river"}},"w224":{"id":"w224","nodes":["n3750","n3751","n3752"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w225":{"id":"w225","nodes":["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},"w226":{"id":"w226","nodes":["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w227":{"id":"w227","nodes":["n2994","n3012","n3011","n2958"],"tags":{"highway":"secondary","name":"Main Street"}},"w228":{"id":"w228","nodes":["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],"tags":{"highway":"primary","name":"Main Street"}},"w229":{"id":"w229","nodes":["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],"tags":{"name":"Conrail Railroad","railway":"rail"}},"w23":{"id":"w23","nodes":["n123","n124","n125","n126","n123"],"tags":{"building":"yes"}},"w230":{"id":"w230","nodes":["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],"tags":{"name":"Saint Joseph River","waterway":"river"}},"w231":{"id":"w231","nodes":["n456","n1036","n1037","n1038"],"tags":{"barrier":"wall"}},"w232":{"id":"w232","nodes":["n1034","n1039","n1040"],"tags":{"barrier":"wall"}},"w233":{"id":"w233","nodes":["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],"tags":{"access":"private","leisure":"swimming_pool"}},"w234":{"id":"w234","nodes":["n1047","n1048"],"tags":{"barrier":"hedge"}},"w235":{"id":"w235","nodes":["n1049","n1050","n1051","n1052","n1049"],"tags":{"building":"yes"}},"w236":{"id":"w236","nodes":["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],"tags":{"building":"yes"}},"w237":{"id":"w237","nodes":["n1061","n1062","n1063","n1064","n1065","n1061"],"tags":{"building":"yes"}},"w238":{"id":"w238","nodes":["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],"tags":{"building":"yes"}},"w239":{"id":"w239","nodes":["n1072","n1073","n1074","n1075","n1072"],"tags":{"building":"yes"}},"w24":{"id":"w24","nodes":["n127","n128","n129","n130","n127"],"tags":{"building":"yes"}},"w240":{"id":"w240","nodes":["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],"tags":{"building":"yes"}},"w241":{"id":"w241","nodes":["n1082","n1083","n1084","n1085","n1082"],"tags":{"building":"yes"}},"w242":{"id":"w242","nodes":["n1086","n1087","n1088","n1089","n1086"],"tags":{"building":"yes"}},"w243":{"id":"w243","nodes":["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],"tags":{"building":"yes"}},"w244":{"id":"w244","nodes":["n1098","n1099","n1100","n1101"],"tags":{"barrier":"fence"}},"w245":{"id":"w245","nodes":["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],"tags":{"highway":"service"}},"w246":{"id":"w246","nodes":["n1103","n1139","n1104"],"tags":{"barrier":"fence"}},"w247":{"id":"w247","nodes":["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],"tags":{"building":"yes"}},"w248":{"id":"w248","nodes":["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],"tags":{"building":"yes"}},"w249":{"id":"w249","nodes":["n1121","n1122","n1123","n1124","n1121"],"tags":{"building":"yes"}},"w25":{"id":"w25","nodes":["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],"tags":{"building":"yes"}},"w250":{"id":"w250","nodes":["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],"tags":{"building":"yes"}},"w251":{"id":"w251","nodes":["n1137","n1138","n1139"],"tags":{"barrier":"fence"}},"w252":{"id":"w252","nodes":["n876","n1140","n1141"],"tags":{"footway":"sidewalk","highway":"footway"}},"w253":{"id":"w253","nodes":["n1141","n1142","n1143","n1144","n1145","n1146"],"tags":{"footway":"sidewalk","highway":"footway"}},"w254":{"id":"w254","nodes":["n1146","n4743","n1147","n1148"],"tags":{"footway":"sidewalk","highway":"footway"}},"w255":{"id":"w255","nodes":["n1148","n1149","n1150","n1151"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w256":{"id":"w256","nodes":["n1151","n1153","n1154","n1155"],"tags":{"footway":"sidewalk","highway":"footway"}},"w257":{"id":"w257","nodes":["n1155","n1156"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w258":{"id":"w258","nodes":["n1157","n1158"],"tags":{"barrier":"retaining_wall"}},"w259":{"id":"w259","nodes":["n1156","n1161","n1159","n1160","n719"],"tags":{"footway":"sidewalk","highway":"footway"}},"w26":{"id":"w26","nodes":["n143","n608","n144"],"tags":{"highway":"service"}},"w260":{"id":"w260","nodes":["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],"tags":{"highway":"footway"}},"w261":{"id":"w261","nodes":["n1171","n1172","n1173"],"tags":{"barrier":"wall"}},"w262":{"id":"w262","nodes":["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],"tags":{"natural":"wood"}},"w263":{"id":"w263","nodes":["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],"tags":{"highway":"path","name":"Riverwalk Trail","surface":"asphalt","width":"3"}},"w264":{"id":"w264","nodes":["n1186","n1187","n1188","n1189","n1186"],"tags":{"building":"yes"}},"w265":{"id":"w265","nodes":["n1190","n1191","n1192","n1193","n1190"],"tags":{"building":"yes"}},"w266":{"id":"w266","nodes":["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],"tags":{"building":"yes"}},"w267":{"id":"w267","nodes":["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],"tags":{"building":"house"}},"w268":{"id":"w268","nodes":["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],"tags":{"building":"house"}},"w269":{"id":"w269","nodes":["n1221","n1225","n1222","n1223","n1224","n1221"],"tags":{"building":"house"}},"w27":{"id":"w27","nodes":["n145","n147","n146"],"tags":{"highway":"footway"}},"w270":{"id":"w270","nodes":["n1225","n1226","n1227","n1229","n1228"],"tags":{"barrier":"fence"}},"w271":{"id":"w271","nodes":["n1229","n1230"],"tags":{"barrier":"fence"}},"w272":{"id":"w272","nodes":["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],"tags":{"building":"house"}},"w273":{"id":"w273","nodes":["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],"tags":{"building":"house"}},"w274":{"id":"w274","nodes":["n1247","n1248","n1249","n1250","n1247"],"tags":{"building":"house"}},"w275":{"id":"w275","nodes":["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],"tags":{"building":"house"}},"w276":{"id":"w276","nodes":["n1257","n1258","n1259","n1260","n1257"],"tags":{"building":"shed"}},"w277":{"id":"w277","nodes":["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],"tags":{"building":"house"}},"w278":{"id":"w278","nodes":["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],"tags":{"building":"house"}},"w279":{"id":"w279","nodes":["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],"tags":{"building":"house"}},"w28":{"id":"w28","nodes":["n147","n148"],"tags":{"highway":"footway"}},"w280":{"id":"w280","nodes":["n1281","n1282","n1283","n1284"],"tags":{"barrier":"fence"}},"w281":{"id":"w281","nodes":["n1285","n1286","n1287","n1288","n1285"],"tags":{"building":"house"}},"w282":{"id":"w282","nodes":["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],"tags":{"building":"house"}},"w283":{"id":"w283","nodes":["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],"tags":{"access":"private","leisure":"swimming_pool"}},"w284":{"id":"w284","nodes":["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],"tags":{"building":"house"}},"w285":{"id":"w285","nodes":["n1313","n1314","n1315","n1316","n1313"],"tags":{"building":"house"}},"w286":{"id":"w286","nodes":["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],"tags":{"building":"house"}},"w287":{"id":"w287","nodes":["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],"tags":{"building":"yes"}},"w288":{"id":"w288","nodes":["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],"tags":{"access":"private","leisure":"swimming_pool"}},"w289":{"id":"w289","nodes":["n1356","n1331"],"tags":{"barrier":"fence"}},"w29":{"id":"w29","nodes":["n149","n874","n150","n151","n897","n898","n875","n152"],"tags":{"highway":"service","oneway":"yes"}},"w290":{"id":"w290","nodes":["n1357","n1358","n1359","n1360","n1357"],"tags":{"building":"shed"}},"w291":{"id":"w291","nodes":["n1358","n1361","n1362"],"tags":{"barrier":"fence"}},"w292":{"id":"w292","nodes":["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],"tags":{"building":"house"}},"w293":{"id":"w293","nodes":["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],"tags":{"leisure":"swimming_pool"}},"w294":{"id":"w294","nodes":["n1367","n1375","n1376","n1377"],"tags":{"barrier":"fence"}},"w295":{"id":"w295","nodes":["n1378","n1379","n1380","n1381","n1378"],"tags":{"building":"house"}},"w296":{"id":"w296","nodes":["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],"tags":{"building":"house"}},"w297":{"id":"w297","nodes":["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],"tags":{"building":"house"}},"w298":{"id":"w298","nodes":["n1394","n1395","n1396","n1397","n1394"],"tags":{"building":"house"}},"w299":{"id":"w299","nodes":["n1398","n1399","n1400","n1401","n1398"],"tags":{"access":"private3","leisure":"swimming_pool"}},"w3":{"id":"w3","nodes":["n1","n2"],"tags":{"highway":"track","name":"Water Street"}},"w30":{"id":"w30","nodes":["n153","n154","n155","n156","n153"],"tags":{"amenity":"parking"}},"w300":{"id":"w300","nodes":["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],"tags":{"building":"house"}},"w301":{"id":"w301","nodes":["n1414","n1415","n1416","n1417","n1414"],"tags":{"building":"garage"}},"w302":{"id":"w302","nodes":["n1406","n1418","n1419","n1403"],"tags":{"barrier":"fence"}},"w303":{"id":"w303","nodes":["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],"tags":{"building":"house"}},"w304":{"id":"w304","nodes":["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],"tags":{"access":"private","leisure":"swimming_pool"}},"w305":{"id":"w305","nodes":["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],"tags":{"building":"house"}},"w306":{"id":"w306","nodes":["n1455","n1456","n1457","n1458","n1455"],"tags":{"building":"shed"}},"w307":{"id":"w307","nodes":["n1459","n1460","n1461","n1462","n1459"],"tags":{"building":"shed"}},"w308":{"id":"w308","nodes":["n1463","n1464"],"tags":{"barrier":"fence"}},"w309":{"id":"w309","nodes":["n1465","n1466","n1467","n1468"],"tags":{"barrier":"fence"}},"w31":{"id":"w31","nodes":["n157","n605","n158"],"tags":{"highway":"service"}},"w310":{"id":"w310","nodes":["n1469","n1481","n1463"],"tags":{"barrier":"hedge"}},"w311":{"id":"w311","nodes":["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],"tags":{"building":"house"}},"w312":{"id":"w312","nodes":["n1480","n1481"],"tags":{"barrier":"wall"}},"w313":{"id":"w313","nodes":["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],"tags":{"access":"private","leisure":"swimming_pool"}},"w314":{"id":"w314","nodes":["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],"tags":{"building":"house"}},"w315":{"id":"w315","nodes":["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],"tags":{"building":"house"}},"w316":{"id":"w316","nodes":["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],"tags":{"building":"house"}},"w317":{"id":"w317","nodes":["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],"tags":{"building":"house"}},"w318":{"id":"w318","nodes":["n1532","n1533"],"tags":{"barrier":"fence"}},"w319":{"id":"w319","nodes":["n1534","n1532","n1535"],"tags":{"barrier":"fence"}},"w32":{"id":"w32","nodes":["n159","n160","n161","n162","n159"],"tags":{"amenity":"parking"}},"w320":{"id":"w320","nodes":["n1536","n1537","n1538","n1539","n1536"],"tags":{"building":"shed"}},"w321":{"id":"w321","nodes":["n1540","n1541","n1542","n1543","n1540"],"tags":{"building":"shed"}},"w322":{"id":"w322","nodes":["n1544","n1545","n1546","n1547","n1544"],"tags":{"building":"shed"}},"w323":{"id":"w323","nodes":["n1548","n1549","n1550","n1551","n1548"],"tags":{"building":"house"}},"w324":{"id":"w324","nodes":["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],"tags":{"building":"house"}},"w325":{"id":"w325","nodes":["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],"tags":{"building":"house"}},"w326":{"id":"w326","nodes":["n1561","n1568","n1569","n1570"],"tags":{"barrier":"wall"}},"w327":{"id":"w327","nodes":["n1571","n1572"],"tags":{"barrier":"fence"}},"w328":{"id":"w328","nodes":["n1573","n1574","n1575","n1576","n1573"],"tags":{"building":"house"}},"w329":{"id":"w329","nodes":["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],"tags":{"building":"house"}},"w33":{"id":"w33","nodes":["n157","n163"],"tags":{"highway":"service"}},"w330":{"id":"w330","nodes":["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],"tags":{"building":"house"}},"w331":{"id":"w331","nodes":["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],"tags":{"access":"private","leisure":"swimming_pool"}},"w332":{"id":"w332","nodes":["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],"tags":{"building":"house"}},"w333":{"id":"w333","nodes":["n2018","n1626","n1627","n2017","n2018"],"tags":{"amenity":"shelter","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","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","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","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","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","shelter_type":"picnic_shelter"}},"w576":{"id":"w576","nodes":["n3065","n3066","n3067","n3068","n3065"],"tags":{"building":"yes"}},"w577":{"id":"w577","nodes":["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],"tags":{"highway":"service","name":"Willow Drive","service":"driveway","surface":"unpaved"}},"w578":{"id":"w578","nodes":["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],"tags":{"building":"yes"}},"w579":{"id":"w579","nodes":["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],"tags":{"highway":"residential","name":"Elm Street"}},"w58":{"id":"w58","nodes":["n240","n293","n294"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w580":{"id":"w580","nodes":["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],"tags":{"building":"yes"}},"w581":{"id":"w581","nodes":["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],"tags":{"highway":"residential","name":"Kelsey Street"}},"w582":{"id":"w582","nodes":["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],"tags":{"highway":"residential","name":"Walnut Street"}},"w583":{"id":"w583","nodes":["n3272","n4469","n4588","n2879","n4564","n2872"],"tags":{"highway":"residential","name":"10th Avenue"}},"w584":{"id":"w584","nodes":["n3243","n3242","n3241","n3240","n3243"],"tags":{"building":"industrial"}},"w585":{"id":"w585","nodes":["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],"tags":{"highway":"residential","name":"6th Avenue"}},"w586":{"id":"w586","nodes":["n3276","n4591","n2853","n4605","n2854"],"tags":{"highway":"residential","name":"8th Avenue"}},"w587":{"id":"w587","nodes":["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],"tags":{"building":"industrial"}},"w588":{"id":"w588","nodes":["n3277","n4599","n2857","n4598","n4608","n2858"],"tags":{"highway":"residential","name":"7th Avenue"}},"w589":{"id":"w589","nodes":["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],"tags":{"building":"yes"}},"w59":{"id":"w59","nodes":["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],"tags":{"footway":"sidewalk","highway":"footway"}},"w590":{"id":"w590","nodes":["n3278","n4458","n4589","n4604","n2861"],"tags":{"highway":"residential","name":"9th Avenue"}},"w591":{"id":"w591","nodes":["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],"tags":{"building":"industrial"}},"w592":{"id":"w592","nodes":["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],"tags":{"natural":"water","water":"pond"}},"w593":{"id":"w593","nodes":["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],"tags":{"building":"industrial"}},"w594":{"id":"w594","nodes":["n3233","n3232","n3231","n3230","n3233"],"tags":{"building":"yes"}},"w595":{"id":"w595","nodes":["n3247","n3246","n3245","n3244","n3247"],"tags":{"building":"industrial"}},"w596":{"id":"w596","nodes":["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],"tags":{"highway":"residential","name":"Armitage Street"}},"w597":{"id":"w597","nodes":["n2193","n2194","n2195","n2197","n2193"],"tags":{"building":"yes"}},"w598":{"id":"w598","nodes":["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],"tags":{"building":"school"}},"w6":{"id":"w6","nodes":["n879","n880","n881","n882","n879"],"tags":{"building":"shed"}},"w60":{"id":"w60","nodes":["n239","n308","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w600":{"id":"w600","nodes":["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],"tags":{"building":"yes"}},"w601":{"id":"w601","nodes":["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],"tags":{"building":"yes"}},"w602":{"id":"w602","nodes":["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],"tags":{"building":"yes"}},"w603":{"id":"w603","nodes":["n3353","n3352","n3347","n3280","n2798"],"tags":{"highway":"service","service":"alley","surface":"unpaved"}},"w604":{"id":"w604","nodes":["n3753","n3211","n3383"],"tags":{"highway":"service","service":"alley"}},"w605":{"id":"w605","nodes":["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],"tags":{"building":"yes"}},"w606":{"id":"w606","nodes":["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],"tags":{"building":"yes"}},"w607":{"id":"w607","nodes":["n2198","n2207"],"tags":{"barrier":"wall"}},"w608":{"id":"w608","nodes":["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],"tags":{"highway":"residential","name":"East Street"}},"w609":{"id":"w609","nodes":["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],"tags":{"highway":"residential","name":"Maple Street"}},"w61":{"id":"w61","nodes":["n309","n310","n311","n312","n313","n240"],"tags":{"footway":"sidewalk","highway":"footway"}},"w610":{"id":"w610","nodes":["n3379","n3380","n3382","n3381","n3379"],"tags":{"leisure":"park","name":"LaFayette Park"}},"w611":{"id":"w611","nodes":["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],"tags":{"highway":"residential","name":"Bennett Street"}},"w612":{"id":"w612","nodes":["n2751","n3383","n2749","n2798","n2772"],"tags":{"highway":"residential","name":"Market Street"}},"w613":{"id":"w613","nodes":["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],"tags":{"building":"yes"}},"w614":{"id":"w614","nodes":["n3375","n3406","n3405","n3374","n3375"],"tags":{"leisure":"playground"}},"w615":{"id":"w615","nodes":["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],"tags":{"building":"yes"}},"w616":{"id":"w616","nodes":["n3376","n3407","n3408","n3377","n3376"],"tags":{"amenity":"school","name":"Three Rivers Elementary School"}},"w617":{"id":"w617","nodes":["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],"tags":{"building":"yes"}},"w619":{"id":"w619","nodes":["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],"tags":{"highway":"secondary","name":"Michigan Avenue","ref":"M 60"}},"w62":{"id":"w62","nodes":["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],"tags":{"footway":"sidewalk","highway":"footway"}},"w620":{"id":"w620","nodes":["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],"tags":{"highway":"residential"}},"w621":{"id":"w621","nodes":["n3468","n3469","n3470","n3471","n3468"],"tags":{"building":"yes"}},"w622":{"id":"w622","nodes":["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],"tags":{"landuse":"cemetery","name":"Riverside Cemetery"}},"w623":{"id":"w623","nodes":["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],"tags":{"building":"yes"}},"w624":{"id":"w624","nodes":["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],"tags":{"building":"yes"}},"w625":{"id":"w625","nodes":["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],"tags":{"highway":"secondary","name":"Jefferson Street","name_1":"State Highway 60","ref":"M 60"}},"w626":{"id":"w626","nodes":["n3439","n3423","n2863"],"tags":{"highway":"unclassified","name":"Michigan Avenue","name_1":"State Highway 60"}},"w627":{"id":"w627","nodes":["n3500","n3005"],"tags":{"highway":"service"}},"w628":{"id":"w628","nodes":["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],"tags":{"leisure":"park","name":"Marina Park"}},"w629":{"id":"w629","nodes":["n2208","n2209","n2212","n2214","n2208"],"tags":{"building":"yes"}},"w63":{"id":"w63","nodes":["n1955","n316"],"tags":{"footway":"sidewalk","highway":"footway"}},"w630":{"id":"w630","nodes":["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w631":{"id":"w631","nodes":["n2215","n2750","n2770","n2771","n2215"],"tags":{"building":"yes"}},"w632":{"id":"w632","nodes":["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],"tags":{"highway":"residential","name":"Cushman Street"}},"w633":{"id":"w633","nodes":["n2745","n3749","n3507","n4535","n3503"],"tags":{"highway":"residential","name":"Pine Street"}},"w634":{"id":"w634","nodes":["n3510","n3511","n3512","n3509","n3510"],"tags":{"leisure":"park","name":"Bowman Park"}},"w636":{"id":"w636","nodes":["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],"tags":{"highway":"residential","name":"Wheeler Street"}},"w637":{"id":"w637","nodes":["n3550","n4586","n4476","n3472"],"tags":{"highway":"residential","name":"11th Avenue"}},"w638":{"id":"w638","nodes":["n3508","n3518"],"tags":{"bridge":"yes","highway":"residential","name":"Hoffman Street"}},"w639":{"id":"w639","nodes":["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],"tags":{"highway":"residential","name":"Hoffman Street"}},"w64":{"id":"w64","nodes":["n316","n317"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w640":{"id":"w640","nodes":["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],"tags":{"landuse":"reservoir","name":"Hoffman Pond","natural":"water"}},"w641":{"id":"w641","nodes":["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],"tags":{"waterway":"river"}},"w642":{"id":"w642","nodes":["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],"tags":{"admin_level":"8","boundary":"administrative"}},"w643":{"id":"w643","nodes":["n2839","n2873"],"tags":{"highway":"service","service":"driveway"}},"w644":{"id":"w644","nodes":["n2873","n2840"],"tags":{"bridge":"yes","highway":"service","layer":"1","service":"driveway"}},"w645":{"id":"w645","nodes":["n2840","n2841","n2842","n2845","n2866"],"tags":{"highway":"service","service":"driveway","surface":"unpaved"}},"w646":{"id":"w646","nodes":["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],"tags":{"highway":"residential","name":"Flower Street"}},"w647":{"id":"w647","nodes":["n2874","n2875","n2876","n2954","n2874"],"tags":{"building":"industrial"}},"w648":{"id":"w648","nodes":["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],"tags":{"building":"yes"}},"w649":{"id":"w649","nodes":["n3197","n4543","n4544","n3198"],"tags":{"highway":"residential","name":"Morris Avenue","surface":"unpaved"}},"w65":{"id":"w65","nodes":["n317","n318","n319","n320","n321"],"tags":{"footway":"sidewalk","highway":"footway"}},"w650":{"id":"w650","nodes":["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],"tags":{"highway":"residential","name":"Adams Street"}},"w651":{"id":"w651","nodes":["n3788","n3785","n3786","n3787","n3788"],"tags":{"power":"station"}},"w652":{"id":"w652","nodes":["n2957","n3163","n3241"],"tags":{"barrier":"wall"}},"w653":{"id":"w653","nodes":["n3549","n3802","n3803","n3800","n3801"],"tags":{"highway":"service","surface":"unpaved"}},"w654":{"id":"w654","nodes":["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],"tags":{"building":"yes"}},"w655":{"id":"w655","nodes":["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],"tags":{"building":"yes"}},"w656":{"id":"w656","nodes":["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],"tags":{"building":"yes"}},"w657":{"id":"w657","nodes":["n3772","n3773","n3774","n3775","n3772"],"tags":{"building":"yes"}},"w658":{"id":"w658","nodes":["n3776","n3777","n3784","n3789","n3776"],"tags":{"building":"yes"}},"w659":{"id":"w659","nodes":["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],"tags":{"leisure":"pitch","sport":"baseball"}},"w66":{"id":"w66","nodes":["n321","n322"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w660":{"id":"w660","nodes":["n3982","n3842","n3864","n3865","n3866","n3867","n3868","n3858","n3869","n3870","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","n3950","n3951","n3952","n3953","n3954","n3956","n3966","n3955"],"tags":{"highway":"footway"}},"w678":{"id":"w678","nodes":["n3887","n3888","n3895","n3899"],"tags":{"highway":"service","service":"parking_aisle"}},"w679":{"id":"w679","nodes":["n3946","n3947","n3993","n3992","n3946"],"tags":{"leisure":"pitch","sport":"tennis"}},"w68":{"id":"w68","nodes":["n294","n1952","n326"],"tags":{"footway":"sidewalk","highway":"footway"}},"w680":{"id":"w680","nodes":["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],"tags":{"leisure":"pitch","sport":"baseball"}},"w681":{"id":"w681","nodes":["n3990","n3991","n3944","n3945","n3990"],"tags":{"leisure":"pitch","sport":"tennis"}},"w682":{"id":"w682","nodes":["n3871","n3872","n3873","n3874","n3871"],"tags":{"amenity":"parking"}},"w683":{"id":"w683","nodes":["n3956","n3965","n3957","n3958","n3959"],"tags":{"footway":"sidewalk","highway":"footway"}},"w684":{"id":"w684","nodes":["n3790","n3791","n3792","n3793","n3790"],"tags":{"building":"shed"}},"w685":{"id":"w685","nodes":["n3794","n3795","n3796","n3797","n3794"],"tags":{"building":"yes"}},"w686":{"id":"w686","nodes":["n3798","n3799","n3804","n3805","n3798"],"tags":{"building":"yes"}},"w687":{"id":"w687","nodes":["n3806","n3807"],"tags":{"highway":"footway"}},"w688":{"id":"w688","nodes":["n3845","n3846","n3847","n3848","n3845"],"tags":{"leisure":"pitch","sport":"american_football"}},"w689":{"id":"w689","nodes":["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],"tags":{"leisure":"track","sport":"running"}},"w69":{"id":"w69","nodes":["n326","n327"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w690":{"id":"w690","nodes":["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],"tags":{"building":"yes"}},"w691":{"id":"w691","nodes":["n4028","n4029","n4030","n4031","n4028"],"tags":{"building":"yes"}},"w692":{"id":"w692","nodes":["n4032","n4033","n4034","n4035","n4032"],"tags":{"building":"yes"}},"w693":{"id":"w693","nodes":["n4036","n4037","n4038","n4039","n4036"],"tags":{"building":"yes"}},"w694":{"id":"w694","nodes":["n4040","n4041","n4042","n4043","n4040"],"tags":{"building":"yes"}},"w695":{"id":"w695","nodes":["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],"tags":{"building":"yes"}},"w696":{"id":"w696","nodes":["n4050","n4051","n4052","n4053","n4050"],"tags":{"building":"roof"}},"w697":{"id":"w697","nodes":["n4054","n4068","n4055","n4056","n4057","n4054"],"tags":{"building":"yes"}},"w698":{"id":"w698","nodes":["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],"tags":{"building":"yes"}},"w699":{"id":"w699","nodes":["n4064","n4066","n4065"],"tags":{"barrier":"fence"}},"w7":{"id":"w7","nodes":["n43","n44","n45"],"tags":{"highway":"service"}},"w70":{"id":"w70","nodes":["n327","n328","n27","n329"],"tags":{"footway":"sidewalk","highway":"footway"}},"w700":{"id":"w700","nodes":["n4066","n4067","n4068"],"tags":{"barrier":"fence"}},"w701":{"id":"w701","nodes":["n4069","n4070","n4071","n4072","n4069"],"tags":{"building":"shed"}},"w702":{"id":"w702","nodes":["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],"tags":{"building":"yes"}},"w703":{"id":"w703","nodes":["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],"tags":{"building":"yes"}},"w704":{"id":"w704","nodes":["n4093","n4094","n4095","n4096"],"tags":{"barrier":"fence"}},"w705":{"id":"w705","nodes":["n4097","n4098","n4099","n4100","n4097"],"tags":{"building":"yes"}},"w706":{"id":"w706","nodes":["n4098","n4102","n4087"],"tags":{"barrier":"fence"}},"w707":{"id":"w707","nodes":["n4101","n4102","n4096","n4170","n4103"],"tags":{"barrier":"fence"}},"w708":{"id":"w708","nodes":["n4104","n4105","n4106","n4107","n4104"],"tags":{"access":"private","leisure":"swimming_pool"}},"w709":{"id":"w709","nodes":["n4108","n4109","n4110","n4111","n4108"],"tags":{"building":"yes"}},"w71":{"id":"w71","nodes":["n329","n331"],"tags":{"bridge":"yes","footway":"sidewalk","highway":"footway","layer":"1"}},"w710":{"id":"w710","nodes":["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],"tags":{"building":"yes"}},"w711":{"id":"w711","nodes":["n4120","n4121","n4122","n4123","n4120"],"tags":{"building":"yes"}},"w712":{"id":"w712","nodes":["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],"tags":{"building":"yes"}},"w713":{"id":"w713","nodes":["n4130","n4131","n4132","n4133","n4130"],"tags":{"building":"shed"}},"w714":{"id":"w714","nodes":["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],"tags":{"building":"yes"}},"w715":{"id":"w715","nodes":["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],"tags":{"building":"yes"}},"w716":{"id":"w716","nodes":["n4150","n4151","n4152","n4153","n4150"],"tags":{"building":"yes"}},"w717":{"id":"w717","nodes":["n4154","n4155","n4156","n4157","n4154"],"tags":{"building":"yes"}},"w718":{"id":"w718","nodes":["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],"tags":{"building":"yes"}},"w719":{"id":"w719","nodes":["n4166","n4167","n4168","n4169","n4166"],"tags":{"building":"yes"}},"w72":{"id":"w72","nodes":["n331","n344","n332","n333","n334"],"tags":{"footway":"sidewalk","highway":"footway"}},"w720":{"id":"w720","nodes":["n4170","n4171"],"tags":{"barrier":"fence"}},"w721":{"id":"w721","nodes":["n4138","n4103"],"tags":{"barrier":"fence"}},"w722":{"id":"w722","nodes":["n4103","n4172"],"tags":{"barrier":"fence"}},"w723":{"id":"w723","nodes":["n4173","n4174"],"tags":{"barrier":"fence"}},"w724":{"id":"w724","nodes":["n4175","n4176","n4177","n4178","n4175"],"tags":{"building":"yes"}},"w725":{"id":"w725","nodes":["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],"tags":{"building":"yes"}},"w726":{"id":"w726","nodes":["n4185","n4186","n4187","n4188","n4185"],"tags":{"building":"yes"}},"w727":{"id":"w727","nodes":["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],"tags":{"building":"yes"}},"w728":{"id":"w728","nodes":["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],"tags":{"building":"yes"}},"w729":{"id":"w729","nodes":["n4211","n4212","n4213","n4214","n4211"],"tags":{"building":"shed"}},"w73":{"id":"w73","nodes":["n335","n336","n337","n338","n339","n340","n341","n342","n335"],"tags":{"building":"yes"}},"w730":{"id":"w730","nodes":["n4215","n4216","n4217","n4218","n4215"],"tags":{"building":"yes"}},"w731":{"id":"w731","nodes":["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],"tags":{"building":"yes"}},"w732":{"id":"w732","nodes":["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],"tags":{"building":"yes"}},"w733":{"id":"w733","nodes":["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],"tags":{"highway":"service"}},"w734":{"id":"w734","nodes":["n4240","n4249","n4248"],"tags":{"highway":"service","service":"parking_aisle"}},"w735":{"id":"w735","nodes":["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],"tags":{"amenity":"parking"}},"w736":{"id":"w736","nodes":["n4259","n4260","n4261","n4262","n4259"],"tags":{"building":"yes"}},"w737":{"id":"w737","nodes":["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],"tags":{"building":"yes"}},"w738":{"id":"w738","nodes":["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],"tags":{"building":"yes"}},"w739":{"id":"w739","nodes":["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],"tags":{"building":"yes"}},"w74":{"id":"w74","nodes":["n343","n344","n345"],"tags":{"highway":"service"}},"w740":{"id":"w740","nodes":["n4295","n4296","n4297","n4298","n4295"],"tags":{"building":"yes"}},"w741":{"id":"w741","nodes":["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],"tags":{"building":"yes"}},"w742":{"id":"w742","nodes":["n4311","n4312","n4313","n4314","n4311"],"tags":{"building":"shed"}},"w743":{"id":"w743","nodes":["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],"tags":{"building":"yes"}},"w744":{"id":"w744","nodes":["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],"tags":{"building":"yes"}},"w745":{"id":"w745","nodes":["n4335","n4336","n4337","n4338","n4335"],"tags":{"building":"shed"}},"w746":{"id":"w746","nodes":["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],"tags":{"building":"yes"}},"w747":{"id":"w747","nodes":["n4345","n4346","n4347","n4348","n4345"],"tags":{"building":"yes"}},"w748":{"id":"w748","nodes":["n4349","n4350","n4351","n4352","n4349"],"tags":{"building":"yes"}},"w749":{"id":"w749","nodes":["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],"tags":{"building":"yes"}},"w75":{"id":"w75","nodes":["n346","n347","n348","n349","n350","n351","n346"],"tags":{"amenity":"parking"}},"w750":{"id":"w750","nodes":["n4612","n4359","n4360"],"tags":{"barrier":"fence"}},"w751":{"id":"w751","nodes":["n4361","n4362","n4363","n4364","n4361"],"tags":{"building":"yes"}},"w752":{"id":"w752","nodes":["n4365","n4366","n4367","n4368","n4365"],"tags":{"building":"yes"}},"w753":{"id":"w753","nodes":["n4369","n4370","n4371","n4372","n4375","n4369"],"tags":{"building":"yes"}},"w754":{"id":"w754","nodes":["n4373","n4374","n4375"],"tags":{"barrier":"fence"}},"w755":{"id":"w755","nodes":["n4376","n4377","n4378","n4379","n4376"],"tags":{"building":"shed"}},"w756":{"id":"w756","nodes":["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],"tags":{"building":"yes"}},"w757":{"id":"w757","nodes":["n4392","n4393","n4394","n4395","n4392"],"tags":{"building":"yes"}},"w758":{"id":"w758","nodes":["n4396","n4397","n4398","n4399","n4396"],"tags":{"building":"shed"}},"w759":{"id":"w759","nodes":["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],"tags":{"building":"yes"}},"w76":{"id":"w76","nodes":["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],"tags":{"highway":"service","oneway":"yes","service":"parking_aisle"}},"w760":{"id":"w760","nodes":["n4416","n4417"],"tags":{"barrier":"fence"}},"w761":{"id":"w761","nodes":["n4418","n4416","n4419"],"tags":{"barrier":"fence"}},"w762":{"id":"w762","nodes":["n4420","n4421"],"tags":{"barrier":"fence"}},"w763":{"id":"w763","nodes":["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],"tags":{"building":"yes"}},"w764":{"id":"w764","nodes":["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],"tags":{"building":"yes"}},"w765":{"id":"w765","nodes":["n4446","n4447","n4448","n4449","n4446"],"tags":{"building":"yes"}},"w766":{"id":"w766","nodes":["n4450","n4451","n4452","n4453","n4450"],"tags":{"building":"yes"}},"w767":{"id":"w767","nodes":["n4454","n4455","n4456","n4457","n4454"],"tags":{"building":"yes"}},"w768":{"id":"w768","nodes":["n4461","n4458","n4460"],"tags":{"footway":"crossing","highway":"footway"}},"w769":{"id":"w769","nodes":["n4460","n4462","n4459"],"tags":{"footway":"sidewalk","highway":"footway"}},"w77":{"id":"w77","nodes":["n325","n360","n361"],"tags":{"footway":"crossing","highway":"footway"}},"w770":{"id":"w770","nodes":["n4462","n4463","n4464"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w771":{"id":"w771","nodes":["n4464","n4465","n4466","n4467"],"tags":{"footway":"sidewalk","highway":"footway"}},"w772":{"id":"w772","nodes":["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],"tags":{"footway":"sidewalk","highway":"footway"}},"w773":{"id":"w773","nodes":["n4467","n4468","n3959"],"tags":{"footway":"crossing","highway":"footway"}},"w774":{"id":"w774","nodes":["n4459","n4469","n4470"],"tags":{"footway":"crossing","highway":"footway"}},"w775":{"id":"w775","nodes":["n4470","n4471","n4472","n4473","n4474","n4475"],"tags":{"footway":"sidewalk","highway":"footway"}},"w776":{"id":"w776","nodes":["n4475","n4476","n4477"],"tags":{"footway":"crossing","highway":"footway"}},"w777":{"id":"w777","nodes":["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],"tags":{"footway":"sidewalk","highway":"footway"}},"w778":{"id":"w778","nodes":["n4488","n4489","n4490","n4491","n4488"],"tags":{"building":"yes"}},"w779":{"id":"w779","nodes":["n4492","n4493","n4494","n4495","n4492"],"tags":{"building":"yes"}},"w78":{"id":"w78","nodes":["n361","n362","n369"],"tags":{"footway":"sidewalk","highway":"footway"}},"w780":{"id":"w780","nodes":["n4496","n4497","n4498","n4499","n4496"],"tags":{"access":"private","leisure":"swimming_pool"}},"w781":{"id":"w781","nodes":["n4508","n4509"],"tags":{"footway":"sidewalk","highway":"footway"}},"w782":{"id":"w782","nodes":["n4510","n4511"],"tags":{"footway":"sidewalk","highway":"footway"}},"w783":{"id":"w783","nodes":["n4512","n4513"],"tags":{"footway":"sidewalk","highway":"footway"}},"w784":{"id":"w784","nodes":["n4513","n4514"],"tags":{"footway":"sidewalk","highway":"footway"}},"w785":{"id":"w785","nodes":["n4515","n4516"],"tags":{"footway":"sidewalk","highway":"footway"}},"w786":{"id":"w786","nodes":["n4517","n4515"],"tags":{"footway":"sidewalk","highway":"footway"}},"w787":{"id":"w787","nodes":["n4518","n4519"],"tags":{"footway":"sidewalk","highway":"footway"}},"w788":{"id":"w788","nodes":["n4519","n4520","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w789":{"id":"w789","nodes":["n4515","n4521","n4513"],"tags":{"footway":"crossing","highway":"footway"}},"w79":{"id":"w79","nodes":["n362","n363","n334"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w790":{"id":"w790","nodes":["n4515","n4522","n4523"],"tags":{"footway":"crossing","highway":"footway"}},"w791":{"id":"w791","nodes":["n4523","n4524","n4519"],"tags":{"footway":"crossing","highway":"footway"}},"w792":{"id":"w792","nodes":["n4523","n4525"],"tags":{"footway":"sidewalk","highway":"footway"}},"w793":{"id":"w793","nodes":["n4525","n4526","n4527"],"tags":{"footway":"crossing","highway":"footway"}},"w794":{"id":"w794","nodes":["n4527","n4529"],"tags":{"footway":"sidewalk","highway":"footway"}},"w795":{"id":"w795","nodes":["n4529","n4530","n4518"],"tags":{"footway":"crossing","highway":"footway"}},"w796":{"id":"w796","nodes":["n4518","n4531"],"tags":{"footway":"sidewalk","highway":"footway"}},"w797":{"id":"w797","nodes":["n4531","n4532"],"tags":{"footway":"sidewalk","highway":"footway"}},"w798":{"id":"w798","nodes":["n4533","n4534"],"tags":{"footway":"sidewalk","highway":"footway"}},"w799":{"id":"w799","nodes":["n4518","n4538","n4539"],"tags":{"footway":"crossing","highway":"footway"}},"w8":{"id":"w8","nodes":["n46","n47","n145","n48","n49","n46"],"tags":{"amenity":"parking"}},"w80":{"id":"w80","nodes":["n334","n364","n365"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w800":{"id":"w800","nodes":["n4539","n4540","n4541"],"tags":{"footway":"crossing","highway":"footway"}},"w801":{"id":"w801","nodes":["n4541","n4542","n4529"],"tags":{"footway":"crossing","highway":"footway"}},"w802":{"id":"w802","nodes":["n4552","n4553"],"tags":{"footway":"sidewalk","highway":"footway"}},"w803":{"id":"w803","nodes":["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],"tags":{"building":"yes"}},"w804":{"id":"w804","nodes":["n4562","n4563"],"tags":{"barrier":"retaining_wall"}},"w805":{"id":"w805","nodes":["n4568","n4569","n4570","n4571","n4568"],"tags":{"building":"yes"}},"w806":{"id":"w806","nodes":["n3473","n4575","n4576","n4581","n4580","n3551"],"tags":{"highway":"residential","oneway":"yes"}},"w807":{"id":"w807","nodes":["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],"tags":{"leisure":"pitch","sport":"baseball"}},"w808":{"id":"w808","nodes":["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],"tags":{"highway":"service"}},"w809":{"id":"w809","nodes":["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],"tags":{"highway":"service"}},"w81":{"id":"w81","nodes":["n365","n366","n367"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w810":{"id":"w810","nodes":["n4639","n4640","n4641"],"tags":{"barrier":"fence"}},"w811":{"id":"w811","nodes":["n4649","n4650","n4651","n4652","n4649"],"tags":{"building":"yes"}},"w812":{"id":"w812","nodes":["n4654","n4655"],"tags":{"barrier":"fence"}},"w813":{"id":"w813","nodes":["n4656","n4657"],"tags":{"barrier":"fence"}},"w814":{"id":"w814","nodes":["n4669","n4670","n4671","n4672","n4669"],"tags":{"amenity":"shelter","shelter_type":"picnic_shelters"}},"w815":{"id":"w815","nodes":["n4678","n4679","n4680","n1889"],"tags":{"highway":"service"}},"w816":{"id":"w816","nodes":["n239","n4686","n4687"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w817":{"id":"w817","nodes":["n4687","n4688","n4689"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w818":{"id":"w818","nodes":["n4689","n4690","n307"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w819":{"id":"w819","nodes":["n2266","n4743"],"tags":{"highway":"path"}},"w82":{"id":"w82","nodes":["n724","n368","n369"],"tags":{"crossing":"zebra","footway":"crossing","highway":"footway"}},"w820":{"id":"w820","nodes":["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],"tags":{"natural":"wood"}},"w821":{"id":"w821","nodes":["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],"tags":{"natural":"scrub"}},"w822":{"id":"w822","nodes":["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],"tags":{"natural":"wood"}},"w823":{"id":"w823","nodes":["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],"tags":{"natural":"wood"}},"w824":{"id":"w824","nodes":["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],"tags":{"landuse":"recreation_ground"}},"w825":{"id":"w825","nodes":["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],"tags":{"landuse":"recreation_ground"}},"w826":{"id":"w826","nodes":["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],"tags":{"landuse":"industrial"}},"w827":{"id":"w827","nodes":["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],"tags":{"landuse":"industrial"}},"w828":{"id":"w828","nodes":["n4843","n4844","n4845","n4846","n4843"],"tags":{"landuse":"farmland"}},"w829":{"id":"w829","nodes":["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],"tags":{"aeroway":"aerodrome","name":"Three Rivers Municipal Airport"}},"w83":{"id":"w83","nodes":["n371","n372","n373","n374","n371"],"tags":{"building":"yes"}},"w830":{"id":"w830","nodes":["n4855","n4854","n4857","n4853","n4960"],"tags":{"barrier":"fence"}},"w831":{"id":"w831","nodes":["n4860","n4859","n4858","n4852","n4851"],"tags":{"barrier":"fence"}},"w832":{"id":"w832","nodes":["n4866","n4878","n4869","n4867"],"tags":{"aeroway":"runway","ref":"5/23"}},"w833":{"id":"w833","nodes":["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],"tags":{"aeroway":"runway","ref":"9/27"}},"w834":{"id":"w834","nodes":["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],"tags":{"aeroway":"apron"}},"w835":{"id":"w835","nodes":["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],"tags":{"aeroway":"taxiway"}},"w836":{"id":"w836","nodes":["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],"tags":{"aeroway":"taxiway"}},"w837":{"id":"w837","nodes":["n4893","n4894"],"tags":{"aeroway":"taxiway"}},"w838":{"id":"w838","nodes":["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],"tags":{"aeroway":"taxiway"}},"w839":{"id":"w839","nodes":["n4907","n4908"],"tags":{"highway":"service"}},"w84":{"id":"w84","nodes":["n374","n375","n376","n377","n373","n374"],"tags":{"building":"yes"}},"w840":{"id":"w840","nodes":["n4909","n4907","n4910"],"tags":{"highway":"service"}},"w841":{"id":"w841","nodes":["n4911","n4912","n4913","n4914","n4911"],"tags":{"building":"yes"}},"w842":{"id":"w842","nodes":["n4915","n4916","n4917","n4918","n4915"],"tags":{"aeroway":"hangar","building":"yes"}},"w843":{"id":"w843","nodes":["n4919","n4920","n4921","n4922","n4919"],"tags":{"building":"yes"}},"w844":{"id":"w844","nodes":["n4923","n4924","n4925","n4926","n4923"],"tags":{"aeroway":"hangar","building":"yes"}},"w845":{"id":"w845","nodes":["n4927","n4928","n4929","n4930","n4927"],"tags":{"aeroway":"hangar","building":"yes"}},"w846":{"id":"w846","nodes":["n4931","n4932","n4933","n4934","n4931"],"tags":{"aeroway":"hangar","building":"yes"}},"w847":{"id":"w847","nodes":["n4935","n4936","n4937","n4938","n4935"],"tags":{"aeroway":"hangar","building":"yes"}},"w848":{"id":"w848","nodes":["n4939","n4940","n4941","n4942","n4939"],"tags":{"aeroway":"hangar","building":"yes"}},"w849":{"id":"w849","nodes":["n4943","n4944","n4945","n4946","n4943"],"tags":{"aeroway":"hangar","building":"yes"}},"w85":{"id":"w85","nodes":["n431","n432","n1038","n433","n434","n1040","n431"],"tags":{"building":"yes"}},"w850":{"id":"w850","nodes":["n4947","n4948","n4949","n4950","n4947"],"tags":{"aeroway":"hangar","building":"yes"}},"w851":{"id":"w851","nodes":["n4951","n4952","n4953","n4954","n4951"],"tags":{"aeroway":"hangar","building":"yes"}},"w852":{"id":"w852","nodes":["n4955","n4956","n4957","n4958","n4955"],"tags":{"aeroway":"hangar","building":"yes"}},"w853":{"id":"w853","nodes":["n4959","n4864","n4861","n4862","n4863"],"tags":{"barrier":"fence"}},"w854":{"id":"w854","nodes":["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],"tags":{"landuse":"farmland"}},"w855":{"id":"w855","nodes":["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],"tags":{"landuse":"farmland"}},"w856":{"id":"w856","nodes":["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],"tags":{"natural":"scrub"}},"w857":{"id":"w857","nodes":["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],"tags":{"landuse":"farmland"}},"w858":{"id":"w858","nodes":["n5001","n5003","n5004","n4999","n5000","n5001"],"tags":{"natural":"scrub"}},"w859":{"id":"w859","nodes":["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],"tags":{"landuse":"farmland"}},"w86":{"id":"w86","nodes":["n384","n385","n386","n387","n384"],"tags":{"building":"yes"}},"w860":{"id":"w860","nodes":["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],"tags":{"landuse":"industrial"}},"w87":{"id":"w87","nodes":["n387","n388","n389","n386","n387"],"tags":{"building":"yes"}},"w88":{"id":"w88","nodes":["n390","n391","n392","n393","n390"],"tags":{"building":"yes"}},"w89":{"id":"w89","nodes":["n394","n2895"],"tags":{"highway":"service"}},"w9":{"id":"w9","nodes":["n50","n51","n148","n52","n57","n891","n53","n50"],"tags":{"building":"yes"}},"w90":{"id":"w90","nodes":["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],"tags":{"building":"yes"}},"w91":{"id":"w91","nodes":["n418","n423","n419"],"tags":{"highway":"service"}},"w92":{"id":"w92","nodes":["n420","n421","n422","n423","n420"],"tags":{"amenity":"parking"}},"w93":{"id":"w93","nodes":["n2282","n1876"],"tags":{"name":"Rocky River","tunnel":"building_passage","waterway":"river"}},"w94":{"id":"w94","nodes":["n1876","n885","n1875","n2234"],"tags":{"name":"Rocky River","waterway":"river"}},"w95":{"id":"w95","nodes":["n425","n426","n427","n914","n428","n913","n425"],"tags":{"building":"yes"}},"w96":{"id":"w96","nodes":["n456","n620","n1034","n1035","n456"],"tags":{"building":"yes"}},"w97":{"id":"w97","nodes":["n435","n912","n451","n321"],"tags":{"highway":"footway"}},"w98":{"id":"w98","nodes":["n436","n319","n437","n438","n439","n440","n441","n476","n442"],"tags":{"highway":"service"}},"w99":{"id":"w99","nodes":["n443","n444","n445","n446","n447","n448","n449","n450","n443"],"tags":{"amenity":"parking"}}};
50069
50070 // toggles the visibility of ui elements, using a combination of the
50071 // hide class, which sets display=none, and a d3 transition for opacity.
50072 // this will cause blinking when called repeatedly, so check that the
50073 // value actually changes between calls.
50074 function uiToggle(show, callback) {
50075     return function(selection$$1) {
50076         selection$$1
50077             .style('opacity', show ? 0 : 1)
50078             .classed('hide', false)
50079             .transition()
50080             .style('opacity', show ? 1 : 0)
50081             .on('end', function() {
50082                 d3_select(this)
50083                     .classed('hide', !show)
50084                     .style('opacity', null);
50085                 if (callback) callback.apply(this);
50086             });
50087     };
50088 }
50089
50090 // Tooltips and svg mask used to highlight certain features
50091 function uiCurtain() {
50092
50093     var surface = d3_select(null),
50094         tooltip = d3_select(null),
50095         darkness = d3_select(null);
50096
50097     function curtain(selection$$1) {
50098         surface = selection$$1
50099             .append('svg')
50100             .attr('id', 'curtain')
50101             .style('z-index', 1000)
50102             .style('pointer-events', 'none')
50103             .style('position', 'absolute')
50104             .style('top', 0)
50105             .style('left', 0);
50106
50107         darkness = surface.append('path')
50108             .attr('x', 0)
50109             .attr('y', 0)
50110             .attr('class', 'curtain-darkness');
50111
50112         d3_select(window).on('resize.curtain', resize);
50113
50114         tooltip = selection$$1.append('div')
50115             .attr('class', 'tooltip')
50116             .style('z-index', 1002);
50117
50118         tooltip
50119             .append('div')
50120             .attr('class', 'tooltip-arrow');
50121
50122         tooltip
50123             .append('div')
50124             .attr('class', 'tooltip-inner');
50125
50126         resize();
50127
50128
50129         function resize() {
50130             surface
50131                 .attr('width', window.innerWidth)
50132                 .attr('height', window.innerHeight);
50133             curtain.cut(darkness.datum());
50134         }
50135     }
50136
50137
50138     /**
50139      * Reveal cuts the curtain to highlight the given box,
50140      * and shows a tooltip with instructions next to the box.
50141      *
50142      * @param  {String|ClientRect} [box]   box used to cut the curtain
50143      * @param  {String}    [text]          text for a tooltip
50144      * @param  {Object}    [options]
50145      * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
50146      * @param  {integer}   [options.duration]        transition time in milliseconds
50147      * @param  {string}    [options.buttonText]      if set, create a button with this text label
50148      * @param  {function}  [options.buttonCallback]  if set, the callback for the button
50149      * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
50150      */
50151     curtain.reveal = function(box, text, options) {
50152         if (typeof box === 'string') {
50153             box = d3_select(box).node();
50154         }
50155         if (box && box.getBoundingClientRect) {
50156             box = copyBox(box.getBoundingClientRect());
50157         }
50158
50159         options = options || {};
50160
50161         var tooltipBox;
50162         if (options.tooltipBox) {
50163             tooltipBox = options.tooltipBox;
50164             if (typeof tooltipBox === 'string') {
50165                 tooltipBox = d3_select(tooltipBox).node();
50166             }
50167             if (tooltipBox && tooltipBox.getBoundingClientRect) {
50168                 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
50169             }
50170         } else {
50171             tooltipBox = box;
50172         }
50173
50174         if (tooltipBox && text) {
50175             // pseudo markdown bold text for the instruction section..
50176             var parts = text.split('**');
50177             var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
50178             if (parts[1]) {
50179                 html += '<span class="instruction">' + parts[1] + '</span>';
50180             }
50181
50182             html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
50183             html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
50184
50185             if (options.buttonText && options.buttonCallback) {
50186                 html += '<div class="button-section">' +
50187                     '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
50188             }
50189
50190             var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
50191             tooltip
50192                 .classed(classes, true)
50193                 .selectAll('.tooltip-inner')
50194                 .html(html);
50195
50196             if (options.buttonText && options.buttonCallback) {
50197                 var button = tooltip.selectAll('.button-section .button.action');
50198                 button
50199                     .on('click', function() {
50200                         event.preventDefault();
50201                         options.buttonCallback();
50202                     });
50203             }
50204
50205             var tip = copyBox(tooltip.node().getBoundingClientRect()),
50206                 w = window.innerWidth,
50207                 h = window.innerHeight,
50208                 tooltipWidth = 200,
50209                 tooltipArrow = 5,
50210                 side, pos;
50211
50212
50213             // hack: this will have bottom placement,
50214             // so need to reserve extra space for the tooltip illustration.
50215             if (options.tooltipClass === 'intro-mouse') {
50216                 tip.height += 80;
50217             }
50218
50219             // trim box dimensions to just the portion that fits in the window..
50220             if (tooltipBox.top + tooltipBox.height > h) {
50221                 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
50222             }
50223             if (tooltipBox.left + tooltipBox.width > w) {
50224                 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
50225             }
50226
50227             // determine tooltip placement..
50228
50229             if (tooltipBox.top + tooltipBox.height < 100) {
50230                 // tooltip below box..
50231                 side = 'bottom';
50232                 pos = [
50233                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
50234                     tooltipBox.top + tooltipBox.height
50235                 ];
50236
50237             } else if (tooltipBox.top > h - 140) {
50238                 // tooltip above box..
50239                 side = 'top';
50240                 pos = [
50241                     tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
50242                     tooltipBox.top - tip.height
50243                 ];
50244
50245             } else {
50246                 // tooltip to the side of the tooltipBox..
50247                 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
50248
50249                 if (textDirection === 'rtl') {
50250                     if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
50251                         side = 'right';
50252                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
50253
50254                     } else {
50255                         side = 'left';
50256                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
50257                     }
50258
50259                 } else {
50260                     if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
50261                         side = 'left';
50262                         pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
50263                     }
50264                     else {
50265                         side = 'right';
50266                         pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
50267                     }
50268                 }
50269             }
50270
50271             if (options.duration !== 0 || !tooltip.classed(side)) {
50272                 tooltip.call(uiToggle(true));
50273             }
50274
50275             tooltip
50276                 .style('top', pos[1] + 'px')
50277                 .style('left', pos[0] + 'px')
50278                 .attr('class', classes + ' ' + side);
50279
50280
50281             // shift tooltip-inner if it is very close to the top or bottom edge
50282             // (doesn't affect the placement of the tooltip-arrow)
50283             var shiftY = 0;
50284             if (side === 'left' || side === 'right') {
50285                 if (pos[1] < 60) {
50286                     shiftY = 60 - pos[1];
50287                 }
50288                 else if (pos[1] + tip.height > h - 100) {
50289                     shiftY = h - pos[1] - tip.height - 100;
50290                 }
50291             }
50292             tooltip.selectAll('.tooltip-inner')
50293                 .style('top', shiftY + 'px');
50294
50295         } else {
50296             tooltip
50297                 .classed('in', false)
50298                 .call(uiToggle(false));
50299         }
50300
50301         curtain.cut(box, options.duration);
50302
50303         return tooltip;
50304     };
50305
50306
50307     curtain.cut = function(datum, duration) {
50308         darkness.datum(datum)
50309             .interrupt();
50310
50311         var selection$$1;
50312         if (duration === 0) {
50313             selection$$1 = darkness;
50314         } else {
50315             selection$$1 = darkness
50316                 .transition()
50317                 .duration(duration || 600)
50318                 .ease(linear$1);
50319         }
50320
50321         selection$$1
50322             .attr('d', function(d) {
50323                 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
50324                     window.innerWidth + ',' + window.innerHeight + 'L' +
50325                     window.innerWidth + ',0 Z';
50326
50327                 if (!d) return string;
50328                 return string + 'M' +
50329                     d.left + ',' + d.top + 'L' +
50330                     d.left + ',' + (d.top + d.height) + 'L' +
50331                     (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
50332                     (d.left + d.width) + ',' + (d.top) + 'Z';
50333
50334             });
50335     };
50336
50337
50338     curtain.remove = function() {
50339         surface.remove();
50340         tooltip.remove();
50341         d3_select(window).on('resize.curtain', null);
50342     };
50343
50344
50345     // ClientRects are immutable, so copy them to an object,
50346     // in case we need to trim the height/width.
50347     function copyBox(src) {
50348         return {
50349             top: src.top,
50350             right: src.right,
50351             bottom: src.bottom,
50352             left: src.left,
50353             width: src.width,
50354             height: src.height
50355         };
50356     }
50357
50358
50359     return curtain;
50360 }
50361
50362 function uiIntroWelcome(context, reveal) {
50363     var dispatch$$1 = dispatch('done'),
50364         listener = clickListener();
50365
50366     var chapter = {
50367         title: 'intro.welcome.title'
50368     };
50369
50370
50371     function welcome() {
50372         context.map().centerZoom([-85.63591, 41.94285], 19);
50373         reveal('.intro-nav-wrap .chapter-welcome',
50374             t('intro.welcome.welcome'),
50375             { buttonText: t('intro.ok'), buttonCallback: practice }
50376         );
50377     }
50378
50379     function practice() {
50380         reveal('.intro-nav-wrap .chapter-welcome',
50381             t('intro.welcome.practice'),
50382             { buttonText: t('intro.ok'), buttonCallback: words }
50383         );
50384     }
50385
50386     function words() {
50387         reveal('.intro-nav-wrap .chapter-welcome',
50388             t('intro.welcome.words'),
50389             { buttonText: t('intro.ok'), buttonCallback: mouse }
50390         );
50391     }
50392
50393
50394     function mouse() {
50395         reveal('.intro-nav-wrap .chapter-welcome',
50396             t('intro.welcome.mouse'),
50397             { buttonText: t('intro.ok'), buttonCallback: leftClick }
50398         );
50399     }
50400
50401
50402     function leftClick() {
50403         var counter = 0,
50404             times = 5;
50405
50406         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
50407             t('intro.welcome.leftclick', { num: times }),
50408             { tooltipClass: 'intro-mouse' }
50409         );
50410
50411         tooltip.selectAll('.tooltip-inner')
50412             .insert('svg', 'span')
50413             .attr('class', 'tooltip-illustration')
50414             .append('use')
50415             .attr('xlink:href', '#walkthrough-mouse');
50416
50417         tooltip
50418             .append('div')
50419             .attr('class', 'counter');
50420
50421         tooltip.call(listener);
50422
50423         listener.on('click', function(which) {
50424             if (which === 'left') {
50425                 d3_select('.curtain-tooltip.intro-mouse .counter')
50426                     .text(String(++counter));
50427
50428                 if (counter === times) {
50429                     window.setTimeout(function() { continueTo(rightClick); }, 1000);
50430                 }
50431             }
50432         });
50433
50434         function continueTo(nextStep) {
50435             listener.on('click', null);
50436             tooltip.call(listener.off);
50437             tooltip.select('.counter').remove();
50438             nextStep();
50439         }
50440     }
50441
50442
50443     function rightClick() {
50444         var counter = 0,
50445             times = 5;
50446
50447         var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
50448             t('intro.welcome.rightclick', { num: times }),
50449             { tooltipClass: 'intro-mouse' }
50450         );
50451
50452         tooltip.selectAll('.tooltip-inner')
50453             .insert('svg', 'span')
50454             .attr('class', 'tooltip-illustration')
50455             .append('use')
50456             .attr('xlink:href', '#walkthrough-mouse');
50457
50458         tooltip
50459             .append('div')
50460             .attr('class', 'counter');
50461
50462         tooltip.call(listener);
50463
50464         listener.on('click', function(which) {
50465             if (which === 'right') {
50466                 d3_select('.curtain-tooltip.intro-mouse .counter')
50467                     .text(String(++counter));
50468
50469                 if (counter === times) {
50470                     window.setTimeout(function() { continueTo(chapters); }, 1000);
50471                 }
50472             }
50473         });
50474
50475         function continueTo(nextStep) {
50476             listener.on('click', null);
50477             tooltip.call(listener.off);
50478             tooltip.select('.counter').remove();
50479             nextStep();
50480         }
50481     }
50482
50483
50484     function chapters() {
50485         dispatch$$1.call('done');
50486         reveal('.intro-nav-wrap .chapter-navigation',
50487             t('intro.welcome.chapters', { next: t('intro.navigation.title') })
50488         );
50489     }
50490
50491
50492     chapter.enter = function() {
50493         welcome();
50494     };
50495
50496
50497     chapter.exit = function() {
50498         listener.off();
50499     };
50500
50501
50502     chapter.restart = function() {
50503         chapter.exit();
50504         chapter.enter();
50505     };
50506
50507
50508     return utilRebind(chapter, dispatch$$1, 'on');
50509 }
50510
50511
50512
50513 function clickListener() {
50514     var dispatch$$1 = dispatch('click'),
50515         minTime = 120,
50516         tooltip = d3_select(null),
50517         down = {};
50518
50519     // `down` keeps track of which buttons/keys are down.
50520     // Setting a property in `down` happens immediately.
50521     // Unsetting a property in `down` is delayed because
50522     //   on Windows a contextmenu event happens after keyup/mouseup
50523
50524     function keydown() {
50525         if (event.keyCode === 93)  {   // context menu
50526             event.preventDefault();
50527             event.stopPropagation();
50528             down.menu = event.timeStamp;
50529             tooltip.classed('rightclick', true);
50530         }
50531     }
50532
50533
50534     function keyup() {
50535         if (event.keyCode === 93)  {   // context menu
50536             event.preventDefault();
50537             event.stopPropagation();
50538             var endTime = event.timeStamp,
50539                 startTime = down.menu || endTime,
50540                 delay = (endTime - startTime < minTime) ? minTime : 0;
50541
50542             window.setTimeout(function() {
50543                 tooltip.classed('rightclick', false);
50544                 down.menu = undefined;  // delayed, for Windows
50545             }, delay);
50546
50547             dispatch$$1.call('click', this, 'right');
50548         }
50549     }
50550
50551
50552     function mousedown() {
50553         var button = event.button;
50554         if (button === 0 && !event.ctrlKey) {
50555             tooltip.classed('leftclick', true);
50556         } else if (button === 2) {
50557             tooltip.classed('rightclick', true);
50558         }
50559         down[button] = event.timeStamp;
50560     }
50561
50562
50563     function mouseup() {
50564         var button = event.button,
50565             endTime = event.timeStamp,
50566             startTime = down[button] || endTime,
50567             delay = (endTime - startTime < minTime) ? minTime : 0;
50568
50569         if (button === 0 && !event.ctrlKey) {
50570             window.setTimeout(function() {
50571                 tooltip.classed('leftclick', false);
50572                 down[button] = undefined;  // delayed, for Windows
50573             }, delay);
50574
50575             dispatch$$1.call('click', this, 'left');
50576
50577         } else if (button === 2) {
50578             window.setTimeout(function() {
50579                 tooltip.classed('rightclick', false);
50580                 down[button] = undefined;  // delayed, for Windows
50581             }, delay);
50582
50583             dispatch$$1.call('click', this, 'right');
50584
50585         } else {
50586             window.setTimeout(function() {
50587                 down[button] = undefined;  // delayed, for Windows
50588             }, delay);
50589         }
50590     }
50591
50592
50593     function contextmenu() {
50594         event.preventDefault();
50595         event.stopPropagation();
50596         if (!down[2] && !down.menu) {
50597             tooltip.classed('rightclick', true);
50598             window.setTimeout(function() {
50599                 tooltip.classed('rightclick', false);
50600             }, minTime);
50601             dispatch$$1.call('click', this, 'right');
50602         }
50603     }
50604
50605
50606     var behavior = function(selection$$1) {
50607         tooltip = selection$$1;
50608         down = {};
50609
50610         d3_select(window)
50611             .on('keydown.intro', keydown)
50612             .on('keyup.intro', keyup)
50613             .on('mousedown.intro', mousedown)
50614             .on('mouseup.intro', mouseup)
50615             .on('contextmenu.intro', contextmenu);
50616     };
50617
50618
50619     behavior.off = function() {
50620         d3_select(window)
50621             .on('keydown.intro', null)
50622             .on('keyup.intro', null)
50623             .on('mousedown.intro', null)
50624             .on('mouseup.intro', null)
50625             .on('contextmenu.intro', null);
50626
50627         tooltip
50628             .classed('leftclick', false)
50629             .classed('rightclick', false);
50630     };
50631
50632     return utilRebind(behavior, dispatch$$1, 'on');
50633 }
50634
50635 function uiIntroNavigation(context, reveal) {
50636     var dispatch$$1 = dispatch('done'),
50637         timeouts = [],
50638         hallId = 'n2061',
50639         townHall = [-85.63591, 41.94285],
50640         springStreetId = 'w397',
50641         springStreetEndId = 'n1834',
50642         springStreet = [-85.63582, 41.94255],
50643         onewayField = context.presets().field('oneway'),
50644         maxspeedField = context.presets().field('maxspeed');
50645
50646
50647     var chapter = {
50648         title: 'intro.navigation.title'
50649     };
50650
50651
50652     function timeout(f, t$$1) {
50653         timeouts.push(window.setTimeout(f, t$$1));
50654     }
50655
50656
50657     function eventCancel() {
50658         event.stopPropagation();
50659         event.preventDefault();
50660     }
50661
50662
50663     function isTownHallSelected() {
50664         var ids = context.selectedIDs();
50665         return ids.length === 1 && ids[0] === hallId;
50666     }
50667
50668
50669     function dragMap() {
50670         context.enter(modeBrowse(context));
50671         context.history().reset('initial');
50672
50673         var msec = transitionTime(townHall, context.map().center());
50674         if (msec) { reveal(null, null, { duration: 0 }); }
50675         context.map().zoom(19).centerEase(townHall, msec);
50676
50677         timeout(function() {
50678             var centerStart = context.map().center();
50679
50680             reveal('#surface', t('intro.navigation.drag'));
50681             context.map().on('drawn.intro', function() {
50682                 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
50683             });
50684
50685             context.map().on('move.intro', function() {
50686                 var centerNow = context.map().center();
50687                 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
50688                     context.map().on('move.intro', null);
50689                     timeout(function() { continueTo(zoomMap); }, 3000);
50690                 }
50691             });
50692
50693         }, msec + 100);
50694
50695         function continueTo(nextStep) {
50696             context.map().on('move.intro drawn.intro', null);
50697             nextStep();
50698         }
50699     }
50700
50701
50702     function zoomMap() {
50703         var zoomStart = context.map().zoom();
50704
50705         reveal('#surface',
50706             t('intro.navigation.zoom', {
50707                 plus: icon('#icon-plus', 'pre-text'),
50708                 minus: icon('#icon-minus', 'pre-text')
50709             })
50710         );
50711
50712         context.map().on('drawn.intro', function() {
50713             reveal('#surface',
50714                 t('intro.navigation.zoom', {
50715                     plus: icon('#icon-plus', 'pre-text'),
50716                     minus: icon('#icon-minus', 'pre-text')
50717                 }), { duration: 0 }
50718             );
50719         });
50720
50721         context.map().on('move.intro', function() {
50722             if (context.map().zoom() !== zoomStart) {
50723                 context.map().on('move.intro', null);
50724                 timeout(function() { continueTo(features); }, 3000);
50725             }
50726         });
50727
50728         function continueTo(nextStep) {
50729             context.map().on('move.intro drawn.intro', null);
50730             nextStep();
50731         }
50732     }
50733
50734
50735     function features() {
50736         var onClick = function() { continueTo(pointsLinesAreas); };
50737
50738         reveal('#surface', t('intro.navigation.features'),
50739             { buttonText: t('intro.ok'), buttonCallback: onClick }
50740         );
50741
50742         context.map().on('drawn.intro', function() {
50743             reveal('#surface', t('intro.navigation.features'),
50744                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50745             );
50746         });
50747
50748         function continueTo(nextStep) {
50749             context.map().on('drawn.intro', null);
50750             nextStep();
50751         }
50752     }
50753
50754     function pointsLinesAreas() {
50755         var onClick = function() { continueTo(nodesWays); };
50756
50757         reveal('#surface', t('intro.navigation.points_lines_areas'),
50758             { buttonText: t('intro.ok'), buttonCallback: onClick }
50759         );
50760
50761         context.map().on('drawn.intro', function() {
50762             reveal('#surface', t('intro.navigation.points_lines_areas'),
50763                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50764             );
50765         });
50766
50767         function continueTo(nextStep) {
50768             context.map().on('drawn.intro', null);
50769             nextStep();
50770         }
50771     }
50772
50773     function nodesWays() {
50774         var onClick = function() { continueTo(clickTownHall); };
50775
50776         reveal('#surface', t('intro.navigation.nodes_ways'),
50777             { buttonText: t('intro.ok'), buttonCallback: onClick }
50778         );
50779
50780         context.map().on('drawn.intro', function() {
50781             reveal('#surface', t('intro.navigation.nodes_ways'),
50782                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50783             );
50784         });
50785
50786         function continueTo(nextStep) {
50787             context.map().on('drawn.intro', null);
50788             nextStep();
50789         }
50790     }
50791
50792     function clickTownHall() {
50793         context.enter(modeBrowse(context));
50794         context.history().reset('initial');
50795
50796         reveal(null, null, { duration: 0 });
50797         context.map().zoomEase(19, 500);
50798
50799         timeout(function() {
50800             var entity = context.hasEntity(hallId);
50801             if (!entity) return;
50802             context.map().centerEase(entity.loc, 500);
50803
50804             timeout(function() {
50805                 var entity = context.hasEntity(hallId);
50806                 if (!entity) return;
50807                 var box = pointBox(entity.loc, context);
50808                 reveal(box, t('intro.navigation.click_townhall'));
50809
50810                 context.map().on('move.intro drawn.intro', function() {
50811                     var entity = context.hasEntity(hallId);
50812                     if (!entity) return;
50813                     var box = pointBox(entity.loc, context);
50814                     reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
50815                 });
50816
50817                 context.on('enter.intro', function() {
50818                     if (isTownHallSelected()) continueTo(selectedTownHall);
50819                 });
50820
50821             }, 550);  // after centerEase
50822
50823         }, 550); // after zoomEase
50824
50825         context.history().on('change.intro', function() {
50826             if (!context.hasEntity(hallId)) {
50827                 continueTo(clickTownHall);
50828             }
50829         });
50830
50831         function continueTo(nextStep) {
50832             context.on('enter.intro', null);
50833             context.map().on('move.intro drawn.intro', null);
50834             context.history().on('change.intro', null);
50835             nextStep();
50836         }
50837     }
50838
50839
50840     function selectedTownHall() {
50841         if (!isTownHallSelected()) return clickTownHall();
50842
50843         var entity = context.hasEntity(hallId);
50844         if (!entity) return clickTownHall();
50845
50846         var box = pointBox(entity.loc, context);
50847         var onClick = function() { continueTo(editorTownHall); };
50848
50849         reveal(box, t('intro.navigation.selected_townhall'),
50850             { buttonText: t('intro.ok'), buttonCallback: onClick }
50851         );
50852
50853         context.map().on('move.intro drawn.intro', function() {
50854             var entity = context.hasEntity(hallId);
50855             if (!entity) return;
50856             var box = pointBox(entity.loc, context);
50857             reveal(box, t('intro.navigation.selected_townhall'),
50858                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
50859             );
50860         });
50861
50862         context.history().on('change.intro', function() {
50863             if (!context.hasEntity(hallId)) {
50864                 continueTo(clickTownHall);
50865             }
50866         });
50867
50868         function continueTo(nextStep) {
50869             context.map().on('move.intro drawn.intro', null);
50870             context.history().on('change.intro', null);
50871             nextStep();
50872         }
50873     }
50874
50875
50876     function editorTownHall() {
50877         if (!isTownHallSelected()) return clickTownHall();
50878
50879         // disallow scrolling
50880         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50881
50882         var onClick = function() { continueTo(presetTownHall); };
50883
50884         reveal('.entity-editor-pane',
50885             t('intro.navigation.editor_townhall'),
50886             { buttonText: t('intro.ok'), buttonCallback: onClick }
50887         );
50888
50889         context.on('exit.intro', function() {
50890             continueTo(clickTownHall);
50891         });
50892
50893         context.history().on('change.intro', function() {
50894             if (!context.hasEntity(hallId)) {
50895                 continueTo(clickTownHall);
50896             }
50897         });
50898
50899         function continueTo(nextStep) {
50900             context.on('exit.intro', null);
50901             context.history().on('change.intro', null);
50902             d3_select('.inspector-wrap').on('wheel.intro', null);
50903             nextStep();
50904         }
50905     }
50906
50907
50908     function presetTownHall() {
50909         if (!isTownHallSelected()) return clickTownHall();
50910
50911         // reset pane, in case user happened to change it..
50912         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50913         // disallow scrolling
50914         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50915
50916         // preset match, in case the user happened to change it.
50917         var entity = context.entity(context.selectedIDs()[0]);
50918         var preset = context.presets().match(entity, context.graph());
50919
50920         var onClick = function() { continueTo(fieldsTownHall); };
50921
50922         context.on('exit.intro', function() {
50923             continueTo(clickTownHall);
50924         });
50925
50926         context.history().on('change.intro', function() {
50927             if (!context.hasEntity(hallId)) {
50928                 continueTo(clickTownHall);
50929             }
50930         });
50931
50932         reveal('.inspector-body .preset-list-item.inspector-inner',
50933             t('intro.navigation.preset_townhall', { preset: preset.name() }),
50934             { buttonText: t('intro.ok'), buttonCallback: onClick }
50935         );
50936
50937         function continueTo(nextStep) {
50938             context.on('exit.intro', null);
50939             context.history().on('change.intro', null);
50940             d3_select('.inspector-wrap').on('wheel.intro', null);
50941             nextStep();
50942         }
50943     }
50944
50945
50946     function fieldsTownHall() {
50947         if (!isTownHallSelected()) return clickTownHall();
50948
50949         // reset pane, in case user happened to change it..
50950         d3_select('.inspector-wrap .panewrap').style('right', '0%');
50951         // disallow scrolling
50952         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
50953
50954         var onClick = function() { continueTo(closeTownHall); };
50955
50956         reveal('.inspector-body .preset-editor',
50957             t('intro.navigation.fields_townhall'),
50958             { buttonText: t('intro.ok'), buttonCallback: onClick }
50959         );
50960
50961         context.on('exit.intro', function() {
50962             continueTo(clickTownHall);
50963         });
50964
50965         context.history().on('change.intro', function() {
50966             if (!context.hasEntity(hallId)) {
50967                 continueTo(clickTownHall);
50968             }
50969         });
50970
50971         function continueTo(nextStep) {
50972             context.on('exit.intro', null);
50973             context.history().on('change.intro', null);
50974             d3_select('.inspector-wrap').on('wheel.intro', null);
50975             nextStep();
50976         }
50977     }
50978
50979
50980     function closeTownHall() {
50981         if (!isTownHallSelected()) return clickTownHall();
50982
50983         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50984         var href = d3_select(selector$$1).attr('href') || '#icon-close';
50985
50986         reveal('.entity-editor-pane',
50987             t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
50988         );
50989
50990         context.on('exit.intro', function() {
50991             continueTo(searchStreet);
50992         });
50993
50994         context.history().on('change.intro', function() {
50995             // update the close icon in the tooltip if the user edits something.
50996             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
50997             var href = d3_select(selector$$1).attr('href') || '#icon-close';
50998
50999             reveal('.entity-editor-pane',
51000                 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
51001                 { duration: 0 }
51002             );
51003         });
51004
51005         function continueTo(nextStep) {
51006             context.on('exit.intro', null);
51007             context.history().on('change.intro', null);
51008             nextStep();
51009         }
51010     }
51011
51012
51013     function searchStreet() {
51014         context.enter(modeBrowse(context));
51015         context.history().reset('initial');  // ensure spring street exists
51016
51017         var msec = transitionTime(springStreet, context.map().center());
51018         if (msec) { reveal(null, null, { duration: 0 }); }
51019         context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
51020
51021         timeout(function() {
51022             reveal('.search-header input',
51023                 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
51024             );
51025
51026             d3_select('.search-header input')
51027                 .on('keyup.intro', checkSearchResult);
51028         }, msec + 100);
51029     }
51030
51031
51032     function checkSearchResult() {
51033         var first = d3_select('.feature-list-item:nth-child(0n+2)'),  // skip "No Results" item
51034             firstName = first.select('.entity-name'),
51035             name = t('intro.graph.name.spring-street');
51036
51037         if (!firstName.empty() && firstName.text() === name) {
51038             reveal(first.node(),
51039                 t('intro.navigation.choose_street', { name: name }),
51040                 { duration: 300 }
51041             );
51042
51043             context.on('exit.intro', function() {
51044                 continueTo(selectedStreet);
51045             });
51046
51047             d3_select('.search-header input')
51048                 .on('keydown.intro', eventCancel, true)
51049                 .on('keyup.intro', null);
51050         }
51051
51052         function continueTo(nextStep) {
51053             context.on('exit.intro', null);
51054             d3_select('.search-header input')
51055                 .on('keydown.intro', null)
51056                 .on('keyup.intro', null);
51057             nextStep();
51058         }
51059     }
51060
51061
51062     function selectedStreet() {
51063         if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
51064             return searchStreet();
51065         }
51066
51067         var onClick = function() { continueTo(editorStreet); };
51068         var entity = context.entity(springStreetEndId);
51069         var box = pointBox(entity.loc, context);
51070         box.height = 500;
51071
51072         reveal(box,
51073             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
51074             { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
51075         );
51076
51077         timeout(function() {
51078             context.map().on('move.intro drawn.intro', function() {
51079                 var entity = context.hasEntity(springStreetEndId);
51080                 if (!entity) return;
51081                 var box = pointBox(entity.loc, context);
51082                 box.height = 500;
51083                 reveal(box,
51084                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
51085                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
51086                 );
51087             });
51088         }, 600);  // after reveal.
51089
51090         context.on('enter.intro', function(mode) {
51091             if (!context.hasEntity(springStreetId)) {
51092                 return continueTo(searchStreet);
51093             }
51094             var ids = context.selectedIDs();
51095             if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
51096                 // keep Spring Street selected..
51097                 context.enter(modeSelect(context, [springStreetId]));
51098             }
51099         });
51100
51101         context.history().on('change.intro', function() {
51102             if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
51103                 timeout(function() {
51104                     continueTo(searchStreet);
51105                 }, 300);  // after any transition (e.g. if user deleted intersection)
51106             }
51107         });
51108
51109         function continueTo(nextStep) {
51110             context.map().on('move.intro drawn.intro', null);
51111             context.on('enter.intro', null);
51112             context.history().on('change.intro', null);
51113             nextStep();
51114         }
51115     }
51116
51117
51118     function editorStreet() {
51119         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51120         var href = d3_select(selector$$1).attr('href') || '#icon-close';
51121
51122         reveal('.entity-editor-pane',
51123             t('intro.navigation.editor_street', {
51124                 button: icon(href, 'pre-text'),
51125                 field1: onewayField.label(),
51126                 field2: maxspeedField.label()
51127             })
51128         );
51129
51130         context.on('exit.intro', function() {
51131             continueTo(play);
51132         });
51133
51134         context.history().on('change.intro', function() {
51135             // update the close icon in the tooltip if the user edits something.
51136             var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51137             var href = d3_select(selector$$1).attr('href') || '#icon-close';
51138
51139             reveal('.entity-editor-pane',
51140                 t('intro.navigation.editor_street', {
51141                     button: icon(href, 'pre-text'),
51142                     field1: onewayField.label().toLowerCase(),
51143                     field2: maxspeedField.label().toLowerCase()
51144                 }), { duration: 0 }
51145             );
51146         });
51147
51148         function continueTo(nextStep) {
51149             context.on('exit.intro', null);
51150             context.history().on('change.intro', null);
51151             nextStep();
51152         }
51153     }
51154
51155
51156     function play() {
51157         dispatch$$1.call('done');
51158         reveal('#id-container',
51159             t('intro.navigation.play', { next: t('intro.points.title') }), {
51160                 tooltipBox: '.intro-nav-wrap .chapter-point',
51161                 buttonText: t('intro.ok'),
51162                 buttonCallback: function() { reveal('#id-container'); }
51163             }
51164         );
51165     }
51166
51167
51168     chapter.enter = function() {
51169         dragMap();
51170     };
51171
51172
51173     chapter.exit = function() {
51174         timeouts.forEach(window.clearTimeout);
51175         context.on('enter.intro exit.intro', null);
51176         context.map().on('move.intro drawn.intro', null);
51177         context.history().on('change.intro', null);
51178         d3_select('.inspector-wrap').on('wheel.intro', null);
51179         d3_select('.search-header input').on('keydown.intro keyup.intro', null);
51180     };
51181
51182
51183     chapter.restart = function() {
51184         chapter.exit();
51185         chapter.enter();
51186     };
51187
51188
51189     return utilRebind(chapter, dispatch$$1, 'on');
51190 }
51191
51192 function uiIntroPoint(context, reveal) {
51193     var dispatch$$1 = dispatch('done'),
51194         timeouts = [],
51195         intersection = [-85.63279, 41.94394],
51196         building = [-85.632422, 41.944045],
51197         cafePreset = context.presets().item('amenity/cafe'),
51198         pointId = null;
51199
51200
51201     var chapter = {
51202         title: 'intro.points.title'
51203     };
51204
51205
51206     function timeout(f, t$$1) {
51207         timeouts.push(window.setTimeout(f, t$$1));
51208     }
51209
51210
51211     function revealEditMenu(loc, text, options) {
51212         var rect = context.surfaceRect();
51213         var point = context.curtainProjection(loc);
51214         var pad = 40;
51215         var width = 250 + (2 * pad);
51216         var height = 250;
51217         var startX = rect.left + point[0];
51218         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
51219         var box = {
51220             left: left,
51221             top: point[1] + rect.top - 60,
51222             width: width,
51223             height: height
51224         };
51225         reveal(box, text, options);
51226     }
51227
51228
51229     function eventCancel() {
51230         event.stopPropagation();
51231         event.preventDefault();
51232     }
51233
51234
51235     function addPoint() {
51236         context.enter(modeBrowse(context));
51237         context.history().reset('initial');
51238
51239         var msec = transitionTime(intersection, context.map().center());
51240         if (msec) { reveal(null, null, { duration: 0 }); }
51241         context.map().zoom(19).centerEase(intersection, msec);
51242
51243         timeout(function() {
51244             var tooltip = reveal('button.add-point',
51245                 t('intro.points.add_point', { button: icon('#icon-point', 'pre-text') }));
51246
51247             pointId = null;
51248
51249             tooltip.selectAll('.tooltip-inner')
51250                 .insert('svg', 'span')
51251                 .attr('class', 'tooltip-illustration')
51252                 .append('use')
51253                 .attr('xlink:href', '#poi-images');
51254
51255             context.on('enter.intro', function(mode) {
51256                 if (mode.id !== 'add-point') return;
51257                 continueTo(placePoint);
51258             });
51259         }, msec + 100);
51260
51261         function continueTo(nextStep) {
51262             context.on('enter.intro', null);
51263             nextStep();
51264         }
51265     }
51266
51267
51268     function placePoint() {
51269         if (context.mode().id !== 'add-point') {
51270             return chapter.restart();
51271         }
51272
51273         var pointBox$$1 = pad$1(building, 150, context);
51274         reveal(pointBox$$1, t('intro.points.place_point'));
51275
51276         context.map().on('move.intro drawn.intro', function() {
51277             pointBox$$1 = pad$1(building, 150, context);
51278             reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
51279         });
51280
51281         context.on('enter.intro', function(mode) {
51282             if (mode.id !== 'select') return chapter.restart();
51283             pointId = context.mode().selectedIDs()[0];
51284             continueTo(searchPreset);
51285         });
51286
51287         function continueTo(nextStep) {
51288             context.map().on('move.intro drawn.intro', null);
51289             context.on('enter.intro', null);
51290             nextStep();
51291         }
51292     }
51293
51294
51295     function searchPreset() {
51296         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51297             return addPoint();
51298         }
51299
51300         // disallow scrolling
51301         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51302
51303         d3_select('.preset-search-input')
51304             .on('keydown.intro', null)
51305             .on('keyup.intro', checkPresetSearch);
51306
51307         reveal('.preset-search-input',
51308             t('intro.points.search_cafe', { preset: cafePreset.name() })
51309         );
51310
51311         context.on('enter.intro', function(mode) {
51312             if (!pointId || !context.hasEntity(pointId)) {
51313                 return continueTo(addPoint);
51314             }
51315
51316             var ids = context.selectedIDs();
51317             if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
51318                 // keep the user's point selected..
51319                 context.enter(modeSelect(context, [pointId]));
51320
51321                 // disallow scrolling
51322                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51323
51324                 d3_select('.preset-search-input')
51325                     .on('keydown.intro', null)
51326                     .on('keyup.intro', checkPresetSearch);
51327
51328                 reveal('.preset-search-input',
51329                     t('intro.points.search_cafe', { preset: cafePreset.name() })
51330                 );
51331
51332                 context.history().on('change.intro', null);
51333             }
51334         });
51335
51336
51337         function checkPresetSearch() {
51338             var first = d3_select('.preset-list-item:first-child');
51339
51340             if (first.classed('preset-amenity-cafe')) {
51341                 d3_select('.preset-search-input')
51342                     .on('keydown.intro', eventCancel, true)
51343                     .on('keyup.intro', null);
51344
51345                 reveal(first.select('.preset-list-button').node(),
51346                     t('intro.points.choose_cafe', { preset: cafePreset.name() }),
51347                     { duration: 300 }
51348                 );
51349
51350                 context.history().on('change.intro', function() {
51351                     continueTo(aboutFeatureEditor);
51352                 });
51353             }
51354         }
51355
51356         function continueTo(nextStep) {
51357             context.on('enter.intro', null);
51358             context.history().on('change.intro', null);
51359             d3_select('.inspector-wrap').on('wheel.intro', null);
51360             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51361             nextStep();
51362         }
51363     }
51364
51365
51366     function aboutFeatureEditor() {
51367         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51368             return addPoint();
51369         }
51370
51371         timeout(function() {
51372             reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
51373                 tooltipClass: 'intro-points-describe',
51374                 buttonText: t('intro.ok'),
51375                 buttonCallback: function() { continueTo(addName); }
51376             });
51377         }, 400);
51378
51379         context.on('exit.intro', function() {
51380             // if user leaves select mode here, just continue with the tutorial.
51381             continueTo(reselectPoint);
51382         });
51383
51384         function continueTo(nextStep) {
51385             context.on('exit.intro', null);
51386             nextStep();
51387         }
51388     }
51389
51390
51391     function addName() {
51392         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51393             return addPoint();
51394         }
51395
51396         // reset pane, in case user happened to change it..
51397         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51398
51399         timeout(function() {
51400             // It's possible for the user to add a name in a previous step..
51401             // If so, don't tell them to add the name in this step.
51402             // Give them an OK button instead.
51403             var entity = context.entity(pointId);
51404             if (entity.tags.name) {
51405                 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
51406                     tooltipClass: 'intro-points-describe',
51407                     buttonText: t('intro.ok'),
51408                     buttonCallback: function() { continueTo(addCloseEditor); }
51409                 });
51410                 tooltip.select('.instruction').style('display', 'none');
51411
51412             } else {
51413                 reveal('.entity-editor-pane', t('intro.points.add_name'),
51414                     { tooltipClass: 'intro-points-describe' }
51415                 );
51416             }
51417         }, 400);
51418
51419         context.history().on('change.intro', function() {
51420             continueTo(addCloseEditor);
51421         });
51422
51423         context.on('exit.intro', function() {
51424             // if user leaves select mode here, just continue with the tutorial.
51425             continueTo(reselectPoint);
51426         });
51427
51428         function continueTo(nextStep) {
51429             context.on('exit.intro', null);
51430             context.history().on('change.intro', null);
51431             nextStep();
51432         }
51433     }
51434
51435
51436     function addCloseEditor() {
51437         // reset pane, in case user happened to change it..
51438         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51439
51440         var selector$$1 = '.entity-editor-pane button.preset-close svg use';
51441         var href = d3_select(selector$$1).attr('href') || '#icon-close';
51442
51443         context.on('exit.intro', function() {
51444             continueTo(reselectPoint);
51445         });
51446
51447         reveal('.entity-editor-pane',
51448             t('intro.points.add_close', { button: icon(href, 'pre-text') })
51449         );
51450
51451         function continueTo(nextStep) {
51452             context.on('exit.intro', null);
51453             nextStep();
51454         }
51455     }
51456
51457
51458     function reselectPoint() {
51459         if (!pointId) return chapter.restart();
51460         var entity = context.hasEntity(pointId);
51461         if (!entity) return chapter.restart();
51462
51463         // make sure it's still a cafe, in case user somehow changed it..
51464         var oldPreset = context.presets().match(entity, context.graph());
51465         context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
51466
51467         context.enter(modeBrowse(context));
51468
51469         var msec = transitionTime(entity.loc, context.map().center());
51470         if (msec) { reveal(null, null, { duration: 0 }); }
51471         context.map().centerEase(entity.loc, msec);
51472
51473         timeout(function() {
51474             var box = pointBox(entity.loc, context);
51475             reveal(box, t('intro.points.reselect'), { duration: 600 });
51476
51477             timeout(function() {
51478                 context.map().on('move.intro drawn.intro', function() {
51479                     var entity = context.hasEntity(pointId);
51480                     if (!entity) return chapter.restart();
51481                     var box = pointBox(entity.loc, context);
51482                     reveal(box, t('intro.points.reselect'), { duration: 0 });
51483                 });
51484             }, 600); // after reveal..
51485
51486             context.on('enter.intro', function(mode) {
51487                 if (mode.id !== 'select') return;
51488                 continueTo(updatePoint);
51489             });
51490
51491         }, msec + 100);
51492
51493         function continueTo(nextStep) {
51494             context.map().on('move.intro drawn.intro', null);
51495             context.on('enter.intro', null);
51496             nextStep();
51497         }
51498     }
51499
51500
51501     function updatePoint() {
51502         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51503             return continueTo(reselectPoint);
51504         }
51505
51506         // reset pane, in case user happened to untag the point..
51507         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51508
51509         context.on('exit.intro', function() {
51510             continueTo(reselectPoint);
51511         });
51512
51513         context.history().on('change.intro', function() {
51514             continueTo(updateCloseEditor);
51515         });
51516
51517         timeout(function() {
51518             reveal('.entity-editor-pane', t('intro.points.update'),
51519                 { tooltipClass: 'intro-points-describe' }
51520             );
51521         }, 400);
51522
51523         function continueTo(nextStep) {
51524             context.on('exit.intro', null);
51525             context.history().on('change.intro', null);
51526             nextStep();
51527         }
51528     }
51529
51530
51531     function updateCloseEditor() {
51532         if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
51533             return continueTo(reselectPoint);
51534         }
51535
51536         // reset pane, in case user happened to change it..
51537         d3_select('.inspector-wrap .panewrap').style('right', '0%');
51538
51539         context.on('exit.intro', function() {
51540             continueTo(rightClickPoint);
51541         });
51542
51543         timeout(function() {
51544             reveal('.entity-editor-pane',
51545                 t('intro.points.update_close', { button: icon('#icon-apply', 'pre-text') })
51546             );
51547         }, 500);
51548
51549         function continueTo(nextStep) {
51550             context.on('exit.intro', null);
51551             nextStep();
51552         }
51553     }
51554
51555
51556     function rightClickPoint() {
51557         if (!pointId) return chapter.restart();
51558         var entity = context.hasEntity(pointId);
51559         if (!entity) return chapter.restart();
51560
51561         context.enter(modeBrowse(context));
51562
51563         var box = pointBox(entity.loc, context);
51564         reveal(box, t('intro.points.rightclick'), { duration: 600 });
51565
51566         timeout(function() {
51567             context.map().on('move.intro drawn.intro', function() {
51568                 var entity = context.hasEntity(pointId);
51569                 if (!entity) return chapter.restart();
51570                 var box = pointBox(entity.loc, context);
51571                 reveal(box, t('intro.points.rightclick'), { duration: 0 });
51572             });
51573         }, 600); // after reveal
51574
51575         context.on('enter.intro', function(mode) {
51576             if (mode.id !== 'select') return;
51577             var ids = context.selectedIDs();
51578             if (ids.length !== 1 || ids[0] !== pointId) return;
51579
51580             timeout(function() {
51581                 var node = selectMenuItem('delete').node();
51582                 if (!node) return;
51583                 continueTo(enterDelete);
51584             }, 300);  // after menu visible
51585         });
51586
51587         function continueTo(nextStep) {
51588             context.on('enter.intro', null);
51589             context.map().on('move.intro drawn.intro', null);
51590             nextStep();
51591         }
51592     }
51593
51594
51595     function enterDelete() {
51596         if (!pointId) return chapter.restart();
51597         var entity = context.hasEntity(pointId);
51598         if (!entity) return chapter.restart();
51599
51600         var node = selectMenuItem('delete').node();
51601         if (!node) { return continueTo(rightClickPoint); }
51602
51603         revealEditMenu(entity.loc,
51604             t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') })
51605         );
51606
51607         timeout(function() {
51608             context.map().on('move.intro drawn.intro', function() {
51609                 revealEditMenu(entity.loc,
51610                     t('intro.points.delete', { button: icon('#operation-delete', 'pre-text') }),
51611                     { duration: 0}
51612                 );
51613             });
51614         }, 300); // after menu visible
51615
51616         context.on('exit.intro', function() {
51617             if (!pointId) return chapter.restart();
51618             var entity = context.hasEntity(pointId);
51619             if (entity) return continueTo(rightClickPoint);  // point still exists
51620         });
51621
51622         context.history().on('change.intro', function(changed) {
51623             if (changed.deleted().length) {
51624                 continueTo(undo);
51625             }
51626         });
51627
51628         function continueTo(nextStep) {
51629             context.map().on('move.intro drawn.intro', null);
51630             context.history().on('change.intro', null);
51631             context.on('exit.intro', null);
51632             nextStep();
51633         }
51634     }
51635
51636
51637     function undo() {
51638         context.history().on('change.intro', function() {
51639             continueTo(play);
51640         });
51641
51642         var iconName = '#icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
51643         reveal('#bar button.undo-button',
51644             t('intro.points.undo', { button: icon(iconName, 'pre-text') })
51645         );
51646
51647         function continueTo(nextStep) {
51648             context.history().on('change.intro', null);
51649             nextStep();
51650         }
51651     }
51652
51653
51654     function play() {
51655         dispatch$$1.call('done');
51656         reveal('#id-container',
51657             t('intro.points.play', { next: t('intro.areas.title') }), {
51658                 tooltipBox: '.intro-nav-wrap .chapter-area',
51659                 buttonText: t('intro.ok'),
51660                 buttonCallback: function() { reveal('#id-container'); }
51661             }
51662         );
51663     }
51664
51665
51666     chapter.enter = function() {
51667         addPoint();
51668     };
51669
51670
51671     chapter.exit = function() {
51672         timeouts.forEach(window.clearTimeout);
51673         context.on('enter.intro exit.intro', null);
51674         context.map().on('move.intro drawn.intro', null);
51675         context.history().on('change.intro', null);
51676         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51677         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51678     };
51679
51680
51681     chapter.restart = function() {
51682         chapter.exit();
51683         chapter.enter();
51684     };
51685
51686
51687     return utilRebind(chapter, dispatch$$1, 'on');
51688 }
51689
51690 function uiIntroArea(context, reveal) {
51691     var dispatch$$1 = dispatch('done'),
51692         playground = [-85.63552, 41.94159],
51693         playgroundPreset = context.presets().item('leisure/playground'),
51694         descriptionField = context.presets().field('description'),
51695         timeouts = [],
51696         areaId;
51697
51698
51699     var chapter = {
51700         title: 'intro.areas.title'
51701     };
51702
51703
51704     function timeout(f, t$$1) {
51705         timeouts.push(window.setTimeout(f, t$$1));
51706     }
51707
51708
51709     function eventCancel() {
51710         event.stopPropagation();
51711         event.preventDefault();
51712     }
51713
51714
51715     function revealPlayground(center, text, options) {
51716         var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
51717         var box = pad$1(center, padding, context);
51718         reveal(box, text, options);
51719     }
51720
51721
51722     function addArea() {
51723         context.enter(modeBrowse(context));
51724         context.history().reset('initial');
51725         areaId = null;
51726
51727         var msec = transitionTime(playground, context.map().center());
51728         if (msec) { reveal(null, null, { duration: 0 }); }
51729         context.map().zoom(19).centerEase(playground, msec);
51730
51731         timeout(function() {
51732             var tooltip = reveal('button.add-area',
51733                 t('intro.areas.add_playground', { button: icon('#icon-area', 'pre-text') }));
51734
51735             tooltip.selectAll('.tooltip-inner')
51736                 .insert('svg', 'span')
51737                 .attr('class', 'tooltip-illustration')
51738                 .append('use')
51739                 .attr('xlink:href', '#landuse-images');
51740
51741             context.on('enter.intro', function(mode) {
51742                 if (mode.id !== 'add-area') return;
51743                 continueTo(startPlayground);
51744             });
51745         }, msec + 100);
51746
51747         function continueTo(nextStep) {
51748             context.on('enter.intro', null);
51749             nextStep();
51750         }
51751     }
51752
51753
51754     function startPlayground() {
51755         if (context.mode().id !== 'add-area') {
51756             return chapter.restart();
51757         }
51758
51759         areaId = null;
51760         context.map().zoomEase(19.5, 500);
51761
51762         timeout(function() {
51763             revealPlayground(playground,
51764                 t('intro.areas.start_playground'), { duration: 250 }
51765             );
51766
51767             timeout(function() {
51768                 context.map().on('move.intro drawn.intro', function() {
51769                     revealPlayground(playground,
51770                         t('intro.areas.start_playground'), { duration: 0 }
51771                     );
51772                 });
51773                 context.on('enter.intro', function(mode) {
51774                     if (mode.id !== 'draw-area') return chapter.restart();
51775                     continueTo(continuePlayground);
51776                 });
51777             }, 250);  // after reveal
51778
51779         }, 550);  // after easing
51780
51781         function continueTo(nextStep) {
51782             context.map().on('move.intro drawn.intro', null);
51783             context.on('enter.intro', null);
51784             nextStep();
51785         }
51786     }
51787
51788
51789     function continuePlayground() {
51790         if (context.mode().id !== 'draw-area') {
51791             return chapter.restart();
51792         }
51793
51794         areaId = null;
51795         revealPlayground(playground,
51796             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51797             { duration: 250 }
51798         );
51799
51800         timeout(function() {
51801             context.map().on('move.intro drawn.intro', function() {
51802                 revealPlayground(playground,
51803                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
51804                     { duration: 0 }
51805                 );
51806             });
51807         }, 250);  // after reveal
51808
51809         context.on('enter.intro', function(mode) {
51810             if (mode.id === 'draw-area') {
51811                 var entity = context.hasEntity(context.selectedIDs()[0]);
51812                 if (entity && entity.nodes.length >= 6) {
51813                     return continueTo(finishPlayground);
51814                 } else {
51815                     return;
51816                 }
51817             } else if (mode.id === 'select') {
51818                 areaId = context.selectedIDs()[0];
51819                 return continueTo(searchPresets);
51820             } else {
51821                 return chapter.restart();
51822             }
51823         });
51824
51825         function continueTo(nextStep) {
51826             context.map().on('move.intro drawn.intro', null);
51827             context.on('enter.intro', null);
51828             nextStep();
51829         }
51830     }
51831
51832
51833     function finishPlayground() {
51834         if (context.mode().id !== 'draw-area') {
51835             return chapter.restart();
51836         }
51837
51838         areaId = null;
51839         revealPlayground(playground,
51840             t('intro.areas.finish_playground'), { duration: 250 }
51841         );
51842
51843         timeout(function() {
51844             context.map().on('move.intro drawn.intro', function() {
51845                 revealPlayground(playground,
51846                     t('intro.areas.finish_playground'), { duration: 0 }
51847                 );
51848             });
51849         }, 250);  // after reveal
51850
51851         context.on('enter.intro', function(mode) {
51852             if (mode.id === 'draw-area') {
51853                 return;
51854             } else if (mode.id === 'select') {
51855                 areaId = context.selectedIDs()[0];
51856                 return continueTo(searchPresets);
51857             } else {
51858                 return chapter.restart();
51859             }
51860         });
51861
51862         function continueTo(nextStep) {
51863             context.map().on('move.intro drawn.intro', null);
51864             context.on('enter.intro', null);
51865             nextStep();
51866         }
51867     }
51868
51869
51870     function searchPresets() {
51871         if (!areaId || !context.hasEntity(areaId)) {
51872             return addArea();
51873         }
51874         var ids = context.selectedIDs();
51875         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51876             context.enter(modeSelect(context, [areaId]));
51877         }
51878
51879         // disallow scrolling
51880         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51881
51882         timeout(function() {
51883             // reset pane, in case user somehow happened to change it..
51884             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51885
51886             d3_select('.preset-search-input')
51887                 .on('keydown.intro', null)
51888                 .on('keyup.intro', checkPresetSearch);
51889
51890             reveal('.preset-search-input',
51891                 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51892             );
51893         }, 400);  // after preset list pane visible..
51894
51895         context.on('enter.intro', function(mode) {
51896             if (!areaId || !context.hasEntity(areaId)) {
51897                 return continueTo(addArea);
51898             }
51899
51900             var ids = context.selectedIDs();
51901             if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
51902                 // keep the user's area selected..
51903                 context.enter(modeSelect(context, [areaId]));
51904
51905                 // reset pane, in case user somehow happened to change it..
51906                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
51907                 // disallow scrolling
51908                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51909
51910                 d3_select('.preset-search-input')
51911                     .on('keydown.intro', null)
51912                     .on('keyup.intro', checkPresetSearch);
51913
51914                 reveal('.preset-search-input',
51915                     t('intro.areas.search_playground', { preset: playgroundPreset.name() })
51916                 );
51917
51918                 context.history().on('change.intro', null);
51919             }
51920         });
51921
51922         function checkPresetSearch() {
51923             var first = d3_select('.preset-list-item:first-child');
51924
51925             if (first.classed('preset-leisure-playground')) {
51926                 reveal(first.select('.preset-list-button').node(),
51927                     t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
51928                     { duration: 300 }
51929                 );
51930
51931                 d3_select('.preset-search-input')
51932                     .on('keydown.intro', eventCancel, true)
51933                     .on('keyup.intro', null);
51934
51935                 context.history().on('change.intro', function() {
51936                     continueTo(clickAddField);
51937                 });
51938             }
51939         }
51940
51941         function continueTo(nextStep) {
51942             d3_select('.inspector-wrap').on('wheel.intro', null);
51943             context.on('enter.intro', null);
51944             context.history().on('change.intro', null);
51945             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
51946             nextStep();
51947         }
51948     }
51949
51950
51951     function clickAddField() {
51952         if (!areaId || !context.hasEntity(areaId)) {
51953             return addArea();
51954         }
51955         var ids = context.selectedIDs();
51956         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
51957             return searchPresets();
51958         }
51959
51960         if (!d3_select('.form-field-description').empty()) {
51961             return continueTo(describePlayground);
51962         }
51963
51964         // disallow scrolling
51965         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
51966
51967         timeout(function() {
51968             // reset pane, in case user somehow happened to change it..
51969             d3_select('.inspector-wrap .panewrap').style('right', '0%');
51970
51971             // It's possible for the user to add a description in a previous step..
51972             // If they did this already, just continue to next step.
51973             var entity = context.entity(areaId);
51974             if (entity.tags.description) {
51975                 return continueTo(play);
51976             }
51977
51978             reveal('.more-fields .combobox-input',
51979                 t('intro.areas.add_field'),
51980                 { duration: 300 }
51981             );
51982
51983             d3_select('.more-fields .combobox-input')
51984                 .on('click.intro', function() {
51985                     continueTo(chooseDescriptionField);
51986                 });
51987         }, 400);  // after editor pane visible
51988
51989         context.on('exit.intro', function() {
51990             return continueTo(searchPresets);
51991         });
51992
51993         function continueTo(nextStep) {
51994             d3_select('.inspector-wrap').on('wheel.intro', null);
51995             d3_select('.more-fields .combobox-input').on('click.intro', null);
51996             context.on('exit.intro', null);
51997             nextStep();
51998         }
51999     }
52000
52001
52002     function chooseDescriptionField() {
52003         if (!areaId || !context.hasEntity(areaId)) {
52004             return addArea();
52005         }
52006         var ids = context.selectedIDs();
52007         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52008             return searchPresets();
52009         }
52010
52011         if (!d3_select('.form-field-description').empty()) {
52012             return continueTo(describePlayground);
52013         }
52014
52015         // Make sure combobox is ready..
52016         if (d3_select('div.combobox').empty()) {
52017             return continueTo(clickAddField);
52018         }
52019         // Watch for the combobox to go away..
52020         var watcher;
52021         watcher = window.setInterval(function() {
52022             if (d3_select('div.combobox').empty()) {
52023                 window.clearInterval(watcher);
52024                 timeout(function() {
52025                     if (d3_select('.form-field-description').empty()) {
52026                         continueTo(retryChooseDescription);
52027                     } else {
52028                         continueTo(describePlayground);
52029                     }
52030                 }, 300);  // after description field added.
52031             }
52032         }, 300);
52033
52034         reveal('div.combobox',
52035             t('intro.areas.choose_field', { field: descriptionField.label() }),
52036             { duration: 300 }
52037         );
52038
52039         context.on('exit.intro', function() {
52040             return continueTo(searchPresets);
52041         });
52042
52043         function continueTo(nextStep) {
52044             if (watcher) window.clearInterval(watcher);
52045             context.on('exit.intro', null);
52046             nextStep();
52047         }
52048     }
52049
52050
52051     function describePlayground() {
52052         if (!areaId || !context.hasEntity(areaId)) {
52053             return addArea();
52054         }
52055         var ids = context.selectedIDs();
52056         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52057             return searchPresets();
52058         }
52059
52060         // reset pane, in case user happened to change it..
52061         d3_select('.inspector-wrap .panewrap').style('right', '0%');
52062
52063         if (d3_select('.form-field-description').empty()) {
52064             return continueTo(retryChooseDescription);
52065         }
52066
52067         context.on('exit.intro', function() {
52068             continueTo(play);
52069         });
52070
52071         reveal('.entity-editor-pane',
52072             t('intro.areas.describe_playground', { button: icon('#icon-apply', 'pre-text') }),
52073             { duration: 300 }
52074         );
52075
52076         function continueTo(nextStep) {
52077             context.on('exit.intro', null);
52078             nextStep();
52079         }
52080     }
52081
52082
52083     function retryChooseDescription() {
52084         if (!areaId || !context.hasEntity(areaId)) {
52085             return addArea();
52086         }
52087         var ids = context.selectedIDs();
52088         if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
52089             return searchPresets();
52090         }
52091
52092         // reset pane, in case user happened to change it..
52093         d3_select('.inspector-wrap .panewrap').style('right', '0%');
52094
52095         reveal('.entity-editor-pane',
52096             t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
52097             buttonText: t('intro.ok'),
52098             buttonCallback: function() { continueTo(clickAddField); }
52099         });
52100
52101         context.on('exit.intro', function() {
52102             return continueTo(searchPresets);
52103         });
52104
52105         function continueTo(nextStep) {
52106             context.on('exit.intro', null);
52107             nextStep();
52108         }
52109     }
52110
52111
52112     function play() {
52113         dispatch$$1.call('done');
52114         reveal('#id-container',
52115             t('intro.areas.play', { next: t('intro.lines.title') }), {
52116                 tooltipBox: '.intro-nav-wrap .chapter-line',
52117                 buttonText: t('intro.ok'),
52118                 buttonCallback: function() { reveal('#id-container'); }
52119             }
52120         );
52121     }
52122
52123
52124     chapter.enter = function() {
52125         addArea();
52126     };
52127
52128
52129     chapter.exit = function() {
52130         timeouts.forEach(window.clearTimeout);
52131         context.on('enter.intro exit.intro', null);
52132         context.map().on('move.intro drawn.intro', null);
52133         context.history().on('change.intro', null);
52134         d3_select('.inspector-wrap').on('wheel.intro', null);
52135         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
52136         d3_select('.more-fields .combobox-input').on('click.intro', null);
52137     };
52138
52139
52140     chapter.restart = function() {
52141         chapter.exit();
52142         chapter.enter();
52143     };
52144
52145
52146     return utilRebind(chapter, dispatch$$1, 'on');
52147 }
52148
52149 function uiIntroLine(context, reveal) {
52150     var dispatch$$1 = dispatch('done'),
52151         timeouts = [],
52152         tulipRoadId = null,
52153         flowerRoadId = 'w646',
52154         tulipRoadStart = [-85.6297754121684, 41.95805253325314],
52155         tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
52156         tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
52157         roadCategory = context.presets().item('category-road'),
52158         residentialPreset = context.presets().item('highway/residential'),
52159         woodRoadId = 'w525',
52160         woodRoadEndId = 'n2862',
52161         woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
52162         woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
52163         woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
52164         washingtonStreetId = 'w522',
52165         twelfthAvenueId = 'w1',
52166         eleventhAvenueEndId = 'n3550',
52167         twelfthAvenueEndId = 'n5',
52168         washingtonSegmentId = null,
52169         eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
52170         twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
52171         deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
52172         twelfthAvenue = [-85.62219310052491, 41.952505413152956];
52173
52174
52175     var chapter = {
52176         title: 'intro.lines.title'
52177     };
52178
52179
52180     function timeout(f, t$$1) {
52181         timeouts.push(window.setTimeout(f, t$$1));
52182     }
52183
52184
52185     function eventCancel() {
52186         event.stopPropagation();
52187         event.preventDefault();
52188     }
52189
52190
52191     function revealEditMenu(loc, text, options) {
52192         var rect = context.surfaceRect();
52193         var point = context.curtainProjection(loc);
52194         var pad = 40;
52195         var width = 250 + (2 * pad);
52196         var height = 350;
52197         var startX = rect.left + point[0];
52198         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
52199         var box = {
52200             left: left,
52201             top: point[1] + rect.top - 60,
52202             width: width,
52203             height: height
52204         };
52205         reveal(box, text, options);
52206     }
52207
52208
52209     function addLine() {
52210         context.enter(modeBrowse(context));
52211         context.history().reset('initial');
52212
52213         var msec = transitionTime(tulipRoadStart, context.map().center());
52214         if (msec) { reveal(null, null, { duration: 0 }); }
52215         context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
52216
52217         timeout(function() {
52218             var tooltip = reveal('button.add-line',
52219                 t('intro.lines.add_line', { button: icon('#icon-line', 'pre-text') }));
52220
52221             tooltip.selectAll('.tooltip-inner')
52222                 .insert('svg', 'span')
52223                 .attr('class', 'tooltip-illustration')
52224                 .append('use')
52225                 .attr('xlink:href', '#feature-images');
52226
52227             context.on('enter.intro', function(mode) {
52228                 if (mode.id !== 'add-line') return;
52229                 continueTo(startLine);
52230             });
52231         }, msec + 100);
52232
52233         function continueTo(nextStep) {
52234             context.on('enter.intro', null);
52235             nextStep();
52236         }
52237     }
52238
52239
52240     function startLine() {
52241         if (context.mode().id !== 'add-line') {
52242             return chapter.restart();
52243         }
52244
52245         tulipRoadId = null;
52246
52247         var padding = 70 * Math.pow(2, context.map().zoom() - 18);
52248         var box = pad$1(tulipRoadStart, padding, context);
52249         box.height = box.height + 100;
52250         reveal(box, t('intro.lines.start_line'));
52251
52252         context.map().on('move.intro drawn.intro', function() {
52253             padding = 70 * Math.pow(2, context.map().zoom() - 18);
52254             box = pad$1(tulipRoadStart, padding, context);
52255             box.height = box.height + 100;
52256             reveal(box, t('intro.lines.start_line'), { duration: 0 });
52257         });
52258
52259         context.on('enter.intro', function(mode) {
52260             if (mode.id !== 'draw-line') return chapter.restart();
52261             continueTo(drawLine);
52262         });
52263
52264         function continueTo(nextStep) {
52265             context.map().on('move.intro drawn.intro', null);
52266             context.on('enter.intro', null);
52267             nextStep();
52268         }
52269     }
52270
52271
52272     function drawLine() {
52273         if (context.mode().id !== 'draw-line') {
52274             return chapter.restart();
52275         }
52276
52277         tulipRoadId = context.mode().selectedIDs()[0];
52278         context.map().centerEase(tulipRoadMidpoint, 500);
52279
52280         timeout(function() {
52281             var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
52282             var box = pad$1(tulipRoadMidpoint, padding, context);
52283             box.height = box.height * 2;
52284             reveal(box,
52285                 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
52286             );
52287
52288             context.map().on('move.intro drawn.intro', function() {
52289                 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
52290                 box = pad$1(tulipRoadMidpoint, padding, context);
52291                 box.height = box.height * 2;
52292                 reveal(box,
52293                     t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
52294                     { duration: 0 }
52295                 );
52296             });
52297         }, 550);  // after easing..
52298
52299         context.history().on('change.intro', function() {
52300             var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52301             if (!entity) return chapter.restart();
52302
52303             if (isLineConnected()) {
52304                 continueTo(continueLine);
52305             }
52306         });
52307
52308         context.on('enter.intro', function(mode) {
52309             if (mode.id === 'draw-line')
52310                 return;
52311             else if (mode.id === 'select') {
52312                 continueTo(retryIntersect);
52313                 return;
52314             }
52315             else
52316                 return chapter.restart();
52317         });
52318
52319         function continueTo(nextStep) {
52320             context.map().on('move.intro drawn.intro', null);
52321             context.history().on('change.intro', null);
52322             context.on('enter.intro', null);
52323             nextStep();
52324         }
52325     }
52326
52327
52328     function isLineConnected() {
52329         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52330         if (!entity) return false;
52331
52332         var drawNodes = context.graph().childNodes(entity);
52333         return some(drawNodes, function(node) {
52334             return some(context.graph().parentWays(node), function(parent) {
52335                 return parent.id === flowerRoadId;
52336             });
52337         });
52338     }
52339
52340
52341     function retryIntersect() {
52342         d3_select(window).on('mousedown.intro', eventCancel, true);
52343
52344         var box = pad$1(tulipRoadIntersection, 80, context);
52345         reveal(box,
52346             t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
52347         );
52348
52349         timeout(chapter.restart, 3000);
52350     }
52351
52352
52353     function continueLine() {
52354         if (context.mode().id !== 'draw-line') return chapter.restart();
52355         var entity = tulipRoadId && context.hasEntity(tulipRoadId);
52356         if (!entity) return chapter.restart();
52357
52358         context.map().centerEase(tulipRoadIntersection, 500);
52359
52360         reveal('#surface', t('intro.lines.continue_line'));
52361
52362         context.on('enter.intro', function(mode) {
52363             if (mode.id === 'draw-line')
52364                 return;
52365             else if (mode.id === 'select')
52366                 return continueTo(chooseCategoryRoad);
52367             else
52368                 return chapter.restart();
52369         });
52370
52371         function continueTo(nextStep) {
52372             context.on('enter.intro', null);
52373             nextStep();
52374         }
52375     }
52376
52377
52378     function chooseCategoryRoad() {
52379         if (context.mode().id !== 'select') {
52380             return chapter.restart();
52381         }
52382
52383         context.on('exit.intro', function() {
52384             return chapter.restart();
52385         });
52386
52387         var button = d3_select('.preset-category-road .preset-list-button');
52388         if (button.empty()) return chapter.restart();
52389
52390         // disallow scrolling
52391         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52392
52393         timeout(function() {
52394             // reset pane, in case user somehow happened to change it..
52395             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
52396
52397             reveal(button.node(),
52398                 t('intro.lines.choose_category_road', { category: roadCategory.name() })
52399             );
52400
52401             button.on('click.intro', function() {
52402                 continueTo(choosePresetResidential);
52403             });
52404
52405         }, 400);  // after editor pane visible
52406
52407         function continueTo(nextStep) {
52408             d3_select('.inspector-wrap').on('wheel.intro', null);
52409             d3_select('.preset-list-button').on('click.intro', null);
52410             context.on('exit.intro', null);
52411             nextStep();
52412         }
52413     }
52414
52415
52416     function choosePresetResidential() {
52417         if (context.mode().id !== 'select') {
52418             return chapter.restart();
52419         }
52420
52421         context.on('exit.intro', function() {
52422             return chapter.restart();
52423         });
52424
52425         var subgrid = d3_select('.preset-category-road .subgrid');
52426         if (subgrid.empty()) return chapter.restart();
52427
52428         subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
52429             .on('click.intro', function() {
52430                 continueTo(retryPresetResidential);
52431             });
52432
52433         subgrid.selectAll('.preset-highway-residential .preset-list-button')
52434             .on('click.intro', function() {
52435                 continueTo(nameRoad);
52436             });
52437
52438         timeout(function() {
52439             reveal(subgrid.node(),
52440                 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
52441                 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
52442             );
52443         }, 300);
52444
52445         function continueTo(nextStep) {
52446             d3_select('.preset-list-button').on('click.intro', null);
52447             context.on('exit.intro', null);
52448             nextStep();
52449         }
52450     }
52451
52452
52453     // selected wrong road type
52454     function retryPresetResidential() {
52455         if (context.mode().id !== 'select') {
52456             return chapter.restart();
52457         }
52458
52459         context.on('exit.intro', function() {
52460             return chapter.restart();
52461         });
52462
52463         // disallow scrolling
52464         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
52465
52466         timeout(function() {
52467             var button = d3_select('.entity-editor-pane .preset-list-button');
52468
52469             reveal(button.node(),
52470                 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
52471             );
52472
52473             button.on('click.intro', function() {
52474                 continueTo(chooseCategoryRoad);
52475             });
52476
52477         }, 500);
52478
52479         function continueTo(nextStep) {
52480             d3_select('.inspector-wrap').on('wheel.intro', null);
52481             d3_select('.preset-list-button').on('click.intro', null);
52482             context.on('exit.intro', null);
52483             nextStep();
52484         }
52485     }
52486
52487
52488     function nameRoad() {
52489         context.on('exit.intro', function() {
52490             continueTo(didNameRoad);
52491         });
52492
52493         timeout(function() {
52494             reveal('.entity-editor-pane',
52495                 t('intro.lines.name_road', { button: icon('#icon-apply', 'pre-text') }),
52496                 { tooltipClass: 'intro-lines-name_road' }
52497             );
52498         }, 500);
52499
52500         function continueTo(nextStep) {
52501             context.on('exit.intro', null);
52502             nextStep();
52503         }
52504     }
52505
52506
52507     function didNameRoad() {
52508         context.history().checkpoint('doneAddLine');
52509
52510         timeout(function() {
52511             reveal('#surface', t('intro.lines.did_name_road'), {
52512                 buttonText: t('intro.ok'),
52513                 buttonCallback: function() { continueTo(updateLine); }
52514             });
52515         }, 500);
52516
52517         function continueTo(nextStep) {
52518             nextStep();
52519         }
52520     }
52521
52522
52523     function updateLine() {
52524         context.history().reset('doneAddLine');
52525         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52526             return chapter.restart();
52527         }
52528
52529         var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
52530         if (msec) { reveal(null, null, { duration: 0 }); }
52531         context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
52532
52533         timeout(function() {
52534             var padding = 250 * Math.pow(2, context.map().zoom() - 19);
52535             var box = pad$1(woodRoadDragMidpoint, padding, context);
52536             var advance = function() { continueTo(addNode); };
52537
52538             reveal(box, t('intro.lines.update_line'),
52539                 { buttonText: t('intro.ok'), buttonCallback: advance }
52540             );
52541
52542             context.map().on('move.intro drawn.intro', function() {
52543                 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
52544                 var box = pad$1(woodRoadDragMidpoint, padding, context);
52545                 reveal(box, t('intro.lines.update_line'),
52546                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52547                 );
52548             });
52549         }, msec + 100);
52550
52551         function continueTo(nextStep) {
52552             context.map().on('move.intro drawn.intro', null);
52553             nextStep();
52554         }
52555     }
52556
52557
52558     function addNode() {
52559         context.history().reset('doneAddLine');
52560         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52561             return chapter.restart();
52562         }
52563
52564         var padding = 40 * Math.pow(2, context.map().zoom() - 19);
52565         var box = pad$1(woodRoadAddNode, padding, context);
52566         reveal(box, t('intro.lines.add_node'));
52567
52568         context.map().on('move.intro drawn.intro', function() {
52569             var padding = 40 * Math.pow(2, context.map().zoom() - 19);
52570             var box = pad$1(woodRoadAddNode, padding, context);
52571             reveal(box, t('intro.lines.add_node'), { duration: 0 });
52572         });
52573
52574         context.history().on('change.intro', function(changed) {
52575             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52576                 return continueTo(updateLine);
52577             }
52578             if (changed.created().length === 1) {
52579                 timeout(function() { continueTo(startDragEndpoint); }, 500);
52580             }
52581         });
52582
52583         context.on('enter.intro', function(mode) {
52584             if (mode.id !== 'select') {
52585                 continueTo(updateLine);
52586             }
52587         });
52588
52589         function continueTo(nextStep) {
52590             context.map().on('move.intro drawn.intro', null);
52591             context.history().on('change.intro', null);
52592             context.on('enter.intro', null);
52593             nextStep();
52594         }
52595     }
52596
52597
52598     function startDragEndpoint() {
52599         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52600             return continueTo(updateLine);
52601         }
52602         if (context.selectedIDs().indexOf(woodRoadId) === -1) {
52603             context.enter(modeSelect(context, [woodRoadId]));
52604         }
52605
52606         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52607         var box = pad$1(woodRoadDragEndpoint, padding, context);
52608         reveal(box, t('intro.lines.start_drag_endpoint'));
52609
52610         context.map().on('move.intro drawn.intro', function() {
52611             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52612                 return continueTo(updateLine);
52613             }
52614             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52615             var box = pad$1(woodRoadDragEndpoint, padding, context);
52616             reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
52617
52618             var entity = context.entity(woodRoadEndId);
52619             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
52620                 continueTo(finishDragEndpoint);
52621             }
52622         });
52623
52624         context.on('enter.intro', function(mode) {
52625             if (mode.id !== 'select') {
52626                 // keep Wood Road selected so endpoint stays draggable..
52627                 context.enter(modeSelect(context, [woodRoadId]));
52628             }
52629         });
52630
52631         function continueTo(nextStep) {
52632             context.map().on('move.intro drawn.intro', null);
52633             context.on('enter.intro', null);
52634             nextStep();
52635         }
52636     }
52637
52638
52639     function finishDragEndpoint() {
52640         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52641             return continueTo(updateLine);
52642         }
52643
52644         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52645         var box = pad$1(woodRoadDragEndpoint, padding, context);
52646         reveal(box, t('intro.lines.finish_drag_endpoint'));
52647
52648         context.map().on('move.intro drawn.intro', function() {
52649             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52650                 return continueTo(updateLine);
52651             }
52652             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52653             var box = pad$1(woodRoadDragEndpoint, padding, context);
52654             reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
52655
52656             var entity = context.entity(woodRoadEndId);
52657             if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
52658                 continueTo(startDragEndpoint);
52659             }
52660         });
52661
52662         context.on('enter.intro', function() {
52663             continueTo(startDragMidpoint);
52664         });
52665
52666         function continueTo(nextStep) {
52667             context.map().on('move.intro drawn.intro', null);
52668             context.on('enter.intro', null);
52669             nextStep();
52670         }
52671     }
52672
52673
52674     function startDragMidpoint() {
52675         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52676             return continueTo(updateLine);
52677         }
52678         if (context.selectedIDs().indexOf(woodRoadId) === -1) {
52679             context.enter(modeSelect(context, [woodRoadId]));
52680         }
52681
52682         var padding = 80 * Math.pow(2, context.map().zoom() - 19);
52683         var box = pad$1(woodRoadDragMidpoint, padding, context);
52684         reveal(box, t('intro.lines.start_drag_midpoint'));
52685
52686         context.map().on('move.intro drawn.intro', function() {
52687             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52688                 return continueTo(updateLine);
52689             }
52690             var padding = 80 * Math.pow(2, context.map().zoom() - 19);
52691             var box = pad$1(woodRoadDragMidpoint, padding, context);
52692             reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
52693         });
52694
52695         context.history().on('change.intro', function(changed) {
52696             if (changed.created().length === 1) {
52697                 continueTo(continueDragMidpoint);
52698             }
52699         });
52700
52701         context.on('enter.intro', function(mode) {
52702             if (mode.id !== 'select') {
52703                 // keep Wood Road selected so midpoint triangles are drawn..
52704                 context.enter(modeSelect(context, [woodRoadId]));
52705             }
52706         });
52707
52708         function continueTo(nextStep) {
52709             context.map().on('move.intro drawn.intro', null);
52710             context.history().on('change.intro', null);
52711             context.on('enter.intro', null);
52712             nextStep();
52713         }
52714     }
52715
52716
52717     function continueDragMidpoint() {
52718         if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52719             return continueTo(updateLine);
52720         }
52721
52722         var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52723         var box = pad$1(woodRoadDragEndpoint, padding, context);
52724         box.height += 400;
52725
52726         var advance = function() {
52727             context.history().checkpoint('doneUpdateLine');
52728             continueTo(deleteLines);
52729         };
52730
52731         reveal(box, t('intro.lines.continue_drag_midpoint'),
52732             { buttonText: t('intro.ok'), buttonCallback: advance }
52733         );
52734
52735         context.map().on('move.intro drawn.intro', function() {
52736             if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
52737                 return continueTo(updateLine);
52738             }
52739             var padding = 100 * Math.pow(2, context.map().zoom() - 19);
52740             var box = pad$1(woodRoadDragEndpoint, padding, context);
52741             box.height += 400;
52742             reveal(box, t('intro.lines.continue_drag_midpoint'),
52743                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52744             );
52745         });
52746
52747         function continueTo(nextStep) {
52748             context.map().on('move.intro drawn.intro', null);
52749             nextStep();
52750         }
52751     }
52752
52753
52754     function deleteLines() {
52755         context.history().reset('doneUpdateLine');
52756         context.enter(modeBrowse(context));
52757
52758         if (!context.hasEntity(washingtonStreetId) ||
52759             !context.hasEntity(twelfthAvenueId) ||
52760             !context.hasEntity(eleventhAvenueEndId)) {
52761             return chapter.restart();
52762         }
52763
52764         var msec = transitionTime(deleteLinesLoc, context.map().center());
52765         if (msec) { reveal(null, null, { duration: 0 }); }
52766         context.map().zoom(18).centerEase(deleteLinesLoc, msec);
52767
52768         timeout(function() {
52769             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52770             var box = pad$1(deleteLinesLoc, padding, context);
52771             box.top -= 200;
52772             box.height += 400;
52773             var advance = function() { continueTo(rightClickIntersection); };
52774
52775             reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52776                 { buttonText: t('intro.ok'), buttonCallback: advance }
52777             );
52778
52779             context.map().on('move.intro drawn.intro', function() {
52780                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52781                 var box = pad$1(deleteLinesLoc, padding, context);
52782                 box.top -= 200;
52783                 box.height += 400;
52784                 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
52785                     { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52786                 );
52787             });
52788
52789             context.history().on('change.intro', function() {
52790                 timeout(function() {
52791                     continueTo(deleteLines);
52792                 }, 500);  // after any transition (e.g. if user deleted intersection)
52793             });
52794
52795         }, msec + 100);
52796
52797         function continueTo(nextStep) {
52798             context.map().on('move.intro drawn.intro', null);
52799             context.history().on('change.intro', null);
52800             nextStep();
52801         }
52802     }
52803
52804
52805     function rightClickIntersection() {
52806         context.history().reset('doneUpdateLine');
52807         context.enter(modeBrowse(context));
52808
52809         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52810
52811         timeout(function() {
52812             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52813             var box = pad$1(eleventhAvenueEnd, padding, context);
52814             reveal(box, t('intro.lines.rightclick_intersection',
52815                 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
52816             );
52817
52818             context.map().on('move.intro drawn.intro', function() {
52819                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52820                 var box = pad$1(eleventhAvenueEnd, padding, context);
52821                 reveal(box, t('intro.lines.rightclick_intersection',
52822                     { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
52823                     { duration: 0 }
52824                 );
52825             });
52826
52827             context.on('enter.intro', function(mode) {
52828                 if (mode.id !== 'select') return;
52829                 var ids = context.selectedIDs();
52830                 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
52831
52832                 timeout(function() {
52833                     var node = selectMenuItem('split').node();
52834                     if (!node) return;
52835                     continueTo(splitIntersection);
52836                 }, 300);  // after menu visible
52837             });
52838
52839             context.history().on('change.intro', function() {
52840                 timeout(function() {
52841                     continueTo(deleteLines);
52842                 }, 300);  // after any transition (e.g. if user deleted intersection)
52843             });
52844
52845         }, 600);
52846
52847         function continueTo(nextStep) {
52848             context.map().on('move.intro drawn.intro', null);
52849             context.on('enter.intro', null);
52850             context.history().on('change.intro', null);
52851             nextStep();
52852         }
52853     }
52854
52855
52856     function splitIntersection() {
52857         if (!context.hasEntity(washingtonStreetId) ||
52858             !context.hasEntity(twelfthAvenueId) ||
52859             !context.hasEntity(eleventhAvenueEndId)) {
52860             return continueTo(deleteLines);
52861         }
52862
52863         var node = selectMenuItem('split').node();
52864         if (!node) { return continueTo(rightClickIntersection); }
52865
52866         var wasChanged = false;
52867         var menuCoords = context.map().mouseCoordinates();
52868         washingtonSegmentId = null;
52869
52870         revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52871             { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
52872         );
52873
52874         context.map().on('move.intro drawn.intro', function() {
52875             var node = selectMenuItem('split').node();
52876             if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
52877
52878             revealEditMenu(menuCoords, t('intro.lines.split_intersection',
52879                 { button: icon('#operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
52880                 { duration: 0 }
52881             );
52882         });
52883
52884         context.history().on('change.intro', function(changed) {
52885             wasChanged = true;
52886             timeout(function() {
52887                 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
52888                     washingtonSegmentId = changed.created()[0].id;
52889                     continueTo(didSplit);
52890                 } else {
52891                     washingtonSegmentId = null;
52892                     continueTo(retrySplit);
52893                 }
52894             }, 300);  // after any transition (e.g. if user deleted intersection)
52895         });
52896
52897         function continueTo(nextStep) {
52898             context.map().on('move.intro drawn.intro', null);
52899             context.history().on('change.intro', null);
52900             nextStep();
52901         }
52902     }
52903
52904
52905     function retrySplit() {
52906         context.enter(modeBrowse(context));
52907         context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
52908         var advance = function() { continueTo(rightClickIntersection); };
52909
52910         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52911         var box = pad$1(eleventhAvenueEnd, padding, context);
52912         reveal(box, t('intro.lines.retry_split'),
52913             { buttonText: t('intro.ok'), buttonCallback: advance }
52914         );
52915
52916         context.map().on('move.intro drawn.intro', function() {
52917             var padding = 60 * Math.pow(2, context.map().zoom() - 18);
52918             var box = pad$1(eleventhAvenueEnd, padding, context);
52919             reveal(box, t('intro.lines.retry_split'),
52920                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
52921             );
52922         });
52923
52924         function continueTo(nextStep) {
52925             context.map().on('move.intro drawn.intro', null);
52926             nextStep();
52927         }
52928     }
52929
52930
52931     function didSplit() {
52932         if (!washingtonSegmentId ||
52933             !context.hasEntity(washingtonSegmentId) ||
52934             !context.hasEntity(washingtonStreetId) ||
52935             !context.hasEntity(twelfthAvenueId) ||
52936             !context.hasEntity(eleventhAvenueEndId)) {
52937             return continueTo(rightClickIntersection);
52938         }
52939
52940         var ids = context.selectedIDs();
52941         var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
52942         var street = t('intro.graph.name.washington-street');
52943
52944         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52945         var box = pad$1(twelfthAvenue, padding, context);
52946         box.width = box.width / 2;
52947         reveal(box, t(string, { street1: street, street2: street }),
52948             { duration: 500 }
52949         );
52950
52951         timeout(function() {
52952             context.map().zoom(18).centerEase(twelfthAvenue, 500);
52953
52954             context.map().on('move.intro drawn.intro', function() {
52955                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
52956                 var box = pad$1(twelfthAvenue, padding, context);
52957                 box.width = box.width / 2;
52958                 reveal(box, t(string, { street1: street, street2: street }),
52959                     { duration: 0 }
52960                 );
52961             });
52962         }, 600);  // after initial reveal and curtain cut
52963
52964         context.on('enter.intro', function() {
52965             var ids = context.selectedIDs();
52966             if (ids.length === 1 && ids[0] === washingtonSegmentId) {
52967                 continueTo(multiSelect);
52968             }
52969         });
52970
52971         context.history().on('change.intro', function() {
52972             if (!washingtonSegmentId ||
52973                 !context.hasEntity(washingtonSegmentId) ||
52974                 !context.hasEntity(washingtonStreetId) ||
52975                 !context.hasEntity(twelfthAvenueId) ||
52976                 !context.hasEntity(eleventhAvenueEndId)) {
52977                 return continueTo(rightClickIntersection);
52978             }
52979         });
52980
52981         function continueTo(nextStep) {
52982             context.map().on('move.intro drawn.intro', null);
52983             context.on('enter.intro', null);
52984             context.history().on('change.intro', null);
52985             nextStep();
52986         }
52987     }
52988
52989
52990     function multiSelect() {
52991         if (!washingtonSegmentId ||
52992             !context.hasEntity(washingtonSegmentId) ||
52993             !context.hasEntity(washingtonStreetId) ||
52994             !context.hasEntity(twelfthAvenueId) ||
52995             !context.hasEntity(eleventhAvenueEndId)) {
52996             return continueTo(rightClickIntersection);
52997         }
52998
52999         var ids = context.selectedIDs();
53000         var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
53001         var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
53002
53003         if (hasWashington && hasTwelfth) {
53004             return continueTo(multiRightClick);
53005         } else if (!hasWashington && !hasTwelfth) {
53006             return continueTo(didSplit);
53007         }
53008
53009         context.map().zoom(18).centerEase(twelfthAvenue, 500);
53010
53011         timeout(function() {
53012             var selected, other, padding, box;
53013             if (hasWashington) {
53014                 selected = t('intro.graph.name.washington-street');
53015                 other = t('intro.graph.name.12th-avenue');
53016                 padding = 60 * Math.pow(2, context.map().zoom() - 18);
53017                 box = pad$1(twelfthAvenueEnd, padding, context);
53018                 box.width *= 3;
53019             } else {
53020                 selected = t('intro.graph.name.12th-avenue');
53021                 other = t('intro.graph.name.washington-street');
53022                 padding = 200 * Math.pow(2, context.map().zoom() - 18);
53023                 box = pad$1(twelfthAvenue, padding, context);
53024                 box.width /= 2;
53025             }
53026
53027             reveal(box,
53028                 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
53029             );
53030
53031             context.map().on('move.intro drawn.intro', function() {
53032                 if (hasWashington) {
53033                     selected = t('intro.graph.name.washington-street');
53034                     other = t('intro.graph.name.12th-avenue');
53035                     padding = 60 * Math.pow(2, context.map().zoom() - 18);
53036                     box = pad$1(twelfthAvenueEnd, padding, context);
53037                     box.width *= 3;
53038                 } else {
53039                     selected = t('intro.graph.name.12th-avenue');
53040                     other = t('intro.graph.name.washington-street');
53041                     padding = 200 * Math.pow(2, context.map().zoom() - 18);
53042                     box = pad$1(twelfthAvenue, padding, context);
53043                     box.width /= 2;
53044                 }
53045
53046                 reveal(box,
53047                     t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
53048                     { duration: 0 }
53049                 );
53050             });
53051
53052             context.on('enter.intro', function() {
53053                 continueTo(multiSelect);
53054             });
53055
53056             context.history().on('change.intro', function() {
53057                 if (!washingtonSegmentId ||
53058                     !context.hasEntity(washingtonSegmentId) ||
53059                     !context.hasEntity(washingtonStreetId) ||
53060                     !context.hasEntity(twelfthAvenueId) ||
53061                     !context.hasEntity(eleventhAvenueEndId)) {
53062                     return continueTo(rightClickIntersection);
53063                 }
53064             });
53065         }, 600);
53066
53067         function continueTo(nextStep) {
53068             context.map().on('move.intro drawn.intro', null);
53069             context.on('enter.intro', null);
53070             context.history().on('change.intro', null);
53071             nextStep();
53072         }
53073     }
53074
53075
53076     function multiRightClick() {
53077         if (!washingtonSegmentId ||
53078             !context.hasEntity(washingtonSegmentId) ||
53079             !context.hasEntity(washingtonStreetId) ||
53080             !context.hasEntity(twelfthAvenueId) ||
53081             !context.hasEntity(eleventhAvenueEndId)) {
53082             return continueTo(rightClickIntersection);
53083         }
53084
53085         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53086         var box = pad$1(twelfthAvenue, padding, context);
53087         reveal(box, t('intro.lines.multi_rightclick'));
53088
53089         context.map().on('move.intro drawn.intro', function() {
53090             var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53091             var box = pad$1(twelfthAvenue, padding, context);
53092             reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
53093         });
53094
53095         d3_select(window).on('click.intro contextmenu.intro', function() {
53096             timeout(function() {
53097                 var ids = context.selectedIDs();
53098                 if (ids.length === 2 &&
53099                     ids.indexOf(twelfthAvenueId) !== -1 &&
53100                     ids.indexOf(washingtonSegmentId) !== -1) {
53101                         var node = selectMenuItem('delete').node();
53102                         if (!node) return;
53103                         continueTo(multiDelete);
53104                 } else if (ids.length === 1 &&
53105                     ids.indexOf(washingtonSegmentId) !== -1) {
53106                     return continueTo(multiSelect);
53107                 } else {
53108                     return continueTo(didSplit);
53109                 }
53110             }, 300);  // after edit menu visible
53111         }, true);
53112
53113         context.history().on('change.intro', function() {
53114             if (!washingtonSegmentId ||
53115                 !context.hasEntity(washingtonSegmentId) ||
53116                 !context.hasEntity(washingtonStreetId) ||
53117                 !context.hasEntity(twelfthAvenueId) ||
53118                 !context.hasEntity(eleventhAvenueEndId)) {
53119                 return continueTo(rightClickIntersection);
53120             }
53121         });
53122
53123         function continueTo(nextStep) {
53124             context.map().on('move.intro drawn.intro', null);
53125             d3_select(window).on('click.intro contextmenu.intro', null, true);
53126             context.history().on('change.intro', null);
53127             nextStep();
53128         }
53129     }
53130
53131
53132     function multiDelete() {
53133         if (!washingtonSegmentId ||
53134             !context.hasEntity(washingtonSegmentId) ||
53135             !context.hasEntity(washingtonStreetId) ||
53136             !context.hasEntity(twelfthAvenueId) ||
53137             !context.hasEntity(eleventhAvenueEndId)) {
53138             return continueTo(rightClickIntersection);
53139         }
53140
53141         var node = selectMenuItem('delete').node();
53142         if (!node) return continueTo(multiRightClick);
53143
53144         var menuCoords = context.map().mouseCoordinates();
53145         revealEditMenu(menuCoords,
53146             t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') })
53147         );
53148
53149         context.map().on('move.intro drawn.intro', function() {
53150             revealEditMenu(menuCoords,
53151                 t('intro.lines.multi_delete', { button: icon('#operation-delete', 'pre-text') }),
53152                 { duration: 0 }
53153             );
53154         });
53155
53156         context.on('exit.intro', function() {
53157             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
53158                 return continueTo(multiSelect);  // left select mode but roads still exist
53159             }
53160         });
53161
53162         context.history().on('change.intro', function() {
53163             if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
53164                 continueTo(retryDelete);         // changed something but roads still exist
53165             } else {
53166                 continueTo(play);
53167             }
53168         });
53169
53170         function continueTo(nextStep) {
53171             context.map().on('move.intro drawn.intro', null);
53172             context.on('exit.intro', null);
53173             context.history().on('change.intro', null);
53174             nextStep();
53175         }
53176     }
53177
53178
53179     function retryDelete() {
53180         context.enter(modeBrowse(context));
53181
53182         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
53183         var box = pad$1(twelfthAvenue, padding, context);
53184         reveal(box, t('intro.lines.retry_delete'), {
53185             buttonText: t('intro.ok'),
53186             buttonCallback: function() { continueTo(multiSelect); }
53187         });
53188
53189         function continueTo(nextStep) {
53190             nextStep();
53191         }
53192     }
53193
53194
53195     function play() {
53196         dispatch$$1.call('done');
53197         reveal('#id-container',
53198             t('intro.lines.play', { next: t('intro.buildings.title') }), {
53199                 tooltipBox: '.intro-nav-wrap .chapter-building',
53200                 buttonText: t('intro.ok'),
53201                 buttonCallback: function() { reveal('#id-container'); }
53202             }
53203         );
53204    }
53205
53206
53207     chapter.enter = function() {
53208         addLine();
53209     };
53210
53211
53212     chapter.exit = function() {
53213         timeouts.forEach(window.clearTimeout);
53214         d3_select(window).on('mousedown.intro', null, true);
53215         context.on('enter.intro exit.intro', null);
53216         context.map().on('move.intro drawn.intro', null);
53217         context.history().on('change.intro', null);
53218         d3_select('.inspector-wrap').on('wheel.intro', null);
53219         d3_select('.preset-list-button').on('click.intro', null);
53220     };
53221
53222
53223     chapter.restart = function() {
53224         chapter.exit();
53225         chapter.enter();
53226     };
53227
53228
53229     return utilRebind(chapter, dispatch$$1, 'on');
53230 }
53231
53232 function uiIntroBuilding(context, reveal) {
53233     var dispatch$$1 = dispatch('done'),
53234         house = [-85.62815, 41.95638],
53235         tank = [-85.62732, 41.95347],
53236         buildingCatetory = context.presets().item('category-building'),
53237         housePreset = context.presets().item('building/house'),
53238         tankPreset = context.presets().item('man_made/storage_tank'),
53239         timeouts = [],
53240         houseId = null,
53241         tankId = null;
53242
53243
53244     var chapter = {
53245         title: 'intro.buildings.title'
53246     };
53247
53248
53249     function timeout(f, t$$1) {
53250         timeouts.push(window.setTimeout(f, t$$1));
53251     }
53252
53253
53254     function eventCancel() {
53255         event.stopPropagation();
53256         event.preventDefault();
53257     }
53258
53259
53260     function revealHouse(center, text, options) {
53261         var padding = 160 * Math.pow(2, context.map().zoom() - 20);
53262         var box = pad$1(center, padding, context);
53263         reveal(box, text, options);
53264     }
53265
53266
53267     function revealTank(center, text, options) {
53268         var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
53269         var box = pad$1(center, padding, context);
53270         reveal(box, text, options);
53271     }
53272
53273
53274     function revealEditMenu(loc, text, options) {
53275         var rect = context.surfaceRect();
53276         var point = context.curtainProjection(loc);
53277         var pad = 40;
53278         var width = 250 + (2 * pad);
53279         var height = 350;
53280         var startX = rect.left + point[0];
53281         var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
53282         var box = {
53283             left: left,
53284             top: point[1] + rect.top - 60,
53285             width: width,
53286             height: height
53287         };
53288         reveal(box, text, options);
53289     }
53290
53291
53292     function addHouse() {
53293         context.enter(modeBrowse(context));
53294         context.history().reset('initial');
53295         houseId = null;
53296
53297         var msec = transitionTime(house, context.map().center());
53298         if (msec) { reveal(null, null, { duration: 0 }); }
53299         context.map().zoom(19).centerEase(house, msec);
53300
53301         timeout(function() {
53302             var tooltip = reveal('button.add-area',
53303                 t('intro.buildings.add_building', { button: icon('#icon-area', 'pre-text') }));
53304
53305             tooltip.selectAll('.tooltip-inner')
53306                 .insert('svg', 'span')
53307                 .attr('class', 'tooltip-illustration')
53308                 .append('use')
53309                 .attr('xlink:href', '#building-images');
53310
53311             context.on('enter.intro', function(mode) {
53312                 if (mode.id !== 'add-area') return;
53313                 continueTo(startHouse);
53314             });
53315         }, msec + 100);
53316
53317         function continueTo(nextStep) {
53318             context.on('enter.intro', null);
53319             nextStep();
53320         }
53321     }
53322
53323
53324     function startHouse() {
53325         if (context.mode().id !== 'add-area') {
53326             return continueTo(addHouse);
53327         }
53328
53329         houseId = null;
53330         context.map().zoomEase(20, 500);
53331
53332         timeout(function() {
53333             revealHouse(house, t('intro.buildings.start_building'));
53334
53335             context.map().on('move.intro drawn.intro', function() {
53336                 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
53337             });
53338
53339             context.on('enter.intro', function(mode) {
53340                 if (mode.id !== 'draw-area') return chapter.restart();
53341                 continueTo(continueHouse);
53342             });
53343
53344         }, 550);  // after easing
53345
53346         function continueTo(nextStep) {
53347             context.map().on('move.intro drawn.intro', null);
53348             context.on('enter.intro', null);
53349             nextStep();
53350         }
53351     }
53352
53353
53354     function continueHouse() {
53355         if (context.mode().id !== 'draw-area') {
53356             return continueTo(addHouse);
53357         }
53358
53359         houseId = null;
53360
53361         revealHouse(house, t('intro.buildings.continue_building'));
53362
53363         context.map().on('move.intro drawn.intro', function() {
53364             revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
53365         });
53366
53367         context.on('enter.intro', function(mode) {
53368             if (mode.id === 'draw-area') {
53369                 return;
53370             } else if (mode.id === 'select') {
53371                 var graph = context.graph(),
53372                     way = context.entity(context.selectedIDs()[0]),
53373                     nodes = graph.childNodes(way),
53374                     points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
53375
53376                 if (isMostlySquare(points)) {
53377                     houseId = way.id;
53378                     return continueTo(chooseCategoryBuilding);
53379                 } else {
53380                     return continueTo(retryHouse);
53381                 }
53382
53383             } else {
53384                 return chapter.restart();
53385             }
53386         });
53387
53388         function continueTo(nextStep) {
53389             context.map().on('move.intro drawn.intro', null);
53390             context.on('enter.intro', null);
53391             nextStep();
53392         }
53393     }
53394
53395
53396     function retryHouse() {
53397         var onClick = function() { continueTo(addHouse); };
53398
53399         revealHouse(house, t('intro.buildings.retry_building'),
53400             { buttonText: t('intro.ok'), buttonCallback: onClick }
53401         );
53402
53403         context.map().on('move.intro drawn.intro', function() {
53404             revealHouse(house, t('intro.buildings.retry_building'),
53405                 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
53406             );
53407         });
53408
53409         function continueTo(nextStep) {
53410             context.map().on('move.intro drawn.intro', null);
53411             nextStep();
53412         }
53413     }
53414
53415
53416     function chooseCategoryBuilding() {
53417         if (!houseId || !context.hasEntity(houseId)) {
53418             return addHouse();
53419         }
53420         var ids = context.selectedIDs();
53421         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53422             context.enter(modeSelect(context, [houseId]));
53423         }
53424
53425         // disallow scrolling
53426         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53427
53428         timeout(function() {
53429             // reset pane, in case user somehow happened to change it..
53430             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53431
53432             var button = d3_select('.preset-category-building .preset-list-button');
53433
53434             reveal(button.node(),
53435                 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
53436             );
53437
53438             button.on('click.intro', function() {
53439                 button.on('click.intro', null);
53440                 continueTo(choosePresetHouse);
53441             });
53442
53443         }, 400);  // after preset list pane visible..
53444
53445
53446         context.on('enter.intro', function(mode) {
53447             if (!houseId || !context.hasEntity(houseId)) {
53448                 return continueTo(addHouse);
53449             }
53450             var ids = context.selectedIDs();
53451             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
53452                 return continueTo(chooseCategoryBuilding);
53453             }
53454         });
53455
53456         function continueTo(nextStep) {
53457             d3_select('.inspector-wrap').on('wheel.intro', null);
53458             d3_select('.preset-list-button').on('click.intro', null);
53459             context.on('enter.intro', null);
53460             nextStep();
53461         }
53462     }
53463
53464
53465     function choosePresetHouse() {
53466         if (!houseId || !context.hasEntity(houseId)) {
53467             return addHouse();
53468         }
53469         var ids = context.selectedIDs();
53470         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53471             context.enter(modeSelect(context, [houseId]));
53472         }
53473
53474         // disallow scrolling
53475         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53476
53477         timeout(function() {
53478             // reset pane, in case user somehow happened to change it..
53479             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53480
53481             var button = d3_select('.preset-building-house .preset-list-button');
53482
53483             reveal(button.node(),
53484                 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
53485                 { duration: 300 }
53486             );
53487
53488             button.on('click.intro', function() {
53489                 button.on('click.intro', null);
53490                 continueTo(closeEditorHouse);
53491             });
53492
53493
53494         }, 400);  // after preset list pane visible..
53495
53496         context.on('enter.intro', function(mode) {
53497             if (!houseId || !context.hasEntity(houseId)) {
53498                 return continueTo(addHouse);
53499             }
53500             var ids = context.selectedIDs();
53501             if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
53502                 return continueTo(chooseCategoryBuilding);
53503             }
53504         });
53505
53506         function continueTo(nextStep) {
53507             d3_select('.inspector-wrap').on('wheel.intro', null);
53508             d3_select('.preset-list-button').on('click.intro', null);
53509             context.on('enter.intro', null);
53510             nextStep();
53511         }
53512     }
53513
53514
53515     function closeEditorHouse() {
53516         if (!houseId || !context.hasEntity(houseId)) {
53517             return addHouse();
53518         }
53519         var ids = context.selectedIDs();
53520         if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
53521             context.enter(modeSelect(context, [houseId]));
53522         }
53523
53524         context.history().checkpoint('hasHouse');
53525
53526         context.on('exit.intro', function() {
53527             continueTo(rightClickHouse);
53528         });
53529
53530         timeout(function() {
53531             reveal('.entity-editor-pane',
53532                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53533             );
53534         }, 500);
53535
53536         function continueTo(nextStep) {
53537             context.on('exit.intro', null);
53538             nextStep();
53539         }
53540     }
53541
53542
53543     function rightClickHouse() {
53544         if (!houseId) return chapter.restart();
53545
53546         context.enter(modeBrowse(context));
53547         context.history().reset('hasHouse');
53548         context.map().centerEase(house, 500);
53549
53550         timeout(function() {
53551             if (context.map().zoom() < 20) {
53552                 context.map().zoomEase(20, 500);
53553             }
53554         }, 520);
53555
53556         context.on('enter.intro', function(mode) {
53557             if (mode.id !== 'select') return;
53558             var ids = context.selectedIDs();
53559             if (ids.length !== 1 || ids[0] !== houseId) return;
53560
53561             timeout(function() {
53562                 var node = selectMenuItem('orthogonalize').node();
53563                 if (!node) return;
53564                 continueTo(clickSquare);
53565             }, 300);  // after menu visible
53566         });
53567
53568         context.map().on('move.intro drawn.intro', function() {
53569             revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
53570         });
53571
53572         context.history().on('change.intro', function() {
53573             continueTo(rightClickHouse);
53574         });
53575
53576         function continueTo(nextStep) {
53577             context.on('enter.intro', null);
53578             context.map().on('move.intro drawn.intro', null);
53579             context.history().on('change.intro', null);
53580             nextStep();
53581         }
53582     }
53583
53584
53585     function clickSquare() {
53586         if (!houseId) return chapter.restart();
53587         var entity = context.hasEntity(houseId);
53588         if (!entity) return continueTo(rightClickHouse);
53589
53590         var node = selectMenuItem('orthogonalize').node();
53591         if (!node) { return continueTo(rightClickHouse); }
53592
53593         var wasChanged = false;
53594         var menuCoords = context.map().mouseCoordinates();
53595
53596         revealEditMenu(menuCoords,
53597             t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') })
53598         );
53599
53600         context.on('enter.intro', function(mode) {
53601             if (mode.id === 'browse') {
53602                 continueTo(rightClickHouse);
53603             } else if (mode.id === 'move' || mode.id === 'rotate') {
53604                 continueTo(retryClickSquare);
53605             }
53606         });
53607
53608         context.map().on('move.intro drawn.intro', function() {
53609             var node = selectMenuItem('orthogonalize').node();
53610             if (!wasChanged && !node) { return continueTo(rightClickHouse); }
53611
53612             revealEditMenu(menuCoords,
53613                 t('intro.buildings.square_building', { button: icon('#operation-orthogonalize', 'pre-text') }),
53614                 { duration: 0 }
53615             );
53616         });
53617
53618         context.history().on('change.intro', function() {
53619             wasChanged = true;
53620             context.history().on('change.intro', null);
53621
53622             // Something changed.  Wait for transition to complete and check undo annotation.
53623             timeout(function() {
53624                 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
53625                     continueTo(doneSquare);
53626                 } else {
53627                     continueTo(retryClickSquare);
53628                 }
53629             }, 500);  // after transitioned actions
53630         });
53631
53632         function continueTo(nextStep) {
53633             context.on('enter.intro', null);
53634             context.map().on('move.intro drawn.intro', null);
53635             context.history().on('change.intro', null);
53636             nextStep();
53637         }
53638     }
53639
53640
53641     function retryClickSquare() {
53642         context.enter(modeBrowse(context));
53643
53644         revealHouse(house, t('intro.buildings.retry_square'), {
53645             buttonText: t('intro.ok'),
53646             buttonCallback: function() { continueTo(rightClickHouse); }
53647         });
53648
53649         function continueTo(nextStep) {
53650             nextStep();
53651         }
53652     }
53653
53654
53655     function doneSquare() {
53656         context.history().checkpoint('doneSquare');
53657
53658         revealHouse(house, t('intro.buildings.done_square'), {
53659             buttonText: t('intro.ok'),
53660             buttonCallback: function() { continueTo(addTank); }
53661         });
53662
53663         function continueTo(nextStep) {
53664             nextStep();
53665         }
53666     }
53667
53668
53669     function addTank() {
53670         context.enter(modeBrowse(context));
53671         context.history().reset('doneSquare');
53672         tankId = null;
53673
53674         var msec = transitionTime(tank, context.map().center());
53675         if (msec) { reveal(null, null, { duration: 0 }); }
53676         context.map().zoom(19.5).centerEase(tank, msec);
53677
53678         timeout(function() {
53679             reveal('button.add-area',
53680                 t('intro.buildings.add_tank', { button: icon('#icon-area', 'pre-text') })
53681             );
53682
53683             context.on('enter.intro', function(mode) {
53684                 if (mode.id !== 'add-area') return;
53685                 continueTo(startTank);
53686             });
53687         }, msec + 100);
53688
53689         function continueTo(nextStep) {
53690             context.on('enter.intro', null);
53691             nextStep();
53692         }
53693     }
53694
53695
53696     function startTank() {
53697         if (context.mode().id !== 'add-area') {
53698             return continueTo(addTank);
53699         }
53700
53701         tankId = null;
53702
53703         timeout(function() {
53704             revealTank(tank, t('intro.buildings.start_tank'));
53705
53706             context.map().on('move.intro drawn.intro', function() {
53707                 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
53708             });
53709
53710             context.on('enter.intro', function(mode) {
53711                 if (mode.id !== 'draw-area') return chapter.restart();
53712                 continueTo(continueTank);
53713             });
53714
53715         }, 550);  // after easing
53716
53717         function continueTo(nextStep) {
53718             context.map().on('move.intro drawn.intro', null);
53719             context.on('enter.intro', null);
53720             nextStep();
53721         }
53722     }
53723
53724
53725     function continueTank() {
53726         if (context.mode().id !== 'draw-area') {
53727             return continueTo(addTank);
53728         }
53729
53730         tankId = null;
53731
53732         revealTank(tank, t('intro.buildings.continue_tank'));
53733
53734         context.map().on('move.intro drawn.intro', function() {
53735             revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
53736         });
53737
53738         context.on('enter.intro', function(mode) {
53739             if (mode.id === 'draw-area') {
53740                 return;
53741             } else if (mode.id === 'select') {
53742                 tankId = context.selectedIDs()[0];
53743                 return continueTo(searchPresetTank);
53744             } else {
53745                 return continueTo(addTank);
53746             }
53747         });
53748
53749         function continueTo(nextStep) {
53750             context.map().on('move.intro drawn.intro', null);
53751             context.on('enter.intro', null);
53752             nextStep();
53753         }
53754     }
53755
53756
53757     function searchPresetTank() {
53758         if (!tankId || !context.hasEntity(tankId)) {
53759             return addTank();
53760         }
53761         var ids = context.selectedIDs();
53762         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53763             context.enter(modeSelect(context, [tankId]));
53764         }
53765
53766         // disallow scrolling
53767         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53768
53769         timeout(function() {
53770             // reset pane, in case user somehow happened to change it..
53771             d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53772
53773             d3_select('.preset-search-input')
53774                 .on('keydown.intro', null)
53775                 .on('keyup.intro', checkPresetSearch);
53776
53777             reveal('.preset-search-input',
53778                 t('intro.buildings.search_tank', { preset: tankPreset.name() })
53779             );
53780         }, 400);  // after preset list pane visible..
53781
53782         context.on('enter.intro', function(mode) {
53783             if (!tankId || !context.hasEntity(tankId)) {
53784                 return continueTo(addTank);
53785             }
53786
53787             var ids = context.selectedIDs();
53788             if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
53789                 // keep the user's area selected..
53790                 context.enter(modeSelect(context, [tankId]));
53791
53792                 // reset pane, in case user somehow happened to change it..
53793                 d3_select('.inspector-wrap .panewrap').style('right', '-100%');
53794                 // disallow scrolling
53795                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
53796
53797                 d3_select('.preset-search-input')
53798                     .on('keydown.intro', null)
53799                     .on('keyup.intro', checkPresetSearch);
53800
53801                 reveal('.preset-search-input',
53802                     t('intro.buildings.search_tank', { preset: tankPreset.name() })
53803                 );
53804
53805                 context.history().on('change.intro', null);
53806             }
53807         });
53808
53809         function checkPresetSearch() {
53810             var first = d3_select('.preset-list-item:first-child');
53811
53812             if (first.classed('preset-man_made-storage_tank')) {
53813                 reveal(first.select('.preset-list-button').node(),
53814                     t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
53815                     { duration: 300 }
53816                 );
53817
53818                 d3_select('.preset-search-input')
53819                     .on('keydown.intro', eventCancel, true)
53820                     .on('keyup.intro', null);
53821
53822                 context.history().on('change.intro', function() {
53823                     continueTo(closeEditorTank);
53824                 });
53825             }
53826         }
53827
53828         function continueTo(nextStep) {
53829             d3_select('.inspector-wrap').on('wheel.intro', null);
53830             context.on('enter.intro', null);
53831             context.history().on('change.intro', null);
53832             d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
53833             nextStep();
53834         }
53835     }
53836
53837
53838     function closeEditorTank() {
53839         if (!tankId || !context.hasEntity(tankId)) {
53840             return addTank();
53841         }
53842         var ids = context.selectedIDs();
53843         if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
53844             context.enter(modeSelect(context, [tankId]));
53845         }
53846
53847         context.history().checkpoint('hasTank');
53848
53849         context.on('exit.intro', function() {
53850             continueTo(rightClickTank);
53851         });
53852
53853         timeout(function() {
53854             reveal('.entity-editor-pane',
53855                 t('intro.buildings.close', { button: icon('#icon-apply', 'pre-text') })
53856             );
53857         }, 500);
53858
53859         function continueTo(nextStep) {
53860             context.on('exit.intro', null);
53861             nextStep();
53862         }
53863     }
53864
53865
53866     function rightClickTank() {
53867         if (!tankId) return continueTo(addTank);
53868
53869         context.enter(modeBrowse(context));
53870         context.history().reset('hasTank');
53871         context.map().centerEase(tank, 500);
53872
53873         timeout(function() {
53874             context.on('enter.intro', function(mode) {
53875                 if (mode.id !== 'select') return;
53876                 var ids = context.selectedIDs();
53877                 if (ids.length !== 1 || ids[0] !== tankId) return;
53878
53879                 timeout(function() {
53880                     var node = selectMenuItem('circularize').node();
53881                     if (!node) return;
53882                     continueTo(clickCircle);
53883                 }, 300);  // after menu visible
53884             });
53885
53886             revealTank(tank, t('intro.buildings.rightclick_tank'));
53887
53888             context.map().on('move.intro drawn.intro', function() {
53889                 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
53890             });
53891
53892             context.history().on('change.intro', function() {
53893                 continueTo(rightClickTank);
53894             });
53895
53896         }, 600);
53897
53898         function continueTo(nextStep) {
53899             context.on('enter.intro', null);
53900             context.map().on('move.intro drawn.intro', null);
53901             context.history().on('change.intro', null);
53902             nextStep();
53903         }
53904     }
53905
53906
53907     function clickCircle() {
53908         if (!tankId) return chapter.restart();
53909         var entity = context.hasEntity(tankId);
53910         if (!entity) return continueTo(rightClickTank);
53911
53912         var node = selectMenuItem('circularize').node();
53913         if (!node) { return continueTo(rightClickTank); }
53914
53915         var wasChanged = false;
53916         var menuCoords = context.map().mouseCoordinates();
53917
53918         revealEditMenu(menuCoords,
53919             t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') })
53920         );
53921
53922         context.on('enter.intro', function(mode) {
53923             if (mode.id === 'browse') {
53924                 continueTo(rightClickTank);
53925             } else if (mode.id === 'move' || mode.id === 'rotate') {
53926                 continueTo(retryClickCircle);
53927             }
53928         });
53929
53930         context.map().on('move.intro drawn.intro', function() {
53931             var node = selectMenuItem('circularize').node();
53932             if (!wasChanged && !node) { return continueTo(rightClickTank); }
53933
53934             revealEditMenu(menuCoords,
53935                 t('intro.buildings.circle_tank', { button: icon('#operation-circularize', 'pre-text') }),
53936                 { duration: 0 }
53937             );
53938         });
53939
53940         context.history().on('change.intro', function() {
53941             wasChanged = true;
53942             context.history().on('change.intro', null);
53943
53944             // Something changed.  Wait for transition to complete and check undo annotation.
53945             timeout(function() {
53946                 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
53947                     continueTo(play);
53948                 } else {
53949                     continueTo(retryClickCircle);
53950                 }
53951             }, 500);  // after transitioned actions
53952         });
53953
53954         function continueTo(nextStep) {
53955             context.on('enter.intro', null);
53956             context.map().on('move.intro drawn.intro', null);
53957             context.history().on('change.intro', null);
53958             nextStep();
53959         }
53960     }
53961
53962
53963     function retryClickCircle() {
53964         context.enter(modeBrowse(context));
53965
53966         revealTank(tank, t('intro.buildings.retry_circle'), {
53967             buttonText: t('intro.ok'),
53968             buttonCallback: function() { continueTo(rightClickTank); }
53969         });
53970
53971         function continueTo(nextStep) {
53972             nextStep();
53973         }
53974     }
53975
53976
53977     function play() {
53978         dispatch$$1.call('done');
53979         reveal('#id-container',
53980             t('intro.buildings.play', { next: t('intro.startediting.title') }), {
53981                 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
53982                 buttonText: t('intro.ok'),
53983                 buttonCallback: function() { reveal('#id-container'); }
53984             }
53985         );
53986     }
53987
53988
53989     chapter.enter = function() {
53990         addHouse();
53991     };
53992
53993
53994     chapter.exit = function() {
53995         timeouts.forEach(window.clearTimeout);
53996         context.on('enter.intro exit.intro', null);
53997         context.map().on('move.intro drawn.intro', null);
53998         context.history().on('change.intro', null);
53999         d3_select('.inspector-wrap').on('wheel.intro', null);
54000         d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
54001         d3_select('.more-fields .combobox-input').on('click.intro', null);
54002     };
54003
54004
54005     chapter.restart = function() {
54006         chapter.exit();
54007         chapter.enter();
54008     };
54009
54010
54011     return utilRebind(chapter, dispatch$$1, 'on');
54012 }
54013
54014 function uiIntroStartEditing(context, reveal) {
54015     var dispatch$$1 = dispatch('done', 'startEditing'),
54016         modalSelection = d3_select(null);
54017
54018
54019     var chapter = {
54020         title: 'intro.startediting.title'
54021     };
54022
54023     function showHelp() {
54024         reveal('.map-control.help-control',
54025             t('intro.startediting.help', { button: icon('#icon-help', 'pre-text'), key: t('help.key') }), {
54026                 buttonText: t('intro.ok'),
54027                 buttonCallback: function() { shortcuts(); }
54028             }
54029         );
54030     }
54031
54032     function shortcuts() {
54033         reveal('.map-control.help-control',
54034             t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
54035                 buttonText: t('intro.ok'),
54036                 buttonCallback: function() { showSave(); }
54037             }
54038         );
54039     }
54040
54041     function showSave() {
54042         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
54043         reveal('#bar button.save',
54044             t('intro.startediting.save'), {
54045                 buttonText: t('intro.ok'),
54046                 buttonCallback: function() { showStart(); }
54047             }
54048         );
54049     }
54050
54051     function showStart() {
54052         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
54053
54054         modalSelection = uiModal(context.container());
54055
54056         modalSelection.select('.modal')
54057             .attr('class', 'modal-splash modal col6');
54058
54059         modalSelection.selectAll('.close').remove();
54060
54061         var startbutton = modalSelection.select('.content')
54062             .attr('class', 'fillL')
54063             .append('button')
54064                 .attr('class', 'modal-section huge-modal-button')
54065                 .on('click', function() {
54066                     modalSelection.remove();
54067                 });
54068
54069             startbutton
54070                 .append('svg')
54071                 .attr('class', 'illustration')
54072                 .append('use')
54073                 .attr('xlink:href', '#logo-walkthrough');
54074
54075             startbutton
54076                 .append('h2')
54077                 .text(t('intro.startediting.start'));
54078
54079         dispatch$$1.call('startEditing');
54080     }
54081
54082
54083     chapter.enter = function() {
54084         showHelp();
54085     };
54086
54087
54088     chapter.exit = function() {
54089         modalSelection.remove();
54090         d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
54091     };
54092
54093
54094     return utilRebind(chapter, dispatch$$1, 'on');
54095 }
54096
54097 var chapterUi = {
54098     welcome: uiIntroWelcome,
54099     navigation: uiIntroNavigation,
54100     point: uiIntroPoint,
54101     area: uiIntroArea,
54102     line: uiIntroLine,
54103     building: uiIntroBuilding,
54104     startEditing: uiIntroStartEditing
54105 };
54106
54107 var chapterFlow = [
54108     'welcome',
54109     'navigation',
54110     'point',
54111     'area',
54112     'line',
54113     'building',
54114     'startEditing'
54115 ];
54116
54117
54118 function uiIntro(context) {
54119     var introGraph = {},
54120         currChapter;
54121
54122
54123     // create entities for intro graph and localize names
54124     for (var id in dataIntroGraph) {
54125         introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
54126     }
54127
54128
54129     function intro(selection$$1) {
54130         context.enter(modeBrowse(context));
54131
54132         // Save current map state
54133         var osm = context.connection(),
54134             history = context.history().toJSON(),
54135             hash = window.location.hash,
54136             center = context.map().center(),
54137             zoom = context.map().zoom(),
54138             background = context.background().baseLayerSource(),
54139             overlays = context.background().overlayLayerSources(),
54140             opacity = d3_selectAll('#map .layer-background').style('opacity'),
54141             loadedTiles = osm && osm.loadedTiles(),
54142             baseEntities = context.history().graph().base().entities,
54143             countryCode = services.geocoder.countryCode;
54144
54145         // Block saving
54146         context.inIntro(true);
54147
54148         // Load semi-real data used in intro
54149         if (osm) { osm.toggle(false).reset(); }
54150         context.history().reset();
54151         context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
54152         context.history().checkpoint('initial');
54153
54154         var esri = context.background().findSource('EsriWorldImagery');
54155         if (esri) {
54156             context.background().baseLayerSource(esri);
54157         } else {
54158             context.background().bing();
54159         }
54160         overlays.forEach(function (d) {
54161             context.background().toggleOverlayLayer(d);
54162         });
54163
54164         // Mock geocoder
54165         services.geocoder.countryCode = function(location, callback) {
54166             callback(null, t('intro.graph.countrycode'));
54167         };
54168
54169         d3_selectAll('#map .layer-background').style('opacity', 1);
54170
54171         var curtain = uiCurtain();
54172         selection$$1.call(curtain);
54173
54174         // store that the user started the walkthrough..
54175         context.storage('walkthrough_started', 'yes');
54176
54177         // restore previous walkthrough progress..
54178         var storedProgress = context.storage('walkthrough_progress') || '';
54179         var progress = storedProgress.split(';').filter(Boolean);
54180
54181         var chapters = chapterFlow.map(function(chapter, i) {
54182             var s = chapterUi[chapter](context, curtain.reveal)
54183                 .on('done', function() {
54184                     context.presets().init();  // clear away "recent" presets
54185
54186                     buttons.filter(function(d) {
54187                         return d.title === s.title;
54188                     }).classed('finished', true);
54189
54190                     if (i < chapterFlow.length - 1) {
54191                         var next = chapterFlow[i + 1];
54192                         d3_select('button.chapter-' + next)
54193                             .classed('next', true);
54194                     }
54195
54196                     // store walkthrough progress..
54197                     progress.push(chapter);
54198                     context.storage('walkthrough_progress', uniq(progress).join(';'));
54199                 });
54200             return s;
54201         });
54202
54203         chapters[chapters.length - 1].on('startEditing', function() {
54204             // store walkthrough progress..
54205             progress.push('startEditing');
54206             context.storage('walkthrough_progress', uniq(progress).join(';'));
54207
54208             // store if walkthrough is completed..
54209             var incomplete = difference(chapterFlow, progress);
54210             if (!incomplete.length) {
54211                 context.storage('walkthrough_completed', 'yes');
54212             }
54213
54214             curtain.remove();
54215             navwrap.remove();
54216             d3_selectAll('#map .layer-background').style('opacity', opacity);
54217             if (osm) { osm.toggle(true).reset().loadedTiles(loadedTiles); }
54218             context.history().reset().merge(values$1(baseEntities));
54219             context.background().baseLayerSource(background);
54220             overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
54221             if (history) { context.history().fromJSON(history, false); }
54222             context.map().centerZoom(center, zoom);
54223             window.location.replace(hash);
54224             services.geocoder.countryCode = countryCode;
54225             context.inIntro(false);
54226         });
54227
54228         var navwrap = selection$$1
54229             .append('div')
54230             .attr('class', 'intro-nav-wrap fillD');
54231
54232         navwrap
54233             .append('svg')
54234             .attr('class', 'intro-nav-wrap-logo')
54235             .append('use')
54236             .attr('xlink:href', '#logo-walkthrough');
54237
54238         var buttonwrap = navwrap
54239             .append('div')
54240             .attr('class', 'joined')
54241             .selectAll('button.chapter');
54242
54243         var buttons = buttonwrap
54244             .data(chapters)
54245             .enter()
54246             .append('button')
54247             .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
54248             .on('click', enterChapter);
54249
54250         buttons
54251             .append('span')
54252             .text(function(d) { return t(d.title); });
54253
54254         buttons
54255             .append('span')
54256             .attr('class', 'status')
54257             .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'));
54258
54259         enterChapter(chapters[0]);
54260
54261
54262         function enterChapter(newChapter) {
54263             if (currChapter) { currChapter.exit(); }
54264             context.enter(modeBrowse(context));
54265
54266             currChapter = newChapter;
54267             currChapter.enter();
54268
54269             buttons
54270                 .classed('next', false)
54271                 .classed('active', function(d) {
54272                     return d.title === currChapter.title;
54273                 });
54274         }
54275     }
54276
54277
54278     return intro;
54279 }
54280
54281 function uiShortcuts() {
54282     var detected = utilDetect();
54283     var activeTab = 0;
54284     var modalSelection;
54285     var savedSelection;
54286
54287
54288     var keybinding = d3keybinding('shortcuts')
54289         .on(t('shortcuts.toggle.key'), function () {
54290             if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
54291                 if (modalSelection) {
54292                     modalSelection.close();
54293                     modalSelection = null;
54294                 }
54295             } else {
54296                 modalSelection = uiModal(savedSelection);
54297                 shortcutsModal(modalSelection);
54298             }
54299         });
54300
54301     d3_select(document)
54302         .call(keybinding);
54303
54304
54305
54306     function shortcutsModal(modalSelection) {
54307         modalSelection.select('.modal')
54308             .classed('modal-shortcuts', true);
54309
54310         var shortcutsModal = modalSelection.select('.content');
54311
54312         shortcutsModal
54313             .append('div')
54314             .attr('class', 'modal-section')
54315             .append('h3')
54316             .text(t('shortcuts.title'));
54317
54318         shortcutsModal
54319             .call(render);
54320     }
54321
54322
54323     function render(selection$$1) {
54324         var wrapper = selection$$1
54325             .selectAll('.wrapper')
54326             .data([0]);
54327
54328         var wrapperEnter = wrapper
54329             .enter()
54330             .append('div')
54331             .attr('class', 'wrapper modal-section');
54332
54333         var tabsBar = wrapperEnter
54334             .append('div')
54335             .attr('class', 'tabs-bar');
54336
54337         var shortcutsList = wrapperEnter
54338             .append('div')
54339             .attr('class', 'shortcuts-list');
54340
54341         wrapper = wrapper.merge(wrapperEnter);
54342
54343         var tabs = tabsBar
54344             .selectAll('.tab')
54345             .data(dataShortcuts);
54346
54347         var tabsEnter = tabs
54348             .enter()
54349             .append('div')
54350             .attr('class', 'tab')
54351             .on('click', function (d, i) {
54352                 activeTab = i;
54353                 render(selection$$1);
54354             });
54355
54356         tabsEnter
54357             .append('span')
54358             .text(function (d) { return t(d.text); });
54359
54360         tabs = tabs
54361             .merge(tabsEnter);
54362
54363         // Update
54364         wrapper.selectAll('.tab')
54365             .classed('active', function (d, i) {
54366                 return i === activeTab;
54367             });
54368
54369
54370         var shortcuts = shortcutsList
54371             .selectAll('.shortcut-tab')
54372             .data(dataShortcuts);
54373
54374         var shortcutsEnter = shortcuts
54375             .enter()
54376             .append('div')
54377             .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
54378
54379         var columnsEnter = shortcutsEnter
54380             .selectAll('.shortcut-column')
54381             .data(function (d) { return d.columns; })
54382             .enter()
54383             .append('table')
54384             .attr('class', 'shortcut-column');
54385
54386         var rowsEnter = columnsEnter
54387             .selectAll('.shortcut-row')
54388             .data(function (d) { return d.rows; })
54389             .enter()
54390             .append('tr')
54391             .attr('class', 'shortcut-row');
54392
54393
54394         var sectionRows = rowsEnter
54395             .filter(function (d) { return !d.shortcuts; });
54396
54397         sectionRows
54398             .append('td');
54399
54400         sectionRows
54401             .append('td')
54402             .attr('class', 'shortcut-section')
54403             .append('h3')
54404             .text(function (d) { return t(d.text); });
54405
54406
54407         var shortcutRows = rowsEnter
54408             .filter(function (d) { return d.shortcuts; });
54409
54410         var shortcutKeys = shortcutRows
54411             .append('td')
54412             .attr('class', 'shortcut-keys');
54413
54414         var modifierKeys = shortcutKeys
54415             .filter(function (d) { return d.modifiers; });
54416
54417         modifierKeys
54418             .selectAll('kbd.modifier')
54419             .data(function (d) {
54420                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54421                     return ['⌘'];
54422                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54423                     return [];
54424                 } else {
54425                     return d.modifiers;
54426                 }
54427             })
54428             .enter()
54429             .each(function () {
54430                 var selection$$1 = d3_select(this);
54431
54432                 selection$$1
54433                     .append('kbd')
54434                     .attr('class', 'modifier')
54435                     .text(function (d) { return uiCmd.display(d); });
54436
54437                 selection$$1
54438                     .append('span')
54439                     .text('+');
54440             });
54441
54442
54443         shortcutKeys
54444             .selectAll('kbd.shortcut')
54445             .data(function (d) {
54446                 var arr = d.shortcuts;
54447                 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
54448                     arr = ['Y'];
54449                 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
54450                     arr = ['F11'];
54451                 }
54452
54453                 return arr.map(function(s) {
54454                     return {
54455                         shortcut: s,
54456                         separator: d.separator
54457                     };
54458                 });
54459             })
54460             .enter()
54461             .each(function (d, i, nodes) {
54462                 var selection$$1 = d3_select(this);
54463                 var click = d.shortcut.toLowerCase().match(/(.*).click/);
54464
54465                 if (click && click[1]) {
54466                     selection$$1
54467                         .call(svgIcon('#walkthrough-mouse', 'mouseclick', click[1]));
54468                 } else {
54469                     selection$$1
54470                         .append('kbd')
54471                         .attr('class', 'shortcut')
54472                         .text(function (d) {
54473                             var key = d.shortcut;
54474                             return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
54475                         });
54476                 }
54477
54478                 if (i < nodes.length - 1) {
54479                     selection$$1
54480                         .append('span')
54481                         .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
54482                 }
54483             });
54484
54485
54486         shortcutKeys
54487             .filter(function(d) { return d.gesture; })
54488             .each(function () {
54489                 var selection$$1 = d3_select(this);
54490
54491                 selection$$1
54492                     .append('span')
54493                     .text('+');
54494
54495                 selection$$1
54496                     .append('span')
54497                     .attr('class', 'gesture')
54498                     .text(function (d) { return t(d.gesture); });
54499             });
54500
54501
54502         shortcutRows
54503             .append('td')
54504             .attr('class', 'shortcut-desc')
54505             .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
54506
54507
54508         shortcuts = shortcuts
54509             .merge(shortcutsEnter);
54510
54511         // Update
54512         wrapper.selectAll('.shortcut-tab')
54513             .style('display', function (d, i) {
54514                 return i === activeTab ? 'flex' : 'none';
54515             });
54516     }
54517
54518
54519     return function(selection$$1, show) {
54520         savedSelection = selection$$1;
54521         if (show) {
54522             modalSelection = uiModal(selection$$1);
54523             shortcutsModal(modalSelection);
54524         }
54525     };
54526 }
54527
54528 function uiHelp(context) {
54529     var key = t('help.key');
54530
54531     var docKeys = [
54532         'help.help',
54533         'help.editing_saving',
54534         'help.roads',
54535         'help.gps',
54536         'help.imagery',
54537         'help.addresses',
54538         'help.inspector',
54539         'help.buildings',
54540         'help.relations'];
54541
54542     var docs = docKeys.map(function(key) {
54543         var text = t(key);
54544         return {
54545             title: text.split('\n')[0].replace('#', '').trim(),
54546             html: marked(text.split('\n').slice(1).join('\n'))
54547         };
54548     });
54549
54550
54551     function help(selection$$1) {
54552
54553         function hide() {
54554             setVisible(false);
54555         }
54556
54557
54558         function toggle() {
54559             if (event) event.preventDefault();
54560             tooltipBehavior.hide(button);
54561             setVisible(!button.classed('active'));
54562         }
54563
54564
54565         function setVisible(show) {
54566             if (show !== shown) {
54567                 button.classed('active', show);
54568                 shown = show;
54569
54570                 if (show) {
54571                     selection$$1.on('mousedown.help-inside', function() {
54572                         return event.stopPropagation();
54573                     });
54574                     pane.style('display', 'block')
54575                         .style('right', '-500px')
54576                         .transition()
54577                         .duration(200)
54578                         .style('right', '0px');
54579                 } else {
54580                     pane.style('right', '0px')
54581                         .transition()
54582                         .duration(200)
54583                         .style('right', '-500px')
54584                         .on('end', function() {
54585                             d3_select(this).style('display', 'none');
54586                         });
54587                     selection$$1.on('mousedown.help-inside', null);
54588                 }
54589             }
54590         }
54591
54592
54593         function clickHelp(d, i) {
54594             var rtl = (textDirection === 'rtl');
54595             pane.property('scrollTop', 0);
54596             doctitle.html(d.title);
54597
54598             body.html(d.html);
54599             body.selectAll('a')
54600                 .attr('target', '_blank');
54601             menuItems.classed('selected', function(m) {
54602                 return m.title === d.title;
54603             });
54604
54605             nav.html('');
54606             if (rtl) {
54607                 nav.call(drawNext).call(drawPrevious);
54608             } else {
54609                 nav.call(drawPrevious).call(drawNext);
54610             }
54611
54612
54613             function drawNext(selection$$1) {
54614                 if (i < docs.length - 1) {
54615                     var nextLink = selection$$1
54616                         .append('a')
54617                         .attr('class', 'next')
54618                         .on('click', function() {
54619                             clickHelp(docs[i + 1], i + 1);
54620                         });
54621
54622                     nextLink
54623                         .append('span')
54624                         .text(docs[i + 1].title)
54625                         .call(svgIcon((rtl ? '#icon-backward' : '#icon-forward'), 'inline'));
54626                 }
54627             }
54628
54629
54630             function drawPrevious(selection$$1) {
54631                 if (i > 0) {
54632                     var prevLink = selection$$1
54633                         .append('a')
54634                         .attr('class', 'previous')
54635                         .on('click', function() {
54636                             clickHelp(docs[i - 1], i - 1);
54637                         });
54638
54639                     prevLink
54640                         .call(svgIcon((rtl ? '#icon-forward' : '#icon-backward'), 'inline'))
54641                         .append('span')
54642                         .text(docs[i - 1].title);
54643                 }
54644             }
54645         }
54646
54647
54648         function clickWalkthrough() {
54649             if (context.inIntro()) return;
54650             context.container().call(uiIntro(context));
54651             setVisible(false);
54652         }
54653
54654
54655         function clickShortcuts() {
54656             context.container().call(uiShortcuts(context), true);
54657         }
54658
54659
54660         var pane = selection$$1.append('div')
54661                 .attr('class', 'help-wrap map-overlay fillL col5 content hide'),
54662             tooltipBehavior = tooltip()
54663                 .placement((textDirection === 'rtl') ? 'right' : 'left')
54664                 .html(true)
54665                 .title(uiTooltipHtml(t('help.title'), key)),
54666             button = selection$$1.append('button')
54667                 .attr('tabindex', -1)
54668                 .on('click', toggle)
54669                 .call(svgIcon('#icon-help', 'light'))
54670                 .call(tooltipBehavior),
54671             shown = false;
54672
54673
54674         var toc = pane.append('ul')
54675             .attr('class', 'toc');
54676
54677         var menuItems = toc.selectAll('li')
54678             .data(docs)
54679             .enter()
54680             .append('li')
54681             .append('a')
54682             .html(function(d) { return d.title; })
54683             .on('click', clickHelp);
54684
54685         var shortcuts = toc
54686             .append('li')
54687             .attr('class', 'shortcuts')
54688             .call(tooltip()
54689                 .html(true)
54690                 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
54691                 .placement('top')
54692             )
54693             .append('a')
54694             .on('click', clickShortcuts);
54695
54696         shortcuts
54697             .append('div')
54698             .text(t('shortcuts.title'));
54699
54700         var walkthrough = toc
54701             .append('li')
54702             .attr('class', 'walkthrough')
54703             .append('a')
54704             .on('click', clickWalkthrough);
54705
54706         walkthrough
54707             .append('svg')
54708             .attr('class', 'logo logo-walkthrough')
54709             .append('use')
54710             .attr('xlink:href', '#logo-walkthrough');
54711
54712         walkthrough
54713             .append('div')
54714             .text(t('splash.walkthrough'));
54715
54716
54717         var content = pane.append('div')
54718             .attr('class', 'left-content');
54719
54720         var doctitle = content.append('h2')
54721             .text(t('help.title'));
54722
54723         var body = content.append('div')
54724             .attr('class', 'body');
54725
54726         var nav = content.append('div')
54727             .attr('class', 'nav');
54728
54729         clickHelp(docs[0], 0);
54730
54731         var keybinding = d3keybinding('help')
54732             .on(key, toggle)
54733             .on([t('background.key'), t('map_data.key')], hide);
54734
54735         d3_select(document)
54736             .call(keybinding);
54737
54738         context.surface().on('mousedown.help-outside', hide);
54739         context.container().on('mousedown.help-outside', hide);
54740     }
54741
54742     return help;
54743 }
54744
54745 function uiPanelBackground(context) {
54746     var background = context.background();
54747     var currSourceName = null;
54748     var metadata = {};
54749     var metadataKeys = [
54750         'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
54751     ];
54752
54753     var debouncedRedraw = debounce$1(redraw, 250);
54754
54755     function redraw(selection$$1) {
54756         if (currSourceName !== background.baseLayerSource().name()) {
54757             currSourceName = background.baseLayerSource().name();
54758             metadata = {};
54759         }
54760
54761         selection$$1.html('');
54762
54763         var list = selection$$1
54764             .append('ul')
54765             .attr('class', 'background-info');
54766
54767         list
54768             .append('li')
54769             .text(currSourceName);
54770
54771         metadataKeys.forEach(function(k) {
54772             list
54773                 .append('li')
54774                 .attr('class', 'background-info-list-' + k)
54775                 .classed('hide', !metadata[k])
54776                 .text(t('info_panels.background.' + k) + ': ')
54777                 .append('span')
54778                 .attr('class', 'background-info-span-' + k)
54779                 .text(metadata[k]);
54780         });
54781
54782         debouncedGetMetadata(selection$$1);
54783
54784         var toggle = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
54785
54786         selection$$1
54787             .append('a')
54788             .text(t('info_panels.background.' + toggle))
54789             .attr('href', '#')
54790             .attr('class', 'button button-toggle-tiles')
54791             .on('click', function() {
54792                 event.preventDefault();
54793                 context.setDebug('tile', !context.getDebug('tile'));
54794                 selection$$1.call(redraw);
54795             });
54796     }
54797
54798
54799     var debouncedGetMetadata = debounce$1(getMetadata, 250);
54800
54801     function getMetadata(selection$$1) {
54802         var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
54803         if (tile.empty()) return;
54804
54805         var sourceName = currSourceName,
54806             d = tile.datum(),
54807             zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
54808             center = context.map().center();
54809
54810         // update zoom
54811         metadata.zoom = String(zoom);
54812         selection$$1.selectAll('.background-info-list-zoom')
54813             .classed('hide', false)
54814             .selectAll('.background-info-span-zoom')
54815             .text(metadata.zoom);
54816
54817         if (!d || !d.length >= 3) return;
54818
54819         background.baseLayerSource().getMetadata(center, d, function(err, result) {
54820             if (err || currSourceName !== sourceName) return;
54821
54822             // update vintage
54823             var vintage = result.vintage;
54824             metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
54825             selection$$1.selectAll('.background-info-list-vintage')
54826                 .classed('hide', false)
54827                 .selectAll('.background-info-span-vintage')
54828                 .text(metadata.vintage);
54829
54830             // update other metdata
54831             without(metadataKeys, 'zoom', 'vintage')
54832                 .forEach(function(k) {
54833                     var val = result[k];
54834                     metadata[k] = val;
54835                     selection$$1.selectAll('.background-info-list-' + k)
54836                         .classed('hide', !val)
54837                         .selectAll('.background-info-span-' + k)
54838                         .text(val);
54839                 });
54840         });
54841     }
54842
54843
54844     var panel = function(selection$$1) {
54845         selection$$1.call(redraw);
54846
54847         context.map()
54848             .on('drawn.info-background', function() {
54849                 selection$$1.call(debouncedRedraw);
54850             })
54851             .on('move.info-background', function() {
54852                 selection$$1.call(debouncedGetMetadata);
54853             });
54854
54855     };
54856
54857     panel.off = function() {
54858         context.map()
54859             .on('drawn.info-background', null)
54860             .on('move.info-background', null);
54861     };
54862
54863     panel.id = 'background';
54864     panel.title = t('info_panels.background.title');
54865     panel.key = t('info_panels.background.key');
54866
54867
54868     return panel;
54869 }
54870
54871 function uiPanelHistory(context) {
54872     var osm;
54873
54874     function displayTimestamp(entity) {
54875         if (!entity.timestamp) return t('info_panels.history.unknown');
54876
54877         var d = new Date(entity.timestamp);
54878         if (isNaN(d.getTime())) return t('info_panels.history.unknown');
54879
54880         return d.toLocaleString();
54881     }
54882
54883
54884     function displayUser(selection, entity) {
54885         if (!entity.user) {
54886             selection
54887                 .append('span')
54888                 .text(t('info_panels.history.unknown'));
54889             return;
54890         }
54891
54892         selection
54893             .append('span')
54894             .attr('class', 'user-name')
54895             .text(entity.user);
54896
54897         var links = selection
54898             .append('div')
54899             .attr('class', 'links');
54900
54901         if (osm) {
54902             links
54903                 .append('a')
54904                 .attr('class', 'user-osm-link')
54905                 .attr('href', osm.userURL(entity.user))
54906                 .attr('target', '_blank')
54907                 .attr('tabindex', -1)
54908                 .text('OSM');
54909         }
54910
54911         links
54912             .append('a')
54913             .attr('class', 'user-hdyc-link')
54914             .attr('href', 'https://hdyc.neis-one.org/?' + entity.user)
54915             .attr('target', '_blank')
54916             .attr('tabindex', -1)
54917             .text('HDYC');
54918     }
54919
54920
54921     function displayChangeset(selection, entity) {
54922         if (!entity.changeset) {
54923             selection
54924                 .append('span')
54925                 .text(t('info_panels.history.unknown'));
54926             return;
54927         }
54928
54929         selection
54930             .append('span')
54931             .attr('class', 'changeset-id')
54932             .text(entity.changeset);
54933
54934         var links = selection
54935             .append('div')
54936             .attr('class', 'links');
54937
54938         if (osm) {
54939             links
54940                 .append('a')
54941                 .attr('class', 'changeset-osm-link')
54942                 .attr('href', osm.changesetURL(entity.changeset))
54943                 .attr('target', '_blank')
54944                 .attr('tabindex', -1)
54945                 .text('OSM');
54946         }
54947
54948         links
54949             .append('a')
54950             .attr('class', 'changeset-osmcha-link')
54951             .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset)
54952             .attr('target', '_blank')
54953             .attr('tabindex', -1)
54954             .text('OSMCha');
54955     }
54956
54957
54958     function redraw(selection) {
54959         var selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
54960             singular = selected.length === 1 ? selected[0] : null;
54961
54962         osm = context.connection();
54963
54964         selection.html('');
54965
54966         selection
54967             .append('h4')
54968             .attr('class', 'history-heading')
54969             .text(singular || t('info_panels.history.selected', { n: selected.length }));
54970
54971         if (!singular) return;
54972
54973         var entity = context.entity(singular);
54974
54975         var list = selection
54976             .append('ul');
54977
54978         list
54979             .append('li')
54980             .text(t('info_panels.history.version') + ': ' + entity.version);
54981
54982         list
54983             .append('li')
54984             .text(t('info_panels.history.last_edit') + ': ' + displayTimestamp(entity));
54985
54986         list
54987             .append('li')
54988             .text(t('info_panels.history.edited_by') + ': ')
54989             .call(displayUser, entity);
54990
54991         list
54992             .append('li')
54993             .text(t('info_panels.history.changeset') + ': ')
54994             .call(displayChangeset, entity);
54995
54996         if (osm) {
54997             selection
54998                 .append('a')
54999                 .attr('class', 'view-history-on-osm')
55000                 .attr('target', '_blank')
55001                 .attr('tabindex', -1)
55002                 .attr('href', osm.historyURL(entity))
55003                 .call(svgIcon('#icon-out-link', 'inline'))
55004                 .append('span')
55005                 .text(t('info_panels.history.link_text'));
55006         }
55007     }
55008
55009
55010     var panel = function(selection) {
55011         selection.call(redraw);
55012
55013         context.map()
55014             .on('drawn.info-history', function() {
55015                 selection.call(redraw);
55016             });
55017     };
55018
55019     panel.off = function() {
55020         context.map()
55021             .on('drawn.info-history', null);
55022     };
55023
55024     panel.id = 'history';
55025     panel.title = t('info_panels.history.title');
55026     panel.key = t('info_panels.history.key');
55027
55028
55029     return panel;
55030 }
55031
55032 function uiPanelLocation(context) {
55033     var currLocation = '';
55034     var OSM_PRECISION = 7;
55035
55036
55037     function wrap(x, min, max) {
55038         var d = max - min;
55039         return ((x - min) % d + d) % d + min;
55040     }
55041
55042
55043     function clamp(x, min, max) {
55044         return Math.max(min, Math.min(x, max));
55045     }
55046
55047
55048     function redraw(selection) {
55049         selection.html('');
55050
55051         var list = selection
55052             .append('ul');
55053
55054         // Mouse coordinates
55055         var coord = context.map().mouseCoordinates();
55056         if (coord.some(isNaN)) {
55057             coord = context.map().center();
55058         }
55059
55060         var coordStr =
55061             clamp(coord[1], -90, 90).toFixed(OSM_PRECISION) + ', ' +
55062             wrap(coord[0], -180, 180).toFixed(OSM_PRECISION);
55063
55064         list
55065             .append('li')
55066             .text(coordStr);
55067
55068         // Location Info
55069         selection
55070             .append('div')
55071             .attr('class', 'location-info')
55072             .text(currLocation || ' ');
55073
55074         debouncedGetLocation(selection, coord);
55075     }
55076
55077
55078     var debouncedGetLocation = debounce$1(getLocation, 250);
55079     function getLocation(selection, coord) {
55080         if (!services.geocoder) {
55081             currLocation = t('info_panels.location.unknown_location');
55082             selection.selectAll('.location-info')
55083                 .text(currLocation);
55084         } else {
55085             services.geocoder.reverse(coord, function(err, result) {
55086                 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
55087                 selection.selectAll('.location-info')
55088                     .text(currLocation);
55089             });
55090         }
55091     }
55092
55093
55094     var panel = function(selection) {
55095         selection.call(redraw);
55096
55097         context.surface()
55098             .on('mousemove.info-location', function() {
55099                 selection.call(redraw);
55100             });
55101     };
55102
55103     panel.off = function() {
55104         context.surface()
55105             .on('mousemove.info-location', null);
55106     };
55107
55108     panel.id = 'location';
55109     panel.title = t('info_panels.location.title');
55110     panel.key = t('info_panels.location.key');
55111
55112
55113     return panel;
55114 }
55115
55116 function uiPanelMeasurement(context) {
55117     var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
55118     var OSM_PRECISION = 7;
55119
55120
55121     function radiansToMeters(r) {
55122         // using WGS84 authalic radius (6371007.1809 m)
55123         return r * 6371007.1809;
55124     }
55125
55126     function steradiansToSqmeters(r) {
55127         // http://gis.stackexchange.com/a/124857/40446
55128         return r / (4 * Math.PI) * 510065621724000;
55129     }
55130
55131
55132     function toLineString(feature) {
55133         if (feature.type === 'LineString') return feature;
55134
55135         var result = { type: 'LineString', coordinates: [] };
55136         if (feature.type === 'Polygon') {
55137             result.coordinates = feature.coordinates[0];
55138         } else if (feature.type === 'MultiPolygon') {
55139             result.coordinates = feature.coordinates[0][0];
55140         }
55141
55142         return result;
55143     }
55144
55145
55146     function displayLength(m) {
55147         var d = m * (isImperial ? 3.28084 : 1),
55148             p, unit;
55149
55150         if (isImperial) {
55151             if (d >= 5280) {
55152                 d /= 5280;
55153                 unit = 'mi';
55154             } else {
55155                 unit = 'ft';
55156             }
55157         } else {
55158             if (d >= 1000) {
55159                 d /= 1000;
55160                 unit = 'km';
55161             } else {
55162                 unit = 'm';
55163             }
55164         }
55165
55166         // drop unnecessary precision
55167         p = d > 1000 ? 0 : d > 100 ? 1 : 2;
55168
55169         return String(d.toFixed(p)) + ' ' + unit;
55170     }
55171
55172
55173     function displayArea(m2) {
55174         var d = m2 * (isImperial ? 10.7639111056 : 1),
55175             d1, d2, p1, p2, unit1, unit2;
55176
55177         if (isImperial) {
55178             if (d >= 6969600) {     // > 0.25mi² show mi²
55179                 d1 = d / 27878400;
55180                 unit1 = 'mi²';
55181             } else {
55182                 d1 = d;
55183                 unit1 = 'ft²';
55184             }
55185
55186             if (d > 4356 && d < 43560000) {   // 0.1 - 1000 acres
55187                 d2 = d / 43560;
55188                 unit2 = 'ac';
55189             }
55190
55191         } else {
55192             if (d >= 250000) {    // > 0.25km² show km²
55193                 d1 = d / 1000000;
55194                 unit1 = 'km²';
55195             } else {
55196                 d1 = d;
55197                 unit1 = 'm²';
55198             }
55199
55200             if (d > 1000 && d < 10000000) {   // 0.1 - 1000 hectares
55201                 d2 = d / 10000;
55202                 unit2 = 'ha';
55203             }
55204         }
55205
55206         // drop unnecessary precision
55207         p1 = d1 > 1000 ? 0 : d1 > 100 ? 1 : 2;
55208         p2 = d2 > 1000 ? 0 : d2 > 100 ? 1 : 2;
55209
55210         return String(d1.toFixed(p1)) + ' ' + unit1 +
55211             (d2 ? ' (' + String(d2.toFixed(p2)) + ' ' + unit2 + ')' : '');
55212     }
55213
55214
55215     function redraw(selection$$1) {
55216         var resolver = context.graph(),
55217             selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
55218             singular = selected.length === 1 ? selected[0] : null,
55219             extent = geoExtent$$1(),
55220             entity;
55221
55222         selection$$1.html('');
55223
55224         selection$$1
55225             .append('h4')
55226             .attr('class', 'measurement-heading')
55227             .text(singular || t('info_panels.measurement.selected', { n: selected.length }));
55228
55229         if (!selected.length) return;
55230
55231         var center;
55232         for (var i = 0; i < selected.length; i++) {
55233             entity = context.entity(selected[i]);
55234             extent._extend(entity.extent(resolver));
55235         }
55236         center = extent.center();
55237
55238
55239         var list = selection$$1
55240             .append('ul');
55241
55242         // multiple features, just display extent center..
55243         if (!singular) {
55244             list
55245                 .append('li')
55246                 .text(t('info_panels.measurement.center') + ': ' +
55247                     center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
55248                 );
55249             return;
55250         }
55251
55252         // single feature, display details..
55253         if (!entity) return;
55254         var geometry = entity.geometry(resolver);
55255
55256         if (geometry === 'line' || geometry === 'area') {
55257             var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
55258                 feature = entity.asGeoJSON(resolver),
55259                 length = radiansToMeters(d3_geoLength(toLineString(feature))),
55260                 lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')),
55261                 centroid = d3_geoCentroid(feature);
55262
55263             list
55264                 .append('li')
55265                 .text(t('info_panels.measurement.geometry') + ': ' +
55266                     (closed ? t('info_panels.measurement.closed') + ' ' : '') + t('geometry.' + geometry) );
55267
55268             if (closed) {
55269                 var area = steradiansToSqmeters(entity.area(resolver));
55270                 list
55271                     .append('li')
55272                     .text(t('info_panels.measurement.area') + ': ' + displayArea(area));
55273             }
55274
55275             list
55276                 .append('li')
55277                 .text(lengthLabel + ': ' + displayLength(length));
55278
55279             list
55280                 .append('li')
55281                 .text(t('info_panels.measurement.centroid') + ': ' +
55282                     centroid[1].toFixed(OSM_PRECISION) + ', ' + centroid[0].toFixed(OSM_PRECISION)
55283                 );
55284
55285
55286             var toggle  = isImperial ? 'imperial' : 'metric';
55287
55288             selection$$1
55289                 .append('a')
55290                 .text(t('info_panels.measurement.' + toggle))
55291                 .attr('href', '#')
55292                 .attr('class', 'button button-toggle-units')
55293                 .on('click', function() {
55294                     event.preventDefault();
55295                     isImperial = !isImperial;
55296                     selection$$1.call(redraw);
55297                 });
55298
55299         } else {
55300             var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center'));
55301
55302             list
55303                 .append('li')
55304                 .text(t('info_panels.measurement.geometry') + ': ' + t('geometry.' + geometry));
55305
55306             list
55307                 .append('li')
55308                 .text(centerLabel + ': ' +
55309                     center[1].toFixed(OSM_PRECISION) + ', ' + center[0].toFixed(OSM_PRECISION)
55310                 );
55311         }
55312     }
55313
55314
55315     var panel = function(selection$$1) {
55316         selection$$1.call(redraw);
55317
55318         context.map()
55319             .on('drawn.info-measurement', function() {
55320                 selection$$1.call(redraw);
55321             });
55322     };
55323
55324     panel.off = function() {
55325         context.map()
55326             .on('drawn.info-measurement', null);
55327     };
55328
55329     panel.id = 'measurement';
55330     panel.title = t('info_panels.measurement.title');
55331     panel.key = t('info_panels.measurement.key');
55332
55333
55334     return panel;
55335 }
55336
55337 var uiInfoPanels = {
55338     background: uiPanelBackground,
55339     history: uiPanelHistory,
55340     location: uiPanelLocation,
55341     measurement: uiPanelMeasurement,
55342 };
55343
55344 function uiInfo(context) {
55345     var ids = Object.keys(uiInfoPanels),
55346         wasActive = ['measurement'],
55347         panels = {},
55348         active = {};
55349
55350     // create panels
55351     ids.forEach(function(k) {
55352         if (!panels[k]) {
55353             panels[k] = uiInfoPanels[k](context);
55354             active[k] = false;
55355         }
55356     });
55357
55358
55359     function info(selection$$1) {
55360
55361         function redraw() {
55362             var activeids = ids.filter(function(k) { return active[k]; }).sort();
55363
55364             var containers = infoPanels.selectAll('.panel-container')
55365                 .data(activeids, function(k) { return k; });
55366
55367             containers.exit()
55368                 .style('opacity', 1)
55369                 .transition()
55370                 .duration(200)
55371                 .style('opacity', 0)
55372                 .on('end', function(d) {
55373                     d3_select(this)
55374                         .call(panels[d].off)
55375                         .remove();
55376                 });
55377
55378             var enter = containers.enter()
55379                 .append('div')
55380                 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
55381
55382             enter
55383                 .style('opacity', 0)
55384                 .transition()
55385                 .duration(200)
55386                 .style('opacity', 1);
55387
55388             var title = enter
55389                 .append('div')
55390                 .attr('class', 'panel-title fillD2');
55391
55392             title
55393                 .append('h3')
55394                 .text(function(d) { return panels[d].title; });
55395
55396             title
55397                 .append('button')
55398                 .attr('class', 'close')
55399                 .on('click', function (d) { toggle(d); })
55400                 .call(svgIcon('#icon-close'));
55401
55402             enter
55403                 .append('div')
55404                 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
55405
55406
55407             // redraw the panels
55408             infoPanels.selectAll('.panel-content')
55409                 .each(function(d) {
55410                     d3_select(this).call(panels[d]);
55411                 });
55412         }
55413
55414
55415         function toggle(which) {
55416             if (event) {
55417                 event.stopImmediatePropagation();
55418                 event.preventDefault();
55419             }
55420
55421             var activeids = ids.filter(function(k) { return active[k]; });
55422
55423             if (which) {  // toggle one
55424                 active[which] = !active[which];
55425                 if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
55426                     wasActive = [which];
55427                 }
55428             } else {      // toggle all
55429                 if (activeids.length) {
55430                     wasActive = activeids;
55431                     activeids.forEach(function(k) { active[k] = false; });
55432                 } else {
55433                     wasActive.forEach(function(k) { active[k] = true; });
55434                 }
55435             }
55436
55437             redraw();
55438         }
55439
55440
55441         var infoPanels = selection$$1.selectAll('.info-panels')
55442             .data([0]);
55443
55444         infoPanels = infoPanels.enter()
55445             .append('div')
55446             .attr('class', 'info-panels')
55447             .merge(infoPanels);
55448
55449         redraw();
55450
55451         var keybinding = d3keybinding('info')
55452             .on(uiCmd('⌘' + t('info_panels.key')), toggle);
55453
55454         ids.forEach(function(k) {
55455             var key = t('info_panels.' + k + '.key', { default: null });
55456             if (!key) return;
55457             keybinding
55458                 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
55459         });
55460
55461         d3_select(document)
55462             .call(keybinding);
55463     }
55464
55465     return info;
55466 }
55467
55468 function uiMapData(context) {
55469     var key = t('map_data.key'),
55470         features = context.features().keys(),
55471         layers = context.layers(),
55472         fills = ['wireframe', 'partial', 'full'],
55473         fillDefault = context.storage('area-fill') || 'partial',
55474         fillSelected = fillDefault;
55475
55476
55477     function map_data(selection$$1) {
55478
55479         function showsFeature(d) {
55480             return context.features().enabled(d);
55481         }
55482
55483
55484         function autoHiddenFeature(d) {
55485             return context.features().autoHidden(d);
55486         }
55487
55488
55489         function clickFeature(d) {
55490             context.features().toggle(d);
55491             update();
55492         }
55493
55494
55495         function showsFill(d) {
55496             return fillSelected === d;
55497         }
55498
55499
55500         function setFill(d) {
55501             fills.forEach(function(opt) {
55502                 context.surface().classed('fill-' + opt, Boolean(opt === d));
55503             });
55504
55505             fillSelected = d;
55506             if (d !== 'wireframe') {
55507                 fillDefault = d;
55508                 context.storage('area-fill', d);
55509             }
55510             update();
55511         }
55512
55513
55514         function showsLayer(which) {
55515             var layer = layers.layer(which);
55516             if (layer) {
55517                 return layer.enabled();
55518             }
55519             return false;
55520         }
55521
55522
55523         function setLayer(which, enabled) {
55524             var layer = layers.layer(which);
55525             if (layer) {
55526                 layer.enabled(enabled);
55527                 update();
55528             }
55529         }
55530
55531
55532         function toggleLayer(which) {
55533             setLayer(which, !showsLayer(which));
55534         }
55535
55536
55537         function clickMapillaryImages() {
55538             toggleLayer('mapillary-images');
55539             if (!showsLayer('mapillary-images')) {
55540                 setLayer('mapillary-signs', false);
55541             }
55542         }
55543
55544
55545         function clickMapillarySigns() {
55546             toggleLayer('mapillary-signs');
55547         }
55548
55549
55550         function drawMapillaryItems(selection$$1) {
55551             var mapillaryImages = layers.layer('mapillary-images'),
55552                 mapillarySigns = layers.layer('mapillary-signs'),
55553                 supportsMapillaryImages = mapillaryImages && mapillaryImages.supported(),
55554                 supportsMapillarySigns = mapillarySigns && mapillarySigns.supported(),
55555                 showsMapillaryImages = supportsMapillaryImages && mapillaryImages.enabled(),
55556                 showsMapillarySigns = supportsMapillarySigns && mapillarySigns.enabled();
55557
55558             var mapillaryList = selection$$1
55559                 .selectAll('.layer-list-mapillary')
55560                 .data([0]);
55561
55562             mapillaryList = mapillaryList.enter()
55563                 .append('ul')
55564                 .attr('class', 'layer-list layer-list-mapillary')
55565                 .merge(mapillaryList);
55566
55567
55568             var mapillaryImageLayerItem = mapillaryList
55569                 .selectAll('.list-item-mapillary-images')
55570                 .data(supportsMapillaryImages ? [0] : []);
55571
55572             mapillaryImageLayerItem.exit()
55573                 .remove();
55574
55575             var enterImages = mapillaryImageLayerItem.enter()
55576                 .append('li')
55577                 .attr('class', 'list-item-mapillary-images');
55578
55579             var labelImages = enterImages
55580                 .append('label')
55581                 .call(tooltip()
55582                     .title(t('mapillary_images.tooltip'))
55583                     .placement('top'));
55584
55585             labelImages
55586                 .append('input')
55587                 .attr('type', 'checkbox')
55588                 .on('change', clickMapillaryImages);
55589
55590             labelImages
55591                 .append('span')
55592                 .text(t('mapillary_images.title'));
55593
55594
55595             var mapillarySignLayerItem = mapillaryList
55596                 .selectAll('.list-item-mapillary-signs')
55597                 .data(supportsMapillarySigns ? [0] : []);
55598
55599             mapillarySignLayerItem.exit()
55600                 .remove();
55601
55602             var enterSigns = mapillarySignLayerItem.enter()
55603                 .append('li')
55604                 .attr('class', 'list-item-mapillary-signs');
55605
55606             var labelSigns = enterSigns
55607                 .append('label')
55608                 .call(tooltip()
55609                     .title(t('mapillary_signs.tooltip'))
55610                     .placement('top'));
55611
55612             labelSigns
55613                 .append('input')
55614                 .attr('type', 'checkbox')
55615                 .on('change', clickMapillarySigns);
55616
55617             labelSigns
55618                 .append('span')
55619                 .text(t('mapillary_signs.title'));
55620
55621
55622             // Updates
55623             mapillaryImageLayerItem = mapillaryImageLayerItem
55624                 .merge(enterImages);
55625
55626             mapillaryImageLayerItem
55627                 .classed('active', showsMapillaryImages)
55628                 .selectAll('input')
55629                 .property('checked', showsMapillaryImages);
55630
55631
55632             mapillarySignLayerItem = mapillarySignLayerItem
55633                 .merge(enterSigns);
55634
55635             mapillarySignLayerItem
55636                 .classed('active', showsMapillarySigns)
55637                 .selectAll('input')
55638                 .property('disabled', !showsMapillaryImages)
55639                 .property('checked', showsMapillarySigns);
55640
55641             mapillarySignLayerItem
55642                 .selectAll('label')
55643                 .classed('deemphasize', !showsMapillaryImages);
55644         }
55645
55646
55647         function drawOsmItem(selection$$1) {
55648             var osm = layers.layer('osm'),
55649                 showsOsm = osm.enabled();
55650
55651             var ul = selection$$1
55652                 .selectAll('.layer-list-osm')
55653                 .data(osm ? [0] : []);
55654
55655             // Exit
55656             ul.exit()
55657                 .remove();
55658
55659             // Enter
55660             var ulEnter = ul.enter()
55661                 .append('ul')
55662                 .attr('class', 'layer-list layer-list-osm');
55663
55664             var liEnter = ulEnter
55665                 .append('li')
55666                 .attr('class', 'list-item-osm');
55667
55668             var labelEnter = liEnter
55669                 .append('label')
55670                 .call(tooltip()
55671                     .title(t('map_data.layers.osm.tooltip'))
55672                     .placement('top')
55673                 );
55674
55675             labelEnter
55676                 .append('input')
55677                 .attr('type', 'checkbox')
55678                 .on('change', function() { toggleLayer('osm'); });
55679
55680             labelEnter
55681                 .append('span')
55682                 .text(t('map_data.layers.osm.title'));
55683
55684             // Update
55685             ul = ul
55686                 .merge(ulEnter);
55687
55688             ul.selectAll('.list-item-osm')
55689                 .classed('active', showsOsm)
55690                 .selectAll('input')
55691                 .property('checked', showsOsm);
55692         }
55693
55694
55695         function drawGpxItem(selection$$1) {
55696             var gpx = layers.layer('gpx'),
55697                 hasGpx = gpx && gpx.hasGpx(),
55698                 showsGpx = hasGpx && gpx.enabled();
55699
55700             var ul = selection$$1
55701                 .selectAll('.layer-list-gpx')
55702                 .data(gpx ? [0] : []);
55703
55704             // Exit
55705             ul.exit()
55706                 .remove();
55707
55708             // Enter
55709             var ulEnter = ul.enter()
55710                 .append('ul')
55711                 .attr('class', 'layer-list layer-list-gpx');
55712
55713             var liEnter = ulEnter
55714                 .append('li')
55715                 .attr('class', 'list-item-gpx');
55716
55717             liEnter
55718                 .append('button')
55719                 .attr('class', 'list-item-gpx-extent')
55720                 .call(tooltip()
55721                     .title(t('gpx.zoom'))
55722                     .placement((textDirection === 'rtl') ? 'right' : 'left'))
55723                 .on('click', function() {
55724                     event.preventDefault();
55725                     event.stopPropagation();
55726                     gpx.fitZoom();
55727                 })
55728                 .call(svgIcon('#icon-search'));
55729
55730             liEnter
55731                 .append('button')
55732                 .attr('class', 'list-item-gpx-browse')
55733                 .call(tooltip()
55734                     .title(t('gpx.browse'))
55735                     .placement((textDirection === 'rtl') ? 'right' : 'left')
55736                 )
55737                 .on('click', function() {
55738                     d3_select(document.createElement('input'))
55739                         .attr('type', 'file')
55740                         .on('change', function() {
55741                             gpx.files(event.target.files);
55742                         })
55743                         .node().click();
55744                 })
55745                 .call(svgIcon('#icon-geolocate'));
55746
55747             var labelEnter = liEnter
55748                 .append('label')
55749                 .call(tooltip()
55750                     .title(t('gpx.drag_drop'))
55751                     .placement('top')
55752                 );
55753
55754             labelEnter
55755                 .append('input')
55756                 .attr('type', 'checkbox')
55757                 .on('change', function() { toggleLayer('gpx'); });
55758
55759             labelEnter
55760                 .append('span')
55761                 .text(t('gpx.local_layer'));
55762
55763             // Update
55764             ul = ul
55765                 .merge(ulEnter);
55766
55767             ul.selectAll('.list-item-gpx')
55768                 .classed('active', showsGpx)
55769                 .selectAll('label')
55770                 .classed('deemphasize', !hasGpx)
55771                 .selectAll('input')
55772                 .property('disabled', !hasGpx)
55773                 .property('checked', showsGpx);
55774         }
55775
55776
55777         function drawList(selection$$1, data, type, name, change, active) {
55778             var items = selection$$1.selectAll('li')
55779                 .data(data);
55780
55781             // Exit
55782             items.exit()
55783                 .remove();
55784
55785             // Enter
55786             var enter = items.enter()
55787                 .append('li')
55788                 .attr('class', 'layer')
55789                 .call(tooltip()
55790                     .html(true)
55791                     .title(function(d) {
55792                         var tip = t(name + '.' + d + '.tooltip'),
55793                             key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
55794
55795                         if (name === 'feature' && autoHiddenFeature(d)) {
55796                             var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
55797                             tip += '<div>' + msg + '</div>';
55798                         }
55799                         return uiTooltipHtml(tip, key);
55800                     })
55801                     .placement('top')
55802                 );
55803
55804             var label = enter
55805                 .append('label');
55806
55807             label
55808                 .append('input')
55809                 .attr('type', type)
55810                 .attr('name', name)
55811                 .on('change', change);
55812
55813             label
55814                 .append('span')
55815                 .text(function(d) { return t(name + '.' + d + '.description'); });
55816
55817             // Update
55818             items = items
55819                 .merge(enter);
55820
55821             items
55822                 .classed('active', active)
55823                 .selectAll('input')
55824                 .property('checked', active)
55825                 .property('indeterminate', function(d) {
55826                     return (name === 'feature' && autoHiddenFeature(d));
55827                 });
55828         }
55829
55830
55831         function update() {
55832             dataLayerContainer
55833                 .call(drawOsmItem)
55834                 .call(drawMapillaryItems)
55835                 .call(drawGpxItem);
55836
55837             fillList
55838                 .call(drawList, fills, 'radio', 'area_fill', setFill, showsFill);
55839
55840             featureList
55841                 .call(drawList, features, 'checkbox', 'feature', clickFeature, showsFeature);
55842         }
55843
55844
55845         function hidePanel() {
55846             setVisible(false);
55847         }
55848
55849
55850         function togglePanel() {
55851             if (event) event.preventDefault();
55852             tooltipBehavior.hide(button);
55853             setVisible(!button.classed('active'));
55854         }
55855
55856
55857         function toggleWireframe() {
55858             if (event) {
55859                 event.preventDefault();
55860                 event.stopPropagation();
55861             }
55862             setFill((fillSelected === 'wireframe' ? fillDefault : 'wireframe'));
55863             context.map().pan([0,0]);  // trigger a redraw
55864         }
55865
55866
55867         function setVisible(show) {
55868             if (show !== shown) {
55869                 button.classed('active', show);
55870                 shown = show;
55871
55872                 if (show) {
55873                     update();
55874                     selection$$1.on('mousedown.map_data-inside', function() {
55875                         return event.stopPropagation();
55876                     });
55877                     content.style('display', 'block')
55878                         .style('right', '-300px')
55879                         .transition()
55880                         .duration(200)
55881                         .style('right', '0px');
55882                 } else {
55883                     content.style('display', 'block')
55884                         .style('right', '0px')
55885                         .transition()
55886                         .duration(200)
55887                         .style('right', '-300px')
55888                         .on('end', function() {
55889                             d3_select(this).style('display', 'none');
55890                         });
55891                     selection$$1.on('mousedown.map_data-inside', null);
55892                 }
55893             }
55894         }
55895
55896
55897         var content = selection$$1
55898                 .append('div')
55899                 .attr('class', 'fillL map-overlay col3 content hide'),
55900             tooltipBehavior = tooltip()
55901                 .placement((textDirection === 'rtl') ? 'right' : 'left')
55902                 .html(true)
55903                 .title(uiTooltipHtml(t('map_data.description'), key)),
55904             button = selection$$1
55905                 .append('button')
55906                 .attr('tabindex', -1)
55907                 .on('click', togglePanel)
55908                 .call(svgIcon('#icon-data', 'light'))
55909                 .call(tooltipBehavior),
55910             shown = false;
55911
55912         content
55913             .append('h4')
55914             .text(t('map_data.title'));
55915
55916
55917         // data layers
55918         content
55919             .append('a')
55920             .text(t('map_data.data_layers'))
55921             .attr('href', '#')
55922             .classed('hide-toggle', true)
55923             .classed('expanded', true)
55924             .on('click', function() {
55925                 var exp = d3_select(this).classed('expanded');
55926                 dataLayerContainer.style('display', exp ? 'none' : 'block');
55927                 d3_select(this).classed('expanded', !exp);
55928                 event.preventDefault();
55929             });
55930
55931         var dataLayerContainer = content
55932             .append('div')
55933             .attr('class', 'data-data-layers')
55934             .style('display', 'block');
55935
55936
55937         // area fills
55938         content
55939             .append('a')
55940             .text(t('map_data.fill_area'))
55941             .attr('href', '#')
55942             .classed('hide-toggle', true)
55943             .classed('expanded', false)
55944             .on('click', function() {
55945                 var exp = d3_select(this).classed('expanded');
55946                 fillContainer.style('display', exp ? 'none' : 'block');
55947                 d3_select(this).classed('expanded', !exp);
55948                 event.preventDefault();
55949             });
55950
55951         var fillContainer = content
55952             .append('div')
55953             .attr('class', 'data-area-fills')
55954             .style('display', 'none');
55955
55956         var fillList = fillContainer
55957             .append('ul')
55958             .attr('class', 'layer-list layer-fill-list');
55959
55960
55961         // feature filters
55962         content
55963             .append('a')
55964             .text(t('map_data.map_features'))
55965             .attr('href', '#')
55966             .classed('hide-toggle', true)
55967             .classed('expanded', false)
55968             .on('click', function() {
55969                 var exp = d3_select(this).classed('expanded');
55970                 featureContainer.style('display', exp ? 'none' : 'block');
55971                 d3_select(this).classed('expanded', !exp);
55972                 event.preventDefault();
55973             });
55974
55975         var featureContainer = content
55976             .append('div')
55977             .attr('class', 'data-feature-filters')
55978             .style('display', 'none');
55979
55980         var featureList = featureContainer
55981             .append('ul')
55982             .attr('class', 'layer-list layer-feature-list');
55983
55984
55985         context.features()
55986             .on('change.map_data-update', update);
55987
55988         setFill(fillDefault);
55989
55990         var keybinding = d3keybinding('features')
55991             .on(key, togglePanel)
55992             .on(t('area_fill.wireframe.key'), toggleWireframe)
55993             .on([t('background.key'), t('help.key')], hidePanel);
55994
55995         d3_select(document)
55996             .call(keybinding);
55997
55998         context.surface().on('mousedown.map_data-outside', hidePanel);
55999         context.container().on('mousedown.map_data-outside', hidePanel);
56000     }
56001
56002
56003     return map_data;
56004 }
56005
56006 function uiModes(context) {
56007     var modes = [
56008         modeAddPoint$$1(context),
56009         modeAddLine$$1(context),
56010         modeAddArea$$1(context)
56011     ];
56012
56013
56014     function editable() {
56015         return context.editable() && context.mode().id !== 'save';
56016     }
56017
56018
56019     return function(selection$$1) {
56020         var buttons = selection$$1.selectAll('button.add-button')
56021             .data(modes);
56022
56023         buttons = buttons.enter()
56024             .append('button')
56025             .attr('tabindex', -1)
56026             .attr('class', function(mode) { return mode.id + ' add-button col4'; })
56027             .on('click.mode-buttons', function(mode) {
56028                 // When drawing, ignore accidental clicks on mode buttons - #4042
56029                 var currMode = context.mode().id;
56030                 if (currMode.match(/^draw/) !== null) return;
56031
56032                 if (mode.id === currMode) {
56033                     context.enter(modeBrowse(context));
56034                 } else {
56035                     context.enter(mode);
56036                 }
56037             })
56038             .call(tooltip()
56039                 .placement('bottom')
56040                 .html(true)
56041                 .title(function(mode) {
56042                     return uiTooltipHtml(mode.description, mode.key);
56043                 })
56044             );
56045
56046         buttons
56047             .each(function(d) {
56048                 d3_select(this)
56049                     .call(svgIcon('#icon-' + d.button, 'pre-text'));
56050             });
56051
56052         buttons
56053             .append('span')
56054             .attr('class', 'label')
56055             .text(function(mode) { return mode.title; });
56056
56057         context
56058             .on('enter.editor', function(entered) {
56059                 selection$$1.selectAll('button.add-button')
56060                     .classed('active', function(mode) { return entered.button === mode.button; });
56061                 context.container()
56062                     .classed('mode-' + entered.id, true);
56063             });
56064
56065         context
56066             .on('exit.editor', function(exited) {
56067                 context.container()
56068                     .classed('mode-' + exited.id, false);
56069             });
56070
56071         var keybinding = d3keybinding('mode-buttons');
56072
56073         modes.forEach(function(mode) {
56074             keybinding.on(mode.key, function() {
56075                 if (editable()) {
56076                     if (mode.id === context.mode().id) {
56077                         context.enter(modeBrowse(context));
56078                     } else {
56079                         context.enter(mode);
56080                     }
56081                 }
56082             });
56083         });
56084
56085         d3_select(document)
56086             .call(keybinding);
56087
56088
56089         var debouncedUpdate = debounce$1(update, 500, { leading: true, trailing: true });
56090
56091         context.map()
56092             .on('move.modes', debouncedUpdate)
56093             .on('drawn.modes', debouncedUpdate);
56094
56095         context
56096             .on('enter.modes', update);
56097
56098
56099
56100         function update() {
56101             selection$$1.selectAll('button.add-button')
56102                 .property('disabled', !editable());
56103         }
56104     };
56105 }
56106
56107 function uiNotice(context) {
56108
56109     return function(selection) {
56110         var div = selection
56111             .append('div')
56112             .attr('class', 'notice');
56113
56114         var button = div
56115             .append('button')
56116             .attr('class', 'zoom-to notice fillD')
56117             .on('click', function() {
56118                 context.map().zoom(context.minEditableZoom());
56119             });
56120
56121         button
56122             .call(svgIcon('#icon-plus', 'pre-text'))
56123             .append('span')
56124             .attr('class', 'label')
56125             .text(t('zoom_in_edit'));
56126
56127
56128         function disableTooHigh() {
56129             var canEdit = context.map().zoom() >= context.minEditableZoom();
56130             div.style('display', canEdit ? 'none' : 'block');
56131         }
56132
56133         context.map()
56134             .on('move.notice', debounce$1(disableTooHigh, 500));
56135
56136         disableTooHigh();
56137     };
56138 }
56139
56140 function uiRestore(context) {
56141
56142     return function(selection) {
56143         if (!context.history().lock() || !context.history().restorableChanges())
56144             return;
56145
56146         var modalSelection = uiModal(selection, true);
56147
56148         modalSelection.select('.modal')
56149             .attr('class', 'modal fillL col6');
56150
56151         var introModal = modalSelection.select('.content');
56152
56153         introModal
56154             .attr('class','cf');
56155
56156         introModal
56157             .append('div')
56158             .attr('class', 'modal-section')
56159             .append('h3')
56160             .text(t('restore.heading'));
56161
56162         introModal
56163             .append('div')
56164             .attr('class','modal-section')
56165             .append('p')
56166             .text(t('restore.description'));
56167
56168         var buttonWrap = introModal
56169             .append('div')
56170             .attr('class', 'modal-actions cf');
56171
56172         var restore = buttonWrap
56173             .append('button')
56174             .attr('class', 'restore col6')
56175             .on('click', function() {
56176                 context.history().restore();
56177                 modalSelection.remove();
56178             });
56179
56180         restore
56181             .append('svg')
56182             .attr('class', 'logo logo-restore')
56183             .append('use')
56184             .attr('xlink:href', '#logo-restore');
56185
56186         restore
56187             .append('div')
56188             .text(t('restore.restore'));
56189
56190         var reset = buttonWrap
56191             .append('button')
56192             .attr('class', 'reset col6')
56193             .on('click', function() {
56194                 context.history().clearSaved();
56195                 modalSelection.remove();
56196             });
56197
56198         reset
56199             .append('svg')
56200             .attr('class', 'logo logo-reset')
56201             .append('use')
56202             .attr('xlink:href', '#logo-reset');
56203
56204         reset
56205             .append('div')
56206             .text(t('restore.reset'));
56207
56208         restore.node().focus();
56209     };
56210 }
56211
56212 function uiSave(context) {
56213     var history = context.history(),
56214         key = uiCmd('⌘S');
56215
56216
56217     function saving() {
56218         return context.mode().id === 'save';
56219     }
56220
56221
56222     function save() {
56223         event.preventDefault();
56224         if (!context.inIntro() && !saving() && history.hasChanges()) {
56225             context.enter(modeSave$$1(context));
56226         }
56227     }
56228
56229
56230     function getBackground(numChanges) {
56231         var step;
56232         if (numChanges === 0) {
56233             return null;
56234         } else if (numChanges <= 50) {
56235             step = numChanges / 50;
56236             return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
56237         } else {
56238             step = Math.min((numChanges - 50) / 50, 1.0);
56239             return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
56240         }
56241     }
56242
56243
56244     return function(selection$$1) {
56245         var numChanges = 0;
56246
56247         function updateCount() {
56248             var _ = history.difference().summary().length;
56249             if (_ === numChanges) return;
56250             numChanges = _;
56251
56252             tooltipBehavior
56253                 .title(uiTooltipHtml(
56254                     t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
56255                 );
56256
56257             var background = getBackground(numChanges);
56258
56259             button
56260                 .classed('disabled', numChanges === 0)
56261                 .classed('has-count', numChanges > 0)
56262                 .style('background', background);
56263
56264             button.select('span.count')
56265                 .text(numChanges)
56266                 .style('background', background)
56267                 .style('border-color', background);
56268         }
56269
56270
56271         var tooltipBehavior = tooltip()
56272             .placement('bottom')
56273             .html(true)
56274             .title(uiTooltipHtml(t('save.no_changes'), key));
56275
56276         var button = selection$$1
56277             .append('button')
56278             .attr('class', 'save col12 disabled')
56279             .attr('tabindex', -1)
56280             .on('click', save)
56281             .call(tooltipBehavior);
56282
56283         button
56284             .call(svgIcon('#icon-save', 'pre-text'))
56285             .append('span')
56286             .attr('class', 'label')
56287             .text(t('save.title'));
56288
56289         button
56290             .append('span')
56291             .attr('class', 'count')
56292             .text('0');
56293
56294         updateCount();
56295
56296
56297         var keybinding = d3keybinding('save')
56298             .on(key, save, true);
56299
56300         d3_select(document)
56301             .call(keybinding);
56302
56303         context.history()
56304             .on('change.save', updateCount);
56305
56306         context
56307             .on('enter.save', function() {
56308                 button.property('disabled', saving());
56309                 if (saving()) button.call(tooltipBehavior.hide);
56310             });
56311     };
56312 }
56313
56314 function uiScale(context) {
56315     var projection = context.projection,
56316         isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
56317         maxLength = 180,
56318         tickHeight = 8;
56319
56320
56321     function scaleDefs(loc1, loc2) {
56322         var lat = (loc2[1] + loc1[1]) / 2,
56323             conversion = (isImperial ? 3.28084 : 1),
56324             dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
56325             scale = { dist: 0, px: 0, text: '' },
56326             buckets, i, val, dLon;
56327
56328         if (isImperial) {
56329             buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
56330         } else {
56331             buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
56332         }
56333
56334         // determine a user-friendly endpoint for the scale
56335         for (i = 0; i < buckets.length; i++) {
56336             val = buckets[i];
56337             if (dist >= val) {
56338                 scale.dist = Math.floor(dist / val) * val;
56339                 break;
56340             } else {
56341                 scale.dist = +dist.toFixed(2);
56342             }
56343         }
56344
56345         dLon = geoMetersToLon(scale.dist / conversion, lat);
56346         scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
56347
56348         if (isImperial) {
56349             if (scale.dist >= 5280) {
56350                 scale.dist /= 5280;
56351                 scale.text = String(scale.dist) + ' mi';
56352             } else {
56353                 scale.text = String(scale.dist) + ' ft';
56354             }
56355         } else {
56356             if (scale.dist >= 1000) {
56357                 scale.dist /= 1000;
56358                 scale.text = String(scale.dist) + ' km';
56359             } else {
56360                 scale.text = String(scale.dist) + ' m';
56361             }
56362         }
56363
56364         return scale;
56365     }
56366
56367
56368     function update(selection) {
56369         // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
56370         var dims = context.map().dimensions(),
56371             loc1 = projection.invert([0, dims[1]]),
56372             loc2 = projection.invert([maxLength, dims[1]]),
56373             scale = scaleDefs(loc1, loc2);
56374
56375         selection.select('#scale-path')
56376             .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
56377
56378         selection.select('#scale-textgroup')
56379             .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
56380
56381         selection.select('#scale-text')
56382             .text(scale.text);
56383     }
56384
56385
56386     return function(selection) {
56387         function switchUnits() {
56388             isImperial = !isImperial;
56389             selection.call(update);
56390         }
56391
56392         var scalegroup = selection.append('svg')
56393             .attr('id', 'scale')
56394             .on('click', switchUnits)
56395             .append('g')
56396             .attr('transform', 'translate(10,11)');
56397
56398         scalegroup
56399             .append('path')
56400             .attr('id', 'scale-path');
56401
56402         scalegroup
56403             .append('g')
56404             .attr('id', 'scale-textgroup')
56405             .append('text')
56406             .attr('id', 'scale-text');
56407
56408         selection.call(update);
56409
56410         context.map().on('move.scale', function() {
56411             update(selection);
56412         });
56413     };
56414 }
56415
56416 var pair_1 = pair$1;
56417 function search(x, dims, r) {
56418   if (!dims) dims = 'NSEW';
56419   if (typeof x !== 'string') return { val: null, regex: r };
56420
56421   r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
56422
56423   var m = r.exec(x);
56424   if (!m) return { val: null, regex: r };
56425
56426   var dim = m[1] || m[5];
56427   if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
56428
56429   return {
56430     val: (((m[2]) ? parseFloat(m[2]) : 0) +
56431           ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
56432           ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
56433           ((dim === 'S' || dim === 'W') ? -1 : 1),
56434     regex: r,
56435     raw: m[0],
56436     dim: dim
56437   };
56438 }
56439
56440 function pair$1(x, dims) {
56441   x = x.trim();
56442   var one = search(x, dims);
56443   if (one.val === null) return null;
56444   var two = search(x, dims, one.regex);
56445   if (two.val === null) return null;
56446   // null if one/two are not contiguous.
56447   if (one.raw + two.raw !== x) return null;
56448   if (one.dim) {
56449     return swapdim(one.val, two.val, one.dim);
56450   } else {
56451     return [one.val, two.val];
56452   }
56453 }
56454
56455 function swapdim(a, b, dim) {
56456   if (dim === 'N' || dim === 'S') return [a, b];
56457   if (dim === 'W' || dim === 'E') return [b, a];
56458 }
56459
56460 function uiFeatureList(context) {
56461     var geocodeResults;
56462
56463
56464     function featureList(selection$$1) {
56465         var header = selection$$1
56466             .append('div')
56467             .attr('class', 'header fillL cf');
56468
56469         header.append('h3')
56470             .text(t('inspector.feature_list'));
56471
56472         var searchWrap = selection$$1
56473             .append('div')
56474             .attr('class', 'search-header');
56475
56476         var search = searchWrap
56477             .append('input')
56478             .attr('placeholder', t('inspector.search'))
56479             .attr('type', 'search')
56480             .call(utilNoAuto)
56481             .on('keypress', keypress)
56482             .on('input', inputevent);
56483
56484         searchWrap
56485             .call(svgIcon('#icon-search', 'pre-text'));
56486
56487         var listWrap = selection$$1
56488             .append('div')
56489             .attr('class', 'inspector-body');
56490
56491         var list = listWrap
56492             .append('div')
56493             .attr('class', 'feature-list cf');
56494
56495         context
56496             .on('exit.feature-list', clearSearch);
56497         context.map()
56498             .on('drawn.feature-list', mapDrawn);
56499
56500
56501         function keypress() {
56502             var q = search.property('value'),
56503                 items = list.selectAll('.feature-list-item');
56504             if (event.keyCode === 13 && q.length && items.size()) {
56505                 click(items.datum());
56506             }
56507         }
56508
56509
56510         function inputevent() {
56511             geocodeResults = undefined;
56512             drawList();
56513         }
56514
56515
56516         function clearSearch() {
56517             search.property('value', '');
56518             drawList();
56519         }
56520
56521
56522         function mapDrawn(e) {
56523             if (e.full) {
56524                 drawList();
56525             }
56526         }
56527
56528
56529         function features() {
56530             var entities = {},
56531                 result = [],
56532                 graph = context.graph(),
56533                 q = search.property('value').toLowerCase();
56534
56535             if (!q) return result;
56536
56537             var idMatch = q.match(/^([nwr])([0-9]+)$/);
56538
56539             if (idMatch) {
56540                 result.push({
56541                     id: idMatch[0],
56542                     geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
56543                     type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
56544                     name: idMatch[2]
56545                 });
56546             }
56547
56548             var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
56549
56550             if (locationMatch) {
56551                 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
56552                 result.push({
56553                     id: -1,
56554                     geometry: 'point',
56555                     type: t('inspector.location'),
56556                     name: loc[0].toFixed(6) + ', ' + loc[1].toFixed(6),
56557                     location: loc
56558                 });
56559             }
56560
56561             function addEntity(entity) {
56562                 if (entity.id in entities || result.length > 200)
56563                     return;
56564
56565                 entities[entity.id] = true;
56566
56567                 var name = utilDisplayName(entity) || '';
56568                 if (name.toLowerCase().indexOf(q) >= 0) {
56569                     var matched = context.presets().match(entity, graph),
56570                         type = (matched && matched.name()) || utilDisplayType(entity.id);
56571                     result.push({
56572                         id: entity.id,
56573                         entity: entity,
56574                         geometry: context.geometry(entity.id),
56575                         type: type,
56576                         name: name
56577                     });
56578                 }
56579
56580                 graph.parentRelations(entity).forEach(function(parent) {
56581                     addEntity(parent);
56582                 });
56583             }
56584
56585             var visible = context.surface().selectAll('.point, .line, .area').nodes();
56586             for (var i = 0; i < visible.length && result.length <= 200; i++) {
56587                 addEntity(visible[i].__data__);
56588             }
56589
56590             (geocodeResults || []).forEach(function(d) {
56591                 // https://github.com/openstreetmap/iD/issues/1890
56592                 if (d.osm_type && d.osm_id) {
56593                     result.push({
56594                         id: osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id),
56595                         geometry: d.osm_type === 'relation' ? 'relation' : d.osm_type === 'way' ? 'line' : 'point',
56596                         type: d.type !== 'yes' ? (d.type.charAt(0).toUpperCase() + d.type.slice(1)).replace('_', ' ')
56597                                                : (d.class.charAt(0).toUpperCase() + d.class.slice(1)).replace('_', ' '),
56598                         name: d.display_name,
56599                         extent: new geoExtent$$1(
56600                             [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
56601                             [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
56602                     });
56603                 }
56604             });
56605
56606             return result;
56607         }
56608
56609
56610         function drawList() {
56611             var value = search.property('value'),
56612                 results = features();
56613
56614             list.classed('filtered', value.length);
56615
56616             var noResultsWorldwide = geocodeResults && geocodeResults.length === 0;
56617
56618             var resultsIndicator = list.selectAll('.no-results-item')
56619                 .data([0])
56620                 .enter().append('button')
56621                 .property('disabled', true)
56622                 .attr('class', 'no-results-item')
56623                 .call(svgIcon('#icon-alert', 'pre-text'));
56624
56625             resultsIndicator.append('span')
56626                 .attr('class', 'entity-name');
56627
56628             list.selectAll('.no-results-item .entity-name')
56629                 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
56630
56631             if (services.geocoder) {
56632               list.selectAll('.geocode-item')
56633                   .data([0])
56634                   .enter().append('button')
56635                   .attr('class', 'geocode-item')
56636                   .on('click', geocoderSearch)
56637                   .append('div')
56638                   .attr('class', 'label')
56639                   .append('span')
56640                   .attr('class', 'entity-name')
56641                   .text(t('geocoder.search'));
56642             }
56643
56644             list.selectAll('.no-results-item')
56645                 .style('display', (value.length && !results.length) ? 'block' : 'none');
56646
56647             list.selectAll('.geocode-item')
56648                 .style('display', (value && geocodeResults === undefined) ? 'block' : 'none');
56649
56650             list.selectAll('.feature-list-item')
56651                 .data([-1])
56652                 .remove();
56653
56654             var items = list.selectAll('.feature-list-item')
56655                 .data(results, function(d) { return d.id; });
56656
56657             var enter = items.enter()
56658                 .insert('button', '.geocode-item')
56659                 .attr('class', 'feature-list-item')
56660                 .on('mouseover', mouseover)
56661                 .on('mouseout', mouseout)
56662                 .on('click', click);
56663
56664             var label = enter
56665                 .append('div')
56666                 .attr('class', 'label');
56667
56668             label.each(function(d) {
56669                 d3_select(this)
56670                     .call(svgIcon('#icon-' + d.geometry, 'pre-text'));
56671             });
56672
56673             label.append('span')
56674                 .attr('class', 'entity-type')
56675                 .text(function(d) { return d.type; });
56676
56677             label.append('span')
56678                 .attr('class', 'entity-name')
56679                 .text(function(d) { return d.name; });
56680
56681             enter.style('opacity', 0)
56682                 .transition()
56683                 .style('opacity', 1);
56684
56685             items.order();
56686
56687             items.exit()
56688                 .remove();
56689         }
56690
56691
56692         function mouseover(d) {
56693             if (d.id === -1) return;
56694
56695             context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
56696                 .classed('hover', true);
56697         }
56698
56699
56700         function mouseout() {
56701             context.surface().selectAll('.hover')
56702                 .classed('hover', false);
56703         }
56704
56705
56706         function click(d) {
56707             event.preventDefault();
56708             if (d.location) {
56709                 context.map().centerZoom([d.location[1], d.location[0]], 20);
56710             }
56711             else if (d.entity) {
56712                 if (d.entity.type === 'node') {
56713                     context.map().center(d.entity.loc);
56714                 } else if (d.entity.type === 'way') {
56715                     var center = context.projection(context.map().center()),
56716                         edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
56717                     context.map().center(edge.loc);
56718                 }
56719                 context.enter(modeSelect(context, [d.entity.id]));
56720             } else {
56721                 context.zoomToEntity(d.id);
56722             }
56723         }
56724
56725
56726         function geocoderSearch() {
56727             services.geocoder.search(search.property('value'), function (err, resp) {
56728                 geocodeResults = resp || [];
56729                 drawList();
56730             });
56731         }
56732     }
56733
56734
56735     return featureList;
56736 }
56737
56738 function uiPresetIcon() {
56739     var preset, geometry;
56740
56741
56742     function presetIcon(selection$$1) {
56743         selection$$1.each(render);
56744     }
56745
56746
56747     function getIcon(p, geom) {
56748         if (p.icon)
56749             return p.icon;
56750         else if (geom === 'line')
56751             return 'other-line';
56752         else if (geom === 'vertex')
56753             return p.isFallback() ? '' : 'poi-vertex';
56754         else
56755             return 'marker-stroked';
56756     }
56757
56758
56759     function render() {
56760         var selection$$1 = d3_select(this),
56761             p = preset.apply(this, arguments),
56762             geom = geometry.apply(this, arguments),
56763             picon = getIcon(p, geom),
56764             isPoi = picon.match(/^poi-/) !== null,
56765             isMaki = dataFeatureIcons.indexOf(picon) !== -1,
56766             isFramed = (geom === 'area' || geom === 'verex');
56767
56768
56769         function tag_classes(p) {
56770             var s = '';
56771             for (var i in p.tags) {
56772                 s += ' tag-' + i;
56773                 if (p.tags[i] !== '*') {
56774                     s += ' tag-' + i + '-' + p.tags[i];
56775                 }
56776             }
56777             return s;
56778         }
56779
56780
56781         var fill = selection$$1.selectAll('.preset-icon-fill')
56782             .data([0]);
56783
56784         fill = fill.enter()
56785             .append('div')
56786             .merge(fill);
56787
56788         fill
56789             .attr('class', function() {
56790                 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
56791             });
56792
56793
56794         var areaFrame = selection$$1.selectAll('.preset-icon-frame')
56795             .data((geom === 'area') ? [0] : []);
56796
56797         areaFrame.exit()
56798             .remove();
56799
56800         areaFrame = areaFrame.enter()
56801             .append('div')
56802             .attr('class', 'preset-icon-frame')
56803             .call(svgIcon('#preset-icon-frame'));
56804
56805
56806         var icon = selection$$1.selectAll('.preset-icon')
56807             .data([0]);
56808
56809         icon = icon.enter()
56810             .append('div')
56811             .attr('class', 'preset-icon')
56812             .call(svgIcon(''))
56813             .merge(icon);
56814
56815         icon
56816             .attr('class', 'preset-icon preset-icon-' +
56817                 ((isMaki || isPoi) ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
56818             );
56819
56820         icon.selectAll('svg')
56821             .attr('class', function() {
56822                 return 'icon ' + picon + (isMaki || isPoi ? '' : tag_classes(p));
56823             });
56824
56825         icon.selectAll('use')
56826             .attr('href', '#' + picon + (isMaki ? '-15' : ''));
56827     }
56828
56829
56830     presetIcon.preset = function(_) {
56831         if (!arguments.length) return preset;
56832         preset = utilFunctor(_);
56833         return presetIcon;
56834     };
56835
56836
56837     presetIcon.geometry = function(_) {
56838         if (!arguments.length) return geometry;
56839         geometry = utilFunctor(_);
56840         return presetIcon;
56841     };
56842
56843     return presetIcon;
56844 }
56845
56846 function d3combobox() {
56847     var dispatch$$1 = dispatch('accept'),
56848         container = d3_select(document.body),
56849         data = [],
56850         suggestions = [],
56851         minItems = 2,
56852         caseSensitive = false;
56853
56854     var fetcher = function(val, cb) {
56855         cb(data.filter(function(d) {
56856             return d.value
56857                 .toString()
56858                 .toLowerCase()
56859                 .indexOf(val.toLowerCase()) !== -1;
56860         }));
56861     };
56862
56863     var combobox = function(input, attachTo) {
56864         var idx = -1,
56865             wrapper = container
56866                 .selectAll('div.combobox')
56867                 .filter(function(d) { return d === input.node(); }),
56868             shown = !wrapper.empty();
56869
56870         input
56871             .classed('combobox-input', true)
56872             .on('focus.typeahead', focus)
56873             .on('blur.typeahead', blur)
56874             .on('keydown.typeahead', keydown)
56875             .on('keyup.typeahead', keyup)
56876             .on('input.typeahead', change)
56877             .each(function() {
56878                 var parent = this.parentNode,
56879                     sibling = this.nextSibling;
56880
56881                 var caret = d3_select(parent).selectAll('.combobox-caret')
56882                     .filter(function(d) { return d === input.node(); })
56883                     .data([input.node()]);
56884
56885                 caret = caret.enter()
56886                   .insert('div', function() { return sibling; })
56887                     .attr('class', 'combobox-caret')
56888                   .merge(caret);
56889
56890                 caret
56891                     .on('mousedown', function () {
56892                         // prevent the form element from blurring. it blurs
56893                         // on mousedown
56894                         event.stopPropagation();
56895                         event.preventDefault();
56896                         if (!shown) {
56897                             input.node().focus();
56898                             fetch('', render);
56899                         } else {
56900                             hide();
56901                         }
56902                     });
56903             });
56904
56905         function focus() {
56906             fetch(value(), render);
56907         }
56908
56909         function blur() {
56910             window.setTimeout(hide, 150);
56911         }
56912
56913         function show() {
56914             if (!shown) {
56915                 wrapper = container
56916                     .insert('div', ':first-child')
56917                     .datum(input.node())
56918                     .attr('class', 'combobox')
56919                     .style('position', 'absolute')
56920                     .style('display', 'block')
56921                     .style('left', '0px')
56922                     .on('mousedown', function () {
56923                         // prevent moving focus out of the text field
56924                         event.preventDefault();
56925                     });
56926
56927                 d3_select('body')
56928                     .on('scroll.combobox', render, true);
56929
56930                 shown = true;
56931             }
56932         }
56933
56934         function hide() {
56935             if (shown) {
56936                 idx = -1;
56937                 wrapper.remove();
56938
56939                 d3_select('body')
56940                     .on('scroll.combobox', null);
56941
56942                 shown = false;
56943             }
56944         }
56945
56946         function keydown() {
56947            switch (event.keyCode) {
56948                // backspace, delete
56949                case 8:
56950                case 46:
56951                    input.on('input.typeahead', function() {
56952                        idx = -1;
56953                        render();
56954                        var start = input.property('selectionStart');
56955                        input.node().setSelectionRange(start, start);
56956                        input.on('input.typeahead', change);
56957                    });
56958                    break;
56959                // tab
56960                case 9:
56961                    wrapper.selectAll('a.selected').each(function (d) {
56962                        dispatch$$1.call('accept', this, d);
56963                    });
56964                    hide();
56965                    break;
56966                // return
56967                case 13:
56968                    event.preventDefault();
56969                    break;
56970                // up arrow
56971                case 38:
56972                    nav(-1);
56973                    event.preventDefault();
56974                    break;
56975                // down arrow
56976                case 40:
56977                    nav(+1);
56978                    event.preventDefault();
56979                    break;
56980            }
56981            event.stopPropagation();
56982         }
56983
56984         function keyup() {
56985             switch (event.keyCode) {
56986                 // escape
56987                 case 27:
56988                     hide();
56989                     break;
56990                 // return
56991                 case 13:
56992                     wrapper.selectAll('a.selected').each(function (d) {
56993                        dispatch$$1.call('accept', this, d);
56994                     });
56995                     hide();
56996                     break;
56997             }
56998         }
56999
57000         function change() {
57001             fetch(value(), function() {
57002                 if (input.property('selectionEnd') === input.property('value').length) {
57003                     autocomplete();
57004                 }
57005                 render();
57006             });
57007         }
57008
57009         function nav(dir) {
57010             if (!suggestions.length) return;
57011             idx = Math.max(Math.min(idx + dir, suggestions.length - 1), 0);
57012             input.property('value', suggestions[idx].value);
57013             render();
57014             ensureVisible();
57015         }
57016
57017         function value() {
57018             var value = input.property('value'),
57019                 start = input.property('selectionStart'),
57020                 end = input.property('selectionEnd');
57021
57022             if (start && end) {
57023                 value = value.substring(0, start);
57024             }
57025
57026             return value;
57027         }
57028
57029         function fetch(v, cb) {
57030             fetcher.call(input, v, function(_) {
57031                 suggestions = _;
57032                 cb();
57033             });
57034         }
57035
57036         function autocomplete() {
57037             var v = caseSensitive ? value() : value().toLowerCase();
57038             idx = -1;
57039             if (!v) return;
57040
57041             for (var i = 0; i < suggestions.length; i++) {
57042                 var suggestion = suggestions[i].value,
57043                     compare = caseSensitive ? suggestion : suggestion.toLowerCase();
57044
57045                 if (compare.indexOf(v) === 0) {
57046                     idx = i;
57047                     input.property('value', suggestion);
57048                     input.node().setSelectionRange(v.length, suggestion.length);
57049                     return;
57050                 }
57051             }
57052         }
57053
57054         function render() {
57055             if (suggestions.length >= minItems && document.activeElement === input.node()) {
57056                 show();
57057             } else {
57058                 hide();
57059                 return;
57060             }
57061
57062             var options = wrapper
57063                 .selectAll('a.combobox-option')
57064                 .data(suggestions, function(d) { return d.value; });
57065
57066             options.exit()
57067                 .remove();
57068
57069             options.enter()
57070                 .append('a')
57071                 .attr('class', 'combobox-option')
57072                 .text(function(d) { return d.value; })
57073                 .merge(options)
57074                 .attr('title', function(d) { return d.title; })
57075                 .classed('selected', function(d, i) { return i === idx; })
57076                 .on('mouseover', select)
57077                 .on('click', accept)
57078                 .order();
57079
57080
57081             var node = attachTo ? attachTo.node() : input.node(),
57082                 rect = node.getBoundingClientRect();
57083
57084             wrapper
57085                 .style('left', rect.left + 'px')
57086                 .style('width', rect.width + 'px')
57087                 .style('top', rect.height + rect.top + 'px');
57088         }
57089
57090         function select(d, i) {
57091             idx = i;
57092             render();
57093         }
57094
57095         function ensureVisible() {
57096             var node = wrapper.selectAll('a.selected').node();
57097             if (node) node.scrollIntoView();
57098         }
57099
57100         function accept(d) {
57101             if (!shown) return;
57102             input.property('value', d.value);
57103             utilTriggerEvent(input, 'change');
57104             dispatch$$1.call('accept', this, d);
57105             hide();
57106         }
57107     };
57108
57109     combobox.fetcher = function(_) {
57110         if (!arguments.length) return fetcher;
57111         fetcher = _;
57112         return combobox;
57113     };
57114
57115     combobox.data = function(_) {
57116         if (!arguments.length) return data;
57117         data = _;
57118         return combobox;
57119     };
57120
57121     combobox.minItems = function(_) {
57122         if (!arguments.length) return minItems;
57123         minItems = _;
57124         return combobox;
57125     };
57126
57127     combobox.caseSensitive = function(_) {
57128         if (!arguments.length) return caseSensitive;
57129         caseSensitive = _;
57130         return combobox;
57131     };
57132
57133     combobox.container = function(_) {
57134         if (!arguments.length) return container;
57135         container = _;
57136         return combobox;
57137     };
57138
57139     return utilRebind(combobox, dispatch$$1, 'on');
57140 }
57141
57142
57143 d3combobox.off = function(input) {
57144     input
57145         .on('focus.typeahead', null)
57146         .on('blur.typeahead', null)
57147         .on('keydown.typeahead', null)
57148         .on('keyup.typeahead', null)
57149         .on('input.typeahead', null)
57150         .each(function() {
57151             d3_select(this.parentNode).selectAll('.combobox-caret')
57152                 .filter(function(d) { return d === input.node(); })
57153                 .on('mousedown', null);
57154         });
57155
57156     d3_select('body')
57157         .on('scroll.combobox', null);
57158 };
57159
57160 function uiDisclosure() {
57161     var dispatch$$1 = dispatch('toggled'),
57162         title,
57163         expanded = false,
57164         content = function () {};
57165
57166
57167     var disclosure = function(selection) {
57168         var hideToggle = selection.selectAll('.hide-toggle')
57169             .data([0]);
57170
57171         hideToggle = hideToggle.enter()
57172             .append('a')
57173             .attr('href', '#')
57174             .attr('class', 'hide-toggle')
57175             .merge(hideToggle);
57176
57177         hideToggle
57178             .text(title)
57179             .on('click', toggle)
57180             .classed('expanded', expanded);
57181
57182
57183         var wrap = selection.selectAll('div')
57184             .data([0]);
57185
57186         wrap = wrap.enter()
57187             .append('div')
57188             .merge(wrap);
57189
57190         wrap
57191             .classed('hide', !expanded)
57192             .call(content);
57193
57194
57195         function toggle() {
57196             expanded = !expanded;
57197             hideToggle.classed('expanded', expanded);
57198             wrap.call(uiToggle(expanded));
57199             dispatch$$1.call('toggled', this, expanded);
57200         }
57201     };
57202
57203
57204     disclosure.title = function(_) {
57205         if (!arguments.length) return title;
57206         title = _;
57207         return disclosure;
57208     };
57209
57210
57211     disclosure.expanded = function(_) {
57212         if (!arguments.length) return expanded;
57213         expanded = _;
57214         return disclosure;
57215     };
57216
57217
57218     disclosure.content = function(_) {
57219         if (!arguments.length) return content;
57220         content = _;
57221         return disclosure;
57222     };
57223
57224
57225     return utilRebind(disclosure, dispatch$$1, 'on');
57226 }
57227
57228 function uiRawMemberEditor(context) {
57229     var id,
57230         taginfo = services.taginfo;
57231
57232
57233     function selectMember(d) {
57234         event.preventDefault();
57235         context.enter(modeSelect(context, [d.id]));
57236     }
57237
57238
57239     function changeRole(d) {
57240         var role = d3_select(this).property('value');
57241         var member = { id: d.id, type: d.type, role: role };
57242         context.perform(
57243             actionChangeMember(d.relation.id, member, d.index),
57244             t('operations.change_role.annotation')
57245         );
57246     }
57247
57248
57249     function deleteMember(d) {
57250         context.perform(
57251             actionDeleteMember(d.relation.id, d.index),
57252             t('operations.delete_member.annotation')
57253         );
57254
57255         if (!context.hasEntity(d.relation.id)) {
57256             context.enter(modeBrowse(context));
57257         }
57258     }
57259
57260
57261     function rawMemberEditor(selection$$1) {
57262         var entity = context.entity(id),
57263             memberships = [];
57264
57265         entity.members.slice(0, 1000).forEach(function(member, index) {
57266             memberships.push({
57267                 index: index,
57268                 id: member.id,
57269                 type: member.type,
57270                 role: member.role,
57271                 relation: entity,
57272                 member: context.hasEntity(member.id)
57273             });
57274         });
57275
57276         var gt = entity.members.length > 1000 ? '>' : '';
57277         selection$$1.call(uiDisclosure()
57278             .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
57279             .expanded(true)
57280             .on('toggled', toggled)
57281             .content(content)
57282         );
57283
57284
57285         function toggled(expanded) {
57286             if (expanded) {
57287                 selection$$1.node().parentNode.scrollTop += 200;
57288             }
57289         }
57290
57291
57292         function content(wrap) {
57293             var list = wrap.selectAll('.member-list')
57294                 .data([0]);
57295
57296             list = list.enter()
57297                 .append('ul')
57298                 .attr('class', 'member-list')
57299                 .merge(list);
57300
57301
57302             var items = list.selectAll('li')
57303                 .data(memberships, function(d) {
57304                     return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
57305                         (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
57306                 });
57307
57308             items.exit()
57309                 .each(unbind)
57310                 .remove();
57311
57312             var enter = items.enter()
57313                 .append('li')
57314                 .attr('class', 'member-row form-field')
57315                 .classed('member-incomplete', function(d) { return !d.member; });
57316
57317             enter
57318                 .each(function(d) {
57319                     if (d.member) {
57320                         var label = d3_select(this).append('label')
57321                             .attr('class', 'form-label')
57322                             .append('a')
57323                             .attr('href', '#')
57324                             .on('click', selectMember);
57325
57326                         label.append('span')
57327                             .attr('class', 'member-entity-type')
57328                             .text(function(d) {
57329                                 var matched = context.presets().match(d.member, context.graph());
57330                                 return (matched && matched.name()) || utilDisplayType(d.member.id);
57331                             });
57332
57333                         label.append('span')
57334                             .attr('class', 'member-entity-name')
57335                             .text(function(d) { return utilDisplayName(d.member); });
57336
57337                     } else {
57338                         d3_select(this).append('label')
57339                             .attr('class', 'form-label')
57340                             .text(t('inspector.incomplete', { id: d.id }));
57341                     }
57342                 });
57343
57344             enter
57345                 .append('input')
57346                 .attr('class', 'member-role')
57347                 .property('type', 'text')
57348                 .attr('maxlength', 255)
57349                 .attr('placeholder', t('inspector.role'))
57350                 .call(utilNoAuto)
57351                 .property('value', function(d) { return d.role; })
57352                 .on('change', changeRole);
57353
57354             enter
57355                 .append('button')
57356                 .attr('tabindex', -1)
57357                 .attr('class', 'remove button-input-action member-delete minor')
57358                 .on('click', deleteMember)
57359                 .call(svgIcon('#operation-delete'));
57360
57361             if (taginfo) {
57362                 enter.each(bindTypeahead);
57363             }
57364
57365
57366             function bindTypeahead(d) {
57367                 var row = d3_select(this),
57368                     role = row.selectAll('input.member-role');
57369
57370                 function sort(value, data) {
57371                     var sameletter = [],
57372                         other = [];
57373                     for (var i = 0; i < data.length; i++) {
57374                         if (data[i].value.substring(0, value.length) === value) {
57375                             sameletter.push(data[i]);
57376                         } else {
57377                             other.push(data[i]);
57378                         }
57379                     }
57380                     return sameletter.concat(other);
57381                 }
57382
57383                 role.call(d3combobox()
57384                     .container(context.container())
57385                     .fetcher(function(role, callback) {
57386                         var rtype = entity.tags.type;
57387                         taginfo.roles({
57388                             debounce: true,
57389                             rtype: rtype || '',
57390                             geometry: context.geometry(d.member.id),
57391                             query: role
57392                         }, function(err, data) {
57393                             if (!err) callback(sort(role, data));
57394                         });
57395                     }));
57396             }
57397
57398
57399             function unbind() {
57400                 var row = d3_select(this);
57401
57402                 row.selectAll('input.member-role')
57403                     .call(d3combobox.off);
57404             }
57405         }
57406     }
57407
57408
57409     rawMemberEditor.entityID = function(_) {
57410         if (!arguments.length) return id;
57411         id = _;
57412         return rawMemberEditor;
57413     };
57414
57415
57416     return rawMemberEditor;
57417 }
57418
57419 function uiRawMembershipEditor(context) {
57420     var taginfo = services.taginfo,
57421         id, showBlank;
57422
57423
57424     function selectRelation(d) {
57425         event.preventDefault();
57426         context.enter(modeSelect(context, [d.relation.id]));
57427     }
57428
57429
57430     function changeRole(d) {
57431         var role = d3_select(this).property('value');
57432         context.perform(
57433             actionChangeMember(d.relation.id, assignIn$1({}, d.member, { role: role }), d.index),
57434             t('operations.change_role.annotation')
57435         );
57436     }
57437
57438
57439     function addMembership(d, role) {
57440         showBlank = false;
57441
57442         if (d.relation) {
57443             context.perform(
57444                 actionAddMember(d.relation.id, { id: id, type: context.entity(id).type, role: role }),
57445                 t('operations.add_member.annotation')
57446             );
57447
57448         } else {
57449             var relation = osmRelation();
57450             context.perform(
57451                 actionAddEntity(relation),
57452                 actionAddMember(relation.id, { id: id, type: context.entity(id).type, role: role }),
57453                 t('operations.add.annotation.relation')
57454             );
57455
57456             context.enter(modeSelect(context, [relation.id]));
57457         }
57458     }
57459
57460
57461     function deleteMembership(d) {
57462         context.perform(
57463             actionDeleteMember(d.relation.id, d.index),
57464             t('operations.delete_member.annotation')
57465         );
57466     }
57467
57468
57469     function relations(q) {
57470         var newRelation = {
57471                 relation: null,
57472                 value: t('inspector.new_relation')
57473             },
57474             result = [],
57475             graph = context.graph();
57476
57477         context.intersects(context.extent()).forEach(function(entity) {
57478             if (entity.type !== 'relation' || entity.id === id)
57479                 return;
57480
57481             var matched = context.presets().match(entity, graph),
57482                 presetName = (matched && matched.name()) || t('inspector.relation'),
57483                 entityName = utilDisplayName(entity) || '';
57484
57485             var value = presetName + ' ' + entityName;
57486             if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
57487                 return;
57488
57489             result.push({
57490                 relation: entity,
57491                 value: value
57492             });
57493         });
57494
57495         result.sort(function(a, b) {
57496             return osmRelation.creationOrder(a.relation, b.relation);
57497         });
57498
57499         // Dedupe identical names by appending relation id - see #2891
57500         var dupeGroups = filter(
57501             groupBy(result, 'value'),
57502             function(v) { return v.length > 1; }
57503         );
57504
57505         dupeGroups.forEach(function(group) {
57506             group.forEach(function(obj) {
57507                 obj.value += ' ' + obj.relation.id;
57508             });
57509         });
57510
57511         result.unshift(newRelation);
57512         return result;
57513     }
57514
57515
57516     function rawMembershipEditor(selection$$1) {
57517         var entity = context.entity(id),
57518             parents = context.graph().parentRelations(entity),
57519             memberships = [];
57520
57521         parents.slice(0, 1000).forEach(function(relation) {
57522             relation.members.forEach(function(member, index) {
57523                 if (member.id === entity.id) {
57524                     memberships.push({ relation: relation, member: member, index: index });
57525                 }
57526             });
57527         });
57528
57529         var gt = parents.length > 1000 ? '>' : '';
57530         selection$$1.call(uiDisclosure()
57531             .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
57532             .expanded(true)
57533             .on('toggled', toggled)
57534             .content(content)
57535         );
57536
57537
57538         function toggled(expanded) {
57539             if (expanded) {
57540                 selection$$1.node().parentNode.scrollTop += 200;
57541             }
57542         }
57543
57544
57545         function content(wrap) {
57546             var list = wrap.selectAll('.member-list')
57547                 .data([0]);
57548
57549             list = list.enter()
57550                 .append('ul')
57551                 .attr('class', 'member-list')
57552                 .merge(list);
57553
57554
57555             var items = list.selectAll('li.member-row-normal')
57556                 .data(memberships, function(d) {
57557                     return osmEntity$$1.key(d.relation) + ',' + d.index;
57558                 });
57559
57560             items.exit()
57561                 .each(unbind)
57562                 .remove();
57563
57564             var enter = items.enter()
57565                 .append('li')
57566                 .attr('class', 'member-row member-row-normal form-field');
57567
57568             var label = enter
57569                 .append('label')
57570                 .attr('class', 'form-label')
57571                 .append('a')
57572                 .attr('href', '#')
57573                 .on('click', selectRelation);
57574
57575             label
57576                 .append('span')
57577                 .attr('class', 'member-entity-type')
57578                 .text(function(d) {
57579                     var matched = context.presets().match(d.relation, context.graph());
57580                     return (matched && matched.name()) || t('inspector.relation');
57581                 });
57582
57583             label
57584                 .append('span')
57585                 .attr('class', 'member-entity-name')
57586                 .text(function(d) { return utilDisplayName(d.relation); });
57587
57588             enter
57589                 .append('input')
57590                 .attr('class', 'member-role')
57591                 .property('type', 'text')
57592                 .attr('maxlength', 255)
57593                 .attr('placeholder', t('inspector.role'))
57594                 .call(utilNoAuto)
57595                 .property('value', function(d) { return d.member.role; })
57596                 .on('change', changeRole);
57597
57598             enter
57599                 .append('button')
57600                 .attr('tabindex', -1)
57601                 .attr('class', 'remove button-input-action member-delete minor')
57602                 .on('click', deleteMembership)
57603                 .call(svgIcon('#operation-delete'));
57604
57605             if (taginfo) {
57606                 enter.each(bindTypeahead);
57607             }
57608
57609
57610             var newrow = list.selectAll('.member-row-new')
57611                 .data(showBlank ? [0] : []);
57612
57613             newrow.exit()
57614                 .remove();
57615
57616             enter = newrow.enter()
57617                 .append('li')
57618                 .attr('class', 'member-row member-row-new form-field');
57619
57620             enter
57621                 .append('input')
57622                 .attr('type', 'text')
57623                 .attr('class', 'member-entity-input')
57624                 .call(utilNoAuto);
57625
57626             enter
57627                 .append('input')
57628                 .attr('class', 'member-role')
57629                 .property('type', 'text')
57630                 .attr('maxlength', 255)
57631                 .attr('placeholder', t('inspector.role'))
57632                 .call(utilNoAuto)
57633                 .on('change', changeRole);
57634
57635             enter
57636                 .append('button')
57637                 .attr('tabindex', -1)
57638                 .attr('class', 'remove button-input-action member-delete minor')
57639                 .on('click', deleteMembership)
57640                 .call(svgIcon('#operation-delete'));
57641
57642             newrow = newrow
57643                 .merge(enter);
57644
57645             newrow.selectAll('.member-entity-input')
57646                 .call(d3combobox()
57647                     .container(context.container())
57648                     .minItems(1)
57649                     .fetcher(function(value, callback) { callback(relations(value)); })
57650                     .on('accept', onAccept)
57651                 );
57652
57653
57654             var addrel = wrap.selectAll('.add-relation')
57655                 .data([0]);
57656
57657             addrel = addrel.enter()
57658                 .append('button')
57659                 .attr('class', 'add-relation')
57660                 .merge(addrel);
57661
57662             addrel
57663                 .call(svgIcon('#icon-plus', 'light'))
57664                 .on('click', function() {
57665                     showBlank = true;
57666                     content(wrap);
57667                     list.selectAll('.member-entity-input').node().focus();
57668                 });
57669
57670
57671             function onAccept(d) {
57672                 var role = list.selectAll('.member-row-new .member-role').property('value');
57673                 addMembership(d, role);
57674             }
57675
57676
57677             function bindTypeahead(d) {
57678                 var row = d3_select(this),
57679                     role = row.selectAll('input.member-role');
57680
57681                 function sort(value, data) {
57682                     var sameletter = [],
57683                         other = [];
57684                     for (var i = 0; i < data.length; i++) {
57685                         if (data[i].value.substring(0, value.length) === value) {
57686                             sameletter.push(data[i]);
57687                         } else {
57688                             other.push(data[i]);
57689                         }
57690                     }
57691                     return sameletter.concat(other);
57692                 }
57693
57694                 role.call(d3combobox()
57695                     .container(context.container())
57696                     .fetcher(function(role, callback) {
57697                         var rtype = d.relation.tags.type;
57698                         taginfo.roles({
57699                             debounce: true,
57700                             rtype: rtype || '',
57701                             geometry: context.geometry(id),
57702                             query: role
57703                         }, function(err, data) {
57704                             if (!err) callback(sort(role, data));
57705                         });
57706                     }));
57707             }
57708
57709
57710             function unbind() {
57711                 var row = d3_select(this);
57712
57713                 row.selectAll('input.member-role')
57714                     .call(d3combobox.off);
57715             }
57716         }
57717     }
57718
57719
57720     rawMembershipEditor.entityID = function(_) {
57721         if (!arguments.length) return id;
57722         id = _;
57723         return rawMembershipEditor;
57724     };
57725
57726
57727     return rawMembershipEditor;
57728 }
57729
57730 function uiTagReference(tag) {
57731     var taginfo = services.taginfo,
57732         tagReference = {},
57733         button = d3_select(null),
57734         body = d3_select(null),
57735         loaded,
57736         showing;
57737
57738
57739     function findLocal(data) {
57740         var locale = utilDetect().locale.toLowerCase(),
57741             localized;
57742
57743         if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
57744             localized = find$1(data, function(d) {
57745                 return d.lang.toLowerCase() === locale;
57746             });
57747             if (localized) return localized;
57748         }
57749
57750         // try the non-regional version of a language, like
57751         // 'en' if the language is 'en-US'
57752         if (locale.indexOf('-') !== -1) {
57753             var first = locale.split('-')[0];
57754             localized = find$1(data, function(d) {
57755                 return d.lang.toLowerCase() === first;
57756             });
57757             if (localized) return localized;
57758         }
57759
57760         // finally fall back to english
57761         return find$1(data, function(d) {
57762             return d.lang.toLowerCase() === 'en';
57763         });
57764     }
57765
57766
57767     function load(param) {
57768         if (!taginfo) return;
57769
57770         button
57771             .classed('tag-reference-loading', true);
57772
57773         taginfo.docs(param, function show(err, data) {
57774             var docs;
57775             if (!err && data) {
57776                 docs = findLocal(data);
57777             }
57778
57779             body.html('');
57780
57781             if (!docs || !docs.title) {
57782                 if (param.hasOwnProperty('value')) {
57783                     load(omit(param, 'value'));   // retry with key only
57784                 } else {
57785                     body
57786                         .append('p')
57787                         .attr('class', 'tag-reference-description')
57788                         .text(t('inspector.no_documentation_key'));
57789                     done();
57790                 }
57791                 return;
57792             }
57793
57794             if (docs.image && docs.image.thumb_url_prefix) {
57795                 body
57796                     .append('img')
57797                     .attr('class', 'tag-reference-wiki-image')
57798                     .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
57799                     .on('load', function() { done(); })
57800                     .on('error', function() { d3_select(this).remove(); done(); });
57801             } else {
57802                 done();
57803             }
57804
57805             body
57806                 .append('p')
57807                 .attr('class', 'tag-reference-description')
57808                 .text(docs.description || t('inspector.documentation_redirect'));
57809
57810             body
57811                 .append('a')
57812                 .attr('class', 'tag-reference-link')
57813                 .attr('target', '_blank')
57814                 .attr('tabindex', -1)
57815                 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
57816                 .call(svgIcon('#icon-out-link', 'inline'))
57817                 .append('span')
57818                 .text(t('inspector.reference'));
57819
57820             // Add link to info about "good changeset comments" - #2923
57821             if (param.key === 'comment') {
57822                 body
57823                     .append('a')
57824                     .attr('class', 'tag-reference-comment-link')
57825                     .attr('target', '_blank')
57826                     .attr('tabindex', -1)
57827                     .call(svgIcon('#icon-out-link', 'inline'))
57828                     .attr('href', t('commit.about_changeset_comments_link'))
57829                     .append('span')
57830                     .text(t('commit.about_changeset_comments'));
57831             }
57832         });
57833     }
57834
57835
57836     function done() {
57837         loaded = true;
57838
57839         button
57840             .classed('tag-reference-loading', false);
57841
57842         body
57843             .classed('expanded', true)
57844             .transition()
57845             .duration(200)
57846             .style('max-height', '200px')
57847             .style('opacity', '1');
57848
57849         showing = true;
57850     }
57851
57852
57853     function hide() {
57854         body
57855             .transition()
57856             .duration(200)
57857             .style('max-height', '0px')
57858             .style('opacity', '0')
57859             .on('end', function () {
57860                 body.classed('expanded', false);
57861             });
57862
57863         showing = false;
57864     }
57865
57866
57867     tagReference.button = function(selection$$1) {
57868         button = selection$$1.selectAll('.tag-reference-button')
57869             .data([0]);
57870
57871         button = button.enter()
57872             .append('button')
57873             .attr('class', 'tag-reference-button')
57874             .attr('tabindex', -1)
57875             .call(svgIcon('#icon-inspect'))
57876             .merge(button);
57877
57878         button
57879             .on('click', function () {
57880                 event.stopPropagation();
57881                 event.preventDefault();
57882                 if (showing) {
57883                     hide();
57884                 } else if (loaded) {
57885                     done();
57886                 } else {
57887                     load(tag);
57888                 }
57889             });
57890     };
57891
57892
57893     tagReference.body = function(selection$$1) {
57894
57895         var tagid = tag.rtype || (tag.key + '-' + tag.value);
57896
57897         body = selection$$1.selectAll('.tag-reference-body')
57898             .data([tagid], function(d) { return d; });
57899
57900         body.exit()
57901             .remove();
57902
57903         body = body.enter()
57904             .append('div')
57905             .attr('class', 'tag-reference-body cf')
57906             .style('max-height', '0')
57907             .style('opacity', '0')
57908             .merge(body);
57909
57910         if (showing === false) {
57911             hide();
57912         }
57913     };
57914
57915
57916     tagReference.showing = function(_) {
57917         if (!arguments.length) return showing;
57918         showing = _;
57919         return tagReference;
57920     };
57921
57922
57923     return tagReference;
57924 }
57925
57926 function uiRawTagEditor(context) {
57927     var taginfo = services.taginfo,
57928         dispatch$$1 = dispatch('change'),
57929         expandedPreference = (context.storage('raw_tag_editor.expanded') === 'true'),
57930         expandedCurrent = expandedPreference,
57931         updatePreference = true,
57932         readOnlyTags = [],
57933         showBlank = false,
57934         newRow,
57935         state,
57936         preset,
57937         tags,
57938         id;
57939
57940
57941     function rawTagEditor(selection$$1) {
57942         var count = Object.keys(tags).filter(function(d) { return d; }).length;
57943
57944         selection$$1.call(uiDisclosure()
57945             .title(t('inspector.all_tags') + ' (' + count + ')')
57946             .expanded(expandedCurrent)
57947             .on('toggled', toggled)
57948             .content(content)
57949         );
57950
57951         function toggled(expanded) {
57952             expandedCurrent = expanded;
57953             if (updatePreference) {
57954                 expandedPreference = expanded;
57955                 context.storage('raw_tag_editor.expanded', expanded);
57956             }
57957             if (expanded) {
57958                 selection$$1.node().parentNode.scrollTop += 200;
57959             }
57960         }
57961     }
57962
57963
57964     function content(wrap) {
57965         var entries = map$4(tags, function(v, k) {
57966             return { key: k, value: v };
57967         });
57968
57969         if (!entries.length || showBlank) {
57970             showBlank = false;
57971             entries.push({key: '', value: ''});
57972             newRow = '';
57973         }
57974
57975         var list = wrap.selectAll('.tag-list')
57976             .data([0]);
57977
57978         list = list.enter()
57979             .append('ul')
57980             .attr('class', 'tag-list')
57981             .merge(list);
57982
57983         var newTag = wrap.selectAll('.add-tag')
57984             .data([0]);
57985
57986         newTag.enter()
57987             .append('button')
57988             .attr('class', 'add-tag')
57989             .on('click', addTag)
57990             .call(svgIcon('#icon-plus', 'light'));
57991
57992
57993         var items = list.selectAll('.tag-row')
57994             .data(entries, function(d) { return d.key; });
57995
57996         items.exit()
57997             .each(unbind)
57998             .remove();
57999
58000         // Enter
58001
58002         var enter = items.enter()
58003             .append('li')
58004             .attr('class', 'tag-row cf')
58005             .classed('readonly', isReadOnly);
58006
58007         enter
58008             .append('div')
58009             .attr('class', 'key-wrap')
58010             .append('input')
58011             .property('type', 'text')
58012             .attr('class', 'key')
58013             .attr('maxlength', 255)
58014             .call(utilNoAuto)
58015             .on('blur', keyChange)
58016             .on('change', keyChange);
58017
58018         enter
58019             .append('div')
58020             .attr('class', 'input-wrap-position')
58021             .append('input')
58022             .property('type', 'text')
58023             .attr('class', 'value')
58024             .attr('maxlength', 255)
58025             .call(utilNoAuto)
58026             .on('blur', valueChange)
58027             .on('change', valueChange)
58028             .on('keydown.push-more', pushMore);
58029
58030         enter
58031             .append('button')
58032             .attr('tabindex', -1)
58033             .attr('class', 'remove minor')
58034             .call(svgIcon('#operation-delete'));
58035
58036
58037         // Update
58038
58039         items = items
58040             .merge(enter)
58041             .sort(function(a, b) {
58042                 return (a.key === newRow && b.key !== newRow) ? 1
58043                     : (a.key !== newRow && b.key === newRow) ? -1
58044                     : d3_ascending(a.key, b.key);
58045             });
58046
58047         items
58048             .each(function(tag) {
58049                 var row = d3_select(this),
58050                     key = row.select('input.key'),      // propagate bound data to child
58051                     value = row.select('input.value');  // propagate bound data to child
58052
58053                 if (id && taginfo) {
58054                     bindTypeahead(key, value);
58055                 }
58056
58057                 var isRelation = (id && context.entity(id).type === 'relation'),
58058                     reference;
58059
58060                 if (isRelation && tag.key === 'type') {
58061                     reference = uiTagReference({ rtype: tag.value }, context);
58062                 } else {
58063                     reference = uiTagReference({ key: tag.key, value: tag.value }, context);
58064                 }
58065
58066                 if (state === 'hover') {
58067                     reference.showing(false);
58068                 }
58069
58070                 row
58071                     .call(reference.button)
58072                     .call(reference.body);
58073             });
58074
58075         items.selectAll('input.key')
58076             .attr('title', function(d) { return d.key; })
58077             .call(utilGetSetValue, function(d) { return d.key; })
58078             .property('disabled', isReadOnly);
58079
58080         items.selectAll('input.value')
58081             .attr('title', function(d) { return d.value; })
58082             .call(utilGetSetValue, function(d) { return d.value; })
58083             .property('disabled', isReadOnly);
58084
58085         items.selectAll('button.remove')
58086             .on('click', removeTag);
58087
58088
58089
58090         function isReadOnly(d) {
58091             for (var i = 0; i < readOnlyTags.length; i++) {
58092                 if (d.key.match(readOnlyTags[i]) !== null) {
58093                     return true;
58094                 }
58095             }
58096             return false;
58097         }
58098
58099
58100         function pushMore() {
58101             if (event.keyCode === 9 && !event.shiftKey &&
58102                 list.selectAll('li:last-child input.value').node() === this) {
58103                 addTag();
58104             }
58105         }
58106
58107
58108         function bindTypeahead(key, value) {
58109             if (isReadOnly({ key: key })) return;
58110             var geometry = context.geometry(id);
58111
58112             key.call(d3combobox()
58113                 .container(context.container())
58114                 .fetcher(function(value, callback) {
58115                     taginfo.keys({
58116                         debounce: true,
58117                         geometry: geometry,
58118                         query: value
58119                     }, function(err, data) {
58120                         if (!err) callback(sort(value, data));
58121                     });
58122                 }));
58123
58124             value.call(d3combobox()
58125                 .container(context.container())
58126                 .fetcher(function(value, callback) {
58127                     taginfo.values({
58128                         debounce: true,
58129                         key: utilGetSetValue(key),
58130                         geometry: geometry,
58131                         query: value
58132                     }, function(err, data) {
58133                         if (!err) callback(sort(value, data));
58134                     });
58135                 }));
58136
58137
58138             function sort(value, data) {
58139                 var sameletter = [],
58140                     other = [];
58141                 for (var i = 0; i < data.length; i++) {
58142                     if (data[i].value.substring(0, value.length) === value) {
58143                         sameletter.push(data[i]);
58144                     } else {
58145                         other.push(data[i]);
58146                     }
58147                 }
58148                 return sameletter.concat(other);
58149             }
58150         }
58151
58152
58153         function unbind() {
58154             var row = d3_select(this);
58155
58156             row.selectAll('input.key')
58157                 .call(d3combobox.off);
58158
58159             row.selectAll('input.value')
58160                 .call(d3combobox.off);
58161         }
58162
58163
58164         function keyChange(d) {
58165             var kOld = d.key,
58166                 kNew = this.value.trim(),
58167                 tag = {};
58168
58169
58170             if (isReadOnly({ key: kNew })) {
58171                 this.value = kOld;
58172                 return;
58173             }
58174
58175             if (kNew && kNew !== kOld) {
58176                 var match = kNew.match(/^(.*?)(?:_(\d+))?$/),
58177                     base = match[1],
58178                     suffix = +(match[2] || 1);
58179                 while (tags[kNew]) {  // rename key if already in use
58180                     kNew = base + '_' + suffix++;
58181                 }
58182             }
58183             tag[kOld] = undefined;
58184             tag[kNew] = d.value;
58185
58186             d.key = kNew; // Maintain DOM identity through the subsequent update.
58187
58188             if (newRow === kOld) {  // see if this row is still a new row
58189                 newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
58190             }
58191
58192             this.value = kNew;
58193             dispatch$$1.call('change', this, tag);
58194         }
58195
58196
58197         function valueChange(d) {
58198             if (isReadOnly(d)) return;
58199             var tag = {};
58200             tag[d.key] = this.value;
58201
58202             if (newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
58203                 newRow = undefined;
58204             }
58205
58206             dispatch$$1.call('change', this, tag);
58207         }
58208
58209
58210         function removeTag(d) {
58211             if (isReadOnly(d)) return;
58212             var tag = {};
58213             tag[d.key] = undefined;
58214             dispatch$$1.call('change', this, tag);
58215             d3_select(this.parentNode).remove();
58216         }
58217
58218
58219         function addTag() {
58220             // Wrapped in a setTimeout in case it's being called from a blur
58221             // handler. Without the setTimeout, the call to `content` would
58222             // wipe out the pending value change.
58223             setTimeout(function() {
58224                 showBlank = true;
58225                 content(wrap);
58226                 list.selectAll('li:last-child input.key').node().focus();
58227             }, 0);
58228         }
58229     }
58230
58231
58232     rawTagEditor.state = function(_) {
58233         if (!arguments.length) return state;
58234         state = _;
58235         return rawTagEditor;
58236     };
58237
58238
58239     rawTagEditor.preset = function(_) {
58240         if (!arguments.length) return preset;
58241         preset = _;
58242         if (preset.isFallback()) {
58243             expandedCurrent = true;
58244             updatePreference = false;
58245         } else {
58246             expandedCurrent = expandedPreference;
58247             updatePreference = true;
58248         }
58249         return rawTagEditor;
58250     };
58251
58252
58253     rawTagEditor.tags = function(_) {
58254         if (!arguments.length) return tags;
58255         tags = _;
58256         return rawTagEditor;
58257     };
58258
58259
58260     rawTagEditor.entityID = function(_) {
58261         if (!arguments.length) return id;
58262         id = _;
58263         return rawTagEditor;
58264     };
58265
58266
58267     rawTagEditor.expanded = function(_) {
58268         if (!arguments.length) return expandedCurrent;
58269         expandedCurrent = _;
58270         updatePreference = false;
58271         return rawTagEditor;
58272     };
58273
58274
58275     rawTagEditor.readOnlyTags = function(_) {
58276         if (!arguments.length) return readOnlyTags;
58277         readOnlyTags = _;
58278         return rawTagEditor;
58279     };
58280
58281
58282     return utilRebind(rawTagEditor, dispatch$$1, 'on');
58283 }
58284
58285 function uiFieldCheck(field, context) {
58286     var dispatch$$1 = dispatch('change'),
58287         options = field.strings && field.strings.options,
58288         values = [],
58289         texts = [],
58290         input = d3_select(null),
58291         text = d3_select(null),
58292         label = d3_select(null),
58293         reverser = d3_select(null),
58294         impliedYes,
58295         entityId,
58296         value;
58297
58298
58299     if (options) {
58300         for (var k in options) {
58301             values.push(k === 'undefined' ? undefined : k);
58302             texts.push(field.t('options.' + k, { 'default': options[k] }));
58303         }
58304     } else {
58305         values = [undefined, 'yes'];
58306         texts = [t('inspector.unknown'), t('inspector.check.yes')];
58307         if (field.type !== 'defaultCheck') {
58308             values.push('no');
58309             texts.push(t('inspector.check.no'));
58310         }
58311     }
58312
58313
58314     // Checks tags to see whether an undefined value is "Assumed to be Yes"
58315     function checkImpliedYes() {
58316         impliedYes = (field.id === 'oneway_yes');
58317
58318         // hack: pretend `oneway` field is a `oneway_yes` field
58319         // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
58320         if (field.id === 'oneway') {
58321             var entity = context.entity(entityId);
58322             for (var key in entity.tags) {
58323                 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
58324                     impliedYes = true;
58325                     texts[0] = t('presets.fields.oneway_yes.options.undefined');
58326                     break;
58327                 }
58328             }
58329         }
58330     }
58331
58332
58333     function reverserHidden() {
58334         if (!d3_select('div.inspector-hover').empty()) return true;
58335         return !(value === 'yes' || (impliedYes && !value));
58336     }
58337
58338
58339     function reverserSetText(selection$$1) {
58340         var entity = context.hasEntity(entityId);
58341         if (reverserHidden() || !entity) return selection$$1;
58342
58343         var first = entity.first(),
58344             last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last(),
58345             pseudoDirection = first < last,
58346             icon = pseudoDirection ? '#icon-forward' : '#icon-backward';
58347
58348         selection$$1.selectAll('.reverser-span')
58349             .text(t('inspector.check.reverser'))
58350             .call(svgIcon(icon, 'inline'));
58351
58352         return selection$$1;
58353     }
58354
58355
58356     var check = function(selection$$1) {
58357         checkImpliedYes();
58358         selection$$1.classed('checkselect', 'true');
58359
58360         label = selection$$1.selectAll('.preset-input-wrap')
58361             .data([0]);
58362
58363         var enter = label.enter()
58364             .append('label')
58365             .attr('class', 'preset-input-wrap');
58366
58367         enter
58368             .append('input')
58369             .property('indeterminate', field.type !== 'defaultCheck')
58370             .attr('type', 'checkbox')
58371             .attr('id', 'preset-input-' + field.id);
58372
58373         enter
58374             .append('span')
58375             .text(texts[0])
58376             .attr('class', 'value');
58377
58378         if (field.type === 'onewayCheck') {
58379             enter
58380                 .append('a')
58381                 .attr('id', 'preset-input-' + field.id + '-reverser')
58382                 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
58383                 .attr('href', '#')
58384                 .append('span')
58385                 .attr('class', 'reverser-span');
58386         }
58387
58388         label = label.merge(enter);
58389         input = label.selectAll('input');
58390         text = label.selectAll('span.value');
58391
58392         input
58393             .on('click', function() {
58394                 var t$$1 = {};
58395                 t$$1[field.key] = values[(values.indexOf(value) + 1) % values.length];
58396                 dispatch$$1.call('change', this, t$$1);
58397                 event.stopPropagation();
58398             });
58399
58400         if (field.type === 'onewayCheck') {
58401             reverser = label.selectAll('.reverser');
58402
58403             reverser
58404                 .call(reverserSetText)
58405                 .on('click', function() {
58406                     event.preventDefault();
58407                     event.stopPropagation();
58408                     context.perform(
58409                         actionReverse(entityId),
58410                         t('operations.reverse.annotation')
58411                     );
58412                     d3_select(this)
58413                         .call(reverserSetText);
58414                 });
58415         }
58416     };
58417
58418
58419     check.entity = function(_) {
58420         if (!arguments.length) return context.hasEntity(entityId);
58421         entityId = _.id;
58422         return check;
58423     };
58424
58425
58426     check.tags = function(tags) {
58427         checkImpliedYes();
58428         value = tags[field.key] && tags[field.key].toLowerCase();
58429
58430         if (field.type === 'onewayCheck' && (value === '1' || value === '-1')) {
58431             value = 'yes';
58432         }
58433
58434         input
58435             .property('indeterminate', field.type !== 'defaultCheck' && !value)
58436             .property('checked', value === 'yes');
58437
58438         text
58439             .text(texts[values.indexOf(value)]);
58440
58441         label
58442             .classed('set', !!value);
58443
58444         if (field.type === 'onewayCheck') {
58445             reverser
58446                 .classed('hide', reverserHidden())
58447                 .call(reverserSetText);
58448         }
58449     };
58450
58451
58452     check.focus = function() {
58453         input.node().focus();
58454     };
58455
58456     return utilRebind(check, dispatch$$1, 'on');
58457 }
58458
58459 /** Used for built-in method references. */
58460 var arrayProto$1 = Array.prototype;
58461
58462 /** Built-in value references. */
58463 var splice$1 = arrayProto$1.splice;
58464
58465 /**
58466  * The base implementation of `_.pullAt` without support for individual
58467  * indexes or capturing the removed elements.
58468  *
58469  * @private
58470  * @param {Array} array The array to modify.
58471  * @param {number[]} indexes The indexes of elements to remove.
58472  * @returns {Array} Returns `array`.
58473  */
58474 function basePullAt(array, indexes) {
58475   var length = array ? indexes.length : 0,
58476       lastIndex = length - 1;
58477
58478   while (length--) {
58479     var index = indexes[length];
58480     if (length == lastIndex || index !== previous) {
58481       var previous = index;
58482       if (isIndex(index)) {
58483         splice$1.call(array, index, 1);
58484       } else {
58485         baseUnset(array, index);
58486       }
58487     }
58488   }
58489   return array;
58490 }
58491
58492 /**
58493  * Removes all elements from `array` that `predicate` returns truthy for
58494  * and returns an array of the removed elements. The predicate is invoked
58495  * with three arguments: (value, index, array).
58496  *
58497  * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
58498  * to pull elements from an array by value.
58499  *
58500  * @static
58501  * @memberOf _
58502  * @since 2.0.0
58503  * @category Array
58504  * @param {Array} array The array to modify.
58505  * @param {Function} [predicate=_.identity] The function invoked per iteration.
58506  * @returns {Array} Returns the new array of removed elements.
58507  * @example
58508  *
58509  * var array = [1, 2, 3, 4];
58510  * var evens = _.remove(array, function(n) {
58511  *   return n % 2 == 0;
58512  * });
58513  *
58514  * console.log(array);
58515  * // => [1, 3]
58516  *
58517  * console.log(evens);
58518  * // => [2, 4]
58519  */
58520 function remove$8(array, predicate) {
58521   var result = [];
58522   if (!(array && array.length)) {
58523     return result;
58524   }
58525   var index = -1,
58526       indexes = [],
58527       length = array.length;
58528
58529   predicate = baseIteratee(predicate, 3);
58530   while (++index < length) {
58531     var value = array[index];
58532     if (predicate(value, index, array)) {
58533       result.push(value);
58534       indexes.push(index);
58535     }
58536   }
58537   basePullAt(array, indexes);
58538   return result;
58539 }
58540
58541 function uiFieldCombo(field, context) {
58542     var dispatch$$1 = dispatch('change'),
58543         nominatim = services.geocoder,
58544         taginfo = services.taginfo,
58545         isMulti = (field.type === 'multiCombo'),
58546         isNetwork = (field.type === 'networkCombo'),
58547         isSemi = (field.type === 'semiCombo'),
58548         optstrings = field.strings && field.strings.options,
58549         optarray = field.options,
58550         snake_case = (field.snake_case || (field.snake_case === undefined)),
58551         combobox = d3combobox()
58552             .container(context.container())
58553             .minItems(isMulti || isSemi ? 1 : 2),
58554         comboData = [],
58555         multiData = [],
58556         container,
58557         input,
58558         entity,
58559         country;
58560
58561     // ensure multiCombo field.key ends with a ':'
58562     if (isMulti && field.key.match(/:$/) === null) {
58563         field.key += ':';
58564     }
58565
58566
58567     function snake(s) {
58568         return s.replace(/\s+/g, '_');
58569     }
58570
58571     function unsnake(s) {
58572         return s.replace(/_+/g, ' ');
58573     }
58574
58575     function clean(s) {
58576         return s.split(';')
58577             .map(function(s) { return s.trim(); })
58578             .join(';');
58579     }
58580
58581
58582     // returns the tag value for a display value
58583     // (for multiCombo, dval should be the key suffix, not the entire key)
58584     function tagValue(dval) {
58585         dval = clean(dval || '');
58586
58587         if (optstrings) {
58588             var match = find$1(comboData, function(o) {
58589                 return o.key && clean(o.value) === dval;
58590             });
58591             if (match) {
58592                 return match.key;
58593             }
58594         }
58595
58596         if (field.type === 'typeCombo' && !dval) {
58597             return 'yes';
58598         }
58599
58600         return (snake_case ? snake(dval) : dval) || undefined;
58601     }
58602
58603
58604     // returns the display value for a tag value
58605     // (for multiCombo, tval should be the key suffix, not the entire key)
58606     function displayValue(tval) {
58607         tval = tval || '';
58608
58609         if (optstrings) {
58610             var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
58611             if (match) {
58612                 return match.value;
58613             }
58614         }
58615
58616         if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
58617             return '';
58618         }
58619
58620         return snake_case ? unsnake(tval) : tval;
58621     }
58622
58623
58624     function objectDifference(a, b) {
58625         return reject(a, function(d1) {
58626             return some(b, function(d2) { return d1.value === d2.value; });
58627         });
58628     }
58629
58630
58631     function initCombo(selection$$1, attachTo) {
58632         if (optstrings) {
58633             selection$$1.attr('readonly', 'readonly');
58634             selection$$1.call(combobox, attachTo);
58635             setStaticValues(setPlaceholder);
58636
58637         } else if (optarray) {
58638             selection$$1.call(combobox, attachTo);
58639             setStaticValues(setPlaceholder);
58640
58641         } else if (taginfo) {
58642             selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
58643             setTaginfoValues('', setPlaceholder);
58644         }
58645     }
58646
58647
58648     function setStaticValues(callback) {
58649         if (!(optstrings || optarray)) return;
58650
58651         if (optstrings) {
58652             comboData = Object.keys(optstrings).map(function(k) {
58653                 var v = field.t('options.' + k, { 'default': optstrings[k] });
58654                 return {
58655                     key: k,
58656                     value: v,
58657                     title: v
58658                 };
58659             });
58660
58661         } else if (optarray) {
58662             comboData = optarray.map(function(k) {
58663                 var v = snake_case ? unsnake(k) : k;
58664                 return {
58665                     key: k,
58666                     value: v,
58667                     title: v
58668                 };
58669             });
58670         }
58671
58672         combobox.data(objectDifference(comboData, multiData));
58673         if (callback) callback(comboData);
58674     }
58675
58676
58677     function setTaginfoValues(q, callback) {
58678         var fn = isMulti ? 'multikeys' : 'values';
58679         var query = (isMulti ? field.key : '') + q;
58680         var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
58681         if (hasCountryPrefix) {
58682             query = country + ':';
58683         }
58684
58685         var params = {
58686             debounce: (q !== ''),
58687             key: field.key,
58688             query: query
58689         };
58690
58691         if (entity) {
58692             params.geometry = context.geometry(entity.id);
58693         }
58694
58695         taginfo[fn](params, function(err, data) {
58696             if (err) return;
58697             if (hasCountryPrefix) {
58698                 data = filter(data, function(d) {
58699                     return d.value.toLowerCase().indexOf(country + ':') === 0;
58700                 });
58701             }
58702
58703             comboData = map$4(data, function(d) {
58704                 var k = d.value;
58705                 if (isMulti) k = k.replace(field.key, '');
58706                 var v = snake_case ? unsnake(k) : k;
58707                 return {
58708                     key: k,
58709                     value: v,
58710                     title: isMulti ? v : d.title
58711                 };
58712             });
58713
58714             comboData = objectDifference(comboData, multiData);
58715             if (callback) callback(comboData);
58716         });
58717     }
58718
58719
58720     function setPlaceholder(d) {
58721         var ph;
58722
58723         if (isMulti || isSemi) {
58724             ph = field.placeholder() || t('inspector.add');
58725         } else {
58726             var vals = map$4(d, 'value').filter(function(s) { return s.length < 20; }),
58727                 placeholders = vals.length > 1 ? vals : map$4(d, 'key');
58728             ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
58729         }
58730
58731         if (ph.match(/(…|\.\.\.)$/) === null) {
58732             ph += '…';
58733         }
58734
58735         container.selectAll('input')
58736             .attr('placeholder', ph);
58737     }
58738
58739
58740     function change() {
58741         var val = tagValue(utilGetSetValue(input)),
58742             t$$1 = {};
58743
58744         if (isMulti || isSemi) {
58745             if (!val) return;
58746             container.classed('active', false);
58747             utilGetSetValue(input, '');
58748             if (isMulti) {
58749                 field.keys.push(field.key + val);
58750                 t$$1[field.key + val] = 'yes';
58751             } else if (isSemi) {
58752                 var arr = multiData.map(function(d) { return d.key; });
58753                 arr.push(val);
58754                 t$$1[field.key] = compact(uniq(arr)).join(';');
58755             }
58756             window.setTimeout(function() { input.node().focus(); }, 10);
58757
58758         } else {
58759             t$$1[field.key] = val;
58760         }
58761
58762         dispatch$$1.call('change', this, t$$1);
58763     }
58764
58765
58766     function removeMultikey(d) {
58767         event.stopPropagation();
58768         var t$$1 = {};
58769         if (isMulti) {
58770             t$$1[d.key] = undefined;
58771         } else if (isSemi) {
58772             remove$8(multiData, function(md) { return md.key === d.key; });
58773             var arr = multiData.map(function(md) { return md.key; });
58774             arr = compact(uniq(arr));
58775             t$$1[field.key] = arr.length ? arr.join(';') : undefined;
58776         }
58777         dispatch$$1.call('change', this, t$$1);
58778     }
58779
58780
58781     function combo(selection$$1) {
58782         if (isMulti || isSemi) {
58783             container = selection$$1.selectAll('ul').data([0]);
58784
58785             container = container.enter()
58786                 .append('ul')
58787                 .attr('class', 'form-field-multicombo')
58788                 .on('click', function() {
58789                     window.setTimeout(function() { input.node().focus(); }, 10);
58790                 })
58791                 .merge(container);
58792
58793         } else {
58794             container = selection$$1;
58795         }
58796
58797         input = container.selectAll('input')
58798             .data([0]);
58799
58800         input = input.enter()
58801             .append('input')
58802             .attr('type', 'text')
58803             .attr('id', 'preset-input-' + field.id)
58804             .call(utilNoAuto)
58805             .call(initCombo, selection$$1)
58806             .merge(input);
58807
58808         if (isNetwork && nominatim && entity) {
58809             var center = entity.extent(context.graph()).center();
58810             nominatim.countryCode(center, function (err, code) {
58811                 country = code;
58812             });
58813         }
58814
58815         input
58816             .on('change', change)
58817             .on('blur', change);
58818
58819         if (isMulti || isSemi) {
58820             combobox
58821                 .on('accept', function() {
58822                     input.node().blur();
58823                     input.node().focus();
58824                 });
58825
58826             input
58827                 .on('focus', function() { container.classed('active', true); });
58828         }
58829     }
58830
58831
58832     combo.tags = function(tags) {
58833         if (isMulti || isSemi) {
58834             multiData = [];
58835
58836             if (isMulti) {
58837                 // Build multiData array containing keys already set..
58838                 Object.keys(tags).forEach(function(key) {
58839                     if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
58840
58841                     var suffix = key.substring(field.key.length);
58842                     multiData.push({
58843                         key: key,
58844                         value: displayValue(suffix)
58845                     });
58846                 });
58847
58848                 // Set keys for form-field modified (needed for undo and reset buttons)..
58849                 field.keys = map$4(multiData, 'key');
58850
58851             } else if (isSemi) {
58852                 var arr = compact(uniq((tags[field.key] || '').split(';')));
58853                 multiData = arr.map(function(key) {
58854                     return {
58855                         key: key,
58856                         value: displayValue(key)
58857                     };
58858                 });
58859             }
58860
58861             // Exclude existing multikeys from combo options..
58862             var available = objectDifference(comboData, multiData);
58863             combobox.data(available);
58864
58865             // Hide 'Add' button if this field uses fixed set of
58866             // translateable optstrings and they're all currently used..
58867             container.selectAll('.combobox-input, .combobox-caret')
58868                 .classed('hide', optstrings && !available.length);
58869
58870
58871             // Render chips
58872             var chips = container.selectAll('.chips')
58873                 .data(multiData);
58874
58875             chips.exit()
58876                 .remove();
58877
58878             var enter = chips.enter()
58879                 .insert('li', 'input')
58880                 .attr('class', 'chips');
58881
58882             enter.append('span');
58883             enter.append('a');
58884
58885             chips = chips.merge(enter);
58886
58887             chips.select('span')
58888                 .text(function(d) { return d.value; });
58889
58890             chips.select('a')
58891                 .on('click', removeMultikey)
58892                 .attr('class', 'remove')
58893                 .text('×');
58894
58895         } else {
58896             utilGetSetValue(input, displayValue(tags[field.key]));
58897         }
58898     };
58899
58900
58901     combo.focus = function() {
58902         input.node().focus();
58903     };
58904
58905
58906     combo.entity = function(_) {
58907         if (!arguments.length) return entity;
58908         entity = _;
58909         return combo;
58910     };
58911
58912
58913     return utilRebind(combo, dispatch$$1, 'on');
58914 }
58915
58916 function uiFieldText(field, context) {
58917     var dispatch$$1 = dispatch('change'),
58918         nominatim = services.geocoder,
58919         input,
58920         entity;
58921
58922
58923     function i(selection$$1) {
58924         var fieldId = 'preset-input-' + field.id;
58925
58926         input = selection$$1.selectAll('input')
58927             .data([0]);
58928
58929         input = input.enter()
58930             .append('input')
58931             .attr('type', field.type)
58932             .attr('id', fieldId)
58933             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
58934             .call(utilNoAuto)
58935             .merge(input);
58936
58937         input
58938             .on('input', change(true))
58939             .on('blur', change())
58940             .on('change', change());
58941
58942         if (field.type === 'tel' && nominatim && entity) {
58943             var center = entity.extent(context.graph()).center();
58944             nominatim.countryCode(center, function (err, countryCode) {
58945                 if (err || !dataPhoneFormats[countryCode]) return;
58946                 selection$$1.selectAll('#' + fieldId)
58947                     .attr('placeholder', dataPhoneFormats[countryCode]);
58948             });
58949
58950         } else if (field.type === 'number') {
58951             var rtl = (textDirection === 'rtl');
58952
58953             input.attr('type', 'text');
58954
58955             var spinControl = selection$$1.selectAll('.spin-control')
58956                 .data([0]);
58957
58958             var enter = spinControl.enter()
58959                 .append('div')
58960                 .attr('class', 'spin-control');
58961
58962             enter
58963                 .append('button')
58964                 .datum(rtl ? 1 : -1)
58965                 .attr('class', rtl ? 'increment' : 'decrement')
58966                 .attr('tabindex', -1);
58967
58968             enter
58969                 .append('button')
58970                 .datum(rtl ? -1 : 1)
58971                 .attr('class', rtl ? 'decrement' : 'increment')
58972                 .attr('tabindex', -1);
58973
58974             spinControl = spinControl
58975                 .merge(enter);
58976
58977             spinControl.selectAll('button')
58978                 .on('click', function(d) {
58979                     event.preventDefault();
58980                     var num = parseInt(input.node().value || 0, 10);
58981                     if (!isNaN(num)) input.node().value = num + d;
58982                     change()();
58983                 });
58984         }
58985     }
58986
58987
58988     function change(onInput) {
58989         return function() {
58990             var t$$1 = {};
58991             t$$1[field.key] = utilGetSetValue(input) || undefined;
58992             dispatch$$1.call('change', this, t$$1, onInput);
58993         };
58994     }
58995
58996
58997     i.entity = function(_) {
58998         if (!arguments.length) return entity;
58999         entity = _;
59000         return i;
59001     };
59002
59003
59004     i.tags = function(tags) {
59005         utilGetSetValue(input, tags[field.key] || '');
59006     };
59007
59008
59009     i.focus = function() {
59010         var node = input.node();
59011         if (node) node.focus();
59012     };
59013
59014     return utilRebind(i, dispatch$$1, 'on');
59015 }
59016
59017 function uiFieldAccess(field, context) {
59018     var dispatch$$1 = dispatch('change'),
59019         items;
59020
59021     function access(selection$$1) {
59022         var wrap = selection$$1.selectAll('.preset-input-wrap')
59023             .data([0]);
59024
59025         wrap = wrap.enter()
59026             .append('div')
59027             .attr('class', 'cf preset-input-wrap')
59028             .append('ul')
59029             .merge(wrap);
59030
59031         var list = wrap.selectAll('ul')
59032             .data([0]);
59033
59034         list = list.enter()
59035             .append('ul')
59036             .merge(list);
59037
59038
59039         items = list.selectAll('li')
59040             .data(field.keys);
59041
59042         // Enter
59043         var enter = items.enter()
59044             .append('li')
59045             .attr('class', function(d) { return 'cf preset-access-' + d; });
59046
59047         enter
59048             .append('span')
59049             .attr('class', 'col6 label preset-label-access')
59050             .attr('for', function(d) { return 'preset-input-access-' + d; })
59051             .text(function(d) { return field.t('types.' + d); });
59052
59053         enter
59054             .append('div')
59055             .attr('class', 'col6 preset-input-access-wrap')
59056             .append('input')
59057             .attr('type', 'text')
59058             .attr('class', 'preset-input-access')
59059             .attr('id', function(d) { return 'preset-input-access-' + d; })
59060             .call(utilNoAuto)
59061             .each(function(d) {
59062                 d3_select(this)
59063                     .call(d3combobox()
59064                         .container(context.container())
59065                         .data(access.options(d))
59066                     );
59067             });
59068
59069
59070         // Update
59071         items = items.merge(enter);
59072
59073         wrap.selectAll('.preset-input-access')
59074             .on('change', change)
59075             .on('blur', change);
59076     }
59077
59078
59079     function change(d) {
59080         var tag = {};
59081         tag[d] = utilGetSetValue(d3_select(this)) || undefined;
59082         dispatch$$1.call('change', this, tag);
59083     }
59084
59085
59086     access.options = function(type) {
59087         var options = ['no', 'permissive', 'private', 'destination'];
59088
59089         if (type !== 'access') {
59090             options.unshift('yes');
59091             options.push('designated');
59092
59093             if (type === 'bicycle') {
59094                 options.push('dismount');
59095             }
59096         }
59097
59098         return options.map(function(option) {
59099             return {
59100                 title: field.t('options.' + option + '.description'),
59101                 value: option
59102             };
59103         });
59104     };
59105
59106
59107     var placeholders = {
59108         footway: {
59109             foot: 'designated',
59110             motor_vehicle: 'no'
59111         },
59112         steps: {
59113             foot: 'yes',
59114             motor_vehicle: 'no',
59115             bicycle: 'no',
59116             horse: 'no'
59117         },
59118         pedestrian: {
59119             foot: 'yes',
59120             motor_vehicle: 'no'
59121         },
59122         cycleway: {
59123             motor_vehicle: 'no',
59124             bicycle: 'designated'
59125         },
59126         bridleway: {
59127             motor_vehicle: 'no',
59128             horse: 'designated'
59129         },
59130         path: {
59131             foot: 'yes',
59132             motor_vehicle: 'no',
59133             bicycle: 'yes',
59134             horse: 'yes'
59135         },
59136         motorway: {
59137             foot: 'no',
59138             motor_vehicle: 'yes',
59139             bicycle: 'no',
59140             horse: 'no'
59141         },
59142         trunk: {
59143             motor_vehicle: 'yes'
59144         },
59145         primary: {
59146             foot: 'yes',
59147             motor_vehicle: 'yes',
59148             bicycle: 'yes',
59149             horse: 'yes'
59150         },
59151         secondary: {
59152             foot: 'yes',
59153             motor_vehicle: 'yes',
59154             bicycle: 'yes',
59155             horse: 'yes'
59156         },
59157         tertiary: {
59158             foot: 'yes',
59159             motor_vehicle: 'yes',
59160             bicycle: 'yes',
59161             horse: 'yes'
59162         },
59163         residential: {
59164             foot: 'yes',
59165             motor_vehicle: 'yes',
59166             bicycle: 'yes',
59167             horse: 'yes'
59168         },
59169         unclassified: {
59170             foot: 'yes',
59171             motor_vehicle: 'yes',
59172             bicycle: 'yes',
59173             horse: 'yes'
59174         },
59175         service: {
59176             foot: 'yes',
59177             motor_vehicle: 'yes',
59178             bicycle: 'yes',
59179             horse: 'yes'
59180         },
59181         motorway_link: {
59182             foot: 'no',
59183             motor_vehicle: 'yes',
59184             bicycle: 'no',
59185             horse: 'no'
59186         },
59187         trunk_link: {
59188             motor_vehicle: 'yes'
59189         },
59190         primary_link: {
59191             foot: 'yes',
59192             motor_vehicle: 'yes',
59193             bicycle: 'yes',
59194             horse: 'yes'
59195         },
59196         secondary_link: {
59197             foot: 'yes',
59198             motor_vehicle: 'yes',
59199             bicycle: 'yes',
59200             horse: 'yes'
59201         },
59202         tertiary_link: {
59203             foot: 'yes',
59204             motor_vehicle: 'yes',
59205             bicycle: 'yes',
59206             horse: 'yes'
59207         }
59208     };
59209
59210
59211     access.tags = function(tags) {
59212         utilGetSetValue(items.selectAll('.preset-input-access'),
59213             function(d) { return tags[d] || ''; })
59214             .attr('placeholder', function() {
59215                 return tags.access ? tags.access : field.placeholder();
59216             });
59217
59218         items.selectAll('#preset-input-access-access')
59219             .attr('placeholder', 'yes');
59220
59221         forEach(placeholders[tags.highway], function(v, k) {
59222             items.selectAll('#preset-input-access-' + k)
59223                 .attr('placeholder', function() { return (tags.access || v); });
59224         });
59225     };
59226
59227
59228     access.focus = function() {
59229         items.selectAll('.preset-input-access')
59230             .node().focus();
59231     };
59232
59233
59234     return utilRebind(access, dispatch$$1, 'on');
59235 }
59236
59237 function uiFieldAddress(field, context) {
59238     var dispatch$$1 = dispatch('init', 'change'),
59239         nominatim = services.geocoder,
59240         wrap = d3_select(null),
59241         isInitialized = false,
59242         entity;
59243
59244     function getNearStreets() {
59245         var extent = entity.extent(context.graph()),
59246             l = extent.center(),
59247             box = geoExtent$$1(l).padByMeters(200);
59248
59249         var streets = context.intersects(box)
59250             .filter(isAddressable)
59251             .map(function(d) {
59252                 var loc = context.projection([
59253                     (extent[0][0] + extent[1][0]) / 2,
59254                     (extent[0][1] + extent[1][1]) / 2]),
59255                     choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
59256                 return {
59257                     title: d.tags.name,
59258                     value: d.tags.name,
59259                     dist: choice.distance
59260                 };
59261             })
59262             .sort(function(a, b) {
59263                 return a.dist - b.dist;
59264             });
59265
59266         return uniqBy(streets, 'value');
59267
59268         function isAddressable(d) {
59269             return d.tags.highway && d.tags.name && d.type === 'way';
59270         }
59271     }
59272
59273
59274     function getNearCities() {
59275         var extent = entity.extent(context.graph()),
59276             l = extent.center(),
59277             box = geoExtent$$1(l).padByMeters(200);
59278
59279         var cities = context.intersects(box)
59280             .filter(isAddressable)
59281             .map(function(d) {
59282                 return {
59283                     title: d.tags['addr:city'] || d.tags.name,
59284                     value: d.tags['addr:city'] || d.tags.name,
59285                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
59286                 };
59287             })
59288             .sort(function(a, b) {
59289                 return a.dist - b.dist;
59290             });
59291
59292         return uniqBy(cities, 'value');
59293
59294
59295         function isAddressable(d) {
59296             if (d.tags.name &&
59297                 (d.tags.admin_level === '8' || d.tags.border_type === 'city'))
59298                 return true;
59299
59300             if (d.tags.place && d.tags.name && (
59301                     d.tags.place === 'city' ||
59302                     d.tags.place === 'town' ||
59303                     d.tags.place === 'village'))
59304                 return true;
59305
59306             if (d.tags['addr:city']) return true;
59307
59308             return false;
59309         }
59310     }
59311
59312     function getNearValues(key) {
59313         var extent = entity.extent(context.graph()),
59314             l = extent.center(),
59315             box = geoExtent$$1(l).padByMeters(200);
59316
59317         var results = context.intersects(box)
59318             .filter(function hasTag(d) {
59319                 return d.tags[key];
59320             })
59321             .map(function(d) {
59322                 return {
59323                     title: d.tags[key],
59324                     value: d.tags[key],
59325                     dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
59326                 };
59327             })
59328             .sort(function(a, b) {
59329                 return a.dist - b.dist;
59330             });
59331
59332         return uniqBy(results, 'value');
59333     }
59334
59335
59336     function initCallback(err, countryCode) {
59337         if (err) return;
59338
59339         var addressFormat = find$1(dataAddressFormats, function (a) {
59340             return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
59341         }) || dataAddressFormats[0];
59342
59343         var widths = addressFormat.widths || {
59344             housenumber: 1/3, street: 2/3,
59345             city: 2/3, state: 1/4, postcode: 1/3
59346         };
59347
59348         function row(r) {
59349             // Normalize widths.
59350             var total = reduce(r, function(sum, field) {
59351                 return sum + (widths[field] || 0.5);
59352             }, 0);
59353
59354             return r.map(function (field) {
59355                 return {
59356                     id: field,
59357                     width: (widths[field] || 0.5) / total
59358                 };
59359             });
59360         }
59361
59362         wrap.selectAll('div.addr-row')
59363             .data(addressFormat.format)
59364             .enter()
59365             .append('div')
59366             .attr('class', 'addr-row')
59367             .selectAll('input')
59368             .data(row)
59369             .enter()
59370             .append('input')
59371             .property('type', 'text')
59372             .attr('placeholder', function (d) {
59373                 var localkey = d.id + '!' + countryCode.toLowerCase(),
59374                     tkey = field.strings.placeholders[localkey] ? localkey : d.id;
59375                 return field.t('placeholders.' + tkey);
59376             })
59377             .attr('class', function (d) { return 'addr-' + d.id; })
59378             .call(utilNoAuto)
59379             .style('width', function (d) { return d.width * 100 + '%'; });
59380
59381         // Update
59382
59383         // setup dropdowns for common address tags
59384         var dropdowns = addressFormat.dropdowns || [
59385             'city', 'county', 'country', 'district', 'hamlet',
59386             'neighbourhood', 'place', 'postcode', 'province',
59387             'quarter', 'state', 'street', 'subdistrict', 'suburb'
59388         ];
59389
59390         // If fields exist for any of these tags, create dropdowns to pick nearby values..
59391         dropdowns.forEach(function(tag) {
59392             var nearValues = (tag === 'street') ? getNearStreets
59393                     : (tag === 'city') ? getNearCities
59394                     : getNearValues;
59395
59396             wrap.selectAll('input.addr-' + tag)
59397                 .call(d3combobox()
59398                     .container(context.container())
59399                     .minItems(1)
59400                     .fetcher(function(value, callback) {
59401                         callback(nearValues('addr:' + tag));
59402                     })
59403                 );
59404         });
59405
59406         wrap.selectAll('input')
59407             .on('blur', change())
59408             .on('change', change());
59409
59410         wrap.selectAll('input:not(.combobox-input)')
59411             .on('input', change(true));
59412
59413         dispatch$$1.call('init');
59414         isInitialized = true;
59415     }
59416
59417
59418     function address(selection$$1) {
59419         isInitialized = false;
59420
59421         wrap = selection$$1.selectAll('.preset-input-wrap')
59422             .data([0]);
59423
59424         wrap = wrap.enter()
59425             .append('div')
59426             .attr('class', 'preset-input-wrap')
59427             .merge(wrap);
59428
59429         if (nominatim && entity) {
59430             var center = entity.extent(context.graph()).center();
59431             nominatim.countryCode(center, initCallback);
59432         }
59433     }
59434
59435
59436     function change(onInput) {
59437         return function() {
59438             var tags = {};
59439
59440             wrap.selectAll('input')
59441                 .each(function (field) {
59442                     tags['addr:' + field.id] = this.value || undefined;
59443                 });
59444
59445             dispatch$$1.call('change', this, tags, onInput);
59446         };
59447     }
59448
59449
59450     function updateTags(tags) {
59451         utilGetSetValue(wrap.selectAll('input'), function (field) {
59452             return tags['addr:' + field.id] || '';
59453         });
59454     }
59455
59456
59457     address.entity = function(_) {
59458         if (!arguments.length) return entity;
59459         entity = _;
59460         return address;
59461     };
59462
59463
59464     address.tags = function(tags) {
59465         if (isInitialized) {
59466             updateTags(tags);
59467         } else {
59468             dispatch$$1.on('init', function () {
59469                 dispatch$$1.on('init', null);
59470                 updateTags(tags);
59471             });
59472         }
59473     };
59474
59475
59476     address.focus = function() {
59477         var node = wrap.selectAll('input').node();
59478         if (node) node.focus();
59479     };
59480
59481
59482     return utilRebind(address, dispatch$$1, 'on');
59483 }
59484
59485 function uiFieldCycleway(field, context) {
59486     var dispatch$$1 = dispatch('change'),
59487         items = d3_select(null);
59488
59489
59490     function cycleway(selection$$1) {
59491
59492         function stripcolon(s) {
59493             return s.replace(':', '');
59494         }
59495
59496
59497         var wrap = selection$$1.selectAll('.preset-input-wrap')
59498             .data([0]);
59499
59500         wrap = wrap.enter()
59501             .append('div')
59502             .attr('class', 'cf preset-input-wrap')
59503             .merge(wrap);
59504
59505
59506         var div = wrap.selectAll('ul')
59507             .data([0]);
59508
59509         div = div.enter()
59510             .append('ul')
59511             .merge(div);
59512
59513
59514         items = div.selectAll('li')
59515             .data(field.keys);
59516
59517         var enter = items.enter()
59518             .append('li')
59519             .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
59520
59521         enter
59522             .append('span')
59523             .attr('class', 'col6 label preset-label-cycleway')
59524             .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
59525             .text(function(d) { return field.t('types.' + d); });
59526
59527         enter
59528             .append('div')
59529             .attr('class', 'col6 preset-input-cycleway-wrap')
59530             .append('input')
59531             .attr('type', 'text')
59532             .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
59533             .call(utilNoAuto)
59534             .each(function(d) {
59535                 d3_select(this)
59536                     .call(d3combobox()
59537                         .container(context.container())
59538                         .data(cycleway.options(d))
59539                     );
59540             });
59541
59542
59543         // Update
59544         wrap.selectAll('.preset-input-cycleway')
59545             .on('change', change)
59546             .on('blur', change);
59547     }
59548
59549
59550     function change() {
59551         var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft')),
59552             right = utilGetSetValue(d3_select('.preset-input-cyclewayright')),
59553             tag = {};
59554
59555         if (left === 'none' || left === '') { left = undefined; }
59556         if (right === 'none' || right === '') { right = undefined; }
59557
59558         // Always set both left and right as changing one can affect the other
59559         tag = {
59560             cycleway: undefined,
59561             'cycleway:left': left,
59562             'cycleway:right': right
59563         };
59564
59565         // If the left and right tags match, use the cycleway tag to tag both
59566         // sides the same way
59567         if (left === right) {
59568             tag = {
59569                 cycleway: left,
59570                 'cycleway:left': undefined,
59571                 'cycleway:right': undefined
59572             };
59573         }
59574
59575         dispatch$$1.call('change', this, tag);
59576     }
59577
59578
59579     cycleway.options = function() {
59580         return keys$1(field.strings.options).map(function(option) {
59581             return {
59582                 title: field.t('options.' + option + '.description'),
59583                 value: option
59584             };
59585         });
59586     };
59587
59588
59589     cycleway.tags = function(tags) {
59590         utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
59591                 // If cycleway is set, always return that
59592                 if (tags.cycleway) {
59593                     return tags.cycleway;
59594                 }
59595                 return tags[d] || '';
59596             })
59597             .attr('placeholder', field.placeholder());
59598     };
59599
59600
59601     cycleway.focus = function() {
59602         items.selectAll('.preset-input-cycleway')
59603             .node().focus();
59604     };
59605
59606
59607     return utilRebind(cycleway, dispatch$$1, 'on');
59608 }
59609
59610 function uiFieldLanes(field, context) {
59611     var dispatch$$1 = dispatch('change'),
59612         LANE_WIDTH = 40,
59613         LANE_HEIGHT = 200,
59614         wayID,
59615         lanesData;
59616
59617     function lanes(selection$$1) {
59618         lanesData = context.entity(wayID).lanes();
59619
59620         if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
59621             selection$$1.call(lanes.off);
59622             return;
59623         }
59624
59625         var wrap = selection$$1.selectAll('.preset-input-wrap')
59626             .data([0]);
59627
59628         wrap = wrap.enter()
59629             .append('div')
59630             .attr('class', 'preset-input-wrap')
59631             .merge(wrap);
59632
59633         var surface =  wrap.selectAll('.surface')
59634             .data([0]);
59635
59636         var d = utilGetDimensions(wrap);
59637         var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
59638
59639         surface = surface.enter()
59640             .append('svg')
59641             .attr('width', d[0])
59642             .attr('height', 300)
59643             .attr('class', 'surface')
59644             .merge(surface);
59645
59646
59647         var lanesSelection = surface.selectAll('.lanes')
59648             .data([0]);
59649
59650         lanesSelection = lanesSelection.enter()
59651             .append('g')
59652             .attr('class', 'lanes')
59653             .merge(lanesSelection);
59654
59655         lanesSelection
59656             .attr('transform', function () {
59657                 return 'translate(' + (freeSpace / 2) + ', 0)';
59658             });
59659
59660
59661         var lane = lanesSelection.selectAll('.lane')
59662            .data(lanesData.lanes);
59663
59664         lane.exit()
59665             .remove();
59666
59667         var enter = lane.enter()
59668             .append('g')
59669             .attr('class', 'lane');
59670
59671         enter
59672             .append('g')
59673             .append('rect')
59674             .attr('y', 50)
59675             .attr('width', LANE_WIDTH)
59676             .attr('height', LANE_HEIGHT);
59677
59678         enter
59679             .append('g')
59680             .attr('class', 'forward')
59681             .append('text')
59682             .attr('y', 40)
59683             .attr('x', 14)
59684             .text('▲');
59685
59686         enter
59687             .append('g')
59688             .attr('class', 'bothways')
59689             .append('text')
59690             .attr('y', 40)
59691             .attr('x', 14)
59692             .text('▲▼');
59693
59694         enter
59695             .append('g')
59696             .attr('class', 'backward')
59697             .append('text')
59698             .attr('y', 40)
59699             .attr('x', 14)
59700             .text('▼');
59701
59702
59703         lane = lane
59704             .merge(enter);
59705
59706         lane
59707             .attr('transform', function(d) {
59708                 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
59709             });
59710
59711         lane.select('.forward')
59712             .style('visibility', function(d) {
59713                 return d.direction === 'forward' ? 'visible' : 'hidden';
59714             });
59715
59716         lane.select('.bothways')
59717             .style('visibility', function(d) {
59718                 return d.direction === 'bothways' ? 'visible' : 'hidden';
59719             });
59720
59721         lane.select('.backward')
59722             .style('visibility', function(d) {
59723                 return d.direction === 'backward' ? 'visible' : 'hidden';
59724             });
59725     }
59726
59727
59728     lanes.entity = function(_) {
59729         if (!wayID || wayID !== _.id) {
59730             wayID = _.id;
59731         }
59732     };
59733
59734     lanes.tags = function() {};
59735     lanes.focus = function() {};
59736     lanes.off = function() {};
59737
59738     return utilRebind(lanes, dispatch$$1, 'on');
59739 }
59740
59741 function uiFieldLocalized(field, context) {
59742     var dispatch$$1 = dispatch('change', 'input'),
59743         wikipedia = services.wikipedia,
59744         input = d3_select(null),
59745         localizedInputs = d3_select(null),
59746         wikiTitles,
59747         entity;
59748
59749
59750     function localized(selection$$1) {
59751         input = selection$$1.selectAll('.localized-main')
59752             .data([0]);
59753
59754         input = input.enter()
59755             .append('input')
59756             .attr('type', 'text')
59757             .attr('id', 'preset-input-' + field.id)
59758             .attr('class', 'localized-main')
59759             .attr('placeholder', field.placeholder())
59760             .call(utilNoAuto)
59761             .merge(input);
59762
59763         if (field.id === 'name') {
59764             var preset = context.presets().match(entity, context.graph());
59765             input
59766                 .call(d3combobox()
59767                     .container(context.container())
59768                     .fetcher(utilSuggestNames(preset, dataSuggestions))
59769                 );
59770         }
59771
59772         input
59773             .on('input', change(true))
59774             .on('blur', change())
59775             .on('change', change());
59776
59777
59778         var translateButton = selection$$1.selectAll('.localized-add')
59779             .data([0]);
59780
59781         translateButton = translateButton.enter()
59782             .append('button')
59783             .attr('class', 'button-input-action localized-add minor')
59784             .attr('tabindex', -1)
59785             .call(svgIcon('#icon-plus'))
59786             .call(tooltip()
59787                 .title(t('translate.translate'))
59788                 .placement('left'))
59789             .merge(translateButton);
59790
59791         translateButton
59792             .on('click', addNew);
59793
59794
59795         localizedInputs = selection$$1.selectAll('.localized-wrap')
59796             .data([0]);
59797
59798         localizedInputs = localizedInputs.enter().append('div')
59799             .attr('class', 'localized-wrap')
59800             .merge(localizedInputs);
59801     }
59802
59803
59804     function addNew() {
59805         event.preventDefault();
59806         var data$$1 = localizedInputs.selectAll('div.entry').data();
59807         var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
59808         var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
59809         var isLangEn = defaultLang.indexOf('en') > -1;
59810         if (isLangEn || langExists) {
59811             defaultLang = '';
59812         }
59813         data$$1.push({ lang: defaultLang, value: '' });
59814         localizedInputs.call(render, data$$1);
59815     }
59816
59817
59818     function change(onInput) {
59819         return function() {
59820             var t$$1 = {};
59821             t$$1[field.key] = utilGetSetValue(d3_select(this)) || undefined;
59822             dispatch$$1.call('change', this, t$$1, onInput);
59823         };
59824     }
59825
59826
59827     function key(lang) {
59828         return field.key + ':' + lang;
59829     }
59830
59831
59832     function changeLang(d) {
59833         var lang = utilGetSetValue(d3_select(this)),
59834             t$$1 = {},
59835             language = find$1(dataWikipedia, function(d) {
59836                 return d[0].toLowerCase() === lang.toLowerCase() ||
59837                     d[1].toLowerCase() === lang.toLowerCase();
59838             });
59839
59840         if (language) lang = language[2];
59841
59842         if (d.lang && d.lang !== lang) {
59843             t$$1[key(d.lang)] = undefined;
59844         }
59845
59846         var value = utilGetSetValue(d3_select(this.parentNode)
59847             .selectAll('.localized-value'));
59848
59849         if (lang && value) {
59850             t$$1[key(lang)] = value;
59851         } else if (lang && wikiTitles && wikiTitles[d.lang]) {
59852             t$$1[key(lang)] = wikiTitles[d.lang];
59853         }
59854
59855         d.lang = lang;
59856         dispatch$$1.call('change', this, t$$1);
59857     }
59858
59859
59860     function changeValue(d) {
59861         if (!d.lang) return;
59862         var t$$1 = {};
59863         t$$1[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
59864         dispatch$$1.call('change', this, t$$1);
59865     }
59866
59867
59868     function fetcher(value, cb) {
59869         var v = value.toLowerCase();
59870
59871         cb(dataWikipedia.filter(function(d) {
59872             return d[0].toLowerCase().indexOf(v) >= 0 ||
59873             d[1].toLowerCase().indexOf(v) >= 0 ||
59874             d[2].toLowerCase().indexOf(v) >= 0;
59875         }).map(function(d) {
59876             return { value: d[1] };
59877         }));
59878     }
59879
59880
59881     function render(selection$$1, data$$1) {
59882         var wraps = selection$$1.selectAll('div.entry').
59883             data(data$$1, function(d) { return d.lang; });
59884
59885         wraps.exit()
59886             .transition()
59887             .duration(200)
59888             .style('max-height','0px')
59889             .style('opacity', '0')
59890             .style('top','-10px')
59891             .remove();
59892
59893         var innerWrap = wraps.enter()
59894             .insert('div', ':first-child');
59895
59896         innerWrap.attr('class', 'entry')
59897             .each(function() {
59898                 var wrap = d3_select(this);
59899                 var langcombo = d3combobox()
59900                     .container(context.container())
59901                     .fetcher(fetcher)
59902                     .minItems(0);
59903
59904                 var label = wrap
59905                     .append('label')
59906                     .attr('class','form-label')
59907                     .text(t('translate.localized_translation_label'))
59908                     .attr('for','localized-lang');
59909
59910                 label
59911                     .append('button')
59912                     .attr('class', 'minor remove')
59913                     .on('click', function(d){
59914                         event.preventDefault();
59915                         var t$$1 = {};
59916                         t$$1[key(d.lang)] = undefined;
59917                         dispatch$$1.call('change', this, t$$1);
59918                         d3_select(this.parentNode.parentNode)
59919                             .style('top','0')
59920                             .style('max-height','240px')
59921                             .transition()
59922                             .style('opacity', '0')
59923                             .style('max-height','0px')
59924                             .remove();
59925                     })
59926                     .call(svgIcon('#operation-delete'));
59927
59928                 wrap
59929                     .append('input')
59930                     .attr('class', 'localized-lang')
59931                     .attr('type', 'text')
59932                     .attr('placeholder',t('translate.localized_translation_language'))
59933                     .on('blur', changeLang)
59934                     .on('change', changeLang)
59935                     .call(langcombo);
59936
59937                 wrap
59938                     .append('input')
59939                     .on('blur', changeValue)
59940                     .on('change', changeValue)
59941                     .attr('type', 'text')
59942                     .attr('placeholder', t('translate.localized_translation_name'))
59943                     .attr('class', 'localized-value');
59944             });
59945
59946         innerWrap
59947             .style('margin-top', '0px')
59948             .style('max-height', '0px')
59949             .style('opacity', '0')
59950             .transition()
59951             .duration(200)
59952             .style('margin-top', '10px')
59953             .style('max-height', '240px')
59954             .style('opacity', '1')
59955             .on('end', function() {
59956                 d3_select(this)
59957                     .style('max-height', '')
59958                     .style('overflow', 'visible');
59959             });
59960
59961
59962         var entry = selection$$1.selectAll('.entry');
59963
59964         utilGetSetValue(entry.select('.localized-lang'), function(d) {
59965                 var lang = find$1(dataWikipedia, function(lang) { return lang[2] === d.lang; });
59966                 return lang ? lang[1] : d.lang;
59967             });
59968
59969         utilGetSetValue(entry.select('.localized-value'),
59970             function(d) { return d.value; });
59971     }
59972
59973
59974     localized.tags = function(tags) {
59975         // Fetch translations from wikipedia
59976         if (tags.wikipedia && !wikiTitles) {
59977             wikiTitles = {};
59978             var wm = tags.wikipedia.match(/([^:]+):(.+)/);
59979             if (wm && wm[0] && wm[1]) {
59980                 wikipedia.translations(wm[1], wm[2], function(d) {
59981                     wikiTitles = d;
59982                 });
59983             }
59984         }
59985
59986         utilGetSetValue(input, tags[field.key] || '');
59987
59988         var postfixed = [], k, m;
59989         for (k in tags) {
59990             m = k.match(/^(.*):([a-zA-Z_-]+)$/);
59991             if (m && m[1] === field.key && m[2]) {
59992                 postfixed.push({ lang: m[2], value: tags[k] });
59993             }
59994         }
59995
59996         localizedInputs.call(render, postfixed.reverse());
59997     };
59998
59999
60000     localized.focus = function() {
60001         input.node().focus();
60002     };
60003
60004
60005     localized.entity = function(_) {
60006         if (!arguments.length) return entity;
60007         entity = _;
60008         return localized;
60009     };
60010
60011     return utilRebind(localized, dispatch$$1, 'on');
60012 }
60013
60014 function uiFieldMaxspeed(field, context) {
60015     var dispatch$$1 = dispatch('change'),
60016         entity,
60017         isImperial,
60018         unitInput = d3_select(null),
60019         input = d3_select(null),
60020         combobox;
60021
60022     var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
60023         imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
60024
60025
60026     function maxspeed(selection$$1) {
60027         combobox = d3combobox()
60028             .container(context.container());
60029
60030         var unitCombobox = d3combobox()
60031             .container(context.container())
60032             .data(['km/h', 'mph'].map(comboValues));
60033
60034         input = selection$$1.selectAll('#preset-input-' + field.id)
60035             .data([0]);
60036
60037         input = input.enter()
60038             .append('input')
60039             .attr('type', 'text')
60040             .attr('id', 'preset-input-' + field.id)
60041             .attr('placeholder', field.placeholder())
60042             .call(utilNoAuto)
60043             .call(combobox)
60044             .merge(input);
60045
60046         input
60047             .on('change', change)
60048             .on('blur', change);
60049
60050         var childNodes = context.graph().childNodes(context.entity(entity.id)),
60051             loc = childNodes[~~(childNodes.length/2)].loc;
60052
60053         isImperial = some(dataImperial.features, function(f) {
60054             return some(f.geometry.coordinates, function(d) {
60055                 return geoPointInPolygon(loc, d);
60056             });
60057         });
60058
60059         unitInput = selection$$1.selectAll('input.maxspeed-unit')
60060             .data([0]);
60061
60062         unitInput = unitInput.enter()
60063             .append('input')
60064             .attr('type', 'text')
60065             .attr('class', 'maxspeed-unit')
60066             .call(unitCombobox)
60067             .merge(unitInput);
60068
60069         unitInput
60070             .on('blur', changeUnits)
60071             .on('change', changeUnits);
60072
60073
60074         function changeUnits() {
60075             isImperial = utilGetSetValue(unitInput) === 'mph';
60076             utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
60077             setSuggestions();
60078             change();
60079         }
60080     }
60081
60082
60083     function setSuggestions() {
60084         combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
60085         utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
60086     }
60087
60088
60089     function comboValues(d) {
60090         return {
60091             value: d.toString(),
60092             title: d.toString()
60093         };
60094     }
60095
60096
60097     function change() {
60098         var tag = {},
60099             value = utilGetSetValue(input);
60100
60101         if (!value) {
60102             tag[field.key] = undefined;
60103         } else if (isNaN(value) || !isImperial) {
60104             tag[field.key] = value;
60105         } else {
60106             tag[field.key] = value + ' mph';
60107         }
60108
60109         dispatch$$1.call('change', this, tag);
60110     }
60111
60112
60113     maxspeed.tags = function(tags) {
60114         var value = tags[field.key];
60115
60116         if (value && value.indexOf('mph') >= 0) {
60117             value = parseInt(value, 10);
60118             isImperial = true;
60119         } else if (value) {
60120             isImperial = false;
60121         }
60122
60123         setSuggestions();
60124         utilGetSetValue(input, value || '');
60125     };
60126
60127
60128     maxspeed.focus = function() {
60129         input.node().focus();
60130     };
60131
60132
60133     maxspeed.entity = function(_) {
60134         entity = _;
60135     };
60136
60137
60138     return utilRebind(maxspeed, dispatch$$1, 'on');
60139 }
60140
60141 /**
60142  * This function is like `baseIndexOf` except that it accepts a comparator.
60143  *
60144  * @private
60145  * @param {Array} array The array to inspect.
60146  * @param {*} value The value to search for.
60147  * @param {number} fromIndex The index to search from.
60148  * @param {Function} comparator The comparator invoked per element.
60149  * @returns {number} Returns the index of the matched value, else `-1`.
60150  */
60151 function baseIndexOfWith(array, value, fromIndex, comparator) {
60152   var index = fromIndex - 1,
60153       length = array.length;
60154
60155   while (++index < length) {
60156     if (comparator(array[index], value)) {
60157       return index;
60158     }
60159   }
60160   return -1;
60161 }
60162
60163 /** Used for built-in method references. */
60164 var arrayProto$2 = Array.prototype;
60165
60166 /** Built-in value references. */
60167 var splice$2 = arrayProto$2.splice;
60168
60169 /**
60170  * The base implementation of `_.pullAllBy` without support for iteratee
60171  * shorthands.
60172  *
60173  * @private
60174  * @param {Array} array The array to modify.
60175  * @param {Array} values The values to remove.
60176  * @param {Function} [iteratee] The iteratee invoked per element.
60177  * @param {Function} [comparator] The comparator invoked per element.
60178  * @returns {Array} Returns `array`.
60179  */
60180 function basePullAll(array, values, iteratee, comparator) {
60181   var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
60182       index = -1,
60183       length = values.length,
60184       seen = array;
60185
60186   if (array === values) {
60187     values = copyArray(values);
60188   }
60189   if (iteratee) {
60190     seen = arrayMap(array, baseUnary(iteratee));
60191   }
60192   while (++index < length) {
60193     var fromIndex = 0,
60194         value = values[index],
60195         computed = iteratee ? iteratee(value) : value;
60196
60197     while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
60198       if (seen !== array) {
60199         splice$2.call(seen, fromIndex, 1);
60200       }
60201       splice$2.call(array, fromIndex, 1);
60202     }
60203   }
60204   return array;
60205 }
60206
60207 /**
60208  * This method is like `_.pull` except that it accepts an array of values to remove.
60209  *
60210  * **Note:** Unlike `_.difference`, this method mutates `array`.
60211  *
60212  * @static
60213  * @memberOf _
60214  * @since 4.0.0
60215  * @category Array
60216  * @param {Array} array The array to modify.
60217  * @param {Array} values The values to remove.
60218  * @returns {Array} Returns `array`.
60219  * @example
60220  *
60221  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
60222  *
60223  * _.pullAll(array, ['a', 'c']);
60224  * console.log(array);
60225  * // => ['b', 'b']
60226  */
60227 function pullAll(array, values) {
60228   return (array && array.length && values && values.length)
60229     ? basePullAll(array, values)
60230     : array;
60231 }
60232
60233 /**
60234  * Removes all given values from `array` using
60235  * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
60236  * for equality comparisons.
60237  *
60238  * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
60239  * to remove elements from an array by predicate.
60240  *
60241  * @static
60242  * @memberOf _
60243  * @since 2.0.0
60244  * @category Array
60245  * @param {Array} array The array to modify.
60246  * @param {...*} [values] The values to remove.
60247  * @returns {Array} Returns `array`.
60248  * @example
60249  *
60250  * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
60251  *
60252  * _.pull(array, 'a', 'c');
60253  * console.log(array);
60254  * // => ['b', 'b']
60255  */
60256 var pull = baseRest(pullAll);
60257
60258 function uiFieldRadio(field, context) {
60259     var dispatch$$1 = dispatch('change'),
60260         placeholder = d3_select(null),
60261         wrap = d3_select(null),
60262         labels = d3_select(null),
60263         radios = d3_select(null),
60264         radioData = clone(field.options || field.keys),
60265         typeField,
60266         layerField,
60267         oldType = {},
60268         entity;
60269
60270
60271     function selectedKey() {
60272         var node = wrap.selectAll('.toggle-list label.active input');
60273         return !node.empty() && node.datum();
60274     }
60275
60276
60277     function radio(selection$$1) {
60278         selection$$1.classed('preset-radio', true);
60279
60280         wrap = selection$$1.selectAll('.preset-input-wrap')
60281             .data([0]);
60282
60283         var enter = wrap.enter()
60284             .append('div')
60285             .attr('class', 'preset-input-wrap toggle-list');
60286
60287         enter
60288             .append('span')
60289             .attr('class', 'placeholder');
60290
60291         wrap = wrap
60292             .merge(enter);
60293
60294
60295         placeholder = wrap.selectAll('.placeholder');
60296
60297         labels = wrap.selectAll('label')
60298             .data(radioData);
60299
60300         enter = labels.enter()
60301             .append('label');
60302
60303         enter
60304             .append('input')
60305             .attr('type', 'radio')
60306             .attr('name', field.id)
60307             .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
60308             .attr('checked', false);
60309
60310         enter
60311             .append('span')
60312             .text(function(d) { return field.t('options.' + d, { 'default': d }); });
60313
60314         labels = labels
60315             .merge(enter);
60316
60317         radios = labels.selectAll('input')
60318             .on('change', changeRadio);
60319
60320     }
60321
60322
60323     function structureExtras(selection$$1, tags) {
60324         var selected = selectedKey(),
60325             type = context.presets().field(selected),
60326             layer = context.presets().field('layer'),
60327             showLayer = (selected === 'bridge' || selected === 'tunnel');
60328
60329
60330         var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
60331             .data(selected ? [0] : []);
60332
60333         extrasWrap.exit()
60334             .remove();
60335
60336         extrasWrap = extrasWrap.enter()
60337             .append('div')
60338             .attr('class', 'structure-extras-wrap')
60339             .merge(extrasWrap);
60340
60341         var list = extrasWrap.selectAll('ul')
60342             .data([0]);
60343
60344         list = list.enter()
60345             .append('ul')
60346             .merge(list);
60347
60348
60349         // Type
60350         if (type) {
60351             if (!typeField || typeField.id !== selected) {
60352                 typeField = uiField(context, type, entity, { wrap: false })
60353                     .on('change', changeType);
60354             }
60355             typeField.tags(tags);
60356         } else {
60357             typeField = null;
60358         }
60359
60360         var typeItem = list.selectAll('.structure-type-item')
60361             .data(typeField ? [typeField] : [], function(d) { return d.id; });
60362
60363         // Exit
60364         typeItem.exit()
60365             .remove();
60366
60367         // Enter
60368         var typeEnter = typeItem.enter()
60369             .insert('li', ':first-child')
60370             .attr('class', 'cf structure-type-item');
60371
60372         typeEnter
60373             .append('span')
60374             .attr('class', 'col6 label structure-label-type')
60375             .attr('for', 'preset-input-' + selected)
60376             .text(t('inspector.radio.structure.type'));
60377
60378         typeEnter
60379             .append('div')
60380             .attr('class', 'col6 structure-input-type-wrap');
60381
60382         // Update
60383         typeItem = typeItem
60384             .merge(typeEnter);
60385
60386         if (typeField) {
60387             typeItem.selectAll('.structure-input-type-wrap')
60388                 .call(typeField.render);
60389         }
60390
60391
60392         // Layer
60393         if (layer && showLayer) {
60394             if (!layerField) {
60395                 layerField = uiField(context, layer, entity, { wrap: false })
60396                     .on('change', changeLayer);
60397             }
60398             layerField.tags(tags);
60399             field.keys = union(field.keys, ['layer']);
60400         } else {
60401             layerField = null;
60402             pull(field.keys, 'layer');
60403         }
60404
60405         var layerItem = list.selectAll('.structure-layer-item')
60406             .data(layerField ? [layerField] : []);
60407
60408         // Exit
60409         layerItem.exit()
60410             .remove();
60411
60412         // Enter
60413         var layerEnter = layerItem.enter()
60414             .append('li')
60415             .attr('class', 'cf structure-layer-item');
60416
60417         layerEnter
60418             .append('span')
60419             .attr('class', 'col6 label structure-label-layer')
60420             .attr('for', 'preset-input-layer')
60421             .text(t('inspector.radio.structure.layer'));
60422
60423         layerEnter
60424             .append('div')
60425             .attr('class', 'col6 structure-input-layer-wrap');
60426
60427         // Update
60428         layerItem = layerItem
60429             .merge(layerEnter);
60430
60431         if (layerField) {
60432             layerItem.selectAll('.structure-input-layer-wrap')
60433                 .call(layerField.render);
60434         }
60435     }
60436
60437
60438     function changeType(t$$1, onInput) {
60439         var key = selectedKey();
60440         if (!key) return;
60441
60442         var val = t$$1[key];
60443         if (val !== 'no') {
60444             oldType[key] = val;
60445         }
60446
60447         if (field.type === 'structureRadio') {
60448             if (val === 'no' || (key !== 'bridge' && key !== 'tunnel')) {
60449                 t$$1.layer = undefined;
60450             }
60451         }
60452
60453         dispatch$$1.call('change', this, t$$1, onInput);
60454     }
60455
60456
60457     function changeLayer(t$$1, onInput) {
60458         if (t$$1.layer === '0') {
60459             t$$1.layer = undefined;
60460         }
60461         dispatch$$1.call('change', this, t$$1, onInput);
60462     }
60463
60464
60465     function changeRadio() {
60466         var t$$1 = {},
60467             activeKey;
60468
60469         if (field.key) {
60470             t$$1[field.key] = undefined;
60471         }
60472
60473         radios.each(function(d) {
60474             var active = d3_select(this).property('checked');
60475             if (active) activeKey = d;
60476
60477             if (field.key) {
60478                 if (active) t$$1[field.key] = d;
60479             } else {
60480                 var val = oldType[activeKey] || 'yes';
60481                 t$$1[d] = active ? val : undefined;
60482             }
60483         });
60484
60485         if (field.type === 'structureRadio') {
60486             if (activeKey === 'bridge') {
60487                 t$$1.layer = '1';
60488             } else if (activeKey === 'tunnel') {
60489                 t$$1.layer = '-1';
60490             } else {
60491                 t$$1.layer = undefined;
60492             }
60493         }
60494
60495         dispatch$$1.call('change', this, t$$1);
60496     }
60497
60498
60499     radio.tags = function(tags) {
60500         function checked(d) {
60501             if (field.key) {
60502                 return tags[field.key] === d;
60503             } else {
60504                 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
60505             }
60506         }
60507
60508         labels.classed('active', checked);
60509         radios.property('checked', checked);
60510
60511         var selection$$1 = radios.filter(function() { return this.checked; });
60512
60513         if (selection$$1.empty()) {
60514             placeholder.text(t('inspector.none'));
60515         } else {
60516             placeholder.text(selection$$1.attr('value'));
60517             oldType[selection$$1.datum()] = tags[selection$$1.datum()];
60518         }
60519
60520         if (field.type === 'structureRadio') {
60521             // For waterways without a tunnel tag, set 'culvert' as
60522             // the oldType to default to if the user picks 'tunnel'
60523             if (!!tags.waterway && !oldType.tunnel) {
60524                 oldType.tunnel = 'culvert';
60525             }
60526
60527             wrap.call(structureExtras, tags);
60528         }
60529     };
60530
60531
60532     radio.focus = function() {
60533         radios.node().focus();
60534     };
60535
60536
60537     radio.entity = function(_) {
60538         if (!arguments.length) return entity;
60539         entity = _;
60540         oldType = {};
60541         return radio;
60542     };
60543
60544
60545     return utilRebind(radio, dispatch$$1, 'on');
60546 }
60547
60548 function uiFieldRestrictions(field, context) {
60549     var dispatch$$1 = dispatch('change'),
60550         breathe = behaviorBreathe(context),
60551         hover = behaviorHover(context),
60552         initialized = false,
60553         vertexID,
60554         fromNodeID;
60555
60556
60557     function restrictions(selection$$1) {
60558         // if form field is hidden or has detached from dom, clean up.
60559         if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
60560             selection$$1.call(restrictions.off);
60561             return;
60562         }
60563
60564         var wrap = selection$$1.selectAll('.preset-input-wrap')
60565             .data([0]);
60566
60567         var enter = wrap.enter()
60568             .append('div')
60569             .attr('class', 'preset-input-wrap');
60570
60571         enter
60572             .append('div')
60573             .attr('class', 'restriction-help');
60574
60575
60576         var intersection = osmIntersection(context.graph(), vertexID),
60577             graph = intersection.graph,
60578             vertex = graph.entity(vertexID),
60579             filter = utilFunctor(true),
60580             extent = geoExtent$$1(),
60581             projection = geoRawMercator();
60582
60583         var d = utilGetDimensions(wrap.merge(enter)),
60584             c = [d[0] / 2, d[1] / 2],
60585             z = 24;
60586
60587         projection
60588             .scale(256 * Math.pow(2, z) / (2 * Math.PI));
60589
60590         var s = projection(vertex.loc);
60591
60592         projection
60593             .translate([c[0] - s[0], c[1] - s[1]])
60594             .clipExtent([[0, 0], d]);
60595
60596         var drawLayers = svgLayers(projection, context).only('osm').dimensions(d),
60597             drawVertices = svgVertices$$1(projection, context),
60598             drawLines = svgLines$$1(projection, context),
60599             drawTurns = svgTurns(projection, context);
60600
60601         enter
60602             .call(drawLayers);
60603
60604         wrap = wrap
60605             .merge(enter);
60606
60607         var surface = wrap.selectAll('.surface');
60608
60609         if (!enter.empty()) {
60610             initialized = true;
60611             surface
60612                 .call(breathe)
60613                 .call(hover);
60614         }
60615
60616         surface
60617             .call(utilSetDimensions, d)
60618             .call(drawVertices, graph, [vertex], filter, extent, z)
60619             .call(drawLines, graph, intersection.ways, filter)
60620             .call(drawTurns, graph, intersection.turns(fromNodeID));
60621
60622         surface
60623             .on('click.restrictions', click)
60624             .on('mouseover.restrictions', mouseover)
60625             .on('mouseout.restrictions', mouseout);
60626
60627         surface
60628             .selectAll('.selected')
60629             .classed('selected', false);
60630
60631         if (fromNodeID) {
60632             surface
60633                 .selectAll('.' + intersection.highways[fromNodeID].id)
60634                 .classed('selected', true);
60635         }
60636
60637         mouseout();
60638
60639         context.history()
60640             .on('change.restrictions', render);
60641
60642         d3_select(window)
60643             .on('resize.restrictions', function() {
60644                 utilSetDimensions(wrap, null);
60645                 render();
60646             });
60647
60648
60649         function click() {
60650             surface
60651                 .call(breathe.off)
60652                 .call(breathe);
60653
60654             var datum = event.target.__data__;
60655             if (datum instanceof osmEntity$$1) {
60656                 fromNodeID = intersection.adjacentNodeId(datum.id);
60657                 render();
60658             } else if (datum instanceof osmTurn) {
60659                 if (datum.restriction) {
60660                     context.perform(
60661                         actionUnrestrictTurn(datum, projection),
60662                         t('operations.restriction.annotation.delete')
60663                     );
60664                 } else {
60665                     context.perform(
60666                         actionRestrictTurn(datum, projection),
60667                         t('operations.restriction.annotation.create')
60668                     );
60669                 }
60670             }
60671         }
60672
60673
60674         function mouseover() {
60675             var datum = event.target.__data__;
60676             if (datum instanceof osmTurn) {
60677                 var graph = context.graph(),
60678                     presets = context.presets(),
60679                     preset;
60680
60681                 if (datum.restriction) {
60682                     preset = presets.match(graph.entity(datum.restriction), graph);
60683                 } else {
60684                     preset = presets.item('type/restriction/' +
60685                         osmInferRestriction(
60686                             graph,
60687                             datum.from,
60688                             datum.via,
60689                             datum.to,
60690                             projection
60691                         )
60692                     );
60693                 }
60694
60695                 wrap.selectAll('.restriction-help')
60696                     .text(t('operations.restriction.help.' +
60697                         (datum.restriction ? 'toggle_off' : 'toggle_on'),
60698                         { restriction: preset.name() })
60699                     );
60700             }
60701         }
60702
60703
60704         function mouseout() {
60705             wrap.selectAll('.restriction-help')
60706                 .text(t('operations.restriction.help.' +
60707                     (fromNodeID ? 'toggle' : 'select'))
60708                 );
60709         }
60710
60711
60712         function render() {
60713             if (context.hasEntity(vertexID)) {
60714                 restrictions(selection$$1);
60715             }
60716         }
60717     }
60718
60719
60720     restrictions.entity = function(_) {
60721         if (!vertexID || vertexID !== _.id) {
60722             fromNodeID = null;
60723             vertexID = _.id;
60724         }
60725     };
60726
60727
60728     restrictions.tags = function() {};
60729     restrictions.focus = function() {};
60730
60731
60732     restrictions.off = function(selection$$1) {
60733         if (!initialized) return;
60734
60735         selection$$1.selectAll('.surface')
60736             .call(hover.off)
60737             .call(breathe.off)
60738             .on('click.restrictions', null)
60739             .on('mouseover.restrictions', null)
60740             .on('mouseout.restrictions', null);
60741
60742         context.history()
60743             .on('change.restrictions', null);
60744
60745         d3_select(window)
60746             .on('resize.restrictions', null);
60747     };
60748
60749
60750     return utilRebind(restrictions, dispatch$$1, 'on');
60751 }
60752
60753 function uiFieldTextarea(field) {
60754     var dispatch$$1 = dispatch('change'),
60755         input = d3_select(null);
60756
60757
60758     function textarea(selection$$1) {
60759         input = selection$$1.selectAll('textarea')
60760             .data([0]);
60761
60762         input = input.enter()
60763             .append('textarea')
60764             .attr('id', 'preset-input-' + field.id)
60765             .attr('placeholder', field.placeholder() || t('inspector.unknown'))
60766             .attr('maxlength', 255)
60767             .call(utilNoAuto)
60768             .on('input', change(true))
60769             .on('blur', change())
60770             .on('change', change())
60771             .merge(input);
60772     }
60773
60774
60775     function change(onInput) {
60776         return function() {
60777             var t$$1 = {};
60778             t$$1[field.key] = utilGetSetValue(input) || undefined;
60779             dispatch$$1.call('change', this, t$$1, onInput);
60780         };
60781     }
60782
60783
60784     textarea.tags = function(tags) {
60785         utilGetSetValue(input, tags[field.key] || '');
60786     };
60787
60788
60789     textarea.focus = function() {
60790         input.node().focus();
60791     };
60792
60793
60794     return utilRebind(textarea, dispatch$$1, 'on');
60795 }
60796
60797 function uiFieldWikipedia(field, context) {
60798     var dispatch$$1 = dispatch('change'),
60799         wikipedia = services.wikipedia,
60800         wikidata = services.wikidata,
60801         link = d3_select(null),
60802         lang = d3_select(null),
60803         title = d3_select(null),
60804         wikiURL = '',
60805         entity;
60806
60807
60808     function wiki(selection$$1) {
60809         var langcombo = d3combobox()
60810             .container(context.container())
60811             .fetcher(function(value, cb) {
60812                 var v = value.toLowerCase();
60813
60814                 cb(dataWikipedia.filter(function(d) {
60815                     return d[0].toLowerCase().indexOf(v) >= 0 ||
60816                         d[1].toLowerCase().indexOf(v) >= 0 ||
60817                         d[2].toLowerCase().indexOf(v) >= 0;
60818                 }).map(function(d) {
60819                     return { value: d[1] };
60820                 }));
60821             });
60822
60823         var titlecombo = d3combobox()
60824             .container(context.container())
60825             .fetcher(function(value, cb) {
60826                 if (!value) {
60827                     value = context.entity(entity.id).tags.name || '';
60828                 }
60829
60830                 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
60831                 searchfn(language()[2], value, function(query, data$$1) {
60832                     cb(data$$1.map(function(d) {
60833                         return { value: d };
60834                     }));
60835                 });
60836             });
60837
60838
60839         lang = selection$$1.selectAll('input.wiki-lang')
60840             .data([0]);
60841
60842         lang = lang.enter()
60843             .append('input')
60844             .attr('type', 'text')
60845             .attr('class', 'wiki-lang')
60846             .attr('placeholder', t('translate.localized_translation_language'))
60847             .call(utilNoAuto)
60848             .merge(lang);
60849
60850         utilGetSetValue(lang, language()[1]);
60851
60852         lang
60853             .call(langcombo)
60854             .on('blur', changeLang)
60855             .on('change', changeLang);
60856
60857
60858         title = selection$$1.selectAll('input.wiki-title')
60859             .data([0]);
60860
60861         title = title.enter()
60862             .append('input')
60863             .attr('type', 'text')
60864             .attr('class', 'wiki-title')
60865             .attr('id', 'preset-input-' + field.id)
60866             .call(utilNoAuto)
60867             .merge(title);
60868
60869         title
60870             .call(titlecombo)
60871             .on('blur', blur)
60872             .on('change', change);
60873
60874
60875         link = selection$$1.selectAll('.wiki-link')
60876             .data([0]);
60877
60878         link = link.enter()
60879             .append('button')
60880             .attr('class', 'button-input-action wiki-link minor')
60881             .attr('tabindex', -1)
60882             .call(svgIcon('#icon-out-link'))
60883             .merge(link);
60884
60885         link
60886             .on('click', function() {
60887                 event.preventDefault();
60888                 if (wikiURL) window.open(wikiURL, '_blank');
60889             });
60890     }
60891
60892
60893     function language() {
60894         var value = utilGetSetValue(lang).toLowerCase();
60895         var locale = utilDetect().locale.toLowerCase();
60896         var localeLanguage;
60897         return find$1(dataWikipedia, function(d) {
60898             if (d[2] === locale) localeLanguage = d;
60899             return d[0].toLowerCase() === value ||
60900                 d[1].toLowerCase() === value ||
60901                 d[2] === value;
60902         }) || localeLanguage || ['English', 'English', 'en'];
60903     }
60904
60905
60906     function changeLang() {
60907         utilGetSetValue(lang, language()[1]);
60908         change(true);
60909     }
60910
60911
60912     function blur() {
60913         change(true);
60914     }
60915
60916
60917     function change(skipWikidata) {
60918         var value = utilGetSetValue(title),
60919             m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
60920             l = m && find$1(dataWikipedia, function(d) { return m[1] === d[2]; }),
60921             syncTags = {};
60922
60923         if (l) {
60924             // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
60925             value = decodeURIComponent(m[2]).replace(/_/g, ' ');
60926             if (m[3]) {
60927                 var anchor;
60928                 try {
60929                     // Best-effort `anchordecode:` implementation
60930                     anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
60931                 } catch (e) {
60932                     anchor = decodeURIComponent(m[3]);
60933                 }
60934                 value += '#' + anchor.replace(/_/g, ' ');
60935             }
60936             value = value.slice(0, 1).toUpperCase() + value.slice(1);
60937             utilGetSetValue(lang, l[1]);
60938             utilGetSetValue(title, value);
60939         }
60940
60941         if (value) {
60942             syncTags.wikipedia = language()[2] + ':' + value;
60943         } else {
60944             syncTags.wikipedia = undefined;
60945             syncTags.wikidata = undefined;
60946         }
60947
60948         dispatch$$1.call('change', this, syncTags);
60949
60950
60951         if (skipWikidata || !value || !language()[2]) return;
60952
60953         // attempt asynchronous update of wikidata tag..
60954         var initGraph = context.graph(),
60955             initEntityId = entity.id;
60956
60957         wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
60958             // If graph has changed, we can't apply this update.
60959             if (context.graph() !== initGraph) return;
60960
60961             if (!data$$1 || !Object.keys(data$$1).length) return;
60962
60963             var qids = Object.keys(data$$1);
60964             var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
60965             var currTags = clone(context.entity(initEntityId).tags);
60966
60967             currTags.wikidata = value;
60968
60969             // Coalesce the update of wikidata tag into the previous tag change
60970             context.overwrite(
60971                 actionChangeTags(initEntityId, currTags),
60972                 context.history().undoAnnotation()
60973             );
60974
60975             // do not dispatch.call('change') here, because entity_editor
60976             // changeTags() is not intended to be called asynchronously
60977         });
60978     }
60979
60980
60981     wiki.tags = function(tags) {
60982         var value = tags[field.key] || '',
60983             m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
60984             l = m && find$1(dataWikipedia, function(d) { return m[1] === d[2]; }),
60985             anchor = m && m[3];
60986
60987         // value in correct format
60988         if (l) {
60989             utilGetSetValue(lang, l[1]);
60990             utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
60991             if (anchor) {
60992                 try {
60993                     // Best-effort `anchorencode:` implementation
60994                     anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
60995                 } catch (e) {
60996                     anchor = anchor.replace(/ /g, '_');
60997                 }
60998             }
60999             wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
61000                 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
61001
61002         // unrecognized value format
61003         } else {
61004             utilGetSetValue(title, value);
61005             if (value && value !== '') {
61006                 utilGetSetValue(lang, '');
61007                 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
61008             } else {
61009                 wikiURL = '';
61010             }
61011         }
61012     };
61013
61014
61015     wiki.entity = function(_) {
61016         if (!arguments.length) return entity;
61017         entity = _;
61018         return wiki;
61019     };
61020
61021
61022     wiki.focus = function() {
61023         title.node().focus();
61024     };
61025
61026
61027     return utilRebind(wiki, dispatch$$1, 'on');
61028 }
61029
61030 var uiFields = {
61031     access: uiFieldAccess,
61032     address: uiFieldAddress,
61033     check: uiFieldCheck,
61034     combo: uiFieldCombo,
61035     cycleway: uiFieldCycleway,
61036     defaultCheck: uiFieldCheck,
61037     email: uiFieldText,
61038     lanes: uiFieldLanes,
61039     localized: uiFieldLocalized,
61040     maxspeed: uiFieldMaxspeed,
61041     multiCombo: uiFieldCombo,
61042     networkCombo: uiFieldCombo,
61043     number: uiFieldText,
61044     onewayCheck: uiFieldCheck,
61045     radio: uiFieldRadio,
61046     restrictions: uiFieldRestrictions,
61047     semiCombo: uiFieldCombo,
61048     structureRadio: uiFieldRadio,
61049     tel: uiFieldText,
61050     text: uiFieldText,
61051     textarea: uiFieldTextarea,
61052     typeCombo: uiFieldCombo,
61053     url: uiFieldText,
61054     wikipedia: uiFieldWikipedia
61055 };
61056
61057 function uiField(context, presetField, entity, options) {
61058     options = assignIn$1({
61059         show: true,
61060         wrap: true,
61061         remove: true,
61062         revert: true,
61063         info: true
61064     }, options);
61065
61066     var dispatch$$1 = dispatch('change'),
61067         field = clone(presetField),
61068         show = options.show,
61069         state = '',
61070         tags = {};
61071
61072
61073     field.impl = uiFields[field.type](field, context)
61074         .on('change', function(t$$1, onInput) {
61075             dispatch$$1.call('change', field, t$$1, onInput);
61076         });
61077
61078     if (entity && field.impl.entity) {
61079         field.impl.entity(entity);
61080     }
61081
61082     field.keys = field.keys || [field.key];
61083
61084
61085     function isModified() {
61086         if (!entity) return false;
61087         var original = context.graph().base().entities[entity.id];
61088         return some(field.keys, function(key) {
61089             return original ? tags[key] !== original.tags[key] : tags[key];
61090         });
61091     }
61092
61093
61094     function isPresent() {
61095         return some(field.keys, function(key) {
61096             return tags[key];
61097         });
61098     }
61099
61100
61101     function revert(d) {
61102         event.stopPropagation();
61103         event.preventDefault();
61104         if (!entity) return false;
61105
61106         var original = context.graph().base().entities[entity.id],
61107             t$$1 = {};
61108         d.keys.forEach(function(key) {
61109             t$$1[key] = original ? original.tags[key] : undefined;
61110         });
61111
61112         dispatch$$1.call('change', d, t$$1);
61113     }
61114
61115
61116     function remove(d) {
61117         event.stopPropagation();
61118         event.preventDefault();
61119
61120         var t$$1 = {};
61121         d.keys.forEach(function(key) {
61122             t$$1[key] = undefined;
61123         });
61124
61125         dispatch$$1.call('change', d, t$$1);
61126     }
61127
61128
61129     field.render = function(selection$$1) {
61130         var container = selection$$1.selectAll('.form-field')
61131             .data([field]);
61132
61133         // Enter
61134         var enter = container.enter()
61135             .append('div')
61136             .attr('class', function(d) { return 'form-field form-field-' + d.id; })
61137             .classed('nowrap', !options.wrap);
61138
61139         if (options.wrap) {
61140             var label = enter
61141                 .append('label')
61142                 .attr('class', 'form-label')
61143                 .attr('for', function(d) { return 'preset-input-' + d.id; })
61144                 .text(function(d) { return d.label(); });
61145
61146             var wrap = label
61147                 .append('div')
61148                 .attr('class', 'form-label-button-wrap');
61149
61150             if (options.remove) {
61151                 wrap
61152                     .append('button')
61153                     .attr('class', 'remove-icon')
61154                     .attr('tabindex', -1)
61155                     .call(svgIcon('#operation-delete'));
61156             }
61157
61158             if (options.revert) {
61159                 wrap
61160                     .append('button')
61161                     .attr('class', 'modified-icon')
61162                     .attr('tabindex', -1)
61163                     .call(
61164                         (textDirection === 'rtl') ? svgIcon('#icon-redo') : svgIcon('#icon-undo')
61165                     );
61166             }
61167         }
61168
61169
61170         // Update
61171         container = container
61172             .merge(enter);
61173
61174         container.selectAll('.form-label-button-wrap .remove-icon')
61175             .on('click', remove);
61176
61177         container.selectAll('.form-label-button-wrap .modified-icon')
61178             .on('click', revert);
61179
61180         container
61181             .classed('modified', isModified())
61182             .classed('present', isPresent())
61183             .each(function(d) {
61184                 if (options.wrap && options.info) {
61185                     var referenceKey = d.key;
61186                     if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
61187                         referenceKey = referenceKey.replace(/:$/, '');
61188                     }
61189                     var reference = uiTagReference(d.reference || { key: referenceKey }, context);
61190
61191                     if (state === 'hover') {
61192                         reference.showing(false);
61193                     }
61194                 }
61195
61196                 d3_select(this)
61197                     .call(d.impl);
61198
61199                 if (options.wrap && options.info) {
61200                     d3_select(this)
61201                         .call(reference.body)
61202                         .select('.form-label-button-wrap')
61203                         .call(reference.button);
61204                 }
61205
61206                 d.impl.tags(tags);
61207             });
61208     };
61209
61210
61211     field.state = function(_) {
61212         if (!arguments.length) return state;
61213         state = _;
61214         return field;
61215     };
61216
61217
61218     field.tags = function(_) {
61219         if (!arguments.length) return tags;
61220         tags = _;
61221         return field;
61222     };
61223
61224
61225     field.show = function() {
61226         show = true;
61227         if (field.default && field.key && tags[field.key] !== field.default) {
61228             var t$$1 = {};
61229             t$$1[field.key] = field.default;
61230             dispatch$$1.call('change', this, t$$1);
61231         }
61232     };
61233
61234
61235     field.isShown = function() {
61236         return show || some(field.keys, function(key) { return !!tags[key]; });
61237     };
61238
61239
61240     field.focus = function() {
61241         field.impl.focus();
61242     };
61243
61244
61245     return utilRebind(field, dispatch$$1, 'on');
61246 }
61247
61248 function uiFormFields(context) {
61249     var fieldsArr;
61250
61251
61252     function formFields(selection$$1, klass) {
61253         render(selection$$1, klass);
61254     }
61255
61256
61257     function render(selection$$1, klass) {
61258
61259         var shown = fieldsArr.filter(function(field) { return field.isShown(); }),
61260             notShown = fieldsArr.filter(function(field) { return !field.isShown(); });
61261
61262         var container = selection$$1.selectAll('.form-fields-container')
61263             .data([0]);
61264
61265         container = container.enter()
61266             .append('div')
61267             .attr('class', 'form-fields-container ' + (klass || ''))
61268             .merge(container);
61269
61270
61271         var fields = container.selectAll('.wrap-form-field')
61272             .data(shown, function(d) { return d.id; });
61273
61274         fields.exit()
61275             .remove();
61276
61277         // Enter
61278         var enter = fields.enter()
61279             .append('div')
61280             .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.id; });
61281
61282         // Update
61283         fields = fields
61284             .merge(enter);
61285
61286         fields
61287             .order()
61288             .each(function(d) {
61289                 d3_select(this)
61290                     .call(d.render);
61291             });
61292
61293
61294         notShown = notShown.map(function(field) {
61295             return {
61296                 title: field.label(),
61297                 value: field.label(),
61298                 field: field
61299             };
61300         });
61301
61302
61303         var more = selection$$1.selectAll('.more-fields')
61304             .data((notShown.length > 0) ? [0] : []);
61305
61306         more.exit()
61307             .remove();
61308
61309         more = more.enter()
61310             .append('div')
61311             .attr('class', 'more-fields')
61312             .append('label')
61313             .text(t('inspector.add_fields'))
61314             .merge(more);
61315
61316
61317         var input = more.selectAll('.value')
61318             .data([0]);
61319
61320         input.exit()
61321             .remove();
61322
61323         input = input.enter()
61324             .append('input')
61325             .attr('class', 'value')
61326             .attr('type', 'text')
61327             .call(utilNoAuto)
61328             .merge(input);
61329
61330         input
61331             .call(utilGetSetValue, '')
61332             .attr('placeholder', function() {
61333                 var placeholder = [];
61334                 for (var field in notShown) {
61335                     placeholder.push(notShown[field].title);
61336                 }
61337                 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
61338             })
61339             .call(d3combobox()
61340                 .container(context.container())
61341                 .data(notShown)
61342                 .minItems(1)
61343                 .on('accept', function (d) {
61344                     var field = d.field;
61345                     field.show();
61346                     render(selection$$1);
61347                     if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
61348                         field.focus();
61349                     }
61350                 })
61351             );
61352     }
61353
61354
61355     formFields.fieldsArr = function(_) {
61356         if (!arguments.length) return fieldsArr;
61357         fieldsArr = _;
61358         return formFields;
61359     };
61360
61361
61362     return formFields;
61363 }
61364
61365 function uiPresetEditor(context) {
61366     var dispatch$$1 = dispatch('change'),
61367         formFields = uiFormFields(context),
61368         expandedPreference = (context.storage('preset_fields.expanded') !== 'false'),
61369         state,
61370         fieldsArr,
61371         preset,
61372         tags,
61373         entityId;
61374
61375
61376     function presetEditor(selection$$1) {
61377         selection$$1.call(uiDisclosure()
61378             .title(t('inspector.all_fields'))
61379             .expanded(expandedPreference)
61380             .on('toggled', toggled)
61381             .content(render)
61382         );
61383
61384         function toggled(expanded) {
61385             expandedPreference = expanded;
61386             context.storage('preset_fields.expanded', expanded);
61387         }
61388     }
61389
61390
61391     function render(selection$$1) {
61392         if (!fieldsArr) {
61393             var entity = context.entity(entityId),
61394                 geometry = context.geometry(entityId),
61395                 presets = context.presets();
61396
61397             fieldsArr = [];
61398
61399             preset.fields.forEach(function(field) {
61400                 if (field.matchGeometry(geometry)) {
61401                     fieldsArr.push(
61402                         uiField(context, field, entity)
61403                     );
61404                 }
61405             });
61406
61407             if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
61408                 fieldsArr.push(
61409                     uiField(context, presets.field('restrictions'), entity)
61410                 );
61411             }
61412
61413             presets.universal().forEach(function(field) {
61414                 if (preset.fields.indexOf(field) === -1) {
61415                     fieldsArr.push(
61416                         uiField(context, field, entity, { show: false })
61417                     );
61418                 }
61419             });
61420
61421             fieldsArr.forEach(function(field) {
61422                 field
61423                     .on('change', function(t$$1, onInput) {
61424                         dispatch$$1.call('change', field, t$$1, onInput);
61425                     });
61426             });
61427         }
61428
61429         fieldsArr.forEach(function(field) {
61430             field
61431                 .state(state)
61432                 .tags(tags);
61433         });
61434
61435
61436         selection$$1
61437             .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3');
61438
61439
61440         selection$$1.selectAll('.wrap-form-field input')
61441             .on('keydown', function() {
61442                 // if user presses enter, and combobox is not active, accept edits..
61443                 if (event.keyCode === 13 && d3_select('.combobox').empty()) {
61444                     context.enter(modeBrowse(context));
61445                 }
61446             });
61447     }
61448
61449
61450     presetEditor.preset = function(_) {
61451         if (!arguments.length) return preset;
61452         if (preset && preset.id === _.id) return presetEditor;
61453         preset = _;
61454         fieldsArr = null;
61455         return presetEditor;
61456     };
61457
61458
61459     presetEditor.state = function(_) {
61460         if (!arguments.length) return state;
61461         state = _;
61462         return presetEditor;
61463     };
61464
61465
61466     presetEditor.tags = function(_) {
61467         if (!arguments.length) return tags;
61468         tags = _;
61469         // Don't reset fieldsArr here.
61470         return presetEditor;
61471     };
61472
61473
61474     presetEditor.entityID = function(_) {
61475         if (!arguments.length) return entityId;
61476         if (entityId === _) return presetEditor;
61477         entityId = _;
61478         fieldsArr = null;
61479         return presetEditor;
61480     };
61481
61482
61483     return utilRebind(presetEditor, dispatch$$1, 'on');
61484 }
61485
61486 function uiEntityEditor(context) {
61487     var dispatch$$1 = dispatch('choose'),
61488         state = 'select',
61489         coalesceChanges = false,
61490         modified = false,
61491         base,
61492         entityId,
61493         activePreset,
61494         reference;
61495
61496     var presetEditor = uiPresetEditor(context)
61497         .on('change', changeTags);
61498     var rawTagEditor = uiRawTagEditor(context)
61499         .on('change', changeTags);
61500
61501
61502     function entityEditor(selection$$1) {
61503         var entity = context.entity(entityId),
61504             tags = clone(entity.tags);
61505
61506         // Header
61507         var header = selection$$1.selectAll('.header')
61508             .data([0]);
61509
61510         // Enter
61511         var enter = header.enter()
61512             .append('div')
61513             .attr('class', 'header fillL cf');
61514
61515         enter
61516             .append('button')
61517             .attr('class', 'fl preset-reset preset-choose')
61518             .call(svgIcon((textDirection === 'rtl') ? '#icon-forward' : '#icon-backward'));
61519
61520         enter
61521             .append('button')
61522             .attr('class', 'fr preset-close')
61523             .on('click', function() { context.enter(modeBrowse(context)); })
61524             .call(svgIcon(modified ? '#icon-apply' : '#icon-close'));
61525
61526         enter
61527             .append('h3')
61528             .text(t('inspector.edit'));
61529
61530         // Update
61531         header = header
61532             .merge(enter);
61533
61534         header.selectAll('.preset-reset')
61535             .on('click', function() {
61536                 dispatch$$1.call('choose', this, activePreset);
61537             });
61538
61539
61540         // Body
61541         var body = selection$$1.selectAll('.inspector-body')
61542             .data([0]);
61543
61544         // Enter
61545         enter = body.enter()
61546             .append('div')
61547             .attr('class', 'inspector-body');
61548
61549         enter
61550             .append('div')
61551             .attr('class', 'preset-list-item inspector-inner')
61552             .append('div')
61553             .attr('class', 'preset-list-button-wrap')
61554             .append('button')
61555             .attr('class', 'preset-list-button preset-reset')
61556             .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
61557             .append('div')
61558             .attr('class', 'label');
61559
61560         enter
61561             .append('div')
61562             .attr('class', 'inspector-border preset-editor');
61563
61564         enter
61565             .append('div')
61566             .attr('class', 'inspector-border raw-tag-editor inspector-inner');
61567
61568         enter
61569             .append('div')
61570             .attr('class', 'inspector-border raw-member-editor inspector-inner');
61571
61572         enter
61573             .append('div')
61574             .attr('class', 'raw-membership-editor inspector-inner');
61575
61576         enter
61577             .append('input')
61578             .attr('type', 'text')
61579             .attr('class', 'key-trap');
61580
61581
61582         // Update
61583         body = body
61584             .merge(enter);
61585
61586         body.selectAll('.preset-list-button-wrap')
61587             .call(reference.button);
61588
61589         body.selectAll('.preset-list-item')
61590             .call(reference.body);
61591
61592         body.selectAll('.preset-reset')
61593             .on('click', function() {
61594                 dispatch$$1.call('choose', this, activePreset);
61595             });
61596
61597         body.select('.preset-list-item button')
61598             .call(uiPresetIcon()
61599                 .geometry(context.geometry(entityId))
61600                 .preset(activePreset)
61601             );
61602
61603         body.select('.preset-list-item .label')
61604             .text(activePreset.name());
61605
61606         body.select('.preset-editor')
61607             .call(presetEditor
61608                 .preset(activePreset)
61609                 .entityID(entityId)
61610                 .tags(tags)
61611                 .state(state)
61612             );
61613
61614         body.select('.raw-tag-editor')
61615             .call(rawTagEditor
61616                 .preset(activePreset)
61617                 .entityID(entityId)
61618                 .tags(tags)
61619                 .state(state)
61620             );
61621
61622         if (entity.type === 'relation') {
61623             body.select('.raw-member-editor')
61624                 .style('display', 'block')
61625                 .call(uiRawMemberEditor(context)
61626                     .entityID(entityId)
61627                 );
61628         } else {
61629             body.select('.raw-member-editor')
61630                 .style('display', 'none');
61631         }
61632
61633         body.select('.raw-membership-editor')
61634             .call(uiRawMembershipEditor(context)
61635                 .entityID(entityId)
61636             );
61637
61638         body.select('.key-trap')
61639             .on('keydown.key-trap', function() {
61640                 // On tabbing, send focus back to the first field on the inspector-body
61641                 // (probably the `name` field) #4159
61642                 if (event.keyCode === 9 && !event.shiftKey) {
61643                     event.preventDefault();
61644                     body.select('input').node().focus();
61645                 }
61646             });
61647
61648         context.history()
61649             .on('change.entity-editor', historyChanged);
61650
61651
61652         function historyChanged() {
61653             if (state === 'hide') return;
61654
61655             var entity = context.hasEntity(entityId);
61656             var graph = context.graph();
61657             if (!entity) return;
61658
61659             var match = context.presets().match(entity, graph);
61660             var activePreset = entityEditor.preset();
61661             var weakPreset = activePreset && isEmpty(activePreset.addTags);
61662
61663             // A "weak" preset doesn't set any tags. (e.g. "Address")
61664             // Don't replace a weak preset with a fallback preset (e.g. "Point")
61665             if (!(weakPreset && match.isFallback())) {
61666                 entityEditor.preset(match);
61667             }
61668             entityEditor.modified(base !== graph);
61669             entityEditor(selection$$1);
61670         }
61671     }
61672
61673
61674     function clean(o) {
61675
61676         function cleanVal(k, v) {
61677             function keepSpaces(k) {
61678                 return k.match(/_hours|_times/) !== null;
61679             }
61680
61681             var blacklist = ['description', 'note', 'fixme'];
61682             if (some(blacklist, function(s) { return k.indexOf(s) !== -1; })) return v;
61683
61684             var cleaned = v.split(';')
61685                 .map(function(s) { return s.trim(); })
61686                 .join(keepSpaces(k) ? '; ' : ';');
61687
61688             // The code below is not intended to validate websites and emails.
61689             // It is only intended to prevent obvious copy-paste errors. (#2323)
61690             // clean website- and email-like tags
61691             if (k.indexOf('website') !== -1 ||
61692                 k.indexOf('email') !== -1 ||
61693                 cleaned.indexOf('http') === 0) {
61694                 cleaned = cleaned
61695                     .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
61696
61697             }
61698
61699             return cleaned;
61700         }
61701
61702         var out = {}, k, v;
61703         for (k in o) {
61704             if (k && (v = o[k]) !== undefined) {
61705                 out[k] = cleanVal(k, v);
61706             }
61707         }
61708         return out;
61709     }
61710
61711
61712     // Tag changes that fire on input can all get coalesced into a single
61713     // history operation when the user leaves the field.  #2342
61714     function changeTags(changed, onInput) {
61715         var entity = context.entity(entityId),
61716             annotation = t('operations.change_tags.annotation'),
61717             tags = clone(entity.tags);
61718
61719         forEach(changed, function(v, k) {
61720             if (v !== undefined || tags.hasOwnProperty(k)) {
61721                 tags[k] = v;
61722             }
61723         });
61724
61725         if (!onInput) {
61726             tags = clean(tags);
61727         }
61728
61729         if (!isEqual(entity.tags, tags)) {
61730             if (coalesceChanges) {
61731                 context.overwrite(actionChangeTags(entityId, tags), annotation);
61732             } else {
61733                 context.perform(actionChangeTags(entityId, tags), annotation);
61734                 coalesceChanges = !!onInput;
61735             }
61736         }
61737     }
61738
61739
61740     entityEditor.modified = function(_) {
61741         if (!arguments.length) return modified;
61742         modified = _;
61743         d3_selectAll('button.preset-close use')
61744             .attr('xlink:href', (modified ? '#icon-apply' : '#icon-close'));
61745     };
61746
61747
61748     entityEditor.state = function(_) {
61749         if (!arguments.length) return state;
61750         state = _;
61751         return entityEditor;
61752     };
61753
61754
61755     entityEditor.entityID = function(_) {
61756         if (!arguments.length) return entityId;
61757         entityId = _;
61758         base = context.graph();
61759         entityEditor.preset(context.presets().match(context.entity(entityId), base));
61760         entityEditor.modified(false);
61761         coalesceChanges = false;
61762         return entityEditor;
61763     };
61764
61765
61766     entityEditor.preset = function(_) {
61767         if (!arguments.length) return activePreset;
61768         if (_ !== activePreset) {
61769             activePreset = _;
61770             reference = uiTagReference(activePreset.reference(context.geometry(entityId)), context)
61771                 .showing(false);
61772         }
61773         return entityEditor;
61774     };
61775
61776
61777     return utilRebind(entityEditor, dispatch$$1, 'on');
61778 }
61779
61780 function uiPresetList(context) {
61781     var dispatch$$1 = dispatch('choose'),
61782         id,
61783         currentPreset,
61784         autofocus = false;
61785
61786
61787     function presetList(selection$$1) {
61788         var entity = context.entity(id),
61789             geometry = context.geometry(id);
61790
61791         // Treat entities on addr:interpolation lines as points, not vertices (#3241)
61792         if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
61793             geometry = 'point';
61794         }
61795
61796         var presets = context.presets().matchGeometry(geometry);
61797
61798         selection$$1.html('');
61799
61800         var messagewrap = selection$$1
61801             .append('div')
61802             .attr('class', 'header fillL cf');
61803
61804         var message = messagewrap
61805             .append('h3')
61806             .text(t('inspector.choose'));
61807
61808         if (context.entity(id).isUsed(context.graph())) {
61809             messagewrap
61810                 .append('button')
61811                 .attr('class', 'preset-choose')
61812                 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
61813                 .call(svgIcon((textDirection === 'rtl') ? '#icon-backward' : '#icon-forward'));
61814         } else {
61815             messagewrap
61816                 .append('button')
61817                 .attr('class', 'close')
61818                 .on('click', function() {
61819                     context.enter(modeBrowse(context));
61820                 })
61821                 .call(svgIcon('#icon-close'));
61822         }
61823
61824         function keydown() {
61825             // hack to let delete shortcut work when search is autofocused
61826             if (search.property('value').length === 0 &&
61827                 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
61828                  event.keyCode === d3keybinding.keyCodes['⌦'])) {
61829                 event.preventDefault();
61830                 event.stopPropagation();
61831                 operationDelete([id], context)();
61832             } else if (search.property('value').length === 0 &&
61833                 (event.ctrlKey || event.metaKey) &&
61834                 event.keyCode === d3keybinding.keyCodes.z) {
61835                 event.preventDefault();
61836                 event.stopPropagation();
61837                 context.undo();
61838             } else if (!event.ctrlKey && !event.metaKey) {
61839                 d3_select(this).on('keydown', null);
61840             }
61841         }
61842
61843         function keypress() {
61844             // enter
61845             var value = search.property('value');
61846             if (event.keyCode === 13 && value.length) {
61847                 list.selectAll('.preset-list-item:first-child').datum().choose();
61848             }
61849         }
61850
61851         function inputevent() {
61852             var value = search.property('value');
61853             list.classed('filtered', value.length);
61854             if (value.length) {
61855                 var results = presets.search(value, geometry);
61856                 message.text(t('inspector.results', {
61857                     n: results.collection.length,
61858                     search: value
61859                 }));
61860                 list.call(drawList, results);
61861             } else {
61862                 list.call(drawList, context.presets().defaults(geometry, 36));
61863                 message.text(t('inspector.choose'));
61864             }
61865         }
61866
61867         var searchWrap = selection$$1
61868             .append('div')
61869             .attr('class', 'search-header');
61870
61871         var search = searchWrap
61872             .append('input')
61873             .attr('class', 'preset-search-input')
61874             .attr('placeholder', t('inspector.search'))
61875             .attr('type', 'search')
61876             .call(utilNoAuto)
61877             .on('keydown', keydown)
61878             .on('keypress', keypress)
61879             .on('input', inputevent);
61880
61881         searchWrap
61882             .call(svgIcon('#icon-search', 'pre-text'));
61883
61884         if (autofocus) {
61885             search.node().focus();
61886         }
61887
61888         var listWrap = selection$$1
61889             .append('div')
61890             .attr('class', 'inspector-body');
61891
61892         var list = listWrap
61893             .append('div')
61894             .attr('class', 'preset-list fillL cf')
61895             .call(drawList, context.presets().defaults(geometry, 36));
61896     }
61897
61898
61899     function drawList(list, presets) {
61900         var collection = presets.collection.map(function(preset) {
61901             return preset.members ? CategoryItem(preset) : PresetItem(preset);
61902         });
61903
61904         var items = list.selectAll('.preset-list-item')
61905             .data(collection, function(d) { return d.preset.id; });
61906
61907         items.order();
61908
61909         items.exit()
61910             .remove();
61911
61912         items.enter()
61913             .append('div')
61914             .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
61915             .classed('current', function(item) { return item.preset === currentPreset; })
61916             .each(function(item) { d3_select(this).call(item); })
61917             .style('opacity', 0)
61918             .transition()
61919             .style('opacity', 1);
61920     }
61921
61922
61923     function CategoryItem(preset) {
61924         var box, sublist, shown = false;
61925
61926         function item(selection$$1) {
61927             var wrap = selection$$1.append('div')
61928                 .attr('class', 'preset-list-button-wrap category col12');
61929
61930             var button = wrap
61931                 .append('button')
61932                 .attr('class', 'preset-list-button')
61933                 .classed('expanded', false)
61934                 .call(uiPresetIcon()
61935                     .geometry(context.geometry(id))
61936                     .preset(preset))
61937                 .on('click', function() {
61938                     var isExpanded = d3_select(this).classed('expanded');
61939                     var iconName = isExpanded ?
61940                         (textDirection === 'rtl' ? '#icon-backward' : '#icon-forward') : '#icon-down';
61941                     d3_select(this)
61942                         .classed('expanded', !isExpanded);
61943                     d3_select(this).selectAll('div.label svg.icon use')
61944                         .attr('href', iconName);
61945                     item.choose();
61946                 });
61947
61948             var label = button
61949                 .append('div')
61950                 .attr('class', 'label');
61951
61952             label
61953                 .call(svgIcon((textDirection === 'rtl' ? '#icon-backward' : '#icon-forward'), 'inline'))
61954                 .append('span')
61955                 .html(function() { return preset.name() + '&hellip;'; });
61956
61957             box = selection$$1.append('div')
61958                 .attr('class', 'subgrid col12')
61959                 .style('max-height', '0px')
61960                 .style('opacity', 0);
61961
61962             box.append('div')
61963                 .attr('class', 'arrow');
61964
61965             sublist = box.append('div')
61966                 .attr('class', 'preset-list fillL3 cf fl');
61967         }
61968
61969
61970         item.choose = function() {
61971             if (!box || !sublist) return;
61972
61973             if (shown) {
61974                 shown = false;
61975                 box.transition()
61976                     .duration(200)
61977                     .style('opacity', '0')
61978                     .style('max-height', '0px')
61979                     .style('padding-bottom', '0px');
61980             } else {
61981                 shown = true;
61982                 sublist.call(drawList, preset.members);
61983                 box.transition()
61984                     .duration(200)
61985                     .style('opacity', '1')
61986                     .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
61987                     .style('padding-bottom', '20px');
61988             }
61989         };
61990
61991         item.preset = preset;
61992
61993         return item;
61994     }
61995
61996
61997     function PresetItem(preset) {
61998         function item(selection$$1) {
61999             var wrap = selection$$1.append('div')
62000                 .attr('class', 'preset-list-button-wrap col12');
62001
62002             wrap.append('button')
62003                 .attr('class', 'preset-list-button')
62004                 .call(uiPresetIcon()
62005                     .geometry(context.geometry(id))
62006                     .preset(preset))
62007                 .on('click', item.choose)
62008                 .append('div')
62009                 .attr('class', 'label')
62010                 .text(preset.name());
62011
62012             wrap.call(item.reference.button);
62013             selection$$1.call(item.reference.body);
62014         }
62015
62016         item.choose = function() {
62017             context.presets().choose(preset);
62018
62019             context.perform(
62020                 actionChangePreset(id, currentPreset, preset),
62021                 t('operations.change_tags.annotation')
62022             );
62023
62024             dispatch$$1.call('choose', this, preset);
62025         };
62026
62027         item.help = function() {
62028             event.stopPropagation();
62029             item.reference.toggle();
62030         };
62031
62032         item.preset = preset;
62033         item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
62034
62035         return item;
62036     }
62037
62038
62039     presetList.autofocus = function(_) {
62040         if (!arguments.length) return autofocus;
62041         autofocus = _;
62042         return presetList;
62043     };
62044
62045
62046     presetList.entityID = function(_) {
62047         if (!arguments.length) return id;
62048         id = _;
62049         presetList.preset(context.presets().match(context.entity(id), context.graph()));
62050         return presetList;
62051     };
62052
62053
62054     presetList.preset = function(_) {
62055         if (!arguments.length) return currentPreset;
62056         currentPreset = _;
62057         return presetList;
62058     };
62059
62060
62061     return utilRebind(presetList, dispatch$$1, 'on');
62062 }
62063
62064 function uiViewOnOSM(context) {
62065     var id;
62066
62067     function viewOnOSM(selection) {
62068         var entity = context.entity(id);
62069
62070         selection.style('display', entity.isNew() ? 'none' : null);
62071
62072         var link = selection.selectAll('.view-on-osm')
62073             .data([0]);
62074
62075         var enter = link.enter()
62076             .append('a')
62077             .attr('class', 'view-on-osm')
62078             .attr('target', '_blank')
62079             .call(svgIcon('#icon-out-link', 'inline'));
62080
62081         enter
62082             .append('span')
62083             .text(t('inspector.view_on_osm'));
62084
62085         link
62086             .merge(enter)
62087             .attr('href', context.connection().entityURL(entity));
62088     }
62089
62090
62091     viewOnOSM.entityID = function(_) {
62092         if (!arguments.length) return id;
62093         id = _;
62094         return viewOnOSM;
62095     };
62096
62097     return viewOnOSM;
62098 }
62099
62100 function uiInspector(context) {
62101     var presetList = uiPresetList(context),
62102         entityEditor = uiEntityEditor(context),
62103         state = 'select',
62104         entityID,
62105         newFeature = false;
62106
62107
62108     function inspector(selection) {
62109         presetList
62110             .entityID(entityID)
62111             .autofocus(newFeature)
62112             .on('choose', setPreset);
62113
62114         entityEditor
62115             .state(state)
62116             .entityID(entityID)
62117             .on('choose', showList);
62118
62119         var wrap = selection.selectAll('.panewrap')
62120             .data([0]);
62121
62122         var enter = wrap.enter()
62123             .append('div')
62124             .attr('class', 'panewrap');
62125
62126         enter
62127             .append('div')
62128             .attr('class', 'preset-list-pane pane');
62129
62130         enter
62131             .append('div')
62132             .attr('class', 'entity-editor-pane pane');
62133
62134         wrap = wrap.merge(enter);
62135         var presetPane = wrap.selectAll('.preset-list-pane');
62136         var editorPane = wrap.selectAll('.entity-editor-pane');
62137
62138         var graph = context.graph(),
62139             entity = context.entity(entityID),
62140             showEditor = state === 'hover' ||
62141                 entity.isUsed(graph) ||
62142                 entity.isHighwayIntersection(graph);
62143
62144         if (showEditor) {
62145             wrap.style('right', '0%');
62146             editorPane.call(entityEditor);
62147         } else {
62148             wrap.style('right', '-100%');
62149             presetPane.call(presetList);
62150         }
62151
62152         var footer = selection.selectAll('.footer')
62153             .data([0]);
62154
62155         footer = footer.enter()
62156             .append('div')
62157             .attr('class', 'footer')
62158             .merge(footer);
62159
62160         footer
62161             .call(uiViewOnOSM(context).entityID(entityID));
62162
62163
62164         function showList(preset) {
62165             wrap.transition()
62166                 .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
62167
62168             presetPane
62169                 .call(presetList.preset(preset).autofocus(true));
62170         }
62171
62172
62173         function setPreset(preset) {
62174             wrap.transition()
62175                 .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
62176
62177             editorPane
62178                 .call(entityEditor.preset(preset));
62179         }
62180     }
62181
62182
62183     inspector.state = function(_) {
62184         if (!arguments.length) return state;
62185         state = _;
62186         entityEditor.state(state);
62187         return inspector;
62188     };
62189
62190
62191     inspector.entityID = function(_) {
62192         if (!arguments.length) return entityID;
62193         entityID = _;
62194         return inspector;
62195     };
62196
62197
62198     inspector.newFeature = function(_) {
62199         if (!arguments.length) return newFeature;
62200         newFeature = _;
62201         return inspector;
62202     };
62203
62204
62205     return inspector;
62206 }
62207
62208 function uiSidebar(context) {
62209     var inspector = uiInspector(context),
62210         current;
62211
62212
62213     function sidebar(selection) {
62214         var featureListWrap = selection
62215             .append('div')
62216             .attr('class', 'feature-list-pane')
62217             .call(uiFeatureList(context));
62218
62219
62220         var inspectorWrap = selection
62221             .append('div')
62222             .attr('class', 'inspector-hidden inspector-wrap fr');
62223
62224
62225         function hover(id) {
62226             if (!current && context.hasEntity(id)) {
62227                 featureListWrap
62228                     .classed('inspector-hidden', true);
62229
62230                 inspectorWrap
62231                     .classed('inspector-hidden', false)
62232                     .classed('inspector-hover', true);
62233
62234                 if (inspector.entityID() !== id || inspector.state() !== 'hover') {
62235                     inspector
62236                         .state('hover')
62237                         .entityID(id);
62238
62239                     inspectorWrap
62240                         .call(inspector);
62241                 }
62242
62243             } else if (!current) {
62244                 featureListWrap
62245                     .classed('inspector-hidden', false);
62246                 inspectorWrap
62247                     .classed('inspector-hidden', true);
62248                 inspector
62249                     .state('hide');
62250             }
62251         }
62252
62253
62254         sidebar.hover = throttle(hover, 200);
62255
62256
62257         sidebar.select = function(id, newFeature) {
62258             if (!current && id) {
62259                 featureListWrap
62260                     .classed('inspector-hidden', true);
62261
62262                 inspectorWrap
62263                     .classed('inspector-hidden', false)
62264                     .classed('inspector-hover', false);
62265
62266                 if (inspector.entityID() !== id || inspector.state() !== 'select') {
62267                     inspector
62268                         .state('select')
62269                         .entityID(id)
62270                         .newFeature(newFeature);
62271
62272                     inspectorWrap
62273                         .call(inspector);
62274                 }
62275
62276             } else if (!current) {
62277                 featureListWrap
62278                     .classed('inspector-hidden', false);
62279                 inspectorWrap
62280                     .classed('inspector-hidden', true);
62281                 inspector
62282                     .state('hide');
62283             }
62284         };
62285
62286
62287         sidebar.show = function(component) {
62288             featureListWrap
62289                 .classed('inspector-hidden', true);
62290             inspectorWrap
62291                 .classed('inspector-hidden', true);
62292
62293             if (current) current.remove();
62294             current = selection
62295                 .append('div')
62296                 .attr('class', 'sidebar-component')
62297                 .call(component);
62298         };
62299
62300
62301         sidebar.hide = function() {
62302             featureListWrap
62303                 .classed('inspector-hidden', false);
62304             inspectorWrap
62305                 .classed('inspector-hidden', true);
62306
62307             if (current) current.remove();
62308             current = null;
62309         };
62310     }
62311
62312
62313     sidebar.hover = function() {};
62314     sidebar.hover.cancel = function() {};
62315     sidebar.select = function() {};
62316     sidebar.show = function() {};
62317     sidebar.hide = function() {};
62318
62319     return sidebar;
62320 }
62321
62322 function uiSpinner(context) {
62323     var osm = context.connection();
62324
62325
62326     return function(selection) {
62327         var img = selection
62328             .append('img')
62329             .attr('src', context.imagePath('loader-black.gif'))
62330             .style('opacity', 0);
62331
62332         if (osm) {
62333             osm
62334                 .on('loading.spinner', function() {
62335                     img.transition()
62336                         .style('opacity', 1);
62337                 })
62338                 .on('loaded.spinner', function() {
62339                     img.transition()
62340                         .style('opacity', 0);
62341                 });
62342         }
62343     };
62344 }
62345
62346 function uiSplash(context) {
62347
62348     return function(selection) {
62349         if (context.storage('sawSplash'))
62350              return;
62351
62352         context.storage('sawSplash', true);
62353
62354         var modalSelection = uiModal(selection);
62355
62356         modalSelection.select('.modal')
62357             .attr('class', 'modal-splash modal col6');
62358
62359         var introModal = modalSelection.select('.content')
62360             .append('div')
62361             .attr('class', 'fillL');
62362
62363         introModal
62364             .append('div')
62365             .attr('class','modal-section cf')
62366             .append('h3').text(t('splash.welcome'));
62367
62368         introModal
62369             .append('div')
62370             .attr('class','modal-section')
62371             .append('p')
62372             .html(t('splash.text', {
62373                 version: context.version,
62374                 website: '<a href="http://ideditor.com/">ideditor.com</a>',
62375                 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
62376             }));
62377
62378         var buttonWrap = introModal
62379             .append('div')
62380             .attr('class', 'modal-actions cf');
62381
62382         var walkthrough = buttonWrap
62383             .append('button')
62384             .attr('class', 'walkthrough col6')
62385             .on('click', function() {
62386                 context.container().call(uiIntro(context));
62387                 modalSelection.close();
62388             });
62389
62390         walkthrough
62391             .append('svg')
62392             .attr('class', 'logo logo-walkthrough')
62393             .append('use')
62394             .attr('xlink:href', '#logo-walkthrough');
62395
62396         walkthrough
62397             .append('div')
62398             .text(t('splash.walkthrough'));
62399
62400         var startEditing = buttonWrap
62401             .append('button')
62402             .attr('class', 'start-editing col6')
62403             .on('click', modalSelection.close);
62404
62405         startEditing
62406             .append('svg')
62407             .attr('class', 'logo logo-features')
62408             .append('use')
62409             .attr('xlink:href', '#logo-features');
62410
62411         startEditing
62412             .append('div')
62413             .text(t('splash.start'));
62414
62415
62416         modalSelection.select('button.close')
62417             .attr('class','hide');
62418
62419     };
62420 }
62421
62422 function uiStatus(context) {
62423     var osm = context.connection();
62424
62425
62426     return function(selection$$1) {
62427         if (!osm) return;
62428
62429         function update() {
62430             osm.status(function(err, apiStatus) {
62431                 selection$$1.html('');
62432
62433                 if (err) {
62434                     if (apiStatus === 'rateLimited') {
62435                         selection$$1
62436                             .text(t('status.rateLimit'))
62437                             .append('a')
62438                             .attr('class', 'api-status-login')
62439                             .attr('target', '_blank')
62440                             .call(svgIcon('#icon-out-link', 'inline'))
62441                             .append('span')
62442                             .text(t('login'))
62443                             .on('click.login', function() {
62444                                 event.preventDefault();
62445                                 osm.authenticate();
62446                             });
62447                     } else {
62448                         // eslint-disable-next-line no-warning-comments
62449                         // TODO: nice messages for different error types
62450                         selection$$1.text(t('status.error'));
62451                     }
62452
62453                 } else if (apiStatus === 'readonly') {
62454                     selection$$1.text(t('status.readonly'));
62455                 } else if (apiStatus === 'offline') {
62456                     selection$$1.text(t('status.offline'));
62457                 }
62458
62459                 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
62460             });
62461         }
62462
62463         osm.on('change', function() { update(selection$$1); });
62464
62465         window.setInterval(update, 90000);
62466         update(selection$$1);
62467     };
62468 }
62469
62470 function uiUndoRedo(context) {
62471     var commands = [{
62472         id: 'undo',
62473         cmd: uiCmd('⌘Z'),
62474         action: function() { if (editable()) context.undo(); },
62475         annotation: function() { return context.history().undoAnnotation(); }
62476     }, {
62477         id: 'redo',
62478         cmd: uiCmd('⌘⇧Z'),
62479         action: function() { if (editable()) context.redo(); },
62480         annotation: function() { return context.history().redoAnnotation(); }
62481     }];
62482
62483
62484     function editable() {
62485         return context.editable() && context.mode().id !== 'save';
62486     }
62487
62488
62489     return function(selection$$1) {
62490         var tooltipBehavior = tooltip()
62491             .placement('bottom')
62492             .html(true)
62493             .title(function (d) {
62494                 return uiTooltipHtml(d.annotation() ?
62495                     t(d.id + '.tooltip', {action: d.annotation()}) :
62496                     t(d.id + '.nothing'), d.cmd);
62497             });
62498
62499         var buttons = selection$$1.selectAll('button')
62500             .data(commands)
62501             .enter()
62502             .append('button')
62503             .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
62504             .on('click', function(d) { return d.action(); })
62505             .call(tooltipBehavior);
62506
62507         buttons.each(function(d) {
62508             var iconName = d.id;
62509             if (textDirection === 'rtl') {
62510                 if (iconName === 'undo') {
62511                     iconName = 'redo';
62512                 } else if (iconName === 'redo') {
62513                     iconName = 'undo';
62514                 }
62515             }
62516             d3_select(this)
62517                 .call(svgIcon('#icon-' + iconName));
62518         });
62519
62520         var keybinding = d3keybinding('undo')
62521             .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
62522             .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
62523
62524         d3_select(document)
62525             .call(keybinding);
62526
62527
62528         var debouncedUpdate = debounce$1(update, 500, { leading: true, trailing: true });
62529
62530         context.map()
62531             .on('move.undo_redo', debouncedUpdate)
62532             .on('drawn.undo_redo', debouncedUpdate);
62533
62534         context.history()
62535             .on('change.undo_redo', update);
62536
62537         context
62538             .on('enter.undo_redo', update);
62539
62540
62541         function update() {
62542             buttons
62543                 .property('disabled', !editable())
62544                 .classed('disabled', function(d) { return !d.annotation(); })
62545                 .each(function() {
62546                     var selection$$1 = d3_select(this);
62547                     if (selection$$1.property('tooltipVisible')) {
62548                         selection$$1.call(tooltipBehavior.show);
62549                     }
62550                 });
62551         }
62552     };
62553 }
62554
62555 // these are module variables so they are preserved through a ui.restart()
62556 var sawVersion = null;
62557 var isNewVersion = false;
62558 var isNewUser = false;
62559
62560
62561 function uiVersion(context) {
62562
62563     var currVersion = context.version,
62564         matchedVersion = currVersion.match(/\d\.\d\.\d.*/);
62565
62566     if (sawVersion === null && matchedVersion !== null) {
62567         isNewVersion = (context.storage('sawVersion') !== currVersion);
62568         isNewUser = !context.storage('sawSplash');
62569         context.storage('sawVersion', currVersion);
62570         sawVersion = currVersion;
62571     }
62572
62573     return function(selection) {
62574         selection
62575             .append('a')
62576             .attr('target', '_blank')
62577             .attr('tabindex', -1)
62578             .attr('href', 'https://github.com/openstreetmap/iD')
62579             .text(currVersion);
62580
62581         // only show new version indicator to users that have used iD before
62582         if (isNewVersion && !isNewUser) {
62583             selection
62584                 .append('div')
62585                 .attr('class', 'badge')
62586                 .append('a')
62587                 .attr('target', '_blank')
62588                 .attr('tabindex', -1)
62589                 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
62590                 .call(svgIcon('#gift-11'))
62591                 .call(tooltip()
62592                     .title(t('version.whats_new', { version: currVersion }))
62593                     .placement('top')
62594                 );
62595         }
62596     };
62597 }
62598
62599 function uiZoom(context) {
62600     var zooms = [{
62601         id: 'zoom-in',
62602         icon: 'plus',
62603         title: t('zoom.in'),
62604         action: context.zoomIn,
62605         key: '+'
62606     }, {
62607         id: 'zoom-out',
62608         icon: 'minus',
62609         title: t('zoom.out'),
62610         action: context.zoomOut,
62611         key: '-'
62612     }];
62613
62614
62615     function zoomIn() {
62616         event.preventDefault();
62617         context.zoomIn();
62618     }
62619
62620
62621     function zoomOut() {
62622         event.preventDefault();
62623         context.zoomOut();
62624     }
62625
62626
62627     function zoomInFurther() {
62628         event.preventDefault();
62629         context.zoomInFurther();
62630     }
62631
62632
62633     function zoomOutFurther() {
62634         event.preventDefault();
62635         context.zoomOutFurther();
62636     }
62637
62638
62639     return function(selection$$1) {
62640         var button = selection$$1.selectAll('button')
62641             .data(zooms)
62642             .enter()
62643             .append('button')
62644             .attr('tabindex', -1)
62645             .attr('class', function(d) { return d.id; })
62646             .on('click.editor', function(d) { d.action(); })
62647             .call(tooltip()
62648                 .placement((textDirection === 'rtl') ? 'right' : 'left')
62649                 .html(true)
62650                 .title(function(d) {
62651                     return uiTooltipHtml(d.title, d.key);
62652                 })
62653             );
62654
62655         button.each(function(d) {
62656             d3_select(this)
62657                 .call(svgIcon('#icon-' + d.icon, 'light'));
62658         });
62659
62660         var keybinding = d3keybinding('zoom');
62661
62662         ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
62663             keybinding.on([key], zoomIn);
62664             keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
62665         });
62666
62667         ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
62668             keybinding.on([key], zoomOut);
62669             keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
62670         });
62671
62672         d3_select(document)
62673             .call(keybinding);
62674     };
62675 }
62676
62677 function uiInit(context) {
62678     var uiInitCounter = 0;
62679
62680
62681     function render(container) {
62682         container
62683             .attr('dir', textDirection);
62684
62685         var map = context.map();
62686
62687         var hash = behaviorHash(context);
62688         hash();
62689
62690         if (!hash.hadHash) {
62691             map.centerZoom([0, 0], 2);
62692         }
62693
62694         container
62695             .append('svg')
62696             .attr('id', 'defs')
62697             .call(svgDefs(context));
62698
62699         container
62700             .append('div')
62701             .attr('id', 'sidebar')
62702             .attr('class', 'col4')
62703             .call(ui.sidebar);
62704
62705         var content = container
62706             .append('div')
62707             .attr('id', 'content')
62708             .attr('class', 'active');
62709
62710         var bar = content
62711             .append('div')
62712             .attr('id', 'bar')
62713             .attr('class', 'fillD');
62714
62715         content
62716             .append('div')
62717             .attr('id', 'map')
62718             .attr('dir', 'ltr')
62719             .call(map);
62720
62721         content
62722             .call(uiMapInMap(context))
62723             .call(uiInfo(context))
62724             .call(uiNotice(context));
62725
62726         bar
62727             .append('div')
62728             .attr('class', 'spacer col4');
62729
62730         var limiter = bar.append('div')
62731             .attr('class', 'limiter');
62732
62733         limiter
62734             .append('div')
62735             .attr('class', 'button-wrap joined col3')
62736             .call(uiModes(context), limiter);
62737
62738         limiter
62739             .append('div')
62740             .attr('class', 'button-wrap joined col1')
62741             .call(uiUndoRedo(context));
62742
62743         limiter
62744             .append('div')
62745             .attr('class', 'button-wrap col1')
62746             .call(uiSave(context));
62747
62748         bar
62749             .append('div')
62750             .attr('class', 'full-screen')
62751             .call(uiFullScreen(context));
62752
62753         bar
62754             .append('div')
62755             .attr('class', 'spinner')
62756             .call(uiSpinner(context));
62757
62758
62759         var controls = bar
62760             .append('div')
62761             .attr('class', 'map-controls');
62762
62763         controls
62764             .append('div')
62765             .attr('class', 'map-control zoombuttons')
62766             .call(uiZoom(context));
62767
62768         controls
62769             .append('div')
62770             .attr('class', 'map-control geolocate-control')
62771             .call(uiGeolocate(context));
62772
62773         controls
62774             .append('div')
62775             .attr('class', 'map-control background-control')
62776             .call(uiBackground(context));
62777
62778         controls
62779             .append('div')
62780             .attr('class', 'map-control map-data-control')
62781             .call(uiMapData(context));
62782
62783         controls
62784             .append('div')
62785             .attr('class', 'map-control help-control')
62786             .call(uiHelp(context));
62787
62788
62789         var about = content
62790             .append('div')
62791             .attr('id', 'about');
62792
62793         about
62794             .append('div')
62795             .attr('id', 'attrib')
62796             .attr('dir', 'ltr')
62797             .call(uiAttribution(context));
62798
62799         about
62800             .append('div')
62801             .attr('class', 'api-status')
62802             .call(uiStatus(context));
62803
62804
62805         var footer = about
62806             .append('div')
62807             .attr('id', 'footer')
62808             .attr('class', 'fillD');
62809
62810         footer
62811             .append('div')
62812             .attr('id', 'flash-wrap')
62813             .attr('class', 'footer-hide');
62814
62815         var footerWrap = footer
62816             .append('div')
62817             .attr('id', 'footer-wrap')
62818             .attr('class', 'footer-show');
62819
62820         footerWrap
62821             .append('div')
62822             .attr('id', 'scale-block')
62823             .call(uiScale(context));
62824
62825         var aboutList = footerWrap
62826             .append('div')
62827             .attr('id', 'info-block')
62828             .append('ul')
62829             .attr('id', 'about-list');
62830
62831         if (!context.embed()) {
62832             aboutList
62833                 .call(uiAccount(context));
62834         }
62835
62836         aboutList
62837             .append('li')
62838             .attr('class', 'version')
62839             .call(uiVersion(context));
62840
62841         var issueLinks = aboutList
62842             .append('li');
62843
62844         issueLinks
62845             .append('a')
62846             .attr('target', '_blank')
62847             .attr('tabindex', -1)
62848             .attr('href', 'https://github.com/openstreetmap/iD/issues')
62849             .call(svgIcon('#icon-bug', 'light'))
62850             .call(tooltip().title(t('report_a_bug')).placement('top'));
62851
62852         issueLinks
62853             .append('a')
62854             .attr('target', '_blank')
62855             .attr('tabindex', -1)
62856             .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
62857             .call(svgIcon('#icon-translate', 'light'))
62858             .call(tooltip().title(t('help_translate')).placement('top'));
62859
62860         aboutList
62861             .append('li')
62862             .attr('class', 'feature-warning')
62863             .attr('tabindex', -1)
62864             .call(uiFeatureInfo(context));
62865
62866         aboutList
62867             .append('li')
62868             .attr('class', 'user-list')
62869             .attr('tabindex', -1)
62870             .call(uiContributors(context));
62871
62872
62873         window.onbeforeunload = function() {
62874             return context.save();
62875         };
62876
62877         window.onunload = function() {
62878             context.history().unlock();
62879         };
62880
62881         var mapDimensions = map.dimensions();
62882
62883
62884         function onResize() {
62885             mapDimensions = utilGetDimensions(content, true);
62886             map.dimensions(mapDimensions);
62887         }
62888
62889         d3_select(window)
62890             .on('resize.editor', onResize);
62891
62892         onResize();
62893
62894         function pan(d) {
62895             return function() {
62896                 event.preventDefault();
62897                 context.pan(d, 100);
62898             };
62899         }
62900
62901
62902         // pan amount
62903         var pa = 80;
62904
62905         var keybinding = d3keybinding('main')
62906             .on('⌫', function() { event.preventDefault(); })
62907             .on('←', pan([pa, 0]))
62908             .on('↑', pan([0, pa]))
62909             .on('→', pan([-pa, 0]))
62910             .on('↓', pan([0, -pa]))
62911             .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
62912             .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
62913             .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
62914             .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
62915
62916         d3_select(document)
62917             .call(keybinding);
62918
62919         context.enter(modeBrowse(context));
62920
62921         if (!uiInitCounter++) {
62922             if (!hash.startWalkthrough) {
62923                 context.container()
62924                     .call(uiSplash(context))
62925                     .call(uiRestore(context));
62926             }
62927
62928             context.container()
62929                 .call(uiShortcuts(context));
62930         }
62931
62932         var osm = context.connection(),
62933             auth = uiLoading(context).message(t('loading_auth')).blocking(true);
62934
62935         if (osm && auth) {
62936             osm
62937                 .on('authLoading.ui', function() {
62938                     context.container()
62939                         .call(auth);
62940                 })
62941                 .on('authDone.ui', function() {
62942                     auth.close();
62943                 });
62944         }
62945
62946         uiInitCounter++;
62947
62948         if (hash.startWalkthrough) {
62949             hash.startWalkthrough = false;
62950             context.container().call(uiIntro(context));
62951         }
62952     }
62953
62954
62955     var renderCallback;
62956
62957     function ui(node, callback) {
62958         renderCallback = callback;
62959         var container = d3_select(node);
62960         context.container(container);
62961         context.loadLocale(function(err) {
62962             if (!err) {
62963                 render(container);
62964             }
62965             if (callback) {
62966                 callback(err);
62967             }
62968         });
62969     }
62970
62971
62972     ui.restart = function(arg) {
62973         context.locale(arg);
62974         context.loadLocale(function(err) {
62975             if (!err) {
62976                 context.container().selectAll('*').remove();
62977                 render(context.container());
62978                 if (renderCallback) renderCallback();
62979             }
62980         });
62981     };
62982
62983
62984     ui.sidebar = uiSidebar(context);
62985
62986     return ui;
62987 }
62988
62989 function uiChangesetEditor(context) {
62990     var dispatch$$1 = dispatch('change'),
62991         formFields = uiFormFields(context),
62992         fieldsArr,
62993         tags,
62994         changesetId;
62995
62996
62997
62998     function changesetEditor(selection) {
62999         render(selection);
63000     }
63001
63002
63003     function render(selection) {
63004         var initial = false;
63005
63006         if (!fieldsArr) {
63007             initial = true;
63008             var presets = context.presets();
63009
63010             fieldsArr = [
63011                 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
63012                 uiField(context, presets.field('source'), null, { show: false, revert: false }),
63013                 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
63014             ];
63015
63016             fieldsArr.forEach(function(field) {
63017                 field
63018                     .on('change', function(t$$1, onInput) {
63019                         dispatch$$1.call('change', field, t$$1, onInput);
63020                     });
63021             });
63022         }
63023
63024         fieldsArr.forEach(function(field) {
63025             field
63026                 .tags(tags);
63027         });
63028
63029
63030         selection
63031             .call(formFields.fieldsArr(fieldsArr));
63032
63033
63034         if (initial) {
63035             var commentField = selection.select('#preset-input-comment'),
63036                 commentNode = commentField.node();
63037
63038             if (commentNode) {
63039                 commentNode.focus();
63040                 commentNode.select();
63041             }
63042
63043             // trigger a 'blur' event so that comment field can be cleaned
63044             // and checked for hashtags, even if retrieved from localstorage
63045             utilTriggerEvent(commentField, 'blur');
63046
63047             var osm = context.connection();
63048             if (osm) {
63049                 osm.userChangesets(function (err, changesets) {
63050                     if (err) return;
63051
63052                     var comments = changesets.map(function(changeset) {
63053                         return {
63054                             title: changeset.tags.comment,
63055                             value: changeset.tags.comment
63056                         };
63057                     });
63058
63059                     commentField
63060                         .call(d3combobox()
63061                             .container(context.container())
63062                             .caseSensitive(true)
63063                             .data(uniqBy(comments, 'title'))
63064                         );
63065                 });
63066             }
63067         }
63068
63069         // Add warning if comment mentions Google
63070         var hasGoogle = tags.comment.match(/google/i);
63071         var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
63072             .data(hasGoogle ? [0] : []);
63073
63074         commentWarning.exit()
63075             .transition()
63076             .duration(200)
63077             .style('opacity', 0)
63078             .remove();
63079
63080         var commentEnter = commentWarning.enter()
63081             .insert('div', '.tag-reference-body')
63082             .attr('class', 'field-warning comment-warning')
63083             .style('opacity', 0);
63084
63085         commentEnter
63086             .append('a')
63087             .attr('target', '_blank')
63088             .attr('tabindex', -1)
63089             .call(svgIcon('#icon-alert', 'inline'))
63090             .attr('href', t('commit.google_warning_link'))
63091             .append('span')
63092             .text(t('commit.google_warning'));
63093
63094         commentEnter
63095             .transition()
63096             .duration(200)
63097             .style('opacity', 1);
63098     }
63099
63100
63101     changesetEditor.tags = function(_) {
63102         if (!arguments.length) return tags;
63103         tags = _;
63104         // Don't reset fieldsArr here.
63105         return changesetEditor;
63106     };
63107
63108
63109     changesetEditor.changesetID = function(_) {
63110         if (!arguments.length) return changesetId;
63111         if (changesetId === _) return changesetEditor;
63112         changesetId = _;
63113         fieldsArr = null;
63114         return changesetEditor;
63115     };
63116
63117
63118     return utilRebind(changesetEditor, dispatch$$1, 'on');
63119 }
63120
63121 /**
63122  * This method is like `_.union` except that it accepts `iteratee` which is
63123  * invoked for each element of each `arrays` to generate the criterion by
63124  * which uniqueness is computed. Result values are chosen from the first
63125  * array in which the value occurs. The iteratee is invoked with one argument:
63126  * (value).
63127  *
63128  * @static
63129  * @memberOf _
63130  * @since 4.0.0
63131  * @category Array
63132  * @param {...Array} [arrays] The arrays to inspect.
63133  * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
63134  * @returns {Array} Returns the new array of combined values.
63135  * @example
63136  *
63137  * _.unionBy([2.1], [1.2, 2.3], Math.floor);
63138  * // => [2.1, 1.2]
63139  *
63140  * // The `_.property` iteratee shorthand.
63141  * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
63142  * // => [{ 'x': 1 }, { 'x': 2 }]
63143  */
63144 var unionBy = baseRest(function(arrays) {
63145   var iteratee = last(arrays);
63146   if (isArrayLikeObject(iteratee)) {
63147     iteratee = undefined;
63148   }
63149   return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
63150 });
63151
63152 function uiCommitChanges(context) {
63153     var detected = utilDetect();
63154
63155
63156     function commitChanges(selection$$1) {
63157
63158         var history = context.history(),
63159             summary = history.difference().summary();
63160
63161         var container = selection$$1.selectAll('.modal-section.commit-section')
63162             .data([0]);
63163
63164         var containerEnter = container.enter()
63165             .append('div')
63166             .attr('class', 'commit-section modal-section fillL2');
63167
63168         containerEnter
63169             .append('h3')
63170             .text(t('commit.changes', { count: summary.length }));
63171
63172         containerEnter
63173             .append('ul')
63174             .attr('class', 'changeset-list');
63175
63176         container = containerEnter
63177             .merge(container);
63178
63179
63180         var items = container.select('ul').selectAll('li')
63181             .data(summary);
63182
63183         var itemsEnter = items.enter()
63184             .append('li')
63185             .attr('class', 'change-item');
63186
63187         itemsEnter
63188             .each(function(d) {
63189                 d3_select(this)
63190                     .call(svgIcon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
63191             });
63192
63193         itemsEnter
63194             .append('span')
63195             .attr('class', 'change-type')
63196             .text(function(d) { return t('commit.' + d.changeType) + ' '; });
63197
63198         itemsEnter
63199             .append('strong')
63200             .attr('class', 'entity-type')
63201             .text(function(d) {
63202                 var matched = context.presets().match(d.entity, d.graph);
63203                 return (matched && matched.name()) || utilDisplayType(d.entity.id);
63204             });
63205
63206         itemsEnter
63207             .append('span')
63208             .attr('class', 'entity-name')
63209             .text(function(d) {
63210                 var name = utilDisplayName(d.entity) || '',
63211                     string = '';
63212                 if (name !== '') {
63213                     string += ':';
63214                 }
63215                 return string += ' ' + name;
63216             });
63217
63218         itemsEnter
63219             .style('opacity', 0)
63220             .transition()
63221             .style('opacity', 1);
63222
63223         items = itemsEnter
63224             .merge(items);
63225
63226         items
63227             .on('mouseover', mouseover)
63228             .on('mouseout', mouseout)
63229             .on('click', zoomToEntity);
63230
63231
63232         // Download changeset link
63233         var changeset = new osmChangeset().update({ id: undefined }),
63234             changes = history.changes(actionDiscardTags(history.difference()));
63235
63236         delete changeset.id;  // Export without chnageset_id
63237
63238         var data = JXON.stringify(changeset.osmChangeJXON(changes)),
63239             blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
63240             fileName = 'changes.osc';
63241
63242         var linkEnter = container.selectAll('.download-changes')
63243             .data([0])
63244             .enter()
63245             .append('a')
63246             .attr('class', 'download-changes');
63247
63248         if (detected.download) {      // All except IE11 and Edge
63249             linkEnter                 // download the data as a file
63250                 .attr('href', window.URL.createObjectURL(blob))
63251                 .attr('download', fileName);
63252
63253         } else {                      // IE11 and Edge
63254             linkEnter                 // open data uri in a new tab
63255                 .attr('target', '_blank')
63256                 .on('click.download', function() {
63257                     navigator.msSaveBlob(blob, fileName);
63258                 });
63259         }
63260
63261         linkEnter
63262             .call(svgIcon('#icon-load', 'inline'))
63263             .append('span')
63264             .text(t('commit.download_changes'));
63265
63266
63267         function mouseover(d) {
63268             if (d.entity) {
63269                 context.surface().selectAll(
63270                     utilEntityOrMemberSelector([d.entity.id], context.graph())
63271                 ).classed('hover', true);
63272             }
63273         }
63274
63275
63276         function mouseout() {
63277             context.surface().selectAll('.hover')
63278                 .classed('hover', false);
63279         }
63280
63281
63282         function zoomToEntity(change) {
63283             var entity = change.entity;
63284             if (change.changeType !== 'deleted' &&
63285                 context.graph().entity(entity.id).geometry(context.graph()) !== 'vertex') {
63286                 context.map().zoomTo(entity);
63287                 context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
63288                     .classed('hover', true);
63289             }
63290         }
63291     }
63292
63293
63294     return commitChanges;
63295 }
63296
63297 function uiCommitWarnings(context) {
63298
63299     function commitWarnings(selection) {
63300
63301         var changes = context.history().changes();
63302         var warnings = context.history().validate(changes);
63303
63304         var container = selection.selectAll('.warning-section')
63305             .data(warnings.length ? [0] : []);
63306
63307         container.exit()
63308             .remove();
63309
63310         var containerEnter = container.enter()
63311             .append('div')
63312             .attr('class', 'modal-section warning-section fillL2');
63313
63314         containerEnter
63315             .append('h3')
63316             .text(t('commit.warnings'));
63317
63318         containerEnter
63319             .append('ul')
63320             .attr('class', 'changeset-list');
63321
63322         container = containerEnter
63323             .merge(container);
63324
63325
63326         var items = container.select('ul').selectAll('li')
63327             .data(warnings);
63328
63329         items.exit()
63330             .remove();
63331
63332         var itemsEnter = items.enter()
63333             .append('li')
63334             .attr('class', 'warning-item');
63335
63336         itemsEnter
63337             .call(svgIcon('#icon-alert', 'pre-text'));
63338
63339         itemsEnter
63340             .append('strong')
63341             .text(function(d) { return d.message; });
63342
63343         itemsEnter.filter(function(d) { return d.tooltip; })
63344             .call(tooltip()
63345                 .title(function(d) { return d.tooltip; })
63346                 .placement('top')
63347             );
63348
63349         items = itemsEnter
63350             .merge(items);
63351
63352         items
63353             .on('mouseover', mouseover)
63354             .on('mouseout', mouseout)
63355             .on('click', warningClick);
63356
63357
63358         function mouseover(d) {
63359             if (d.entity) {
63360                 context.surface().selectAll(
63361                     utilEntityOrMemberSelector([d.entity.id], context.graph())
63362                 ).classed('hover', true);
63363             }
63364         }
63365
63366
63367         function mouseout() {
63368             context.surface().selectAll('.hover')
63369                 .classed('hover', false);
63370         }
63371
63372
63373         function warningClick(d) {
63374             if (d.entity) {
63375                 context.map().zoomTo(d.entity);
63376                 context.enter(modeSelect(context, [d.entity.id]));
63377             }
63378         }
63379
63380     }
63381
63382
63383     return commitWarnings;
63384 }
63385
63386 var changeset;
63387 var readOnlyTags = [
63388     /^changesets_count$/,
63389     /^created_by$/,
63390     /^ideditor:/,
63391     /^imagery_used$/,
63392     /^host$/,
63393     /^locale$/
63394 ];
63395
63396
63397 function uiCommit(context) {
63398     var dispatch$$1 = dispatch('cancel', 'save'),
63399         userDetails,
63400         _selection;
63401
63402     var changesetEditor = uiChangesetEditor(context)
63403         .on('change', changeTags);
63404     var rawTagEditor = uiRawTagEditor(context)
63405         .on('change', changeTags);
63406     var commitChanges = uiCommitChanges(context);
63407     var commitWarnings = uiCommitWarnings(context);
63408
63409
63410     function commit(selection$$1) {
63411         _selection = selection$$1;
63412
63413         var osm = context.connection();
63414         if (!osm) return;
63415
63416         // expire stored comment and hashtags after cutoff datetime - #3947
63417         var commentDate = +context.storage('commentDate') || 0,
63418             currDate = Date.now(),
63419             cutoff = 2 * 86400 * 1000;   // 2 days
63420         if (commentDate > currDate || currDate - commentDate > cutoff) {
63421             context.storage('comment', null);
63422             context.storage('hashtags', null);
63423         }
63424
63425         var tags;
63426         if (!changeset) {
63427             var detected = utilDetect();
63428             tags = {
63429                 comment: context.storage('comment') || '',
63430                 created_by: ('iD ' + context.version).substr(0, 255),
63431                 imagery_used: context.history().imageryUsed().join(';').substr(0, 255),
63432                 host: detected.host.substr(0, 255),
63433                 locale: detected.locale.substr(0, 255)
63434             };
63435
63436             // call findHashtags initially - this will remove stored
63437             // hashtags if any hashtags are found in the comment - #4304
63438             findHashtags(tags, true);
63439
63440             var hashtags = context.storage('hashtags');
63441             if (hashtags) {
63442                 tags.hashtags = hashtags;
63443             }
63444
63445             changeset = new osmChangeset({ tags: tags });
63446         }
63447
63448         tags = clone(changeset.tags);
63449
63450         var header = selection$$1.selectAll('.header')
63451             .data([0]);
63452
63453         header.enter()
63454             .append('div')
63455             .attr('class', 'header fillL')
63456             .append('h3')
63457             .text(t('commit.title'));
63458
63459         var body = selection$$1.selectAll('.body')
63460             .data([0]);
63461
63462         body = body.enter()
63463             .append('div')
63464             .attr('class', 'body')
63465             .merge(body);
63466
63467
63468         // Changeset Section
63469         var changesetSection = body.selectAll('.changeset-editor')
63470             .data([0]);
63471
63472         changesetSection = changesetSection.enter()
63473             .append('div')
63474             .attr('class', 'modal-section changeset-editor')
63475             .merge(changesetSection);
63476
63477         changesetSection
63478             .call(changesetEditor
63479                 .changesetID(changeset.id)
63480                 .tags(tags)
63481             );
63482
63483
63484         // Warnings
63485         body.call(commitWarnings);
63486
63487
63488         // Upload Explanation
63489         var saveSection = body.selectAll('.save-section')
63490             .data([0]);
63491
63492         saveSection = saveSection.enter()
63493             .append('div')
63494             .attr('class','modal-section save-section fillL cf')
63495             .merge(saveSection);
63496
63497         var prose = saveSection.selectAll('.commit-info')
63498             .data([0]);
63499
63500         prose = prose.enter()
63501             .append('p')
63502             .attr('class', 'commit-info')
63503             .text(t('commit.upload_explanation'))
63504             .merge(prose);
63505
63506         osm.userDetails(function(err, user) {
63507             if (err) return;
63508
63509             var userLink = d3_select(document.createElement('div'));
63510
63511             userDetails = user;
63512
63513             if (user.image_url) {
63514                 userLink
63515                     .append('img')
63516                     .attr('src', user.image_url)
63517                     .attr('class', 'icon pre-text user-icon');
63518             }
63519
63520             userLink
63521                 .append('a')
63522                 .attr('class','user-info')
63523                 .text(user.display_name)
63524                 .attr('href', osm.userURL(user.display_name))
63525                 .attr('tabindex', -1)
63526                 .attr('target', '_blank');
63527
63528             prose
63529                 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
63530         });
63531
63532
63533         // Request Review
63534         var requestReview = saveSection.selectAll('.request-review')
63535             .data([0]);
63536
63537         // Enter
63538         var requestReviewEnter = requestReview.enter()
63539             .append('div')
63540             .attr('class', 'request-review');
63541
63542         var labelEnter = requestReviewEnter
63543             .append('label')
63544             .attr('for', 'commit-input-request-review');
63545
63546         labelEnter
63547             .append('input')
63548             .attr('type', 'checkbox')
63549             .attr('id', 'commit-input-request-review');
63550
63551         labelEnter
63552             .append('span')
63553             .text(t('commit.request_review'));
63554
63555         // Update
63556         requestReview = requestReview
63557             .merge(requestReviewEnter);
63558
63559         var requestReviewInput = requestReview.selectAll('input')
63560             .property('checked', isReviewRequested(changeset.tags))
63561             .on('change', toggleRequestReview);
63562
63563
63564         // Buttons
63565         var buttonSection = saveSection.selectAll('.buttons')
63566             .data([0]);
63567
63568         // enter
63569         var buttonEnter = buttonSection.enter()
63570             .append('div')
63571             .attr('class', 'buttons fillL cf');
63572
63573         buttonEnter
63574             .append('button')
63575             .attr('class', 'secondary-action col5 button cancel-button')
63576             .append('span')
63577             .attr('class', 'label')
63578             .text(t('commit.cancel'));
63579
63580         buttonEnter
63581             .append('button')
63582             .attr('class', 'action col5 button save-button')
63583             .append('span')
63584             .attr('class', 'label')
63585             .text(t('commit.save'));
63586
63587         // update
63588         buttonSection = buttonSection
63589             .merge(buttonEnter);
63590
63591         buttonSection.selectAll('.cancel-button')
63592             .on('click.cancel', function() {
63593                 dispatch$$1.call('cancel');
63594             });
63595
63596         buttonSection.selectAll('.save-button')
63597             .attr('disabled', function() {
63598                 var n = d3_select('#preset-input-comment').node();
63599                 return (n && n.value.length) ? null : true;
63600             })
63601             .on('click.save', function() {
63602                 dispatch$$1.call('save', this, changeset);
63603             });
63604
63605
63606         // Raw Tag Editor
63607         var tagSection = body.selectAll('.tag-section.raw-tag-editor')
63608             .data([0]);
63609
63610         tagSection = tagSection.enter()
63611             .append('div')
63612             .attr('class', 'modal-section tag-section raw-tag-editor')
63613             .merge(tagSection);
63614
63615         var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
63616         tagSection
63617             .call(rawTagEditor
63618                 .expanded(expanded)
63619                 .readOnlyTags(readOnlyTags)
63620                 .tags(clone(changeset.tags))
63621             );
63622
63623
63624         // Change summary
63625         body.call(commitChanges);
63626
63627
63628         function toggleRequestReview() {
63629             var rr = requestReviewInput.property('checked');
63630             updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
63631
63632             var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
63633
63634             tagSection
63635                 .call(rawTagEditor
63636                     .expanded(expanded)
63637                     .readOnlyTags(readOnlyTags)
63638                     .tags(clone(changeset.tags))
63639                 );
63640         }
63641     }
63642
63643
63644     function changeTags(changed, onInput) {
63645         if (changed.hasOwnProperty('comment')) {
63646             if (changed.comment === undefined) {
63647                 changed.comment = '';
63648             }
63649             if (!onInput) {
63650                 context.storage('comment', changed.comment);
63651                 context.storage('commentDate', Date.now());
63652             }
63653         }
63654
63655         updateChangeset(changed, onInput);
63656
63657         if (_selection) {
63658             _selection.call(commit);
63659         }
63660     }
63661
63662
63663     function findHashtags(tags, commentOnly) {
63664         var inComment = commentTags(),
63665             inHashTags = hashTags();
63666
63667         if (inComment !== null) {                    // when hashtags are detected in comment...
63668             context.storage('hashtags', null);       // always remove stored hashtags - #4304
63669             if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
63670         }
63671         return unionBy(inComment, inHashTags, function (s) {
63672             return s.toLowerCase();
63673         });
63674
63675         // Extract hashtags from `comment`
63676         function commentTags() {
63677             return tags.comment
63678                 .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
63679                 .match(/#[\w-]+/g);
63680         }
63681
63682         // Extract and clean hashtags from `hashtags`
63683         function hashTags() {
63684             var t$$1 = tags.hashtags || '';
63685             return t$$1
63686                 .split(/[,;\s]+/)
63687                 .map(function (s) {
63688                     if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
63689                     var matched = s.match(/#[\w-]+/g);    // match valid hashtags
63690                     return matched && matched[0];
63691                 }).filter(Boolean);                       // exclude falsey
63692         }
63693     }
63694
63695
63696     function isReviewRequested(tags) {
63697         var rr = tags.review_requested;
63698         if (rr === undefined) return false;
63699         rr = rr.trim().toLowerCase();
63700         return !(rr === '' || rr === 'no');
63701     }
63702
63703
63704     function updateChangeset(changed, onInput) {
63705         var tags = clone(changeset.tags);
63706
63707         forEach(changed, function(v, k) {
63708             k = k.trim().substr(0, 255);
63709             if (readOnlyTags.indexOf(k) !== -1) return;
63710
63711             if (k !== '' && v !== undefined) {
63712                 if (onInput) {
63713                     tags[k] = v;
63714                 } else {
63715                     tags[k] = v.trim().substr(0, 255);
63716                 }
63717             } else {
63718                 delete tags[k];
63719             }
63720         });
63721
63722         if (!onInput) {
63723             // when changing the comment, override hashtags with any found in comment.
63724             var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
63725             var arr = findHashtags(tags, commentOnly);
63726             if (arr.length) {
63727                 tags.hashtags = arr.join(';').substr(0, 255);
63728                 context.storage('hashtags', tags.hashtags);
63729             } else {
63730                 delete tags.hashtags;
63731                 context.storage('hashtags', null);
63732             }
63733         }
63734
63735         // always update userdetails, just in case user reauthenticates as someone else
63736         if (userDetails && userDetails.changesets_count !== undefined) {
63737             var changesetsCount = parseInt(userDetails.changesets_count, 10) + 1;  // #4283
63738             tags.changesets_count = String(changesetsCount);
63739
63740             // first 100 edits - new user
63741             if (changesetsCount <= 100) {
63742                 var s;
63743                 s = context.storage('walkthrough_completed');
63744                 if (s) {
63745                     tags['ideditor:walkthrough_completed'] = s;
63746                 }
63747
63748                 s = context.storage('walkthrough_progress');
63749                 if (s) {
63750                     tags['ideditor:walkthrough_progress'] = s;
63751                 }
63752
63753                 s = context.storage('walkthrough_started');
63754                 if (s) {
63755                     tags['ideditor:walkthrough_started'] = s;
63756                 }
63757             }
63758         } else {
63759             delete tags.changesets_count;
63760         }
63761
63762         if (!isEqual(changeset.tags, tags)) {
63763             changeset = changeset.update({ tags: tags });
63764         }
63765     }
63766
63767
63768     commit.reset = function() {
63769         changeset = null;
63770     };
63771
63772
63773     return utilRebind(commit, dispatch$$1, 'on');
63774 }
63775
63776 function uiConfirm(selection) {
63777     var modalSelection = uiModal(selection);
63778
63779     modalSelection.select('.modal')
63780         .classed('modal-alert', true);
63781
63782     var section = modalSelection.select('.content');
63783
63784     section.append('div')
63785         .attr('class', 'modal-section header');
63786
63787     section.append('div')
63788         .attr('class', 'modal-section message-text');
63789
63790     var buttons = section.append('div')
63791         .attr('class', 'modal-section buttons cf');
63792
63793
63794     modalSelection.okButton = function() {
63795         buttons
63796             .append('button')
63797             .attr('class', 'action col4')
63798             .on('click.confirm', function() {
63799                 modalSelection.remove();
63800             })
63801             .text(t('confirm.okay'));
63802
63803         return modalSelection;
63804     };
63805
63806
63807     return modalSelection;
63808 }
63809
63810 function uiConflicts(context) {
63811     var dispatch$$1 = dispatch('cancel', 'save'),
63812         origChanges,
63813         conflictList;
63814
63815
63816     function conflicts(selection$$1) {
63817         var header = selection$$1
63818             .append('div')
63819             .attr('class', 'header fillL');
63820
63821         header
63822             .append('button')
63823             .attr('class', 'fr')
63824             .on('click', function() { dispatch$$1.call('cancel'); })
63825             .call(svgIcon('#icon-close'));
63826
63827         header
63828             .append('h3')
63829             .text(t('save.conflict.header'));
63830
63831         var body = selection$$1
63832             .append('div')
63833             .attr('class', 'body fillL');
63834
63835         var conflictsHelp = body
63836             .append('div')
63837             .attr('class', 'conflicts-help')
63838             .text(t('save.conflict.help'));
63839
63840
63841         // Download changes link
63842         var detected = utilDetect(),
63843             changeset = new osmChangeset();
63844
63845         delete changeset.id;  // Export without chnageset_id
63846
63847         var data = JXON.stringify(changeset.osmChangeJXON(origChanges)),
63848             blob = new Blob([data], {type: 'text/xml;charset=utf-8;'}),
63849             fileName = 'changes.osc';
63850
63851         var linkEnter = conflictsHelp.selectAll('.download-changes')
63852             .data([0])
63853             .enter()
63854             .append('a')
63855             .attr('class', 'download-changes');
63856
63857         if (detected.download) {      // All except IE11 and Edge
63858             linkEnter                 // download the data as a file
63859                 .attr('href', window.URL.createObjectURL(blob))
63860                 .attr('download', fileName);
63861
63862         } else {                      // IE11 and Edge
63863             linkEnter                 // open data uri in a new tab
63864                 .attr('target', '_blank')
63865                 .on('click.download', function() {
63866                     navigator.msSaveBlob(blob, fileName);
63867                 });
63868         }
63869
63870         linkEnter
63871             .call(svgIcon('#icon-load', 'inline'))
63872             .append('span')
63873             .text(t('save.conflict.download_changes'));
63874
63875
63876         body
63877             .append('div')
63878             .attr('class', 'conflict-container fillL3')
63879             .call(showConflict, 0);
63880
63881         body
63882             .append('div')
63883             .attr('class', 'conflicts-done')
63884             .attr('opacity', 0)
63885             .style('display', 'none')
63886             .text(t('save.conflict.done'));
63887
63888         var buttons = body
63889             .append('div')
63890             .attr('class','buttons col12 joined conflicts-buttons');
63891
63892         buttons
63893             .append('button')
63894             .attr('disabled', conflictList.length > 1)
63895             .attr('class', 'action conflicts-button col6')
63896             .text(t('save.title'))
63897             .on('click.try_again', function() { dispatch$$1.call('save'); });
63898
63899         buttons
63900             .append('button')
63901             .attr('class', 'secondary-action conflicts-button col6')
63902             .text(t('confirm.cancel'))
63903             .on('click.cancel', function() { dispatch$$1.call('cancel'); });
63904     }
63905
63906
63907     function showConflict(selection$$1, index) {
63908         if (index < 0 || index >= conflictList.length) return;
63909
63910         var parent = d3_select(selection$$1.node().parentNode);
63911
63912         // enable save button if this is the last conflict being reviewed..
63913         if (index === conflictList.length - 1) {
63914             window.setTimeout(function() {
63915                 parent.select('.conflicts-button')
63916                     .attr('disabled', null);
63917
63918                 parent.select('.conflicts-done')
63919                     .transition()
63920                     .attr('opacity', 1)
63921                     .style('display', 'block');
63922             }, 250);
63923         }
63924
63925         var item = selection$$1
63926             .selectAll('.conflict')
63927             .data([conflictList[index]]);
63928
63929         var enter = item.enter()
63930             .append('div')
63931             .attr('class', 'conflict');
63932
63933         enter
63934             .append('h4')
63935             .attr('class', 'conflict-count')
63936             .text(t('save.conflict.count', { num: index + 1, total: conflictList.length }));
63937
63938         enter
63939             .append('a')
63940             .attr('class', 'conflict-description')
63941             .attr('href', '#')
63942             .text(function(d) { return d.name; })
63943             .on('click', function(d) {
63944                 zoomToEntity(d.id);
63945                 event.preventDefault();
63946             });
63947
63948         var details = enter
63949             .append('div')
63950             .attr('class', 'conflict-detail-container');
63951
63952         details
63953             .append('ul')
63954             .attr('class', 'conflict-detail-list')
63955             .selectAll('li')
63956             .data(function(d) { return d.details || []; })
63957             .enter()
63958             .append('li')
63959             .attr('class', 'conflict-detail-item')
63960             .html(function(d) { return d; });
63961
63962         details
63963             .append('div')
63964             .attr('class', 'conflict-choices')
63965             .call(addChoices);
63966
63967         details
63968             .append('div')
63969             .attr('class', 'conflict-nav-buttons joined cf')
63970             .selectAll('button')
63971             .data(['previous', 'next'])
63972             .enter()
63973             .append('button')
63974             .text(function(d) { return t('save.conflict.' + d); })
63975             .attr('class', 'conflict-nav-button action col6')
63976             .attr('disabled', function(d, i) {
63977                 return (i === 0 && index === 0) ||
63978                     (i === 1 && index === conflictList.length - 1) || null;
63979             })
63980             .on('click', function(d, i) {
63981                 var container = parent.select('.conflict-container'),
63982                 sign = (i === 0 ? -1 : 1);
63983
63984                 container
63985                     .selectAll('.conflict')
63986                     .remove();
63987
63988                 container
63989                     .call(showConflict, index + sign);
63990
63991                 event.preventDefault();
63992             });
63993
63994         item.exit()
63995             .remove();
63996     }
63997
63998
63999     function addChoices(selection$$1) {
64000         var choices = selection$$1
64001             .append('ul')
64002             .attr('class', 'layer-list')
64003             .selectAll('li')
64004             .data(function(d) { return d.choices || []; });
64005
64006         var enter = choices.enter()
64007             .append('li')
64008             .attr('class', 'layer');
64009
64010         var label = enter
64011             .append('label');
64012
64013         label
64014             .append('input')
64015             .attr('type', 'radio')
64016             .attr('name', function(d) { return d.id; })
64017             .on('change', function(d, i) {
64018                 var ul = this.parentNode.parentNode.parentNode;
64019                 ul.__data__.chosen = i;
64020                 choose(ul, d);
64021             });
64022
64023         label
64024             .append('span')
64025             .text(function(d) { return d.text; });
64026
64027         choices
64028             .each(function(d, i) {
64029                 var ul = this.parentNode;
64030                 if (ul.__data__.chosen === i) choose(ul, d);
64031             });
64032     }
64033
64034
64035     function choose(ul, datum) {
64036         if (event) event.preventDefault();
64037
64038         d3_select(ul)
64039             .selectAll('li')
64040             .classed('active', function(d) { return d === datum; })
64041             .selectAll('input')
64042             .property('checked', function(d) { return d === datum; });
64043
64044         var extent = geoExtent$$1(),
64045             entity;
64046
64047         entity = context.graph().hasEntity(datum.id);
64048         if (entity) extent._extend(entity.extent(context.graph()));
64049
64050         datum.action();
64051
64052         entity = context.graph().hasEntity(datum.id);
64053         if (entity) extent._extend(entity.extent(context.graph()));
64054
64055         zoomToEntity(datum.id, extent);
64056     }
64057
64058
64059     function zoomToEntity(id, extent) {
64060         context.surface().selectAll('.hover')
64061             .classed('hover', false);
64062
64063         var entity = context.graph().hasEntity(id);
64064         if (entity) {
64065             if (extent) {
64066                 context.map().trimmedExtent(extent);
64067             } else {
64068                 context.map().zoomTo(entity);
64069             }
64070             context.surface().selectAll(
64071                 utilEntityOrMemberSelector([entity.id], context.graph()))
64072                 .classed('hover', true);
64073         }
64074     }
64075
64076
64077     // The conflict list should be an array of objects like:
64078     // {
64079     //     id: id,
64080     //     name: entityName(local),
64081     //     details: merge.conflicts(),
64082     //     chosen: 1,
64083     //     choices: [
64084     //         choice(id, keepMine, forceLocal),
64085     //         choice(id, keepTheirs, forceRemote)
64086     //     ]
64087     // }
64088     conflicts.list = function(_) {
64089         if (!arguments.length) return conflictList;
64090         conflictList = _;
64091         return conflicts;
64092     };
64093
64094
64095     conflicts.origChanges = function(_) {
64096         if (!arguments.length) return origChanges;
64097         origChanges = _;
64098         return conflicts;
64099     };
64100
64101
64102     return utilRebind(conflicts, dispatch$$1, 'on');
64103 }
64104
64105 function uiEditMenu(context, operations) {
64106     var menu,
64107         center = [0, 0],
64108         offset = [0, 0],
64109         tooltip;
64110
64111     var p = 8,               // top padding
64112         m = 4,               // top margin
64113         h = 15,              // height of icon
64114         vpBottomMargin = 45, // viewport bottom margin
64115         vpSideMargin = 35,   // viewport side margin
64116         buttonWidth = 44,
64117         buttonHeight = (2 * p + h),
64118         menuWidth = buttonWidth,
64119         menuHeight = (2 * m) + operations.length * buttonHeight,
64120         menuSideMargin = 10,
64121         tooltipWidth = 200,
64122         tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
64123
64124
64125     var editMenu = function (selection$$1) {
64126         if (!operations.length) return;
64127
64128         selection$$1.node().parentNode.focus();
64129
64130         var isRTL = textDirection === 'rtl',
64131             viewport = context.surfaceRect();
64132
64133         if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
64134             // menu is going left-to-right and near right viewport edge, go left instead
64135             isRTL = true;
64136         } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
64137             // menu is going right-to-left and near left viewport edge, go right instead
64138             isRTL = false;
64139         }
64140
64141         offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
64142
64143         if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
64144             // menu is near bottom viewport edge, shift upwards
64145             offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
64146         }
64147
64148         var origin = [ center[0] + offset[0], center[1] + offset[1] ];
64149
64150         menu = selection$$1
64151             .append('g')
64152             .attr('class', 'edit-menu')
64153             .attr('transform', 'translate(' + origin + ')')
64154             .attr('opacity', 0);
64155
64156         menu
64157             .transition()
64158             .attr('opacity', 1);
64159
64160         menu
64161             .append('rect')
64162             .attr('class', 'edit-menu-background')
64163             .attr('x', 4)
64164             .attr('rx', 4)
64165             .attr('ry', 4)
64166             .attr('width', menuWidth)
64167             .attr('height', menuHeight)
64168             .attr('stroke-linecap', 'round');
64169
64170
64171         var button = menu.selectAll('.edit-menu-item')
64172             .data(operations)
64173             .enter()
64174             .append('g')
64175             .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
64176             .classed('disabled', function (d) { return d.disabled(); })
64177             .attr('transform', function (d, i) {
64178                 return 'translate(' + geoRoundCoords([
64179                     0,
64180                     m + i * buttonHeight
64181                 ]).join(',') + ')';
64182             });
64183
64184         button
64185             .append('rect')
64186             .attr('x', 4)
64187             .attr('width', buttonWidth)
64188             .attr('height', buttonHeight)
64189             .on('click', click)
64190             .on('mousedown', mousedown)
64191             .on('mouseover', mouseover)
64192             .on('mouseout', mouseout);
64193
64194         button
64195             .append('use')
64196             .attr('width', '20')
64197             .attr('height', '20')
64198             .attr('transform', function () {
64199                 return 'translate(' + [2 * p, 5] + ')';
64200             })
64201             .attr('xlink:href', function (d) { return '#operation-' + d.id; });
64202
64203         tooltip = d3_select(document.body)
64204             .append('div')
64205             .attr('class', 'tooltip-inner edit-menu-tooltip');
64206
64207
64208         function click(operation) {
64209             event.stopPropagation();
64210             if (operation.disabled()) return;
64211             operation();
64212             editMenu.close();
64213         }
64214
64215         function mousedown() {
64216             event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
64217         }
64218
64219         function mouseover(d, i) {
64220             var tipX, tipY;
64221
64222             if (!isRTL) {
64223                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
64224             } else {
64225                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
64226             }
64227
64228             if (tipX + tooltipWidth > viewport.right) {
64229                 // tip is going left-to-right and near right viewport edge, go left instead
64230                 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
64231             } else if (tipX < viewport.left) {
64232                 // tip is going right-to-left and near left viewport edge, go right instead
64233                 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
64234             }
64235
64236             tipY = viewport.top + origin[1] + (i * buttonHeight);
64237             if (tipY + tooltipHeight > viewport.bottom) {
64238                 // tip is near bottom viewport edge, shift upwards
64239                 tipY -= tipY + tooltipHeight - viewport.bottom;
64240             }
64241
64242             tooltip
64243                 .style('left', tipX + 'px')
64244                 .style('top', tipY + 'px')
64245                 .style('display', 'block')
64246                 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
64247         }
64248
64249         function mouseout() {
64250             tooltip.style('display', 'none');
64251         }
64252     };
64253
64254
64255     editMenu.close = function () {
64256         if (menu) {
64257             menu
64258                 .style('pointer-events', 'none')
64259                 .transition()
64260                 .attr('opacity', 0)
64261                 .remove();
64262         }
64263
64264         if (tooltip) {
64265             tooltip.remove();
64266         }
64267     };
64268
64269
64270     editMenu.center = function (_) {
64271         if (!arguments.length) return center;
64272         center = _;
64273         return editMenu;
64274     };
64275
64276
64277     return editMenu;
64278 }
64279
64280 var timer$1;
64281
64282
64283 function uiFlash(showDuration) {
64284     showDuration = showDuration || 1500;
64285
64286     if (timer$1) {
64287         timer$1.stop();
64288     }
64289
64290     d3_select('#footer-wrap')
64291         .attr('class', 'footer-hide');
64292     d3_select('#flash-wrap')
64293         .attr('class', 'footer-show');
64294
64295     var content = d3_select('#flash-wrap').selectAll('.content')
64296         .data([0]);
64297
64298     content = content.enter()
64299         .append('div')
64300         .attr('class', 'content')
64301         .merge(content);
64302
64303     timer$1 = d3_timeout(function() {
64304         timer$1 = null;
64305         d3_select('#footer-wrap')
64306             .attr('class', 'footer-show');
64307         d3_select('#flash-wrap')
64308             .attr('class', 'footer-hide');
64309     }, showDuration);
64310
64311
64312     return content;
64313 }
64314
64315 function uiLasso(context) {
64316     var group, polygon;
64317
64318     lasso.coordinates = [];
64319
64320     function lasso(selection$$1) {
64321         context.container()
64322             .classed('lasso', true);
64323
64324         group = selection$$1
64325             .append('g')
64326             .attr('class', 'lasso hide');
64327
64328         polygon = group
64329             .append('path')
64330             .attr('class', 'lasso-path');
64331
64332         group
64333             .call(uiToggle(true));
64334     }
64335
64336
64337     function draw() {
64338         if (polygon) {
64339             polygon.data([lasso.coordinates])
64340                 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
64341         }
64342     }
64343
64344
64345     lasso.extent = function () {
64346         return lasso.coordinates.reduce(function(extent, point) {
64347             return extent.extend(geoExtent$$1(point));
64348         }, geoExtent$$1());
64349     };
64350
64351
64352     lasso.p = function(_) {
64353         if (!arguments.length) return lasso;
64354         lasso.coordinates.push(_);
64355         draw();
64356         return lasso;
64357     };
64358
64359
64360     lasso.close = function() {
64361         if (group) {
64362             group.call(uiToggle(false, function() {
64363                 d3_select(this).remove();
64364             }));
64365         }
64366         context.container().classed('lasso', false);
64367     };
64368
64369
64370     return lasso;
64371 }
64372
64373 function uiRadialMenu(context, operations) {
64374     var menu,
64375         center = [0, 0],
64376         tooltip;
64377
64378
64379     var radialMenu = function(selection$$1) {
64380         if (!operations.length) return;
64381
64382         selection$$1.node().parentNode.focus();
64383
64384         function click(operation) {
64385             event.stopPropagation();
64386             if (operation.disabled()) return;
64387             operation();
64388             radialMenu.close();
64389         }
64390
64391         menu = selection$$1
64392             .append('g')
64393             .attr('class', 'radial-menu')
64394             .attr('transform', 'translate(' + center + ')')
64395             .attr('opacity', 0);
64396
64397         menu
64398             .transition()
64399             .attr('opacity', 1);
64400
64401         var r = 50,
64402             a = Math.PI / 4,
64403             a0 = -Math.PI / 4,
64404             a1 = a0 + (operations.length - 1) * a;
64405
64406         menu
64407             .append('path')
64408             .attr('class', 'radial-menu-background')
64409             .attr('d', 'M' + r * Math.sin(a0) + ',' +
64410                              r * Math.cos(a0) +
64411                       ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
64412                              (r * Math.sin(a1) + 1e-3) + ',' +
64413                              (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
64414             .attr('stroke-width', 50)
64415             .attr('stroke-linecap', 'round');
64416
64417         var button = menu.selectAll()
64418             .data(operations)
64419             .enter()
64420             .append('g')
64421             .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
64422             .classed('disabled', function(d) { return d.disabled(); })
64423             .attr('transform', function(d, i) {
64424                 return 'translate(' + geoRoundCoords([
64425                         r * Math.sin(a0 + i * a),
64426                         r * Math.cos(a0 + i * a)]).join(',') + ')';
64427             });
64428
64429         button
64430             .append('circle')
64431             .attr('r', 15)
64432             .on('click', click)
64433             .on('mousedown', mousedown)
64434             .on('mouseover', mouseover)
64435             .on('mouseout', mouseout);
64436
64437         button
64438             .append('use')
64439             .attr('transform', 'translate(-10,-10)')
64440             .attr('width', '20')
64441             .attr('height', '20')
64442             .attr('xlink:href', function(d) { return '#operation-' + d.id; });
64443
64444         tooltip = d3_select(document.body)
64445             .append('div')
64446             .attr('class', 'tooltip-inner radial-menu-tooltip');
64447
64448         function mousedown() {
64449             event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
64450         }
64451
64452         function mouseover(d, i) {
64453             var rect = context.surfaceRect(),
64454                 angle = a0 + i * a,
64455                 top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px',
64456                 left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px',
64457                 bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px',
64458                 right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
64459
64460             tooltip
64461                 .style('top', null)
64462                 .style('left', null)
64463                 .style('bottom', null)
64464                 .style('right', null)
64465                 .style('display', 'block')
64466                 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
64467
64468             if (i === 0) {
64469                 tooltip
64470                     .style('right', right)
64471                     .style('top', top);
64472             } else if (i >= 4) {
64473                 tooltip
64474                     .style('left', left)
64475                     .style('bottom', bottom);
64476             } else {
64477                 tooltip
64478                     .style('left', left)
64479                     .style('top', top);
64480             }
64481         }
64482
64483         function mouseout() {
64484             tooltip.style('display', 'none');
64485         }
64486     };
64487
64488
64489     radialMenu.close = function() {
64490         if (menu) {
64491             menu
64492                 .style('pointer-events', 'none')
64493                 .transition()
64494                 .attr('opacity', 0)
64495                 .remove();
64496         }
64497
64498         if (tooltip) {
64499             tooltip.remove();
64500         }
64501     };
64502
64503
64504     radialMenu.center = function(_) {
64505         if (!arguments.length) return center;
64506         center = _;
64507         return radialMenu;
64508     };
64509
64510
64511     return radialMenu;
64512 }
64513
64514 function uiSelectionList(context, selectedIDs) {
64515
64516     function selectEntity(entity) {
64517         context.enter(modeSelect(context, [entity.id]));
64518     }
64519
64520
64521     function deselectEntity(entity) {
64522         event.stopPropagation();
64523         var index = selectedIDs.indexOf(entity.id);
64524         if (index > -1) {
64525             selectedIDs.splice(index, 1);
64526         }
64527         context.enter(modeSelect(context, selectedIDs));
64528     }
64529
64530
64531     function selectionList(selection$$1) {
64532         selection$$1.classed('selection-list-pane', true);
64533
64534         var header = selection$$1
64535             .append('div')
64536             .attr('class', 'header fillL cf');
64537
64538         header
64539             .append('h3')
64540             .text(t('inspector.multiselect'));
64541
64542         var listWrap = selection$$1
64543             .append('div')
64544             .attr('class', 'inspector-body');
64545
64546         var list = listWrap
64547             .append('div')
64548             .attr('class', 'feature-list cf');
64549
64550         context.history().on('change.selection-list', drawList);
64551         drawList();
64552
64553
64554         function drawList() {
64555             var entities = selectedIDs
64556                 .map(function(id) { return context.hasEntity(id); })
64557                 .filter(function(entity) { return entity; });
64558
64559             var items = list.selectAll('.feature-list-item')
64560                 .data(entities, osmEntity$$1.key);
64561
64562             items.exit()
64563                 .remove();
64564
64565             // Enter
64566             var enter = items.enter()
64567                 .append('div')
64568                 .attr('class', 'feature-list-item')
64569                 .on('click', selectEntity);
64570
64571             var label = enter
64572                 .append('button')
64573                 .attr('class', 'label');
64574
64575             enter
64576                 .append('button')
64577                 .attr('class', 'close')
64578                 .on('click', deselectEntity)
64579                 .call(svgIcon('#icon-close'));
64580
64581             label
64582                 .append('span')
64583                 .attr('class', 'entity-geom-icon')
64584                 .call(svgIcon('', 'pre-text'));
64585
64586             label
64587                 .append('span')
64588                 .attr('class', 'entity-type');
64589
64590             label
64591                 .append('span')
64592                 .attr('class', 'entity-name');
64593
64594             // Update
64595             items = items.merge(enter);
64596
64597             items.selectAll('.entity-geom-icon use')
64598                 .attr('href', function() {
64599                     var entity = this.parentNode.parentNode.__data__;
64600                     return '#icon-' + context.geometry(entity.id);
64601                 });
64602
64603             items.selectAll('.entity-type')
64604                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
64605
64606             items.selectAll('.entity-name')
64607                 .text(function(entity) { return utilDisplayName(entity); });
64608         }
64609     }
64610
64611     return selectionList;
64612 }
64613
64614 function uiSourceSwitch(context) {
64615     var keys;
64616
64617
64618     function click() {
64619         event.preventDefault();
64620         if (context.inIntro()) return;
64621
64622         if (context.history().hasChanges() &&
64623             !window.confirm(t('source_switch.lose_changes'))) return;
64624
64625         var live = d3_select(this)
64626             .classed('live');
64627
64628         context.history().clearSaved();
64629         context.connection().switch(live ? keys[1] : keys[0]);
64630         context.enter(modeBrowse(context));
64631         context.flush();
64632
64633         d3_select(this)
64634             .text(live ? t('source_switch.dev') : t('source_switch.live'))
64635             .classed('live', !live);
64636     }
64637
64638     var sourceSwitch = function(selection$$1) {
64639         selection$$1
64640             .append('a')
64641             .attr('href', '#')
64642             .text(t('source_switch.live'))
64643             .classed('live', true)
64644             .attr('tabindex', -1)
64645             .on('click', click);
64646     };
64647
64648
64649     sourceSwitch.keys = function(_) {
64650         if (!arguments.length) return keys;
64651         keys = _;
64652         return sourceSwitch;
64653     };
64654
64655
64656     return sourceSwitch;
64657 }
64658
64659 function uiSuccess(context) {
64660     var dispatch$$1 = dispatch('cancel'),
64661         changeset;
64662
64663
64664     function success(selection$$1) {
64665         var header = selection$$1
64666             .append('div')
64667             .attr('class', 'header fillL');
64668
64669         header
64670             .append('button')
64671             .attr('class', 'fr')
64672             .on('click', function() { dispatch$$1.call('cancel'); })
64673             .call(svgIcon('#icon-close'));
64674
64675         header
64676             .append('h3')
64677             .text(t('success.just_edited'));
64678
64679         var body = selection$$1
64680             .append('div')
64681             .attr('class', 'body save-success fillL');
64682
64683         body
64684             .append('p')
64685             .html(t('success.help_html'));
64686
64687         body
64688             .append('a')
64689             .attr('class', 'details')
64690             .attr('target', '_blank')
64691             .attr('tabindex', -1)
64692             .call(svgIcon('#icon-out-link', 'inline'))
64693             .attr('href', t('success.help_link_url'))
64694             .append('span')
64695             .text(t('success.help_link_text'));
64696
64697         var osm = context.connection();
64698         if (!osm) return;
64699
64700         var changesetURL = osm.changesetURL(changeset.id);
64701
64702         var viewOnOsm = body
64703             .append('a')
64704             .attr('class', 'button col12 osm')
64705             .attr('target', '_blank')
64706             .attr('href', changesetURL);
64707
64708         viewOnOsm
64709             .append('svg')
64710             .attr('class', 'logo logo-osm')
64711             .append('use')
64712             .attr('xlink:href', '#logo-osm');
64713
64714         viewOnOsm
64715             .append('div')
64716             .text(t('success.view_on_osm'));
64717
64718         var message = (changeset.tags.comment || t('success.edited_osm')).substring(0, 130) +
64719             ' ' + changesetURL;
64720
64721         var sharing = [
64722             { key: 'facebook', value: 'https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(changesetURL) },
64723             { key: 'twitter', value: 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message) },
64724             { key: 'google', value: 'https://plus.google.com/share?url=' + encodeURIComponent(changesetURL) }
64725         ];
64726
64727         body.selectAll('.button.social')
64728             .data(sharing)
64729             .enter()
64730             .append('a')
64731             .attr('class', 'button social col4')
64732             .attr('target', '_blank')
64733             .attr('href', function(d) { return d.value; })
64734             .call(tooltip()
64735                 .title(function(d) { return t('success.' + d.key); })
64736                 .placement('bottom'))
64737             .each(function(d) { d3_select(this).call(svgIcon('#logo-' + d.key, 'social')); });
64738     }
64739
64740
64741     success.changeset = function(_) {
64742         if (!arguments.length) return changeset;
64743         changeset = _;
64744         return success;
64745     };
64746
64747
64748     return utilRebind(success, dispatch$$1, 'on');
64749 }
64750
64751 function coreHistory(context) {
64752     var imageryUsed = ['Bing'],
64753         dispatch$$1 = dispatch('change', 'undone', 'redone'),
64754         lock = utilSessionMutex('lock'),
64755         duration = 150,
64756         checkpoints = {},
64757         stack, index, tree;
64758
64759
64760     // internal _act, accepts list of actions and eased time
64761     function _act(actions, t) {
64762         actions = Array.prototype.slice.call(actions);
64763
64764         var annotation;
64765
64766         if (!isFunction(actions[actions.length - 1])) {
64767             annotation = actions.pop();
64768         }
64769
64770         stack[index].transform = context.projection.transform();
64771         stack[index].selectedIDs = context.selectedIDs();
64772
64773         var graph = stack[index].graph;
64774         for (var i = 0; i < actions.length; i++) {
64775             graph = actions[i](graph, t);
64776         }
64777
64778         return {
64779             graph: graph,
64780             annotation: annotation,
64781             imageryUsed: imageryUsed
64782         };
64783     }
64784
64785
64786     // internal _perform with eased time
64787     function _perform(args, t) {
64788         var previous = stack[index].graph;
64789         stack = stack.slice(0, index + 1);
64790         stack.push(_act(args, t));
64791         index++;
64792         return change(previous);
64793     }
64794
64795
64796     // internal _replace with eased time
64797     function _replace(args, t) {
64798         var previous = stack[index].graph;
64799         // assert(index == stack.length - 1)
64800         stack[index] = _act(args, t);
64801         return change(previous);
64802     }
64803
64804
64805     // internal _overwrite with eased time
64806     function _overwrite(args, t) {
64807         var previous = stack[index].graph;
64808         if (index > 0) {
64809             index--;
64810             stack.pop();
64811         }
64812         stack = stack.slice(0, index + 1);
64813         stack.push(_act(args, t));
64814         index++;
64815         return change(previous);
64816     }
64817
64818
64819     // determine diffrence and dispatch a change event
64820     function change(previous) {
64821         var difference$$1 = coreDifference(previous, history.graph());
64822         dispatch$$1.call('change', this, difference$$1);
64823         return difference$$1;
64824     }
64825
64826
64827     // iD uses namespaced keys so multiple installations do not conflict
64828     function getKey(n) {
64829         return 'iD_' + window.location.origin + '_' + n;
64830     }
64831
64832
64833     var history = {
64834
64835         graph: function() {
64836             return stack[index].graph;
64837         },
64838
64839
64840         base: function() {
64841             return stack[0].graph;
64842         },
64843
64844
64845         merge: function(entities, extent) {
64846             stack[0].graph.rebase(entities, map$4(stack, 'graph'), false);
64847             tree.rebase(entities, false);
64848
64849             dispatch$$1.call('change', this, undefined, extent);
64850         },
64851
64852
64853         perform: function() {
64854             // complete any transition already in progress
64855             d3_select(document).interrupt('history.perform');
64856
64857             var transitionable = false,
64858                 action0 = arguments[0];
64859
64860             if (arguments.length === 1 ||
64861                 arguments.length === 2 && !isFunction(arguments[1])) {
64862                 transitionable = !!action0.transitionable;
64863             }
64864
64865             if (transitionable) {
64866                 var origArguments = arguments;
64867                 d3_select(document)
64868                     .transition('history.perform')
64869                     .duration(duration)
64870                     .ease(linear$1)
64871                     .tween('history.tween', function() {
64872                         return function(t) {
64873                             if (t < 1) _overwrite([action0], t);
64874                         };
64875                     })
64876                     .on('start', function() {
64877                         _perform([action0], 0);
64878                     })
64879                     .on('end interrupt', function() {
64880                         _overwrite(origArguments, 1);
64881                     });
64882
64883             } else {
64884                 return _perform(arguments);
64885             }
64886         },
64887
64888
64889         replace: function() {
64890             d3_select(document).interrupt('history.perform');
64891             return _replace(arguments, 1);
64892         },
64893
64894
64895         // Same as calling pop and then perform
64896         overwrite: function() {
64897             d3_select(document).interrupt('history.perform');
64898             return _overwrite(arguments, 1);
64899         },
64900
64901
64902         pop: function(n) {
64903             d3_select(document).interrupt('history.perform');
64904
64905             var previous = stack[index].graph;
64906             if (isNaN(+n) || +n < 0) {
64907                 n = 1;
64908             }
64909             while (n-- > 0 && index > 0) {
64910                 index--;
64911                 stack.pop();
64912             }
64913             return change(previous);
64914         },
64915
64916
64917         // Back to the previous annotated state or index = 0.
64918         undo: function() {
64919             d3_select(document).interrupt('history.perform');
64920
64921             var previous = stack[index].graph;
64922             while (index > 0) {
64923                 index--;
64924                 if (stack[index].annotation) break;
64925             }
64926
64927             dispatch$$1.call('undone', this, stack[index]);
64928             return change(previous);
64929         },
64930
64931
64932         // Forward to the next annotated state.
64933         redo: function() {
64934             d3_select(document).interrupt('history.perform');
64935
64936             var previous = stack[index].graph;
64937             var tryIndex = index;
64938             while (tryIndex < stack.length - 1) {
64939                 tryIndex++;
64940                 if (stack[tryIndex].annotation) {
64941                     index = tryIndex;
64942                     dispatch$$1.call('redone', this, stack[index]);
64943                     break;
64944                 }
64945             }
64946
64947             return change(previous);
64948         },
64949
64950
64951         undoAnnotation: function() {
64952             var i = index;
64953             while (i >= 0) {
64954                 if (stack[i].annotation) return stack[i].annotation;
64955                 i--;
64956             }
64957         },
64958
64959
64960         redoAnnotation: function() {
64961             var i = index + 1;
64962             while (i <= stack.length - 1) {
64963                 if (stack[i].annotation) return stack[i].annotation;
64964                 i++;
64965             }
64966         },
64967
64968
64969         intersects: function(extent) {
64970             return tree.intersects(extent, stack[index].graph);
64971         },
64972
64973
64974         difference: function() {
64975             var base = stack[0].graph,
64976                 head = stack[index].graph;
64977             return coreDifference(base, head);
64978         },
64979
64980
64981         changes: function(action) {
64982             var base = stack[0].graph,
64983                 head = stack[index].graph;
64984
64985             if (action) {
64986                 head = action(head);
64987             }
64988
64989             var difference$$1 = coreDifference(base, head);
64990
64991             return {
64992                 modified: difference$$1.modified(),
64993                 created: difference$$1.created(),
64994                 deleted: difference$$1.deleted()
64995             };
64996         },
64997
64998
64999         validate: function(changes) {
65000             return flatten(
65001                 map$4(Validations, function(fn) { return fn()(changes, stack[index].graph); })
65002             );
65003         },
65004
65005
65006         hasChanges: function() {
65007             return this.difference().length() > 0;
65008         },
65009
65010
65011         imageryUsed: function(sources) {
65012             if (sources) {
65013                 imageryUsed = sources;
65014                 return history;
65015             } else {
65016                 var arr = map$4(stack.slice(1, index + 1), 'imageryUsed');
65017                 return without(uniq(flatten(arr)), 'Custom');
65018             }
65019         },
65020
65021
65022         // save the current history state
65023         checkpoint: function(key) {
65024             checkpoints[key] = {
65025                 stack: cloneDeep(stack),
65026                 index: index
65027             };
65028             return history;
65029         },
65030
65031
65032         // restore history state to a given checkpoint or reset completely
65033         reset: function(key) {
65034             if (key !== undefined && checkpoints.hasOwnProperty(key)) {
65035                 stack = cloneDeep(checkpoints[key].stack);
65036                 index = checkpoints[key].index;
65037             } else {
65038                 stack = [{graph: coreGraph$$1()}];
65039                 index = 0;
65040                 tree = coreTree(stack[0].graph);
65041                 checkpoints = {};
65042             }
65043             dispatch$$1.call('change');
65044             return history;
65045         },
65046
65047
65048         toIntroGraph: function() {
65049             var nextId = { n: 0, r: 0, w: 0 },
65050                 permIds = {},
65051                 graph = this.graph(),
65052                 baseEntities = {};
65053
65054             // clone base entities..
65055             forEach(graph.base().entities, function(entity) {
65056                 var copy = cloneDeepWith(entity, customizer);
65057                 baseEntities[copy.id] = copy;
65058             });
65059
65060             // replace base entities with head entities..
65061             forEach(graph.entities, function(entity, id) {
65062                 if (entity) {
65063                     var copy = cloneDeepWith(entity, customizer);
65064                     baseEntities[copy.id] = copy;
65065                 } else {
65066                     delete baseEntities[id];
65067                 }
65068             });
65069
65070             // swap temporary for permanent ids..
65071             forEach(baseEntities, function(entity) {
65072                 if (Array.isArray(entity.nodes)) {
65073                     entity.nodes = entity.nodes.map(function(node) {
65074                         return permIds[node] || node;
65075                     });
65076                 }
65077                 if (Array.isArray(entity.members)) {
65078                     entity.members = entity.members.map(function(member) {
65079                         member.id = permIds[member.id] || member.id;
65080                         return member;
65081                     });
65082                 }
65083             });
65084
65085             return JSON.stringify({ dataIntroGraph: baseEntities });
65086
65087
65088             function customizer(src) {
65089                 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
65090                 if (isEmpty(copy.tags)) {
65091                     delete copy.tags;
65092                 }
65093
65094                 if (Array.isArray(copy.loc)) {
65095                     copy.loc[0] = +copy.loc[0].toFixed(6);
65096                     copy.loc[1] = +copy.loc[1].toFixed(6);
65097                 }
65098
65099                 var match = src.id.match(/([nrw])-\d*/);  // temporary id
65100                 if (match !== null) {
65101                     var nrw = match[1], permId;
65102                     do { permId = nrw + (++nextId[nrw]); }
65103                     while (baseEntities.hasOwnProperty(permId));
65104
65105                     copy.id = permIds[src.id] = permId;
65106                 }
65107                 return copy;
65108             }
65109         },
65110
65111
65112         toJSON: function() {
65113             if (!this.hasChanges()) return;
65114
65115             var allEntities = {},
65116                 baseEntities = {},
65117                 base = stack[0];
65118
65119             var s = stack.map(function(i) {
65120                 var modified = [], deleted = [];
65121
65122                 forEach(i.graph.entities, function(entity, id) {
65123                     if (entity) {
65124                         var key = osmEntity$$1.key(entity);
65125                         allEntities[key] = entity;
65126                         modified.push(key);
65127                     } else {
65128                         deleted.push(id);
65129                     }
65130
65131                     // make sure that the originals of changed or deleted entities get merged
65132                     // into the base of the stack after restoring the data from JSON.
65133                     if (id in base.graph.entities) {
65134                         baseEntities[id] = base.graph.entities[id];
65135                     }
65136                     // get originals of parent entities too
65137                     forEach(base.graph._parentWays[id], function(parentId) {
65138                         if (parentId in base.graph.entities) {
65139                             baseEntities[parentId] = base.graph.entities[parentId];
65140                         }
65141                     });
65142                 });
65143
65144                 var x = {};
65145
65146                 if (modified.length) x.modified = modified;
65147                 if (deleted.length) x.deleted = deleted;
65148                 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
65149                 if (i.annotation) x.annotation = i.annotation;
65150
65151                 return x;
65152             });
65153
65154             return JSON.stringify({
65155                 version: 3,
65156                 entities: values$1(allEntities),
65157                 baseEntities: values$1(baseEntities),
65158                 stack: s,
65159                 nextIDs: osmEntity$$1.id.next,
65160                 index: index
65161             });
65162         },
65163
65164
65165         fromJSON: function(json, loadChildNodes) {
65166             var h = JSON.parse(json),
65167                 loadComplete = true;
65168
65169             osmEntity$$1.id.next = h.nextIDs;
65170             index = h.index;
65171
65172             if (h.version === 2 || h.version === 3) {
65173                 var allEntities = {};
65174
65175                 h.entities.forEach(function(entity) {
65176                     allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
65177                 });
65178
65179                 if (h.version === 3) {
65180                     // This merges originals for changed entities into the base of
65181                     // the stack even if the current stack doesn't have them (for
65182                     // example when iD has been restarted in a different region)
65183                     var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
65184                     stack[0].graph.rebase(baseEntities, map$4(stack, 'graph'), true);
65185                     tree.rebase(baseEntities, true);
65186
65187                     // When we restore a modified way, we also need to fetch any missing
65188                     // childnodes that would normally have been downloaded with it.. #2142
65189                     if (loadChildNodes) {
65190                         var osm = context.connection();
65191                         var nodes = flatten(uniq(map$4(filter(baseEntities, { type: 'way' }), 'nodes')));
65192                         var missing = reject(nodes, function(n) { return stack[0].graph.hasEntity(n); });
65193
65194                         if (!isEmpty(missing) && osm) {
65195                             loadComplete = false;
65196                             context.redrawEnable(false);
65197
65198                             var loading = uiLoading(context).blocking(true);
65199                             context.container().call(loading);
65200
65201                             var childNodesLoaded = function(err, result) {
65202                                 if (!err) {
65203                                     var visible = groupBy(result.data, 'visible');
65204                                     if (!isEmpty(visible.true)) {
65205                                         missing = difference(missing, map$4(visible.true, 'id'));
65206                                         stack[0].graph.rebase(visible.true, map$4(stack, 'graph'), true);
65207                                         tree.rebase(visible.true, true);
65208                                     }
65209
65210                                     // fetch older versions of nodes that were deleted..
65211                                     forEach(visible.false, function(entity) {
65212                                         osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
65213                                     });
65214                                 }
65215
65216                                 if (err || isEmpty(missing)) {
65217                                     loading.close();
65218                                     context.redrawEnable(true);
65219                                     dispatch$$1.call('change');
65220                                 }
65221                             };
65222
65223                             osm.loadMultiple(missing, childNodesLoaded);
65224                         }
65225                     }
65226                 }
65227
65228                 stack = h.stack.map(function(d) {
65229                     var entities = {}, entity;
65230
65231                     if (d.modified) {
65232                         d.modified.forEach(function(key) {
65233                             entity = allEntities[key];
65234                             entities[entity.id] = entity;
65235                         });
65236                     }
65237
65238                     if (d.deleted) {
65239                         d.deleted.forEach(function(id) {
65240                             entities[id] = undefined;
65241                         });
65242                     }
65243
65244                     return {
65245                         graph: coreGraph$$1(stack[0].graph).load(entities),
65246                         annotation: d.annotation,
65247                         imageryUsed: d.imageryUsed
65248                     };
65249                 });
65250
65251             } else { // original version
65252                 stack = h.stack.map(function(d) {
65253                     var entities = {};
65254
65255                     for (var i in d.entities) {
65256                         var entity = d.entities[i];
65257                         entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
65258                     }
65259
65260                     d.graph = coreGraph$$1(stack[0].graph).load(entities);
65261                     return d;
65262                 });
65263             }
65264
65265             if (loadComplete) {
65266                 dispatch$$1.call('change');
65267             }
65268
65269             return history;
65270         },
65271
65272
65273         save: function() {
65274             if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
65275             return history;
65276         },
65277
65278
65279         clearSaved: function() {
65280             context.debouncedSave.cancel();
65281             if (lock.locked()) context.storage(getKey('saved_history'), null);
65282             return history;
65283         },
65284
65285
65286         lock: function() {
65287             return lock.lock();
65288         },
65289
65290
65291         unlock: function() {
65292             lock.unlock();
65293         },
65294
65295
65296         // is iD not open in another window and it detects that
65297         // there's a history stored in localStorage that's recoverable?
65298         restorableChanges: function() {
65299             return lock.locked() && !!context.storage(getKey('saved_history'));
65300         },
65301
65302
65303         // load history from a version stored in localStorage
65304         restore: function() {
65305             if (!lock.locked()) return;
65306
65307             var json = context.storage(getKey('saved_history'));
65308             if (json) history.fromJSON(json, true);
65309         },
65310
65311
65312         _getKey: getKey
65313
65314     };
65315
65316
65317     history.reset();
65318
65319     return utilRebind(history, dispatch$$1, 'on');
65320 }
65321
65322 /** Used to store function metadata. */
65323 var metaMap = WeakMap && new WeakMap;
65324
65325 /**
65326  * The base implementation of `setData` without support for hot loop shorting.
65327  *
65328  * @private
65329  * @param {Function} func The function to associate metadata with.
65330  * @param {*} data The metadata.
65331  * @returns {Function} Returns `func`.
65332  */
65333 var baseSetData = !metaMap ? identity$8 : function(func, data) {
65334   metaMap.set(func, data);
65335   return func;
65336 };
65337
65338 /**
65339  * Creates a function that produces an instance of `Ctor` regardless of
65340  * whether it was invoked as part of a `new` expression or by `call` or `apply`.
65341  *
65342  * @private
65343  * @param {Function} Ctor The constructor to wrap.
65344  * @returns {Function} Returns the new wrapped function.
65345  */
65346 function createCtor(Ctor) {
65347   return function() {
65348     // Use a `switch` statement to work with class constructors. See
65349     // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
65350     // for more details.
65351     var args = arguments;
65352     switch (args.length) {
65353       case 0: return new Ctor;
65354       case 1: return new Ctor(args[0]);
65355       case 2: return new Ctor(args[0], args[1]);
65356       case 3: return new Ctor(args[0], args[1], args[2]);
65357       case 4: return new Ctor(args[0], args[1], args[2], args[3]);
65358       case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
65359       case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
65360       case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
65361     }
65362     var thisBinding = baseCreate(Ctor.prototype),
65363         result = Ctor.apply(thisBinding, args);
65364
65365     // Mimic the constructor's `return` behavior.
65366     // See https://es5.github.io/#x13.2.2 for more details.
65367     return isObject(result) ? result : thisBinding;
65368   };
65369 }
65370
65371 /** Used to compose bitmasks for function metadata. */
65372 var WRAP_BIND_FLAG$2 = 1;
65373
65374 /**
65375  * Creates a function that wraps `func` to invoke it with the optional `this`
65376  * binding of `thisArg`.
65377  *
65378  * @private
65379  * @param {Function} func The function to wrap.
65380  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65381  * @param {*} [thisArg] The `this` binding of `func`.
65382  * @returns {Function} Returns the new wrapped function.
65383  */
65384 function createBind(func, bitmask, thisArg) {
65385   var isBind = bitmask & WRAP_BIND_FLAG$2,
65386       Ctor = createCtor(func);
65387
65388   function wrapper() {
65389     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
65390     return fn.apply(isBind ? thisArg : this, arguments);
65391   }
65392   return wrapper;
65393 }
65394
65395 /* Built-in method references for those with the same name as other `lodash` methods. */
65396 var nativeMax$6 = Math.max;
65397
65398 /**
65399  * Creates an array that is the composition of partially applied arguments,
65400  * placeholders, and provided arguments into a single array of arguments.
65401  *
65402  * @private
65403  * @param {Array} args The provided arguments.
65404  * @param {Array} partials The arguments to prepend to those provided.
65405  * @param {Array} holders The `partials` placeholder indexes.
65406  * @params {boolean} [isCurried] Specify composing for a curried function.
65407  * @returns {Array} Returns the new array of composed arguments.
65408  */
65409 function composeArgs(args, partials, holders, isCurried) {
65410   var argsIndex = -1,
65411       argsLength = args.length,
65412       holdersLength = holders.length,
65413       leftIndex = -1,
65414       leftLength = partials.length,
65415       rangeLength = nativeMax$6(argsLength - holdersLength, 0),
65416       result = Array(leftLength + rangeLength),
65417       isUncurried = !isCurried;
65418
65419   while (++leftIndex < leftLength) {
65420     result[leftIndex] = partials[leftIndex];
65421   }
65422   while (++argsIndex < holdersLength) {
65423     if (isUncurried || argsIndex < argsLength) {
65424       result[holders[argsIndex]] = args[argsIndex];
65425     }
65426   }
65427   while (rangeLength--) {
65428     result[leftIndex++] = args[argsIndex++];
65429   }
65430   return result;
65431 }
65432
65433 /* Built-in method references for those with the same name as other `lodash` methods. */
65434 var nativeMax$7 = Math.max;
65435
65436 /**
65437  * This function is like `composeArgs` except that the arguments composition
65438  * is tailored for `_.partialRight`.
65439  *
65440  * @private
65441  * @param {Array} args The provided arguments.
65442  * @param {Array} partials The arguments to append to those provided.
65443  * @param {Array} holders The `partials` placeholder indexes.
65444  * @params {boolean} [isCurried] Specify composing for a curried function.
65445  * @returns {Array} Returns the new array of composed arguments.
65446  */
65447 function composeArgsRight(args, partials, holders, isCurried) {
65448   var argsIndex = -1,
65449       argsLength = args.length,
65450       holdersIndex = -1,
65451       holdersLength = holders.length,
65452       rightIndex = -1,
65453       rightLength = partials.length,
65454       rangeLength = nativeMax$7(argsLength - holdersLength, 0),
65455       result = Array(rangeLength + rightLength),
65456       isUncurried = !isCurried;
65457
65458   while (++argsIndex < rangeLength) {
65459     result[argsIndex] = args[argsIndex];
65460   }
65461   var offset = argsIndex;
65462   while (++rightIndex < rightLength) {
65463     result[offset + rightIndex] = partials[rightIndex];
65464   }
65465   while (++holdersIndex < holdersLength) {
65466     if (isUncurried || argsIndex < argsLength) {
65467       result[offset + holders[holdersIndex]] = args[argsIndex++];
65468     }
65469   }
65470   return result;
65471 }
65472
65473 /**
65474  * Gets the number of `placeholder` occurrences in `array`.
65475  *
65476  * @private
65477  * @param {Array} array The array to inspect.
65478  * @param {*} placeholder The placeholder to search for.
65479  * @returns {number} Returns the placeholder count.
65480  */
65481 function countHolders(array, placeholder) {
65482   var length = array.length,
65483       result = 0;
65484
65485   while (length--) {
65486     if (array[length] === placeholder) {
65487       ++result;
65488     }
65489   }
65490   return result;
65491 }
65492
65493 /**
65494  * The function whose prototype chain sequence wrappers inherit from.
65495  *
65496  * @private
65497  */
65498 function baseLodash() {
65499   // No operation performed.
65500 }
65501
65502 /** Used as references for the maximum length and index of an array. */
65503 var MAX_ARRAY_LENGTH = 4294967295;
65504
65505 /**
65506  * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
65507  *
65508  * @private
65509  * @constructor
65510  * @param {*} value The value to wrap.
65511  */
65512 function LazyWrapper(value) {
65513   this.__wrapped__ = value;
65514   this.__actions__ = [];
65515   this.__dir__ = 1;
65516   this.__filtered__ = false;
65517   this.__iteratees__ = [];
65518   this.__takeCount__ = MAX_ARRAY_LENGTH;
65519   this.__views__ = [];
65520 }
65521
65522 // Ensure `LazyWrapper` is an instance of `baseLodash`.
65523 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
65524 LazyWrapper.prototype.constructor = LazyWrapper;
65525
65526 /**
65527  * Gets metadata for `func`.
65528  *
65529  * @private
65530  * @param {Function} func The function to query.
65531  * @returns {*} Returns the metadata for `func`.
65532  */
65533 var getData = !metaMap ? noop$3 : function(func) {
65534   return metaMap.get(func);
65535 };
65536
65537 /** Used to lookup unminified function names. */
65538 var realNames = {};
65539
65540 /** Used for built-in method references. */
65541 var objectProto$19 = Object.prototype;
65542
65543 /** Used to check objects for own properties. */
65544 var hasOwnProperty$17 = objectProto$19.hasOwnProperty;
65545
65546 /**
65547  * Gets the name of `func`.
65548  *
65549  * @private
65550  * @param {Function} func The function to query.
65551  * @returns {string} Returns the function name.
65552  */
65553 function getFuncName(func) {
65554   var result = (func.name + ''),
65555       array = realNames[result],
65556       length = hasOwnProperty$17.call(realNames, result) ? array.length : 0;
65557
65558   while (length--) {
65559     var data = array[length],
65560         otherFunc = data.func;
65561     if (otherFunc == null || otherFunc == func) {
65562       return data.name;
65563     }
65564   }
65565   return result;
65566 }
65567
65568 /**
65569  * The base constructor for creating `lodash` wrapper objects.
65570  *
65571  * @private
65572  * @param {*} value The value to wrap.
65573  * @param {boolean} [chainAll] Enable explicit method chain sequences.
65574  */
65575 function LodashWrapper(value, chainAll) {
65576   this.__wrapped__ = value;
65577   this.__actions__ = [];
65578   this.__chain__ = !!chainAll;
65579   this.__index__ = 0;
65580   this.__values__ = undefined;
65581 }
65582
65583 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
65584 LodashWrapper.prototype.constructor = LodashWrapper;
65585
65586 /**
65587  * Creates a clone of `wrapper`.
65588  *
65589  * @private
65590  * @param {Object} wrapper The wrapper to clone.
65591  * @returns {Object} Returns the cloned wrapper.
65592  */
65593 function wrapperClone(wrapper) {
65594   if (wrapper instanceof LazyWrapper) {
65595     return wrapper.clone();
65596   }
65597   var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
65598   result.__actions__ = copyArray(wrapper.__actions__);
65599   result.__index__  = wrapper.__index__;
65600   result.__values__ = wrapper.__values__;
65601   return result;
65602 }
65603
65604 /** Used for built-in method references. */
65605 var objectProto$20 = Object.prototype;
65606
65607 /** Used to check objects for own properties. */
65608 var hasOwnProperty$18 = objectProto$20.hasOwnProperty;
65609
65610 /**
65611  * Creates a `lodash` object which wraps `value` to enable implicit method
65612  * chain sequences. Methods that operate on and return arrays, collections,
65613  * and functions can be chained together. Methods that retrieve a single value
65614  * or may return a primitive value will automatically end the chain sequence
65615  * and return the unwrapped value. Otherwise, the value must be unwrapped
65616  * with `_#value`.
65617  *
65618  * Explicit chain sequences, which must be unwrapped with `_#value`, may be
65619  * enabled using `_.chain`.
65620  *
65621  * The execution of chained methods is lazy, that is, it's deferred until
65622  * `_#value` is implicitly or explicitly called.
65623  *
65624  * Lazy evaluation allows several methods to support shortcut fusion.
65625  * Shortcut fusion is an optimization to merge iteratee calls; this avoids
65626  * the creation of intermediate arrays and can greatly reduce the number of
65627  * iteratee executions. Sections of a chain sequence qualify for shortcut
65628  * fusion if the section is applied to an array and iteratees accept only
65629  * one argument. The heuristic for whether a section qualifies for shortcut
65630  * fusion is subject to change.
65631  *
65632  * Chaining is supported in custom builds as long as the `_#value` method is
65633  * directly or indirectly included in the build.
65634  *
65635  * In addition to lodash methods, wrappers have `Array` and `String` methods.
65636  *
65637  * The wrapper `Array` methods are:
65638  * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
65639  *
65640  * The wrapper `String` methods are:
65641  * `replace` and `split`
65642  *
65643  * The wrapper methods that support shortcut fusion are:
65644  * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
65645  * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
65646  * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
65647  *
65648  * The chainable wrapper methods are:
65649  * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
65650  * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
65651  * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
65652  * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
65653  * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
65654  * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
65655  * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
65656  * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
65657  * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
65658  * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
65659  * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
65660  * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
65661  * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
65662  * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
65663  * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
65664  * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
65665  * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
65666  * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
65667  * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
65668  * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
65669  * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
65670  * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
65671  * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
65672  * `zipObject`, `zipObjectDeep`, and `zipWith`
65673  *
65674  * The wrapper methods that are **not** chainable by default are:
65675  * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
65676  * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
65677  * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
65678  * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
65679  * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
65680  * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
65681  * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
65682  * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
65683  * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
65684  * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
65685  * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
65686  * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
65687  * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
65688  * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
65689  * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
65690  * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
65691  * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
65692  * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
65693  * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
65694  * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
65695  * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
65696  * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
65697  * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
65698  * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
65699  * `upperFirst`, `value`, and `words`
65700  *
65701  * @name _
65702  * @constructor
65703  * @category Seq
65704  * @param {*} value The value to wrap in a `lodash` instance.
65705  * @returns {Object} Returns the new `lodash` wrapper instance.
65706  * @example
65707  *
65708  * function square(n) {
65709  *   return n * n;
65710  * }
65711  *
65712  * var wrapped = _([1, 2, 3]);
65713  *
65714  * // Returns an unwrapped value.
65715  * wrapped.reduce(_.add);
65716  * // => 6
65717  *
65718  * // Returns a wrapped value.
65719  * var squares = wrapped.map(square);
65720  *
65721  * _.isArray(squares);
65722  * // => false
65723  *
65724  * _.isArray(squares.value());
65725  * // => true
65726  */
65727 function lodash(value) {
65728   if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
65729     if (value instanceof LodashWrapper) {
65730       return value;
65731     }
65732     if (hasOwnProperty$18.call(value, '__wrapped__')) {
65733       return wrapperClone(value);
65734     }
65735   }
65736   return new LodashWrapper(value);
65737 }
65738
65739 // Ensure wrappers are instances of `baseLodash`.
65740 lodash.prototype = baseLodash.prototype;
65741 lodash.prototype.constructor = lodash;
65742
65743 /**
65744  * Checks if `func` has a lazy counterpart.
65745  *
65746  * @private
65747  * @param {Function} func The function to check.
65748  * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
65749  *  else `false`.
65750  */
65751 function isLaziable(func) {
65752   var funcName = getFuncName(func),
65753       other = lodash[funcName];
65754
65755   if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
65756     return false;
65757   }
65758   if (func === other) {
65759     return true;
65760   }
65761   var data = getData(other);
65762   return !!data && func === data[0];
65763 }
65764
65765 /**
65766  * Sets metadata for `func`.
65767  *
65768  * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
65769  * period of time, it will trip its breaker and transition to an identity
65770  * function to avoid garbage collection pauses in V8. See
65771  * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
65772  * for more details.
65773  *
65774  * @private
65775  * @param {Function} func The function to associate metadata with.
65776  * @param {*} data The metadata.
65777  * @returns {Function} Returns `func`.
65778  */
65779 var setData = shortOut(baseSetData);
65780
65781 /** Used to match wrap detail comments. */
65782 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/;
65783 var reSplitDetails = /,? & /;
65784
65785 /**
65786  * Extracts wrapper details from the `source` body comment.
65787  *
65788  * @private
65789  * @param {string} source The source to inspect.
65790  * @returns {Array} Returns the wrapper details.
65791  */
65792 function getWrapDetails(source) {
65793   var match = source.match(reWrapDetails);
65794   return match ? match[1].split(reSplitDetails) : [];
65795 }
65796
65797 /** Used to match wrap detail comments. */
65798 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
65799
65800 /**
65801  * Inserts wrapper `details` in a comment at the top of the `source` body.
65802  *
65803  * @private
65804  * @param {string} source The source to modify.
65805  * @returns {Array} details The details to insert.
65806  * @returns {string} Returns the modified source.
65807  */
65808 function insertWrapDetails(source, details) {
65809   var length = details.length;
65810   if (!length) {
65811     return source;
65812   }
65813   var lastIndex = length - 1;
65814   details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
65815   details = details.join(length > 2 ? ', ' : ' ');
65816   return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
65817 }
65818
65819 /** Used to compose bitmasks for function metadata. */
65820 var WRAP_BIND_FLAG$5 = 1;
65821 var WRAP_BIND_KEY_FLAG$3 = 2;
65822 var WRAP_CURRY_FLAG$3 = 8;
65823 var WRAP_CURRY_RIGHT_FLAG$2 = 16;
65824 var WRAP_PARTIAL_FLAG$3 = 32;
65825 var WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
65826 var WRAP_ARY_FLAG$1 = 128;
65827 var WRAP_REARG_FLAG = 256;
65828 var WRAP_FLIP_FLAG$1 = 512;
65829
65830 /** Used to associate wrap methods with their bit flags. */
65831 var wrapFlags = [
65832   ['ary', WRAP_ARY_FLAG$1],
65833   ['bind', WRAP_BIND_FLAG$5],
65834   ['bindKey', WRAP_BIND_KEY_FLAG$3],
65835   ['curry', WRAP_CURRY_FLAG$3],
65836   ['curryRight', WRAP_CURRY_RIGHT_FLAG$2],
65837   ['flip', WRAP_FLIP_FLAG$1],
65838   ['partial', WRAP_PARTIAL_FLAG$3],
65839   ['partialRight', WRAP_PARTIAL_RIGHT_FLAG$2],
65840   ['rearg', WRAP_REARG_FLAG]
65841 ];
65842
65843 /**
65844  * Updates wrapper `details` based on `bitmask` flags.
65845  *
65846  * @private
65847  * @returns {Array} details The details to modify.
65848  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65849  * @returns {Array} Returns `details`.
65850  */
65851 function updateWrapDetails(details, bitmask) {
65852   arrayEach(wrapFlags, function(pair) {
65853     var value = '_.' + pair[0];
65854     if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
65855       details.push(value);
65856     }
65857   });
65858   return details.sort();
65859 }
65860
65861 /**
65862  * Sets the `toString` method of `wrapper` to mimic the source of `reference`
65863  * with wrapper details in a comment at the top of the source body.
65864  *
65865  * @private
65866  * @param {Function} wrapper The function to modify.
65867  * @param {Function} reference The reference function.
65868  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65869  * @returns {Function} Returns `wrapper`.
65870  */
65871 function setWrapToString(wrapper, reference, bitmask) {
65872   var source = (reference + '');
65873   return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
65874 }
65875
65876 /** Used to compose bitmasks for function metadata. */
65877 var WRAP_BIND_FLAG$4 = 1;
65878 var WRAP_BIND_KEY_FLAG$2 = 2;
65879 var WRAP_CURRY_BOUND_FLAG = 4;
65880 var WRAP_CURRY_FLAG$2 = 8;
65881 var WRAP_PARTIAL_FLAG$2 = 32;
65882 var WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
65883
65884 /**
65885  * Creates a function that wraps `func` to continue currying.
65886  *
65887  * @private
65888  * @param {Function} func The function to wrap.
65889  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
65890  * @param {Function} wrapFunc The function to create the `func` wrapper.
65891  * @param {*} placeholder The placeholder value.
65892  * @param {*} [thisArg] The `this` binding of `func`.
65893  * @param {Array} [partials] The arguments to prepend to those provided to
65894  *  the new function.
65895  * @param {Array} [holders] The `partials` placeholder indexes.
65896  * @param {Array} [argPos] The argument positions of the new function.
65897  * @param {number} [ary] The arity cap of `func`.
65898  * @param {number} [arity] The arity of `func`.
65899  * @returns {Function} Returns the new wrapped function.
65900  */
65901 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
65902   var isCurry = bitmask & WRAP_CURRY_FLAG$2,
65903       newHolders = isCurry ? holders : undefined,
65904       newHoldersRight = isCurry ? undefined : holders,
65905       newPartials = isCurry ? partials : undefined,
65906       newPartialsRight = isCurry ? undefined : partials;
65907
65908   bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$2 : WRAP_PARTIAL_RIGHT_FLAG$1);
65909   bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$2);
65910
65911   if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
65912     bitmask &= ~(WRAP_BIND_FLAG$4 | WRAP_BIND_KEY_FLAG$2);
65913   }
65914   var newData = [
65915     func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
65916     newHoldersRight, argPos, ary, arity
65917   ];
65918
65919   var result = wrapFunc.apply(undefined, newData);
65920   if (isLaziable(func)) {
65921     setData(result, newData);
65922   }
65923   result.placeholder = placeholder;
65924   return setWrapToString(result, func, bitmask);
65925 }
65926
65927 /**
65928  * Gets the argument placeholder value for `func`.
65929  *
65930  * @private
65931  * @param {Function} func The function to inspect.
65932  * @returns {*} Returns the placeholder value.
65933  */
65934 function getHolder(func) {
65935   var object = func;
65936   return object.placeholder;
65937 }
65938
65939 /* Built-in method references for those with the same name as other `lodash` methods. */
65940 var nativeMin$2 = Math.min;
65941
65942 /**
65943  * Reorder `array` according to the specified indexes where the element at
65944  * the first index is assigned as the first element, the element at
65945  * the second index is assigned as the second element, and so on.
65946  *
65947  * @private
65948  * @param {Array} array The array to reorder.
65949  * @param {Array} indexes The arranged array indexes.
65950  * @returns {Array} Returns `array`.
65951  */
65952 function reorder(array, indexes) {
65953   var arrLength = array.length,
65954       length = nativeMin$2(indexes.length, arrLength),
65955       oldArray = copyArray(array);
65956
65957   while (length--) {
65958     var index = indexes[length];
65959     array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
65960   }
65961   return array;
65962 }
65963
65964 /** Used as the internal argument placeholder. */
65965 var PLACEHOLDER = '__lodash_placeholder__';
65966
65967 /**
65968  * Replaces all `placeholder` elements in `array` with an internal placeholder
65969  * and returns an array of their indexes.
65970  *
65971  * @private
65972  * @param {Array} array The array to modify.
65973  * @param {*} placeholder The placeholder to replace.
65974  * @returns {Array} Returns the new array of placeholder indexes.
65975  */
65976 function replaceHolders(array, placeholder) {
65977   var index = -1,
65978       length = array.length,
65979       resIndex = 0,
65980       result = [];
65981
65982   while (++index < length) {
65983     var value = array[index];
65984     if (value === placeholder || value === PLACEHOLDER) {
65985       array[index] = PLACEHOLDER;
65986       result[resIndex++] = index;
65987     }
65988   }
65989   return result;
65990 }
65991
65992 /** Used to compose bitmasks for function metadata. */
65993 var WRAP_BIND_FLAG$3 = 1;
65994 var WRAP_BIND_KEY_FLAG$1 = 2;
65995 var WRAP_CURRY_FLAG$1 = 8;
65996 var WRAP_CURRY_RIGHT_FLAG$1 = 16;
65997 var WRAP_ARY_FLAG = 128;
65998 var WRAP_FLIP_FLAG = 512;
65999
66000 /**
66001  * Creates a function that wraps `func` to invoke it with optional `this`
66002  * binding of `thisArg`, partial application, and currying.
66003  *
66004  * @private
66005  * @param {Function|string} func The function or method name to wrap.
66006  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66007  * @param {*} [thisArg] The `this` binding of `func`.
66008  * @param {Array} [partials] The arguments to prepend to those provided to
66009  *  the new function.
66010  * @param {Array} [holders] The `partials` placeholder indexes.
66011  * @param {Array} [partialsRight] The arguments to append to those provided
66012  *  to the new function.
66013  * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
66014  * @param {Array} [argPos] The argument positions of the new function.
66015  * @param {number} [ary] The arity cap of `func`.
66016  * @param {number} [arity] The arity of `func`.
66017  * @returns {Function} Returns the new wrapped function.
66018  */
66019 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
66020   var isAry = bitmask & WRAP_ARY_FLAG,
66021       isBind = bitmask & WRAP_BIND_FLAG$3,
66022       isBindKey = bitmask & WRAP_BIND_KEY_FLAG$1,
66023       isCurried = bitmask & (WRAP_CURRY_FLAG$1 | WRAP_CURRY_RIGHT_FLAG$1),
66024       isFlip = bitmask & WRAP_FLIP_FLAG,
66025       Ctor = isBindKey ? undefined : createCtor(func);
66026
66027   function wrapper() {
66028     var length = arguments.length,
66029         args = Array(length),
66030         index = length;
66031
66032     while (index--) {
66033       args[index] = arguments[index];
66034     }
66035     if (isCurried) {
66036       var placeholder = getHolder(wrapper),
66037           holdersCount = countHolders(args, placeholder);
66038     }
66039     if (partials) {
66040       args = composeArgs(args, partials, holders, isCurried);
66041     }
66042     if (partialsRight) {
66043       args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
66044     }
66045     length -= holdersCount;
66046     if (isCurried && length < arity) {
66047       var newHolders = replaceHolders(args, placeholder);
66048       return createRecurry(
66049         func, bitmask, createHybrid, wrapper.placeholder, thisArg,
66050         args, newHolders, argPos, ary, arity - length
66051       );
66052     }
66053     var thisBinding = isBind ? thisArg : this,
66054         fn = isBindKey ? thisBinding[func] : func;
66055
66056     length = args.length;
66057     if (argPos) {
66058       args = reorder(args, argPos);
66059     } else if (isFlip && length > 1) {
66060       args.reverse();
66061     }
66062     if (isAry && ary < length) {
66063       args.length = ary;
66064     }
66065     if (this && this !== root$2 && this instanceof wrapper) {
66066       fn = Ctor || createCtor(fn);
66067     }
66068     return fn.apply(thisBinding, args);
66069   }
66070   return wrapper;
66071 }
66072
66073 /**
66074  * Creates a function that wraps `func` to enable currying.
66075  *
66076  * @private
66077  * @param {Function} func The function to wrap.
66078  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66079  * @param {number} arity The arity of `func`.
66080  * @returns {Function} Returns the new wrapped function.
66081  */
66082 function createCurry(func, bitmask, arity) {
66083   var Ctor = createCtor(func);
66084
66085   function wrapper() {
66086     var length = arguments.length,
66087         args = Array(length),
66088         index = length,
66089         placeholder = getHolder(wrapper);
66090
66091     while (index--) {
66092       args[index] = arguments[index];
66093     }
66094     var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
66095       ? []
66096       : replaceHolders(args, placeholder);
66097
66098     length -= holders.length;
66099     if (length < arity) {
66100       return createRecurry(
66101         func, bitmask, createHybrid, wrapper.placeholder, undefined,
66102         args, holders, undefined, undefined, arity - length);
66103     }
66104     var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
66105     return apply(fn, this, args);
66106   }
66107   return wrapper;
66108 }
66109
66110 /** Used to compose bitmasks for function metadata. */
66111 var WRAP_BIND_FLAG$6 = 1;
66112
66113 /**
66114  * Creates a function that wraps `func` to invoke it with the `this` binding
66115  * of `thisArg` and `partials` prepended to the arguments it receives.
66116  *
66117  * @private
66118  * @param {Function} func The function to wrap.
66119  * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
66120  * @param {*} thisArg The `this` binding of `func`.
66121  * @param {Array} partials The arguments to prepend to those provided to
66122  *  the new function.
66123  * @returns {Function} Returns the new wrapped function.
66124  */
66125 function createPartial(func, bitmask, thisArg, partials) {
66126   var isBind = bitmask & WRAP_BIND_FLAG$6,
66127       Ctor = createCtor(func);
66128
66129   function wrapper() {
66130     var argsIndex = -1,
66131         argsLength = arguments.length,
66132         leftIndex = -1,
66133         leftLength = partials.length,
66134         args = Array(leftLength + argsLength),
66135         fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
66136
66137     while (++leftIndex < leftLength) {
66138       args[leftIndex] = partials[leftIndex];
66139     }
66140     while (argsLength--) {
66141       args[leftIndex++] = arguments[++argsIndex];
66142     }
66143     return apply(fn, isBind ? thisArg : this, args);
66144   }
66145   return wrapper;
66146 }
66147
66148 /** Used as the internal argument placeholder. */
66149 var PLACEHOLDER$1 = '__lodash_placeholder__';
66150
66151 /** Used to compose bitmasks for function metadata. */
66152 var WRAP_BIND_FLAG$7 = 1;
66153 var WRAP_BIND_KEY_FLAG$4 = 2;
66154 var WRAP_CURRY_BOUND_FLAG$1 = 4;
66155 var WRAP_CURRY_FLAG$4 = 8;
66156 var WRAP_ARY_FLAG$2 = 128;
66157 var WRAP_REARG_FLAG$1 = 256;
66158
66159 /* Built-in method references for those with the same name as other `lodash` methods. */
66160 var nativeMin$3 = Math.min;
66161
66162 /**
66163  * Merges the function metadata of `source` into `data`.
66164  *
66165  * Merging metadata reduces the number of wrappers used to invoke a function.
66166  * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
66167  * may be applied regardless of execution order. Methods like `_.ary` and
66168  * `_.rearg` modify function arguments, making the order in which they are
66169  * executed important, preventing the merging of metadata. However, we make
66170  * an exception for a safe combined case where curried functions have `_.ary`
66171  * and or `_.rearg` applied.
66172  *
66173  * @private
66174  * @param {Array} data The destination metadata.
66175  * @param {Array} source The source metadata.
66176  * @returns {Array} Returns `data`.
66177  */
66178 function mergeData(data, source) {
66179   var bitmask = data[1],
66180       srcBitmask = source[1],
66181       newBitmask = bitmask | srcBitmask,
66182       isCommon = newBitmask < (WRAP_BIND_FLAG$7 | WRAP_BIND_KEY_FLAG$4 | WRAP_ARY_FLAG$2);
66183
66184   var isCombo =
66185     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$4)) ||
66186     ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
66187     ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$4));
66188
66189   // Exit early if metadata can't be merged.
66190   if (!(isCommon || isCombo)) {
66191     return data;
66192   }
66193   // Use source `thisArg` if available.
66194   if (srcBitmask & WRAP_BIND_FLAG$7) {
66195     data[2] = source[2];
66196     // Set when currying a bound function.
66197     newBitmask |= bitmask & WRAP_BIND_FLAG$7 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
66198   }
66199   // Compose partial arguments.
66200   var value = source[3];
66201   if (value) {
66202     var partials = data[3];
66203     data[3] = partials ? composeArgs(partials, value, source[4]) : value;
66204     data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
66205   }
66206   // Compose partial right arguments.
66207   value = source[5];
66208   if (value) {
66209     partials = data[5];
66210     data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
66211     data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
66212   }
66213   // Use source `argPos` if available.
66214   value = source[7];
66215   if (value) {
66216     data[7] = value;
66217   }
66218   // Use source `ary` if it's smaller.
66219   if (srcBitmask & WRAP_ARY_FLAG$2) {
66220     data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
66221   }
66222   // Use source `arity` if one is not provided.
66223   if (data[9] == null) {
66224     data[9] = source[9];
66225   }
66226   // Use source `func` and merge bitmasks.
66227   data[0] = source[0];
66228   data[1] = newBitmask;
66229
66230   return data;
66231 }
66232
66233 /** Error message constants. */
66234 var FUNC_ERROR_TEXT$4 = 'Expected a function';
66235
66236 /** Used to compose bitmasks for function metadata. */
66237 var WRAP_BIND_FLAG$1 = 1;
66238 var WRAP_BIND_KEY_FLAG = 2;
66239 var WRAP_CURRY_FLAG = 8;
66240 var WRAP_CURRY_RIGHT_FLAG = 16;
66241 var WRAP_PARTIAL_FLAG$1 = 32;
66242 var WRAP_PARTIAL_RIGHT_FLAG = 64;
66243
66244 /* Built-in method references for those with the same name as other `lodash` methods. */
66245 var nativeMax$5 = Math.max;
66246
66247 /**
66248  * Creates a function that either curries or invokes `func` with optional
66249  * `this` binding and partially applied arguments.
66250  *
66251  * @private
66252  * @param {Function|string} func The function or method name to wrap.
66253  * @param {number} bitmask The bitmask flags.
66254  *    1 - `_.bind`
66255  *    2 - `_.bindKey`
66256  *    4 - `_.curry` or `_.curryRight` of a bound function
66257  *    8 - `_.curry`
66258  *   16 - `_.curryRight`
66259  *   32 - `_.partial`
66260  *   64 - `_.partialRight`
66261  *  128 - `_.rearg`
66262  *  256 - `_.ary`
66263  *  512 - `_.flip`
66264  * @param {*} [thisArg] The `this` binding of `func`.
66265  * @param {Array} [partials] The arguments to be partially applied.
66266  * @param {Array} [holders] The `partials` placeholder indexes.
66267  * @param {Array} [argPos] The argument positions of the new function.
66268  * @param {number} [ary] The arity cap of `func`.
66269  * @param {number} [arity] The arity of `func`.
66270  * @returns {Function} Returns the new wrapped function.
66271  */
66272 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
66273   var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
66274   if (!isBindKey && typeof func != 'function') {
66275     throw new TypeError(FUNC_ERROR_TEXT$4);
66276   }
66277   var length = partials ? partials.length : 0;
66278   if (!length) {
66279     bitmask &= ~(WRAP_PARTIAL_FLAG$1 | WRAP_PARTIAL_RIGHT_FLAG);
66280     partials = holders = undefined;
66281   }
66282   ary = ary === undefined ? ary : nativeMax$5(toInteger(ary), 0);
66283   arity = arity === undefined ? arity : toInteger(arity);
66284   length -= holders ? holders.length : 0;
66285
66286   if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
66287     var partialsRight = partials,
66288         holdersRight = holders;
66289
66290     partials = holders = undefined;
66291   }
66292   var data = isBindKey ? undefined : getData(func);
66293
66294   var newData = [
66295     func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
66296     argPos, ary, arity
66297   ];
66298
66299   if (data) {
66300     mergeData(newData, data);
66301   }
66302   func = newData[0];
66303   bitmask = newData[1];
66304   thisArg = newData[2];
66305   partials = newData[3];
66306   holders = newData[4];
66307   arity = newData[9] = newData[9] === undefined
66308     ? (isBindKey ? 0 : func.length)
66309     : nativeMax$5(newData[9] - length, 0);
66310
66311   if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
66312     bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
66313   }
66314   if (!bitmask || bitmask == WRAP_BIND_FLAG$1) {
66315     var result = createBind(func, bitmask, thisArg);
66316   } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
66317     result = createCurry(func, bitmask, arity);
66318   } else if ((bitmask == WRAP_PARTIAL_FLAG$1 || bitmask == (WRAP_BIND_FLAG$1 | WRAP_PARTIAL_FLAG$1)) && !holders.length) {
66319     result = createPartial(func, bitmask, thisArg, partials);
66320   } else {
66321     result = createHybrid.apply(undefined, newData);
66322   }
66323   var setter = data ? baseSetData : setData;
66324   return setWrapToString(setter(result, newData), func, bitmask);
66325 }
66326
66327 /** Used to compose bitmasks for function metadata. */
66328 var WRAP_BIND_FLAG = 1;
66329 var WRAP_PARTIAL_FLAG = 32;
66330
66331 /**
66332  * Creates a function that invokes `func` with the `this` binding of `thisArg`
66333  * and `partials` prepended to the arguments it receives.
66334  *
66335  * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
66336  * may be used as a placeholder for partially applied arguments.
66337  *
66338  * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
66339  * property of bound functions.
66340  *
66341  * @static
66342  * @memberOf _
66343  * @since 0.1.0
66344  * @category Function
66345  * @param {Function} func The function to bind.
66346  * @param {*} thisArg The `this` binding of `func`.
66347  * @param {...*} [partials] The arguments to be partially applied.
66348  * @returns {Function} Returns the new bound function.
66349  * @example
66350  *
66351  * function greet(greeting, punctuation) {
66352  *   return greeting + ' ' + this.user + punctuation;
66353  * }
66354  *
66355  * var object = { 'user': 'fred' };
66356  *
66357  * var bound = _.bind(greet, object, 'hi');
66358  * bound('!');
66359  * // => 'hi fred!'
66360  *
66361  * // Bound with placeholders.
66362  * var bound = _.bind(greet, object, _, '!');
66363  * bound('hi');
66364  * // => 'hi fred!'
66365  */
66366 var bind$2 = baseRest(function(func, thisArg, partials) {
66367   var bitmask = WRAP_BIND_FLAG;
66368   if (partials.length) {
66369     var holders = replaceHolders(partials, getHolder(bind$2));
66370     bitmask |= WRAP_PARTIAL_FLAG;
66371   }
66372   return createWrap(func, bitmask, thisArg, partials, holders);
66373 });
66374
66375 // Assign default placeholders.
66376 bind$2.placeholder = {};
66377
66378 function presetCollection(collection) {
66379     var maxSearchResults = 50,
66380         maxSuggestionResults = 10;
66381
66382     var presets = {
66383
66384         collection: collection,
66385
66386
66387         item: function(id) {
66388             return find$1(this.collection, function(d) {
66389                 return d.id === id;
66390             });
66391         },
66392
66393
66394         matchGeometry: function(geometry) {
66395             return presetCollection(this.collection.filter(function(d) {
66396                 return d.matchGeometry(geometry);
66397             }));
66398         },
66399
66400
66401         search: function(value, geometry) {
66402             if (!value) return this;
66403
66404             function leading(a) {
66405                 var index = a.indexOf(value);
66406                 return index === 0 || a[index - 1] === ' ';
66407             }
66408
66409             function suggestionName(name) {
66410                 var nameArray = name.split(' - ');
66411                 if (nameArray.length > 1) {
66412                     name = nameArray.slice(0, nameArray.length - 1).join(' - ');
66413                 }
66414                 return name.toLowerCase();
66415             }
66416
66417
66418             value = value.toLowerCase();
66419
66420             var searchable = filter(this.collection, function(a) {
66421                     return a.searchable !== false && a.suggestion !== true;
66422                 }),
66423                 suggestions = filter(this.collection, function(a) {
66424                     return a.suggestion === true;
66425                 });
66426
66427
66428             // matches value to preset.name
66429             var leading_name = filter(searchable, function(a) {
66430                     return leading(a.name().toLowerCase());
66431                 }).sort(function(a, b) {
66432                     var aCompare = a.name().toLowerCase(),
66433                         bCompare = b.name().toLowerCase(),
66434                         i;
66435
66436                     // priority if search string matches preset name exactly - #4325
66437                     if (value === aCompare) return -1;
66438                     if (value === bCompare) return 1;
66439
66440                     // priority for higher matchScore
66441                     i = b.originalScore - a.originalScore;
66442                     if (i !== 0) return i;
66443
66444                     // priority if search string appears earlier in preset name
66445                     i = aCompare.indexOf(value) - bCompare.indexOf(value);
66446                     if (i !== 0) return i;
66447
66448                     // priority for shorter preset names
66449                     return a.name().length - b.name().length;
66450                 });
66451
66452             // matches value to preset.terms values
66453             var leading_terms = filter(searchable, function(a) {
66454                     return some(a.terms() || [], leading);
66455                 });
66456
66457             // matches value to preset.tags values
66458             var leading_tag_values = filter(searchable, function(a) {
66459                     return some(without(values$1(a.tags || {}), '*'), leading);
66460                 });
66461
66462
66463             // finds close matches to value in preset.name
66464             var similar_name = searchable.map(function(a) {
66465                     return {
66466                         preset: a,
66467                         dist: utilEditDistance(value, a.name())
66468                     };
66469                 }).filter(function(a) {
66470                     return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
66471                 }).sort(function(a, b) {
66472                     return a.dist - b.dist;
66473                 }).map(function(a) {
66474                     return a.preset;
66475                 });
66476
66477             // finds close matches to value in preset.terms
66478             var similar_terms = filter(searchable, function(a) {
66479                     return some(a.terms() || [], function(b) {
66480                         return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
66481                     });
66482                 });
66483
66484             var leading_suggestions = filter(suggestions, function(a) {
66485                     return leading(suggestionName(a.name()));
66486                 }).sort(function(a, b) {
66487                     a = suggestionName(a.name());
66488                     b = suggestionName(b.name());
66489                     var i = a.indexOf(value) - b.indexOf(value);
66490                     if (i === 0) return a.length - b.length;
66491                     else return i;
66492                 });
66493
66494             var similar_suggestions = suggestions.map(function(a) {
66495                     return {
66496                         preset: a,
66497                         dist: utilEditDistance(value, suggestionName(a.name()))
66498                     };
66499                 }).filter(function(a) {
66500                     return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
66501                 }).sort(function(a, b) {
66502                     return a.dist - b.dist;
66503                 }).map(function(a) {
66504                     return a.preset;
66505                 });
66506
66507             var other = presets.item(geometry);
66508
66509             var results = leading_name.concat(
66510                     leading_terms,
66511                     leading_tag_values,
66512                     leading_suggestions.slice(0, maxSuggestionResults + 5),
66513                     similar_name,
66514                     similar_terms,
66515                     similar_suggestions.slice(0, maxSuggestionResults)
66516                 ).slice(0, maxSearchResults - 1);
66517
66518             return presetCollection(uniq(results.concat(other)));
66519         }
66520     };
66521
66522
66523     return presets;
66524 }
66525
66526 function presetCategory(id, category, all) {
66527     category = clone(category);
66528
66529     category.id = id;
66530
66531
66532     category.members = presetCollection(category.members.map(function(id) {
66533         return all.item(id);
66534     }));
66535
66536
66537     category.matchGeometry = function(geometry) {
66538         return category.geometry.indexOf(geometry) >= 0;
66539     };
66540
66541
66542     category.matchScore = function() {
66543         return -1;
66544     };
66545
66546
66547     category.name = function() {
66548         return t('presets.categories.' + id + '.name', {'default': id});
66549     };
66550
66551
66552     category.terms = function() {
66553         return [];
66554     };
66555
66556
66557     return category;
66558 }
66559
66560 function presetField(id, field) {
66561     field = clone(field);
66562
66563     field.id = id;
66564
66565
66566     field.matchGeometry = function(geometry) {
66567         return !field.geometry || field.geometry === geometry;
66568     };
66569
66570
66571     field.t = function(scope, options) {
66572         return t('presets.fields.' + id + '.' + scope, options);
66573     };
66574
66575
66576     field.label = function() {
66577         return field.t('label', {'default': id});
66578     };
66579
66580
66581     var placeholder = field.placeholder;
66582     field.placeholder = function() {
66583         return field.t('placeholder', {'default': placeholder});
66584     };
66585
66586
66587     return field;
66588 }
66589
66590 function presetPreset(id, preset, fields) {
66591     preset = clone(preset);
66592
66593     preset.id = id;
66594     preset.fields = (preset.fields || []).map(getFields);
66595     preset.geometry = (preset.geometry || []);
66596
66597
66598     function getFields(f) {
66599         return fields[f];
66600     }
66601
66602
66603     preset.matchGeometry = function(geometry) {
66604         return preset.geometry.indexOf(geometry) >= 0;
66605     };
66606
66607
66608     preset.originalScore = preset.matchScore || 1;
66609
66610
66611     preset.matchScore = function(entity) {
66612         var tags = preset.tags,
66613             score = 0;
66614
66615         for (var t$$1 in tags) {
66616             if (entity.tags[t$$1] === tags[t$$1]) {
66617                 score += preset.originalScore;
66618             } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
66619                 score += preset.originalScore / 2;
66620             } else {
66621                 return -1;
66622             }
66623         }
66624
66625         return score;
66626     };
66627
66628
66629     preset.t = function(scope, options) {
66630         return t('presets.presets.' + id + '.' + scope, options);
66631     };
66632
66633
66634     var origName = preset.name || '';
66635     preset.name = function() {
66636         if (preset.suggestion) {
66637             id = id.split('/');
66638             id = id[0] + '/' + id[1];
66639             return origName + ' - ' + t('presets.presets.' + id + '.name');
66640         }
66641         return preset.t('name', { 'default': origName });
66642     };
66643
66644     var origTerms = (preset.terms || []).join();
66645     preset.terms = function() {
66646         return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
66647     };
66648
66649
66650     preset.isFallback = function() {
66651         var tagCount = Object.keys(preset.tags).length;
66652         return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
66653     };
66654
66655
66656     var reference = preset.reference || {};
66657     preset.reference = function(geometry) {
66658         var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
66659             value = reference.value || preset.tags[key];
66660
66661         if (geometry === 'relation' && key === 'type') {
66662             if (value in preset.tags) {
66663                 key = value;
66664                 value = preset.tags[key];
66665             } else {
66666                 return { rtype: value };
66667             }
66668         }
66669
66670         if (value === '*') {
66671             return { key: key };
66672         } else {
66673             return { key: key, value: value };
66674         }
66675     };
66676
66677
66678     var removeTags = preset.removeTags || preset.tags;
66679     preset.removeTags = function(tags, geometry) {
66680         tags = omit(tags, keys$1(removeTags));
66681
66682         for (var f in preset.fields) {
66683             var field = preset.fields[f];
66684             if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
66685                 delete tags[field.key];
66686             }
66687         }
66688
66689         delete tags.area;
66690         return tags;
66691     };
66692
66693
66694     var applyTags = preset.addTags || preset.tags;
66695     preset.applyTags = function(tags, geometry) {
66696         var k;
66697
66698         tags = clone(tags);
66699
66700         for (k in applyTags) {
66701             if (applyTags[k] === '*') {
66702                 tags[k] = 'yes';
66703             } else {
66704                 tags[k] = applyTags[k];
66705             }
66706         }
66707
66708         // Add area=yes if necessary.
66709         // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
66710         // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
66711         // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
66712         delete tags.area;
66713         if (geometry === 'area') {
66714             var needsAreaTag = true;
66715             if (preset.geometry.indexOf('line') === -1) {
66716                 for (k in applyTags) {
66717                     if (k in areaKeys) {
66718                         needsAreaTag = false;
66719                         break;
66720                     }
66721                 }
66722             }
66723             if (needsAreaTag) {
66724                 tags.area = 'yes';
66725             }
66726         }
66727
66728         for (var f in preset.fields) {
66729             var field = preset.fields[f];
66730             if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
66731                 tags[field.key] = field.default;
66732             }
66733         }
66734
66735         return tags;
66736     };
66737
66738
66739     return preset;
66740 }
66741
66742 function presetIndex() {
66743     // a presetCollection with methods for
66744     // loading new data and returning defaults
66745
66746     var all = presetCollection([]),
66747         defaults = { area: all, line: all, point: all, vertex: all, relation: all },
66748         fields = {},
66749         universal = [],
66750         recent = presetCollection([]);
66751
66752     // Index of presets by (geometry, tag key).
66753     var index = {
66754         point: {},
66755         vertex: {},
66756         line: {},
66757         area: {},
66758         relation: {}
66759     };
66760
66761     all.match = function(entity, resolver) {
66762         var geometry = entity.geometry(resolver);
66763         var address;
66764
66765         // Treat entities on addr:interpolation lines as points, not vertices - #3241
66766         if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
66767             geometry = 'point';
66768         }
66769
66770         var geometryMatches = index[geometry],
66771             best = -1,
66772             match;
66773
66774         for (var k in entity.tags) {
66775             // If any part of an address is present,
66776             // allow fallback to "Address" preset - #4353
66777             if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
66778                 address = geometryMatches['addr:*'][0];
66779             }
66780
66781             var keyMatches = geometryMatches[k];
66782             if (!keyMatches) continue;
66783
66784             for (var i = 0; i < keyMatches.length; i++) {
66785                 var score = keyMatches[i].matchScore(entity);
66786                 if (score > best) {
66787                     best = score;
66788                     match = keyMatches[i];
66789                 }
66790             }
66791         }
66792
66793         if (address && (!match || match.isFallback())) {
66794             match = address;
66795         }
66796
66797         return match || all.item(geometry);
66798     };
66799
66800
66801     // Because of the open nature of tagging, iD will never have a complete
66802     // list of tags used in OSM, so we want it to have logic like "assume
66803     // that a closed way with an amenity tag is an area, unless the amenity
66804     // is one of these specific types". This function computes a structure
66805     // that allows testing of such conditions, based on the presets designated
66806     // as as supporting (or not supporting) the area geometry.
66807     //
66808     // The returned object L is a whitelist/blacklist of tags. A closed way
66809     // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
66810     // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
66811     // and the subkeys form the blacklist.
66812     all.areaKeys = function() {
66813         var areaKeys = {},
66814             ignore = ['barrier', 'highway', 'footway', 'railway', 'type'],  // probably a line..
66815             presets = reject(all.collection, 'suggestion');
66816
66817         // whitelist
66818         presets.forEach(function(d) {
66819             for (var key in d.tags) break;
66820             if (!key) return;
66821             if (ignore.indexOf(key) !== -1) return;
66822
66823             if (d.geometry.indexOf('area') !== -1) {    // probably an area..
66824                 areaKeys[key] = areaKeys[key] || {};
66825             }
66826         });
66827
66828         // blacklist
66829         presets.forEach(function(d) {
66830             for (var key in d.tags) break;
66831             if (!key) return;
66832             if (ignore.indexOf(key) !== -1) return;
66833
66834             var value = d.tags[key];
66835             if (key in areaKeys &&                      // probably an area...
66836                 d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
66837                 value !== '*') {
66838                 areaKeys[key][value] = true;
66839             }
66840         });
66841
66842         return areaKeys;
66843     };
66844
66845
66846     all.init = function() {
66847         var d = data.presets;
66848
66849         all.collection = [];
66850         recent.collection = [];
66851         fields = {};
66852         universal = [];
66853         index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
66854
66855         if (d.fields) {
66856             forEach(d.fields, function(d, id) {
66857                 fields[id] = presetField(id, d);
66858                 if (d.universal) universal.push(fields[id]);
66859             });
66860         }
66861
66862         if (d.presets) {
66863             forEach(d.presets, function(d, id) {
66864                 all.collection.push(presetPreset(id, d, fields));
66865             });
66866         }
66867
66868         if (d.categories) {
66869             forEach(d.categories, function(d, id) {
66870                 all.collection.push(presetCategory(id, d, all));
66871             });
66872         }
66873
66874         if (d.defaults) {
66875             var getItem = bind$2(all.item, all);
66876             defaults = {
66877                 area: presetCollection(d.defaults.area.map(getItem)),
66878                 line: presetCollection(d.defaults.line.map(getItem)),
66879                 point: presetCollection(d.defaults.point.map(getItem)),
66880                 vertex: presetCollection(d.defaults.vertex.map(getItem)),
66881                 relation: presetCollection(d.defaults.relation.map(getItem))
66882             };
66883         }
66884
66885         for (var i = 0; i < all.collection.length; i++) {
66886             var preset = all.collection[i],
66887                 geometry = preset.geometry;
66888
66889             for (var j = 0; j < geometry.length; j++) {
66890                 var g = index[geometry[j]];
66891                 for (var k in preset.tags) {
66892                     (g[k] = g[k] || []).push(preset);
66893                 }
66894             }
66895         }
66896
66897         return all;
66898     };
66899
66900     all.field = function(id) {
66901         return fields[id];
66902     };
66903
66904     all.universal = function() {
66905         return universal;
66906     };
66907
66908     all.defaults = function(geometry, n) {
66909         var rec = recent.matchGeometry(geometry).collection.slice(0, 4),
66910             def = uniq(rec.concat(defaults[geometry].collection)).slice(0, n - 1);
66911         return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
66912     };
66913
66914     all.choose = function(preset) {
66915         if (!preset.isFallback()) {
66916             recent = presetCollection(uniq([preset].concat(recent.collection)));
66917         }
66918         return all;
66919     };
66920
66921     return all;
66922 }
66923
66924 var areaKeys = {};
66925
66926 function setAreaKeys(value) {
66927     areaKeys = value;
66928 }
66929
66930
66931 function coreContext() {
66932     var context = {};
66933     context.version = '2.4.2';
66934
66935     // create a special translation that contains the keys in place of the strings
66936     var tkeys = cloneDeep(en);
66937     var parents = [];
66938
66939     function traverser(v, k, obj) {
66940         parents.push(k);
66941         if (isObject(v)) {
66942             forOwn(v, traverser);
66943         } else if (isString(v)) {
66944             obj[k] = parents.join('.');
66945         }
66946         parents.pop();
66947     }
66948
66949     forOwn(tkeys, traverser);
66950     addTranslation('_tkeys_', tkeys);
66951
66952     addTranslation('en', en);
66953     setLocale('en');
66954
66955     var dispatch$$1 = dispatch('enter', 'exit', 'change');
66956
66957     // https://github.com/openstreetmap/iD/issues/772
66958     // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
66959     var storage;
66960     try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
66961     storage = storage || (function() {
66962         var s = {};
66963         return {
66964             getItem: function(k) { return s[k]; },
66965             setItem: function(k, v) { s[k] = v; },
66966             removeItem: function(k) { delete s[k]; }
66967         };
66968     })();
66969
66970     context.storage = function(k, v) {
66971         try {
66972             if (arguments.length === 1) return storage.getItem(k);
66973             else if (v === null) storage.removeItem(k);
66974             else storage.setItem(k, v);
66975         } catch (e) {
66976             // localstorage quota exceeded
66977             /* eslint-disable no-console */
66978             if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
66979             /* eslint-enable no-console */
66980         }
66981     };
66982
66983
66984     /* Straight accessors. Avoid using these if you can. */
66985     var ui, connection, history;
66986     context.ui = function() { return ui; };
66987     context.connection = function() { return connection; };
66988     context.history = function() { return history; };
66989
66990
66991     /* Connection */
66992     var entitiesLoaded = utilCallWhenIdle(function entitiesLoaded(err, result) {
66993         if (!err) history.merge(result.data, result.extent);
66994     });
66995
66996     context.preauth = function(options) {
66997         if (connection) {
66998             connection.switch(options);
66999         }
67000         return context;
67001     };
67002
67003     context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) {
67004         function done(err, result) {
67005             entitiesLoaded(err, result);
67006             if (callback) callback(err, result);
67007         }
67008         if (connection) {
67009             connection.loadTiles(projection, dimensions, done);
67010         }
67011     });
67012
67013     context.loadEntity = function(id, callback) {
67014         function done(err, result) {
67015             entitiesLoaded(err, result);
67016             if (callback) callback(err, result);
67017         }
67018         if (connection) {
67019             connection.loadEntity(id, done);
67020         }
67021     };
67022
67023     context.zoomToEntity = function(id, zoomTo) {
67024         if (zoomTo !== false) {
67025             this.loadEntity(id, function(err, result) {
67026                 if (err) return;
67027                 var entity = find$1(result.data, function(e) { return e.id === id; });
67028                 if (entity) { map.zoomTo(entity); }
67029             });
67030         }
67031
67032         map.on('drawn.zoomToEntity', function() {
67033             if (!context.hasEntity(id)) return;
67034             map.on('drawn.zoomToEntity', null);
67035             context.on('enter.zoomToEntity', null);
67036             context.enter(modeSelect(context, [id]));
67037         });
67038
67039         context.on('enter.zoomToEntity', function() {
67040             if (mode.id !== 'browse') {
67041                 map.on('drawn.zoomToEntity', null);
67042                 context.on('enter.zoomToEntity', null);
67043             }
67044         });
67045     };
67046
67047     var minEditableZoom = 16;
67048     context.minEditableZoom = function(_) {
67049         if (!arguments.length) return minEditableZoom;
67050         minEditableZoom = _;
67051         if (connection) {
67052             connection.tileZoom(_);
67053         }
67054         return context;
67055     };
67056
67057
67058     /* History */
67059     var inIntro = false;
67060     context.inIntro = function(_) {
67061         if (!arguments.length) return inIntro;
67062         inIntro = _;
67063         return context;
67064     };
67065
67066     context.save = function() {
67067         // no history save, no message onbeforeunload
67068         if (inIntro || d3_select('.modal').size()) return;
67069
67070         var canSave;
67071         if (mode && mode.id === 'save') {
67072             canSave = false;
67073         } else {
67074             canSave = context.selectedIDs().every(function(id) {
67075                 var entity = context.hasEntity(id);
67076                 return entity && !entity.isDegenerate();
67077             });
67078         }
67079
67080         if (canSave) {
67081             history.save();
67082         }
67083         if (history.hasChanges()) {
67084             return t('save.unsaved_changes');
67085         }
67086     };
67087
67088
67089     /* Graph */
67090     context.hasEntity = function(id) {
67091         return history.graph().hasEntity(id);
67092     };
67093     context.entity = function(id) {
67094         return history.graph().entity(id);
67095     };
67096     context.childNodes = function(way) {
67097         return history.graph().childNodes(way);
67098     };
67099     context.geometry = function(id) {
67100         return context.entity(id).geometry(history.graph());
67101     };
67102
67103
67104     /* Modes */
67105     var mode;
67106     context.mode = function() {
67107         return mode;
67108     };
67109     context.enter = function(newMode) {
67110         if (mode) {
67111             mode.exit();
67112             dispatch$$1.call('exit', this, mode);
67113         }
67114
67115         mode = newMode;
67116         mode.enter();
67117         dispatch$$1.call('enter', this, mode);
67118     };
67119
67120     context.selectedIDs = function() {
67121         if (mode && mode.selectedIDs) {
67122             return mode.selectedIDs();
67123         } else {
67124             return [];
67125         }
67126     };
67127
67128
67129     /* Behaviors */
67130     context.install = function(behavior) {
67131         context.surface().call(behavior);
67132     };
67133     context.uninstall = function(behavior) {
67134         context.surface().call(behavior.off);
67135     };
67136
67137
67138     /* Copy/Paste */
67139     var copyIDs = [], copyGraph;
67140     context.copyGraph = function() { return copyGraph; };
67141     context.copyIDs = function(_) {
67142         if (!arguments.length) return copyIDs;
67143         copyIDs = _;
67144         copyGraph = history.graph();
67145         return context;
67146     };
67147
67148
67149     /* Background */
67150     var background;
67151     context.background = function() { return background; };
67152
67153
67154     /* Features */
67155     var features;
67156     context.features = function() { return features; };
67157     context.hasHiddenConnections = function(id) {
67158         var graph = history.graph(),
67159             entity = graph.entity(id);
67160         return features.hasHiddenConnections(entity, graph);
67161     };
67162
67163
67164     /* Presets */
67165     var presets;
67166     context.presets = function() { return presets; };
67167
67168
67169     /* Map */
67170     var map;
67171     context.map = function() { return map; };
67172     context.layers = function() { return map.layers; };
67173     context.surface = function() { return map.surface; };
67174     context.editable = function() { return map.editable(); };
67175     context.surfaceRect = function() {
67176         return map.surface.node().getBoundingClientRect();
67177     };
67178
67179
67180     /* Debug */
67181     var debugFlags = {
67182         tile: false,
67183         collision: false,
67184         imagery: false,
67185         imperial: false,
67186         driveLeft: false
67187     };
67188     context.debugFlags = function() {
67189         return debugFlags;
67190     };
67191     context.setDebug = function(flag, val) {
67192         if (arguments.length === 1) val = true;
67193         debugFlags[flag] = val;
67194         dispatch$$1.call('change');
67195         return context;
67196     };
67197     context.getDebug = function(flag) {
67198         return flag && debugFlags[flag];
67199     };
67200
67201
67202     /* Container */
67203     var container = d3_select(document.body);
67204     context.container = function(_) {
67205         if (!arguments.length) return container;
67206         container = _;
67207         container.classed('id-container', true);
67208         return context;
67209     };
67210     var embed;
67211     context.embed = function(_) {
67212         if (!arguments.length) return embed;
67213         embed = _;
67214         return context;
67215     };
67216
67217
67218     /* Assets */
67219     var assetPath = '';
67220     context.assetPath = function(_) {
67221         if (!arguments.length) return assetPath;
67222         assetPath = _;
67223         return context;
67224     };
67225
67226     var assetMap = {};
67227     context.assetMap = function(_) {
67228         if (!arguments.length) return assetMap;
67229         assetMap = _;
67230         return context;
67231     };
67232
67233     context.asset = function(_) {
67234         var filename = assetPath + _;
67235         return assetMap[filename] || filename;
67236     };
67237
67238     context.imagePath = function(_) {
67239         return context.asset('img/' + _);
67240     };
67241
67242
67243     /* locales */
67244     // `locale` variable contains a "requested locale".
67245     // It won't become the `currentLocale` until after loadLocale() is called.
67246     var locale, localePath;
67247
67248     context.locale = function(loc, path) {
67249         if (!arguments.length) return currentLocale;
67250         locale = loc;
67251         localePath = path;
67252         return context;
67253     };
67254
67255     context.loadLocale = function(callback) {
67256         if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
67257             localePath = localePath || context.asset('locales/' + locale + '.json');
67258             d3_json(localePath, function(err, result) {
67259                 if (!err) {
67260                     addTranslation(locale, result[locale]);
67261                     setLocale(locale);
67262                     utilDetect(true);
67263                 }
67264                 if (callback) {
67265                     callback(err);
67266                 }
67267             });
67268         } else {
67269             if (locale) {
67270                 setLocale(locale);
67271                 utilDetect(true);
67272             }
67273             if (callback) {
67274                 callback();
67275             }
67276         }
67277     };
67278
67279
67280     /* reset (aka flush) */
67281     context.reset = context.flush = function() {
67282         context.debouncedSave.cancel();
67283         forEach(services, function(service) {
67284             if (service && typeof service.reset === 'function') {
67285                 service.reset(context);
67286             }
67287         });
67288         features.reset();
67289         history.reset();
67290         return context;
67291     };
67292
67293
67294     /* Init */
67295
67296     context.projection = geoRawMercator();
67297     context.curtainProjection = geoRawMercator();
67298
67299     locale = utilDetect().locale;
67300     if (locale && !dataLocales.hasOwnProperty(locale)) {
67301         locale = locale.split('-')[0];
67302     }
67303
67304     history = coreHistory(context);
67305     context.graph = history.graph;
67306     context.changes = history.changes;
67307     context.intersects = history.intersects;
67308
67309     // Debounce save, since it's a synchronous localStorage write,
67310     // and history changes can happen frequently (e.g. when dragging).
67311     context.debouncedSave = debounce$1(context.save, 350);
67312     function withDebouncedSave(fn) {
67313         return function() {
67314             var result = fn.apply(history, arguments);
67315             context.debouncedSave();
67316             return result;
67317         };
67318     }
67319
67320     context.perform = withDebouncedSave(history.perform);
67321     context.replace = withDebouncedSave(history.replace);
67322     context.pop = withDebouncedSave(history.pop);
67323     context.overwrite = withDebouncedSave(history.overwrite);
67324     context.undo = withDebouncedSave(history.undo);
67325     context.redo = withDebouncedSave(history.redo);
67326
67327     ui = uiInit(context);
67328
67329     connection = services.osm;
67330     background = rendererBackground(context);
67331     features = rendererFeatures(context);
67332     presets = presetIndex();
67333
67334     map = rendererMap(context);
67335     context.mouse = map.mouse;
67336     context.extent = map.extent;
67337     context.pan = map.pan;
67338     context.zoomIn = map.zoomIn;
67339     context.zoomOut = map.zoomOut;
67340     context.zoomInFurther = map.zoomInFurther;
67341     context.zoomOutFurther = map.zoomOutFurther;
67342     context.redrawEnable = map.redrawEnable;
67343
67344     forEach(services, function(service) {
67345         if (service && typeof service.init === 'function') {
67346             service.init(context);
67347         }
67348     });
67349
67350     background.init();
67351     presets.init();
67352     areaKeys = presets.areaKeys();
67353
67354
67355     return utilRebind(context, dispatch$$1, 'on');
67356 }
67357
67358 function osmWay() {
67359     if (!(this instanceof osmWay)) {
67360         return (new osmWay()).initialize(arguments);
67361     } else if (arguments.length) {
67362         this.initialize(arguments);
67363     }
67364 }
67365
67366
67367 osmEntity$$1.way = osmWay;
67368
67369 osmWay.prototype = Object.create(osmEntity$$1.prototype);
67370
67371
67372 assignIn$1(osmWay.prototype, {
67373     type: 'way',
67374     nodes: [],
67375
67376
67377     copy: function(resolver, copies) {
67378         if (copies[this.id])
67379             return copies[this.id];
67380
67381         var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
67382
67383         var nodes = this.nodes.map(function(id) {
67384             return resolver.entity(id).copy(resolver, copies).id;
67385         });
67386
67387         copy = copy.update({ nodes: nodes });
67388         copies[this.id] = copy;
67389
67390         return copy;
67391     },
67392
67393
67394     extent: function(resolver) {
67395         return resolver.transient(this, 'extent', function() {
67396             var extent = geoExtent$$1();
67397             for (var i = 0; i < this.nodes.length; i++) {
67398                 var node = resolver.hasEntity(this.nodes[i]);
67399                 if (node) {
67400                     extent._extend(node.extent());
67401                 }
67402             }
67403             return extent;
67404         });
67405     },
67406
67407
67408     first: function() {
67409         return this.nodes[0];
67410     },
67411
67412
67413     last: function() {
67414         return this.nodes[this.nodes.length - 1];
67415     },
67416
67417
67418     contains: function(node) {
67419         return this.nodes.indexOf(node) >= 0;
67420     },
67421
67422
67423     affix: function(node) {
67424         if (this.nodes[0] === node) return 'prefix';
67425         if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
67426     },
67427
67428
67429     layer: function() {
67430         // explicit layer tag, clamp between -10, 10..
67431         if (isFinite(this.tags.layer)) {
67432             return Math.max(-10, Math.min(+(this.tags.layer), 10));
67433         }
67434
67435         // implied layer tag..
67436         if (this.tags.location === 'overground') return 1;
67437         if (this.tags.location === 'underground') return -1;
67438         if (this.tags.location === 'underwater') return -10;
67439
67440         if (this.tags.power === 'line') return 10;
67441         if (this.tags.power === 'minor_line') return 10;
67442         if (this.tags.aerialway) return 10;
67443         if (this.tags.bridge) return 1;
67444         if (this.tags.cutting) return -1;
67445         if (this.tags.tunnel) return -1;
67446         if (this.tags.waterway) return -1;
67447         if (this.tags.man_made === 'pipeline') return -10;
67448         if (this.tags.boundary) return -10;
67449         return 0;
67450     },
67451
67452
67453     isOneWay: function() {
67454         // explicit oneway tag..
67455         if (['yes', '1', '-1'].indexOf(this.tags.oneway) !== -1) { return true; }
67456         if (['no', '0'].indexOf(this.tags.oneway) !== -1) { return false; }
67457
67458         // implied oneway tag..
67459         for (var key in this.tags) {
67460             if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
67461                 return true;
67462         }
67463         return false;
67464     },
67465
67466
67467     lanes: function() {
67468         return osmLanes(this);
67469     },
67470
67471
67472     isClosed: function() {
67473         return this.nodes.length > 1 && this.first() === this.last();
67474     },
67475
67476
67477     isConvex: function(resolver) {
67478         if (!this.isClosed() || this.isDegenerate()) return null;
67479
67480         var nodes = uniq(resolver.childNodes(this)),
67481             coords = map$4(nodes, 'loc'),
67482             curr = 0, prev = 0;
67483
67484         for (var i = 0; i < coords.length; i++) {
67485             var o = coords[(i+1) % coords.length],
67486                 a = coords[i],
67487                 b = coords[(i+2) % coords.length],
67488                 res = geoCross(o, a, b);
67489
67490             curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
67491             if (curr === 0) {
67492                 continue;
67493             } else if (prev && curr !== prev) {
67494                 return false;
67495             }
67496             prev = curr;
67497         }
67498         return true;
67499     },
67500
67501
67502     isArea: function() {
67503         // `highway` and `railway` are typically linear features, but there
67504         // are a few exceptions that should be treated as areas, even in the
67505         // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
67506         var lineKeys = {
67507             highway: {
67508                 rest_area: true,
67509                 services: true
67510             },
67511             railway: {
67512                 roundhouse: true,
67513                 station: true,
67514                 traverser: true,
67515                 turntable: true,
67516                 wash: true
67517             }
67518         };
67519
67520         if (this.tags.area === 'yes')
67521             return true;
67522         if (!this.isClosed() || this.tags.area === 'no')
67523             return false;
67524         for (var key in this.tags) {
67525             if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
67526                 return true;
67527             }
67528             if (key in lineKeys && this.tags[key] in lineKeys[key]) {
67529                 return true;
67530             }
67531         }
67532         return false;
67533     },
67534
67535
67536     isDegenerate: function() {
67537         return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
67538     },
67539
67540
67541     areAdjacent: function(n1, n2) {
67542         for (var i = 0; i < this.nodes.length; i++) {
67543             if (this.nodes[i] === n1) {
67544                 if (this.nodes[i - 1] === n2) return true;
67545                 if (this.nodes[i + 1] === n2) return true;
67546             }
67547         }
67548         return false;
67549     },
67550
67551
67552     geometry: function(graph) {
67553         return graph.transient(this, 'geometry', function() {
67554             return this.isArea() ? 'area' : 'line';
67555         });
67556     },
67557
67558
67559     // If this way is not closed, append the beginning node to the end of the nodelist to close it.
67560     close: function() {
67561         if (this.isClosed() || !this.nodes.length) return this;
67562
67563         var nodes = this.nodes.slice();
67564         nodes = nodes.filter(noRepeatNodes);
67565         nodes.push(nodes[0]);
67566         return this.update({ nodes: nodes });
67567     },
67568
67569
67570     // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
67571     unclose: function() {
67572         if (!this.isClosed()) return this;
67573
67574         var nodes = this.nodes.slice(),
67575             connector = this.first(),
67576             i = nodes.length - 1;
67577
67578         // remove trailing connectors..
67579         while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
67580             nodes.splice(i, 1);
67581             i = nodes.length - 1;
67582         }
67583
67584         nodes = nodes.filter(noRepeatNodes);
67585         return this.update({ nodes: nodes });
67586     },
67587
67588
67589     // Adds a node (id) in front of the node which is currently at position index.
67590     // If index is undefined, the node will be added to the end of the way for linear ways,
67591     //   or just before the final connecting node for circular ways.
67592     // Consecutive duplicates are eliminated including existing ones.
67593     // Circularity is always preserved when adding a node.
67594     addNode: function(id, index) {
67595         var nodes = this.nodes.slice(),
67596             isClosed = this.isClosed(),
67597             max = isClosed ? nodes.length - 1 : nodes.length;
67598
67599         if (index === undefined) {
67600             index = max;
67601         }
67602
67603         if (index < 0 || index > max) {
67604             throw new RangeError('index ' + index + ' out of range 0..' + max);
67605         }
67606
67607         // If this is a closed way, remove all connector nodes except the first one
67608         // (there may be duplicates) and adjust index if necessary..
67609         if (isClosed) {
67610             var connector = this.first();
67611
67612             // leading connectors..
67613             var i = 1;
67614             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
67615                 nodes.splice(i, 1);
67616                 if (index > i) index--;
67617             }
67618
67619             // trailing connectors..
67620             i = nodes.length - 1;
67621             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
67622                 nodes.splice(i, 1);
67623                 if (index > i) index--;
67624                 i = nodes.length - 1;
67625             }
67626         }
67627
67628         nodes.splice(index, 0, id);
67629         nodes = nodes.filter(noRepeatNodes);
67630
67631         // If the way was closed before, append a connector node to keep it closed..
67632         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67633             nodes.push(nodes[0]);
67634         }
67635
67636         return this.update({ nodes: nodes });
67637     },
67638
67639
67640     // Replaces the node which is currently at position index with the given node (id).
67641     // Consecutive duplicates are eliminated including existing ones.
67642     // Circularity is preserved when updating a node.
67643     updateNode: function(id, index) {
67644         var nodes = this.nodes.slice(),
67645             isClosed = this.isClosed(),
67646             max = nodes.length - 1;
67647
67648         if (index === undefined || index < 0 || index > max) {
67649             throw new RangeError('index ' + index + ' out of range 0..' + max);
67650         }
67651
67652         // If this is a closed way, remove all connector nodes except the first one
67653         // (there may be duplicates) and adjust index if necessary..
67654         if (isClosed) {
67655             var connector = this.first();
67656
67657             // leading connectors..
67658             var i = 1;
67659             while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
67660                 nodes.splice(i, 1);
67661                 if (index > i) index--;
67662             }
67663
67664             // trailing connectors..
67665             i = nodes.length - 1;
67666             while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
67667                 nodes.splice(i, 1);
67668                 if (index === i) index = 0;  // update leading connector instead
67669                 i = nodes.length - 1;
67670             }
67671         }
67672
67673         nodes.splice(index, 1, id);
67674         nodes = nodes.filter(noRepeatNodes);
67675
67676         // If the way was closed before, append a connector node to keep it closed..
67677         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67678             nodes.push(nodes[0]);
67679         }
67680
67681         return this.update({nodes: nodes});
67682     },
67683
67684
67685     // Replaces each occurrence of node id needle with replacement.
67686     // Consecutive duplicates are eliminated including existing ones.
67687     // Circularity is preserved.
67688     replaceNode: function(needle, replacement) {
67689         var nodes = this.nodes.slice(),
67690             isClosed = this.isClosed();
67691
67692         for (var i = 0; i < nodes.length; i++) {
67693             if (nodes[i] === needle) {
67694                 nodes[i] = replacement;
67695             }
67696         }
67697
67698         nodes = nodes.filter(noRepeatNodes);
67699
67700         // If the way was closed before, append a connector node to keep it closed..
67701         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67702             nodes.push(nodes[0]);
67703         }
67704
67705         return this.update({nodes: nodes});
67706     },
67707
67708
67709     // Removes each occurrence of node id needle with replacement.
67710     // Consecutive duplicates are eliminated including existing ones.
67711     // Circularity is preserved.
67712     removeNode: function(id) {
67713         var nodes = this.nodes.slice(),
67714             isClosed = this.isClosed();
67715
67716         nodes = nodes
67717             .filter(function(node) { return node !== id; })
67718             .filter(noRepeatNodes);
67719
67720         // If the way was closed before, append a connector node to keep it closed..
67721         if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
67722             nodes.push(nodes[0]);
67723         }
67724
67725         return this.update({nodes: nodes});
67726     },
67727
67728
67729     asJXON: function(changeset_id) {
67730         var r = {
67731             way: {
67732                 '@id': this.osmId(),
67733                 '@version': this.version || 0,
67734                 nd: map$4(this.nodes, function(id) {
67735                     return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
67736                 }),
67737                 tag: map$4(this.tags, function(v, k) {
67738                     return { keyAttributes: { k: k, v: v } };
67739                 })
67740             }
67741         };
67742         if (changeset_id) {
67743             r.way['@changeset'] = changeset_id;
67744         }
67745         return r;
67746     },
67747
67748
67749     asGeoJSON: function(resolver) {
67750         return resolver.transient(this, 'GeoJSON', function() {
67751             var coordinates = map$4(resolver.childNodes(this), 'loc');
67752             if (this.isArea() && this.isClosed()) {
67753                 return {
67754                     type: 'Polygon',
67755                     coordinates: [coordinates]
67756                 };
67757             } else {
67758                 return {
67759                     type: 'LineString',
67760                     coordinates: coordinates
67761                 };
67762             }
67763         });
67764     },
67765
67766
67767     area: function(resolver) {
67768         return resolver.transient(this, 'area', function() {
67769             var nodes = resolver.childNodes(this);
67770
67771             var json = {
67772                 type: 'Polygon',
67773                 coordinates: [map$4(nodes, 'loc')]
67774             };
67775
67776             if (!this.isClosed() && nodes.length) {
67777                 json.coordinates[0].push(nodes[0].loc);
67778             }
67779
67780             var area = d3_geoArea(json);
67781
67782             // Heuristic for detecting counterclockwise winding order. Assumes
67783             // that OpenStreetMap polygons are not hemisphere-spanning.
67784             if (area > 2 * Math.PI) {
67785                 json.coordinates[0] = json.coordinates[0].reverse();
67786                 area = d3_geoArea(json);
67787             }
67788
67789             return isNaN(area) ? 0 : area;
67790         });
67791     }
67792 });
67793
67794
67795 // Filter function to eliminate consecutive duplicates.
67796 function noRepeatNodes(node, i, arr) {
67797     return i === 0 || node !== arr[i - 1];
67798 }
67799
67800 /* Built-in method references for those with the same name as other `lodash` methods. */
67801 var nativeMax$8 = Math.max;
67802
67803 /**
67804  * Gets the index at which the first occurrence of `value` is found in `array`
67805  * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
67806  * for equality comparisons. If `fromIndex` is negative, it's used as the
67807  * offset from the end of `array`.
67808  *
67809  * @static
67810  * @memberOf _
67811  * @since 0.1.0
67812  * @category Array
67813  * @param {Array} array The array to inspect.
67814  * @param {*} value The value to search for.
67815  * @param {number} [fromIndex=0] The index to search from.
67816  * @returns {number} Returns the index of the matched value, else `-1`.
67817  * @example
67818  *
67819  * _.indexOf([1, 2, 1, 2], 2);
67820  * // => 1
67821  *
67822  * // Search from the `fromIndex`.
67823  * _.indexOf([1, 2, 1, 2], 2, 2);
67824  * // => 3
67825  */
67826 function indexOf(array, value, fromIndex) {
67827   var length = array == null ? 0 : array.length;
67828   if (!length) {
67829     return -1;
67830   }
67831   var index = fromIndex == null ? 0 : toInteger(fromIndex);
67832   if (index < 0) {
67833     index = nativeMax$8(length + index, 0);
67834   }
67835   return baseIndexOf(array, value, index);
67836 }
67837
67838 function osmTurn(turn) {
67839     if (!(this instanceof osmTurn))
67840         return new osmTurn(turn);
67841     assignIn$1(this, turn);
67842 }
67843
67844
67845 function osmIntersection(graph, vertexId) {
67846     var vertex = graph.entity(vertexId),
67847         parentWays = graph.parentWays(vertex),
67848         coincident = [],
67849         highways = {};
67850
67851     function addHighway(way, adjacentNodeId) {
67852         if (highways[adjacentNodeId]) {
67853             coincident.push(adjacentNodeId);
67854         } else {
67855             highways[adjacentNodeId] = way;
67856         }
67857     }
67858
67859     // Pre-split ways that would need to be split in
67860     // order to add a restriction. The real split will
67861     // happen when the restriction is added.
67862     parentWays.forEach(function(way) {
67863         if (!way.tags.highway || way.isArea() || way.isDegenerate())
67864             return;
67865
67866         var isFirst = (vertexId === way.first()),
67867             isLast = (vertexId === way.last()),
67868             isAffix = (isFirst || isLast),
67869             isClosingNode = (isFirst && isLast);
67870
67871         if (isAffix && !isClosingNode) {
67872             var index = (isFirst ? 1 : way.nodes.length - 2);
67873             addHighway(way, way.nodes[index]);
67874
67875         } else {
67876             var splitIndex, wayA, wayB, indexA, indexB;
67877             if (isClosingNode) {
67878                 splitIndex = Math.ceil(way.nodes.length / 2);  // split at midpoint
67879                 wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex)});
67880                 wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
67881                 indexA = 1;
67882                 indexB = way.nodes.length - 2;
67883             } else {
67884                 splitIndex = indexOf(way.nodes, vertex.id, 1);  // split at vertexid
67885                 wayA = osmWay({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex + 1)});
67886                 wayB = osmWay({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
67887                 indexA = splitIndex - 1;
67888                 indexB = splitIndex + 1;
67889             }
67890             graph = graph.replace(wayA).replace(wayB);
67891             addHighway(wayA, way.nodes[indexA]);
67892             addHighway(wayB, way.nodes[indexB]);
67893         }
67894     });
67895
67896     // remove any ways from this intersection that are coincident
67897     // (i.e. any adjacent node used by more than one intersecting way)
67898     coincident.forEach(function (n) {
67899         delete highways[n];
67900     });
67901
67902
67903     var intersection = {
67904         highways: highways,
67905         ways: values$1(highways),
67906         graph: graph
67907     };
67908
67909
67910     intersection.adjacentNodeId = function(fromWayId) {
67911         return find$1(keys$1(highways), function(k) {
67912             return highways[k].id === fromWayId;
67913         });
67914     };
67915
67916
67917     intersection.turns = function(fromNodeId) {
67918         var start = highways[fromNodeId];
67919         if (!start)
67920             return [];
67921
67922         if (start.first() === vertex.id && start.tags.oneway === 'yes')
67923             return [];
67924         if (start.last() === vertex.id && start.tags.oneway === '-1')
67925             return [];
67926
67927         function withRestriction(turn) {
67928             graph.parentRelations(graph.entity(turn.from.way)).forEach(function(relation) {
67929                 if (relation.tags.type !== 'restriction')
67930                     return;
67931
67932                 var f = relation.memberByRole('from'),
67933                     t = relation.memberByRole('to'),
67934                     v = relation.memberByRole('via');
67935
67936                 if (f && f.id === turn.from.way &&
67937                     v && v.id === turn.via.node &&
67938                     t && t.id === turn.to.way) {
67939                     turn.restriction = relation.id;
67940                 } else if (/^only_/.test(relation.tags.restriction) &&
67941                     f && f.id === turn.from.way &&
67942                     v && v.id === turn.via.node &&
67943                     t && t.id !== turn.to.way) {
67944                     turn.restriction = relation.id;
67945                     turn.indirect_restriction = true;
67946                 }
67947             });
67948
67949             return osmTurn(turn);
67950         }
67951
67952
67953         var from = {
67954                 node: fromNodeId,
67955                 way: start.id.split(/-(a|b)/)[0]
67956             },
67957             via = { node: vertex.id },
67958             turns = [];
67959
67960         forEach(highways, function(end, adjacentNodeId) {
67961             if (end === start)
67962                 return;
67963
67964             // backward
67965             if (end.first() !== vertex.id && end.tags.oneway !== 'yes') {
67966                 turns.push(withRestriction({
67967                     from: from,
67968                     via: via,
67969                     to: {
67970                         node: adjacentNodeId,
67971                         way: end.id.split(/-(a|b)/)[0]
67972                     }
67973                 }));
67974             }
67975
67976             // forward
67977             if (end.last() !== vertex.id && end.tags.oneway !== '-1') {
67978                 turns.push(withRestriction({
67979                     from: from,
67980                     via: via,
67981                     to: {
67982                         node: adjacentNodeId,
67983                         way: end.id.split(/-(a|b)/)[0]
67984                     }
67985                 }));
67986             }
67987
67988         });
67989
67990         // U-turn
67991         if (start.tags.oneway !== 'yes' && start.tags.oneway !== '-1') {
67992             turns.push(withRestriction({
67993                 from: from,
67994                 via: via,
67995                 to: from,
67996                 u: true
67997             }));
67998         }
67999
68000         return turns;
68001     };
68002
68003     return intersection;
68004 }
68005
68006
68007 function osmInferRestriction(graph, from, via, to, projection) {
68008     var fromWay = graph.entity(from.way),
68009         fromNode = graph.entity(from.node),
68010         toWay = graph.entity(to.way),
68011         toNode = graph.entity(to.node),
68012         viaNode = graph.entity(via.node),
68013         fromOneWay = (fromWay.tags.oneway === 'yes' && fromWay.last() === via.node) ||
68014             (fromWay.tags.oneway === '-1' && fromWay.first() === via.node),
68015         toOneWay = (toWay.tags.oneway === 'yes' && toWay.first() === via.node) ||
68016             (toWay.tags.oneway === '-1' && toWay.last() === via.node),
68017         angle = geoAngle(viaNode, fromNode, projection) -
68018                 geoAngle(viaNode, toNode, projection);
68019
68020     angle = angle * 180 / Math.PI;
68021
68022     while (angle < 0)
68023         angle += 360;
68024
68025     if (fromNode === toNode)
68026         return 'no_u_turn';
68027     if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
68028         return 'no_u_turn';
68029     if (angle < 158)
68030         return 'no_right_turn';
68031     if (angle > 202)
68032         return 'no_left_turn';
68033
68034     return 'no_straight_on';
68035 }
68036
68037 function actionAddMember(relationId, member, memberIndex) {
68038     return function(graph) {
68039         var relation = graph.entity(relationId);
68040
68041         if (isNaN(memberIndex) && member.type === 'way') {
68042             var members = relation.indexedMembers();
68043             members.push(member);
68044
68045             var joined = osmJoinWays(members, graph);
68046             for (var i = 0; i < joined.length; i++) {
68047                 var segment = joined[i];
68048                 for (var j = 0; j < segment.length && segment.length >= 2; j++) {
68049                     if (segment[j] !== member)
68050                         continue;
68051
68052                     if (j === 0) {
68053                         memberIndex = segment[j + 1].index;
68054                     } else if (j === segment.length - 1) {
68055                         memberIndex = segment[j - 1].index + 1;
68056                     } else {
68057                         memberIndex = Math.min(segment[j - 1].index + 1, segment[j + 1].index + 1);
68058                     }
68059                 }
68060             }
68061         }
68062
68063         return graph.replace(relation.addMember(member, memberIndex));
68064     };
68065 }
68066
68067 function actionAddMidpoint(midpoint, node) {
68068     return function(graph) {
68069         graph = graph.replace(node.move(midpoint.loc));
68070
68071         var parents = intersection(
68072             graph.parentWays(graph.entity(midpoint.edge[0])),
68073             graph.parentWays(graph.entity(midpoint.edge[1])));
68074
68075         parents.forEach(function(way) {
68076             for (var i = 0; i < way.nodes.length - 1; i++) {
68077                 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
68078                     graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
68079
68080                     // Add only one midpoint on doubled-back segments,
68081                     // turning them into self-intersections.
68082                     return;
68083                 }
68084             }
68085         });
68086
68087         return graph;
68088     };
68089 }
68090
68091 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
68092 function actionAddVertex(wayId, nodeId, index) {
68093     return function(graph) {
68094         return graph.replace(graph.entity(wayId).addNode(nodeId, index));
68095     };
68096 }
68097
68098 function actionChangeMember(relationId, member, memberIndex) {
68099     return function(graph) {
68100         return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
68101     };
68102 }
68103
68104 function actionChangePreset(entityId, oldPreset, newPreset) {
68105     return function(graph) {
68106         var entity = graph.entity(entityId),
68107             geometry = entity.geometry(graph),
68108             tags = entity.tags;
68109
68110         if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
68111         if (newPreset) tags = newPreset.applyTags(tags, geometry);
68112
68113         return graph.replace(entity.update({tags: tags}));
68114     };
68115 }
68116
68117 function actionChangeTags(entityId, tags) {
68118     return function(graph) {
68119         var entity = graph.entity(entityId);
68120         return graph.replace(entity.update({tags: tags}));
68121     };
68122 }
68123
68124 function actionCircularize(wayId, projection, maxAngle) {
68125     maxAngle = (maxAngle || 20) * Math.PI / 180;
68126
68127
68128     var action = function(graph, t) {
68129         if (t === null || !isFinite(t)) t = 1;
68130         t = Math.min(Math.max(+t, 0), 1);
68131
68132         var way = graph.entity(wayId),
68133             origNodes = {};
68134
68135         graph.childNodes(way).forEach(function(node) {
68136             if (!origNodes[node.id]) origNodes[node.id] = node;
68137         });
68138
68139         if (!way.isConvex(graph)) {
68140             graph = action.makeConvex(graph);
68141         }
68142
68143         var nodes = uniq(graph.childNodes(way)),
68144             keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
68145             points = nodes.map(function(n) { return projection(n.loc); }),
68146             keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
68147             centroid = (points.length === 2) ? geoInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
68148             radius = d3_median(points, function(p) { return geoEuclideanDistance(centroid, p); }),
68149             sign = d3_polygonArea(points) > 0 ? 1 : -1,
68150             ids;
68151
68152         // we need atleast two key nodes for the algorithm to work
68153         if (!keyNodes.length) {
68154             keyNodes = [nodes[0]];
68155             keyPoints = [points[0]];
68156         }
68157
68158         if (keyNodes.length === 1) {
68159             var index = nodes.indexOf(keyNodes[0]),
68160                 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
68161
68162             keyNodes.push(nodes[oppositeIndex]);
68163             keyPoints.push(points[oppositeIndex]);
68164         }
68165
68166         // key points and nodes are those connected to the ways,
68167         // they are projected onto the circle, inbetween nodes are moved
68168         // to constant intervals between key nodes, extra inbetween nodes are
68169         // added if necessary.
68170         for (var i = 0; i < keyPoints.length; i++) {
68171             var nextKeyNodeIndex = (i + 1) % keyNodes.length,
68172                 startNode = keyNodes[i],
68173                 endNode = keyNodes[nextKeyNodeIndex],
68174                 startNodeIndex = nodes.indexOf(startNode),
68175                 endNodeIndex = nodes.indexOf(endNode),
68176                 numberNewPoints = -1,
68177                 indexRange = endNodeIndex - startNodeIndex,
68178                 nearNodes = {},
68179                 inBetweenNodes = [],
68180                 startAngle, endAngle, totalAngle, eachAngle,
68181                 angle, loc, node, origNode, j;
68182
68183             if (indexRange < 0) {
68184                 indexRange += nodes.length;
68185             }
68186
68187             // position this key node
68188             var distance = geoEuclideanDistance(centroid, keyPoints[i]);
68189             if (distance === 0) { distance = 1e-4; }
68190             keyPoints[i] = [
68191                 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
68192                 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
68193             ];
68194             loc = projection.invert(keyPoints[i]);
68195             node = keyNodes[i];
68196             origNode = origNodes[node.id];
68197             node = node.move(geoInterp(origNode.loc, loc, t));
68198             graph = graph.replace(node);
68199
68200             // figure out the between delta angle we want to match to
68201             startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
68202             endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
68203             totalAngle = endAngle - startAngle;
68204
68205             // detects looping around -pi/pi
68206             if (totalAngle * sign > 0) {
68207                 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
68208             }
68209
68210             do {
68211                 numberNewPoints++;
68212                 eachAngle = totalAngle / (indexRange + numberNewPoints);
68213             } while (Math.abs(eachAngle) > maxAngle);
68214
68215
68216             // move existing nodes
68217             for (j = 1; j < indexRange; j++) {
68218                 angle = startAngle + j * eachAngle;
68219                 loc = projection.invert([
68220                     centroid[0] + Math.cos(angle) * radius,
68221                     centroid[1] + Math.sin(angle) * radius
68222                 ]);
68223
68224                 node = nodes[(j + startNodeIndex) % nodes.length];
68225                 origNode = origNodes[node.id];
68226                 nearNodes[node.id] = angle;
68227
68228                 node = node.move(geoInterp(origNode.loc, loc, t));
68229                 graph = graph.replace(node);
68230             }
68231
68232             // add new inbetween nodes if necessary
68233             for (j = 0; j < numberNewPoints; j++) {
68234                 angle = startAngle + (indexRange + j) * eachAngle;
68235                 loc = projection.invert([
68236                     centroid[0] + Math.cos(angle) * radius,
68237                     centroid[1] + Math.sin(angle) * radius
68238                 ]);
68239
68240                 // choose a nearnode to use as the original
68241                 var min$$1 = Infinity;
68242                 for (var nodeId in nearNodes) {
68243                     var nearAngle = nearNodes[nodeId],
68244                         dist = Math.abs(nearAngle - angle);
68245                     if (dist < min$$1) {
68246                         dist = min$$1;
68247                         origNode = origNodes[nodeId];
68248                     }
68249                 }
68250
68251                 node = osmNode({ loc: geoInterp(origNode.loc, loc, t) });
68252                 graph = graph.replace(node);
68253
68254                 nodes.splice(endNodeIndex + j, 0, node);
68255                 inBetweenNodes.push(node.id);
68256             }
68257
68258             // Check for other ways that share these keyNodes..
68259             // If keyNodes are adjacent in both ways,
68260             // we can add inBetween nodes to that shared way too..
68261             if (indexRange === 1 && inBetweenNodes.length) {
68262                 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
68263                     endIndex1 = way.nodes.lastIndexOf(endNode.id),
68264                     wayDirection1 = (endIndex1 - startIndex1);
68265                 if (wayDirection1 < -1) { wayDirection1 = 1; }
68266
68267                 /* eslint-disable no-loop-func */
68268                 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
68269                     if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
68270                         var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
68271                             endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
68272                             wayDirection2 = (endIndex2 - startIndex2),
68273                             insertAt = endIndex2;
68274                         if (wayDirection2 < -1) { wayDirection2 = 1; }
68275
68276                         if (wayDirection1 !== wayDirection2) {
68277                             inBetweenNodes.reverse();
68278                             insertAt = startIndex2;
68279                         }
68280                         for (j = 0; j < inBetweenNodes.length; j++) {
68281                             sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
68282                         }
68283                         graph = graph.replace(sharedWay);
68284                     }
68285                 });
68286                 /* eslint-enable no-loop-func */
68287             }
68288
68289         }
68290
68291         // update the way to have all the new nodes
68292         ids = nodes.map(function(n) { return n.id; });
68293         ids.push(ids[0]);
68294
68295         way = way.update({nodes: ids});
68296         graph = graph.replace(way);
68297
68298         return graph;
68299     };
68300
68301
68302     action.makeConvex = function(graph) {
68303         var way = graph.entity(wayId),
68304             nodes = uniq(graph.childNodes(way)),
68305             points = nodes.map(function(n) { return projection(n.loc); }),
68306             sign = d3_polygonArea(points) > 0 ? 1 : -1,
68307             hull = d3_polygonHull(points);
68308
68309         // D3 convex hulls go counterclockwise..
68310         if (sign === -1) {
68311             nodes.reverse();
68312             points.reverse();
68313         }
68314
68315         for (var i = 0; i < hull.length - 1; i++) {
68316             var startIndex = points.indexOf(hull[i]),
68317                 endIndex = points.indexOf(hull[i+1]),
68318                 indexRange = (endIndex - startIndex);
68319
68320             if (indexRange < 0) {
68321                 indexRange += nodes.length;
68322             }
68323
68324             // move interior nodes to the surface of the convex hull..
68325             for (var j = 1; j < indexRange; j++) {
68326                 var point = geoInterp(hull[i], hull[i+1], j / indexRange),
68327                     node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
68328                 graph = graph.replace(node);
68329             }
68330         }
68331         return graph;
68332     };
68333
68334
68335     action.disabled = function(graph) {
68336         if (!graph.entity(wayId).isClosed())
68337             return 'not_closed';
68338     };
68339
68340
68341     action.transitionable = true;
68342
68343
68344     return action;
68345 }
68346
68347 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
68348 function actionDeleteWay(wayId) {
68349
68350
68351     function canDeleteNode(node, graph) {
68352         return !graph.parentWays(node).length &&
68353             !graph.parentRelations(node).length &&
68354             !node.hasInterestingTags();
68355     }
68356
68357
68358     var action = function(graph) {
68359         var way = graph.entity(wayId);
68360
68361         graph.parentRelations(way)
68362             .forEach(function(parent) {
68363                 parent = parent.removeMembersWithID(wayId);
68364                 graph = graph.replace(parent);
68365
68366                 if (parent.isDegenerate()) {
68367                     graph = actionDeleteRelation(parent.id)(graph);
68368                 }
68369             });
68370
68371         uniq(way.nodes).forEach(function(nodeId) {
68372             graph = graph.replace(way.removeNode(nodeId));
68373
68374             var node = graph.entity(nodeId);
68375             if (canDeleteNode(node, graph)) {
68376                 graph = graph.remove(node);
68377             }
68378         });
68379
68380         return graph.remove(way);
68381     };
68382
68383
68384     return action;
68385 }
68386
68387 function actionDeleteMultiple(ids) {
68388     var actions = {
68389         way: actionDeleteWay,
68390         node: actionDeleteNode,
68391         relation: actionDeleteRelation
68392     };
68393
68394
68395     var action = function(graph) {
68396         ids.forEach(function(id) {
68397             if (graph.hasEntity(id)) { // It may have been deleted aready.
68398                 graph = actions[graph.entity(id).type](id)(graph);
68399             }
68400         });
68401
68402         return graph;
68403     };
68404
68405
68406     return action;
68407 }
68408
68409 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
68410 function actionDeleteRelation(relationId) {
68411
68412
68413     function canDeleteEntity(entity, graph) {
68414         return !graph.parentWays(entity).length &&
68415             !graph.parentRelations(entity).length &&
68416             !entity.hasInterestingTags();
68417     }
68418
68419
68420     var action = function(graph) {
68421         var relation = graph.entity(relationId);
68422
68423         graph.parentRelations(relation)
68424             .forEach(function(parent) {
68425                 parent = parent.removeMembersWithID(relationId);
68426                 graph = graph.replace(parent);
68427
68428                 if (parent.isDegenerate()) {
68429                     graph = actionDeleteRelation(parent.id)(graph);
68430                 }
68431             });
68432
68433         uniq(map$4(relation.members, 'id')).forEach(function(memberId) {
68434             graph = graph.replace(relation.removeMembersWithID(memberId));
68435
68436             var entity = graph.entity(memberId);
68437             if (canDeleteEntity(entity, graph)) {
68438                 graph = actionDeleteMultiple([memberId])(graph);
68439             }
68440         });
68441
68442         return graph.remove(relation);
68443     };
68444
68445
68446     return action;
68447 }
68448
68449 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
68450 function actionDeleteNode(nodeId) {
68451     var action = function(graph) {
68452         var node = graph.entity(nodeId);
68453
68454         graph.parentWays(node)
68455             .forEach(function(parent) {
68456                 parent = parent.removeNode(nodeId);
68457                 graph = graph.replace(parent);
68458
68459                 if (parent.isDegenerate()) {
68460                     graph = actionDeleteWay(parent.id)(graph);
68461                 }
68462             });
68463
68464         graph.parentRelations(node)
68465             .forEach(function(parent) {
68466                 parent = parent.removeMembersWithID(nodeId);
68467                 graph = graph.replace(parent);
68468
68469                 if (parent.isDegenerate()) {
68470                     graph = actionDeleteRelation(parent.id)(graph);
68471                 }
68472             });
68473
68474         return graph.remove(node);
68475     };
68476
68477
68478     return action;
68479 }
68480
68481 // Connect the ways at the given nodes.
68482 //
68483 // The last node will survive. All other nodes will be replaced with
68484 // the surviving node in parent ways, and then removed.
68485 //
68486 // Tags and relation memberships of of non-surviving nodes are merged
68487 // to the survivor.
68488 //
68489 // This is the inverse of `iD.actionDisconnect`.
68490 //
68491 // Reference:
68492 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
68493 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
68494 //
68495 function actionConnect(nodeIds) {
68496     return function(graph) {
68497         var last = nodeIds[nodeIds.length - 1];
68498         var survivor = graph.entity(last);
68499
68500         for (var i = 0; i < nodeIds.length - 1; i++) {
68501             var node = graph.entity(nodeIds[i]);
68502
68503             /* eslint-disable no-loop-func */
68504             graph.parentWays(node).forEach(function(parent) {
68505                 if (!parent.areAdjacent(node.id, survivor.id)) {
68506                     graph = graph.replace(parent.replaceNode(node.id, survivor.id));
68507                 }
68508             });
68509
68510             graph.parentRelations(node).forEach(function(parent) {
68511                 graph = graph.replace(parent.replaceMember(node, survivor));
68512             });
68513             /* eslint-enable no-loop-func */
68514
68515             survivor = survivor.mergeTags(node.tags);
68516             graph = actionDeleteNode(node.id)(graph);
68517         }
68518
68519         graph = graph.replace(survivor);
68520
68521         return graph;
68522     };
68523 }
68524
68525 function actionCopyEntities(ids, fromGraph) {
68526     var copies = {};
68527
68528
68529     var action = function(graph) {
68530         ids.forEach(function(id) {
68531             fromGraph.entity(id).copy(fromGraph, copies);
68532         });
68533
68534         for (var id in copies) {
68535             graph = graph.replace(copies[id]);
68536         }
68537
68538         return graph;
68539     };
68540
68541
68542     action.copies = function() {
68543         return copies;
68544     };
68545
68546
68547     return action;
68548 }
68549
68550 function actionDeleteMember(relationId, memberIndex) {
68551     return function(graph) {
68552         var relation = graph.entity(relationId)
68553             .removeMember(memberIndex);
68554
68555         graph = graph.replace(relation);
68556
68557         if (relation.isDegenerate())
68558             graph = actionDeleteRelation(relation.id)(graph);
68559
68560         return graph;
68561     };
68562 }
68563
68564 function actionDeprecateTags(entityId) {
68565
68566     return function(graph) {
68567         var entity = graph.entity(entityId),
68568             newtags = clone(entity.tags),
68569             change = false,
68570             rule;
68571
68572         // This handles dataDeprecated tags with a single condition
68573         for (var i = 0; i < dataDeprecated.length; i++) {
68574
68575             rule = dataDeprecated[i];
68576             var match = toPairs(rule.old)[0],
68577                 replacements = rule.replace ? toPairs(rule.replace) : null;
68578
68579             if (entity.tags[match[0]] && match[1] === '*') {
68580
68581                 var value = entity.tags[match[0]];
68582                 if (replacements && !newtags[replacements[0][0]]) {
68583                     newtags[replacements[0][0]] = value;
68584                 }
68585                 delete newtags[match[0]];
68586                 change = true;
68587
68588             } else if (entity.tags[match[0]] === match[1]) {
68589                 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
68590                 change = true;
68591             }
68592         }
68593
68594         if (change) {
68595             return graph.replace(entity.update({tags: newtags}));
68596         } else {
68597             return graph;
68598         }
68599     };
68600 }
68601
68602 function actionDiscardTags(difference) {
68603
68604     return function(graph) {
68605         function discardTags(entity) {
68606             if (!isEmpty(entity.tags)) {
68607                 var tags = {};
68608                 forEach(entity.tags, function(v, k) {
68609                     if (v) tags[k] = v;
68610                 });
68611
68612                 graph = graph.replace(entity.update({
68613                     tags: omit(tags, dataDiscarded)
68614                 }));
68615             }
68616         }
68617
68618         difference.modified().forEach(discardTags);
68619         difference.created().forEach(discardTags);
68620
68621         return graph;
68622     };
68623 }
68624
68625 // Disconect the ways at the given node.
68626 //
68627 // Optionally, disconnect only the given ways.
68628 //
68629 // For testing convenience, accepts an ID to assign to the (first) new node.
68630 // Normally, this will be undefined and the way will automatically
68631 // be assigned a new ID.
68632 //
68633 // This is the inverse of `iD.actionConnect`.
68634 //
68635 // Reference:
68636 //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
68637 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
68638 //
68639 function actionDisconnect(nodeId, newNodeId) {
68640     var wayIds;
68641
68642
68643     var action = function(graph) {
68644         var node = graph.entity(nodeId),
68645             connections = action.connections(graph);
68646
68647         connections.forEach(function(connection) {
68648             var way = graph.entity(connection.wayID),
68649                 newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
68650
68651             graph = graph.replace(newNode);
68652             if (connection.index === 0 && way.isArea()) {
68653                 // replace shared node with shared node..
68654                 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
68655             } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
68656                 // replace closing node with new new node..
68657                 graph = graph.replace(way.unclose().addNode(newNode.id));
68658             } else {
68659                 // replace shared node with multiple new nodes..
68660                 graph = graph.replace(way.updateNode(newNode.id, connection.index));
68661             }
68662         });
68663
68664         return graph;
68665     };
68666
68667
68668     action.connections = function(graph) {
68669         var candidates = [],
68670             keeping = false,
68671             parentWays = graph.parentWays(graph.entity(nodeId));
68672
68673         parentWays.forEach(function(way) {
68674             if (wayIds && wayIds.indexOf(way.id) === -1) {
68675                 keeping = true;
68676                 return;
68677             }
68678             if (way.isArea() && (way.nodes[0] === nodeId)) {
68679                 candidates.push({ wayID: way.id, index: 0 });
68680             } else {
68681                 way.nodes.forEach(function(waynode, index) {
68682                     if (waynode === nodeId) {
68683                         candidates.push({ wayID: way.id, index: index });
68684                     }
68685                 });
68686             }
68687         });
68688
68689         return keeping ? candidates : candidates.slice(1);
68690     };
68691
68692
68693     action.disabled = function(graph) {
68694         var connections = action.connections(graph);
68695         if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
68696             return 'not_connected';
68697
68698         var parentWays = graph.parentWays(graph.entity(nodeId)),
68699             seenRelationIds = {},
68700             sharedRelation;
68701
68702         parentWays.forEach(function(way) {
68703             if (wayIds && wayIds.indexOf(way.id) === -1)
68704                 return;
68705
68706             var relations = graph.parentRelations(way);
68707             relations.forEach(function(relation) {
68708                 if (relation.id in seenRelationIds) {
68709                     sharedRelation = relation;
68710                 } else {
68711                     seenRelationIds[relation.id] = true;
68712                 }
68713             });
68714         });
68715
68716         if (sharedRelation)
68717             return 'relation';
68718     };
68719
68720
68721     action.limitWays = function(_) {
68722         if (!arguments.length) return wayIds;
68723         wayIds = _;
68724         return action;
68725     };
68726
68727
68728     return action;
68729 }
68730
68731 // Join ways at the end node they share.
68732 //
68733 // This is the inverse of `iD.actionSplit`.
68734 //
68735 // Reference:
68736 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
68737 //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
68738 //
68739 function actionJoin(ids) {
68740
68741     function groupEntitiesByGeometry(graph) {
68742         var entities = ids.map(function(id) { return graph.entity(id); });
68743         return assignIn$1({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
68744     }
68745
68746
68747     var action = function(graph) {
68748         var ways = ids.map(graph.entity, graph),
68749             survivor = ways[0];
68750
68751         // Prefer to keep an existing way.
68752         for (var i = 0; i < ways.length; i++) {
68753             if (!ways[i].isNew()) {
68754                 survivor = ways[i];
68755                 break;
68756             }
68757         }
68758
68759         var joined = osmJoinWays(ways, graph)[0];
68760
68761         survivor = survivor.update({nodes: map$4(joined.nodes, 'id')});
68762         graph = graph.replace(survivor);
68763
68764         joined.forEach(function(way) {
68765             if (way.id === survivor.id)
68766                 return;
68767
68768             graph.parentRelations(way).forEach(function(parent) {
68769                 graph = graph.replace(parent.replaceMember(way, survivor));
68770             });
68771
68772             survivor = survivor.mergeTags(way.tags);
68773
68774             graph = graph.replace(survivor);
68775             graph = actionDeleteWay(way.id)(graph);
68776         });
68777
68778         return graph;
68779     };
68780
68781
68782     action.disabled = function(graph) {
68783         var geometries = groupEntitiesByGeometry(graph);
68784         if (ids.length < 2 || ids.length !== geometries.line.length)
68785             return 'not_eligible';
68786
68787         var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
68788         if (joined.length > 1)
68789             return 'not_adjacent';
68790
68791         var nodeIds = map$4(joined[0].nodes, 'id').slice(1, -1),
68792             relation,
68793             tags = {},
68794             conflicting = false;
68795
68796         joined[0].forEach(function(way) {
68797             var parents = graph.parentRelations(way);
68798             parents.forEach(function(parent) {
68799                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
68800                     relation = parent;
68801             });
68802
68803             for (var k in way.tags) {
68804                 if (!(k in tags)) {
68805                     tags[k] = way.tags[k];
68806                 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
68807                     conflicting = true;
68808                 }
68809             }
68810         });
68811
68812         if (relation)
68813             return 'restriction';
68814
68815         if (conflicting)
68816             return 'conflicting_tags';
68817     };
68818
68819
68820     return action;
68821 }
68822
68823 function actionMerge(ids) {
68824
68825     function groupEntitiesByGeometry(graph) {
68826         var entities = ids.map(function(id) { return graph.entity(id); });
68827         return assignIn$1({point: [], area: [], line: [], relation: []},
68828             groupBy(entities, function(entity) { return entity.geometry(graph); }));
68829     }
68830
68831
68832     var action = function(graph) {
68833         var geometries = groupEntitiesByGeometry(graph),
68834             target = geometries.area[0] || geometries.line[0],
68835             points = geometries.point;
68836
68837         points.forEach(function(point) {
68838             target = target.mergeTags(point.tags);
68839             graph = graph.replace(target);
68840
68841             graph.parentRelations(point).forEach(function(parent) {
68842                 graph = graph.replace(parent.replaceMember(point, target));
68843             });
68844
68845             var nodes = uniq(graph.childNodes(target)),
68846                 removeNode = point;
68847
68848             for (var i = 0; i < nodes.length; i++) {
68849                 var node = nodes[i];
68850                 if (graph.parentWays(node).length > 1 ||
68851                     graph.parentRelations(node).length ||
68852                     node.hasInterestingTags()) {
68853                     continue;
68854                 }
68855
68856                 // Found an uninteresting child node on the target way.
68857                 // Move orig point into its place to preserve point's history. #3683
68858                 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
68859                 target = target.replaceNode(node.id, point.id);
68860                 graph = graph.replace(target);
68861                 removeNode = node;
68862                 break;
68863             }
68864
68865             graph = graph.remove(removeNode);
68866         });
68867
68868         return graph;
68869     };
68870
68871
68872     action.disabled = function(graph) {
68873         var geometries = groupEntitiesByGeometry(graph);
68874         if (geometries.point.length === 0 ||
68875             (geometries.area.length + geometries.line.length) !== 1 ||
68876             geometries.relation.length !== 0)
68877             return 'not_eligible';
68878     };
68879
68880
68881     return action;
68882 }
68883
68884 function actionMergePolygon(ids, newRelationId) {
68885
68886     function groupEntities(graph) {
68887         var entities = ids.map(function (id) { return graph.entity(id); });
68888         return assignIn$1({
68889                 closedWay: [],
68890                 multipolygon: [],
68891                 other: []
68892             }, groupBy(entities, function(entity) {
68893                 if (entity.type === 'way' && entity.isClosed()) {
68894                     return 'closedWay';
68895                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
68896                     return 'multipolygon';
68897                 } else {
68898                     return 'other';
68899                 }
68900             }));
68901     }
68902
68903
68904     var action = function(graph) {
68905         var entities = groupEntities(graph);
68906
68907         // An array representing all the polygons that are part of the multipolygon.
68908         //
68909         // Each element is itself an array of objects with an id property, and has a
68910         // locs property which is an array of the locations forming the polygon.
68911         var polygons = entities.multipolygon.reduce(function(polygons, m) {
68912             return polygons.concat(osmJoinWays(m.members, graph));
68913         }, []).concat(entities.closedWay.map(function(d) {
68914             var member = [{id: d.id}];
68915             member.nodes = graph.childNodes(d);
68916             return member;
68917         }));
68918
68919         // contained is an array of arrays of boolean values,
68920         // where contained[j][k] is true iff the jth way is
68921         // contained by the kth way.
68922         var contained = polygons.map(function(w, i) {
68923             return polygons.map(function(d, n) {
68924                 if (i === n) return null;
68925                 return geoPolygonContainsPolygon(
68926                     map$4(d.nodes, 'loc'),
68927                     map$4(w.nodes, 'loc'));
68928             });
68929         });
68930
68931         // Sort all polygons as either outer or inner ways
68932         var members = [],
68933             outer = true;
68934
68935         while (polygons.length) {
68936             extractUncontained(polygons);
68937             polygons = polygons.filter(isContained);
68938             contained = contained.filter(isContained).map(filterContained);
68939         }
68940
68941         function isContained(d, i) {
68942             return some(contained[i]);
68943         }
68944
68945         function filterContained(d) {
68946             return d.filter(isContained);
68947         }
68948
68949         function extractUncontained(polygons) {
68950             polygons.forEach(function(d, i) {
68951                 if (!isContained(d, i)) {
68952                     d.forEach(function(member) {
68953                         members.push({
68954                             type: 'way',
68955                             id: member.id,
68956                             role: outer ? 'outer' : 'inner'
68957                         });
68958                     });
68959                 }
68960             });
68961             outer = !outer;
68962         }
68963
68964         // Move all tags to one relation
68965         var relation = entities.multipolygon[0] ||
68966             osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
68967
68968         entities.multipolygon.slice(1).forEach(function(m) {
68969             relation = relation.mergeTags(m.tags);
68970             graph = graph.remove(m);
68971         });
68972
68973         entities.closedWay.forEach(function(way) {
68974             function isThisOuter(m) {
68975                 return m.id === way.id && m.role !== 'inner';
68976             }
68977             if (members.some(isThisOuter)) {
68978                 relation = relation.mergeTags(way.tags);
68979                 graph = graph.replace(way.update({ tags: {} }));
68980             }
68981         });
68982
68983         return graph.replace(relation.update({
68984             members: members,
68985             tags: omit(relation.tags, 'area')
68986         }));
68987     };
68988
68989
68990     action.disabled = function(graph) {
68991         var entities = groupEntities(graph);
68992         if (entities.other.length > 0 ||
68993             entities.closedWay.length + entities.multipolygon.length < 2)
68994             return 'not_eligible';
68995         if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
68996             return 'incomplete_relation';
68997     };
68998
68999
69000     return action;
69001 }
69002
69003 // Copyright (c) 2006, 2008 Tony Garnock-Jones <tonyg@lshift.net>
69004 // Copyright (c) 2006, 2008 LShift Ltd. <query@lshift.net>
69005 //
69006 // Permission is hereby granted, free of charge, to any person
69007 // obtaining a copy of this software and associated documentation files
69008 // (the "Software"), to deal in the Software without restriction,
69009 // including without limitation the rights to use, copy, modify, merge,
69010 // publish, distribute, sublicense, and/or sell copies of the Software,
69011 // and to permit persons to whom the Software is furnished to do so,
69012 // subject to the following conditions:
69013 //
69014 // The above copyright notice and this permission notice shall be
69015 // included in all copies or substantial portions of the Software.
69016 //
69017 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
69018 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
69019 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
69020 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
69021 // BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
69022 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
69023 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
69024 // SOFTWARE.
69025
69026 // source:  https://bitbucket.org/lshift/synchrotron/src
69027 function longest_common_subsequence(file1, file2) {
69028     /* Text diff algorithm following Hunt and McIlroy 1976.
69029      * J. W. Hunt and M. D. McIlroy, An algorithm for differential file
69030      * comparison, Bell Telephone Laboratories CSTR #41 (1976)
69031      * http://www.cs.dartmouth.edu/~doug/
69032      *
69033      * Expects two arrays of strings.
69034      */
69035     var equivalenceClasses;
69036     var file2indices;
69037     var newCandidate;
69038     var candidates;
69039     var line;
69040     var c, i, j, jX, r, s;
69041
69042     equivalenceClasses = {};
69043     for (j = 0; j < file2.length; j++) {
69044         line = file2[j];
69045         if (equivalenceClasses[line]) {
69046             equivalenceClasses[line].push(j);
69047         } else {
69048             equivalenceClasses[line] = [j];
69049         }
69050     }
69051
69052     candidates = [{file1index: -1,
69053                    file2index: -1,
69054                    chain: null}];
69055
69056     for (i = 0; i < file1.length; i++) {
69057         line = file1[i];
69058         file2indices = equivalenceClasses[line] || [];
69059
69060         r = 0;
69061         c = candidates[0];
69062
69063         for (jX = 0; jX < file2indices.length; jX++) {
69064             j = file2indices[jX];
69065
69066             for (s = 0; s < candidates.length; s++) {
69067                 if ((candidates[s].file2index < j) &&
69068                     ((s === candidates.length - 1) ||
69069                      (candidates[s + 1].file2index > j)))
69070                     break;
69071             }
69072
69073             if (s < candidates.length) {
69074                 newCandidate = {file1index: i,
69075                                 file2index: j,
69076                                 chain: candidates[s]};
69077                 if (r === candidates.length) {
69078                     candidates.push(c);
69079                 } else {
69080                     candidates[r] = c;
69081                 }
69082                 r = s + 1;
69083                 c = newCandidate;
69084                 if (r === candidates.length) {
69085                     break; // no point in examining further (j)s
69086                 }
69087             }
69088         }
69089
69090         candidates[r] = c;
69091     }
69092
69093     // At this point, we know the LCS: it's in the reverse of the
69094     // linked-list through .chain of
69095     // candidates[candidates.length - 1].
69096
69097     return candidates[candidates.length - 1];
69098 }
69099
69100
69101
69102
69103
69104
69105
69106
69107
69108
69109
69110 function diff_indices(file1, file2) {
69111     // We apply the LCS to give a simple representation of the
69112     // offsets and lengths of mismatched chunks in the input
69113     // files. This is used by diff3_merge_indices below.
69114
69115     var result = [];
69116     var tail1 = file1.length;
69117     var tail2 = file2.length;
69118
69119     for (var candidate = longest_common_subsequence(file1, file2);
69120          candidate !== null;
69121          candidate = candidate.chain)
69122     {
69123         var mismatchLength1 = tail1 - candidate.file1index - 1;
69124         var mismatchLength2 = tail2 - candidate.file2index - 1;
69125         tail1 = candidate.file1index;
69126         tail2 = candidate.file2index;
69127
69128         if (mismatchLength1 || mismatchLength2) {
69129             result.push({file1: [tail1 + 1, mismatchLength1],
69130                          file2: [tail2 + 1, mismatchLength2]});
69131         }
69132     }
69133
69134     result.reverse();
69135     return result;
69136 }
69137
69138 function diff3_merge_indices (a, o, b) {
69139     // Given three files, A, O, and B, where both A and B are
69140     // independently derived from O, returns a fairly complicated
69141     // internal representation of merge decisions it's taken. The
69142     // interested reader may wish to consult
69143     //
69144     // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce. "A
69145     // Formal Investigation of Diff3." In Arvind and Prasad,
69146     // editors, Foundations of Software Technology and Theoretical
69147     // Computer Science (FSTTCS), December 2007.
69148     //
69149     // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
69150     var i;
69151
69152     var m1 = diff_indices(o, a);
69153     var m2 = diff_indices(o, b);
69154
69155     var hunks = [];
69156     function addHunk(h, side) {
69157         hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
69158     }
69159     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
69160     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
69161     hunks.sort();
69162
69163     var result = [];
69164     var commonOffset = 0;
69165     function copyCommon(targetOffset) {
69166         if (targetOffset > commonOffset) {
69167             result.push([1, commonOffset, targetOffset - commonOffset]);
69168             commonOffset = targetOffset;
69169         }
69170     }
69171
69172     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
69173         var firstHunkIndex = hunkIndex;
69174         var hunk = hunks[hunkIndex];
69175         var regionLhs = hunk[0];
69176         var regionRhs = regionLhs + hunk[2];
69177         while (hunkIndex < hunks.length - 1) {
69178             var maybeOverlapping = hunks[hunkIndex + 1];
69179             var maybeLhs = maybeOverlapping[0];
69180             if (maybeLhs > regionRhs) break;
69181             regionRhs = maybeLhs + maybeOverlapping[2];
69182             hunkIndex++;
69183         }
69184
69185         copyCommon(regionLhs);
69186         if (firstHunkIndex === hunkIndex) {
69187     // The "overlap" was only one hunk long, meaning that
69188     // there's no conflict here. Either a and o were the
69189     // same, or b and o were the same.
69190             if (hunk[4] > 0) {
69191                 result.push([hunk[1], hunk[3], hunk[4]]);
69192             }
69193         } else {
69194     // A proper conflict. Determine the extents of the
69195     // regions involved from a, o and b. Effectively merge
69196     // all the hunks on the left into one giant hunk, and
69197     // do the same for the right; then, correct for skew
69198     // in the regions of o that each side changed, and
69199     // report appropriate spans for the three sides.
69200     var regions = {
69201         0: [a.length, -1, o.length, -1],
69202         2: [b.length, -1, o.length, -1]
69203     };
69204             for (i = firstHunkIndex; i <= hunkIndex; i++) {
69205         hunk = hunks[i];
69206                 var side = hunk[1];
69207         var r = regions[side];
69208         var oLhs = hunk[0];
69209         var oRhs = oLhs + hunk[2];
69210                 var abLhs = hunk[3];
69211                 var abRhs = abLhs + hunk[4];
69212         r[0] = Math.min(abLhs, r[0]);
69213         r[1] = Math.max(abRhs, r[1]);
69214         r[2] = Math.min(oLhs, r[2]);
69215         r[3] = Math.max(oRhs, r[3]);
69216             }
69217     var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
69218     var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
69219     var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
69220     var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
69221             result.push([-1,
69222              aLhs,      aRhs      - aLhs,
69223              regionLhs, regionRhs - regionLhs,
69224              bLhs,      bRhs      - bLhs]);
69225         }
69226         commonOffset = regionRhs;
69227     }
69228
69229     copyCommon(o.length);
69230     return result;
69231 }
69232
69233 function diff3_merge (a, o, b, excludeFalseConflicts) {
69234     // Applies the output of Diff3.diff3_merge_indices to actually
69235     // construct the merged file; the returned result alternates
69236     // between "ok" and "conflict" blocks.
69237
69238     var result = [];
69239     var files = [a, o, b];
69240     var indices = diff3_merge_indices(a, o, b);
69241
69242     var okLines = [];
69243     function flushOk() {
69244         if (okLines.length) {
69245             result.push({ok: okLines});
69246         }
69247         okLines = [];
69248     }
69249     function pushOk(xs) {
69250         for (var j = 0; j < xs.length; j++) {
69251             okLines.push(xs[j]);
69252         }
69253     }
69254
69255     function isTrueConflict(rec) {
69256         if (rec[2] !== rec[6]) return true;
69257         var aoff = rec[1];
69258         var boff = rec[5];
69259         for (var j = 0; j < rec[2]; j++) {
69260             if (a[j + aoff] !== b[j + boff]) return true;
69261         }
69262         return false;
69263     }
69264
69265     for (var i = 0; i < indices.length; i++) {
69266         var x = indices[i];
69267         var side = x[0];
69268         if (side === -1) {
69269             if (excludeFalseConflicts && !isTrueConflict(x)) {
69270                 pushOk(files[0].slice(x[1], x[1] + x[2]));
69271             } else {
69272                 flushOk();
69273                 result.push({conflict: {a: a.slice(x[1], x[1] + x[2]),
69274                                         aIndex: x[1],
69275                                         o: o.slice(x[3], x[3] + x[4]),
69276                                         oIndex: x[3],
69277                                         b: b.slice(x[5], x[5] + x[6]),
69278                                         bIndex: x[5]}});
69279             }
69280         } else {
69281             pushOk(files[side].slice(x[1], x[1] + x[2]));
69282         }
69283     }
69284
69285     flushOk();
69286     return result;
69287 }
69288
69289 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
69290     var option = 'safe',  // 'safe', 'force_local', 'force_remote'
69291         conflicts = [];
69292
69293
69294     function user(d) {
69295         return isFunction(formatUser) ? formatUser(d) : d;
69296     }
69297
69298
69299     function mergeLocation(remote, target) {
69300         function pointEqual(a, b) {
69301             var epsilon = 1e-6;
69302             return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
69303         }
69304
69305         if (option === 'force_local' || pointEqual(target.loc, remote.loc)) {
69306             return target;
69307         }
69308         if (option === 'force_remote') {
69309             return target.update({loc: remote.loc});
69310         }
69311
69312         conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
69313         return target;
69314     }
69315
69316
69317     function mergeNodes(base, remote, target) {
69318         if (option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
69319             return target;
69320         }
69321         if (option === 'force_remote') {
69322             return target.update({nodes: remote.nodes});
69323         }
69324
69325         var ccount = conflicts.length,
69326             o = base.nodes || [],
69327             a = target.nodes || [],
69328             b = remote.nodes || [],
69329             nodes = [],
69330             hunks = diff3_merge(a, o, b, true);
69331
69332         for (var i = 0; i < hunks.length; i++) {
69333             var hunk = hunks[i];
69334             if (hunk.ok) {
69335                 nodes.push.apply(nodes, hunk.ok);
69336             } else {
69337                 // for all conflicts, we can assume c.a !== c.b
69338                 // because `diff3_merge` called with `true` option to exclude false conflicts..
69339                 var c = hunk.conflict;
69340                 if (isEqual(c.o, c.a)) {  // only changed remotely
69341                     nodes.push.apply(nodes, c.b);
69342                 } else if (isEqual(c.o, c.b)) {  // only changed locally
69343                     nodes.push.apply(nodes, c.a);
69344                 } else {       // changed both locally and remotely
69345                     conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
69346                     break;
69347                 }
69348             }
69349         }
69350
69351         return (conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
69352     }
69353
69354
69355     function mergeChildren(targetWay, children, updates, graph) {
69356         function isUsed(node, targetWay) {
69357             var parentWays = map$4(graph.parentWays(node), 'id');
69358             return node.hasInterestingTags() ||
69359                 without(parentWays, targetWay.id).length > 0 ||
69360                 graph.parentRelations(node).length > 0;
69361         }
69362
69363         var ccount = conflicts.length;
69364
69365         for (var i = 0; i < children.length; i++) {
69366             var id = children[i],
69367                 node = graph.hasEntity(id);
69368
69369             // remove unused childNodes..
69370             if (targetWay.nodes.indexOf(id) === -1) {
69371                 if (node && !isUsed(node, targetWay)) {
69372                     updates.removeIds.push(id);
69373                 }
69374                 continue;
69375             }
69376
69377             // restore used childNodes..
69378             var local = localGraph.hasEntity(id),
69379                 remote = remoteGraph.hasEntity(id),
69380                 target;
69381
69382             if (option === 'force_remote' && remote && remote.visible) {
69383                 updates.replacements.push(remote);
69384
69385             } else if (option === 'force_local' && local) {
69386                 target = osmEntity$$1(local);
69387                 if (remote) {
69388                     target = target.update({ version: remote.version });
69389                 }
69390                 updates.replacements.push(target);
69391
69392             } else if (option === 'safe' && local && remote && local.version !== remote.version) {
69393                 target = osmEntity$$1(local, { version: remote.version });
69394                 if (remote.visible) {
69395                     target = mergeLocation(remote, target);
69396                 } else {
69397                     conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
69398                 }
69399
69400                 if (conflicts.length !== ccount) break;
69401                 updates.replacements.push(target);
69402             }
69403         }
69404
69405         return targetWay;
69406     }
69407
69408
69409     function updateChildren(updates, graph) {
69410         for (var i = 0; i < updates.replacements.length; i++) {
69411             graph = graph.replace(updates.replacements[i]);
69412         }
69413         if (updates.removeIds.length) {
69414             graph = actionDeleteMultiple(updates.removeIds)(graph);
69415         }
69416         return graph;
69417     }
69418
69419
69420     function mergeMembers(remote, target) {
69421         if (option === 'force_local' || isEqual(target.members, remote.members)) {
69422             return target;
69423         }
69424         if (option === 'force_remote') {
69425             return target.update({members: remote.members});
69426         }
69427
69428         conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
69429         return target;
69430     }
69431
69432
69433     function mergeTags(base, remote, target) {
69434         function ignoreKey(k) {
69435             return includes(dataDiscarded, k);
69436         }
69437
69438         if (option === 'force_local' || isEqual(target.tags, remote.tags)) {
69439             return target;
69440         }
69441         if (option === 'force_remote') {
69442             return target.update({tags: remote.tags});
69443         }
69444
69445         var ccount = conflicts.length,
69446             o = base.tags || {},
69447             a = target.tags || {},
69448             b = remote.tags || {},
69449             keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey),
69450             tags = clone(a),
69451             changed = false;
69452
69453         for (var i = 0; i < keys.length; i++) {
69454             var k = keys[i];
69455
69456             if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
69457                 if (o[k] !== a[k]) {      // changed locally..
69458                     conflicts.push(t('merge_remote_changes.conflict.tags',
69459                         { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
69460
69461                 } else {                  // unchanged locally, accept remote change..
69462                     if (b.hasOwnProperty(k)) {
69463                         tags[k] = b[k];
69464                     } else {
69465                         delete tags[k];
69466                     }
69467                     changed = true;
69468                 }
69469             }
69470         }
69471
69472         return (changed && conflicts.length === ccount) ? target.update({tags: tags}) : target;
69473     }
69474
69475
69476     //  `graph.base()` is the common ancestor of the two graphs.
69477     //  `localGraph` contains user's edits up to saving
69478     //  `remoteGraph` contains remote edits to modified nodes
69479     //  `graph` must be a descendent of `localGraph` and may include
69480     //      some conflict resolution actions performed on it.
69481     //
69482     //                  --- ... --- `localGraph` -- ... -- `graph`
69483     //                 /
69484     //  `graph.base()` --- ... --- `remoteGraph`
69485     //
69486     var action = function(graph) {
69487         var updates = { replacements: [], removeIds: [] },
69488             base = graph.base().entities[id],
69489             local = localGraph.entity(id),
69490             remote = remoteGraph.entity(id),
69491             target = osmEntity$$1(local, { version: remote.version });
69492
69493         // delete/undelete
69494         if (!remote.visible) {
69495             if (option === 'force_remote') {
69496                 return actionDeleteMultiple([id])(graph);
69497
69498             } else if (option === 'force_local') {
69499                 if (target.type === 'way') {
69500                     target = mergeChildren(target, uniq(local.nodes), updates, graph);
69501                     graph = updateChildren(updates, graph);
69502                 }
69503                 return graph.replace(target);
69504
69505             } else {
69506                 conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
69507                 return graph;  // do nothing
69508             }
69509         }
69510
69511         // merge
69512         if (target.type === 'node') {
69513             target = mergeLocation(remote, target);
69514
69515         } else if (target.type === 'way') {
69516             // pull in any child nodes that may not be present locally..
69517             graph.rebase(remoteGraph.childNodes(remote), [graph], false);
69518             target = mergeNodes(base, remote, target);
69519             target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
69520
69521         } else if (target.type === 'relation') {
69522             target = mergeMembers(remote, target);
69523         }
69524
69525         target = mergeTags(base, remote, target);
69526
69527         if (!conflicts.length) {
69528             graph = updateChildren(updates, graph).replace(target);
69529         }
69530
69531         return graph;
69532     };
69533
69534
69535     action.withOption = function(opt) {
69536         option = opt;
69537         return action;
69538     };
69539
69540
69541     action.conflicts = function() {
69542         return conflicts;
69543     };
69544
69545
69546     return action;
69547 }
69548
69549 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
69550 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
69551 function actionMove(moveIds, tryDelta, projection, cache) {
69552     var delta = tryDelta;
69553
69554     function vecAdd(a, b) { return [a[0] + b[0], a[1] + b[1]]; }
69555     function vecSub(a, b) { return [a[0] - b[0], a[1] - b[1]]; }
69556
69557     function setupCache(graph) {
69558         function canMove(nodeId) {
69559             // Allow movement of any node that is in the selectedIDs list..
69560             if (moveIds.indexOf(nodeId) !== -1) return true;
69561
69562             // Allow movement of a vertex where 2 ways meet..
69563             var parents = map$4(graph.parentWays(graph.entity(nodeId)), 'id');
69564             if (parents.length < 3) return true;
69565
69566             // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
69567             var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
69568             if (!parentsMoving) delete cache.moving[nodeId];
69569
69570             return parentsMoving;
69571         }
69572
69573         function cacheEntities(ids) {
69574             ids.forEach(function(id) {
69575                 if (cache.moving[id]) return;
69576                 cache.moving[id] = true;
69577
69578                 var entity = graph.hasEntity(id);
69579                 if (!entity) return;
69580
69581                 if (entity.type === 'node') {
69582                     cache.nodes.push(id);
69583                     cache.startLoc[id] = entity.loc;
69584                 } else if (entity.type === 'way') {
69585                     cache.ways.push(id);
69586                     cacheEntities(entity.nodes);
69587                 } else {
69588                     cacheEntities(entity.members.map(function(member) {
69589                         return member.id;
69590                     }));
69591                 }
69592             });
69593         }
69594
69595         function cacheIntersections(ids) {
69596             function isEndpoint(way, id) { return !way.isClosed() && !!way.affix(id); }
69597
69598             ids.forEach(function(id) {
69599                 // consider only intersections with 1 moved and 1 unmoved way.
69600                 var childNodes = graph.childNodes(graph.entity(id));
69601                 childNodes.forEach(function(node) {
69602                     var parents = graph.parentWays(node);
69603                     if (parents.length !== 2) return;
69604
69605                     var moved = graph.entity(id),
69606                         unmoved = find$1(parents, function(way) { return !cache.moving[way.id]; });
69607                     if (!unmoved) return;
69608
69609                     // exclude ways that are overly connected..
69610                     if (intersection(moved.nodes, unmoved.nodes).length > 2) return;
69611
69612                     if (moved.isArea() || unmoved.isArea()) return;
69613
69614                     cache.intersection[node.id] = {
69615                         nodeId: node.id,
69616                         movedId: moved.id,
69617                         unmovedId: unmoved.id,
69618                         movedIsEP: isEndpoint(moved, node.id),
69619                         unmovedIsEP: isEndpoint(unmoved, node.id)
69620                     };
69621                 });
69622             });
69623         }
69624
69625
69626         if (!cache) {
69627             cache = {};
69628         }
69629         if (!cache.ok) {
69630             cache.moving = {};
69631             cache.intersection = {};
69632             cache.replacedVertex = {};
69633             cache.startLoc = {};
69634             cache.nodes = [];
69635             cache.ways = [];
69636
69637             cacheEntities(moveIds);
69638             cacheIntersections(cache.ways);
69639             cache.nodes = filter(cache.nodes, canMove);
69640
69641             cache.ok = true;
69642         }
69643     }
69644
69645
69646     // Place a vertex where the moved vertex used to be, to preserve way shape..
69647     function replaceMovedVertex(nodeId, wayId, graph, delta) {
69648         var way = graph.entity(wayId),
69649             moved = graph.entity(nodeId),
69650             movedIndex = way.nodes.indexOf(nodeId),
69651             len, prevIndex, nextIndex;
69652
69653         if (way.isClosed()) {
69654             len = way.nodes.length - 1;
69655             prevIndex = (movedIndex + len - 1) % len;
69656             nextIndex = (movedIndex + len + 1) % len;
69657         } else {
69658             len = way.nodes.length;
69659             prevIndex = movedIndex - 1;
69660             nextIndex = movedIndex + 1;
69661         }
69662
69663         var prev = graph.hasEntity(way.nodes[prevIndex]),
69664             next = graph.hasEntity(way.nodes[nextIndex]);
69665
69666         // Don't add orig vertex at endpoint..
69667         if (!prev || !next) return graph;
69668
69669         var key = wayId + '_' + nodeId,
69670             orig = cache.replacedVertex[key];
69671         if (!orig) {
69672             orig = osmNode();
69673             cache.replacedVertex[key] = orig;
69674             cache.startLoc[orig.id] = cache.startLoc[nodeId];
69675         }
69676
69677         var start, end;
69678         if (delta) {
69679             start = projection(cache.startLoc[nodeId]);
69680             end = projection.invert(vecAdd(start, delta));
69681         } else {
69682             end = cache.startLoc[nodeId];
69683         }
69684         orig = orig.move(end);
69685
69686         var angle = Math.abs(geoAngle(orig, prev, projection) -
69687                 geoAngle(orig, next, projection)) * 180 / Math.PI;
69688
69689         // Don't add orig vertex if it would just make a straight line..
69690         if (angle > 175 && angle < 185) return graph;
69691
69692         // Don't add orig vertex if another point is already nearby (within 10m)
69693         if (geoSphericalDistance(prev.loc, orig.loc) < 10 ||
69694             geoSphericalDistance(orig.loc, next.loc) < 10) return graph;
69695
69696         // moving forward or backward along way?
69697         var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection),
69698             p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection),
69699             d1 = geoPathLength(p1),
69700             d2 = geoPathLength(p2),
69701             insertAt = (d1 < d2) ? movedIndex : nextIndex;
69702
69703         // moving around closed loop?
69704         if (way.isClosed() && insertAt === 0) insertAt = len;
69705
69706         way = way.addNode(orig.id, insertAt);
69707         return graph.replace(orig).replace(way);
69708     }
69709
69710
69711     // Reorder nodes around intersections that have moved..
69712     function unZorroIntersection(intersection$$1, graph) {
69713         var vertex = graph.entity(intersection$$1.nodeId),
69714             way1 = graph.entity(intersection$$1.movedId),
69715             way2 = graph.entity(intersection$$1.unmovedId),
69716             isEP1 = intersection$$1.movedIsEP,
69717             isEP2 = intersection$$1.unmovedIsEP;
69718
69719         // don't move the vertex if it is the endpoint of both ways.
69720         if (isEP1 && isEP2) return graph;
69721
69722         var nodes1 = without(graph.childNodes(way1), vertex),
69723             nodes2 = without(graph.childNodes(way2), vertex);
69724
69725         if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
69726         if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
69727
69728         var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection),
69729             edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection),
69730             loc;
69731
69732         // snap vertex to nearest edge (or some point between them)..
69733         if (!isEP1 && !isEP2) {
69734             var epsilon = 1e-4, maxIter = 10;
69735             for (var i = 0; i < maxIter; i++) {
69736                 loc = geoInterp(edge1.loc, edge2.loc, 0.5);
69737                 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
69738                 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
69739                 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
69740             }
69741         } else if (!isEP1) {
69742             loc = edge1.loc;
69743         } else {
69744             loc = edge2.loc;
69745         }
69746
69747         graph = graph.replace(vertex.move(loc));
69748
69749         // if zorro happened, reorder nodes..
69750         if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
69751             way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
69752             graph = graph.replace(way1);
69753         }
69754         if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
69755             way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
69756             graph = graph.replace(way2);
69757         }
69758
69759         return graph;
69760     }
69761
69762
69763     function cleanupIntersections(graph) {
69764         forEach(cache.intersection, function(obj) {
69765             graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, delta);
69766             graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
69767             graph = unZorroIntersection(obj, graph);
69768         });
69769
69770         return graph;
69771     }
69772
69773
69774     // check if moving way endpoint can cross an unmoved way, if so limit delta..
69775     function limitDelta(graph) {
69776         forEach(cache.intersection, function(obj) {
69777             // Don't limit movement if this is vertex joins 2 endpoints..
69778             if (obj.movedIsEP && obj.unmovedIsEP) return;
69779             // Don't limit movement if this vertex is not an endpoint anyway..
69780             if (!obj.movedIsEP) return;
69781
69782             var node = graph.entity(obj.nodeId),
69783                 start = projection(node.loc),
69784                 end = vecAdd(start, delta),
69785                 movedNodes = graph.childNodes(graph.entity(obj.movedId)),
69786                 movedPath = map$4(map$4(movedNodes, 'loc'),
69787                     function(loc) { return vecAdd(projection(loc), delta); }),
69788                 unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId)),
69789                 unmovedPath = map$4(map$4(unmovedNodes, 'loc'), projection),
69790                 hits = geoPathIntersections(movedPath, unmovedPath);
69791
69792             for (var i = 0; i < hits.length; i++) {
69793                 if (isEqual(hits[i], end)) continue;
69794                 var edge = geoChooseEdge(unmovedNodes, end, projection);
69795                 delta = vecSub(projection(edge.loc), start);
69796             }
69797         });
69798     }
69799
69800
69801     var action = function(graph) {
69802         if (delta[0] === 0 && delta[1] === 0) return graph;
69803
69804         setupCache(graph);
69805
69806         if (!isEmpty(cache.intersection)) {
69807             limitDelta(graph);
69808         }
69809
69810         forEach(cache.nodes, function(id) {
69811             var node = graph.entity(id),
69812                 start = projection(node.loc),
69813                 end = vecAdd(start, delta);
69814             graph = graph.replace(node.move(projection.invert(end)));
69815         });
69816
69817         if (!isEmpty(cache.intersection)) {
69818             graph = cleanupIntersections(graph);
69819         }
69820
69821         return graph;
69822     };
69823
69824
69825     action.delta = function() {
69826         return delta;
69827     };
69828
69829
69830     return action;
69831 }
69832
69833 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
69834 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
69835 function actionMoveNode(nodeId, loc) {
69836     return function(graph) {
69837         return graph.replace(graph.entity(nodeId).move(loc));
69838     };
69839 }
69840
69841 function actionNoop() {
69842     return function(graph) {
69843         return graph;
69844     };
69845 }
69846
69847 /*
69848  * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
69849  */
69850 function actionOrthogonalize(wayId, projection) {
69851     var threshold = 12, // degrees within right or straight to alter
69852         lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
69853         upperThreshold = Math.cos(threshold * Math.PI / 180);
69854
69855
69856     var action = function(graph, t) {
69857         if (t === null || !isFinite(t)) t = 1;
69858         t = Math.min(Math.max(+t, 0), 1);
69859
69860         var way = graph.entity(wayId),
69861             nodes = graph.childNodes(way),
69862             points = uniq(nodes).map(function(n) { return projection(n.loc); }),
69863             corner = {i: 0, dotp: 1},
69864             epsilon = 1e-4,
69865             node, loc, score, motions, i, j;
69866
69867         if (points.length === 3) {   // move only one vertex for right triangle
69868             for (i = 0; i < 1000; i++) {
69869                 motions = points.map(calcMotion);
69870                 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
69871                 score = corner.dotp;
69872                 if (score < epsilon) {
69873                     break;
69874                 }
69875             }
69876
69877             node = graph.entity(nodes[corner.i].id);
69878             loc = projection.invert(points[corner.i]);
69879             graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
69880
69881         } else {
69882             var best,
69883                 originalPoints = clone(points);
69884             score = Infinity;
69885
69886             for (i = 0; i < 1000; i++) {
69887                 motions = points.map(calcMotion);
69888                 for (j = 0; j < motions.length; j++) {
69889                     points[j] = addPoints(points[j],motions[j]);
69890                 }
69891                 var newScore = squareness(points);
69892                 if (newScore < score) {
69893                     best = clone(points);
69894                     score = newScore;
69895                 }
69896                 if (score < epsilon) {
69897                     break;
69898                 }
69899             }
69900
69901             points = best;
69902
69903             for (i = 0; i < points.length; i++) {
69904                 // only move the points that actually moved
69905                 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
69906                     loc = projection.invert(points[i]);
69907                     node = graph.entity(nodes[i].id);
69908                     graph = graph.replace(node.move(geoInterp(node.loc, loc, t)));
69909                 }
69910             }
69911
69912             // remove empty nodes on straight sections
69913             for (i = 0; t === 1 && i < points.length; i++) {
69914                 node = graph.entity(nodes[i].id);
69915
69916                 if (graph.parentWays(node).length > 1 ||
69917                     graph.parentRelations(node).length ||
69918                     node.hasInterestingTags()) {
69919                     continue;
69920                 }
69921
69922                 var dotp = normalizedDotProduct(i, points);
69923                 if (dotp < -1 + epsilon) {
69924                     graph = actionDeleteNode(node.id)(graph);
69925                 }
69926             }
69927         }
69928
69929         return graph;
69930
69931
69932         function calcMotion(b, i, array) {
69933             var a = array[(i - 1 + array.length) % array.length],
69934                 c = array[(i + 1) % array.length],
69935                 p = subtractPoints(a, b),
69936                 q = subtractPoints(c, b),
69937                 scale, dotp;
69938
69939             scale = 2 * Math.min(geoEuclideanDistance(p, [0, 0]), geoEuclideanDistance(q, [0, 0]));
69940             p = normalizePoint(p, 1.0);
69941             q = normalizePoint(q, 1.0);
69942
69943             dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
69944
69945             // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
69946             if (array.length > 3) {
69947                 if (dotp < -0.707106781186547) {
69948                     dotp += 1.0;
69949                 }
69950             } else if (dotp && Math.abs(dotp) < corner.dotp) {
69951                 corner.i = i;
69952                 corner.dotp = Math.abs(dotp);
69953             }
69954
69955             return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
69956         }
69957     };
69958
69959
69960     function squareness(points) {
69961         return points.reduce(function(sum, val, i, array) {
69962             var dotp = normalizedDotProduct(i, array);
69963
69964             dotp = filterDotProduct(dotp);
69965             return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
69966         }, 0);
69967     }
69968
69969
69970     function normalizedDotProduct(i, points) {
69971         var a = points[(i - 1 + points.length) % points.length],
69972             b = points[i],
69973             c = points[(i + 1) % points.length],
69974             p = subtractPoints(a, b),
69975             q = subtractPoints(c, b);
69976
69977         p = normalizePoint(p, 1.0);
69978         q = normalizePoint(q, 1.0);
69979
69980         return p[0] * q[0] + p[1] * q[1];
69981     }
69982
69983
69984     function subtractPoints(a, b) {
69985         return [a[0] - b[0], a[1] - b[1]];
69986     }
69987
69988
69989     function addPoints(a, b) {
69990         return [a[0] + b[0], a[1] + b[1]];
69991     }
69992
69993
69994     function normalizePoint(point, scale) {
69995         var vector = [0, 0];
69996         var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
69997         if (length !== 0) {
69998             vector[0] = point[0] / length;
69999             vector[1] = point[1] / length;
70000         }
70001
70002         vector[0] *= scale;
70003         vector[1] *= scale;
70004
70005         return vector;
70006     }
70007
70008
70009     function filterDotProduct(dotp) {
70010         if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
70011             return dotp;
70012         }
70013
70014         return 0;
70015     }
70016
70017
70018     action.disabled = function(graph) {
70019         var way = graph.entity(wayId),
70020             nodes = graph.childNodes(way),
70021             points = uniq(nodes).map(function(n) { return projection(n.loc); });
70022
70023         if (squareness(points)) {
70024             return false;
70025         }
70026
70027         return 'not_squarish';
70028     };
70029
70030
70031     action.transitionable = true;
70032
70033
70034     return action;
70035 }
70036
70037 // Split a way at the given node.
70038 //
70039 // Optionally, split only the given ways, if multiple ways share
70040 // the given node.
70041 //
70042 // This is the inverse of `iD.actionJoin`.
70043 //
70044 // For testing convenience, accepts an ID to assign to the new way.
70045 // Normally, this will be undefined and the way will automatically
70046 // be assigned a new ID.
70047 //
70048 // Reference:
70049 //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
70050 //
70051 function actionSplit(nodeId, newWayIds) {
70052     var wayIds;
70053
70054     // if the way is closed, we need to search for a partner node
70055     // to split the way at.
70056     //
70057     // The following looks for a node that is both far away from
70058     // the initial node in terms of way segment length and nearby
70059     // in terms of beeline-distance. This assures that areas get
70060     // split on the most "natural" points (independent of the number
70061     // of nodes).
70062     // For example: bone-shaped areas get split across their waist
70063     // line, circles across the diameter.
70064     function splitArea(nodes, idxA, graph) {
70065         var lengths = new Array(nodes.length),
70066             length,
70067             i,
70068             best = 0,
70069             idxB;
70070
70071         function wrap(index) {
70072             return utilWrap(index, nodes.length);
70073         }
70074
70075         function dist(nA, nB) {
70076             return geoSphericalDistance(graph.entity(nA).loc, graph.entity(nB).loc);
70077         }
70078
70079         // calculate lengths
70080         length = 0;
70081         for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
70082             length += dist(nodes[i], nodes[wrap(i-1)]);
70083             lengths[i] = length;
70084         }
70085
70086         length = 0;
70087         for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
70088             length += dist(nodes[i], nodes[wrap(i+1)]);
70089             if (length < lengths[i])
70090                 lengths[i] = length;
70091         }
70092
70093         // determine best opposite node to split
70094         for (i = 0; i < nodes.length; i++) {
70095             var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
70096             if (cost > best) {
70097                 idxB = i;
70098                 best = cost;
70099             }
70100         }
70101
70102         return idxB;
70103     }
70104
70105
70106     function split(graph, wayA, newWayId) {
70107         var wayB = osmWay({id: newWayId, tags: wayA.tags}),
70108             nodesA,
70109             nodesB,
70110             isArea = wayA.isArea(),
70111             isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
70112
70113         if (wayA.isClosed()) {
70114             var nodes = wayA.nodes.slice(0, -1),
70115                 idxA = indexOf(nodes, nodeId),
70116                 idxB = splitArea(nodes, idxA, graph);
70117
70118             if (idxB < idxA) {
70119                 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
70120                 nodesB = nodes.slice(idxB, idxA + 1);
70121             } else {
70122                 nodesA = nodes.slice(idxA, idxB + 1);
70123                 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
70124             }
70125         } else {
70126             var idx = indexOf(wayA.nodes, nodeId, 1);
70127             nodesA = wayA.nodes.slice(0, idx + 1);
70128             nodesB = wayA.nodes.slice(idx);
70129         }
70130
70131         wayA = wayA.update({nodes: nodesA});
70132         wayB = wayB.update({nodes: nodesB});
70133
70134         graph = graph.replace(wayA);
70135         graph = graph.replace(wayB);
70136
70137         graph.parentRelations(wayA).forEach(function(relation) {
70138             if (relation.isRestriction()) {
70139                 var via = relation.memberByRole('via');
70140                 if (via && wayB.contains(via.id)) {
70141                     relation = relation.replaceMember(wayA, wayB);
70142                     graph = graph.replace(relation);
70143                 }
70144             } else {
70145                 if (relation === isOuter) {
70146                     graph = graph.replace(relation.mergeTags(wayA.tags));
70147                     graph = graph.replace(wayA.update({tags: {}}));
70148                     graph = graph.replace(wayB.update({tags: {}}));
70149                 }
70150
70151                 var member = {
70152                     id: wayB.id,
70153                     type: 'way',
70154                     role: relation.memberById(wayA.id).role
70155                 };
70156
70157                 graph = actionAddMember(relation.id, member)(graph);
70158             }
70159         });
70160
70161         if (!isOuter && isArea) {
70162             var multipolygon = osmRelation({
70163                 tags: assignIn$1({}, wayA.tags, {type: 'multipolygon'}),
70164                 members: [
70165                     {id: wayA.id, role: 'outer', type: 'way'},
70166                     {id: wayB.id, role: 'outer', type: 'way'}
70167                 ]});
70168
70169             graph = graph.replace(multipolygon);
70170             graph = graph.replace(wayA.update({tags: {}}));
70171             graph = graph.replace(wayB.update({tags: {}}));
70172         }
70173
70174         return graph;
70175     }
70176
70177
70178     var action = function(graph) {
70179         var candidates = action.ways(graph);
70180         for (var i = 0; i < candidates.length; i++) {
70181             graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
70182         }
70183         return graph;
70184     };
70185
70186
70187     action.ways = function(graph) {
70188         var node = graph.entity(nodeId),
70189             parents = graph.parentWays(node),
70190             hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
70191
70192         return parents.filter(function(parent) {
70193             if (wayIds && wayIds.indexOf(parent.id) === -1)
70194                 return false;
70195
70196             if (!wayIds && hasLines && parent.geometry(graph) !== 'line')
70197                 return false;
70198
70199             if (parent.isClosed()) {
70200                 return true;
70201             }
70202
70203             for (var i = 1; i < parent.nodes.length - 1; i++) {
70204                 if (parent.nodes[i] === nodeId) {
70205                     return true;
70206                 }
70207             }
70208
70209             return false;
70210         });
70211     };
70212
70213
70214     action.disabled = function(graph) {
70215         var candidates = action.ways(graph);
70216         if (candidates.length === 0 || (wayIds && wayIds.length !== candidates.length))
70217             return 'not_eligible';
70218     };
70219
70220
70221     action.limitWays = function(_) {
70222         if (!arguments.length) return wayIds;
70223         wayIds = _;
70224         return action;
70225     };
70226
70227
70228     return action;
70229 }
70230
70231 // Create a restriction relation for `turn`, which must have the following structure:
70232 //
70233 //     {
70234 //         from: { node: <node ID>, way: <way ID> },
70235 //         via:  { node: <node ID> },
70236 //         to:   { node: <node ID>, way: <way ID> },
70237 //         restriction: <'no_right_turn', 'no_left_turn', etc.>
70238 //     }
70239 //
70240 // This specifies a restriction of type `restriction` when traveling from
70241 // `from.node` in `from.way` toward `to.node` in `to.way` via `via.node`.
70242 // (The action does not check that these entities form a valid intersection.)
70243 //
70244 // If `restriction` is not provided, it is automatically determined by
70245 // osmInferRestriction.
70246 //
70247 // If necessary, the `from` and `to` ways are split. In these cases, `from.node`
70248 // and `to.node` are used to determine which portion of the split ways become
70249 // members of the restriction.
70250 //
70251 // For testing convenience, accepts an ID to assign to the new relation.
70252 // Normally, this will be undefined and the relation will automatically
70253 // be assigned a new ID.
70254 //
70255 function actionRestrictTurn(turn, projection, restrictionId) {
70256
70257     return function(graph) {
70258         var from = graph.entity(turn.from.way),
70259             via  = graph.entity(turn.via.node),
70260             to   = graph.entity(turn.to.way);
70261
70262         function isClosingNode(way, nodeId) {
70263             return nodeId === way.first() && nodeId === way.last();
70264         }
70265
70266         function split(toOrFrom) {
70267             var newID = toOrFrom.newID || osmWay().id;
70268             graph = actionSplit(via.id, [newID])
70269                 .limitWays([toOrFrom.way])(graph);
70270
70271             var a = graph.entity(newID),
70272                 b = graph.entity(toOrFrom.way);
70273
70274             if (a.nodes.indexOf(toOrFrom.node) !== -1) {
70275                 return [a, b];
70276             } else {
70277                 return [b, a];
70278             }
70279         }
70280
70281         if (!from.affix(via.id) || isClosingNode(from, via.id)) {
70282             if (turn.from.node === turn.to.node) {
70283                 // U-turn
70284                 from = to = split(turn.from)[0];
70285             } else if (turn.from.way === turn.to.way) {
70286                 // Straight-on or circular
70287                 var s = split(turn.from);
70288                 from = s[0];
70289                 to   = s[1];
70290             } else {
70291                 // Other
70292                 from = split(turn.from)[0];
70293             }
70294         }
70295
70296         if (!to.affix(via.id) || isClosingNode(to, via.id)) {
70297             to = split(turn.to)[0];
70298         }
70299
70300         return graph.replace(osmRelation({
70301             id: restrictionId,
70302             tags: {
70303                 type: 'restriction',
70304                 restriction: turn.restriction ||
70305                     osmInferRestriction(
70306                         graph,
70307                         turn.from,
70308                         turn.via,
70309                         turn.to,
70310                         projection)
70311             },
70312             members: [
70313                 {id: from.id, type: 'way',  role: 'from'},
70314                 {id: via.id,  type: 'node', role: 'via'},
70315                 {id: to.id,   type: 'way',  role: 'to'}
70316             ]
70317         }));
70318     };
70319 }
70320
70321 function actionRevert(id) {
70322     var action = function(graph) {
70323         var entity = graph.hasEntity(id),
70324             base = graph.base().entities[id];
70325
70326         if (entity && !base) {    // entity will be removed..
70327             if (entity.type === 'node') {
70328                 graph.parentWays(entity)
70329                     .forEach(function(parent) {
70330                         parent = parent.removeNode(id);
70331                         graph = graph.replace(parent);
70332
70333                         if (parent.isDegenerate()) {
70334                             graph = actionDeleteWay(parent.id)(graph);
70335                         }
70336                     });
70337             }
70338
70339             graph.parentRelations(entity)
70340                 .forEach(function(parent) {
70341                     parent = parent.removeMembersWithID(id);
70342                     graph = graph.replace(parent);
70343
70344                     if (parent.isDegenerate()) {
70345                         graph = actionDeleteRelation(parent.id)(graph);
70346                     }
70347                 });
70348         }
70349
70350         return graph.revert(id);
70351     };
70352
70353     return action;
70354 }
70355
70356 function actionRotate(rotateIds, pivot, angle, projection) {
70357
70358     var action = function(graph) {
70359         return graph.update(function(graph) {
70360             utilGetAllNodes(rotateIds, graph).forEach(function(node) {
70361                 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
70362                 graph = graph.replace(node.move(projection.invert(point)));
70363             });
70364         });
70365     };
70366
70367     return action;
70368 }
70369
70370 /*
70371  * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
70372  */
70373 function actionStraighten(wayId, projection) {
70374
70375     function positionAlongWay(n, s, e) {
70376         return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
70377                 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
70378     }
70379
70380
70381     var action = function(graph, t) {
70382         if (t === null || !isFinite(t)) t = 1;
70383         t = Math.min(Math.max(+t, 0), 1);
70384
70385         var way = graph.entity(wayId),
70386             nodes = graph.childNodes(way),
70387             points = nodes.map(function(n) { return projection(n.loc); }),
70388             startPoint = points[0],
70389             endPoint = points[points.length-1],
70390             toDelete = [],
70391             i;
70392
70393         for (i = 1; i < points.length-1; i++) {
70394             var node = nodes[i],
70395                 point = points[i];
70396
70397             if (t < 1 || graph.parentWays(node).length > 1 ||
70398                 graph.parentRelations(node).length ||
70399                 node.hasInterestingTags()) {
70400
70401                 var u = positionAlongWay(point, startPoint, endPoint),
70402                     p = [
70403                         startPoint[0] + u * (endPoint[0] - startPoint[0]),
70404                         startPoint[1] + u * (endPoint[1] - startPoint[1])
70405                     ],
70406                     loc2 = projection.invert(p);
70407
70408                 graph = graph.replace(node.move(geoInterp(node.loc, loc2, t)));
70409
70410             } else {
70411                 // safe to delete
70412                 if (toDelete.indexOf(node) === -1) {
70413                     toDelete.push(node);
70414                 }
70415             }
70416         }
70417
70418         for (i = 0; i < toDelete.length; i++) {
70419             graph = actionDeleteNode(toDelete[i].id)(graph);
70420         }
70421
70422         return graph;
70423     };
70424
70425
70426     action.disabled = function(graph) {
70427         // check way isn't too bendy
70428         var way = graph.entity(wayId),
70429             nodes = graph.childNodes(way),
70430             points = nodes.map(function(n) { return projection(n.loc); }),
70431             startPoint = points[0],
70432             endPoint = points[points.length-1],
70433             threshold = 0.2 * geoEuclideanDistance(startPoint, endPoint),
70434             i;
70435
70436         if (threshold === 0) {
70437             return 'too_bendy';
70438         }
70439
70440         for (i = 1; i < points.length-1; i++) {
70441             var point = points[i],
70442                 u = positionAlongWay(point, startPoint, endPoint),
70443                 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
70444                 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
70445                 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
70446
70447             // to bendy if point is off by 20% of total start/end distance in projected space
70448             if (isNaN(dist) || dist > threshold) {
70449                 return 'too_bendy';
70450             }
70451         }
70452     };
70453
70454
70455     action.transitionable = true;
70456
70457
70458     return action;
70459 }
70460
70461 // Remove the effects of `turn.restriction` on `turn`, which must have the
70462 // following structure:
70463 //
70464 //     {
70465 //         from: { node: <node ID>, way: <way ID> },
70466 //         via:  { node: <node ID> },
70467 //         to:   { node: <node ID>, way: <way ID> },
70468 //         restriction: <relation ID>
70469 //     }
70470 //
70471 // In the simple case, `restriction` is a reference to a `no_*` restriction
70472 // on the turn itself. In this case, it is simply deleted.
70473 //
70474 // The more complex case is where `restriction` references an `only_*`
70475 // restriction on a different turn in the same intersection. In that case,
70476 // that restriction is also deleted, but at the same time restrictions on
70477 // the turns other than the first two are created.
70478 //
70479 function actionUnrestrictTurn(turn) {
70480     return function(graph) {
70481         return actionDeleteRelation(turn.restriction)(graph);
70482     };
70483 }
70484
70485 /* Reflect the given area around its axis of symmetry */
70486 function actionReflect(reflectIds, projection) {
70487     var useLongAxis = true;
70488
70489
70490     // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
70491     // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
70492     function getSmallestSurroundingRectangle(graph, nodes) {
70493         var points = nodes.map(function(n) { return projection(n.loc); }),
70494             hull = d3_polygonHull(points),
70495             centroid = d3_polygonCentroid(hull),
70496             minArea = Infinity,
70497             ssrExtent = [],
70498             ssrAngle = 0,
70499             c1 = hull[0];
70500
70501         for (var i = 0; i <= hull.length - 1; i++) {
70502             var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
70503                 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
70504                 poly = geoRotate(hull, -angle, centroid),
70505                 extent = poly.reduce(function(extent, point) {
70506                         return extent.extend(geoExtent$$1(point));
70507                     }, geoExtent$$1()),
70508                 area = extent.area();
70509
70510             if (area < minArea) {
70511                 minArea = area;
70512                 ssrExtent = extent;
70513                 ssrAngle = angle;
70514             }
70515             c1 = c2;
70516         }
70517
70518         return {
70519             poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
70520             angle: ssrAngle
70521         };
70522     }
70523
70524
70525     var action = function(graph, t) {
70526         if (t === null || !isFinite(t)) t = 1;
70527         t = Math.min(Math.max(+t, 0), 1);
70528
70529         var nodes = utilGetAllNodes(reflectIds, graph),
70530             ssr = getSmallestSurroundingRectangle(graph, nodes);
70531
70532         // Choose line pq = axis of symmetry.
70533         // The shape's surrounding rectangle has 2 axes of symmetry.
70534         // Reflect across the longer axis by default.
70535         var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
70536             q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
70537             p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
70538             q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
70539             p, q;
70540
70541         var isLong = (geoEuclideanDistance(p1, q1) > geoEuclideanDistance(p2, q2));
70542         if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
70543             p = p1;
70544             q = q1;
70545         } else {
70546             p = p2;
70547             q = q2;
70548         }
70549
70550         // reflect c across pq
70551         // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
70552         var dx = q[0] - p[0];
70553         var dy = q[1] - p[1];
70554         var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
70555         var b = 2 * dx * dy / (dx * dx + dy * dy);
70556         for (var i = 0; i < nodes.length; i++) {
70557             var node = nodes[i];
70558             var c = projection(node.loc);
70559             var c2 = [
70560                 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
70561                 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
70562             ];
70563             var loc2 = projection.invert(c2);
70564             node = node.move(geoInterp(node.loc, loc2, t));
70565             graph = graph.replace(node);
70566         }
70567
70568         return graph;
70569     };
70570
70571
70572     action.useLongAxis = function(_) {
70573         if (!arguments.length) return useLongAxis;
70574         useLongAxis = _;
70575         return action;
70576     };
70577
70578
70579     action.transitionable = true;
70580
70581
70582     return action;
70583 }
70584
70585
70586
70587 var index$4 = Object.freeze({
70588         d3combobox: d3combobox,
70589         d3geoTile: d3geoTile,
70590         d3keybinding: d3keybinding
70591 });
70592
70593 /* export some legacy symbols: */
70594 var Connection = services.osm;
70595 var debug = false;
70596
70597
70598
70599
70600 var iD = Object.freeze({
70601         Connection: Connection,
70602         debug: debug,
70603         lib: index$4,
70604         d3: index,
70605         Context: coreContext,
70606         setAreaKeys: setAreaKeys,
70607         Difference: coreDifference,
70608         Graph: coreGraph$$1,
70609         History: coreHistory,
70610         Tree: coreTree,
70611         Entity: osmEntity$$1,
70612         Node: osmNode,
70613         Relation: osmRelation,
70614         Way: osmWay,
70615         BackgroundSource: rendererBackgroundSource,
70616         Background: rendererBackground,
70617         Features: rendererFeatures,
70618         Map: rendererMap,
70619         TileLayer: rendererTileLayer,
70620         Detect: utilDetect,
70621         uiPreset: uiPresetEditor,
70622         actionAddEntity: actionAddEntity,
70623         actionAddMember: actionAddMember,
70624         actionAddMidpoint: actionAddMidpoint,
70625         actionAddVertex: actionAddVertex,
70626         actionChangeMember: actionChangeMember,
70627         actionChangePreset: actionChangePreset,
70628         actionChangeTags: actionChangeTags,
70629         actionCircularize: actionCircularize,
70630         actionConnect: actionConnect,
70631         actionCopyEntities: actionCopyEntities,
70632         actionDeleteMember: actionDeleteMember,
70633         actionDeleteMultiple: actionDeleteMultiple,
70634         actionDeleteNode: actionDeleteNode,
70635         actionDeleteRelation: actionDeleteRelation,
70636         actionDeleteWay: actionDeleteWay,
70637         actionDeprecateTags: actionDeprecateTags,
70638         actionDiscardTags: actionDiscardTags,
70639         actionDisconnect: actionDisconnect,
70640         actionJoin: actionJoin,
70641         actionMerge: actionMerge,
70642         actionMergePolygon: actionMergePolygon,
70643         actionMergeRemoteChanges: actionMergeRemoteChanges,
70644         actionMove: actionMove,
70645         actionMoveNode: actionMoveNode,
70646         actionNoop: actionNoop,
70647         actionOrthogonalize: actionOrthogonalize,
70648         actionRestrictTurn: actionRestrictTurn,
70649         actionReverse: actionReverse,
70650         actionRevert: actionRevert,
70651         actionRotate: actionRotate,
70652         actionSplit: actionSplit,
70653         actionStraighten: actionStraighten,
70654         actionUnrestrictTurn: actionUnrestrictTurn,
70655         actionReflect: actionReflect,
70656         behaviorAddWay: behaviorAddWay,
70657         behaviorBreathe: behaviorBreathe,
70658         behaviorCopy: behaviorCopy,
70659         behaviorDrag: behaviorDrag,
70660         behaviorDrawWay: behaviorDrawWay,
70661         behaviorDraw: behaviorDraw,
70662         behaviorEdit: behaviorEdit,
70663         behaviorHash: behaviorHash,
70664         behaviorHover: behaviorHover,
70665         behaviorLasso: behaviorLasso,
70666         behaviorOperation: behaviorOperation,
70667         behaviorPaste: behaviorPaste,
70668         behaviorSelect: behaviorSelect,
70669         behaviorTail: behaviorTail,
70670         coreContext: coreContext,
70671         coreDifference: coreDifference,
70672         coreGraph: coreGraph$$1,
70673         coreHistory: coreHistory,
70674         coreTree: coreTree,
70675         dataFeatureIcons: dataFeatureIcons,
70676         data: data,
70677         dataWikipedia: dataWikipedia,
70678         dataSuggestions: dataSuggestions,
70679         dataAddressFormats: dataAddressFormats,
70680         dataDeprecated: dataDeprecated,
70681         dataDiscarded: dataDiscarded,
70682         dataLocales: dataLocales,
70683         dataPhoneFormats: dataPhoneFormats,
70684         dataShortcuts: dataShortcuts,
70685         dataImperial: dataImperial,
70686         dataDriveLeft: dataDriveLeft,
70687         dataEn: en,
70688         geoAngle: geoAngle,
70689         geoChooseEdge: geoChooseEdge,
70690         geoCross: geoCross,
70691         geoEdgeEqual: geoEdgeEqual,
70692         geoEuclideanDistance: geoEuclideanDistance,
70693         geoExtent: geoExtent$$1,
70694         geoInterp: geoInterp,
70695         geoRawMercator: geoRawMercator,
70696         geoRoundCoords: geoRoundCoords,
70697         geoRotate: geoRotate,
70698         geoLatToMeters: geoLatToMeters,
70699         geoLineIntersection: geoLineIntersection,
70700         geoLonToMeters: geoLonToMeters,
70701         geoMetersToLat: geoMetersToLat,
70702         geoMetersToLon: geoMetersToLon,
70703         geoMetersToOffset: geoMetersToOffset,
70704         geoOffsetToMeters: geoOffsetToMeters,
70705         geoPathIntersections: geoPathIntersections,
70706         geoPathLength: geoPathLength,
70707         geoPointInPolygon: geoPointInPolygon,
70708         geoPolygonContainsPolygon: geoPolygonContainsPolygon,
70709         geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
70710         geoSphericalDistance: geoSphericalDistance,
70711         modeAddArea: modeAddArea$$1,
70712         modeAddLine: modeAddLine$$1,
70713         modeAddPoint: modeAddPoint$$1,
70714         modeBrowse: modeBrowse,
70715         modeDragNode: modeDragNode$$1,
70716         modeDrawArea: modeDrawArea,
70717         modeDrawLine: modeDrawLine,
70718         modeMove: modeMove$$1,
70719         modeRotate: modeRotate$$1,
70720         modeSave: modeSave$$1,
70721         modeSelect: modeSelect,
70722         operationCircularize: operationCircularize,
70723         operationContinue: operationContinue,
70724         operationDelete: operationDelete,
70725         operationDisconnect: operationDisconnect,
70726         operationMerge: operationMerge,
70727         operationMove: operationMove,
70728         operationOrthogonalize: operationOrthogonalize,
70729         operationReflectShort: operationReflectShort,
70730         operationReflectLong: operationReflectLong,
70731         operationReverse: operationReverse,
70732         operationRotate: operationRotate,
70733         operationSplit: operationSplit,
70734         operationStraighten: operationStraighten,
70735         osmChangeset: osmChangeset,
70736         osmEntity: osmEntity$$1,
70737         osmNode: osmNode,
70738         osmRelation: osmRelation,
70739         osmWay: osmWay,
70740         osmIntersection: osmIntersection,
70741         osmTurn: osmTurn,
70742         osmInferRestriction: osmInferRestriction,
70743         osmLanes: osmLanes,
70744         osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
70745         osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
70746         osmJoinWays: osmJoinWays,
70747         osmOneWayTags: osmOneWayTags,
70748         osmPavedTags: osmPavedTags,
70749         osmIsInterestingTag: osmIsInterestingTag,
70750         presetCategory: presetCategory,
70751         presetCollection: presetCollection,
70752         presetField: presetField,
70753         presetPreset: presetPreset,
70754         presetIndex: presetIndex,
70755         rendererBackgroundSource: rendererBackgroundSource,
70756         rendererBackground: rendererBackground,
70757         rendererFeatures: rendererFeatures,
70758         rendererMap: rendererMap,
70759         rendererTileLayer: rendererTileLayer,
70760         services: services,
70761         serviceMapillary: serviceMapillary,
70762         serviceNominatim: serviceNominatim,
70763         serviceOsm: serviceOsm,
70764         serviceTaginfo: serviceTaginfo,
70765         serviceWikidata: serviceWikidata,
70766         serviceWikipedia: serviceWikipedia,
70767         svgAreas: svgAreas$$1,
70768         svgDebug: svgDebug,
70769         svgDefs: svgDefs,
70770         svgGpx: svgGpx,
70771         svgIcon: svgIcon,
70772         svgLabels: svgLabels,
70773         svgLayers: svgLayers,
70774         svgLines: svgLines$$1,
70775         svgMapillaryImages: svgMapillaryImages,
70776         svgMapillarySigns: svgMapillarySigns,
70777         svgMidpoints: svgMidpoints$$1,
70778         svgOneWaySegments: svgOneWaySegments,
70779         svgOsm: svgOsm,
70780         svgPath: svgPath,
70781         svgPointTransform: svgPointTransform,
70782         svgPoints: svgPoints$$1,
70783         svgRelationMemberTags: svgRelationMemberTags,
70784         svgTagClasses: svgTagClasses,
70785         svgTurns: svgTurns,
70786         svgVertices: svgVertices$$1,
70787         uiFields: uiFields,
70788         uiFieldDefaultCheck: uiFieldCheck,
70789         uiFieldOnewayCheck: uiFieldCheck,
70790         uiFieldCheck: uiFieldCheck,
70791         uiFieldMultiCombo: uiFieldCombo,
70792         uiFieldNetworkCombo: uiFieldCombo,
70793         uiFieldSemiCombo: uiFieldCombo,
70794         uiFieldTypeCombo: uiFieldCombo,
70795         uiFieldCombo: uiFieldCombo,
70796         uiFieldUrl: uiFieldText,
70797         uiFieldNumber: uiFieldText,
70798         uiFieldTel: uiFieldText,
70799         uiFieldEmail: uiFieldText,
70800         uiFieldText: uiFieldText,
70801         uiFieldAccess: uiFieldAccess,
70802         uiFieldAddress: uiFieldAddress,
70803         uiFieldCycleway: uiFieldCycleway,
70804         uiFieldLanes: uiFieldLanes,
70805         uiFieldLocalized: uiFieldLocalized,
70806         uiFieldMaxspeed: uiFieldMaxspeed,
70807         uiFieldStructureRadio: uiFieldRadio,
70808         uiFieldRadio: uiFieldRadio,
70809         uiFieldRestrictions: uiFieldRestrictions,
70810         uiFieldTextarea: uiFieldTextarea,
70811         uiFieldWikipedia: uiFieldWikipedia,
70812         uiIntro: uiIntro,
70813         uiInfoPanels: uiInfoPanels,
70814         uiPanelBackground: uiPanelBackground,
70815         uiPanelHistory: uiPanelHistory,
70816         uiPanelLocation: uiPanelLocation,
70817         uiPanelMeasurement: uiPanelMeasurement,
70818         uiInit: uiInit,
70819         uiAccount: uiAccount,
70820         uiAttribution: uiAttribution,
70821         uiBackground: uiBackground,
70822         uiChangesetEditor: uiChangesetEditor,
70823         uiCmd: uiCmd,
70824         uiCommit: uiCommit,
70825         uiCommitChanges: uiCommitChanges,
70826         uiCommitWarnings: uiCommitWarnings,
70827         uiConfirm: uiConfirm,
70828         uiConflicts: uiConflicts,
70829         uiContributors: uiContributors,
70830         uiCurtain: uiCurtain,
70831         uiDisclosure: uiDisclosure,
70832         uiEditMenu: uiEditMenu,
70833         uiEntityEditor: uiEntityEditor,
70834         uiFeatureInfo: uiFeatureInfo,
70835         uiFeatureList: uiFeatureList,
70836         uiField: uiField,
70837         uiFlash: uiFlash,
70838         uiFormFields: uiFormFields,
70839         uiFullScreen: uiFullScreen,
70840         uiGeolocate: uiGeolocate,
70841         uiHelp: uiHelp,
70842         uiInfo: uiInfo,
70843         uiInspector: uiInspector,
70844         uiLasso: uiLasso,
70845         uiLoading: uiLoading,
70846         uiMapData: uiMapData,
70847         uiMapInMap: uiMapInMap,
70848         uiModal: uiModal,
70849         uiModes: uiModes,
70850         uiNotice: uiNotice,
70851         uiPresetEditor: uiPresetEditor,
70852         uiPresetIcon: uiPresetIcon,
70853         uiPresetList: uiPresetList,
70854         uiRadialMenu: uiRadialMenu,
70855         uiRawMemberEditor: uiRawMemberEditor,
70856         uiRawMembershipEditor: uiRawMembershipEditor,
70857         uiRawTagEditor: uiRawTagEditor,
70858         uiRestore: uiRestore,
70859         uiSave: uiSave,
70860         uiScale: uiScale,
70861         uiSelectionList: uiSelectionList,
70862         uiSidebar: uiSidebar,
70863         uiSourceSwitch: uiSourceSwitch,
70864         uiSpinner: uiSpinner,
70865         uiSplash: uiSplash,
70866         uiStatus: uiStatus,
70867         uiSuccess: uiSuccess,
70868         uiTagReference: uiTagReference,
70869         uiToggle: uiToggle,
70870         uiTooltipHtml: uiTooltipHtml,
70871         uiUndoRedo: uiUndoRedo,
70872         uiVersion: uiVersion,
70873         uiViewOnOSM: uiViewOnOSM,
70874         uiZoom: uiZoom,
70875         utilAsyncMap: utilAsyncMap,
70876         utilCallWhenIdle: utilCallWhenIdle,
70877         utilDisplayName: utilDisplayName,
70878         utilDisplayNameForPath: utilDisplayNameForPath,
70879         utilDisplayType: utilDisplayType,
70880         utilEditDistance: utilEditDistance,
70881         utilEntitySelector: utilEntitySelector,
70882         utilEntityOrMemberSelector: utilEntityOrMemberSelector,
70883         utilFastMouse: utilFastMouse,
70884         utilFunctor: utilFunctor,
70885         utilGetAllNodes: utilGetAllNodes,
70886         utilGetPrototypeOf: utilGetPrototypeOf,
70887         utilGetSetValue: utilGetSetValue,
70888         utilIdleWorker: utilIdleWorker,
70889         utilNoAuto: utilNoAuto,
70890         utilPrefixCSSProperty: utilPrefixCSSProperty,
70891         utilPrefixDOMProperty: utilPrefixDOMProperty,
70892         utilQsString: utilQsString,
70893         utilRebind: utilRebind,
70894         utilSetTransform: utilSetTransform,
70895         utilSessionMutex: utilSessionMutex,
70896         utilStringQs: utilStringQs,
70897         utilSuggestNames: utilSuggestNames,
70898         utilTagText: utilTagText,
70899         utilTriggerEvent: utilTriggerEvent,
70900         utilWrap: utilWrap,
70901         d3combobox: d3combobox,
70902         d3geoTile: d3geoTile,
70903         d3keybinding: d3keybinding,
70904         validationDeprecatedTag: validationDeprecatedTag,
70905         validationDisconnectedHighway: validationDisconnectedHighway,
70906         validationManyDeletions: validationManyDeletions,
70907         validationMissingTag: validationMissingTag,
70908         validationOldMultipolygon: validationOldMultipolygon,
70909         validationTagSuggestsArea: validationTagSuggestsArea
70910 });
70911
70912 window.iD = iD;
70913
70914 }());
70915 //# sourceMappingURL=iD.js.map