diff --git a/.forgejo/workflows/lint.yml b/.forgejo/workflows/lint.yml
deleted file mode 100644
index 6df92fb..0000000
--- a/.forgejo/workflows/lint.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: CodeQL
-
-on:
- push:
- branches: [main]
- pull_request:
-
-jobs:
- lint-debian:
- runs-on: debian-latest
- steps:
- - uses: actions/checkout@v4
- - name: Install Linters
- run: npm install -g htmlhint stylelint stylelint-config-standard eslint
- - name: HTML
- run: htmlhint "**/*.html" --ignore "assets/**"
- - name: CSS
- run: |
- echo '{
- "extends": "stylelint-config-standard",
- "rules": {
- "no-duplicate-selectors": null,
- "no-descending-specificity": null,
- "declaration-block-no-shorthand-property-overrides": null,
- "font-family-no-duplicate-names": null,
- "selector-class-pattern": null,
- "selector-id-pattern": null,
- "keyframes-name-pattern": null,
- "declaration-block-single-line-max-declarations": null,
- "property-no-unknown": null,
- "declaration-property-value-no-unknown": null
- }
- }' > .stylelintrc.json
- stylelint "**/*.css" --allow-empty-input --fix || stylelint "**/*.css" --allow-empty-input
- - name: JS
- run: |
- echo "export default [
- {
- languageOptions: {
- globals: {
- window: 'readonly',
- document: 'readonly',
- navigator: 'readonly',
- location: 'readonly',
- history: 'readonly',
- localStorage: 'readonly',
- fetch: 'readonly'
- }
- },
- rules: {
- 'semi': ['error', 'always'],
- 'no-console': 'off'
- }
- }
- ];" > eslint.config.mjs
- npx eslint . --fix || npx eslint .
\ No newline at end of file
diff --git a/analytics.js b/analytics.js
new file mode 100644
index 0000000..2118349
--- /dev/null
+++ b/analytics.js
@@ -0,0 +1,1321 @@
+(function() {
+ var $c = function(a) {
+ this.w = a || []
+ };
+ $c.prototype.set = function(a) {
+ this.w[a] = !0
+ };
+ $c.prototype.encode = function() {
+ for (var a = [], b = 0; b < this.w.length; b++) this.w[b] && (a[Math.floor(b / 6)] ^= 1 << b % 6);
+ for (b = 0; b < a.length; b++) a[b] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b] || 0);
+ return a.join("") + "~"
+ };
+ var vd = new $c;
+
+ function J(a) {
+ vd.set(a)
+ }
+ var Nd = function(a, b) {
+ var c = new $c(Dd(a));
+ c.set(b);
+ a.set(Gd, c.w)
+ },
+ Td = function(a) {
+ a = Dd(a);
+ a = new $c(a);
+ for (var b = vd.w.slice(), c = 0; c < a.w.length; c++) b[c] = b[c] || a.w[c];
+ return (new $c(b)).encode()
+ },
+ Dd = function(a) {
+ a = a.get(Gd);
+ ka(a) || (a = []);
+ return a
+ };
+ var ea = function(a) {
+ return "function" == typeof a
+ },
+ ka = function(a) {
+ return "[object Array]" == Object.prototype.toString.call(Object(a))
+ },
+ qa = function(a) {
+ return void 0 != a && -1 < (a.constructor + "").indexOf("String")
+ },
+ D = function(a, b) {
+ return 0 == a.indexOf(b)
+ },
+ sa = function(a) {
+ return a ? a.replace(/^[\s\xa0]+|[\s\xa0]+$/g, "") : ""
+ },
+ ta = function(a) {
+ var b = M.createElement("img");
+ b.width = 1;
+ b.height = 1;
+ b.src = a;
+ return b
+ },
+ ua = function() {},
+ K = function(a) {
+ if (encodeURIComponent instanceof Function) return encodeURIComponent(a);
+ J(28);
+ return a
+ },
+ L = function(a, b, c, d) {
+ try {
+ a.addEventListener ? a.addEventListener(b, c, !!d) : a.attachEvent && a.attachEvent("on" + b, c)
+ } catch (e) {
+ J(27)
+ }
+ },
+ wa = function(a, b) {
+ if (a) {
+ var c = M.createElement("script");
+ c.type = "text/javascript";
+ c.async = !0;
+ c.src = a;
+ b && (c.id = b);
+ var d = M.getElementsByTagName("script")[0];
+ d.parentNode.insertBefore(c, d)
+ }
+ },
+ Ud = function() {
+ return "https:" == M.location.protocol
+ },
+ xa = function() {
+ var a = "" + M.location.hostname;
+ return 0 == a.indexOf("www.") ? a.substring(4) : a
+ },
+ ya = function(a) {
+ var b = M.referrer;
+ if (/^https?:\/\//i.test(b)) {
+ if (a) return b;
+ a = "//" + M.location.hostname;
+ var c = b.indexOf(a);
+ if (5 == c || 6 == c)
+ if (a = b.charAt(c + a.length), "/" == a || "?" == a || "" == a || ":" == a) return;
+ return b
+ }
+ },
+ za = function(a, b) {
+ if (1 == b.length && null != b[0] && "object" === typeof b[0]) return b[0];
+ for (var c = {}, d = Math.min(a.length + 1, b.length), e = 0; e < d; e++)
+ if ("object" === typeof b[e]) {
+ for (var g in b[e]) b[e].hasOwnProperty(g) && (c[g] = b[e][g]);
+ break
+ } else e < a.length && (c[a[e]] = b[e]);
+ return c
+ };
+ var ee = function() {
+ this.keys = [];
+ this.values = {};
+ this.m = {}
+ };
+ ee.prototype.set = function(a, b, c) {
+ this.keys.push(a);
+ c ? this.m[":" + a] = b : this.values[":" + a] = b
+ };
+ ee.prototype.get = function(a) {
+ return this.m.hasOwnProperty(":" + a) ? this.m[":" + a] : this.values[":" + a]
+ };
+ ee.prototype.map = function(a) {
+ for (var b = 0; b < this.keys.length; b++) {
+ var c = this.keys[b],
+ d = this.get(c);
+ d && a(c, d)
+ }
+ };
+ var O = window,
+ M = document;
+ var Aa = function(a) {
+ var b = O._gaUserPrefs;
+ if (b && b.ioo && b.ioo() || a && !0 === O["ga-disable-" + a]) return !0;
+ try {
+ var c = O.external;
+ if (c && c._gaUserPrefs && "oo" == c._gaUserPrefs) return !0
+ } catch (d) {}
+ return !1
+ };
+ var Ca = function(a) {
+ var b = [],
+ c = M.cookie.split(";");
+ a = new RegExp("^\\s*" + a + "=\\s*(.*?)\\s*$");
+ for (var d = 0; d < c.length; d++) {
+ var e = c[d].match(a);
+ e && b.push(e[1])
+ }
+ return b
+ },
+ zc = function(a, b, c, d, e, g) {
+ e = Aa(e) ? !1 : eb.test(M.location.hostname) || "/" == c && vc.test(d) ? !1 : !0;
+ if (!e) return !1;
+ b && 1200 < b.length && (b = b.substring(0, 1200), J(24));
+ c = a + "=" + b + "; path=" + c + "; ";
+ g && (c += "expires=" + (new Date((new Date).getTime() + g)).toGMTString() + "; ");
+ d && "none" != d && (c += "domain=" + d + ";");
+ d = M.cookie;
+ M.cookie = c;
+ if (!(d = d != M.cookie)) a: {
+ a =
+ Ca(a);
+ for (d = 0; d < a.length; d++)
+ if (b == a[d]) {
+ d = !0;
+ break a
+ } d = !1
+ }
+ return d
+ },
+ Cc = function(a) {
+ return K(a).replace(/\(/g, "%28").replace(/\)/g, "%29")
+ },
+ vc = /^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,
+ eb = /(^|\.)doubleclick\.net$/i;
+ var oc = function() {
+ return (Ba || Ud() ? "https:" : "http:") + "//www.google-analytics.com"
+ },
+ Da = function(a) {
+ this.name = "len";
+ this.message = a + "-8192"
+ },
+ ba = function(a, b, c) {
+ c = c || ua;
+ if (2036 >= b.length) wc(a, b, c);
+ else if (8192 >= b.length) x(a, b, c) || wd(a, b, c) || wc(a, b, c);
+ else throw ge("len", b.length), new Da(b.length);
+ },
+ wc = function(a, b, c) {
+ var d = ta(a + "?" + b);
+ d.onload = d.onerror = function() {
+ d.onload = null;
+ d.onerror = null;
+ c()
+ }
+ },
+ wd = function(a, b, c) {
+ var d = O.XMLHttpRequest;
+ if (!d) return !1;
+ var e = new d;
+ if (!("withCredentials" in e)) return !1;
+ e.open("POST", a, !0);
+ e.withCredentials = !0;
+ e.setRequestHeader("Content-Type", "text/plain");
+ e.onreadystatechange = function() {
+ 4 == e.readyState && (c(), e = null)
+ };
+ e.send(b);
+ return !0
+ },
+ x = function(a, b, c) {
+ return O.navigator.sendBeacon ? O.navigator.sendBeacon(a, b) ? (c(), !0) : !1 : !1
+ },
+ ge = function(a, b, c) {
+ 1 <= 100 * Math.random() || Aa("?") || (a = ["t=error", "_e=" + a, "_v=j41", "sr=1"], b && a.push("_f=" + b), c && a.push("_m=" + K(c.substring(0, 100))), a.push("aip=1"), a.push("z=" + hd()), wc(oc() + "/collect", a.join("&"), ua))
+ };
+ var Ha = function() {
+ this.M = []
+ };
+ Ha.prototype.add = function(a) {
+ this.M.push(a)
+ };
+ Ha.prototype.D = function(a) {
+ try {
+ for (var b = 0; b < this.M.length; b++) {
+ var c = a.get(this.M[b]);
+ c && ea(c) && c.call(O, a)
+ }
+ } catch (d) {}
+ b = a.get(Ia);
+ b != ua && ea(b) && (a.set(Ia, ua, !0), setTimeout(b, 10))
+ };
+
+ function Ja(a) {
+ if (100 != a.get(Ka) && La(P(a, Q)) % 1E4 >= 100 * R(a, Ka)) throw "abort";
+ }
+
+ function Ma(a) {
+ if (Aa(P(a, Na))) throw "abort";
+ }
+
+ function Oa() {
+ var a = M.location.protocol;
+ if ("http:" != a && "https:" != a) throw "abort";
+ }
+
+ function Pa(a) {
+ try {
+ O.navigator.sendBeacon ? J(42) : O.XMLHttpRequest && "withCredentials" in new O.XMLHttpRequest && J(40)
+ } catch (c) {}
+ a.set(ld, Td(a), !0);
+ a.set(Ac, R(a, Ac) + 1);
+ var b = [];
+ Qa.map(function(c, d) {
+ if (d.F) {
+ var e = a.get(c);
+ void 0 != e && e != d.defaultValue && ("boolean" == typeof e && (e *= 1), b.push(d.F + "=" + K("" + e)))
+ }
+ });
+ b.push("z=" + Bd());
+ a.set(Ra, b.join("&"), !0)
+ }
+
+ function Sa(a) {
+ var b = P(a, gd) || oc() + "/collect",
+ c = P(a, fa);
+ !c && a.get(Vd) && (c = "beacon");
+ if (c) {
+ var d = P(a, Ra),
+ e = a.get(Ia),
+ e = e || ua;
+ "image" == c ? wc(b, d, e) : "xhr" == c && wd(b, d, e) || "beacon" == c && x(b, d, e) || ba(b, d, e)
+ } else ba(b, P(a, Ra), a.get(Ia));
+ a.set(Ia, ua, !0)
+ }
+
+ function Hc(a) {
+ var b = O.gaData;
+ b && (b.expId && a.set(Nc, b.expId), b.expVar && a.set(Oc, b.expVar))
+ }
+
+ function cd() {
+ if (O.navigator && "preview" == O.navigator.loadPurpose) throw "abort";
+ }
+
+ function yd(a) {
+ var b = O.gaDevIds;
+ ka(b) && 0 != b.length && a.set("&did", b.join(","), !0)
+ }
+
+ function vb(a) {
+ if (!a.get(Na)) throw "abort";
+ };
+ var hd = function() {
+ return Math.round(2147483647 * Math.random())
+ },
+ Bd = function() {
+ try {
+ var a = new Uint32Array(1);
+ O.crypto.getRandomValues(a);
+ return a[0] & 2147483647
+ } catch (b) {
+ return hd()
+ }
+ };
+
+ function Ta(a) {
+ var b = R(a, Ua);
+ 500 <= b && J(15);
+ var c = P(a, Va);
+ if ("transaction" != c && "item" != c) {
+ var c = R(a, Wa),
+ d = (new Date).getTime(),
+ e = R(a, Xa);
+ 0 == e && a.set(Xa, d);
+ e = Math.round(2 * (d - e) / 1E3);
+ 0 < e && (c = Math.min(c + e, 20), a.set(Xa, d));
+ if (0 >= c) throw "abort";
+ a.set(Wa, --c)
+ }
+ a.set(Ua, ++b)
+ };
+ var Ya = function() {
+ this.data = new ee
+ },
+ Qa = new ee,
+ Za = [];
+ Ya.prototype.get = function(a) {
+ var b = $a(a),
+ c = this.data.get(a);
+ b && void 0 == c && (c = ea(b.defaultValue) ? b.defaultValue() : b.defaultValue);
+ return b && b.Z ? b.Z(this, a, c) : c
+ };
+ var P = function(a, b) {
+ var c = a.get(b);
+ return void 0 == c ? "" : "" + c
+ },
+ R = function(a, b) {
+ var c = a.get(b);
+ return void 0 == c || "" === c ? 0 : 1 * c
+ };
+ Ya.prototype.set = function(a, b, c) {
+ if (a)
+ if ("object" == typeof a)
+ for (var d in a) a.hasOwnProperty(d) && ab(this, d, a[d], c);
+ else ab(this, a, b, c)
+ };
+ var ab = function(a, b, c, d) {
+ if (void 0 != c) switch (b) {
+ case Na:
+ wb.test(c)
+ }
+ var e = $a(b);
+ e && e.o ? e.o(a, b, c, d) : a.data.set(b, c, d)
+ },
+ bb = function(a, b, c, d, e) {
+ this.name = a;
+ this.F = b;
+ this.Z = d;
+ this.o = e;
+ this.defaultValue = c
+ },
+ $a = function(a) {
+ var b = Qa.get(a);
+ if (!b)
+ for (var c = 0; c < Za.length; c++) {
+ var d = Za[c],
+ e = d[0].exec(a);
+ if (e) {
+ b = d[1](e);
+ Qa.set(b.name, b);
+ break
+ }
+ }
+ return b
+ },
+ yc = function(a) {
+ var b;
+ Qa.map(function(c, d) {
+ d.F == a && (b = d)
+ });
+ return b && b.name
+ },
+ S = function(a, b, c, d, e) {
+ a = new bb(a, b, c, d, e);
+ Qa.set(a.name, a);
+ return a.name
+ },
+ cb = function(a,
+ b) {
+ Za.push([new RegExp("^" + a + "$"), b])
+ },
+ T = function(a, b, c) {
+ return S(a, b, c, void 0, db)
+ },
+ db = function() {};
+ var gb = qa(window.GoogleAnalyticsObject) && sa(window.GoogleAnalyticsObject) || "ga",
+ Ba = !1,
+ he = S("_br"),
+ hb = T("apiVersion", "v"),
+ ib = T("clientVersion", "_v");
+ S("anonymizeIp", "aip");
+ var jb = S("adSenseId", "a"),
+ Va = S("hitType", "t"),
+ Ia = S("hitCallback"),
+ Ra = S("hitPayload");
+ S("nonInteraction", "ni");
+ S("currencyCode", "cu");
+ S("dataSource", "ds");
+ var Vd = S("useBeacon", void 0, !1),
+ fa = S("transport");
+ S("sessionControl", "sc", "");
+ S("sessionGroup", "sg");
+ S("queueTime", "qt");
+ var Ac = S("_s", "_s");
+ S("screenName", "cd");
+ var kb = S("location", "dl", ""),
+ lb = S("referrer", "dr"),
+ mb = S("page", "dp", "");
+ S("hostname", "dh");
+ var nb = S("language", "ul"),
+ ob = S("encoding", "de");
+ S("title", "dt", function() {
+ return M.title || void 0
+ });
+ cb("contentGroup([0-9]+)", function(a) {
+ return new bb(a[0], "cg" + a[1])
+ });
+ var pb = S("screenColors", "sd"),
+ qb = S("screenResolution", "sr"),
+ rb = S("viewportSize", "vp"),
+ sb = S("javaEnabled", "je"),
+ tb = S("flashVersion", "fl");
+ S("campaignId", "ci");
+ S("campaignName", "cn");
+ S("campaignSource", "cs");
+ S("campaignMedium", "cm");
+ S("campaignKeyword", "ck");
+ S("campaignContent", "cc");
+ var ub = S("eventCategory", "ec"),
+ xb = S("eventAction", "ea"),
+ yb = S("eventLabel", "el"),
+ zb = S("eventValue", "ev"),
+ Bb = S("socialNetwork", "sn"),
+ Cb = S("socialAction", "sa"),
+ Db = S("socialTarget", "st"),
+ Eb = S("l1", "plt"),
+ Fb = S("l2", "pdt"),
+ Gb = S("l3", "dns"),
+ Hb = S("l4", "rrt"),
+ Ib = S("l5", "srt"),
+ Jb = S("l6", "tcp"),
+ Kb = S("l7", "dit"),
+ Lb = S("l8", "clt"),
+ Mb = S("timingCategory", "utc"),
+ Nb = S("timingVar", "utv"),
+ Ob = S("timingLabel", "utl"),
+ Pb = S("timingValue", "utt");
+ S("appName", "an");
+ S("appVersion", "av", "");
+ S("appId", "aid", "");
+ S("appInstallerId", "aiid", "");
+ S("exDescription", "exd");
+ S("exFatal", "exf");
+ var Nc = S("expId", "xid"),
+ Oc = S("expVar", "xvar"),
+ Rc = S("_utma", "_utma"),
+ Sc = S("_utmz", "_utmz"),
+ Tc = S("_utmht", "_utmht"),
+ Ua = S("_hc", void 0, 0),
+ Xa = S("_ti", void 0, 0),
+ Wa = S("_to", void 0, 20);
+ cb("dimension([0-9]+)", function(a) {
+ return new bb(a[0], "cd" + a[1])
+ });
+ cb("metric([0-9]+)", function(a) {
+ return new bb(a[0], "cm" + a[1])
+ });
+ S("linkerParam", void 0, void 0, Bc, db);
+ var ld = S("usage", "_u"),
+ Gd = S("_um");
+ S("forceSSL", void 0, void 0, function() {
+ return Ba
+ }, function(a, b, c) {
+ J(34);
+ Ba = !!c
+ });
+ var ed = S("_j1", "jid");
+ cb("\\&(.*)", function(a) {
+ var b = new bb(a[0], a[1]),
+ c = yc(a[0].substring(1));
+ c && (b.Z = function(a) {
+ return a.get(c)
+ }, b.o = function(a, b, g, ca) {
+ a.set(c, g, ca)
+ }, b.F = void 0);
+ return b
+ });
+ var Qb = T("_oot"),
+ dd = S("previewTask"),
+ Rb = S("checkProtocolTask"),
+ md = S("validationTask"),
+ Sb = S("checkStorageTask"),
+ Uc = S("historyImportTask"),
+ Tb = S("samplerTask"),
+ Vb = S("_rlt"),
+ Wb = S("buildHitTask"),
+ Xb = S("sendHitTask"),
+ Vc = S("ceTask"),
+ zd = S("devIdTask"),
+ Cd = S("timingTask"),
+ Ld = S("displayFeaturesTask"),
+ V = T("name"),
+ Q = T("clientId", "cid"),
+ Ad = S("userId", "uid"),
+ Na = T("trackingId", "tid"),
+ U = T("cookieName", void 0, "_ga"),
+ W = T("cookieDomain"),
+ Yb = T("cookiePath", void 0, "/"),
+ Zb = T("cookieExpires", void 0, 63072E3),
+ $b = T("legacyCookieDomain"),
+ Wc = T("legacyHistoryImport", void 0, !0),
+ ac = T("storage", void 0, "cookie"),
+ bc = T("allowLinker", void 0, !1),
+ cc = T("allowAnchor", void 0, !0),
+ Ka = T("sampleRate", "sf", 100),
+ dc = T("siteSpeedSampleRate", void 0, 1),
+ ec = T("alwaysSendReferrer", void 0, !1),
+ gd = S("transportUrl"),
+ Md = S("_r", "_r");
+
+ function X(a, b, c, d) {
+ b[a] = function() {
+ try {
+ return d && J(d), c.apply(this, arguments)
+ } catch (b) {
+ throw ge("exc", a, b && b.name), b;
+ }
+ }
+ };
+ var Od = function(a, b, c) {
+ this.V = 1E4;
+ this.fa = a;
+ this.$ = !1;
+ this.B = b;
+ this.ea = c || 1
+ },
+ Ed = function(a, b) {
+ var c;
+ if (a.fa && a.$) return 0;
+ a.$ = !0;
+ if (b) {
+ if (a.B && R(b, a.B)) return R(b, a.B);
+ if (0 == b.get(dc)) return 0
+ }
+ if (0 == a.V) return 0;
+ void 0 === c && (c = Bd());
+ return 0 == c % a.V ? Math.floor(c / a.V) % a.ea + 1 : 0
+ };
+ var ie = new Od(!0, he, 7),
+ je = function(a) {
+ if (!Ud() && !Ba) {
+ var b = Ed(ie, a);
+ if (b && !(!O.navigator.sendBeacon && 4 <= b && 6 >= b)) {
+ var c = (new Date).getHours(),
+ d = [Bd(), Bd(), Bd()].join(".");
+ a = (3 == b || 5 == b ? "https:" : "http:") + "//www.google-analytics.com/collect?z=br.";
+ a += [b, "A", c, d].join(".");
+ var e = 1 != b % 3 ? "https:" : "http:",
+ e = e + "//www.google-analytics.com/collect?z=br.",
+ e = e + [b, "B", c, d].join(".");
+ 7 == b && (e = e.replace("//www.", "//ssl."));
+ c = function() {
+ 4 <= b && 6 >= b ? O.navigator.sendBeacon(e, "") : ta(e)
+ };
+ Bd() % 2 ? (ta(a), c()) : (c(), ta(a))
+ }
+ }
+ };
+
+ function fc() {
+ var a, b, c;
+ if ((c = (c = O.navigator) ? c.plugins : null) && c.length)
+ for (var d = 0; d < c.length && !b; d++) {
+ var e = c[d]; - 1 < e.name.indexOf("Shockwave Flash") && (b = e.description)
+ }
+ if (!b) try {
+ a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"), b = a.GetVariable("$version")
+ } catch (g) {}
+ if (!b) try {
+ a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"), b = "WIN 6,0,21,0", a.AllowScriptAccess = "always", b = a.GetVariable("$version")
+ } catch (g) {}
+ if (!b) try {
+ a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), b = a.GetVariable("$version")
+ } catch (g) {}
+ b &&
+ (a = b.match(/[\d]+/g)) && 3 <= a.length && (b = a[0] + "." + a[1] + " r" + a[2]);
+ return b || void 0
+ };
+ var gc = function(a, b) {
+ var c = Math.min(R(a, dc), 100);
+ if (!(La(P(a, Q)) % 100 >= c) && (c = {}, Ec(c) || Fc(c))) {
+ var d = c[Eb];
+ void 0 == d || Infinity == d || isNaN(d) || (0 < d ? (Y(c, Gb), Y(c, Jb), Y(c, Ib), Y(c, Fb), Y(c, Hb), Y(c, Kb), Y(c, Lb), b(c)) : L(O, "load", function() {
+ gc(a, b)
+ }, !1))
+ }
+ },
+ Ec = function(a) {
+ var b = O.performance || O.webkitPerformance,
+ b = b && b.timing;
+ if (!b) return !1;
+ var c = b.navigationStart;
+ if (0 == c) return !1;
+ a[Eb] = b.loadEventStart - c;
+ a[Gb] = b.domainLookupEnd - b.domainLookupStart;
+ a[Jb] = b.connectEnd - b.connectStart;
+ a[Ib] = b.responseStart - b.requestStart;
+ a[Fb] = b.responseEnd - b.responseStart;
+ a[Hb] = b.fetchStart - c;
+ a[Kb] = b.domInteractive - c;
+ a[Lb] = b.domContentLoadedEventStart - c;
+ return !0
+ },
+ Fc = function(a) {
+ if (O.top != O) return !1;
+ var b = O.external,
+ c = b && b.onloadT;
+ b && !b.isValidLoadTime && (c = void 0);
+ 2147483648 < c && (c = void 0);
+ 0 < c && b.setPageReadyTime();
+ if (void 0 == c) return !1;
+ a[Eb] = c;
+ return !0
+ },
+ Y = function(a, b) {
+ var c = a[b];
+ if (isNaN(c) || Infinity == c || 0 > c) a[b] = void 0
+ },
+ Fd = function(a) {
+ return function(b) {
+ "pageview" != b.get(Va) || a.I || (a.I = !0, gc(b, function(b) {
+ a.send("timing", b)
+ }))
+ }
+ };
+ var hc = !1,
+ mc = function(a) {
+ if ("cookie" == P(a, ac)) {
+ var b = P(a, U),
+ c = nd(a),
+ d = kc(P(a, Yb)),
+ e = lc(P(a, W)),
+ g = 1E3 * R(a, Zb),
+ ca = P(a, Na);
+ if ("auto" != e) zc(b, c, d, e, ca, g) && (hc = !0);
+ else {
+ J(32);
+ var l;
+ a: {
+ c = [];e = xa().split(".");
+ if (4 == e.length && (l = e[e.length - 1], parseInt(l, 10) == l)) {
+ l = ["none"];
+ break a
+ }
+ for (l = e.length - 2; 0 <= l; l--) c.push(e.slice(l).join("."));c.push("none");l = c
+ }
+ for (var k = 0; k < l.length; k++)
+ if (e = l[k], a.data.set(W, e), c = nd(a), zc(b, c, d, e, ca, g)) {
+ hc = !0;
+ return
+ } a.data.set(W, "auto")
+ }
+ }
+ },
+ nc = function(a) {
+ if ("cookie" == P(a, ac) &&
+ !hc && (mc(a), !hc)) throw "abort";
+ },
+ Yc = function(a) {
+ if (a.get(Wc)) {
+ var b = P(a, W),
+ c = P(a, $b) || xa(),
+ d = Xc("__utma", c, b);
+ d && (J(19), a.set(Tc, (new Date).getTime(), !0), a.set(Rc, d.R), (b = Xc("__utmz", c, b)) && d.hash == b.hash && a.set(Sc, b.R))
+ }
+ },
+ nd = function(a) {
+ var b = Cc(P(a, Q)),
+ c = ic(P(a, W));
+ a = jc(P(a, Yb));
+ 1 < a && (c += "-" + a);
+ return ["GA1", c, b].join(".")
+ },
+ Gc = function(a, b, c) {
+ for (var d = [], e = [], g, ca = 0; ca < a.length; ca++) {
+ var l = a[ca];
+ l.H[c] == b ? d.push(l) : void 0 == g || l.H[c] < g ? (e = [l], g = l.H[c]) : l.H[c] == g && e.push(l)
+ }
+ return 0 < d.length ? d : e
+ },
+ lc = function(a) {
+ return 0 == a.indexOf(".") ? a.substr(1) : a
+ },
+ ic = function(a) {
+ return lc(a).split(".").length
+ },
+ kc = function(a) {
+ if (!a) return "/";
+ 1 < a.length && a.lastIndexOf("/") == a.length - 1 && (a = a.substr(0, a.length - 1));
+ 0 != a.indexOf("/") && (a = "/" + a);
+ return a
+ },
+ jc = function(a) {
+ a = kc(a);
+ return "/" == a ? 1 : a.split("/").length
+ };
+
+ function Xc(a, b, c) {
+ "none" == b && (b = "");
+ var d = [],
+ e = Ca(a);
+ a = "__utma" == a ? 6 : 2;
+ for (var g = 0; g < e.length; g++) {
+ var ca = ("" + e[g]).split(".");
+ ca.length >= a && d.push({
+ hash: ca[0],
+ R: e[g],
+ O: ca
+ })
+ }
+ return 0 == d.length ? void 0 : 1 == d.length ? d[0] : Zc(b, d) || Zc(c, d) || Zc(null, d) || d[0]
+ }
+
+ function Zc(a, b) {
+ var c, d;
+ null == a ? c = d = 1 : (c = La(a), d = La(D(a, ".") ? a.substring(1) : "." + a));
+ for (var e = 0; e < b.length; e++)
+ if (b[e].hash == c || b[e].hash == d) return b[e]
+ };
+ var od = new RegExp(/^https?:\/\/([^\/:]+)/),
+ pd = /(.*)([?])(?:_ga=[^]*)(?:&?)(.*)/;
+
+ function Bc(a) {
+ a = a.get(Q);
+ var b = Ic(a, 0);
+ return "_ga=1." + K(b + "." + a)
+ }
+
+ function Ic(a, b) {
+ for (var c = new Date, d = O.navigator, e = d.plugins || [], c = [a, d.userAgent, c.getTimezoneOffset(), c.getYear(), c.getDate(), c.getHours(), c.getMinutes() + b], d = 0; d < e.length; ++d) c.push(e[d].description);
+ return La(c.join("."))
+ }
+ var Dc = function(a) {
+ J(48);
+ this.target = a;
+ this.T = !1
+ };
+ Dc.prototype.ca = function(a, b) {
+ if (a.tagName) {
+ if ("a" == a.tagName.toLowerCase()) {
+ a.href && (a.href = qd(this, a.href, b));
+ return
+ }
+ if ("form" == a.tagName.toLowerCase()) return rd(this, a)
+ }
+ if ("string" == typeof a) return qd(this, a, b)
+ };
+ var qd = function(a, b, c) {
+ var d = pd.exec(b);
+ d && 3 <= d.length && (b = d[1] + (d[3] ? d[2] + d[3] : ""));
+ a = a.target.get("linkerParam");
+ var e = b.indexOf("?"),
+ d = b.indexOf("#");
+ c ? b += (-1 == d ? "#" : "&") + a : (c = -1 == e ? "?" : "&", b = -1 == d ? b + (c + a) : b.substring(0, d) + c + a + b.substring(d));
+ return b = b.replace(/&+_ga=/, "&_ga=")
+ },
+ rd = function(a, b) {
+ if (b && b.action) {
+ var c = a.target.get("linkerParam").split("=")[1];
+ if ("get" == b.method.toLowerCase()) {
+ for (var d = b.childNodes || [], e = 0; e < d.length; e++)
+ if ("_ga" == d[e].name) {
+ d[e].setAttribute("value", c);
+ return
+ } d =
+ M.createElement("input");
+ d.setAttribute("type", "hidden");
+ d.setAttribute("name", "_ga");
+ d.setAttribute("value", c);
+ b.appendChild(d)
+ } else "post" == b.method.toLowerCase() && (b.action = qd(a, b.action))
+ }
+ };
+ Dc.prototype.S = function(a, b, c) {
+ function d(c) {
+ try {
+ c = c || O.event;
+ var d;
+ a: {
+ var g = c.target || c.srcElement;
+ for (c = 100; g && 0 < c;) {
+ if (g.href && g.nodeName.match(/^a(?:rea)?$/i)) {
+ d = g;
+ break a
+ }
+ g = g.parentNode;
+ c--
+ }
+ d = {}
+ }("http:" == d.protocol || "https:" == d.protocol) && sd(a, d.hostname || "") && d.href && (d.href = qd(e, d.href, b))
+ } catch (w) {
+ J(26)
+ }
+ }
+ var e = this;
+ this.T || (this.T = !0, L(M, "mousedown", d, !1), L(M, "keyup", d, !1));
+ if (c) {
+ c = function(b) {
+ b = b || O.event;
+ if ((b = b.target || b.srcElement) && b.action) {
+ var c = b.action.match(od);
+ c && sd(a, c[1]) && rd(e,
+ b)
+ }
+ };
+ for (var g = 0; g < M.forms.length; g++) L(M.forms[g], "submit", c)
+ }
+ };
+
+ function sd(a, b) {
+ if (b == M.location.hostname) return !1;
+ for (var c = 0; c < a.length; c++)
+ if (a[c] instanceof RegExp) {
+ if (a[c].test(b)) return !0
+ } else if (0 <= b.indexOf(a[c])) return !0;
+ return !1
+ };
+ var Jd = function(a, b, c) {
+ this.U = ed;
+ this.aa = b;
+ (b = c) || (b = (b = P(a, V)) && "t0" != b ? Wd.test(b) ? "_gat_" + Cc(P(a, Na)) : "_gat_" + Cc(b) : "_gat");
+ this.Y = b
+ },
+ Rd = function(a, b) {
+ var c = b.get(Wb);
+ b.set(Wb, function(b) {
+ Pd(a, b);
+ var d = c(b);
+ Qd(a, b);
+ return d
+ });
+ var d = b.get(Xb);
+ b.set(Xb, function(b) {
+ var c = d(b);
+ Id(a, b);
+ return c
+ })
+ },
+ Pd = function(a, b) {
+ b.get(a.U) || ("1" == Ca(a.Y)[0] ? b.set(a.U, "", !0) : b.set(a.U, "" + hd(), !0))
+ },
+ Qd = function(a, b) {
+ b.get(a.U) && zc(a.Y, "1", b.get(Yb), b.get(W), b.get(Na), 6E5)
+ },
+ Id = function(a, b) {
+ if (b.get(a.U)) {
+ var c = new ee,
+ d = function(a) {
+ $a(a).F && c.set($a(a).F, b.get(a))
+ };
+ d(hb);
+ d(ib);
+ d(Na);
+ d(Q);
+ d(Ad);
+ d(a.U);
+ c.set($a(ld).F, Td(b));
+ var e = a.aa;
+ c.map(function(a, b) {
+ e += K(a) + "=";
+ e += K("" + b) + "&"
+ });
+ e += "z=" + hd();
+ ta(e);
+ b.set(a.U, "", !0)
+ }
+ },
+ Wd = /^gtm\d+$/;
+ var fd = function(a, b) {
+ var c = a.b;
+ if (!c.get("dcLoaded")) {
+ Nd(c, 29);
+ b = b || {};
+ var d;
+ b[U] && (d = Cc(b[U]));
+ d = new Jd(c, "https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&", d);
+ Rd(d, c);
+ c.set("dcLoaded", !0)
+ }
+ };
+ var Sd = function(a) {
+ if (!a.get("dcLoaded") && "cookie" == a.get(ac)) {
+ Nd(a, 51);
+ var b = new Jd(a);
+ Pd(b, a);
+ Qd(b, a);
+ a.get(b.U) && (a.set(Md, 1, !0), a.set(gd, oc() + "/r/collect", !0))
+ }
+ };
+ var Lc = function() {
+ var a = O.gaGlobal = O.gaGlobal || {};
+ return a.hid = a.hid || hd()
+ };
+ var ad, bd = function(a, b, c) {
+ if (!ad) {
+ var d;
+ d = M.location.hash;
+ var e = O.name,
+ g = /^#?gaso=([^&]*)/;
+ if (e = (d = (d = d && d.match(g) || e && e.match(g)) ? d[1] : Ca("GASO")[0] || "") && d.match(/^(?:!([-0-9a-z.]{1,40})!)?([-.\w]{10,1200})$/i)) zc("GASO", "" + d, c, b, a, 0), window._udo || (window._udo = b), window._utcp || (window._utcp = c), a = e[1], wa("https://www.google.com/analytics/web/inpage/pub/inpage.js?" + (a ? "prefix=" + a + "&" : "") + hd(), "_gasojs");
+ ad = !0
+ }
+ };
+ var wb = /^(UA|YT|MO|GP)-(\d+)-(\d+)$/,
+ pc = function(a) {
+ function b(a, b) {
+ d.b.data.set(a, b)
+ }
+
+ function c(a, c) {
+ b(a, c);
+ d.filters.add(a)
+ }
+ var d = this;
+ this.b = new Ya;
+ this.filters = new Ha;
+ b(V, a[V]);
+ b(Na, sa(a[Na]));
+ b(U, a[U]);
+ b(W, a[W] || xa());
+ b(Yb, a[Yb]);
+ b(Zb, a[Zb]);
+ b($b, a[$b]);
+ b(Wc, a[Wc]);
+ b(bc, a[bc]);
+ b(cc, a[cc]);
+ b(Ka, a[Ka]);
+ b(dc, a[dc]);
+ b(ec, a[ec]);
+ b(ac, a[ac]);
+ b(Ad, a[Ad]);
+ b(hb, 1);
+ b(ib, "j41");
+ c(Qb, Ma);
+ c(dd, cd);
+ c(Rb, Oa);
+ c(md, vb);
+ c(Sb, nc);
+ c(Uc, Yc);
+ c(Tb, Ja);
+ c(Vb, Ta);
+ c(Vc, Hc);
+ c(zd, yd);
+ c(Ld, Sd);
+ c(Wb, Pa);
+ c(Xb, Sa);
+ c(Cd, Fd(this));
+ Jc(this.b, a[Q]);
+ Kc(this.b);
+ this.b.set(jb, Lc());
+ bd(this.b.get(Na), this.b.get(W), this.b.get(Yb))
+ },
+ Jc = function(a, b) {
+ if ("cookie" == P(a, ac)) {
+ hc = !1;
+ var c;
+ b: {
+ var d = Ca(P(a, U));
+ if (d && !(1 > d.length)) {
+ c = [];
+ for (var e = 0; e < d.length; e++) {
+ var g;
+ g = d[e].split(".");
+ var ca = g.shift();
+ ("GA1" == ca || "1" == ca) && 1 < g.length ? (ca = g.shift().split("-"), 1 == ca.length && (ca[1] = "1"), ca[0] *= 1, ca[1] *= 1, g = {
+ H: ca,
+ s: g.join(".")
+ }) : g = void 0;
+ g && c.push(g)
+ }
+ if (1 == c.length) {
+ J(13);
+ c = c[0].s;
+ break b
+ }
+ if (0 == c.length) J(12);
+ else {
+ J(14);
+ d = ic(P(a, W));
+ c = Gc(c,
+ d, 0);
+ if (1 == c.length) {
+ c = c[0].s;
+ break b
+ }
+ d = jc(P(a, Yb));
+ c = Gc(c, d, 1);
+ c = c[0] && c[0].s;
+ break b
+ }
+ }
+ c = void 0
+ }
+ c || (c = P(a, W), d = P(a, $b) || xa(), c = Xc("__utma", d, c), void 0 != c ? (J(10), c = c.O[1] + "." + c.O[2]) : c = void 0);
+ c && (a.data.set(Q, c), hc = !0)
+ }
+ c = a.get(cc);
+ if (e = (c = M.location[c ? "href" : "search"].match("(?:&|#|\\?)" + K("_ga").replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1") + "=([^]*)")) && 2 == c.length ? c[1] : "") a.get(bc) ? (c = e.indexOf("."), -1 == c ? J(22) : (d = e.substring(c + 1), "1" != e.substring(0, c) ? J(22) : (c = d.indexOf("."), -1 == c ? J(22) : (e =
+ d.substring(0, c), c = d.substring(c + 1), e != Ic(c, 0) && e != Ic(c, -1) && e != Ic(c, -2) ? J(23) : (J(11), a.data.set(Q, c)))))) : J(21);
+ b && (J(9), a.data.set(Q, K(b)));
+ if (!a.get(Q))
+ if (c = (c = O.gaGlobal && O.gaGlobal.vid) && -1 != c.search(/^(?:utma\.)?\d+\.\d+$/) ? c : void 0) J(17), a.data.set(Q, c);
+ else {
+ J(8);
+ c = O.navigator.userAgent + (M.cookie ? M.cookie : "") + (M.referrer ? M.referrer : "");
+ d = c.length;
+ for (e = O.history.length; 0 < e;) c += e-- ^ d++;
+ a.data.set(Q, [hd() ^ La(c) & 2147483647, Math.round((new Date).getTime() / 1E3)].join("."))
+ } mc(a)
+ },
+ Kc = function(a) {
+ var b =
+ O.navigator,
+ c = O.screen,
+ d = M.location;
+ a.set(lb, ya(a.get(ec)));
+ if (d) {
+ var e = d.pathname || "";
+ "/" != e.charAt(0) && (J(31), e = "/" + e);
+ a.set(kb, d.protocol + "//" + d.hostname + e + d.search)
+ }
+ c && a.set(qb, c.width + "x" + c.height);
+ c && a.set(pb, c.colorDepth + "-bit");
+ var c = M.documentElement,
+ g = (e = M.body) && e.clientWidth && e.clientHeight,
+ ca = [];
+ c && c.clientWidth && c.clientHeight && ("CSS1Compat" === M.compatMode || !g) ? ca = [c.clientWidth, c.clientHeight] : g && (ca = [e.clientWidth, e.clientHeight]);
+ c = 0 >= ca[0] || 0 >= ca[1] ? "" : ca.join("x");
+ a.set(rb, c);
+ a.set(tb,
+ fc());
+ a.set(ob, M.characterSet || M.charset);
+ a.set(sb, b && "function" === typeof b.javaEnabled && b.javaEnabled() || !1);
+ a.set(nb, (b && (b.language || b.browserLanguage) || "").toLowerCase());
+ if (d && a.get(cc) && (b = M.location.hash)) {
+ b = b.split(/[?]+/);
+ d = [];
+ for (c = 0; c < b.length; ++c)(D(b[c], "utm_id") || D(b[c], "utm_campaign") || D(b[c], "utm_source") || D(b[c], "utm_medium") || D(b[c], "utm_term") || D(b[c], "utm_content") || D(b[c], "gclid") || D(b[c], "dclid") || D(b[c], "gclsrc")) && d.push(b[c]);
+ 0 < d.length && (b = "#" + d.join("&"), a.set(kb, a.get(kb) +
+ b))
+ }
+ };
+ pc.prototype.get = function(a) {
+ return this.b.get(a)
+ };
+ pc.prototype.set = function(a, b) {
+ this.b.set(a, b)
+ };
+ var qc = {
+ pageview: [mb],
+ event: [ub, xb, yb, zb],
+ social: [Bb, Cb, Db],
+ timing: [Mb, Nb, Pb, Ob]
+ };
+ pc.prototype.send = function(a) {
+ if (!(1 > arguments.length)) {
+ var b, c;
+ "string" === typeof arguments[0] ? (b = arguments[0], c = [].slice.call(arguments, 1)) : (b = arguments[0] && arguments[0][Va], c = arguments);
+ b && (c = za(qc[b] || [], c), c[Va] = b, this.b.set(c, void 0, !0), this.filters.D(this.b), this.b.data.m = {}, je(this.b))
+ }
+ };
+ var rc = function(a) {
+ if ("prerender" == M.visibilityState) return !1;
+ a();
+ return !0
+ };
+ var td = /^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,
+ sc = function(a) {
+ if (ea(a[0])) this.u = a[0];
+ else {
+ var b = td.exec(a[0]);
+ null != b && 4 == b.length && (this.c = b[1] || "t0", this.K = b[2] || "", this.C = b[3], this.a = [].slice.call(a, 1), this.K || (this.A = "create" == this.C, this.i = "require" == this.C, this.g = "provide" == this.C, this.ba = "remove" == this.C), this.i && (3 <= this.a.length ? (this.X = this.a[1], this.W = this.a[2]) : this.a[1] && (qa(this.a[1]) ? this.X = this.a[1] : this.W = this.a[1])));
+ b = a[1];
+ a = a[2];
+ if (!this.C) throw "abort";
+ if (this.i && (!qa(b) || "" == b)) throw "abort";
+ if (this.g && (!qa(b) || "" == b || !ea(a))) throw "abort";
+ if (ud(this.c) || ud(this.K)) throw "abort";
+ if (this.g && "t0" != this.c) throw "abort";
+ }
+ };
+
+ function ud(a) {
+ return 0 <= a.indexOf(".") || 0 <= a.indexOf(":")
+ };
+ var Yd, Zd, $d;
+ Yd = new ee;
+ $d = new ee;
+ Zd = {
+ ec: 45,
+ ecommerce: 46,
+ linkid: 47
+ };
+ var ae = function(a) {
+ function b(a) {
+ var b = (a.hostname || "").split(":")[0].toLowerCase(),
+ c = (a.protocol || "").toLowerCase(),
+ c = 1 * a.port || ("http:" == c ? 80 : "https:" == c ? 443 : "");
+ a = a.pathname || "";
+ D(a, "/") || (a = "/" + a);
+ return [b, "" + c, a]
+ }
+ var c = M.createElement("a");
+ c.href = M.location.href;
+ var d = (c.protocol || "").toLowerCase(),
+ e = b(c),
+ g = c.search || "",
+ ca = d + "//" + e[0] + (e[1] ? ":" + e[1] : "");
+ D(a, "//") ? a = d + a : D(a, "/") ? a = ca + a : !a || D(a, "?") ? a = ca + e[2] + (a || g) : 0 > a.split("/")[0].indexOf(":") && (a = ca + e[2].substring(0, e[2].lastIndexOf("/")) +
+ "/" + a);
+ c.href = a;
+ d = b(c);
+ return {
+ protocol: (c.protocol || "").toLowerCase(),
+ host: d[0],
+ port: d[1],
+ path: d[2],
+ query: c.search || "",
+ url: a || ""
+ }
+ };
+ var Z = {
+ ga: function() {
+ Z.f = []
+ }
+ };
+ Z.ga();
+ Z.D = function(a) {
+ var b = Z.J.apply(Z, arguments),
+ b = Z.f.concat(b);
+ for (Z.f = []; 0 < b.length && !Z.v(b[0]) && !(b.shift(), 0 < Z.f.length););
+ Z.f = Z.f.concat(b)
+ };
+ Z.J = function(a) {
+ for (var b = [], c = 0; c < arguments.length; c++) try {
+ var d = new sc(arguments[c]);
+ if (d.g) Yd.set(d.a[0], d.a[1]);
+ else {
+ if (d.i) {
+ var e = d,
+ g = e.a[0];
+ if (!ea(Yd.get(g)) && !$d.get(g)) {
+ Zd.hasOwnProperty(g) && J(Zd[g]);
+ var ca = e.X;
+ !ca && Zd.hasOwnProperty(g) ? (J(39), ca = g + ".js") : J(43);
+ if (ca) {
+ ca && 0 <= ca.indexOf("/") || (ca = (Ba || Ud() ? "https:" : "http:") + "//www.google-analytics.com/plugins/ua/" + ca);
+ var l = ae(ca),
+ e = void 0;
+ var k = l.protocol,
+ w = M.location.protocol,
+ e = "https:" == k || k == w ? !0 : "http:" != k ? !1 : "http:" == w;
+ var Xd;
+ if (Xd = e) {
+ var e =
+ l,
+ be = ae(M.location.href);
+ if (e.query || 0 <= e.url.indexOf("?") || 0 <= e.path.indexOf("://")) Xd = !1;
+ else if (e.host == be.host && e.port == be.port) Xd = !0;
+ else {
+ var ce = "http:" == e.protocol ? 80 : 443;
+ Xd = "www.google-analytics.com" == e.host && (e.port || ce) == ce && D(e.path, "/plugins/") ? !0 : !1
+ }
+ }
+ Xd && (wa(l.url), $d.set(g, !0))
+ }
+ }
+ }
+ b.push(d)
+ }
+ } catch (de) {}
+ return b
+ };
+ Z.v = function(a) {
+ try {
+ if (a.u) a.u.call(O, N.j("t0"));
+ else {
+ var b = a.c == gb ? N : N.j(a.c);
+ if (a.A) "t0" == a.c && N.create.apply(N, a.a);
+ else if (a.ba) N.remove(a.c);
+ else if (b)
+ if (a.i) {
+ var c;
+ var d = a.a[0],
+ e = a.W;
+ b == N || b.get(V);
+ var g = Yd.get(d);
+ ea(g) ? (b.plugins_ = b.plugins_ || new ee, b.plugins_.get(d) || b.plugins_.set(d, new g(b, e || {})), c = !0) : c = !1;
+ if (!c) return !0
+ } else if (a.K) {
+ var ca = a.C,
+ l = a.a,
+ k = b.plugins_.get(a.K);
+ k[ca].apply(k, l)
+ } else b[a.C].apply(b, a.a)
+ }
+ } catch (w) {}
+ };
+ var N = function(a) {
+ J(1);
+ Z.D.apply(Z, [arguments])
+ };
+ N.h = {};
+ N.P = [];
+ N.L = 0;
+ N.answer = 42;
+ var uc = [Na, W, V];
+ N.create = function(a) {
+ var b = za(uc, [].slice.call(arguments));
+ b[V] || (b[V] = "t0");
+ var c = "" + b[V];
+ if (N.h[c]) return N.h[c];
+ b = new pc(b);
+ N.h[c] = b;
+ N.P.push(b);
+ return b
+ };
+ N.remove = function(a) {
+ for (var b = 0; b < N.P.length; b++)
+ if (N.P[b].get(V) == a) {
+ N.P.splice(b, 1);
+ N.h[a] = null;
+ break
+ }
+ };
+ N.j = function(a) {
+ return N.h[a]
+ };
+ N.getAll = function() {
+ return N.P.slice(0)
+ };
+ N.N = function() {
+ "ga" != gb && J(49);
+ var a = O[gb];
+ if (!a || 42 != a.answer) {
+ N.L = a && a.l;
+ N.loaded = !0;
+ var b = O[gb] = N;
+ X("create", b, b.create);
+ X("remove", b, b.remove);
+ X("getByName", b, b.j, 5);
+ X("getAll", b, b.getAll, 6);
+ b = pc.prototype;
+ X("get", b, b.get, 7);
+ X("set", b, b.set, 4);
+ X("send", b, b.send);
+ b = Ya.prototype;
+ X("get", b, b.get);
+ X("set", b, b.set);
+ if (!Ud() && !Ba) {
+ a: {
+ for (var b = M.getElementsByTagName("script"), c = 0; c < b.length && 100 > c; c++) {
+ var d = b[c].src;
+ if (d && 0 == d.indexOf("https://www.google-analytics.com/analytics")) {
+ J(33);
+ b = !0;
+ break a
+ }
+ }
+ b = !1
+ }
+ b && (Ba = !0)
+ }
+ Ud() || Ba || !Ed(new Od) || (J(36), Ba = !0);
+ (O.gaplugins = O.gaplugins || {}).Linker = Dc;
+ b = Dc.prototype;
+ Yd.set("linker", Dc);
+ X("decorate", b, b.ca, 20);
+ X("autoLink", b, b.S, 25);
+ Yd.set("displayfeatures", fd);
+ Yd.set("adfeatures", fd);
+ a = a && a.q;
+ ka(a) ? Z.D.apply(N, a) : J(50)
+ }
+ };
+ N.da = function() {
+ for (var a = N.getAll(), b = 0; b < a.length; b++) a[b].get(V)
+ };
+ (function() {
+ var a = N.N;
+ if (!rc(a)) {
+ J(16);
+ var b = !1,
+ c = function() {
+ if (!b && rc(a)) {
+ b = !0;
+ var d = c,
+ e = M;
+ e.removeEventListener ? e.removeEventListener("visibilitychange", d, !1) : e.detachEvent && e.detachEvent("onvisibilitychange", d)
+ }
+ };
+ L(M, "visibilitychange", c)
+ }
+ })();
+
+ function La(a) {
+ var b = 1,
+ c = 0,
+ d;
+ if (a)
+ for (b = 0, d = a.length - 1; 0 <= d; d--) c = a.charCodeAt(d), b = (b << 6 & 268435455) + c + (c << 14), c = b & 266338304, b = 0 != c ? b ^ c >> 21 : b;
+ return b
+ };
+})(window);
\ No newline at end of file
diff --git a/assets/454c84bf43a2.svg b/assets/454c84bf43a2.svg
new file mode 100644
index 0000000..36d2c75
--- /dev/null
+++ b/assets/454c84bf43a2.svg
@@ -0,0 +1,74 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/4cebab334de8.png b/assets/4cebab334de8.png
new file mode 100644
index 0000000..ac66a40
Binary files /dev/null and b/assets/4cebab334de8.png differ
diff --git a/assets/5254acc940ed.svg b/assets/5254acc940ed.svg
new file mode 100644
index 0000000..8c73fc2
--- /dev/null
+++ b/assets/5254acc940ed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/5538870549b1.png b/assets/5538870549b1.png
new file mode 100644
index 0000000..7fc11b7
Binary files /dev/null and b/assets/5538870549b1.png differ
diff --git a/assets/55de981c4381.svg b/assets/55de981c4381.svg
new file mode 100644
index 0000000..36d2c75
--- /dev/null
+++ b/assets/55de981c4381.svg
@@ -0,0 +1,74 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/6d4586e94e1c.png b/assets/6d4586e94e1c.png
new file mode 100644
index 0000000..371e47d
Binary files /dev/null and b/assets/6d4586e94e1c.png differ
diff --git a/assets/7422b1b94163.svg b/assets/7422b1b94163.svg
new file mode 100644
index 0000000..4551eb4
--- /dev/null
+++ b/assets/7422b1b94163.svg
@@ -0,0 +1,24 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/783c945642a1.svg b/assets/783c945642a1.svg
new file mode 100644
index 0000000..bfcb6fb
--- /dev/null
+++ b/assets/783c945642a1.svg
@@ -0,0 +1,94 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/a15bb02a4d1c.svg b/assets/a15bb02a4d1c.svg
new file mode 100644
index 0000000..256fb9c
--- /dev/null
+++ b/assets/a15bb02a4d1c.svg
@@ -0,0 +1,80 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/a9f6b59c43d4.svg b/assets/a9f6b59c43d4.svg
new file mode 100644
index 0000000..256fb9c
--- /dev/null
+++ b/assets/a9f6b59c43d4.svg
@@ -0,0 +1,80 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Bomb_Range_Up.svg b/assets/ability/Ability_Bomb_Range_Up.svg
new file mode 100644
index 0000000..dcc8e3f
--- /dev/null
+++ b/assets/ability/Ability_Bomb_Range_Up.svg
@@ -0,0 +1,66 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Bomb_Sniffer.svg b/assets/ability/Ability_Bomb_Sniffer.svg
new file mode 100644
index 0000000..3a197d3
--- /dev/null
+++ b/assets/ability/Ability_Bomb_Sniffer.svg
@@ -0,0 +1,31 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Cold_Blooded.svg b/assets/ability/Ability_Cold_Blooded.svg
new file mode 100644
index 0000000..a54ba99
--- /dev/null
+++ b/assets/ability/Ability_Cold_Blooded.svg
@@ -0,0 +1,73 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Comeback.svg b/assets/ability/Ability_Comeback.svg
new file mode 100644
index 0000000..e647c1a
--- /dev/null
+++ b/assets/ability/Ability_Comeback.svg
@@ -0,0 +1,85 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Damage_Up.svg b/assets/ability/Ability_Damage_Up.svg
new file mode 100644
index 0000000..8c73fc2
--- /dev/null
+++ b/assets/ability/Ability_Damage_Up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Defense_Up.svg b/assets/ability/Ability_Defense_Up.svg
new file mode 100644
index 0000000..4551eb4
--- /dev/null
+++ b/assets/ability/Ability_Defense_Up.svg
@@ -0,0 +1,24 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Haunt.svg b/assets/ability/Ability_Haunt.svg
new file mode 100644
index 0000000..05abee1
--- /dev/null
+++ b/assets/ability/Ability_Haunt.svg
@@ -0,0 +1,90 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Ink_Recovery_Up.svg b/assets/ability/Ability_Ink_Recovery_Up.svg
new file mode 100644
index 0000000..256fb9c
--- /dev/null
+++ b/assets/ability/Ability_Ink_Recovery_Up.svg
@@ -0,0 +1,80 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Ink_Resistance_Up.svg b/assets/ability/Ability_Ink_Resistance_Up.svg
new file mode 100644
index 0000000..104d1a2
--- /dev/null
+++ b/assets/ability/Ability_Ink_Resistance_Up.svg
@@ -0,0 +1,117 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Ink_Saver_-Main-.svg b/assets/ability/Ability_Ink_Saver_-Main-.svg
new file mode 100644
index 0000000..07197b0
--- /dev/null
+++ b/assets/ability/Ability_Ink_Saver_-Main-.svg
@@ -0,0 +1,118 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Ink_Saver_-Sub-.svg b/assets/ability/Ability_Ink_Saver_-Sub-.svg
new file mode 100644
index 0000000..660109e
--- /dev/null
+++ b/assets/ability/Ability_Ink_Saver_-Sub-.svg
@@ -0,0 +1,118 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Last-Ditch_Effort.svg b/assets/ability/Ability_Last-Ditch_Effort.svg
new file mode 100644
index 0000000..7fad910
--- /dev/null
+++ b/assets/ability/Ability_Last-Ditch_Effort.svg
@@ -0,0 +1,54 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Ninja_Squid.svg b/assets/ability/Ability_Ninja_Squid.svg
new file mode 100644
index 0000000..c6bbba5
--- /dev/null
+++ b/assets/ability/Ability_Ninja_Squid.svg
@@ -0,0 +1,91 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Opening_Gambit.svg b/assets/ability/Ability_Opening_Gambit.svg
new file mode 100644
index 0000000..93c34a6
--- /dev/null
+++ b/assets/ability/Ability_Opening_Gambit.svg
@@ -0,0 +1,53 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Quick_Respawn.svg b/assets/ability/Ability_Quick_Respawn.svg
new file mode 100644
index 0000000..7cb478b
--- /dev/null
+++ b/assets/ability/Ability_Quick_Respawn.svg
@@ -0,0 +1,110 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Quick_Super_Jump.svg b/assets/ability/Ability_Quick_Super_Jump.svg
new file mode 100644
index 0000000..c004764
--- /dev/null
+++ b/assets/ability/Ability_Quick_Super_Jump.svg
@@ -0,0 +1,94 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Recon.svg b/assets/ability/Ability_Recon.svg
new file mode 100644
index 0000000..448c9e1
--- /dev/null
+++ b/assets/ability/Ability_Recon.svg
@@ -0,0 +1,57 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Run_Speed_Up.svg b/assets/ability/Ability_Run_Speed_Up.svg
new file mode 100644
index 0000000..ea686b9
--- /dev/null
+++ b/assets/ability/Ability_Run_Speed_Up.svg
@@ -0,0 +1,78 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Special_Charge_Up.svg b/assets/ability/Ability_Special_Charge_Up.svg
new file mode 100644
index 0000000..0d12d78
--- /dev/null
+++ b/assets/ability/Ability_Special_Charge_Up.svg
@@ -0,0 +1,51 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Special_Duration_Up.svg b/assets/ability/Ability_Special_Duration_Up.svg
new file mode 100644
index 0000000..36d2c75
--- /dev/null
+++ b/assets/ability/Ability_Special_Duration_Up.svg
@@ -0,0 +1,74 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Special_Saver.svg b/assets/ability/Ability_Special_Saver.svg
new file mode 100644
index 0000000..2f71c1c
--- /dev/null
+++ b/assets/ability/Ability_Special_Saver.svg
@@ -0,0 +1,124 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Stealth_Jump.svg b/assets/ability/Ability_Stealth_Jump.svg
new file mode 100644
index 0000000..ccd8d87
--- /dev/null
+++ b/assets/ability/Ability_Stealth_Jump.svg
@@ -0,0 +1,62 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Swim_Speed_Up.svg b/assets/ability/Ability_Swim_Speed_Up.svg
new file mode 100644
index 0000000..bfcb6fb
--- /dev/null
+++ b/assets/ability/Ability_Swim_Speed_Up.svg
@@ -0,0 +1,94 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Ability_Tenacity.svg b/assets/ability/Ability_Tenacity.svg
new file mode 100644
index 0000000..bda2420
--- /dev/null
+++ b/assets/ability/Ability_Tenacity.svg
@@ -0,0 +1,205 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/ability/Blank.png b/assets/ability/Blank.png
new file mode 100644
index 0000000..8fd3569
Binary files /dev/null and b/assets/ability/Blank.png differ
diff --git a/assets/ability/ParameterIcon^q.png b/assets/ability/ParameterIcon^q.png
new file mode 100644
index 0000000..c55d7de
Binary files /dev/null and b/assets/ability/ParameterIcon^q.png differ
diff --git a/assets/b2d582c44ba2.svg b/assets/b2d582c44ba2.svg
new file mode 100644
index 0000000..36d2c75
--- /dev/null
+++ b/assets/b2d582c44ba2.svg
@@ -0,0 +1,74 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/c9c9af9f4a95.svg b/assets/c9c9af9f4a95.svg
new file mode 100644
index 0000000..4551eb4
--- /dev/null
+++ b/assets/c9c9af9f4a95.svg
@@ -0,0 +1,24 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/cae6942642cb.svg b/assets/cae6942642cb.svg
new file mode 100644
index 0000000..4551eb4
--- /dev/null
+++ b/assets/cae6942642cb.svg
@@ -0,0 +1,24 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/clothing/AMB000.png b/assets/clothing/AMB000.png
new file mode 100644
index 0000000..9fd0d25
Binary files /dev/null and b/assets/clothing/AMB000.png differ
diff --git a/assets/clothing/AMB001.png b/assets/clothing/AMB001.png
new file mode 100644
index 0000000..05d0c9f
Binary files /dev/null and b/assets/clothing/AMB001.png differ
diff --git a/assets/clothing/AMB002.png b/assets/clothing/AMB002.png
new file mode 100644
index 0000000..d7e6180
Binary files /dev/null and b/assets/clothing/AMB002.png differ
diff --git a/assets/clothing/First.png b/assets/clothing/First.png
new file mode 100644
index 0000000..12dafe1
Binary files /dev/null and b/assets/clothing/First.png differ
diff --git a/assets/clothing/HAP000.png b/assets/clothing/HAP000.png
new file mode 100644
index 0000000..09e2400
Binary files /dev/null and b/assets/clothing/HAP000.png differ
diff --git a/assets/clothing/JKT000.png b/assets/clothing/JKT000.png
new file mode 100644
index 0000000..9b01341
Binary files /dev/null and b/assets/clothing/JKT000.png differ
diff --git a/assets/clothing/JKT002.png b/assets/clothing/JKT002.png
new file mode 100644
index 0000000..0e1d507
Binary files /dev/null and b/assets/clothing/JKT002.png differ
diff --git a/assets/clothing/JKT003.png b/assets/clothing/JKT003.png
new file mode 100644
index 0000000..575eb62
Binary files /dev/null and b/assets/clothing/JKT003.png differ
diff --git a/assets/clothing/JKT004.png b/assets/clothing/JKT004.png
new file mode 100644
index 0000000..e4e099e
Binary files /dev/null and b/assets/clothing/JKT004.png differ
diff --git a/assets/clothing/JKT005.png b/assets/clothing/JKT005.png
new file mode 100644
index 0000000..df5b3e0
Binary files /dev/null and b/assets/clothing/JKT005.png differ
diff --git a/assets/clothing/JKT006.png b/assets/clothing/JKT006.png
new file mode 100644
index 0000000..ac67c7d
Binary files /dev/null and b/assets/clothing/JKT006.png differ
diff --git a/assets/clothing/JKT007.png b/assets/clothing/JKT007.png
new file mode 100644
index 0000000..e6d6a68
Binary files /dev/null and b/assets/clothing/JKT007.png differ
diff --git a/assets/clothing/JKT008.png b/assets/clothing/JKT008.png
new file mode 100644
index 0000000..9d71d63
Binary files /dev/null and b/assets/clothing/JKT008.png differ
diff --git a/assets/clothing/JKT009.png b/assets/clothing/JKT009.png
new file mode 100644
index 0000000..005bee3
Binary files /dev/null and b/assets/clothing/JKT009.png differ
diff --git a/assets/clothing/JKT010.png b/assets/clothing/JKT010.png
new file mode 100644
index 0000000..86871ca
Binary files /dev/null and b/assets/clothing/JKT010.png differ
diff --git a/assets/clothing/JKT011.png b/assets/clothing/JKT011.png
new file mode 100644
index 0000000..09b5b2c
Binary files /dev/null and b/assets/clothing/JKT011.png differ
diff --git a/assets/clothing/JKT012.png b/assets/clothing/JKT012.png
new file mode 100644
index 0000000..866bc13
Binary files /dev/null and b/assets/clothing/JKT012.png differ
diff --git a/assets/clothing/JKT013.png b/assets/clothing/JKT013.png
new file mode 100644
index 0000000..869b04c
Binary files /dev/null and b/assets/clothing/JKT013.png differ
diff --git a/assets/clothing/JKT014.png b/assets/clothing/JKT014.png
new file mode 100644
index 0000000..ca2810c
Binary files /dev/null and b/assets/clothing/JKT014.png differ
diff --git a/assets/clothing/JKT015.png b/assets/clothing/JKT015.png
new file mode 100644
index 0000000..925b19f
Binary files /dev/null and b/assets/clothing/JKT015.png differ
diff --git a/assets/clothing/JKT016.png b/assets/clothing/JKT016.png
new file mode 100644
index 0000000..0f8c610
Binary files /dev/null and b/assets/clothing/JKT016.png differ
diff --git a/assets/clothing/MSN000.png b/assets/clothing/MSN000.png
new file mode 100644
index 0000000..91916de
Binary files /dev/null and b/assets/clothing/MSN000.png differ
diff --git a/assets/clothing/PLO000.png b/assets/clothing/PLO000.png
new file mode 100644
index 0000000..cc330e4
Binary files /dev/null and b/assets/clothing/PLO000.png differ
diff --git a/assets/clothing/PLO001.png b/assets/clothing/PLO001.png
new file mode 100644
index 0000000..a95ab08
Binary files /dev/null and b/assets/clothing/PLO001.png differ
diff --git a/assets/clothing/PLO002.png b/assets/clothing/PLO002.png
new file mode 100644
index 0000000..0ee90f3
Binary files /dev/null and b/assets/clothing/PLO002.png differ
diff --git a/assets/clothing/PLO003.png b/assets/clothing/PLO003.png
new file mode 100644
index 0000000..144f6eb
Binary files /dev/null and b/assets/clothing/PLO003.png differ
diff --git a/assets/clothing/PLO004.png b/assets/clothing/PLO004.png
new file mode 100644
index 0000000..4230564
Binary files /dev/null and b/assets/clothing/PLO004.png differ
diff --git a/assets/clothing/PLO005.png b/assets/clothing/PLO005.png
new file mode 100644
index 0000000..a48a1e3
Binary files /dev/null and b/assets/clothing/PLO005.png differ
diff --git a/assets/clothing/PLO006.png b/assets/clothing/PLO006.png
new file mode 100644
index 0000000..e68fed9
Binary files /dev/null and b/assets/clothing/PLO006.png differ
diff --git a/assets/clothing/PLO007.png b/assets/clothing/PLO007.png
new file mode 100644
index 0000000..6bc7a88
Binary files /dev/null and b/assets/clothing/PLO007.png differ
diff --git a/assets/clothing/PLO008.png b/assets/clothing/PLO008.png
new file mode 100644
index 0000000..e31cfbb
Binary files /dev/null and b/assets/clothing/PLO008.png differ
diff --git a/assets/clothing/PRK000.png b/assets/clothing/PRK000.png
new file mode 100644
index 0000000..bc39841
Binary files /dev/null and b/assets/clothing/PRK000.png differ
diff --git a/assets/clothing/PRK001.png b/assets/clothing/PRK001.png
new file mode 100644
index 0000000..20f9d7e
Binary files /dev/null and b/assets/clothing/PRK001.png differ
diff --git a/assets/clothing/PRK002.png b/assets/clothing/PRK002.png
new file mode 100644
index 0000000..7150db2
Binary files /dev/null and b/assets/clothing/PRK002.png differ
diff --git a/assets/clothing/PRK003.png b/assets/clothing/PRK003.png
new file mode 100644
index 0000000..b42cfbe
Binary files /dev/null and b/assets/clothing/PRK003.png differ
diff --git a/assets/clothing/RVL000.png b/assets/clothing/RVL000.png
new file mode 100644
index 0000000..1b85a04
Binary files /dev/null and b/assets/clothing/RVL000.png differ
diff --git a/assets/clothing/SHT000.png b/assets/clothing/SHT000.png
new file mode 100644
index 0000000..92927b7
Binary files /dev/null and b/assets/clothing/SHT000.png differ
diff --git a/assets/clothing/SHT001.png b/assets/clothing/SHT001.png
new file mode 100644
index 0000000..7812ee1
Binary files /dev/null and b/assets/clothing/SHT001.png differ
diff --git a/assets/clothing/SHT002.png b/assets/clothing/SHT002.png
new file mode 100644
index 0000000..0781d9a
Binary files /dev/null and b/assets/clothing/SHT002.png differ
diff --git a/assets/clothing/SHT003.png b/assets/clothing/SHT003.png
new file mode 100644
index 0000000..902bb93
Binary files /dev/null and b/assets/clothing/SHT003.png differ
diff --git a/assets/clothing/SHT004.png b/assets/clothing/SHT004.png
new file mode 100644
index 0000000..1eb0d30
Binary files /dev/null and b/assets/clothing/SHT004.png differ
diff --git a/assets/clothing/SHT005.png b/assets/clothing/SHT005.png
new file mode 100644
index 0000000..94e8c8b
Binary files /dev/null and b/assets/clothing/SHT005.png differ
diff --git a/assets/clothing/SHT006.png b/assets/clothing/SHT006.png
new file mode 100644
index 0000000..337d0e8
Binary files /dev/null and b/assets/clothing/SHT006.png differ
diff --git a/assets/clothing/SHT010.png b/assets/clothing/SHT010.png
new file mode 100644
index 0000000..49e5eff
Binary files /dev/null and b/assets/clothing/SHT010.png differ
diff --git a/assets/clothing/SHT011.png b/assets/clothing/SHT011.png
new file mode 100644
index 0000000..51a3c4e
Binary files /dev/null and b/assets/clothing/SHT011.png differ
diff --git a/assets/clothing/SHT012.png b/assets/clothing/SHT012.png
new file mode 100644
index 0000000..f293430
Binary files /dev/null and b/assets/clothing/SHT012.png differ
diff --git a/assets/clothing/SHT013.png b/assets/clothing/SHT013.png
new file mode 100644
index 0000000..4ed2bc0
Binary files /dev/null and b/assets/clothing/SHT013.png differ
diff --git a/assets/clothing/SHT014.png b/assets/clothing/SHT014.png
new file mode 100644
index 0000000..d60fc37
Binary files /dev/null and b/assets/clothing/SHT014.png differ
diff --git a/assets/clothing/SHT015.png b/assets/clothing/SHT015.png
new file mode 100644
index 0000000..0cf5948
Binary files /dev/null and b/assets/clothing/SHT015.png differ
diff --git a/assets/clothing/SHT016.png b/assets/clothing/SHT016.png
new file mode 100644
index 0000000..bed076f
Binary files /dev/null and b/assets/clothing/SHT016.png differ
diff --git a/assets/clothing/SWT000.png b/assets/clothing/SWT000.png
new file mode 100644
index 0000000..de320bb
Binary files /dev/null and b/assets/clothing/SWT000.png differ
diff --git a/assets/clothing/SWT001.png b/assets/clothing/SWT001.png
new file mode 100644
index 0000000..4042b8a
Binary files /dev/null and b/assets/clothing/SWT001.png differ
diff --git a/assets/clothing/SWT002.png b/assets/clothing/SWT002.png
new file mode 100644
index 0000000..81388a5
Binary files /dev/null and b/assets/clothing/SWT002.png differ
diff --git a/assets/clothing/SWT003.png b/assets/clothing/SWT003.png
new file mode 100644
index 0000000..b657469
Binary files /dev/null and b/assets/clothing/SWT003.png differ
diff --git a/assets/clothing/SWT004.png b/assets/clothing/SWT004.png
new file mode 100644
index 0000000..d58b811
Binary files /dev/null and b/assets/clothing/SWT004.png differ
diff --git a/assets/clothing/SWT005.png b/assets/clothing/SWT005.png
new file mode 100644
index 0000000..8156ac8
Binary files /dev/null and b/assets/clothing/SWT005.png differ
diff --git a/assets/clothing/SWT006.png b/assets/clothing/SWT006.png
new file mode 100644
index 0000000..898f5df
Binary files /dev/null and b/assets/clothing/SWT006.png differ
diff --git a/assets/clothing/TEL000.png b/assets/clothing/TEL000.png
new file mode 100644
index 0000000..a143880
Binary files /dev/null and b/assets/clothing/TEL000.png differ
diff --git a/assets/clothing/TEL001.png b/assets/clothing/TEL001.png
new file mode 100644
index 0000000..ce553c8
Binary files /dev/null and b/assets/clothing/TEL001.png differ
diff --git a/assets/clothing/TEL002.png b/assets/clothing/TEL002.png
new file mode 100644
index 0000000..259df94
Binary files /dev/null and b/assets/clothing/TEL002.png differ
diff --git a/assets/clothing/TEL003.png b/assets/clothing/TEL003.png
new file mode 100644
index 0000000..66fa23e
Binary files /dev/null and b/assets/clothing/TEL003.png differ
diff --git a/assets/clothing/TEL004.png b/assets/clothing/TEL004.png
new file mode 100644
index 0000000..00dc8ab
Binary files /dev/null and b/assets/clothing/TEL004.png differ
diff --git a/assets/clothing/TEL005.png b/assets/clothing/TEL005.png
new file mode 100644
index 0000000..db42b65
Binary files /dev/null and b/assets/clothing/TEL005.png differ
diff --git a/assets/clothing/TEL006.png b/assets/clothing/TEL006.png
new file mode 100644
index 0000000..21644d0
Binary files /dev/null and b/assets/clothing/TEL006.png differ
diff --git a/assets/clothing/TEL007.png b/assets/clothing/TEL007.png
new file mode 100644
index 0000000..e68f019
Binary files /dev/null and b/assets/clothing/TEL007.png differ
diff --git a/assets/clothing/TEL008.png b/assets/clothing/TEL008.png
new file mode 100644
index 0000000..aa7f5ae
Binary files /dev/null and b/assets/clothing/TEL008.png differ
diff --git a/assets/clothing/TEL009.png b/assets/clothing/TEL009.png
new file mode 100644
index 0000000..3ed7d73
Binary files /dev/null and b/assets/clothing/TEL009.png differ
diff --git a/assets/clothing/TEL010.png b/assets/clothing/TEL010.png
new file mode 100644
index 0000000..b5e4715
Binary files /dev/null and b/assets/clothing/TEL010.png differ
diff --git a/assets/clothing/TEL011.png b/assets/clothing/TEL011.png
new file mode 100644
index 0000000..7e0e301
Binary files /dev/null and b/assets/clothing/TEL011.png differ
diff --git a/assets/clothing/TEL012.png b/assets/clothing/TEL012.png
new file mode 100644
index 0000000..07051ab
Binary files /dev/null and b/assets/clothing/TEL012.png differ
diff --git a/assets/clothing/TES000.png b/assets/clothing/TES000.png
new file mode 100644
index 0000000..aae787c
Binary files /dev/null and b/assets/clothing/TES000.png differ
diff --git a/assets/clothing/TES001.png b/assets/clothing/TES001.png
new file mode 100644
index 0000000..0026d48
Binary files /dev/null and b/assets/clothing/TES001.png differ
diff --git a/assets/clothing/TES003.png b/assets/clothing/TES003.png
new file mode 100644
index 0000000..91f2906
Binary files /dev/null and b/assets/clothing/TES003.png differ
diff --git a/assets/clothing/TES004.png b/assets/clothing/TES004.png
new file mode 100644
index 0000000..bce47c3
Binary files /dev/null and b/assets/clothing/TES004.png differ
diff --git a/assets/clothing/TES005.png b/assets/clothing/TES005.png
new file mode 100644
index 0000000..7bce10a
Binary files /dev/null and b/assets/clothing/TES005.png differ
diff --git a/assets/clothing/TES006.png b/assets/clothing/TES006.png
new file mode 100644
index 0000000..f7c9d39
Binary files /dev/null and b/assets/clothing/TES006.png differ
diff --git a/assets/clothing/TES007.png b/assets/clothing/TES007.png
new file mode 100644
index 0000000..7c5ec9d
Binary files /dev/null and b/assets/clothing/TES007.png differ
diff --git a/assets/clothing/TES008.png b/assets/clothing/TES008.png
new file mode 100644
index 0000000..fc9b07f
Binary files /dev/null and b/assets/clothing/TES008.png differ
diff --git a/assets/clothing/TES009.png b/assets/clothing/TES009.png
new file mode 100644
index 0000000..d8ffb79
Binary files /dev/null and b/assets/clothing/TES009.png differ
diff --git a/assets/clothing/TES010.png b/assets/clothing/TES010.png
new file mode 100644
index 0000000..6c23363
Binary files /dev/null and b/assets/clothing/TES010.png differ
diff --git a/assets/clothing/TES011.png b/assets/clothing/TES011.png
new file mode 100644
index 0000000..dfbc8a3
Binary files /dev/null and b/assets/clothing/TES011.png differ
diff --git a/assets/clothing/TES012.png b/assets/clothing/TES012.png
new file mode 100644
index 0000000..ea502f8
Binary files /dev/null and b/assets/clothing/TES012.png differ
diff --git a/assets/clothing/TES014.png b/assets/clothing/TES014.png
new file mode 100644
index 0000000..6366db8
Binary files /dev/null and b/assets/clothing/TES014.png differ
diff --git a/assets/clothing/TES015.png b/assets/clothing/TES015.png
new file mode 100644
index 0000000..6479c55
Binary files /dev/null and b/assets/clothing/TES015.png differ
diff --git a/assets/clothing/TES016.png b/assets/clothing/TES016.png
new file mode 100644
index 0000000..781c078
Binary files /dev/null and b/assets/clothing/TES016.png differ
diff --git a/assets/clothing/TES017.png b/assets/clothing/TES017.png
new file mode 100644
index 0000000..22831d1
Binary files /dev/null and b/assets/clothing/TES017.png differ
diff --git a/assets/clothing/TES018.png b/assets/clothing/TES018.png
new file mode 100644
index 0000000..39deb33
Binary files /dev/null and b/assets/clothing/TES018.png differ
diff --git a/assets/clothing/TES019.png b/assets/clothing/TES019.png
new file mode 100644
index 0000000..b2e938e
Binary files /dev/null and b/assets/clothing/TES019.png differ
diff --git a/assets/clothing/TES020.png b/assets/clothing/TES020.png
new file mode 100644
index 0000000..282ed93
Binary files /dev/null and b/assets/clothing/TES020.png differ
diff --git a/assets/clothing/TES021.png b/assets/clothing/TES021.png
new file mode 100644
index 0000000..4dce6ab
Binary files /dev/null and b/assets/clothing/TES021.png differ
diff --git a/assets/clothing/TES022.png b/assets/clothing/TES022.png
new file mode 100644
index 0000000..0dc4b80
Binary files /dev/null and b/assets/clothing/TES022.png differ
diff --git a/assets/clothing/TES023.png b/assets/clothing/TES023.png
new file mode 100644
index 0000000..1e2803b
Binary files /dev/null and b/assets/clothing/TES023.png differ
diff --git a/assets/clothing/TES024.png b/assets/clothing/TES024.png
new file mode 100644
index 0000000..ba5b7b8
Binary files /dev/null and b/assets/clothing/TES024.png differ
diff --git a/assets/clothing/TES025.png b/assets/clothing/TES025.png
new file mode 100644
index 0000000..4199cde
Binary files /dev/null and b/assets/clothing/TES025.png differ
diff --git a/assets/clothing/TES026.png b/assets/clothing/TES026.png
new file mode 100644
index 0000000..9cabde4
Binary files /dev/null and b/assets/clothing/TES026.png differ
diff --git a/assets/clothing/TES027.png b/assets/clothing/TES027.png
new file mode 100644
index 0000000..7cf90bd
Binary files /dev/null and b/assets/clothing/TES027.png differ
diff --git a/assets/clothing/TES028.png b/assets/clothing/TES028.png
new file mode 100644
index 0000000..fccce65
Binary files /dev/null and b/assets/clothing/TES028.png differ
diff --git a/assets/clothing/TES029.png b/assets/clothing/TES029.png
new file mode 100644
index 0000000..dfa4ca6
Binary files /dev/null and b/assets/clothing/TES029.png differ
diff --git a/assets/clothing/TLY000.png b/assets/clothing/TLY000.png
new file mode 100644
index 0000000..355ed4d
Binary files /dev/null and b/assets/clothing/TLY000.png differ
diff --git a/assets/clothing/TLY001.png b/assets/clothing/TLY001.png
new file mode 100644
index 0000000..67329d9
Binary files /dev/null and b/assets/clothing/TLY001.png differ
diff --git a/assets/clothing/TLY002.png b/assets/clothing/TLY002.png
new file mode 100644
index 0000000..a22ee43
Binary files /dev/null and b/assets/clothing/TLY002.png differ
diff --git a/assets/clothing/TLY003.png b/assets/clothing/TLY003.png
new file mode 100644
index 0000000..80d15a1
Binary files /dev/null and b/assets/clothing/TLY003.png differ
diff --git a/assets/clothing/TLY004.png b/assets/clothing/TLY004.png
new file mode 100644
index 0000000..3579875
Binary files /dev/null and b/assets/clothing/TLY004.png differ
diff --git a/assets/clothing/TLY005.png b/assets/clothing/TLY005.png
new file mode 100644
index 0000000..95f4407
Binary files /dev/null and b/assets/clothing/TLY005.png differ
diff --git a/assets/clothing/TLY006.png b/assets/clothing/TLY006.png
new file mode 100644
index 0000000..52304c2
Binary files /dev/null and b/assets/clothing/TLY006.png differ
diff --git a/assets/clothing/TLY007.png b/assets/clothing/TLY007.png
new file mode 100644
index 0000000..fbacddc
Binary files /dev/null and b/assets/clothing/TLY007.png differ
diff --git a/assets/clothing/TLY008.png b/assets/clothing/TLY008.png
new file mode 100644
index 0000000..783d177
Binary files /dev/null and b/assets/clothing/TLY008.png differ
diff --git a/assets/clothing/TLY009.png b/assets/clothing/TLY009.png
new file mode 100644
index 0000000..136d44c
Binary files /dev/null and b/assets/clothing/TLY009.png differ
diff --git a/assets/clothing/TNK000.png b/assets/clothing/TNK000.png
new file mode 100644
index 0000000..9f2556b
Binary files /dev/null and b/assets/clothing/TNK000.png differ
diff --git a/assets/clothing/TNK001.png b/assets/clothing/TNK001.png
new file mode 100644
index 0000000..1828716
Binary files /dev/null and b/assets/clothing/TNK001.png differ
diff --git a/assets/clothing/TNK002.png b/assets/clothing/TNK002.png
new file mode 100644
index 0000000..07c4b43
Binary files /dev/null and b/assets/clothing/TNK002.png differ
diff --git a/assets/clothing/VST000.png b/assets/clothing/VST000.png
new file mode 100644
index 0000000..ed937f1
Binary files /dev/null and b/assets/clothing/VST000.png differ
diff --git a/assets/clothing/VST001.png b/assets/clothing/VST001.png
new file mode 100644
index 0000000..9c5ec19
Binary files /dev/null and b/assets/clothing/VST001.png differ
diff --git a/assets/clothing/VST002.png b/assets/clothing/VST002.png
new file mode 100644
index 0000000..8d4f85c
Binary files /dev/null and b/assets/clothing/VST002.png differ
diff --git a/assets/clothing/VST003.png b/assets/clothing/VST003.png
new file mode 100644
index 0000000..03d4a4b
Binary files /dev/null and b/assets/clothing/VST003.png differ
diff --git a/assets/clothing/VST004.png b/assets/clothing/VST004.png
new file mode 100644
index 0000000..1f460c1
Binary files /dev/null and b/assets/clothing/VST004.png differ
diff --git a/assets/clothing/VST005.png b/assets/clothing/VST005.png
new file mode 100644
index 0000000..3c0f0e1
Binary files /dev/null and b/assets/clothing/VST005.png differ
diff --git a/assets/d24a8ad84d94.svg b/assets/d24a8ad84d94.svg
new file mode 100644
index 0000000..8c73fc2
--- /dev/null
+++ b/assets/d24a8ad84d94.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/d8fa88484989.svg b/assets/d8fa88484989.svg
new file mode 100644
index 0000000..256fb9c
--- /dev/null
+++ b/assets/d8fa88484989.svg
@@ -0,0 +1,80 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a-6b43fb1a0461932ed04e5af0598eabd9d5ab07ad9a8902641117f372cddf2582.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a-6b43fb1a0461932ed04e5af0598eabd9d5ab07ad9a8902641117f372cddf2582.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a-6b43fb1a0461932ed04e5af0598eabd9d5ab07ad9a8902641117f372cddf2582.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a-6b43fb1a0461932ed04e5af0598eabd9d5ab07ad9a8902641117f372cddf2582.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_minus-04165ef0c844cf836ef87dc0cb9d4041758a46b67f7be074e28e90ac1897279d.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_minus-04165ef0c844cf836ef87dc0cb9d4041758a46b67f7be074e28e90ac1897279d.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_minus-04165ef0c844cf836ef87dc0cb9d4041758a46b67f7be074e28e90ac1897279d.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_minus-04165ef0c844cf836ef87dc0cb9d4041758a46b67f7be074e28e90ac1897279d.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_plus-d710165dd227482d79330309efe4705fdfb8b803c354b5da38cb9ac06dc1765e.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_plus-d710165dd227482d79330309efe4705fdfb8b803c354b5da38cb9ac06dc1765e.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_plus-d710165dd227482d79330309efe4705fdfb8b803c354b5da38cb9ac06dc1765e.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_a_plus-d710165dd227482d79330309efe4705fdfb8b803c354b5da38cb9ac06dc1765e.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b-eb6bb02bb4338127aa6de25b7f3bd38318b514700eea763118f9675f4c1617c5.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b-eb6bb02bb4338127aa6de25b7f3bd38318b514700eea763118f9675f4c1617c5.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b-eb6bb02bb4338127aa6de25b7f3bd38318b514700eea763118f9675f4c1617c5.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b-eb6bb02bb4338127aa6de25b7f3bd38318b514700eea763118f9675f4c1617c5.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_minus-2885d447310a4fb5004fb3125aa55a6df85ce384cbfc86d25441ec9158ec127e.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_minus-2885d447310a4fb5004fb3125aa55a6df85ce384cbfc86d25441ec9158ec127e.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_minus-2885d447310a4fb5004fb3125aa55a6df85ce384cbfc86d25441ec9158ec127e.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_minus-2885d447310a4fb5004fb3125aa55a6df85ce384cbfc86d25441ec9158ec127e.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_plus-f7c6aa9ecea936266e583bc4ffbbf30ecae4586465b120337741be9aafe93c3b.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_plus-f7c6aa9ecea936266e583bc4ffbbf30ecae4586465b120337741be9aafe93c3b.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_plus-f7c6aa9ecea936266e583bc4ffbbf30ecae4586465b120337741be9aafe93c3b.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_b_plus-f7c6aa9ecea936266e583bc4ffbbf30ecae4586465b120337741be9aafe93c3b.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c-fe1fe7f2b82e3aabf48aa4400b19b1e8cf0fc2190354e0dbf50f089ab67c340f.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c-fe1fe7f2b82e3aabf48aa4400b19b1e8cf0fc2190354e0dbf50f089ab67c340f.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c-fe1fe7f2b82e3aabf48aa4400b19b1e8cf0fc2190354e0dbf50f089ab67c340f.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c-fe1fe7f2b82e3aabf48aa4400b19b1e8cf0fc2190354e0dbf50f089ab67c340f.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_minus-428155b1832ce62283d69a7117853485fb71fcde2a5514bb85c010c5ad67135e.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_minus-428155b1832ce62283d69a7117853485fb71fcde2a5514bb85c010c5ad67135e.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_minus-428155b1832ce62283d69a7117853485fb71fcde2a5514bb85c010c5ad67135e.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_minus-428155b1832ce62283d69a7117853485fb71fcde2a5514bb85c010c5ad67135e.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_plus-50578dfa638b0895de9066a489a24e40a483021588cad762a2d39f3e03fbb333.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_plus-50578dfa638b0895de9066a489a24e40a483021588cad762a2d39f3e03fbb333.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_plus-50578dfa638b0895de9066a489a24e40a483021588cad762a2d39f3e03fbb333.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_c_plus-50578dfa638b0895de9066a489a24e40a483021588cad762a2d39f3e03fbb333.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s-b73c38c850415c6127a21fff948b2ddcace46778e1a913f195427ab0fe65a779.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s-b73c38c850415c6127a21fff948b2ddcace46778e1a913f195427ab0fe65a779.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s-b73c38c850415c6127a21fff948b2ddcace46778e1a913f195427ab0fe65a779.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s-b73c38c850415c6127a21fff948b2ddcace46778e1a913f195427ab0fe65a779.svg.html
diff --git a/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s_plus-0d360efab395bbd71ca49aa3c265d78f0d09e21c44334724c7ed9d90262248b9.svg b/assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s_plus-0d360efab395bbd71ca49aa3c265d78f0d09e21c44334724c7ed9d90262248b9.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s_plus-0d360efab395bbd71ca49aa3c265d78f0d09e21c44334724c7ed9d90262248b9.svg
rename to assets/en/svg/text/scene/equipment/udemae_alphabet/tx_s_plus-0d360efab395bbd71ca49aa3c265d78f0d09e21c44334724c7ed9d90262248b9.svg.html
diff --git a/assets/en/svg/text/scene/friendpublic/tx_iidashippe-68446b533eebfd691f58eac07bdd665a50ba284e776c461a4df71d476069e2e0.svg b/assets/en/svg/text/scene/friendpublic/tx_iidashippe-68446b533eebfd691f58eac07bdd665a50ba284e776c461a4df71d476069e2e0.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/friendpublic/tx_iidashippe-68446b533eebfd691f58eac07bdd665a50ba284e776c461a4df71d476069e2e0.svg
rename to assets/en/svg/text/scene/friendpublic/tx_iidashippe-68446b533eebfd691f58eac07bdd665a50ba284e776c461a4df71d476069e2e0.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_0_green-40e856e23dc10b261a2a07d4aecb4092797913ab350fd9976ea7e3aa4a5082f2.svg b/assets/en/svg/text/scene/rank/number/tx_nb_0_green-40e856e23dc10b261a2a07d4aecb4092797913ab350fd9976ea7e3aa4a5082f2.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_0_green-40e856e23dc10b261a2a07d4aecb4092797913ab350fd9976ea7e3aa4a5082f2.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_0_green-40e856e23dc10b261a2a07d4aecb4092797913ab350fd9976ea7e3aa4a5082f2.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_0_orange-f69828a6019dfc3932c02b5c31db0bdcebe5757c45d8ee00e6f1bee59b7e99d7.svg b/assets/en/svg/text/scene/rank/number/tx_nb_0_orange-f69828a6019dfc3932c02b5c31db0bdcebe5757c45d8ee00e6f1bee59b7e99d7.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_0_orange-f69828a6019dfc3932c02b5c31db0bdcebe5757c45d8ee00e6f1bee59b7e99d7.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_0_orange-f69828a6019dfc3932c02b5c31db0bdcebe5757c45d8ee00e6f1bee59b7e99d7.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_0_wht-8cfb46c6086b2798ab693a4417d3df58d5a25d19f77749e7f6915dc6a3ae819c.svg b/assets/en/svg/text/scene/rank/number/tx_nb_0_wht-8cfb46c6086b2798ab693a4417d3df58d5a25d19f77749e7f6915dc6a3ae819c.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_0_wht-8cfb46c6086b2798ab693a4417d3df58d5a25d19f77749e7f6915dc6a3ae819c.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_0_wht-8cfb46c6086b2798ab693a4417d3df58d5a25d19f77749e7f6915dc6a3ae819c.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_1_green-c54d4ba3d0651b1ee50a6df24b0692afa22dc6792b6e3a9bbe5a5e089ccf9515.svg b/assets/en/svg/text/scene/rank/number/tx_nb_1_green-c54d4ba3d0651b1ee50a6df24b0692afa22dc6792b6e3a9bbe5a5e089ccf9515.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_1_green-c54d4ba3d0651b1ee50a6df24b0692afa22dc6792b6e3a9bbe5a5e089ccf9515.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_1_green-c54d4ba3d0651b1ee50a6df24b0692afa22dc6792b6e3a9bbe5a5e089ccf9515.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_1_orange-74328e96411c9d85b7a09cf021022e650e8baf24b1ebd0e6d088c12abb034403.svg b/assets/en/svg/text/scene/rank/number/tx_nb_1_orange-74328e96411c9d85b7a09cf021022e650e8baf24b1ebd0e6d088c12abb034403.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_1_orange-74328e96411c9d85b7a09cf021022e650e8baf24b1ebd0e6d088c12abb034403.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_1_orange-74328e96411c9d85b7a09cf021022e650e8baf24b1ebd0e6d088c12abb034403.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_1_wht-24754380a399263ceb1da9345f0f8d0fbe733c8cec184e39c128feafb1c509f1.svg b/assets/en/svg/text/scene/rank/number/tx_nb_1_wht-24754380a399263ceb1da9345f0f8d0fbe733c8cec184e39c128feafb1c509f1.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_1_wht-24754380a399263ceb1da9345f0f8d0fbe733c8cec184e39c128feafb1c509f1.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_1_wht-24754380a399263ceb1da9345f0f8d0fbe733c8cec184e39c128feafb1c509f1.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_2_green-f05fa75efc1803029130a07b3b87b394d638b7558386057568317a4bcca636cb.svg b/assets/en/svg/text/scene/rank/number/tx_nb_2_green-f05fa75efc1803029130a07b3b87b394d638b7558386057568317a4bcca636cb.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_2_green-f05fa75efc1803029130a07b3b87b394d638b7558386057568317a4bcca636cb.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_2_green-f05fa75efc1803029130a07b3b87b394d638b7558386057568317a4bcca636cb.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_2_orange-48ae3f075ee261faf58f5fbc878ef6535044d089a039fad065a119b7ec353323.svg b/assets/en/svg/text/scene/rank/number/tx_nb_2_orange-48ae3f075ee261faf58f5fbc878ef6535044d089a039fad065a119b7ec353323.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_2_orange-48ae3f075ee261faf58f5fbc878ef6535044d089a039fad065a119b7ec353323.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_2_orange-48ae3f075ee261faf58f5fbc878ef6535044d089a039fad065a119b7ec353323.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_2_wht-c6f8b2056b5f623f9b82b6b324d5267325abf958efd130c5738f83ba49a4c00b.svg b/assets/en/svg/text/scene/rank/number/tx_nb_2_wht-c6f8b2056b5f623f9b82b6b324d5267325abf958efd130c5738f83ba49a4c00b.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_2_wht-c6f8b2056b5f623f9b82b6b324d5267325abf958efd130c5738f83ba49a4c00b.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_2_wht-c6f8b2056b5f623f9b82b6b324d5267325abf958efd130c5738f83ba49a4c00b.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_3_green-d327346e1997c941fb6d1a39922e89fb5c9fe1e78feb2a11de0b7e18e589b2aa.svg b/assets/en/svg/text/scene/rank/number/tx_nb_3_green-d327346e1997c941fb6d1a39922e89fb5c9fe1e78feb2a11de0b7e18e589b2aa.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_3_green-d327346e1997c941fb6d1a39922e89fb5c9fe1e78feb2a11de0b7e18e589b2aa.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_3_green-d327346e1997c941fb6d1a39922e89fb5c9fe1e78feb2a11de0b7e18e589b2aa.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_3_orange-f039770517a13c41bd86a5837a8949a91d496cc2db33c90ccfc5c601b369efb7.svg b/assets/en/svg/text/scene/rank/number/tx_nb_3_orange-f039770517a13c41bd86a5837a8949a91d496cc2db33c90ccfc5c601b369efb7.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_3_orange-f039770517a13c41bd86a5837a8949a91d496cc2db33c90ccfc5c601b369efb7.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_3_orange-f039770517a13c41bd86a5837a8949a91d496cc2db33c90ccfc5c601b369efb7.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_3_wht-f89cc114275316a699bed7cebee2a8db0e739a269aaa44b34a7c8d51fe6798f2.svg b/assets/en/svg/text/scene/rank/number/tx_nb_3_wht-f89cc114275316a699bed7cebee2a8db0e739a269aaa44b34a7c8d51fe6798f2.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_3_wht-f89cc114275316a699bed7cebee2a8db0e739a269aaa44b34a7c8d51fe6798f2.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_3_wht-f89cc114275316a699bed7cebee2a8db0e739a269aaa44b34a7c8d51fe6798f2.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_4_green-fad2da0c0135f5511d0033b6f9df1176e786dbb1dc80518c5459ebdacf3f6fa3.svg b/assets/en/svg/text/scene/rank/number/tx_nb_4_green-fad2da0c0135f5511d0033b6f9df1176e786dbb1dc80518c5459ebdacf3f6fa3.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_4_green-fad2da0c0135f5511d0033b6f9df1176e786dbb1dc80518c5459ebdacf3f6fa3.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_4_green-fad2da0c0135f5511d0033b6f9df1176e786dbb1dc80518c5459ebdacf3f6fa3.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_4_orange-e9264e1d9066804ffc92f831c4501256a41d2ddde2df7803b0c434fc95f901a1.svg b/assets/en/svg/text/scene/rank/number/tx_nb_4_orange-e9264e1d9066804ffc92f831c4501256a41d2ddde2df7803b0c434fc95f901a1.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_4_orange-e9264e1d9066804ffc92f831c4501256a41d2ddde2df7803b0c434fc95f901a1.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_4_orange-e9264e1d9066804ffc92f831c4501256a41d2ddde2df7803b0c434fc95f901a1.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_4_wht-02c42d86c1f49ab3f4df70640844dc5b2a52255164dd39af7dd6c8f4d91df158.svg b/assets/en/svg/text/scene/rank/number/tx_nb_4_wht-02c42d86c1f49ab3f4df70640844dc5b2a52255164dd39af7dd6c8f4d91df158.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_4_wht-02c42d86c1f49ab3f4df70640844dc5b2a52255164dd39af7dd6c8f4d91df158.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_4_wht-02c42d86c1f49ab3f4df70640844dc5b2a52255164dd39af7dd6c8f4d91df158.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_5_green-6158cc1815800a58a180f3c8dd0ff194978325795d43a168e3d6c5653a30cb20.svg b/assets/en/svg/text/scene/rank/number/tx_nb_5_green-6158cc1815800a58a180f3c8dd0ff194978325795d43a168e3d6c5653a30cb20.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_5_green-6158cc1815800a58a180f3c8dd0ff194978325795d43a168e3d6c5653a30cb20.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_5_green-6158cc1815800a58a180f3c8dd0ff194978325795d43a168e3d6c5653a30cb20.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_5_orange-c961244cc0d6683e1352fc8362d42632e3fb8236b8bbc74fcfeb79e8be439992.svg b/assets/en/svg/text/scene/rank/number/tx_nb_5_orange-c961244cc0d6683e1352fc8362d42632e3fb8236b8bbc74fcfeb79e8be439992.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_5_orange-c961244cc0d6683e1352fc8362d42632e3fb8236b8bbc74fcfeb79e8be439992.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_5_orange-c961244cc0d6683e1352fc8362d42632e3fb8236b8bbc74fcfeb79e8be439992.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_5_wht-5ce5e2c1dda772c7593527818ad7e15c85b5961f4a8c86fdba6b683c89dd73e0.svg b/assets/en/svg/text/scene/rank/number/tx_nb_5_wht-5ce5e2c1dda772c7593527818ad7e15c85b5961f4a8c86fdba6b683c89dd73e0.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_5_wht-5ce5e2c1dda772c7593527818ad7e15c85b5961f4a8c86fdba6b683c89dd73e0.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_5_wht-5ce5e2c1dda772c7593527818ad7e15c85b5961f4a8c86fdba6b683c89dd73e0.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_6_green-01dde34f3fda5fb4a18f96a60d83261c555f7adf2b274d4518bd2b464a171ef8.svg b/assets/en/svg/text/scene/rank/number/tx_nb_6_green-01dde34f3fda5fb4a18f96a60d83261c555f7adf2b274d4518bd2b464a171ef8.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_6_green-01dde34f3fda5fb4a18f96a60d83261c555f7adf2b274d4518bd2b464a171ef8.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_6_green-01dde34f3fda5fb4a18f96a60d83261c555f7adf2b274d4518bd2b464a171ef8.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_6_orange-bbb6348726eb8fde9adcd9eee9191238ffc1a5ef73f306b0c8d095818ac4d3e8.svg b/assets/en/svg/text/scene/rank/number/tx_nb_6_orange-bbb6348726eb8fde9adcd9eee9191238ffc1a5ef73f306b0c8d095818ac4d3e8.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_6_orange-bbb6348726eb8fde9adcd9eee9191238ffc1a5ef73f306b0c8d095818ac4d3e8.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_6_orange-bbb6348726eb8fde9adcd9eee9191238ffc1a5ef73f306b0c8d095818ac4d3e8.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_6_wht-da724a1ad777094325b0c9206f9d5c3ab7ba26772bb62978bc6b7deffd734c9e.svg b/assets/en/svg/text/scene/rank/number/tx_nb_6_wht-da724a1ad777094325b0c9206f9d5c3ab7ba26772bb62978bc6b7deffd734c9e.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_6_wht-da724a1ad777094325b0c9206f9d5c3ab7ba26772bb62978bc6b7deffd734c9e.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_6_wht-da724a1ad777094325b0c9206f9d5c3ab7ba26772bb62978bc6b7deffd734c9e.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_7_green-9135b2919cfb0c37ce7f269edceaf4028e3e9f4a22e49e2e6c80913d73f55605.svg b/assets/en/svg/text/scene/rank/number/tx_nb_7_green-9135b2919cfb0c37ce7f269edceaf4028e3e9f4a22e49e2e6c80913d73f55605.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_7_green-9135b2919cfb0c37ce7f269edceaf4028e3e9f4a22e49e2e6c80913d73f55605.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_7_green-9135b2919cfb0c37ce7f269edceaf4028e3e9f4a22e49e2e6c80913d73f55605.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_7_orange-42f9af312aa30482e705635b85e1232f1e89f055d7460aa0361c642a5ec1ad65.svg b/assets/en/svg/text/scene/rank/number/tx_nb_7_orange-42f9af312aa30482e705635b85e1232f1e89f055d7460aa0361c642a5ec1ad65.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_7_orange-42f9af312aa30482e705635b85e1232f1e89f055d7460aa0361c642a5ec1ad65.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_7_orange-42f9af312aa30482e705635b85e1232f1e89f055d7460aa0361c642a5ec1ad65.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_7_wht-638100e4637784de035fe33f3abf220a9fa3e6111b2e575d419f744bd93478dc.svg b/assets/en/svg/text/scene/rank/number/tx_nb_7_wht-638100e4637784de035fe33f3abf220a9fa3e6111b2e575d419f744bd93478dc.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_7_wht-638100e4637784de035fe33f3abf220a9fa3e6111b2e575d419f744bd93478dc.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_7_wht-638100e4637784de035fe33f3abf220a9fa3e6111b2e575d419f744bd93478dc.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_8_green-641f727121544e3f8b84cc3059f30188e8121a195f4d47ea53bd3acae5ed0397.svg b/assets/en/svg/text/scene/rank/number/tx_nb_8_green-641f727121544e3f8b84cc3059f30188e8121a195f4d47ea53bd3acae5ed0397.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_8_green-641f727121544e3f8b84cc3059f30188e8121a195f4d47ea53bd3acae5ed0397.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_8_green-641f727121544e3f8b84cc3059f30188e8121a195f4d47ea53bd3acae5ed0397.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_8_orange-ffdb8ef663130e9d0dee82ecdeab69c006dbe2dc05ff41352b79b7d21b9f3902.svg b/assets/en/svg/text/scene/rank/number/tx_nb_8_orange-ffdb8ef663130e9d0dee82ecdeab69c006dbe2dc05ff41352b79b7d21b9f3902.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_8_orange-ffdb8ef663130e9d0dee82ecdeab69c006dbe2dc05ff41352b79b7d21b9f3902.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_8_orange-ffdb8ef663130e9d0dee82ecdeab69c006dbe2dc05ff41352b79b7d21b9f3902.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_8_wht-49c1e335c3a7758d6d05fa564ec7c250ec885ef383fc51c07f48ecd142d61599.svg b/assets/en/svg/text/scene/rank/number/tx_nb_8_wht-49c1e335c3a7758d6d05fa564ec7c250ec885ef383fc51c07f48ecd142d61599.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_8_wht-49c1e335c3a7758d6d05fa564ec7c250ec885ef383fc51c07f48ecd142d61599.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_8_wht-49c1e335c3a7758d6d05fa564ec7c250ec885ef383fc51c07f48ecd142d61599.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_9_green-42923a55266d346994722a719a7b76334ba7247b72eea9affa6dc71ba47f648a.svg b/assets/en/svg/text/scene/rank/number/tx_nb_9_green-42923a55266d346994722a719a7b76334ba7247b72eea9affa6dc71ba47f648a.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_9_green-42923a55266d346994722a719a7b76334ba7247b72eea9affa6dc71ba47f648a.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_9_green-42923a55266d346994722a719a7b76334ba7247b72eea9affa6dc71ba47f648a.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_9_orange-b6363055cba47768e05b222390ebf1c9c09af70d3cbd6896dc68c86707311c6e.svg b/assets/en/svg/text/scene/rank/number/tx_nb_9_orange-b6363055cba47768e05b222390ebf1c9c09af70d3cbd6896dc68c86707311c6e.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_9_orange-b6363055cba47768e05b222390ebf1c9c09af70d3cbd6896dc68c86707311c6e.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_9_orange-b6363055cba47768e05b222390ebf1c9c09af70d3cbd6896dc68c86707311c6e.svg.html
diff --git a/assets/en/svg/text/scene/rank/number/tx_nb_9_wht-3b85482f26a5ee5e6f3b07c8821a8878de8ed1ff7b8ae7953d8e35d27b67a7d2.svg b/assets/en/svg/text/scene/rank/number/tx_nb_9_wht-3b85482f26a5ee5e6f3b07c8821a8878de8ed1ff7b8ae7953d8e35d27b67a7d2.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/rank/number/tx_nb_9_wht-3b85482f26a5ee5e6f3b07c8821a8878de8ed1ff7b8ae7953d8e35d27b67a7d2.svg
rename to assets/en/svg/text/scene/rank/number/tx_nb_9_wht-3b85482f26a5ee5e6f3b07c8821a8878de8ed1ff7b8ae7953d8e35d27b67a7d2.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_colon_wht-fdd79be198fb5539b5e91d33170a41e59017a713992be0c5a71b0375b9c5c336.svg b/assets/en/svg/text/scene/todayplan/time/tx_colon_wht-fdd79be198fb5539b5e91d33170a41e59017a713992be0c5a71b0375b9c5c336.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_colon_wht-fdd79be198fb5539b5e91d33170a41e59017a713992be0c5a71b0375b9c5c336.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_colon_wht-fdd79be198fb5539b5e91d33170a41e59017a713992be0c5a71b0375b9c5c336.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_0-26618e03a4425feeac15d4954bece199570c4fb49d1640e6c3e4d328eb5ab962.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_0-26618e03a4425feeac15d4954bece199570c4fb49d1640e6c3e4d328eb5ab962.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_0-26618e03a4425feeac15d4954bece199570c4fb49d1640e6c3e4d328eb5ab962.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_0-26618e03a4425feeac15d4954bece199570c4fb49d1640e6c3e4d328eb5ab962.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_00-5b9b848715bc67da5acd7f4242bbaaaa85af2e2f5031d6773dd7ed72f07eb69a.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_00-5b9b848715bc67da5acd7f4242bbaaaa85af2e2f5031d6773dd7ed72f07eb69a.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_00-5b9b848715bc67da5acd7f4242bbaaaa85af2e2f5031d6773dd7ed72f07eb69a.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_00-5b9b848715bc67da5acd7f4242bbaaaa85af2e2f5031d6773dd7ed72f07eb69a.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_1-fc81f3181b3ce6b9972d9902c264a812ef2dbb034b1867df8fad09c9f48ee60e.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_1-fc81f3181b3ce6b9972d9902c264a812ef2dbb034b1867df8fad09c9f48ee60e.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_1-fc81f3181b3ce6b9972d9902c264a812ef2dbb034b1867df8fad09c9f48ee60e.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_1-fc81f3181b3ce6b9972d9902c264a812ef2dbb034b1867df8fad09c9f48ee60e.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_10-a6a9c6d4fc4cd06629b27a9212f8df81c9a4a21f145678b3391b4323883d1f97.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_10-a6a9c6d4fc4cd06629b27a9212f8df81c9a4a21f145678b3391b4323883d1f97.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_10-a6a9c6d4fc4cd06629b27a9212f8df81c9a4a21f145678b3391b4323883d1f97.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_10-a6a9c6d4fc4cd06629b27a9212f8df81c9a4a21f145678b3391b4323883d1f97.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_11-23a2e9bef7706d907438f972284376c8fcd54ece3eafe3fc36a47ccc41886809.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_11-23a2e9bef7706d907438f972284376c8fcd54ece3eafe3fc36a47ccc41886809.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_11-23a2e9bef7706d907438f972284376c8fcd54ece3eafe3fc36a47ccc41886809.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_11-23a2e9bef7706d907438f972284376c8fcd54ece3eafe3fc36a47ccc41886809.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_12-04cc19d32b5ccffc0eddd1fc27259ef65c86ff47b69ab761f5cf8e8c72ea973d.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_12-04cc19d32b5ccffc0eddd1fc27259ef65c86ff47b69ab761f5cf8e8c72ea973d.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_12-04cc19d32b5ccffc0eddd1fc27259ef65c86ff47b69ab761f5cf8e8c72ea973d.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_12-04cc19d32b5ccffc0eddd1fc27259ef65c86ff47b69ab761f5cf8e8c72ea973d.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_13-f929948b4299c31a61a0907e8fc0432e6b70477eaa5c232d4c5817803c7aeb8a.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_13-f929948b4299c31a61a0907e8fc0432e6b70477eaa5c232d4c5817803c7aeb8a.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_13-f929948b4299c31a61a0907e8fc0432e6b70477eaa5c232d4c5817803c7aeb8a.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_13-f929948b4299c31a61a0907e8fc0432e6b70477eaa5c232d4c5817803c7aeb8a.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_14-53fa8c33d670ec45a771d0c38f4359d24fb7f09f9ec4f116eca0df75094225ad.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_14-53fa8c33d670ec45a771d0c38f4359d24fb7f09f9ec4f116eca0df75094225ad.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_14-53fa8c33d670ec45a771d0c38f4359d24fb7f09f9ec4f116eca0df75094225ad.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_14-53fa8c33d670ec45a771d0c38f4359d24fb7f09f9ec4f116eca0df75094225ad.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_15-67b93341405c616bacde31863c86f7c0c279021490393f09fae391939a21f9bc.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_15-67b93341405c616bacde31863c86f7c0c279021490393f09fae391939a21f9bc.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_15-67b93341405c616bacde31863c86f7c0c279021490393f09fae391939a21f9bc.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_15-67b93341405c616bacde31863c86f7c0c279021490393f09fae391939a21f9bc.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_16-439085a97c72d74a20040a7b199641e8de0fd17f871c1f51f37bc6dd3243d02a.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_16-439085a97c72d74a20040a7b199641e8de0fd17f871c1f51f37bc6dd3243d02a.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_16-439085a97c72d74a20040a7b199641e8de0fd17f871c1f51f37bc6dd3243d02a.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_16-439085a97c72d74a20040a7b199641e8de0fd17f871c1f51f37bc6dd3243d02a.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_17-7ac457f6d64a6185158dc6124d5ca47ab94a75d7e0121e24bfea51b242d80bc5.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_17-7ac457f6d64a6185158dc6124d5ca47ab94a75d7e0121e24bfea51b242d80bc5.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_17-7ac457f6d64a6185158dc6124d5ca47ab94a75d7e0121e24bfea51b242d80bc5.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_17-7ac457f6d64a6185158dc6124d5ca47ab94a75d7e0121e24bfea51b242d80bc5.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_18-94c993f6c75f3709b8ee611c8cdcea9a67ba871aabf82ddd64243ace5db1fb12.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_18-94c993f6c75f3709b8ee611c8cdcea9a67ba871aabf82ddd64243ace5db1fb12.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_18-94c993f6c75f3709b8ee611c8cdcea9a67ba871aabf82ddd64243ace5db1fb12.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_18-94c993f6c75f3709b8ee611c8cdcea9a67ba871aabf82ddd64243ace5db1fb12.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_19-1d78ce2ca8639efdcc1584463e71cad76a0181a838977af2254a8a626776cb09.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_19-1d78ce2ca8639efdcc1584463e71cad76a0181a838977af2254a8a626776cb09.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_19-1d78ce2ca8639efdcc1584463e71cad76a0181a838977af2254a8a626776cb09.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_19-1d78ce2ca8639efdcc1584463e71cad76a0181a838977af2254a8a626776cb09.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_2-786f1be4c202882d69b82363598369d44611c1538d152fd77ffb217db6641d14.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_2-786f1be4c202882d69b82363598369d44611c1538d152fd77ffb217db6641d14.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_2-786f1be4c202882d69b82363598369d44611c1538d152fd77ffb217db6641d14.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_2-786f1be4c202882d69b82363598369d44611c1538d152fd77ffb217db6641d14.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_20-3e15e9fdb381eeb804b8a9f22c4596eb7464428cc69f0e7defa9b30bdd7b5df2.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_20-3e15e9fdb381eeb804b8a9f22c4596eb7464428cc69f0e7defa9b30bdd7b5df2.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_20-3e15e9fdb381eeb804b8a9f22c4596eb7464428cc69f0e7defa9b30bdd7b5df2.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_20-3e15e9fdb381eeb804b8a9f22c4596eb7464428cc69f0e7defa9b30bdd7b5df2.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_21-e5beeb95f218da6b4fcc528d0b5ccd00b133b0f0a44405b684a015e094b2d210.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_21-e5beeb95f218da6b4fcc528d0b5ccd00b133b0f0a44405b684a015e094b2d210.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_21-e5beeb95f218da6b4fcc528d0b5ccd00b133b0f0a44405b684a015e094b2d210.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_21-e5beeb95f218da6b4fcc528d0b5ccd00b133b0f0a44405b684a015e094b2d210.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_22-e1406eee8d2727eaf60b6508b46a355dfccbe8d4e5bdfd9eecba60e9077246cb.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_22-e1406eee8d2727eaf60b6508b46a355dfccbe8d4e5bdfd9eecba60e9077246cb.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_22-e1406eee8d2727eaf60b6508b46a355dfccbe8d4e5bdfd9eecba60e9077246cb.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_22-e1406eee8d2727eaf60b6508b46a355dfccbe8d4e5bdfd9eecba60e9077246cb.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_23-adb3f2c1c4ac7646a964dd6bff186731a2ff97b3d2930b68eec164c9fde00018.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_23-adb3f2c1c4ac7646a964dd6bff186731a2ff97b3d2930b68eec164c9fde00018.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_23-adb3f2c1c4ac7646a964dd6bff186731a2ff97b3d2930b68eec164c9fde00018.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_23-adb3f2c1c4ac7646a964dd6bff186731a2ff97b3d2930b68eec164c9fde00018.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_3-fe268d00448ab9f8a80a8d586f871d35455d391236c87be461e1e4b5c5ec20d8.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_3-fe268d00448ab9f8a80a8d586f871d35455d391236c87be461e1e4b5c5ec20d8.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_3-fe268d00448ab9f8a80a8d586f871d35455d391236c87be461e1e4b5c5ec20d8.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_3-fe268d00448ab9f8a80a8d586f871d35455d391236c87be461e1e4b5c5ec20d8.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_30-189c7bd96c5289eeb671a2b26428c25a709cd6db8fcf75a5719f6ea38afa65d6.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_30-189c7bd96c5289eeb671a2b26428c25a709cd6db8fcf75a5719f6ea38afa65d6.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_30-189c7bd96c5289eeb671a2b26428c25a709cd6db8fcf75a5719f6ea38afa65d6.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_30-189c7bd96c5289eeb671a2b26428c25a709cd6db8fcf75a5719f6ea38afa65d6.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_4-2db47ffa93070f5714ab6768fa21b6c46e51ecb6e5bf400becba933bd0472702.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_4-2db47ffa93070f5714ab6768fa21b6c46e51ecb6e5bf400becba933bd0472702.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_4-2db47ffa93070f5714ab6768fa21b6c46e51ecb6e5bf400becba933bd0472702.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_4-2db47ffa93070f5714ab6768fa21b6c46e51ecb6e5bf400becba933bd0472702.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_45-ac9380eb3c46e9c489fa9b73d4839689f26dc6e1c7409bc155237f4256280320.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_45-ac9380eb3c46e9c489fa9b73d4839689f26dc6e1c7409bc155237f4256280320.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_45-ac9380eb3c46e9c489fa9b73d4839689f26dc6e1c7409bc155237f4256280320.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_45-ac9380eb3c46e9c489fa9b73d4839689f26dc6e1c7409bc155237f4256280320.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_5-b3352c64d3efb9d6e4810e2c22c23b6c5e3c5bcf6a981a8c8a801b969c1bed62.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_5-b3352c64d3efb9d6e4810e2c22c23b6c5e3c5bcf6a981a8c8a801b969c1bed62.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_5-b3352c64d3efb9d6e4810e2c22c23b6c5e3c5bcf6a981a8c8a801b969c1bed62.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_5-b3352c64d3efb9d6e4810e2c22c23b6c5e3c5bcf6a981a8c8a801b969c1bed62.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_6-b7dbd2b9161b70d25440cc5780b1c706327703fdf5bafb95008666f834abef17.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_6-b7dbd2b9161b70d25440cc5780b1c706327703fdf5bafb95008666f834abef17.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_6-b7dbd2b9161b70d25440cc5780b1c706327703fdf5bafb95008666f834abef17.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_6-b7dbd2b9161b70d25440cc5780b1c706327703fdf5bafb95008666f834abef17.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_7-ee8dd45fadc27350b031d94cc5285f28ca156b334c68a64f18a241ab0bcd6f47.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_7-ee8dd45fadc27350b031d94cc5285f28ca156b334c68a64f18a241ab0bcd6f47.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_7-ee8dd45fadc27350b031d94cc5285f28ca156b334c68a64f18a241ab0bcd6f47.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_7-ee8dd45fadc27350b031d94cc5285f28ca156b334c68a64f18a241ab0bcd6f47.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_8-1d02f02a4442948a7d9668111c72cdeb164bbe8cd6abbb4b813f73aff58911e6.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_8-1d02f02a4442948a7d9668111c72cdeb164bbe8cd6abbb4b813f73aff58911e6.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_8-1d02f02a4442948a7d9668111c72cdeb164bbe8cd6abbb4b813f73aff58911e6.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_8-1d02f02a4442948a7d9668111c72cdeb164bbe8cd6abbb4b813f73aff58911e6.svg.html
diff --git a/assets/en/svg/text/scene/todayplan/time/tx_time_9-12fd0183dc953d0243268a43a0f9c32bcd3396ef29b069e23f31911226eb52f4.svg b/assets/en/svg/text/scene/todayplan/time/tx_time_9-12fd0183dc953d0243268a43a0f9c32bcd3396ef29b069e23f31911226eb52f4.svg.html
similarity index 100%
rename from assets/en/svg/text/scene/todayplan/time/tx_time_9-12fd0183dc953d0243268a43a0f9c32bcd3396ef29b069e23f31911226eb52f4.svg
rename to assets/en/svg/text/scene/todayplan/time/tx_time_9-12fd0183dc953d0243268a43a0f9c32bcd3396ef29b069e23f31911226eb52f4.svg.html
diff --git a/assets/en/ui/gearbigbg.png b/assets/en/ui/gearbigbg.png
new file mode 100644
index 0000000..e50caed
Binary files /dev/null and b/assets/en/ui/gearbigbg.png differ
diff --git a/assets/en/ui/gearsmallbg.png b/assets/en/ui/gearsmallbg.png
new file mode 100644
index 0000000..f2324f0
Binary files /dev/null and b/assets/en/ui/gearsmallbg.png differ
diff --git a/assets/fdeaa6294d58.png b/assets/fdeaa6294d58.png
new file mode 100644
index 0000000..c545bdc
Binary files /dev/null and b/assets/fdeaa6294d58.png differ
diff --git a/assets/general.js b/assets/general.js
index c07ec56..03b3072 100644
--- a/assets/general.js
+++ b/assets/general.js
@@ -1,119 +1,166 @@
-(function() {
- const MOVE_DATA = {
- y: [0, 0, 0, 0, 0, 0, 2.898550724637681, 2.898550724637681, 2.898550724637681, 2.898550724637681, 2.898550724637681, 2.898550724637681, 5.797101449275362, 5.797101449275362, 5.797101449275362, 5.797101449275362, 8.695652173913043, 8.695652173913043, 8.695652173913043, 11.594202898550725, 11.594202898550725, 11.594202898550725, 14.492753623188406, 14.492753623188406, 14.492753623188406, 17.391304347826086, 17.391304347826086, 20.28985507246377, 20.28985507246377, 23.18840579710145, 23.18840579710145, 26.08695652173913, 26.08695652173913, 28.985507246376812, 28.985507246376812, 31.884057971014492, 31.884057971014492, 34.78260869565217, 34.78260869565217, 37.68115942028985, 37.68115942028985, 40.57971014492754, 40.57971014492754, 43.47826086956522, 43.47826086956522, 46.3768115942029, 49.27536231884058, 49.27536231884058, 52.17391304347826, 52.17391304347826, 55.072463768115945, 55.072463768115945, 57.971014492753625, 60.869565217391305, 60.869565217391305, 63.768115942028984, 63.768115942028984, 66.66666666666667, 69.56521739130434, 69.56521739130434, 72.46376811594203, 72.46376811594203, 75.3623188405797, 75.3623188405797, 78.26086956521739, 81.15942028985508, 81.15942028985508, 84.05797101449275, 84.05797101449275, 86.95652173913044, 86.95652173913044, 89.85507246376811, 89.85507246376811, 92.7536231884058, 95.65217391304348, 95.65217391304348, 98.55072463768116, 98.55072463768116, 101.44927536231884, 101.44927536231884, 101.44927536231884, 104.34782608695652, 104.34782608695652, 107.2463768115942, 107.2463768115942, 110.14492753623189, 110.14492753623189, 110.14492753623189, 113.04347826086956, 113.04347826086956, 115.94202898550725, 115.94202898550725, 115.94202898550725, 118.84057971014492, 118.84057971014492, 118.84057971014492, 118.84057971014492, 121.73913043478261, 121.73913043478261, 121.73913043478261, 121.73913043478261, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203],
- x: [-3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.619718309859155, -3.619718309859155, -3.591549295774648, -3.563380281690141, -3.535211267605634, -3.47887323943662, -3.4225352112676055, -3.3943661971830985, -3.3098591549295775, -3.2535211267605635, -3.169014084507042, -3.112676056338028, -3.028169014084507, -2.943661971830986, -2.859154929577465, -2.7464788732394365, -2.6619718309859155, -2.549295774647887, -2.436619718309859, -2.352112676056338, -2.23943661971831, -2.098591549295775, -1.9859154929577465, -1.8732394366197183, -1.76056338028169, -1.619718309859155, -1.4788732394366195, -1.3661971830985915, -1.2253521126760565, -1.084507042253521, -.943661971830986, -.8028169014084505, -.6619718309859155, -.52112676056338, -.380281690140845, -.21126760563380298, -.07042253521126751, .07042253521126751, .21126760563380298, .352112676056338, .492957746478873, .6338028169014089, .774647887323944, .915492957746479, 1.028169014084507, 1.169014084507042, 1.309859154929578, 1.450704225352113, 1.563380281690141, 1.704225352112676, 1.816901408450704, 1.929577464788733, 2.070422535211268, 2.183098591549296, 2.295774647887324, 2.408450704225352, 2.52112676056338, 2.605633802816902, 2.71830985915493, 2.802816901408451, 2.887323943661972, 2.971830985915493, 3.056338028169014, 3.140845070422535, 3.225352112676056, 3.281690140845071, 3.338028169014085, 3.394366197183099, 3.450704225352113, 3.507042253521127, 3.535211267605634, 3.563380281690141, 3.591549295774648, 3.619718309859155, 3.647887323943662, 3.647887323943662, 3.647887323943662],
- rotate: [-1.1781609195402298, -1.1781609195402298, -1.1781609195402298, -1.1781609195402298, -1.1781609195402298, -1.1666666666666665, -1.1666666666666665, -1.1551724137931034, -1.14367816091954, -1.14367816091954, -1.132183908045977, -1.1206896551724137, -1.1091954022988506, -1.0977011494252873, -1.0747126436781609, -1.0632183908045976, -1.0402298850574712, -1.028735632183908, -1.0172413793103448, -.9942528735632183, -.9712643678160919, -.9597701149425286, -.9367816091954022, -.9137931034482758, -.8908045977011494, -.867816091954023, -.8448275862068966, -.82183908045977, -.7988505747126436, -.7758620689655171, -.7528735632183907, -.7183908045977011, -.6954022988505747, -.6724137931034482, -.6379310344827586, -.6149425287356322, -.5804597701149425, -.557471264367816, -.5229885057471264, -.5, -.4655172413793103, -.43103448275862066, -.40804597701149425, -.37356321839080453, -.3505747126436781, -.3160919540229885, -.2816091954022988, -.24712643678160917, -.22413793103448276, -.18965517241379304, -.15517241379310343, -.1206896551724137, -.0862068965517242, -.06321839080459757, -.028735632183908066, .005747126436781658, .04022988505747138, .07471264367816088, .09770114942528729, .13218390804597702, .16666666666666674, .20114942528735646, .22413793103448287, .2586206896551724, .2931034482758621, .3275862068965518, .35057471264367823, .38505747126436773, .41954022988505746, .44252873563218387, .4770114942528736, .5, .5344827586206897, .5574712643678161, .5919540229885059, .6149425287356323, .6494252873563218, .6724137931034484, .6954022988505748, .7298850574712643, .7528735632183907, .7758620689655173, .7988505747126438, .8218390804597702, .8448275862068968, .867816091954023, .8908045977011496, .9137931034482758, .9367816091954024, .9482758620689657, .9712643678160919, .9942528735632186, 1.0057471264367814, 1.028735632183908, 1.0402298850574714, 1.0517241379310347, 1.0747126436781609, 1.0862068965517242, 1.0977011494252875, 1.1091954022988504, 1.1206896551724137, 1.132183908045977, 1.1436781609195403, 1.1436781609195403, 1.1551724137931036, 1.1551724137931036, 1.1666666666666665, 1.1666666666666665, 1.1666666666666665, 1.1666666666666665, 1.1781609195402298]
- };
+var MOVE_DATA = {
+ y: [0, 0, 0, 0, 0, 0, 2.898550724637681, 2.898550724637681, 2.898550724637681, 2.898550724637681, 2.898550724637681, 2.898550724637681, 5.797101449275362, 5.797101449275362, 5.797101449275362, 5.797101449275362, 8.695652173913043, 8.695652173913043, 8.695652173913043, 11.594202898550725, 11.594202898550725, 11.594202898550725, 14.492753623188406, 14.492753623188406, 14.492753623188406, 17.391304347826086, 17.391304347826086, 20.28985507246377, 20.28985507246377, 23.18840579710145, 23.18840579710145, 26.08695652173913, 26.08695652173913, 28.985507246376812, 28.985507246376812, 31.884057971014492, 31.884057971014492, 34.78260869565217, 34.78260869565217, 37.68115942028985, 37.68115942028985, 40.57971014492754, 40.57971014492754, 43.47826086956522, 43.47826086956522, 46.3768115942029, 49.27536231884058, 49.27536231884058, 52.17391304347826, 52.17391304347826, 55.072463768115945, 55.072463768115945, 57.971014492753625, 60.869565217391305, 60.869565217391305, 63.768115942028984, 63.768115942028984, 66.66666666666667, 69.56521739130434, 69.56521739130434, 72.46376811594203, 72.46376811594203, 75.3623188405797, 75.3623188405797, 78.26086956521739, 81.15942028985508, 81.15942028985508, 84.05797101449275, 84.05797101449275, 86.95652173913044, 86.95652173913044, 89.85507246376811, 89.85507246376811, 92.7536231884058, 95.65217391304348, 95.65217391304348, 98.55072463768116, 98.55072463768116, 101.44927536231884, 101.44927536231884, 101.44927536231884, 104.34782608695652, 104.34782608695652, 107.2463768115942, 107.2463768115942, 110.14492753623189, 110.14492753623189, 110.14492753623189, 113.04347826086956, 113.04347826086956, 115.94202898550725, 115.94202898550725, 115.94202898550725, 118.84057971014492, 118.84057971014492, 118.84057971014492, 118.84057971014492, 121.73913043478261, 121.73913043478261, 121.73913043478261, 121.73913043478261, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203, 124.6376811594203],
+ x: [-3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.647887323943662, -3.619718309859155, -3.619718309859155, -3.591549295774648, -3.563380281690141, -3.535211267605634, -3.47887323943662, -3.4225352112676055, -3.3943661971830985, -3.3098591549295775, -3.2535211267605635, -3.169014084507042, -3.112676056338028, -3.028169014084507, -2.943661971830986, -2.859154929577465, -2.7464788732394365, -2.6619718309859155, -2.549295774647887, -2.436619718309859, -2.352112676056338, -2.23943661971831, -2.098591549295775, -1.9859154929577465, -1.8732394366197183, -1.76056338028169, -1.619718309859155, -1.4788732394366195, -1.3661971830985915, -1.2253521126760565, -1.084507042253521, -.943661971830986, -.8028169014084505, -.6619718309859155, -.52112676056338, -.380281690140845, -.21126760563380298, -.07042253521126751, .07042253521126751, .21126760563380298, .352112676056338, .492957746478873, .6338028169014089, .774647887323944, .915492957746479, 1.028169014084507, 1.169014084507042, 1.309859154929578, 1.450704225352113, 1.563380281690141, 1.704225352112676, 1.816901408450704, 1.929577464788733, 2.070422535211268, 2.183098591549296, 2.295774647887324, 2.408450704225352, 2.52112676056338, 2.605633802816902, 2.71830985915493, 2.802816901408451, 2.887323943661972, 2.971830985915493, 3.056338028169014, 3.140845070422535, 3.225352112676056, 3.281690140845071, 3.338028169014085, 3.394366197183099, 3.450704225352113, 3.507042253521127, 3.535211267605634, 3.563380281690141, 3.591549295774648, 3.619718309859155, 3.647887323943662, 3.647887323943662, 3.647887323943662],
+ rotate: [-1.1781609195402298, -1.1781609195402298, -1.1781609195402298, -1.1781609195402298, -1.1781609195402298, -1.1666666666666665, -1.1666666666666665, -1.1551724137931034, -1.14367816091954, -1.14367816091954, -1.132183908045977, -1.1206896551724137, -1.1091954022988506, -1.0977011494252873, -1.0747126436781609, -1.0632183908045976, -1.0402298850574712, -1.028735632183908, -1.0172413793103448, -.9942528735632183, -.9712643678160919, -.9597701149425286, -.9367816091954022, -.9137931034482758, -.8908045977011494, -.867816091954023, -.8448275862068966, -.82183908045977, -.7988505747126436, -.7758620689655171, -.7528735632183907, -.7183908045977011, -.6954022988505747, -.6724137931034482, -.6379310344827586, -.6149425287356322, -.5804597701149425, -.557471264367816, -.5229885057471264, -.5, -.4655172413793103, -.43103448275862066, -.40804597701149425, -.37356321839080453, -.3505747126436781, -.3160919540229885, -.2816091954022988, -.24712643678160917, -.22413793103448276, -.18965517241379304, -.15517241379310343, -.1206896551724137, -.0862068965517242, -.06321839080459757, -.028735632183908066, .005747126436781658, .04022988505747138, .07471264367816088, .09770114942528729, .13218390804597702, .16666666666666674, .20114942528735646, .22413793103448287, .2586206896551724, .2931034482758621, .3275862068965518, .35057471264367823, .38505747126436773, .41954022988505746, .44252873563218387, .4770114942528736, .5, .5344827586206897, .5574712643678161, .5919540229885059, .6149425287356323, .6494252873563218, .6724137931034484, .6954022988505748, .7298850574712643, .7528735632183907, .7758620689655173, .7988505747126438, .8218390804597702, .8448275862068968, .867816091954023, .8908045977011496, .9137931034482758, .9367816091954024, .9482758620689657, .9712643678160919, .9942528735632186, 1.0057471264367814, 1.028735632183908, 1.0402298850574714, 1.0517241379310347, 1.0747126436781609, 1.0862068965517242, 1.0977011494252875, 1.1091954022988504, 1.1206896551724137, 1.132183908045977, 1.1436781609195403, 1.1436781609195403, 1.1551724137931036, 1.1551724137931036, 1.1666666666666665, 1.1666666666666665, 1.1666666666666665, 1.1666666666666665, 1.1781609195402298]
+};
- function lerp(array, progress) {
- const n = (array.length - 1) * progress;
- const i = parseInt(n);
- const r = n - i;
- if (i >= array.length - 1) return array[array.length - 1];
- return array[i] * (1 - r) + array[i + 1] * r;
- }
+function lerp(array, progress) {
+ var n = (array.length - 1) * progress;
+ var i = parseInt(n);
+ var r = n - i;
+ if (i >= array.length - 1) return array[array.length - 1];
+ return array[i] * (1 - r) + array[i + 1] * r;
+}
- function animateLoadingCanvas() {
- const canvas = document.getElementById("loading-canvas");
- const loadingOverlay = document.getElementById("loading-overlay");
- if (!canvas || !loadingOverlay) return;
- const ctx = canvas.getContext("2d");
- const image = new Image();
- image.src = "/assets/en/loading/@2x-se6335ab797-cb27d69f23a4d1112bc2a0d272538f39dd3017be20e5f2e3f4a460bd0071b68d.png";
- const frameWidth = 100, frameHeight = 100, totalFrames = 17;
- let currentFrame = 0, lastUpdateTime = 0, animationId;
-
- image.onload = () => {
- function animate(timestamp = 0) {
- if (loadingOverlay.style.display === "none") {
- cancelAnimationFrame(animationId);
- return;
- }
- if (!lastUpdateTime) lastUpdateTime = timestamp;
- if (timestamp - lastUpdateTime > 50) {
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- ctx.drawImage(image, 0, currentFrame * frameHeight, frameWidth, frameHeight, 0, 0, frameWidth, frameHeight);
- currentFrame = (currentFrame + 1) % totalFrames;
- lastUpdateTime = timestamp;
- }
- animationId = requestAnimationFrame(animate);
+window.animateLoadingCanvas = function() {
+ var canvas = document.getElementById("loading-canvas");
+ var loadingOverlay = document.getElementById("loading-overlay");
+ if (!canvas || !loadingOverlay) return;
+ var ctx = canvas.getContext("2d");
+ var image = new Image();
+ image.src = "/assets/en/loading/@2x-se6335ab797-cb27d69f23a4d1112bc2a0d272538f39dd3017be20e5f2e3f4a460bd0071b68d.png";
+ var frameWidth = 100, frameHeight = 100, totalFrames = 17;
+ var currentFrame = 0, lastUpdateTime = 0, animationId;
+
+ image.onload = function() {
+ function animate(timestamp) {
+ if (!timestamp) timestamp = 0;
+ if (loadingOverlay.style.display === "none") {
+ cancelAnimationFrame(animationId);
+ return;
+ }
+ if (!lastUpdateTime) lastUpdateTime = timestamp;
+ if (timestamp - lastUpdateTime > 10) {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.drawImage(image, 0, currentFrame * frameHeight, frameWidth, frameHeight, 0, 0, frameWidth, frameHeight);
+ currentFrame = (currentFrame + 1) % totalFrames;
+ lastUpdateTime = timestamp;
}
animationId = requestAnimationFrame(animate);
+ }
+ animationId = requestAnimationFrame(animate);
+ };
+}
+
+var SQUID_CONFIG = {
+ count: 5,
+ u: 18,
+ frameSize: 64,
+ totalFrames: 8,
+ fps: 30,
+ imageSrc: "/assets/ika-8e075a29ff487983044303f98958fb8c852bc3e9ab07ee7597724b6c0aa4a5d7.png"
+};
+
+window.initSquids = function() {
+ var canvas = document.getElementById("squid-canvas");
+ if (!canvas) return;
+ var ctx = canvas.getContext("2d");
+ var squids = [];
+ var image = new Image();
+ image.src = SQUID_CONFIG.imageSrc;
+
+ var lastTime = 0;
+ var interval = 1000 / SQUID_CONFIG.fps;
+
+ function createSquid() {
+ return {
+ baseX: Math.random() * (canvas.width - SQUID_CONFIG.frameSize),
+ baseY: canvas.height + (Math.random() * 500),
+ x: 0, y: 0,
+ invertX: Math.random() > 0.5,
+ scale: 1 - Math.random() / 3,
+ imageFrame: Math.random() * SQUID_CONFIG.u,
+ speed: 0.5,
+ drift: 0.2 + (Math.random() * 0.3)
};
}
- const SQUID_CONFIG = {
- count: 5,
- u: 18,
- frameSize: 64,
- totalFrames: 8,
- fps: 30,
- imageSrc: "/assets/ika-8e075a29ff487983044303f98958fb8c852bc3e9ab07ee7597724b6c0aa4a5d7.png"
- };
-
- function initSquids() {
- const canvas = document.getElementById("squid-canvas");
- if (!canvas) return;
- const ctx = canvas.getContext("2d");
- const squids = [];
- const image = new Image();
- image.src = SQUID_CONFIG.imageSrc;
-
- let lastTime = 0;
- const interval = 1000 / SQUID_CONFIG.fps;
-
- function createSquid() {
- return {
- baseX: Math.random() * (canvas.width - SQUID_CONFIG.frameSize),
- baseY: canvas.height + (Math.random() * 500),
- x: 0, y: 0,
- invertX: Math.random() > 0.5,
- scale: 1 - Math.random() / 3,
- imageFrame: Math.random() * SQUID_CONFIG.u,
- speed: 0.5,
- drift: 0.2 + (Math.random() * 0.3)
- };
- }
-
- function animate(currentTime) {
- requestAnimationFrame(animate);
- const elapsed = currentTime - lastTime;
- if (elapsed > interval) {
- lastTime = currentTime - (elapsed % interval);
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- for (let i = 0; i < squids.length; i++) {
- let f = squids[i], d = f.imageFrame / SQUID_CONFIG.u;
- f.baseY -= f.drift;
- f.x = f.baseX + lerp(MOVE_DATA.x, d) * (f.invertX ? -1 : 1);
- f.y = f.baseY - lerp(MOVE_DATA.y, d);
- let rotate = lerp(MOVE_DATA.rotate, d);
- f.imageFrame += f.speed;
- if (f.imageFrame >= SQUID_CONFIG.u) {
- f.imageFrame = 0;
- f.baseY -= MOVE_DATA.y[MOVE_DATA.y.length - 1];
- f.baseX += (MOVE_DATA.x[MOVE_DATA.x.length - 1] || 0) * (f.invertX ? -1 : 1);
- f.invertX = !f.invertX;
- }
- ctx.save();
- ctx.translate(f.x + (SQUID_CONFIG.frameSize * f.scale) / 2, f.y + (SQUID_CONFIG.frameSize * f.scale) / 2);
- ctx.rotate(rotate * Math.PI / 180);
- ctx.scale(f.scale, f.scale);
- let spriteIdx = Math.floor(f.imageFrame) % SQUID_CONFIG.totalFrames;
- ctx.drawImage(image, spriteIdx * SQUID_CONFIG.frameSize, 0, SQUID_CONFIG.frameSize, SQUID_CONFIG.frameSize, -SQUID_CONFIG.frameSize/2, -SQUID_CONFIG.frameSize/2, SQUID_CONFIG.frameSize, SQUID_CONFIG.frameSize);
- ctx.restore();
- if (f.y < -150) squids[i] = createSquid();
+ function animate(currentTime) {
+ requestAnimationFrame(animate);
+ var elapsed = currentTime - lastTime;
+ if (elapsed > interval) {
+ lastTime = currentTime - (elapsed % interval);
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ for (var i = 0; i < squids.length; i++) {
+ var f = squids[i], d = f.imageFrame / SQUID_CONFIG.u;
+ f.baseY -= f.drift;
+ f.x = f.baseX + lerp(MOVE_DATA.x, d) * (f.invertX ? -1 : 1);
+ f.y = f.baseY - lerp(MOVE_DATA.y, d);
+ var rotate = lerp(MOVE_DATA.rotate, d);
+ f.imageFrame += f.speed;
+ if (f.imageFrame >= SQUID_CONFIG.u) {
+ f.imageFrame = 0;
+ f.baseY -= MOVE_DATA.y[MOVE_DATA.y.length - 1];
+ f.baseX += (MOVE_DATA.x[MOVE_DATA.x.length - 1] || 0) * (f.invertX ? -1 : 1);
+ f.invertX = !f.invertX;
}
+ ctx.save();
+ ctx.translate(f.x + (SQUID_CONFIG.frameSize * f.scale) / 2, f.y + (SQUID_CONFIG.frameSize * f.scale) / 2);
+ ctx.rotate(rotate * Math.PI / 180);
+ ctx.scale(f.scale, f.scale);
+ var spriteIdx = Math.floor(f.imageFrame) % SQUID_CONFIG.totalFrames;
+ ctx.drawImage(image, spriteIdx * SQUID_CONFIG.frameSize, 0, SQUID_CONFIG.frameSize, SQUID_CONFIG.frameSize, -SQUID_CONFIG.frameSize/2, -SQUID_CONFIG.frameSize/2, SQUID_CONFIG.frameSize, SQUID_CONFIG.frameSize);
+ ctx.restore();
+ if (f.y < -150) squids[i] = createSquid();
}
}
-
- image.onload = () => {
- for (let i = 0; i < SQUID_CONFIG.count; i++) squids.push(createSquid());
- requestAnimationFrame(animate);
- };
}
- document.addEventListener("DOMContentLoaded", () => {
- animateLoadingCanvas();
- initSquids();
+ image.onload = function() {
+ for (var i = 0; i < SQUID_CONFIG.count; i++) squids.push(createSquid());
+ requestAnimationFrame(animate);
+ };
+}
+
+window.initDropdown = function() {
+ var $toggle = $('#dropdownToggle');
+ var $optionsList = $('#dropdownOptions');
+ var $selectedImg = $('#selected-img');
+
+ if ($toggle.length) {
+ $toggle.off('click').on('click', function(e) {
+ e.stopPropagation();
+ $optionsList.toggleClass('show');
+ });
+
+ $optionsList.off('click').on('click', 'li', function() {
+ var newSrc = $(this).attr('data-src');
+ $selectedImg.attr('src', newSrc);
+ $optionsList.removeClass('show');
+ });
+
+ $(document).off('click.dropdown').on('click.dropdown', function() {
+ $optionsList.removeClass('show');
+ });
+ }
+}
+
+window.loadHeaderCallbacks = [];
+window.loadHeader = function(callback) {
+ if (window.headerLoaded) {
+ callback(document.getElementById("header-container"));
+ } else {
+ window.loadHeaderCallbacks.push(callback);
+ }
+};
+
+fetch("../header.html")
+ .then(res => res.text())
+ .then(html => {
+ const container = document.getElementById("header-container");
+ if (container) {
+ container.innerHTML = html;
+ window.headerLoaded = true;
+ window.loadHeaderCallbacks.forEach(cb => cb(container));
+ }
+ })
+ .catch(err => console.error("Header load failed:", err));
+
+$(document).ready(function() {
+ window.animateLoadingCanvas();
+ window.initSquids();
+
+ window.loadHeader(function() {
+ window.initDropdown();
});
-})();
\ No newline at end of file
+});
\ No newline at end of file
diff --git a/assets/headgear/AMB000.png b/assets/headgear/AMB000.png
new file mode 100644
index 0000000..fc01cad
Binary files /dev/null and b/assets/headgear/AMB000.png differ
diff --git a/assets/headgear/AMB001.png b/assets/headgear/AMB001.png
new file mode 100644
index 0000000..1d67fbb
Binary files /dev/null and b/assets/headgear/AMB001.png differ
diff --git a/assets/headgear/AMB002.png b/assets/headgear/AMB002.png
new file mode 100644
index 0000000..e8b7c78
Binary files /dev/null and b/assets/headgear/AMB002.png differ
diff --git a/assets/headgear/CAP000.png b/assets/headgear/CAP000.png
new file mode 100644
index 0000000..60c7420
Binary files /dev/null and b/assets/headgear/CAP000.png differ
diff --git a/assets/headgear/CAP001.png b/assets/headgear/CAP001.png
new file mode 100644
index 0000000..1408b9e
Binary files /dev/null and b/assets/headgear/CAP001.png differ
diff --git a/assets/headgear/CAP002.png b/assets/headgear/CAP002.png
new file mode 100644
index 0000000..4a1850f
Binary files /dev/null and b/assets/headgear/CAP002.png differ
diff --git a/assets/headgear/CAP003.png b/assets/headgear/CAP003.png
new file mode 100644
index 0000000..00076b9
Binary files /dev/null and b/assets/headgear/CAP003.png differ
diff --git a/assets/headgear/CAP004.png b/assets/headgear/CAP004.png
new file mode 100644
index 0000000..c57c35f
Binary files /dev/null and b/assets/headgear/CAP004.png differ
diff --git a/assets/headgear/CAP005.png b/assets/headgear/CAP005.png
new file mode 100644
index 0000000..c35fd76
Binary files /dev/null and b/assets/headgear/CAP005.png differ
diff --git a/assets/headgear/CAP006.png b/assets/headgear/CAP006.png
new file mode 100644
index 0000000..2543057
Binary files /dev/null and b/assets/headgear/CAP006.png differ
diff --git a/assets/headgear/CAP007.png b/assets/headgear/CAP007.png
new file mode 100644
index 0000000..8482e90
Binary files /dev/null and b/assets/headgear/CAP007.png differ
diff --git a/assets/headgear/CAP008.png b/assets/headgear/CAP008.png
new file mode 100644
index 0000000..258d6db
Binary files /dev/null and b/assets/headgear/CAP008.png differ
diff --git a/assets/headgear/CAP009.png b/assets/headgear/CAP009.png
new file mode 100644
index 0000000..dfb7f9b
Binary files /dev/null and b/assets/headgear/CAP009.png differ
diff --git a/assets/headgear/CAP010.png b/assets/headgear/CAP010.png
new file mode 100644
index 0000000..a62bca8
Binary files /dev/null and b/assets/headgear/CAP010.png differ
diff --git a/assets/headgear/CAP011.png b/assets/headgear/CAP011.png
new file mode 100644
index 0000000..3b429f1
Binary files /dev/null and b/assets/headgear/CAP011.png differ
diff --git a/assets/headgear/CAP012.png b/assets/headgear/CAP012.png
new file mode 100644
index 0000000..5d2b0b3
Binary files /dev/null and b/assets/headgear/CAP012.png differ
diff --git a/assets/headgear/CAP013.png b/assets/headgear/CAP013.png
new file mode 100644
index 0000000..b938c5d
Binary files /dev/null and b/assets/headgear/CAP013.png differ
diff --git a/assets/headgear/CAP014.png b/assets/headgear/CAP014.png
new file mode 100644
index 0000000..a9d8651
Binary files /dev/null and b/assets/headgear/CAP014.png differ
diff --git a/assets/headgear/CAP015.png b/assets/headgear/CAP015.png
new file mode 100644
index 0000000..addc697
Binary files /dev/null and b/assets/headgear/CAP015.png differ
diff --git a/assets/headgear/CAP016.png b/assets/headgear/CAP016.png
new file mode 100644
index 0000000..de5c84c
Binary files /dev/null and b/assets/headgear/CAP016.png differ
diff --git a/assets/headgear/EYE006.png b/assets/headgear/EYE006.png
new file mode 100644
index 0000000..0a80b92
Binary files /dev/null and b/assets/headgear/EYE006.png differ
diff --git a/assets/headgear/EYE008.png b/assets/headgear/EYE008.png
new file mode 100644
index 0000000..a5d01f9
Binary files /dev/null and b/assets/headgear/EYE008.png differ
diff --git a/assets/headgear/EYE009.png b/assets/headgear/EYE009.png
new file mode 100644
index 0000000..f82285b
Binary files /dev/null and b/assets/headgear/EYE009.png differ
diff --git a/assets/headgear/EYE010.png b/assets/headgear/EYE010.png
new file mode 100644
index 0000000..b1f573e
Binary files /dev/null and b/assets/headgear/EYE010.png differ
diff --git a/assets/headgear/First.png b/assets/headgear/First.png
new file mode 100644
index 0000000..8929aec
Binary files /dev/null and b/assets/headgear/First.png differ
diff --git a/assets/headgear/HAT000.png b/assets/headgear/HAT000.png
new file mode 100644
index 0000000..d4d8017
Binary files /dev/null and b/assets/headgear/HAT000.png differ
diff --git a/assets/headgear/HAT001.png b/assets/headgear/HAT001.png
new file mode 100644
index 0000000..c74e687
Binary files /dev/null and b/assets/headgear/HAT001.png differ
diff --git a/assets/headgear/HAT002.png b/assets/headgear/HAT002.png
new file mode 100644
index 0000000..4b531ee
Binary files /dev/null and b/assets/headgear/HAT002.png differ
diff --git a/assets/headgear/HAT003.png b/assets/headgear/HAT003.png
new file mode 100644
index 0000000..0220d3f
Binary files /dev/null and b/assets/headgear/HAT003.png differ
diff --git a/assets/headgear/HAT004.png b/assets/headgear/HAT004.png
new file mode 100644
index 0000000..fe3b34c
Binary files /dev/null and b/assets/headgear/HAT004.png differ
diff --git a/assets/headgear/HAT005.png b/assets/headgear/HAT005.png
new file mode 100644
index 0000000..56b9587
Binary files /dev/null and b/assets/headgear/HAT005.png differ
diff --git a/assets/headgear/HAT006.png b/assets/headgear/HAT006.png
new file mode 100644
index 0000000..a7d5340
Binary files /dev/null and b/assets/headgear/HAT006.png differ
diff --git a/assets/headgear/HAT007.png b/assets/headgear/HAT007.png
new file mode 100644
index 0000000..0a9067b
Binary files /dev/null and b/assets/headgear/HAT007.png differ
diff --git a/assets/headgear/HBD001.png b/assets/headgear/HBD001.png
new file mode 100644
index 0000000..bd28482
Binary files /dev/null and b/assets/headgear/HBD001.png differ
diff --git a/assets/headgear/HBD002.png b/assets/headgear/HBD002.png
new file mode 100644
index 0000000..e845ef7
Binary files /dev/null and b/assets/headgear/HBD002.png differ
diff --git a/assets/headgear/HBD003.png b/assets/headgear/HBD003.png
new file mode 100644
index 0000000..dea447c
Binary files /dev/null and b/assets/headgear/HBD003.png differ
diff --git a/assets/headgear/HBD004.png b/assets/headgear/HBD004.png
new file mode 100644
index 0000000..868a8dd
Binary files /dev/null and b/assets/headgear/HBD004.png differ
diff --git a/assets/headgear/HBD005.png b/assets/headgear/HBD005.png
new file mode 100644
index 0000000..eacb6f3
Binary files /dev/null and b/assets/headgear/HBD005.png differ
diff --git a/assets/headgear/HBD006.png b/assets/headgear/HBD006.png
new file mode 100644
index 0000000..df87611
Binary files /dev/null and b/assets/headgear/HBD006.png differ
diff --git a/assets/headgear/HDP000.png b/assets/headgear/HDP000.png
new file mode 100644
index 0000000..c68e219
Binary files /dev/null and b/assets/headgear/HDP000.png differ
diff --git a/assets/headgear/HDP001.png b/assets/headgear/HDP001.png
new file mode 100644
index 0000000..896a51e
Binary files /dev/null and b/assets/headgear/HDP001.png differ
diff --git a/assets/headgear/HDP002.png b/assets/headgear/HDP002.png
new file mode 100644
index 0000000..5bd025b
Binary files /dev/null and b/assets/headgear/HDP002.png differ
diff --git a/assets/headgear/MET000.png b/assets/headgear/MET000.png
new file mode 100644
index 0000000..b962f87
Binary files /dev/null and b/assets/headgear/MET000.png differ
diff --git a/assets/headgear/MET002.png b/assets/headgear/MET002.png
new file mode 100644
index 0000000..1c6d2ef
Binary files /dev/null and b/assets/headgear/MET002.png differ
diff --git a/assets/headgear/MET003.png b/assets/headgear/MET003.png
new file mode 100644
index 0000000..4edabf9
Binary files /dev/null and b/assets/headgear/MET003.png differ
diff --git a/assets/headgear/MET004.png b/assets/headgear/MET004.png
new file mode 100644
index 0000000..9f4cba9
Binary files /dev/null and b/assets/headgear/MET004.png differ
diff --git a/assets/headgear/MET005.png b/assets/headgear/MET005.png
new file mode 100644
index 0000000..4b53048
Binary files /dev/null and b/assets/headgear/MET005.png differ
diff --git a/assets/headgear/MSK000.png b/assets/headgear/MSK000.png
new file mode 100644
index 0000000..58a5ec8
Binary files /dev/null and b/assets/headgear/MSK000.png differ
diff --git a/assets/headgear/MSK001.png b/assets/headgear/MSK001.png
new file mode 100644
index 0000000..d5ff5fc
Binary files /dev/null and b/assets/headgear/MSK001.png differ
diff --git a/assets/headgear/MSK002.png b/assets/headgear/MSK002.png
new file mode 100644
index 0000000..2d0d224
Binary files /dev/null and b/assets/headgear/MSK002.png differ
diff --git a/assets/headgear/MSK003.png b/assets/headgear/MSK003.png
new file mode 100644
index 0000000..308edf6
Binary files /dev/null and b/assets/headgear/MSK003.png differ
diff --git a/assets/headgear/MSN004.png b/assets/headgear/MSN004.png
new file mode 100644
index 0000000..0ca7da4
Binary files /dev/null and b/assets/headgear/MSN004.png differ
diff --git a/assets/headgear/NCP000.png b/assets/headgear/NCP000.png
new file mode 100644
index 0000000..1b2fee4
Binary files /dev/null and b/assets/headgear/NCP000.png differ
diff --git a/assets/headgear/NCP001.png b/assets/headgear/NCP001.png
new file mode 100644
index 0000000..d9b4076
Binary files /dev/null and b/assets/headgear/NCP001.png differ
diff --git a/assets/headgear/NCP002.png b/assets/headgear/NCP002.png
new file mode 100644
index 0000000..88c86bc
Binary files /dev/null and b/assets/headgear/NCP002.png differ
diff --git a/assets/headgear/NCP003.png b/assets/headgear/NCP003.png
new file mode 100644
index 0000000..39d782a
Binary files /dev/null and b/assets/headgear/NCP003.png differ
diff --git a/assets/headgear/NCP004.png b/assets/headgear/NCP004.png
new file mode 100644
index 0000000..4791dab
Binary files /dev/null and b/assets/headgear/NCP004.png differ
diff --git a/assets/headgear/NCP005.png b/assets/headgear/NCP005.png
new file mode 100644
index 0000000..069df0d
Binary files /dev/null and b/assets/headgear/NCP005.png differ
diff --git a/assets/headgear/RVL000.png b/assets/headgear/RVL000.png
new file mode 100644
index 0000000..1bc2630
Binary files /dev/null and b/assets/headgear/RVL000.png differ
diff --git a/assets/headgear/VIS000.png b/assets/headgear/VIS000.png
new file mode 100644
index 0000000..ee6cac3
Binary files /dev/null and b/assets/headgear/VIS000.png differ
diff --git a/assets/headgear/VIS001.png b/assets/headgear/VIS001.png
new file mode 100644
index 0000000..ad9379b
Binary files /dev/null and b/assets/headgear/VIS001.png differ
diff --git a/assets/headgear/VIS002.png b/assets/headgear/VIS002.png
new file mode 100644
index 0000000..dec3369
Binary files /dev/null and b/assets/headgear/VIS002.png differ
diff --git a/assets/jquery-1.9.1.js b/assets/jquery-1.9.1.js
new file mode 100644
index 0000000..e2c203f
--- /dev/null
+++ b/assets/jquery-1.9.1.js
@@ -0,0 +1,9597 @@
+/*!
+ * jQuery JavaScript Library v1.9.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-2-4
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+ // The deferred used on DOM ready
+ readyList,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // Support: IE<9
+ // For `typeof node.method` instead of `node.method !== undefined`
+ core_strundefined = typeof undefined,
+
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+ location = window.location,
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // [[Class]] -> type pairs
+ class2type = {},
+
+ // List of deleted data cache ids, so we can reuse them
+ core_deletedIds = [],
+
+ core_version = "1.9.1",
+
+ // Save a reference to some core methods
+ core_concat = core_deletedIds.concat,
+ core_push = core_deletedIds.push,
+ core_slice = core_deletedIds.slice,
+ core_indexOf = core_deletedIds.indexOf,
+ core_toString = class2type.toString,
+ core_hasOwn = class2type.hasOwnProperty,
+ core_trim = core_version.trim,
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ },
+
+ // Used for matching numbers
+ core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+ // Used for splitting on whitespace
+ core_rnotwhite = /\S+/g,
+
+ // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ },
+
+ // The ready event handler
+ completed = function( event ) {
+
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
+ if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+ detach();
+ jQuery.ready();
+ }
+ },
+ // Clean-up method for dom ready events
+ detach = function() {
+ if ( document.addEventListener ) {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+
+ } else {
+ document.detachEvent( "onreadystatechange", completed );
+ window.detachEvent( "onload", completed );
+ }
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: core_version,
+
+ constructor: jQuery,
+ init: function( selector, context, rootjQuery ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return core_slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+ },
+
+ slice: function() {
+ return this.pushStack( core_slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: core_push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var src, copyIsArray, copy, name, options, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger("ready").off("ready");
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ isWindow: function( obj ) {
+ return obj != null && obj == obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return String( obj );
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ core_toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ try {
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !core_hasOwn.call(obj, "constructor") &&
+ !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+ } catch ( e ) {
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || core_hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ // data: string of html
+ // context (optional): If specified, the fragment will be created in this context, defaults to document
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ parseHTML: function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+ if ( scripts ) {
+ jQuery( scripts ).remove();
+ }
+ return jQuery.merge( [], parsed.childNodes );
+ },
+
+ parseJSON: function( data ) {
+ // Attempt to parse using the native JSON parser first
+ if ( window.JSON && window.JSON.parse ) {
+ return window.JSON.parse( data );
+ }
+
+ if ( data === null ) {
+ return data;
+ }
+
+ if ( typeof data === "string" ) {
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+ .replace( rvalidtokens, "]" )
+ .replace( rvalidbraces, "")) ) {
+
+ return ( new Function( "return " + data ) )();
+ }
+ }
+ }
+
+ jQuery.error( "Invalid JSON: " + data );
+ },
+
+ // Cross-browser xml parsing
+ parseXML: function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ try {
+ if ( window.DOMParser ) { // Standard
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data , "text/xml" );
+ } else { // IE
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
+ xml.async = "false";
+ xml.loadXML( data );
+ }
+ } catch( e ) {
+ xml = undefined;
+ }
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+ },
+
+ noop: function() {},
+
+ // Evaluates a script in a global context
+ // Workarounds based on findings by Jim Driscoll
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+ globalEval: function( data ) {
+ if ( data && jQuery.trim( data ) ) {
+ // We use execScript on Internet Explorer
+ // We use an anonymous function so that context is window
+ // rather than jQuery in Firefox
+ ( window.execScript || function( data ) {
+ window[ "eval" ].call( window, data );
+ } )( data );
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+ function( text ) {
+ return text == null ?
+ "" :
+ core_trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ core_push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ var len;
+
+ if ( arr ) {
+ if ( core_indexOf ) {
+ return core_indexOf.call( arr, elem, i );
+ }
+
+ len = arr.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+ for ( ; i < len; i++ ) {
+ // Skip accessing in sparse arrays
+ if ( i in arr && arr[ i ] === elem ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var l = second.length,
+ i = first.length,
+ j = 0;
+
+ if ( typeof l === "number" ) {
+ for ( ; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var retVal,
+ ret = [],
+ i = 0,
+ length = elems.length;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return core_concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var args, proxy, tmp;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = core_slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Multifunctional method to get and set values of a collection
+ // The value/s can optionally be executed if it's a function
+ access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < length; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ length ? fn( elems[0], key ) : emptyGet;
+ },
+
+ now: function() {
+ return ( new Date() ).getTime();
+ }
+});
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ // Standards-based browsers support DOMContentLoaded
+ } else if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+
+ // If IE event model is used
+ } else {
+ // Ensure firing before onload, maybe late but safe also for iframes
+ document.attachEvent( "onreadystatechange", completed );
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", completed );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var top = false;
+
+ try {
+ top = window.frameElement == null && document.documentElement;
+ } catch(e) {}
+
+ if ( top && top.doScroll ) {
+ (function doScrollCheck() {
+ if ( !jQuery.isReady ) {
+
+ try {
+ // Use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ top.doScroll("left");
+ } catch(e) {
+ return setTimeout( doScrollCheck, 50 );
+ }
+
+ // detach all dom ready events
+ detach();
+
+ // and execute any waiting functions
+ jQuery.ready();
+ }
+ })();
+ }
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || type !== "function" &&
+ ( length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+ // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( list && ( !fired || stack ) ) {
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var action = tuple[ 0 ],
+ fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = core_slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+ if( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+jQuery.support = (function() {
+
+ var support, all, a,
+ input, select, fragment,
+ opt, eventName, isSupported, i,
+ div = document.createElement("div");
+
+ // Setup
+ div.setAttribute( "className", "t" );
+ div.innerHTML = "
a";
+
+ // Support tests won't run in some limited or non-browser environments
+ all = div.getElementsByTagName("*");
+ a = div.getElementsByTagName("a")[ 0 ];
+ if ( !all || !a || !all.length ) {
+ return {};
+ }
+
+ // First batch of tests
+ select = document.createElement("select");
+ opt = select.appendChild( document.createElement("option") );
+ input = div.getElementsByTagName("input")[ 0 ];
+
+ a.style.cssText = "top:1px;float:left;opacity:.5";
+ support = {
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+ getSetAttribute: div.className !== "t",
+
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: div.firstChild.nodeType === 3,
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName("tbody").length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName("link").length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText instead)
+ style: /top/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: a.getAttribute("href") === "/a",
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.5/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+ checkOn: !!input.value,
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: opt.selected,
+
+ // Tests for enctype support on a form (#6743)
+ enctype: !!document.createElement("form").enctype,
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>",
+
+ // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+ boxModel: document.compatMode === "CSS1Compat",
+
+ // Will be defined later
+ deleteExpando: true,
+ noCloneEvent: true,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableMarginRight: true,
+ boxSizingReliable: true,
+ pixelPosition: false
+ };
+
+ // Make sure checked status is properly cloned
+ input.checked = true;
+ support.noCloneChecked = input.cloneNode( true ).checked;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<9
+ try {
+ delete div.test;
+ } catch( e ) {
+ support.deleteExpando = false;
+ }
+
+ // Check if we can trust getAttribute("value")
+ input = document.createElement("input");
+ input.setAttribute( "value", "" );
+ support.input = input.getAttribute( "value" ) === "";
+
+ // Check if an input maintains its value after becoming a radio
+ input.value = "t";
+ input.setAttribute( "type", "radio" );
+ support.radioValue = input.value === "t";
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute( "checked", "t" );
+ input.setAttribute( "name", "t" );
+
+ fragment = document.createDocumentFragment();
+ fragment.appendChild( input );
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ support.appendChecked = input.checked;
+
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<9
+ // Opera does not clone events (and typeof div.attachEvent === undefined).
+ // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+ if ( div.attachEvent ) {
+ div.attachEvent( "onclick", function() {
+ support.noCloneEvent = false;
+ });
+
+ div.cloneNode( true ).click();
+ }
+
+ // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
+ for ( i in { submit: true, change: true, focusin: true }) {
+ div.setAttribute( eventName = "on" + i, "t" );
+
+ support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ // Run tests that need a body at doc ready
+ jQuery(function() {
+ var container, marginDiv, tds,
+ divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+ body = document.getElementsByTagName("body")[0];
+
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ container = document.createElement("div");
+ container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+ body.appendChild( container ).appendChild( div );
+
+ // Support: IE8
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ div.innerHTML = "
t
";
+ tds = div.getElementsByTagName("td");
+ tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+ tds[ 0 ].style.display = "";
+ tds[ 1 ].style.display = "none";
+
+ // Support: IE8
+ // Check if empty table cells still have offsetWidth/Height
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+ // Check box-sizing and margin behavior
+ div.innerHTML = "";
+ div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+ support.boxSizing = ( div.offsetWidth === 4 );
+ support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+ // Use window.getComputedStyle because jsdom on node.js will break without it.
+ if ( window.getComputedStyle ) {
+ support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+ support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ marginDiv = div.appendChild( document.createElement("div") );
+ marginDiv.style.cssText = div.style.cssText = divReset;
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+
+ support.reliableMarginRight =
+ !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+ }
+
+ if ( typeof div.style.zoom !== core_strundefined ) {
+ // Support: IE<8
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ div.innerHTML = "";
+ div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+ // Support: IE6
+ // Check if elements with layout shrink-wrap their children
+ div.style.display = "block";
+ div.innerHTML = "";
+ div.firstChild.style.width = "5px";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+ if ( support.inlineBlockNeedsLayout ) {
+ // Prevent IE 6 from affecting layout for positioned elements #11048
+ // Prevent IE from shrinking the body in IE 7 mode #12869
+ // Support: IE<8
+ body.style.zoom = 1;
+ }
+ }
+
+ body.removeChild( container );
+
+ // Null elements to avoid leaks in IE
+ container = div = tds = marginDiv = null;
+ });
+
+ // Null elements to avoid leaks in IE
+ all = select = fragment = opt = a = input = null;
+
+ return support;
+})();
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, ret,
+ internalKey = jQuery.expando,
+ getByName = typeof name === "string",
+
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
+
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
+
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+ return;
+ }
+
+ if ( !id ) {
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
+ } else {
+ id = internalKey;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+ cache[ id ] = {};
+
+ // Avoids exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ if ( !isNode ) {
+ cache[ id ].toJSON = jQuery.noop;
+ }
+ }
+
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ }
+ }
+
+ thisCache = cache[ id ];
+
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
+ }
+
+ thisCache = thisCache.data;
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( getByName ) {
+
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
+
+ // Test for null|undefined property data
+ if ( ret == null ) {
+
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
+ }
+ } else {
+ ret = thisCache;
+ }
+
+ return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var i, l, thisCache,
+ isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
+
+ if ( name ) {
+
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+ if ( thisCache ) {
+
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
+
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split(" ");
+ }
+ }
+ } else {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ }
+
+ for ( i = 0, l = name.length; i < l; i++ ) {
+ delete thisCache[ name[i] ];
+ }
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject( cache[ id ] ) ) {
+ return;
+ }
+ }
+
+ // Destroy the cache
+ if ( isNode ) {
+ jQuery.cleanData( [ elem ], true );
+
+ // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+ } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+ delete cache[ id ];
+
+ // When all else fails, null
+ } else {
+ cache[ id ] = null;
+ }
+}
+
+jQuery.extend({
+ cache: {},
+
+ // Unique for each copy of jQuery on the page
+ // Non-digits removed to match rinlinejQuery
+ expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+ "applet": true
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return internalData( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ return internalRemoveData( elem, name );
+ },
+
+ // For internal use only.
+ _data: function( elem, name, data ) {
+ return internalData( elem, name, data, true );
+ },
+
+ _removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, true );
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ // Do not set data on non-element because it will not be cleared (#8335).
+ if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+ return false;
+ }
+
+ var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ // nodes accept data unless otherwise specified; rejection can be conditional
+ return !noData || noData !== true && elem.getAttribute("classid") === noData;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var attrs, name,
+ elem = this[0],
+ i = 0,
+ data = null;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = jQuery.data( elem );
+
+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+ attrs = elem.attributes;
+ for ( ; i < attrs.length; i++ ) {
+ name = attrs[i].name;
+
+ if ( !name.indexOf( "data-" ) ) {
+ name = jQuery.camelCase( name.slice(5) );
+
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ jQuery._data( elem, "parsedAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ return jQuery.access( this, function( value ) {
+
+ if ( value === undefined ) {
+ // Try to fetch any internally stored data first
+ return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+ }
+
+ this.each(function() {
+ jQuery.data( this, key, value );
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+ var name;
+ for ( name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+ continue;
+ }
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = jQuery._data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray(data) ) {
+ queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ hooks.cur = fn;
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ jQuery._removeData( elem, type + "queue" );
+ jQuery._removeData( elem, key );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while( i-- ) {
+ tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var nodeHook, boolHook,
+ rclass = /[\t\r\n]/g,
+ rreturn = /\r/g,
+ rfocusable = /^(?:input|select|textarea|button|object)$/i,
+ rclickable = /^(?:a|area)$/i,
+ rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
+ ruseDefault = /^(?:checked|selected)$/i,
+ getSetAttribute = jQuery.support.getSetAttribute,
+ getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ },
+
+ prop: function( name, value ) {
+ return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ name = jQuery.propFix[ name ] || name;
+ return this.each(function() {
+ // try/catch handles cases where IE balks (such as removing a property on window)
+ try {
+ this[ name ] = undefined;
+ delete this[ name ];
+ } catch( e ) {}
+ });
+ },
+
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+ elem.className = jQuery.trim( cur );
+
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = arguments.length === 0 || typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+ elem.className = value ? jQuery.trim( cur ) : "";
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ state = stateVal,
+ classNames = value.match( core_rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ // Toggle whole class name
+ } else if ( type === core_strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery._data( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ var ret, hooks, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val,
+ self = jQuery(this);
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, self.val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map(val, function ( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // oldIE doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var values = jQuery.makeArray( value );
+
+ jQuery(elem).find("option").each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ },
+
+ attr: function( elem, name, value ) {
+ var hooks, notxml, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === core_strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( notxml ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+
+ // In IE9+, Flash objects don't have .getAttribute (#12945)
+ // Support: IE9+
+ if ( typeof elem.getAttribute !== core_strundefined ) {
+ ret = elem.getAttribute( name );
+ }
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( core_rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( rboolean.test( name ) ) {
+ // Set corresponding property to false for boolean attributes
+ // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
+ if ( !getSetAttribute && ruseDefault.test( name ) ) {
+ elem[ jQuery.camelCase( "default-" + name ) ] =
+ elem[ propName ] = false;
+ } else {
+ elem[ propName ] = false;
+ }
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ } else {
+ jQuery.attr( elem, name, "" );
+ }
+
+ elem.removeAttribute( getSetAttribute ? name : propName );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ propFix: {
+ tabindex: "tabIndex",
+ readonly: "readOnly",
+ "for": "htmlFor",
+ "class": "className",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ cellpadding: "cellPadding",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ usemap: "useMap",
+ frameborder: "frameBorder",
+ contenteditable: "contentEditable"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ return ( elem[ name ] = value );
+ }
+
+ } else {
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ return elem[ name ];
+ }
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ var attributeNode = elem.getAttributeNode("tabindex");
+
+ return attributeNode && attributeNode.specified ?
+ parseInt( attributeNode.value, 10 ) :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+ }
+ }
+});
+
+// Hook for boolean attributes
+boolHook = {
+ get: function( elem, name ) {
+ var
+ // Use .prop to determine if this attribute is understood as boolean
+ prop = jQuery.prop( elem, name ),
+
+ // Fetch it accordingly
+ attr = typeof prop === "boolean" && elem.getAttribute( name ),
+ detail = typeof prop === "boolean" ?
+
+ getSetInput && getSetAttribute ?
+ attr != null :
+ // oldIE fabricates an empty string for missing boolean attributes
+ // and conflates checked/selected into attroperties
+ ruseDefault.test( name ) ?
+ elem[ jQuery.camelCase( "default-" + name ) ] :
+ !!attr :
+
+ // fetch an attribute node for properties not recognized as boolean
+ elem.getAttributeNode( name );
+
+ return detail && detail.value !== false ?
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+ // IE<8 needs the *property* name
+ elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+ // Use defaultChecked and defaultSelected for oldIE
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+ }
+
+ return name;
+ }
+};
+
+// fix oldIE value attroperty
+if ( !getSetInput || !getSetAttribute ) {
+ jQuery.attrHooks.value = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return jQuery.nodeName( elem, "input" ) ?
+
+ // Ignore the value *property* by using defaultValue
+ elem.defaultValue :
+
+ ret && ret.specified ? ret.value : undefined;
+ },
+ set: function( elem, value, name ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
+ // Does not return so that setAttribute is also used
+ elem.defaultValue = value;
+ } else {
+ // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+ return nodeHook && nodeHook.set( elem, value, name );
+ }
+ }
+ };
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+ // Use this for any attribute in IE6/7
+ // This fixes almost every IE6/7 issue
+ nodeHook = jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
+ ret.value :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ // Set the existing or create a new attribute node
+ var ret = elem.getAttributeNode( name );
+ if ( !ret ) {
+ elem.setAttributeNode(
+ (ret = elem.ownerDocument.createAttribute( name ))
+ );
+ }
+
+ ret.value = value += "";
+
+ // Break association with cloned elements by also using setAttribute (#9646)
+ return name === "value" || value === elem.getAttribute( name ) ?
+ value :
+ undefined;
+ }
+ };
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ get: nodeHook.get,
+ set: function( elem, value, name ) {
+ nodeHook.set( elem, value === "" ? false : value, name );
+ }
+ };
+
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+ // This is for removals
+ jQuery.each([ "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ set: function( elem, value ) {
+ if ( value === "" ) {
+ elem.setAttribute( name, "auto" );
+ return value;
+ }
+ }
+ });
+ });
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ get: function( elem ) {
+ var ret = elem.getAttribute( name, 2 );
+ return ret == null ? undefined : ret;
+ }
+ });
+ });
+
+ // href/src property should get the full normalized URL (#10299/#12915)
+ jQuery.each([ "href", "src" ], function( i, name ) {
+ jQuery.propHooks[ name ] = {
+ get: function( elem ) {
+ return elem.getAttribute( name, 4 );
+ }
+ };
+ });
+}
+
+if ( !jQuery.support.style ) {
+ jQuery.attrHooks.style = {
+ get: function( elem ) {
+ // Return undefined in the case of empty string
+ // Note: IE uppercases css property names, but if we were to .toLowerCase()
+ // .cssText, that would destroy case senstitivity in URL's, like in "background"
+ return elem.style.cssText || undefined;
+ },
+ set: function( elem, value ) {
+ return ( elem.style.cssText = value + "" );
+ }
+ };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ return null;
+ }
+ });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+ jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+ jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ get: function( elem ) {
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+ };
+ });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ });
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+ var tmp, events, t, handleObjIn,
+ special, eventHandle, handleObj,
+ handlers, type, namespaces, origType,
+ elemData = jQuery._data( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener/attachEvent if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+ var j, handleObj, tmp,
+ origCount, t, events,
+ special, handlers, type,
+ namespaces, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery._removeData( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+ var handle, ontype, cur,
+ bubbleType, special, tmp, i,
+ eventPath = [ elem || document ],
+ type = core_hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ event.isTrigger = true;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+ event.preventDefault();
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ try {
+ elem[ type ]();
+ } catch ( e ) {
+ // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+ // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+ }
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, ret, handleObj, matched, j,
+ handlerQueue = [],
+ args = core_slice.call( arguments ),
+ handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var sel, handleObj, matches, i,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG