(function(b, c, a) {
	c[b] = a()
})("h337", this, function() {
	var c = {
		defaultRadius: 40,
		defaultRenderer: "canvas2d",
		defaultGradient: {
			0.35: "rgb(0,0,255)",
			0.45: "rgb(0,255,255)",
			0.75: "rgb(0,255,0)",
			0.85: "yellow",
			1: "rgb(255,0,0)"
		},
		defaultMaxOpacity: 1,
		defaultMinOpacity: 0,
		defaultBlur: 0.85,
		defaultXField: "x",
		defaultYField: "y",
		defaultValueField: "value",
		plugins: {}
	};
	var g = (function l() {
		var n = function n(o) {
			this._coordinator = {};
			this._data = [];
			this._radi = [];
			this._min = 0;
			this._max = 1;
			this._xField = o.xField || o.defaultXField;
			this._yField = o.yField || o.defaultYField;
			this._valueField = o.valueField || o.defaultValueField;
			if (o.radius) {
				this._cfgRadius = o.radius
			}
		};
		var m = c.defaultRadius;
		n.prototype = {
			_organiseData: function(o, q) {
				var u = o[this._xField];
				var s = o[this._yField];
				var z = this._radi;
				var w = this._data;
				var t = this._max;
				var p = this._min;
				var v = o[this._valueField] || 1;
				var r = o.radius || this._cfgRadius || m;
				if (!w[u]) {
					w[u] = [];
					z[u] = []
				}
				if (!w[u][s]) {
					w[u][s] = v;
					z[u][s] = r
				} else {
					w[u][s] += v
				}
				if (w[u][s] > t) {
					if (!q) {
						this._max = w[u][s]
					} else {
						this.setDataMax(w[u][s])
					}
					return false
				} else {
					return {
						x: u,
						y: s,
						value: v,
						radius: r,
						min: p,
						max: t
					}
				}
			},
			_unOrganizeData: function() {
				var r = [];
				var q = this._data;
				var p = this._radi;
				for (var o in q) {
					for (var s in q[o]) {
						r.push({
							x: o,
							y: s,
							radius: p[o][s],
							value: q[o][s]
						})
					}
				}
				return {
					min: this._min,
					max: this._max,
					data: r
				}
			},
			_onExtremaChange: function() {
				this._coordinator.emit("extremachange", {
					min: this._min,
					max: this._max
				})
			},
			addData: function() {
				if (arguments[0].length > 0) {
					var p = arguments[0];
					var o = p.length;
					while (o--) {
						this.addData.call(this, p[o])
					}
				} else {
					var q = this._organiseData(arguments[0], true);
					if (q) {
						this._coordinator.emit("renderpartial", {
							min: this._min,
							max: this._max,
							data: [q]
						})
					}
				}
				return this
			},
			setData: function(q) {
				var p = q.data;
				var r = p.length;
				this._data = [];
				this._radi = [];
				for (var o = 0; o < r; o++) {
					this._organiseData(p[o], false)
				}
				this._max = q.max;
				this._min = q.min || 0;
				this._onExtremaChange();
				this._coordinator.emit("renderall", this._getInternalData());
				return this
			},
			removeData: function() {},
			setDataMax: function(o) {
				this._max = o;
				this._onExtremaChange();
				this._coordinator.emit("renderall", this._getInternalData());
				return this
			},
			setDataMin: function(o) {
				this._min = o;
				this._onExtremaChange();
				this._coordinator.emit("renderall", this._getInternalData());
				return this
			},
			setCoordinator: function(o) {
				this._coordinator = o
			},
			_getInternalData: function() {
				return {
					max: this._max,
					min: this._min,
					data: this._data,
					radi: this._radi
				}
			},
			getData: function() {
				return this._unOrganizeData()
			}
		};
		return n
	})();
	var h = (function j() {
		var p = function(q) {
			var s = q.gradient || q.defaultGradient;
			var v = document.createElement("canvas");
			var u = v.getContext("2d");
			v.width = 256;
			v.height = 1;
			var t = u.createLinearGradient(0, 0, 256, 1);
			for (var r in s) {
				t.addColorStop(r, s[r])
			}
			u.fillStyle = t;
			u.fillRect(0, 0, 256, 1);
			return u.getImageData(0, 0, 256, 1).data
		};
		var o = function(s, t) {
			var v = document.createElement("canvas");
			var r = v.getContext("2d");
			var q = s;
			var w = s;
			v.width = v.height = s * 2;
			if (t == 1) {
				r.beginPath();
				r.arc(q, w, s, 0, 2 * Math.PI, false);
				r.fillStyle = "rgba(0,0,0,1)";
				r.fill()
			} else {
				var u = r.createRadialGradient(q, w, s * t, q, w, s);
				u.addColorStop(0, "rgba(0,0,0,1)");
				u.addColorStop(1, "rgba(0,0,0,0)");
				r.fillStyle = u;
				r.fillRect(0, 0, 2 * s, 2 * s)
			}
			return v
		};
		var n = function(u) {
			var B = [];
			var t = u.min;
			var x = u.max;
			var C = u.radi;
			var u = u.data;
			var q = Object.keys(u);
			var r = q.length;
			while (r--) {
				var s = q[r];
				var y = Object.keys(u[s]);
				var A = y.length;
				while (A--) {
					var w = y[A];
					var z = u[s][w];
					var v = C[s][w];
					B.push({
						x: s,
						y: w,
						value: z,
						radius: v
					})
				}
			}
			return {
				min: t,
				max: x,
				data: B
			}
		};

		function m(t) {
			var q = t.element;
			var u = this.shadowCanvas = document.createElement("canvas");
			var s = this.canvas = t.canvas || document.createElement("canvas");
			var r = this._renderBoundaries = [10000, 10000, 0, 0];
			var v = getComputedStyle(t.element) || {};
			s.className = "heatmap-canvas";
			this._width = s.width = u.width = +(v.width.replace(/px/, ""));
			this._height = s.height = u.height = +(v.height.replace(/px/, ""));
			this.shadowCtx = u.getContext("2d");
			this.ctx = s.getContext("2d");
			s.style.cssText = u.style.cssText = "position:absolute;left:0;top:0;";
			q.style.position = "relative";
			q.appendChild(s);
			this._palette = p(t);
			this._templates = {};
			this._setStyles(t)
		}
		m.prototype = {
			renderPartial: function(q) {
				this._drawAlpha(q);
				this._colorize()
			},
			renderAll: function(q) {
				this._clear();
				this._drawAlpha(n(q));
				this._colorize()
			},
			_updateGradient: function(q) {
				this._palette = p(q)
			},
			updateConfig: function(q) {
				if (q.gradient) {
					this._updateGradient(q)
				}
				this._setStyles(q)
			},
			setDimensions: function(r, q) {
				this._width = r;
				this._height = q;
				this.canvas.width = this.shadowCanvas.width = r;
				this.canvas.height = this.shadowCanvas.height = q
			},
			_clear: function() {
				this.shadowCtx.clearRect(0, 0, this._width, this._height);
				this.ctx.clearRect(0, 0, this._width, this._height)
			},
			_setStyles: function(q) {
				this._blur = (q.blur == 0) ? 0 : (q.blur || q.defaultBlur);
				if (q.backgroundColor) {
					this.canvas.style.backgroundColor = q.backgroundColor
				}
				this._opacity = (q.opacity || 0) * 255;
				this._maxOpacity = (q.maxOpacity || q.defaultMaxOpacity) * 255;
				this._minOpacity = (q.minOpacity || q.defaultMinOpacity) * 255;
				this._useGradientOpacity = !!q.useGradientOpacity
			},
			_drawAlpha: function(v) {
				var u = this._min = v.min;
				var B = this._max = v.max;
				var v = v.data || [];
				var s = v.length;
				var t = 1 - this._blur;
				while (s--) {
					var F = v[s];
					var D = F.x;
					var A = F.y;
					var z = F.radius;
					var E = Math.min(F.value, B);
					var r = D - z;
					var q = A - z;
					var C = this.shadowCtx;
					var w;
					if (!this._templates[z]) {
						this._templates[z] = w = o(z, t)
					} else {
						w = this._templates[z]
					}
					C.globalAlpha = (E - u) / (B - u);
					C.drawImage(w, r, q);
					if (r < this._renderBoundaries[0]) {
						this._renderBoundaries[0] = r
					}
					if (q < this._renderBoundaries[1]) {
						this._renderBoundaries[1] = q
					}
					if (r + 2 * z > this._renderBoundaries[2]) {
						this._renderBoundaries[2] = r + 2 * z
					}
					if (q + 2 * z > this._renderBoundaries[3]) {
						this._renderBoundaries[3] = q + 2 * z
					}
				}
			},
			_colorize: function() {
				var w = this._renderBoundaries[0];
				var u = this._renderBoundaries[1];
				var B = this._renderBoundaries[2] - w;
				var z = this._renderBoundaries[3] - u;
				var G = this._width;
				var A = this._height;
				var r = this._opacity;
				var I = this._maxOpacity;
				var C = this._minOpacity;
				var v = this._useGradientOpacity;
				if (w < 0) {
					w = 0
				}
				if (u < 0) {
					u = 0
				}
				if (w + B > G) {
					B = G - w
				}
				if (u + z > A) {
					z = A - u
				}
				var J = this.shadowCtx.getImageData(w, u, B, z);
				var H = J.data;
				var E = H.length;
				var F = this._palette;
				for (var D = 3; D < E; D += 4) {
					var s = H[D];
					var t = s * 4;
					if (!t) {
						continue
					}
					var q;
					if (r > 0) {
						q = r
					} else {
						if (s < I) {
							if (s < C) {
								q = C
							} else {
								q = s
							}
						} else {
							q = I
						}
					}
					H[D - 3] = F[t];
					H[D - 2] = F[t + 1];
					H[D - 1] = F[t + 2];
					H[D] = v ? F[t + 3] : q
				}
				J.data = H;
				this.ctx.putImageData(J, w, u);
				this._renderBoundaries = [1000, 1000, 0, 0]
			},
			getValueAt: function(r) {
				var w;
				var t = this.shadowCtx;
				var s = t.getImageData(r.x, r.y, 1, 1);
				var v = s.data[3];
				var q = this._max;
				var u = this._min;
				w = (Math.abs(q - u) * (v / 255)) >> 0;
				return w
			},
			getDataURL: function() {
				return this.canvas.toDataURL()
			}
		};
		return m
	})();
	var e = (function b() {
		var m = false;
		if (c.defaultRenderer === "canvas2d") {
			m = h
		}
		return m
	})();
	var i = {
		merge: function() {
			var m = {};
			var n = arguments.length;
			for (var p = 0; p < n; p++) {
				var q = arguments[p];
				for (var o in q) {
					m[o] = q[o]
				}
			}
			return m
		}
	};
	var f = (function k() {
		var m = (function o() {
			function q() {
				this.cStore = {}
			}
			q.prototype = {
				on: function(s, u, r) {
					var t = this.cStore;
					if (!t[s]) {
						t[s] = []
					}
					t[s].push((function(v) {
						return u.call(r, v)
					}))
				},
				emit: function(u, t) {
					var w = this.cStore;
					if (w[u]) {
						var r = w[u].length;
						for (var s = 0; s < r; s++) {
							var v = w[u][s];
							v(t)
						}
					}
				}
			};
			return q
		})();
		var p = function(r) {
			var s = r._renderer;
			var t = r._coordinator;
			var q = r._store;
			t.on("renderpartial", s.renderPartial, s);
			t.on("renderall", s.renderAll, s);
			t.on("extremachange", function(u) {
				r._config.onExtremaChange && r._config.onExtremaChange({
					min: u.min,
					max: u.max,
					gradient: r._config.gradient || r._config.defaultGradient
				})
			});
			q.setCoordinator(t)
		};

		function n() {
			var q = this._config = i.merge(c, arguments[0] || {});
			this._coordinator = new m();
			if (q.plugin) {
				var s = q.plugin;
				if (!c.plugins[s]) {
					throw new Error("Plugin '" + s + "' not found. Maybe it was not registered.")
				} else {
					var r = c.plugins[s];
					this._renderer = new r.renderer(q);
					this._store = new r.store(q)
				}
			} else {
				this._renderer = new e(q);
				this._store = new g(q)
			}
			p(this)
		}
		n.prototype = {
			addData: function() {
				this._store.addData.apply(this._store, arguments);
				return this
			},
			removeData: function() {
				this._store.removeData && this._store.removeData.apply(this._store, arguments);
				return this
			},
			setData: function() {
				this._store.setData.apply(this._store, arguments);
				return this
			},
			setDataMax: function() {
				this._store.setDataMax.apply(this._store, arguments);
				return this
			},
			setDataMin: function() {
				this._store.setDataMin.apply(this._store, arguments);
				return this
			},
			configure: function(q) {
				this._config = i.merge(this._config, q);
				this._renderer.updateConfig(this._config);
				this._coordinator.emit("renderall", this._store._getInternalData());
				return this
			},
			repaint: function() {
				this._coordinator.emit("renderall", this._store._getInternalData());
				return this
			},
			getData: function() {
				return this._store.getData()
			},
			getDataURL: function() {
				return this._renderer.getDataURL()
			},
			getValueAt: function(q) {
				if (this._store.getValueAt) {
					return this._store.getValueAt(q)
				} else {
					if (this._renderer.getValueAt) {
						return this._renderer.getValueAt(q)
					} else {
						return null
					}
				}
			}
		};
		return n
	})();
	var a = {
		create: function(m) {
			return new f(m)
		},
		register: function(n, m) {
			c.plugins[n] = m
		}
	};
	return a
});
var BMapLib = window.BMapLib = BMapLib || {};
(function() {
	var a = BMapLib.HeatmapOverlay = function(c) {
		this.conf = c;
		this.conf.visible = c.visible === undefined ? true : c.visible;
		this.heatmap = null;
		this.latlngs = [];
		this.bounds = null
	};
	a.prototype = new BMapGL.Overlay();
	a.prototype.initialize = function(f) {
		this._map = f;
		var c = document.createElement("div");
		c.style.position = "absolute";
		c.style.top = 0;
		c.style.left = 0;
		c.style.border = 0;
		c.style.width = this._map.getSize().width + "px";
		c.style.height = this._map.getSize().height + "px";
		this.conf.element = c;
		if (!b()) {
			return c
		}
		f.getPanes().floatPane.appendChild(c);
		this.conf.valueField = this.conf.valueField || "count";
		this.heatmap = h337.create(this.conf);
		var e = this;
		f.addEventListener("resize", function(h) {
			var g = h.size;
			c.style.width = g.width + "px";
			c.style.height = g.height + "px";
			e.heatmap._renderer.setDimensions(g.width, g.height);
			e.draw()
		});
		this._div = c;
		return c
	};
	a.prototype.draw = function() {
		if (!b()) {
			return
		}
		var k = this._map.getBounds();
		if (k.equals(this.bounds)) {
			return
		}
		this.bounds = k;
		var j = this._map.pointToOverlayPixel(k.getNorthEast()),
			p = this._map.pointToOverlayPixel(k.getSouthWest()),
			c = j.y,
			i = p.x,
			l = p.y - j.y,
			o = j.x - p.x;
		this.conf.element.style.left = i + "px";
		this.conf.element.style.top = c + "px";
		this.conf.element.style.width = o + "px";
		this.conf.element.style.height = l + "px";
		if (this.latlngs.length > 0) {
			this.heatmap.removeData();
			var n = this.latlngs.length;
			d = {
				max: this.heatmap._store.getData().max,
				data: []
			};
			while (n--) {
				var f = this.latlngs[n].latlng;
				if (!k.containsPoint(f)) {
					continue
				}
				var g = this._map.pointToOverlayPixel(f),
					i = this._map.pointToOverlayPixel(k.getSouthWest()).x,
					c = this._map.pointToOverlayPixel(k.getNorthEast()).y,
					e = new BMapGL.Pixel(g.x - i, g.y - c);
				var m = this.pixelTransform(e);
				d.data.push({
					x: m.x,
					y: m.y,
					count: this.latlngs[n].c
				})
			}
			if (this.conf.radiusChangeByZoom) {
				this.heatmap._store._cfgRadius = this.conf.radiusChangeByZoom(this._map.getZoom())
			}
			this.heatmap.setData(d)
		}
	};
	a.prototype.pixelTransform = function(f) {
		var c = this.heatmap.width,
			e = this.heatmap.height;
		while (f.x < 0) {
			f.x += c
		}
		while (f.x > c) {
			f.x -= c
		}
		while (f.y < 0) {
			f.y += e
		}
		while (f.y > e) {
			f.y -= e
		}
		f.x = (f.x >> 0);
		f.y = (f.y >> 0);
		return f
	};
	a.prototype.setDataSet = function(j) {
		this.data = j;
		if (!b()) {
			return
		}
		var i = this._map.getBounds();
		var l = {
			max: j.max,
			data: []
		};
		var m = j.data,
			k = m.length;
		this.latlngs = [];
		this.heatmap.removeData();
		if (this.conf.radiusChangeByZoom) {
			this.heatmap._store._cfgRadius = this.conf.radiusChangeByZoom(this._map.getZoom())
		}
		while (k--) {
			var f = new BMapGL.Point(m[k].lng, m[k].lat);
			this.latlngs.push({
				latlng: f,
				c: m[k].count
			});
			if (!i.containsPoint(f)) {
				continue
			}
			var g = this._map.pointToOverlayPixel(f),
				h = this._map.pointToOverlayPixel(i.getSouthWest()).x,
				c = this._map.pointToOverlayPixel(i.getNorthEast()).y,
				e = new BMapGL.Pixel(g.x - h, g.y - c);
			var n = this.pixelTransform(e);
			l.data.push({
				x: n.x,
				y: n.y,
				count: m[k].count
			})
		}
		this.heatmap.setData(l)
	};
	a.prototype.addDataPoint = function(e, g, f) {
		if (!b()) {
			return
		}
		if (this.data && this.data.data) {
			this.data.data.push({
				lng: e,
				lat: g,
				count: f
			})
		}
		var h = new BMapGL.Point(e, g),
			c = this.pixelTransform(this._map.pointToOverlayPixel(h));
		this.heatmap.store.addDataPoint(c.x, c.y, f);
		this.latlngs.push({
			latlng: h,
			c: f
		})
	};
	a.prototype.toggle = function() {
		if (!b()) {
			return
		}
		if (this.conf.visible === true) {
			this.conf.visible = false
		} else {
			this.conf.visible = true
		}
		if (this.conf.visible) {
			this.conf.element.style.display = "block"
		} else {
			this.conf.element.style.display = "none"
		}
	};
	a.prototype.setOptions = function(c) {
		if (!b()) {
			return
		}
		for (var e in c) {
			if (e == "radius") {
				this.heatmap._store._cfgRadius = c[e]
			}
			if (e == "opacity") {
				c[e] = c[e] / 100
			}
		}
		this.heatmap.configure(c);
		if (this.data) {
			this.setDataSet(this.data)
		}
	};

	function b() {
		var c = document.createElement("canvas");
		return !!(c.getContext && c.getContext("2d"))
	}
})();
