/gi, R = /^(?:body|html)$/i, Z = /([A-Z])/g, z = ["val", "css", "html", "text", "data", "width", "height", "offset"], q = A.createElement("table"), H = A.createElement("tr"), I = { tr: A.createElement("tbody"), tbody: q, thead: q, tfoot: q, td: H, th: H, "*": A.createElement("div") }, V = /complete|loaded|interactive/, _ = /^[\w-]*$/, B = {}, U = B.toString, X = {}, J = A.createElement("div"), W = { tabindex: "tabIndex", readonly: "readOnly", for: "htmlFor", class: "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, Y = Array.isArray || function (t) { return t instanceof Array }; return X.matches = function (t, e) { if (!e || !t || 1 !== t.nodeType) return !1; var n = t.matches || t.webkitMatchesSelector || t.mozMatchesSelector || t.oMatchesSelector || t.matchesSelector; if (n) return n.call(t, e); var r, i = t.parentNode, o = !i; return o && (i = J).appendChild(t), r = ~X.qsa(i, e).indexOf(t), o && J.removeChild(t), r }, w = function (t) { return t.replace(/-+(.)?/g, function (t, e) { return e ? e.toUpperCase() : "" }) }, S = function (t) { return O.call(t, function (e, n) { return t.indexOf(e) == n }) }, X.fragment = function (t, e, n) { var r, i, o; return k.test(t) && (r = j(A.createElement(RegExp.$1))), r || (t.replace && (t = t.replace(M, "<$1>$2>")), e === b && (e = F.test(t) && RegExp.$1), e in I || (e = "*"), (o = I[e]).innerHTML = "" + t, r = j.each(P.call(o.childNodes), function () { o.removeChild(this) })), a(n) && (i = j(r), j.each(n, function (t, e) { z.indexOf(t) > -1 ? i[t](e) : i.attr(t, e) })), r }, X.Z = function (t, e) { return new p(t, e) }, X.isZ = function (t) { return t instanceof X.Z }, X.init = function (t, e) { var r; if (!t) return X.Z(); if ("string" == typeof t) if ("<" == (t = t.trim())[0] && F.test(t)) r = X.fragment(t, RegExp.$1, e), t = null; else { if (e !== b) return j(e).find(t); r = X.qsa(A, t) } else { if (n(t)) return j(A).ready(t); if (X.isZ(t)) return t; if (Y(t)) r = function (t) { return O.call(t, function (t) { return null != t }) }(t); else if (o(t)) r = [t], t = null; else if (F.test(t)) r = X.fragment(t.trim(), RegExp.$1, e), t = null; else { if (e !== b) return j(e).find(t); r = X.qsa(A, t) } } return X.Z(r, t) }, (j = function (t, e) { return X.init(t, e) }).extend = function (t) { var e, n = P.call(arguments, 1); return "boolean" == typeof t && (e = t, t = n.shift()), n.forEach(function (n) { d(t, n, e) }), t }, X.qsa = function (t, e) { var n, r = "#" == e[0], i = !r && "." == e[0], o = r || i ? e.slice(1) : e, a = _.test(o); return t.getElementById && a && r ? (n = t.getElementById(o)) ? [n] : [] : 1 !== t.nodeType && 9 !== t.nodeType && 11 !== t.nodeType ? [] : P.call(a && !r && t.getElementsByClassName ? i ? t.getElementsByClassName(o) : t.getElementsByTagName(e) : t.querySelectorAll(e)) }, j.contains = A.documentElement.contains ? function (t, e) { return t !== e && t.contains(e) } : function (t, e) { for (; e && (e = e.parentNode);)if (e === t) return !0; return !1 }, j.type = e, j.isFunction = n, j.isWindow = r, j.isArray = Y, j.isPlainObject = a, j.isEmptyObject = function (t) { var e; for (e in t) return !1; return !0 }, j.isNumeric = function (t) { var e = Number(t), n = typeof t; return null != t && "boolean" != n && ("string" != n || t.length) && !isNaN(e) && isFinite(e) || !1 }, j.inArray = function (t, e, n) { return C.indexOf.call(e, t, n) }, j.camelCase = w, j.trim = function (t) { return null == t ? "" : String.prototype.trim.call(t) }, j.uuid = 0, j.support = {}, j.expr = {}, j.noop = function () { }, j.map = function (t, e) { var n, r, i, o = []; if (s(t)) for (r = 0; r < t.length; r++)null != (n = e(t[r], r)) && o.push(n); else for (i in t) null != (n = e(t[i], i)) && o.push(n); return u(o) }, j.each = function (t, e) { var n, r; if (s(t)) { for (n = 0; n < t.length; n++)if (!1 === e.call(t[n], n, t[n])) return t } else for (r in t) if (!1 === e.call(t[r], r, t[r])) return t; return t }, j.grep = function (t, e) { return O.call(t, e) }, t.JSON && (j.parseJSON = JSON.parse), j.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (t, e) { B["[object " + e + "]"] = e.toLowerCase() }), j.fn = { constructor: X.Z, length: 0, forEach: C.forEach, reduce: C.reduce, push: C.push, sort: C.sort, splice: C.splice, indexOf: C.indexOf, concat: function () { var t, e, n = []; for (t = 0; t < arguments.length; t++)e = arguments[t], n[t] = X.isZ(e) ? e.toArray() : e; return N.apply(X.isZ(this) ? this.toArray() : this, n) }, map: function (t) { return j(j.map(this, function (e, n) { return t.call(e, n, e) })) }, slice: function () { return j(P.apply(this, arguments)) }, ready: function (t) { return V.test(A.readyState) && A.body ? t(j) : A.addEventListener("DOMContentLoaded", function () { t(j) }, !1), this }, get: function (t) { return t === b ? P.call(this) : this[t >= 0 ? t : t + this.length] }, toArray: function () { return this.get() }, size: function () { return this.length }, remove: function () { return this.each(function () { null != this.parentNode && this.parentNode.removeChild(this) }) }, each: function (t) { return C.every.call(this, function (e, n) { return !1 !== t.call(e, n, e) }), this }, filter: function (t) { return n(t) ? this.not(this.not(t)) : j(O.call(this, function (e) { return X.matches(e, t) })) }, add: function (t, e) { return j(S(this.concat(j(t, e)))) }, is: function (t) { return this.length > 0 && X.matches(this[0], t) }, not: function (t) { var e = []; if (n(t) && t.call !== b) this.each(function (n) { t.call(this, n) || e.push(this) }); else { var r = "string" == typeof t ? this.filter(t) : s(t) && n(t.item) ? P.call(t) : j(t); this.forEach(function (t) { r.indexOf(t) < 0 && e.push(t) }) } return j(e) }, has: function (t) { return this.filter(function () { return o(t) ? j.contains(this, t) : j(this).find(t).size() }) }, eq: function (t) { return -1 === t ? this.slice(t) : this.slice(t, +t + 1) }, first: function () { var t = this[0]; return t && !o(t) ? t : j(t) }, last: function () { var t = this[this.length - 1]; return t && !o(t) ? t : j(t) }, find: function (t) { var e = this; return t ? "object" == typeof t ? j(t).filter(function () { var t = this; return C.some.call(e, function (e) { return j.contains(e, t) }) }) : 1 == this.length ? j(X.qsa(this[0], t)) : this.map(function () { return X.qsa(this, t) }) : j() }, closest: function (t, e) { var n = [], r = "object" == typeof t && j(t); return this.each(function (o, a) { for (; a && !(r ? r.indexOf(a) >= 0 : X.matches(a, t));)a = a !== e && !i(a) && a.parentNode; a && n.indexOf(a) < 0 && n.push(a) }), j(n) }, parents: function (t) { for (var e = [], n = this; n.length > 0;)n = j.map(n, function (t) { return (t = t.parentNode) && !i(t) && e.indexOf(t) < 0 ? (e.push(t), t) : void 0 }); return m(e, t) }, parent: function (t) { return m(S(this.pluck("parentNode")), t) }, children: function (t) { return m(this.map(function () { return h(this) }), t) }, contents: function () { return this.map(function () { return this.contentDocument || P.call(this.childNodes) }) }, siblings: function (t) { return m(this.map(function (t, e) { return O.call(h(e.parentNode), function (t) { return t !== e }) }), t) }, empty: function () { return this.each(function () { this.innerHTML = "" }) }, pluck: function (t) { return j.map(this, function (e) { return e[t] }) }, show: function () { return this.each(function () { var t, e, n; "none" == this.style.display && (this.style.display = ""), "none" == getComputedStyle(this, "").getPropertyValue("display") && (this.style.display = (t = this.nodeName, D[t] || (e = A.createElement(t), A.body.appendChild(e), n = getComputedStyle(e, "").getPropertyValue("display"), e.parentNode.removeChild(e), "none" == n && (n = "block"), D[t] = n), D[t])) }) }, replaceWith: function (t) { return this.before(t).remove() }, wrap: function (t) { var e = n(t); if (this[0] && !e) var r = j(t).get(0), i = r.parentNode || this.length > 1; return this.each(function (n) { j(this).wrapAll(e ? t.call(this, n) : i ? r.cloneNode(!0) : r) }) }, wrapAll: function (t) { if (this[0]) { j(this[0]).before(t = j(t)); for (var e; (e = t.children()).length;)t = e.first(); j(t).append(this) } return this }, wrapInner: function (t) { var e = n(t); return this.each(function (n) { var r = j(this), i = r.contents(), o = e ? t.call(this, n) : t; i.length ? i.wrapAll(o) : r.append(o) }) }, unwrap: function () { return this.parent().each(function () { j(this).replaceWith(j(this).children()) }), this }, clone: function () { return this.map(function () { return this.cloneNode(!0) }) }, hide: function () { return this.css("display", "none") }, toggle: function (t) { return this.each(function () { var e = j(this); (t === b ? "none" == e.css("display") : t) ? e.show() : e.hide() }) }, prev: function (t) { return j(this.pluck("previousElementSibling")).filter(t || "*") }, next: function (t) { return j(this.pluck("nextElementSibling")).filter(t || "*") }, html: function (t) { return 0 in arguments ? this.each(function (e) { var n = this.innerHTML; j(this).empty().append(v(this, t, e, n)) }) : 0 in this ? this[0].innerHTML : null }, text: function (t) { return 0 in arguments ? this.each(function (e) { var n = v(this, t, e, this.textContent); this.textContent = null == n ? "" : "" + n }) : 0 in this ? this.pluck("textContent").join("") : null }, attr: function (t, e) { var n; return "string" != typeof t || 1 in arguments ? this.each(function (n) { if (1 === this.nodeType) if (o(t)) for (E in t) g(this, E, t[E]); else g(this, t, v(this, e, n, this.getAttribute(t))) }) : 0 in this && 1 == this[0].nodeType && null != (n = this[0].getAttribute(t)) ? n : b }, removeAttr: function (t) { return this.each(function () { 1 === this.nodeType && t.split(" ").forEach(function (t) { g(this, t) }, this) }) }, prop: function (t, e) { return t = W[t] || t, 1 in arguments ? this.each(function (n) { this[t] = v(this, e, n, this[t]) }) : this[0] && this[0][t] }, removeProp: function (t) { return t = W[t] || t, this.each(function () { delete this[t] }) }, data: function (t, e) { var n = "data-" + t.replace(Z, "-$1").toLowerCase(), r = 1 in arguments ? this.attr(n, e) : this.attr(n); return null !== r ? x(r) : b }, val: function (t) { return 0 in arguments ? (null == t && (t = ""), this.each(function (e) { this.value = v(this, t, e, this.value) })) : this[0] && (this[0].multiple ? j(this[0]).find("option").filter(function () { return this.selected }).pluck("value") : this[0].value) }, offset: function (e) { if (e) return this.each(function (t) { var n = j(this), r = v(this, e, t, n.offset()), i = n.offsetParent().offset(), o = { top: r.top - i.top, left: r.left - i.left }; "static" == n.css("position") && (o.position = "relative"), n.css(o) }); if (!this.length) return null; if (A.documentElement !== this[0] && !j.contains(A.documentElement, this[0])) return { top: 0, left: 0 }; var n = this[0].getBoundingClientRect(); return { left: n.left + t.pageXOffset, top: n.top + t.pageYOffset, width: Math.round(n.width), height: Math.round(n.height) } }, css: function (t, n) { if (arguments.length < 2) { var r = this[0]; if ("string" == typeof t) { if (!r) return; return r.style[w(t)] || getComputedStyle(r, "").getPropertyValue(t) } if (Y(t)) { if (!r) return; var i = {}, o = getComputedStyle(r, ""); return j.each(t, function (t, e) { i[e] = r.style[w(e)] || o.getPropertyValue(e) }), i } } var a = ""; if ("string" == e(t)) n || 0 === n ? a = c(t) + ":" + f(t, n) : this.each(function () { this.style.removeProperty(c(t)) }); else for (E in t) t[E] || 0 === t[E] ? a += c(E) + ":" + f(E, t[E]) + ";" : this.each(function () { this.style.removeProperty(c(E)) }); return this.each(function () { this.style.cssText += ";" + a }) }, index: function (t) { return t ? this.indexOf(j(t)[0]) : this.parent().children().indexOf(this[0]) }, hasClass: function (t) { return !!t && C.some.call(this, function (t) { return this.test(y(t)) }, l(t)) }, addClass: function (t) { return t ? this.each(function (e) { if ("className" in this) { T = []; var n = y(this); v(this, t, e, n).split(/\s+/g).forEach(function (t) { j(this).hasClass(t) || T.push(t) }, this), T.length && y(this, n + (n ? " " : "") + T.join(" ")) } }) : this }, removeClass: function (t) { return this.each(function (e) { if ("className" in this) { if (t === b) return y(this, ""); T = y(this), v(this, t, e, T).split(/\s+/g).forEach(function (t) { T = T.replace(l(t), " ") }), y(this, T.trim()) } }) }, toggleClass: function (t, e) { return t ? this.each(function (n) { var r = j(this); v(this, t, n, y(this)).split(/\s+/g).forEach(function (t) { (e === b ? !r.hasClass(t) : e) ? r.addClass(t) : r.removeClass(t) }) }) : this }, scrollTop: function (t) { if (this.length) { var e = "scrollTop" in this[0]; return t === b ? e ? this[0].scrollTop : this[0].pageYOffset : this.each(e ? function () { this.scrollTop = t } : function () { this.scrollTo(this.scrollX, t) }) } }, scrollLeft: function (t) { if (this.length) { var e = "scrollLeft" in this[0]; return t === b ? e ? this[0].scrollLeft : this[0].pageXOffset : this.each(e ? function () { this.scrollLeft = t } : function () { this.scrollTo(t, this.scrollY) }) } }, position: function () { if (this.length) { var t = this[0], e = this.offsetParent(), n = this.offset(), r = R.test(e[0].nodeName) ? { top: 0, left: 0 } : e.offset(); return n.top -= parseFloat(j(t).css("margin-top")) || 0, n.left -= parseFloat(j(t).css("margin-left")) || 0, r.top += parseFloat(j(e[0]).css("border-top-width")) || 0, r.left += parseFloat(j(e[0]).css("border-left-width")) || 0, { top: n.top - r.top, left: n.left - r.left } } }, offsetParent: function () { return this.map(function () { for (var t = this.offsetParent || A.body; t && !R.test(t.nodeName) && "static" == j(t).css("position");)t = t.offsetParent; return t }) } }, j.fn.detach = j.fn.remove, ["width", "height"].forEach(function (t) { var e = t.replace(/./, function (t) { return t[0].toUpperCase() }); j.fn[t] = function (n) { var o, a = this[0]; return n === b ? r(a) ? a["inner" + e] : i(a) ? a.documentElement["scroll" + e] : (o = this.offset()) && o[t] : this.each(function (e) { (a = j(this)).css(t, v(this, n, e, a[t]())) }) } }), ["after", "prepend", "before", "append"].forEach(function (n, r) { var i = r % 2; j.fn[n] = function () { var n, o, a = j.map(arguments, function (t) { var r = []; return "array" == (n = e(t)) ? (t.forEach(function (t) { return t.nodeType !== b ? r.push(t) : j.zepto.isZ(t) ? r = r.concat(t.get()) : void (r = r.concat(X.fragment(t))) }), r) : "object" == n || null == t ? t : X.fragment(t) }), s = this.length > 1; return a.length < 1 ? this : this.each(function (e, n) { o = i ? n : n.parentNode, n = 0 == r ? n.nextSibling : 1 == r ? n.firstChild : 2 == r ? n : null; var u = j.contains(A.documentElement, o); a.forEach(function (e) { if (s) e = e.cloneNode(!0); else if (!o) return j(e).remove(); o.insertBefore(e, n), u && function t(e, n) { n(e); for (var r = 0, i = e.childNodes.length; i > r; r++)t(e.childNodes[r], n) }(e, function (e) { if (!(null == e.nodeName || "SCRIPT" !== e.nodeName.toUpperCase() || e.type && "text/javascript" !== e.type || e.src)) { var n = e.ownerDocument ? e.ownerDocument.defaultView : t; n.eval.call(n, e.innerHTML) } }) }) }) }, j.fn[i ? n + "To" : "insert" + (r ? "Before" : "After")] = function (t) { return j(t)[n](this), this } }), X.Z.prototype = p.prototype = j.fn, X.uniq = S, X.deserializeValue = x, j.zepto = X, j }(); return t.Zepto = e, void 0 === t.$ && (t.$ = e), function (e) { function n(t) { return t._zid || (t._zid = h++) } function r(t, e, r, o) { if ((e = i(e)).ns) var a = function (t) { return new RegExp("(?:^| )" + t.replace(" ", " .* ?") + "(?: |$)") }(e.ns); return (v[n(t)] || []).filter(function (t) { return t && (!e.e || t.e == e.e) && (!e.ns || a.test(t.ns)) && (!r || n(t.fn) === n(r)) && (!o || t.sel == o) }) } function i(t) { var e = ("" + t).split("."); return { e: e[0], ns: e.slice(1).sort().join(" ") } } function o(t, e) { return t.del && !y && t.e in x || !!e } function a(t) { return b[t] || y && x[t] || t } function s(t, r, s, u, l, h, p) { var d = n(t), m = v[d] || (v[d] = []); r.split(/\s/).forEach(function (n) { if ("ready" == n) return e(document).ready(s); var r = i(n); r.fn = s, r.sel = l, r.e in b && (s = function (t) { var n = t.relatedTarget; return !n || n !== this && !e.contains(this, n) ? r.fn.apply(this, arguments) : void 0 }), r.del = h; var d = h || s; r.proxy = function (e) { if (!(e = c(e)).isImmediatePropagationStopped()) { e.data = u; var n = d.apply(t, e._args == f ? [e] : [e].concat(e._args)); return !1 === n && (e.preventDefault(), e.stopPropagation()), n } }, r.i = m.length, m.push(r), "addEventListener" in t && t.addEventListener(a(r.e), r.proxy, o(r, p)) }) } function u(t, e, i, s, u) { var c = n(t); (e || "").split(/\s/).forEach(function (e) { r(t, e, i, s).forEach(function (e) { delete v[c][e.i], "removeEventListener" in t && t.removeEventListener(a(e.e), e.proxy, o(e, u)) }) }) } function c(t, n) { return (n || !t.isDefaultPrevented) && (n || (n = t), e.each(w, function (e, r) { var i = n[e]; t[e] = function () { return this[r] = E, i && i.apply(n, arguments) }, t[r] = j }), t.timeStamp || (t.timeStamp = Date.now()), (n.defaultPrevented !== f ? n.defaultPrevented : "returnValue" in n ? !1 === n.returnValue : n.getPreventDefault && n.getPreventDefault()) && (t.isDefaultPrevented = E)), t } function l(t) { var e, n = { originalEvent: t }; for (e in t) T.test(e) || t[e] === f || (n[e] = t[e]); return c(n, t) } var f, h = 1, p = Array.prototype.slice, d = e.isFunction, m = function (t) { return "string" == typeof t }, v = {}, g = {}, y = "onfocusin" in t, x = { focus: "focusin", blur: "focusout" }, b = { mouseenter: "mouseover", mouseleave: "mouseout" }; g.click = g.mousedown = g.mouseup = g.mousemove = "MouseEvents", e.event = { add: s, remove: u }, e.proxy = function (t, r) { var i = 2 in arguments && p.call(arguments, 2); if (d(t)) { var o = function () { return t.apply(r, i ? i.concat(p.call(arguments)) : arguments) }; return o._zid = n(t), o } if (m(r)) return i ? (i.unshift(t[r], t), e.proxy.apply(null, i)) : e.proxy(t[r], t); throw new TypeError("expected function") }, e.fn.bind = function (t, e, n) { return this.on(t, e, n) }, e.fn.unbind = function (t, e) { return this.off(t, e) }, e.fn.one = function (t, e, n, r) { return this.on(t, e, n, r, 1) }; var E = function () { return !0 }, j = function () { return !1 }, T = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/, w = { preventDefault: "isDefaultPrevented", stopImmediatePropagation: "isImmediatePropagationStopped", stopPropagation: "isPropagationStopped" }; e.fn.delegate = function (t, e, n) { return this.on(e, t, n) }, e.fn.undelegate = function (t, e, n) { return this.off(e, t, n) }, e.fn.live = function (t, n) { return e(document.body).delegate(this.selector, t, n), this }, e.fn.die = function (t, n) { return e(document.body).undelegate(this.selector, t, n), this }, e.fn.on = function (t, n, r, i, o) { var a, c, h = this; return t && !m(t) ? (e.each(t, function (t, e) { h.on(t, n, r, e, o) }), h) : (m(n) || d(i) || !1 === i || (i = r, r = n, n = f), (i === f || !1 === r) && (i = r, r = f), !1 === i && (i = j), h.each(function (f, h) { o && (a = function (t) { return u(h, t.type, i), i.apply(this, arguments) }), n && (c = function (t) { var r, o = e(t.target).closest(n, h).get(0); return o && o !== h ? (r = e.extend(l(t), { currentTarget: o, liveFired: h }), (a || i).apply(o, [r].concat(p.call(arguments, 1)))) : void 0 }), s(h, t, i, r, n, c || a) })) }, e.fn.off = function (t, n, r) { var i = this; return t && !m(t) ? (e.each(t, function (t, e) { i.off(t, n, e) }), i) : (m(n) || d(r) || !1 === r || (r = n, n = f), !1 === r && (r = j), i.each(function () { u(this, t, r, n) })) }, e.fn.trigger = function (t, n) { return (t = m(t) || e.isPlainObject(t) ? e.Event(t) : c(t))._args = n, this.each(function () { t.type in x && "function" == typeof this[t.type] ? this[t.type]() : "dispatchEvent" in this ? this.dispatchEvent(t) : e(this).triggerHandler(t, n) }) }, e.fn.triggerHandler = function (t, n) { var i, o; return this.each(function (a, s) { (i = l(m(t) ? e.Event(t) : t))._args = n, i.target = s, e.each(r(s, t.type || t), function (t, e) { return o = e.proxy(i), !i.isImmediatePropagationStopped() && void 0 }) }), o }, "focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function (t) { e.fn[t] = function (e) { return 0 in arguments ? this.bind(t, e) : this.trigger(t) } }), e.Event = function (t, e) { m(t) || (t = (e = t).type); var n = document.createEvent(g[t] || "Events"), r = !0; if (e) for (var i in e) "bubbles" == i ? r = !!e[i] : n[i] = e[i]; return n.initEvent(t, r, !0), c(n) } }(e), function (e) { function n(t, n, r) { var i = e.Event(n); return e(t).trigger(i, r), !i.isDefaultPrevented() } function r(t, e, r, i) { return t.global ? n(e || g, r, i) : void 0 } function i(t) { t.global && 0 == e.active++ && r(t, null, "ajaxStart") } function o(t) { t.global && !--e.active && r(t, null, "ajaxStop") } function a(t, e) { var n = e.context; return !1 !== e.beforeSend.call(n, t, e) && !1 !== r(e, n, "ajaxBeforeSend", [t, e]) && void r(e, n, "ajaxSend", [t, e]) } function s(t, e, n, i) { var o = n.context, a = "success"; n.success.call(o, t, a, e), i && i.resolveWith(o, [t, a, e]), r(n, o, "ajaxSuccess", [e, n, t]), c(a, e, n) } function u(t, e, n, i, o) { var a = i.context; i.error.call(a, n, e, t), o && o.rejectWith(a, [n, e, t]), r(i, a, "ajaxError", [n, i, t || e]), c(e, n, i) } function c(t, e, n) { var i = n.context; n.complete.call(i, e, t), r(n, i, "ajaxComplete", [e, n]), o(n) } function l() { } function f(t) { return t && (t = t.split(";", 2)[0]), t && (t == j ? "html" : t == E ? "json" : x.test(t) ? "script" : b.test(t) && "xml") || "text" } function h(t, e) { return "" == e ? t : (t + "&" + e).replace(/[&?]{1,2}/, "?") } function p(t, n, r, i) { return e.isFunction(n) && (i = r, r = n, n = void 0), e.isFunction(r) || (i = r, r = void 0), { url: t, data: n, success: r, dataType: i } } var d, m, v = +new Date, g = t.document, y = /
有车以后隐私政策
版本更新日期:2023年5月16日
版本生效日期:2023年5月16日
有车以后应用是由广州市有车以后信息科技有限公司(注册地址:广州市海珠区新港西路135号中大科技园B座1403-1404,以下称“我们”或“有车以后”)作为运营主体为您提供的一款汽车资讯和交易服务产品。我们非常重视用户的隐私和个人信息保护,并会尽全力保护您的个人信息和数据。我们承诺依照《中华人民共和国网络安全法》《中华人民共和国个人信息保护法》《信息安全技术个人信息安全规范》等法律法规制定并保护您的个人信息安全。
我们通过本《隐私政策》向您说明我们如何收集、使用、存储、分享、转让及保护个人信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。其中,有关您个人信息权益的重要内容我们已用加粗或下划线形式提示,请特别关注。
请您仔细阅读本《隐私政策》并确定了解我们对您个人信息的处理规则,如您不同意协议中的任何条款或约定,我们将无法为您提供完整的产品以及服务,并且您有权选择立即停止使用相关服务。
特别提示:
为实现业务功能或根据法律法规要求所必需,我们会在您使用特定功能或服务时收集、使用您的个人敏感信息,此时会根据您的实际使用情况单独征求您的同意。
如果您未注册/登录账号,我们会通过设备对应的标识符信息来保障信息通知推送的基本功能。如果您登录账号后,我们会根据您的账号信息实现信息通知推送。
针对精确地理位置权限、相册权限(存储读取/写入)、麦克风权限、相机权限,均不会默认开启,只有经过您的明示授权才会在实现特定功能或服务时使用。具体权限申请和使用的说明情况请查阅:应用权限申请与使用情况说明,您也可以通过操作系统“设置-应用管理”撤回授权。
本政策将帮助您了解以下内容:
- 适用范围
- 我们如何收集和使用您的个人信息
- 我们如何使用 Cookie 和同类技术
- 我们如何共享、转让、公开披露您的个人信息
- 我们如何存储个人信息
- 我们如何保护您的个人信息
- 您如何管理个人信息
- 未成年人信息的保护
- 《隐私政策》的修订、通知和查看
- 联系我们
- 附录
一、适用范围
本《隐私政策》适用于由我们运营主体提供的有车以后App产品及相关服务,包括但不限于App应用程序、官网、M站、小程序。除本《隐私政策》另有规定外,本《隐私政策》所用词语与《有车以后用户协议》所定义的词语具有相同的涵义。
本《隐私政策》不适用于:
1)第三方产品或服务,包括在我们应用内为您展示的产品或网站和广告或服务链接跳转到的其他产品或网站;
2)为我们的产品或服务进行广告宣传的其他第三方。
您使用这些第三方服务(包括您向这些第三方提供的任何个人信息),将受这些第三方的服务条款及隐私政策约束(而非本《隐私政策》),请您仔细阅读第三方的条款并妥善保护自己的个人信息,仅在必要的情况下向第三方提供。
请您了解,本《隐私政策》中所述的产品功能及相关服务会根据您所使用的设备型号、系统版本、软件应用程序版本、移动客户端等因素而有所不同。最终的产品功能和相关服务以您所使用的为准。
二、我们如何收集和使用您的个人信息
1. 我们主动收集与使用的个人信息
我们会按照如下方式收集和使用您在使用我们服务时主动提供的,以及通过自动化手段收集您在使用功能或接受服务过程中产生的信息,用以实现我们的一些基础功能或服务。如果您不提供相关信息,您将无法享受我们提供的完整功能和相关服务。请注意:如果您提供的信息中包括非您本人的个人信息,请确保您已取得相关主体的同意。
1.1 注册、登录与认证服务
您注册的账号,属于广州市有车以后信息科技有限公司主体(以下或称“有车以后”)运营的统一平台账号体系(点击了解)。
如果您不提供下述所列举的信息,则无法完成账号注册、登录或认证,但这不会影响您使用我们提供的内容浏览、选车、养车等服务。
1)注册并登录有车以后账号
当您注册我们的应用时,您可以通过手机号码创建账号,我们将通过发送短信验证码来验证您的身份是否有效,并且您可以完善相关的网络身份识别信息(包括:头像、昵称或名称、性别、个人简介)。当您成为我们的注册用户,并准备登录时,您同样需要提供您注册时的手机号码和相应的验证码。收集这些信息是为了帮助你完成注册和登录功能,在您之后的使用过程中,我们的客服人员会根据需要,使用该手机号码与您联系,以响应您的反馈需求。
2)第三方账号登录(微信登录)
您也可通过第三方账号注册并登录应用服务,此时代表您将授权我们获取您在第三方平台注册的公开信息(头像、昵称、地区、性别以及您授权的其他信息),并在您同意本《隐私政策》后将您的账号与第三方账号绑定,以便通过第三方账号直接登录并使用我们的产品和服务。
您也可以进入“设置-账号管理”处理您的账号与第三方账号的绑定。如果您对此有疑问,请及时通过「联系我们」方式联系我们。
3)一键登录(仅APP适用)
当您选择适用「一键登录」方式注册并登录我们的应用时,我们会通过从移动运营商(中国联通、中国移动、中国电信)处获取您的手机号码及该号码所属的运营商信息。请在操作前根据提示查看运营商的服务条款,如您不使用「一键登录」功能,您可以通过其他方式进行注册和登录。
4)认证服务
在您使用需要身份认证的功能和相关服务时,根据相关法律法规,您需要提供您的真实身份信息(真实姓名、身份证号码以及进行实名认证所需要的其他信息)以便完成实名验证。这些信息属于个人敏感信息,您务必清晰理解,如果拒绝提供,您将无法获得相关服务,但不影响其他功能与服务的正常使用。
5)忘记密码
当您登录账号忘记密码时,可使用“忘记密码”功能,此时我们会要求您提供您账号绑定手机号、账号密码,其中手机号用于发送短信验证码,以便验证您的账号身份
1.2 车主认证服务
当您使用车主认证功能时(“我的”-“车主认证”),您需要向我们提供您的联系电话、行驶证、购车发票,以便我们认证您的车主身份。请您注意:电话号码(手机号)、证件信息属于个人敏感信息,我们收集信息仅用于验证身份真实性以便提供更多车主服务,您在提供前需要清晰理解。如果您不提供,将导致我们无法认证您的车主身份,但不影响其他功能与服务的正常使用。
1.3 资讯浏览、信息咨询服务(汽车资讯内容、经销商展示)
1)为了让您快速地找到您所感兴趣的汽车资讯内容,或提供更适合您的顾问咨询、附近经销商服务,我们会收集必要的信息,包括:
- 您操作、使用的行为日志:点击、关注、收藏、搜索词、浏览、分享;
- 您主动提供的信息:反馈、发布、点赞、评论;
- 您主动授权的地理定位信息:GPS位置信息、WLAN接入点、基站信息;
- 您的设备和网络信息:设备标识符、IP地址;
2)地理定位信息(GPS)是敏感个人信息,需要您的主动授权,如果您拒绝授权提供,我们将不会根据精确地理位置信息向您推荐或展示内容和服务,但这并不影响其他功能的正常使用;您可以在手机“设置-应用权限”(具体参考您的设备系统指引)管理界面关闭定位权限,以拒绝我们获取您的精确地理位置信息;
3)我们会基于IP网络地址对应的城市向您展示、推荐您所在地区的相关资讯内容、经销商服务;
4)我们收集、使用上述信息进行了去标识化处理,数据分析仅对应特定的、无法直接关联您身份的编码,不会与您的真实身份相关联。
1.4 信息发布服务
您在首页内容栏目发布帖子、口碑、提问或回答,或在资讯内容下方发表评论时,我们将收集您发布的信息,并展示您的昵称、头像、发布内容、发布时间信息。
1)当您选择图片、音视频上传发布内容时,我们会请求您授权相机权限、相册读取权限(存储)、麦克风权限。如果您拒绝授权提供,将无法使用此功能,但不影响您使用其他功能;
2)请您知悉并理解:您发布的任何内容都将在我们应用中公开展示,如果包含您或他人的个人信息,会对您或他人产生一定风险,建议您谨慎提交,并且确保您和他人的个人信息已经获得其主体本人的授权同意。
1.5 互动交流功能和服务
您主动关注您感兴趣的账号、话题并与之进行互动时,包括:浏览、关注、评论、收藏、点赞或分享时,我们会收集您关注的账号,并在之后向您展示该关注账号的已发布内容;
您主动订阅您感兴趣车车系/车型的降价提醒,我们将会收集您订阅的车系/车型,添加到清单中,并在之后向您发送该车系/车型的降价通知;
您在分享或接受分享的内容、活动时,我们需要读取分享链接中的链接参数,以实现跳转功能或服务。
您知悉并同意,在我们的互动功能运营过程中会通过应用消息通知方式向您告知新的互动消息,或者,向在前述过程中收集的手机号码通过短信、电话的方式,为您提供您感兴趣的内容或服务、功能或活动等商业性信息。请您放心,如您不愿意接受这些信息,您可以在APP中通过“设置-新消息通知”关闭相应的功能,或通过「联系我们」提供的方式与我们联系处理取消;
如果您不希望提供上述信息,您可以拒绝使用包括关注、订阅、分享在内的互动功能,但不影响您使用其他功能和服务;
1.6 搜索(资讯内容、车型、经销商优惠)
您使用搜索时,我们会收集您的网络IP地址信息、搜索关键字、日志信息,并向您展示搜索结果内容、搜索历史记录。
为了提供高效的搜索服务,上述搜索关键字、日志信息会暂时存储在您的本地存储设备中。
您可以在搜索页选择删除本地记录的搜索关键字历史记录。如果您不提供上述信息,将无法使用搜索服务,但不影响您使用其他功能和服务。
1.7 在线咨询底价、下订服务(选车、买靓车)
当您希望获得我们提供的经销商/厂商/集团及相关金融服务方提供的促销价格、团购优惠、分期方案、金融优惠等购车权益活动时,请详细阅读页面中的“咨询服务个人信息保护声明”条款,我们会按如下方式收集您的必要信息。
1)免费咨询
当您访问车型优惠信息并使用咨询服务时,您需要提供您的姓名、手机号码、购车地区信息,以便我们将您的咨询请求发送给您选择的经销商或者运营客服。如您不提供前述信息,则无法使用咨询服务,但不影响您使用其他功能和服务。
2)下订服务
当您访问车型优惠信息并使用下订服务时,您需要提供您的购车车型信息、姓名、手机号码、购车地区信息,同时订单中会记录您预订的购车优惠、订单号、创建时间、订单金额信息,以便我们帮助您锁定购车优惠权益,查询和管理订单信息以及提供售前和售后客服服务。
3)支付服务
当您参与购车权益预订活动时,你需要支付一定金额的意向金/订金用于锁定优惠权益,在您提交订单后,您需要授权我们合作的第三方支付机构(微信支付或银联)所提供的支付服务。我们需要将您的订单交易金额和相关必要信息与这些支付机构共享,已实现其确认您的支付指令并完成支付。为方便我们及时获悉并确认您的支付进度及状态、为您提供售后和争议解决服务,您需要授权并同意我们可从您选择的支付金融机构处收集与支付进度相关的信息。
1.8 车品商城(养车)、虚拟币兑换、特权和福利相关服务
1)商城
您可通过商城兑换、购买实物或虚拟物品,您在使用购买服务时需要提供您的收货人姓名,联系电话以及收货地址信息,以便接受我们及我们的合作商提供的服务。
2)有车黑金卡特权
您可以开通、使用有车黑金卡的相关特权,您在开通、使用的过程中需要提供您的收货人姓名,联系电话以及收货地址信息。
3)支付服务
当您购买商品、开通特权时,你需要支付一定金额的用于完成订单,在您提交订单后,您需要授权我们合作的第三方支付机构(微信支付或银联)所提供的支付服务。
我们需要将您的订单交易金额和相关必要信息与这些支付机构共享,已实现其确认您的支付指令并完成支付。为方便我们及时获悉并确认您的支付进度及状态、为您提供售后和争议解决服务,您需要授权并同意我们可从您选择的支付金融机构处收集与支付进度相关的信息。
1.9 开展营销活动
当您选择参加我们举办的有关营销活动时,根据活动需要,您可能需要提供姓名、联系方式、联系地址、身份证号信息,这些信息包含个人敏感信息,并有可能需要支付活动要求的费用。这是您参加活动所必要的条件,您有权拒绝提供信息或支付费用。如果您拒绝提供活动所需信息或拒绝支付活动所需费用,我们无法将您列入相关的活动参与名单,但不会影响您使用其他功能和服务。
1.10 客服与售后功能
- 当您与我们联系或提出咨询、投诉、争议纠纷处理等申请时,为保障您的账号与系统安全,我们需要您提供必要的个人信息以核验您的身份,为您提供相关服务。
- 为便于与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们会根据必要性保存您与我们的通信/通话记录及相关内容(包括您的账号信息、订单信息、联系方式以及提供的其他信息)
1.11 保障产品、服务及用户使用安全和风险控制
我们致力于提供可靠、安全、可信的产品与使用环境,为帮助更好地了解我们服务的运行环境和情况,以确保产品服务运行的安全,我们会收集如下必要信息
1)为保障软件的安全运行,我们会收集:
- 您的设备和软件信息,包括:设备唯一识别标识(IMEI/MEID/Android ID/IDFA/OpenUDID/IDFV/SIM卡IMSI信息/网络设备Mac地址,其中获取设备标识时,部分手机会弹窗提示您授权申请读取通话状态权限)、设备品牌、设备型号、屏幕分辨率、操作系统版本号;
- 您的网络信息,包括:IP地址、网络运营商、网络接入方式、基站、WLAN接入点、网络状态、网络质量数据;
2)为预防恶意程序以及提升应用运行体验,我们会收集应用日志:应用运行日志、崩溃日志、性能数据、渠道来源、总体安装应用情况;
3)为更准确地预防钓鱼网站欺诈和保护账号安全,我们会使用您的账号信息、浏览信息、订单信息、设备信息、服务日志信息以及我们关联公司、合作方在获得您授权或依法可以共享的信息,来判断您的账号风险、检测及防范安全事件。
4)为更好的提升您在使用我们产品服务过程中的体验和节省网络流量,我们会尝试申请读/写存储权限来缓存部分网络数据,若您拒绝提供可能会影响使用体验。
5)您提供上述信息,将在APP启动后的必要阶段申请获取一次,并在本次服务期间授权我们使用。您可以在手机机系统“设置-应用权限”(不同设备系统路径可能不同)关闭相应权限以拒绝我们获取信息。
1.12 其他收集信息的场景
1)当您希望在应用内直接与相关服务商(经销商客服)进行电话联系时,我们会申请电话权限,申请该权限的目的仅为帮助您调起手机拨号键盘和显示对方电话以实现您在App内即可进行电话拨打,请您放心,我们不会通过该权限获取您的电话号码、通话内容,也不会在您不知情的情况下拨打电话。您如果拒绝授权提供,将无法使用此功能,但不影响您正常使用其他功能。
2)为提升您在询价或咨询功能时的使用体验,我们会在您进行询价及预约咨询的页面帮您预先填写您登录时或最近询价留资时使用的手机号(号码展示时中间四位会去标识化处理),且只有在您点击提交按钮之后才会根据您的授权进行共享。若您拒绝使用手机号预填充功能,也可直接在页面主动输入相关信息并继续使用我们的产品/服务。
为提供更便捷的功能及/或服务,提升您的体验,我们会提供其他基于系统权限的附加服务,如果您不同意开启相关权限,不会影响您使用基本服务,但您可能无法使用相关的附加服务给您带来的体验,您可点击应用权限申请与使用情况说明查阅详细说明。
2. 我们可能从第三方获得的您的个人信息
2.1 当您使用第三方账号登录时,经过您的明确同意授权,我们会收集第三方账号的昵称、头像、地区、性别以及您单独授权的其他信息;
2.2 其他用户使用我们的产品或服务而被我们收集的信息,其他用户使用内容发布的信息中可能含有您的部分信息(包括:评论、留言、发布图文、音视频);
2.3 您在使用由我们运营主体或关联方所提供的其他产品或服务中填写或发布的信息(包括:账号、评论、发布文本/音视频内容),包括:有车以后+小程序,车小蜂App;
2.4 为提供更好的服务,如您通过我们的服务向相关汽车经销商、厂商及集团询价,且您最终通过其购买相关车辆,您同意我们上述主体在许可的前提下,依法依规获取您的实际购买成交信息,这些信息不包含敏感信息。
3. 收集、使用个人信息目的变更的处理
请您了解,随着我们业务的发展,可能会对当前产品的功能和服务有所调整变化。原则上,当新功能或服务与当前提供的功能或服务场景相关时,收集与使用的个人信息将与原处理目的具有直接或合理关联。在与原处理目的无直接或合理关联的场景下,我们收集、使用您的个人信息,会再次按照法律法规的要求以页面提示、交互流程、协议确认方式向您进行告知,并征得您的同意。
4. 依法豁免征得您授权同意的收集和使用个人信息
请您理解,根据法律法规及相关国家标准,在以下情形中,我们收集、使用和对外提供您的个人信息无需征得您的授权同意:
1)与个人信息控制者履行法律法规规定的义务相关的;
2)与国家安全、国防安全直接相关的;
3)与公共安全、公共卫生、重大公共利益直接相关的;
4)与犯罪侦查、起诉、审判和判决执行等直接相关的,或公安、检察院、法院、工商行政管理局等有权机关要求提供的;
5)出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
6)所涉及的个人信息是个人信息主体自行向社会公众公开的;
7)从合法公开披露的信息中收集的您的个人信息的,包括:合法的新闻报道、政府信息公开等渠道;
8)根据个人信息主体要求签订和履行合同所必需的;
9)用于维护所提供的产品及相关服务的安全稳定运行所必需的,例如发现、处置产品及相关服务的故障;
10)为合法的新闻报道所必需的;
11)学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;
12)法律法规规定的其他情形。
5. 您个人信息使用的规则
特别提示您注意,如信息无法单独或结合其他信息识别到您的个人身份,其不属于法律意义上您的个人信息;当您的信息可以单独或结合其他信息识别到您的个人身份时,或我们将无法与任何特定个人信息建立联系的数据与您的个人信息结合使用时,这些信息在结合使用期间,将作为您的个人信息按照本隐私政策处理与保护;
1)我们会根据本《隐私政策》的约定并为实现我们的服务与/或产品功能对所收集的个人信息进行使用。
2)在收集您的个人信息后,我们将通过技术手段对数据进行去标识化处理,去标识化处理的信息将无法识别主体。请您了解并同意,在此情况下我们有权使用已经去标识化的信息;并在不透露您个人信息的前提下,我们有权对用户数据库进行分析并予以商业化的利用。
3)请您注意,您在使用我们的产品或相关服务时所提供的所有个人信息,除非您删除或通过系统设置拒绝我们收集,否则将在您使用我们的产品与/或服务期间持续授权我们使用。在您注销账号时,我们将停止使用并删除您的个人信息或对您的个人信息进行匿名化处理。
4)我们会对我们的产品或相关服务使用情况进行统计,并可能会与公众或第三方共享这些统计信息,以展示我们的产品或相关服务的整体使用趋势。但这些统计信息不包含您的任何身份识别信息。
5)当我们需要展示您的信息时,我们会采用包括内容替换、匿名处理方式对您的个人信息进行脱敏,以保护您的个人信息安全。
6)当我们要将您的个人信息用于本《隐私政策》未载明的其它用途时,或基于特定目的收集而来的信息用于其他目的时,会通过您主动做出勾选或弹窗等形式事先征求您的同意。
三、我们如何使用 Cookie 和同类技术
Cookie和同类技术是互联网中的普遍常用技术。当您使用产品及相关服务时,我们可能会使用相关技术向您的设备发送一个或多个Cookie或匿名标识符(Cookie 通常包含标识符、站点名称以及一些号码和字符),以收集、标识和存储您访问、使用本产品时的信息。我们不会将上述信息用于本隐私政策所述目的之外的任何用途,我们使用 Cookie 和同类技术主要为了实现以下功能或服务:
1)保障产品与服务的安全、高效运转
我们可能会设置认证与保障安全性的cookie 或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈等不法行为,这些技术还会帮助我们改进服务效率,提升登录和响应速度。
2)帮助您获得更轻松的访问体验
使用此类技术可以帮助您省去重复填写个人信息、输入搜索内容的步骤和流程(示例:记录搜索、表单填写)。
大多数浏览器均为用户提供了清除浏览器缓存数据的功能,您可以在浏览器设置功能中进行相应的数据清除操作。如您进行清除,您可能无法使用依赖于Cookie的功能及服务和安全保障,每次访问我们的网站或应用时需要另行设置,您之前设置记录的相关信息也可能会被删除,并且对您所使用服务的安全性有一定影响。
四、我们如何共享、转让、公开披露您的个人信息
1、共享
1.1 个人信息共享原则
1)授权同意:经过您本人明确单独授权同意,或者共享的个人信息是去标识化处理后的信息、并且第三方无法重新识别此类信息的自然人主体。
2)合法与最小必要:向关联方、第三方合作伙伴共享的数据必须具有合法正当目的,且数据范围以达成目的必要为限。例如为订立、履行您作为一方当事人的合同所必需的个人信息。
3)安全审慎:我们将审慎评估关联方、第三方数据使用共享信息的目的,对其的安全保证能力进行综合评估,并要求其遵循合作法律协议。为了遵守法律、执行或适用我们的使用条件和其他协议,或者为了保护我们、您或其他用户的权利及其财产或安全,比如为防止欺诈等违法活动和减少信用风险,而与其他公司和组织交换信息。不过这并不包括违反本《隐私政策》中所作的承诺而为获利目的出售、出租、共享或以其它方式披露您的个人信息。
1.2 合作方范围
若具体功能和服务场景中涉及由我们的关联方、第三方提供服务,则合作范围包括我们的关联方与第三方。我们共享您的个人信息的合作方主要包括以下2类。
1.2.1 关联方合作共享
为便于我们基于有车以后统一平台账号体系共同向您提供服务,或者向您推荐您可能感兴趣的信息、保护关联方其他用户的人身财产安全,您的个人信息会与我们的关联方之间共享。但我们只会共享必要的个人信息,且受本《隐私政策》中所声明目的约束。我们的关联方如要改变个人信息的处理目的,将会再次征求您的授权同意。
1.2.2 第三方合作共享
为了向您提供更完善优质的产品和服务、保障应用稳定运行,某些服务将由我们合作的第三方提供。基于您的单独同意,我们仅会基于前述原则,与第三方共享您的个人信息。请您知悉:第三方是独立的数据处理者,其以独立运营主体的名义获得您的同意以及收集、处理您的个人信息。这些第三方可能有独立的隐私政策和用户协议,我们建议您认真阅读第三方的用户协议和隐私政策。我们合作的第三方包括以下类型:
1)SDK技术合作方
为实现更优质功能、保障应用稳定运行,我们的应用中会嵌入授权合作第三方的SDK软件产品,包括开发工具包、应用程序接口(API)、插件。我们会尽到审慎义务,对合作方获取信息进行严格的约定和安全监测,令其按照本政策所述的安全措施,以明确的目的和方式提供服务,以保护数据安全。
详细情况,您可查阅第三方SDK共享个人信息清单。
2)委托我们推广的广告服务合作方
我们会与第三方广告服务合作伙伴共享您的设备信息,以用于为您提供更符合您要求的广告信息、优化广告效果、以及监察广告投放的情况。我们可能向第三方广告服务合作伙伴提供不能识别您个人身份的统计信息。
3)汽车经销商、厂商及集团
在您使用汽车价格咨询服务时,我们可能会向相关汽车经销商、厂商及集团(包括但不限于您主动选择的经销商、在您仅选择品牌但未明确具体经销商的情形下我们根据您所在区域为您匹配的优质经销商)共享您在表单中主动填写提交的信息,包括姓名、手机号、地区信息,并由其在合法正当的范围内使用,比如:由经销商及时与您进行电话联络和回访。
4)汽车保险、金融、融资租赁平台/公司
当您需要咨询或办理保险、金融类服务时,我们会与第三方保险、金融服务的合作伙伴共享您的购车订单信息、贷款金额、贷款期限、姓名、住址、个人电话号码、电子邮件地址、身份证、车辆信息(车牌号、车家号、发动机号、品牌型号、购车发票)以及金融服务咨询或办理所必需的其他信息,以便第三方合作伙伴更好的向您提供产品服务。其中涉及身份证、车辆信息属于您的个人敏感信息,请您知悉,这些信息是咨询或办理服务的必要信息,我们会通过与您询问获取,如果您不同意提供,第三方合作伙伴将无法为您提供该类服务。
5)商品物流转运能力的物流平台/公司;
我们会与第三方物流运输服务的合作伙伴共享您的购车订单信息、姓名、住址、电话号码信息,以便第三方合作伙伴更好的向您提供物流运输服务。
2、委托处理
对于委托处理个人信息的场景,我们会与委托合作方根据法律规定签署相关处理协议,并对其个人信息使用活动进行监督。
3、转让
我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:
1)在事先获得您明确的同意或授权;
2)根据适用的法律法规、法律程序的要求、强制性的行政或司法要求所必须的情况进行提供;
3)符合与您签署的相关协议(包括在线签署的电子协议以及相应的平台规则)或其他的法律文件约定所提供;
4)在涉及合并、收购、破产清算或资产转让或类似的交易时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本《隐私政策》的约束,否则,我们将要求该公司、组织重新向您征求授权同意。
4、公开披露
我们仅会在以下情况下,才会公开披露您的个人信息:
1)根据您的需求,在您明确同意的披露方式下披露您所指定的个人信息;
2)根据法律、法规的要求、强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会依据所要求的个人信息类型和披露方式公开披露您的个人信息,此类个人信息包括但不限于以下情形:
(1)与国家安全、国防安全直接相关的;
(2)与公共安全、公共卫生、重大公共利益直接相关的;
(3)与犯罪侦查、起诉、审判和判决执行等直接相关的;
(4)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
(5)您自行向社会公众公开的个人信息;
(6)从合法公开披露的信息中收集个人信息的,包括:合法的新闻报道、政府信息公开等渠道。
在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求必须出具与之相应的法律文件,如传票或调查函。我们坚信,对于要求我们提供的信息,应该在法律允许的范围内尽可能保持透明。我们对所有的请求都进行了慎重的审查,以确保其具备合法依据,且仅限于执法部门因特定调查目的且有合法权利获取的数据。
特别提示:使用有车以后的过程中,您主动公开分享、共享的个人信息,不受本政策限制(如向其他互联网平台转发内容)。您应注意,任何您分享的信息均可被任何第三方阅读、收集和使用,请您审慎考虑您通过有车以后发布和传播的内容以及其中可能指向您个人的信息。我们建议您在使用互动功能时特别关注您的个人信息是否已做好隐私保护,发布内容时我们建议您对车牌号进行马赛克处理,也建议您不在发布内容中展示个人手机号码。
五、我们如何存储个人信息
1. 信息存储的地点
我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息存储于中华人民共和国境内。目前,我们不会将上述信息传输至境外,如果我们向境外传输,我们将会遵循法律法规的规定,征求您的自主选择同意。
2. 存储期限
我们仅在为提供产品及相关服务之目的所必需的期间内保留您的个人信息,包括:您发布的内容、评论、点赞等信息,在您未删除、注销账号期间,我们会保留相关信息。超出必要期限后,我们将对您的个人信息进行删除或匿名化处理,但法律法规另有规定的除外。
六、我们如何保护您的个人信息
我们非常重视您的个人信息安全,并采取一切合理可行的措施,保护您的个人信息:
1. 数据安全技术措施
我们会采用符合业界标准的安全防护措施,包括建立合理的制度规范、安全技术来防止您的个人信息遭到未经授权的访问使用、修改,避免数据的损坏或丢失。
有车以后采取加密技术对用户个人信息进行加密保存,并通过隔离技术进行隔离。
在个人信息使用时,例如个人信息展示、个人信息关联计算,我们会采用包括内容替换、SHA256在内多种数据脱敏技术增强个人信息在使用中安全性。
有车以后采用严格的数据访问权限控制和多重身份认证技术保护个人信息,避免数据被违规使用。
有车以后采用代码安全自动检查、数据访问日志分析技术进行个人信息安全审计。
2. 有车以后为保护个人信息采取的其他安全措施
有车以后通过建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用。
有车以后通过信息接触者保密协议、监控和审计机制来对数据进行全面安全控制。
有车以后建立信息安全管理委员会来推进和保障个人信息安全。
安全认证和服务。我们存储您个人数据的底层云技术通过了公安部安全等级保护二级认证。
加强安全意识。我们还会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
3. 个人信息访问权限控制
我们仅允许有必要知晓这些信息的有车以后及有车以后关联方的员工、合作伙伴访问个人信息,并为此设置了严格的访问权限控制和监控机制。我们同时要求可能接触到您个人信息的所有人员履行相应的保密义务。如果未能履行这些义务,可能会被追究法律责任或被中止与有车以后的合作关系。
4. 个人信息收集与保留
我们会采取一切合理可行的措施,确保未收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
5. 互联网环境安全性保障声明
互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件等与其他用户的交流方式无法确定是否完全加密,我们建议您使用此类工具时请使用复杂密码,并注意保护您的个人信息安全。
我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。
6. 安全事件处置
在通过有车以后与第三方进行网上服务的交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,包括联系方式、通信地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。
为应对个人信息泄露、损毁和丢失等可能出现的风险,有车以后制定了多项制度,明确安全事件、安全漏洞的分类分级标准及相应的处理流程。有车以后也为安全事件建立了专门的应急响应团队,按照安全事件处置规范要求,针对不同安全事件启动安全预案,进行止损、分析、定位、制定补救措施、联合相关部门进行溯源和打击。
在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们同时将及时将事件相关情况以邮件、电话等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
7. 免责声明
本《隐私政策》提供的个人信息保护措施仅适用于有车以后及相关服务。一旦您离开有车以后及相关服务,浏览或使用其他网站、服务及内容资源,我们没有能力及义务保护您在有车以后及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用上述软件、网站是否基于有车以后的链接或引导。当由于以上情形而导致发生个人信息安全事件时,我们将会尽我们所能帮助您进行补救或者止损,但我们将不承担相应的法律责任。
8. 联系我们
如果您对我们的个人信息保护有任何疑问,可通过个人设置中的问题反馈功能与我们联系。如您发现自己的个人信息泄密,尤其是您的账号及密码发生泄露,请您立即通过个人设置中的问题反馈功能与我们取得联系,以便我们采取相应措施。
七、您如何管理个人信息
有车以后非常重视您对个人信息的管理,按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们尽全力保障您对自己的个人信息行使以下权利:
1、查询、更正您的个人资料信息
除法律法规规定外,您有权随时访问和查询您的个人信息,您可以在“我的”-“点击头像/我的主页”-“编辑资料”,查询和更正您的头像、昵称、性别、个人简介等个人信息。
2、查询、更正和取消您的关注
在有车以后App或有车以后+小程序中,进入“我的”-“我的主页”-点击“关注”,可以访问和查询您所关注的账号,您也可以对指定账号进行取消关注的操作。
3、查询、更正和取消您的收藏
在有车以后App或有车以后+小程序中,进入“我的”-“我的主页”-点击“收藏”,可以访问和查询您所收藏的内容,进入“已收藏内容”详情页,通过再次点击“已收藏”来进行取消收藏的操作。
4、自主管理控制功能开关使用
消息推送——如您不希望收到App页面上的消息通知,可以在首次安装App时拒绝接收消息通知,或者在操作系统中的“设置-应用管理-通知管理”关掉对应的通知功能。
推广/回访——如您不希望接收我们的推广短信或电话回访,可通过短信或通知信息中相应的退订提示进行退订,或者在电话回访中明确表示拒绝。
5、改变或撤回您的授权范围
- 改变或撤回授权范围的设置方法:您可以在设备操作系统(系统路径参考:“设置”-“应用设置/授权/信息”-“授权管理”-“应用权限”,或,“设置”-“应用”)中修改相关权限范围,以改变授权范围或撤回您的授权。改变或撤回授权后我们将不再收集与该权限相关的信息。
- 改变或撤回同意的信息处理:特定的业务功能和服务需要您的信息才能得以完成,当您需要改变或撤回已提交的个人信息,可以通过联系(发送邮件至:dev_support@youcheyihou.com)我们处理。请您知悉,当您撤回授权后,我们无法继续为您提供撤回同意授权所对应的功能和服务,也不再处理您的个人信息。但您撤回同意或授权的决定,不会影响我们此前基于您的授权而开展的个人信息处理。
6、删除您的个人信息
如您希望删除上述功能服务收集的个人信息或其它您主动提交的个人信息,您可以根据联系方式(发送邮件至:dev_support@youcheyihou.com),向我们提出具体要求,我们会在收到您的意见或请求后的【15个工作日】内核验您的身份并尽快帮您处理相关信息的删除,但个人信息中已做匿名化处理或法律法规另有规定的除外。
7、注销账号
您可以通过申请注销账号(“我的”-“设置”页面右上角图标-“账号管理”-“注销账号”)来删除您的个人信息。您注销账号后,我们将停止为您提供产品与/或服并删除您的个人信息,但已做匿名化处理或法律法规另有规定的除外(包括您账号绑定的手机号也将做匿名化处理)。
8、获取个人信息副本
您有权获取您的个人信息副本,您可以通过本《隐私政策》文末提供的方式联系我们,在核实您的身份后,我们将向您提供您在我们的服务中的个人信息副本(包括基本资料、身份信息),但法律法规另有规定的或本政策另有约定的除外。
9、响应您的上述请求
如果您无法通过上述方式访问、更正或删除您的个人信息,或您需要访问、更正或删除您在使用我们产品与/或服务时所产生的其他个人信息,或您认为有车以后存在任何违反法律法规或与您关于个人信息的收集或使用的约定,您均可以发送电子邮件至dev_support@youcheyihou.com或通过本《隐私政策》下方的其他方式与我们联系。为了保障安全,我们可能需要您提供书面请求,或以其他方式证明您的身份,我们将在收到您反馈并验证您的身份后的【15个工作日】内答复您的请求。对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。
在以下情形中,按照法律法规要求,我们将无法响应您的请求:
(1)与国家安全、国防安全相关的;
(2)与公共安全、公共卫生、重大公共利益相关的;
(3)与犯罪侦查、起诉和审判和执行判决等直接相关的;
(4)有充分证据表明您存在主观恶意或滥用权利的;
(5)响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
(6)涉及商业秘密的。
八、未成年人个人信息的保护
1、有车以后非常重视对未成年人个人信息的保护。若您是18周岁以下的未成年人,在使用我们的产品与/或服务前,应事先取得您家长或法定监护人的书面同意。有车以后根据国家相关法律法规的规定保护未成年人的个人信息。
2、对于经父母或法定监护人同意而收集未成年人个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。
3、如果有事实证明未成年人并未取得父母或法定监护人同意的情况下注册使用了我们的产品或相关服务,我们会与相关监护人协商,并设法尽快删除相关个人信息。
九、《隐私政策》的修订、通知和查看
1、为了给您提供更好的服务,有车以后及相关服务将不时更新与变化,我们会适时对本《隐私政策》进行修订,这些修订构成本《隐私政策》的一部分。
2、本《隐私政策》更新后,我们会发出更新版本,并在更新后的条款生效前通过官方网站公告或其他适当的方式提醒您更新的内容,以便您及时了解本《隐私政策》的最新版本。如您继续使用我们的服务,表示同意接受修订后的《隐私政策》的内容。
3、对于重大变更,我们还会提供更为显著的通知(我们会通过包括但不限于邮件、短信或在浏览页面做特别提示等方式,说明《隐私政策》的具体变更内容)。
本《隐私政策》所指的重大变更包括但不限于:
(1)我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;
(2)我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
(3)个人信息共享、转让或公开披露的主要对象发生变化;
(4)您参与个人信息处理方面的权利及其行使方式发生重大变化;
(5)我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;
(6)个人信息安全影响评估报告表明存在高风险时。
4、您可以在首次使用有车以后App通过弹窗查看本《隐私政策》,也可在有车以后App通过“我的-设置-隐私政策”再次查看。我们恳请您定期查看本《隐私政策》,以确保您对本政策最新版本始终保持了解。
十、联系我们
1、我们设立了专门负责个人信息保护的部门,如您对本政策有任何疑问、意见或建议,您可以通过以下方式与我们取得联系:
(1)点击“我的-设置-问题反馈”给我们留言反馈;
(2)发送邮件至:dev_support@youcheyihou.com;
(3)邮寄信件至:广东省广州市海珠区新港西路135号中山大学国家大学科技园B座14楼 邮编:510275。
2、我们会在收到您的意见及建议后的【15个工作日】内核验您的身份并尽快向您回复。如无法响应您的请求,我们会在法律规定的最大时限要求内,向您发送通知并解释原因。
3、如您对我们的回复不满意,或我们对您个人信息的处理方式侵害了您的合法权益,且在您向我们反馈后我们无法提供让您满意的回复且拒绝改进的,您可以向相关监管机构进行投诉和举报。
十一、附录
1、本《隐私政策》中的标题仅为方便阅读而设,并不影响本《隐私政策》中任何规定的含义或解释。
2、本《隐私政策》相关词语释义:
(1)有车以后及相关服务是指,公司及其关联方通过合法拥有并运营的、标注名称为有车以后的客户端应用程序、微信小程序、微信公众号以及youcheyihou.com网站,向您提供的产品与服务,包括但不限于资讯浏览、选车、看车、发布信息、互动交流、搜索查询等核心功能以及其他功能。
(2)关联方是指,一方现在或将来控制、受控制或与其处于共同控制下的任何公司、机构以及上述公司或机构的法定代表人。“控制”是指直接或间接地拥有影响所提及公司管理的能力,无论是通过所有权、有投票权的股份、合同或其他被依法认定的方式。
(3)个人信息是指,以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。本《隐私政策》中涉及的个人信息包括:基本信息(包括个人姓名、生日、性别、住址、个人电话号码、电子邮箱);个人身份信息(包括身份证、军官证、护照、车辆行驶证、驾驶证等您上传到网站的内容中包含的任何个人信息);面部特征;网络身份标识信息(包括系统账号、账号名、账号昵称、IP地址、邮箱地址及与前述有关的密码、口令、口令保护答案);个人财产信息(订单记录、有车以后现金余额、有车以后有车币、有车以后声望等虚拟财产信息);个人上网记录(包括网站浏览记录、软件使用记录、点击记录);个人常用设备信息(包括硬件型号、设备MAC地址、操作系统类型、软件列表唯一设备识别码(如IMEI/android ID/IDFA/OPENUDID/GUID、SIM卡IMSI信息等在内的描述个人常用设备基本情况的信息);个人位置信息(包括精准定位信息、经纬度等);其他个人信息(包括您明确声称归您所有的车辆号牌等个人信息)。
以上个人信息包含的内容出自于GB/T35273《个人信息安全规范》。
(4)个人敏感信息是指,一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息,本隐私政策中涉及的个人敏感信息包括:您的财产信息(包括银行账号、交易和消费记录以及有车以后现金余额、有车以后有车币、有车以后声望等虚拟财产信息);个人身份信息(包括手机号码、身份证、军官证、护照、驾驶证、行驶证);地理位置信息(包括精准位置定位)。
以上个人信息包含的内容出自于GB/T35273《个人信息安全规范》。
(5)去标识化是指,通过对个人信息的技术处理,使其在不借助额外信息的情况下,无法识别个人信息主体的过程。
(6)匿名化是指,通过对个人信息的技术处理,使得个人信息主体无法被识别,且处理后的信息不能被复原的过程。
3、本《隐私政策》的版权为我们所有,在法律允许的范围内,我们拥有解释和修改的权利。