summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-12-23 11:13:27 -0500
committerFreya Murphy <freya@freyacat.org>2024-12-23 11:13:27 -0500
commit5a2ba9c2e7605bb788bc406184547d22c6436867 (patch)
treecbd988d534e8a8593a31d70571222443f80da0b3 /src
parentfix about modal (diff)
downloadxssbook2-5a2ba9c2e7605bb788bc406184547d22c6436867.tar.gz
xssbook2-5a2ba9c2e7605bb788bc406184547d22c6436867.tar.bz2
xssbook2-5a2ba9c2e7605bb788bc406184547d22c6436867.zip
v2.1.0, refactor w/ crimson
Diffstat (limited to 'src')
-rw-r--r--src/db/ext.sql7
-rw-r--r--src/db/migrations/0000.sql24
-rw-r--r--src/db/migrations/0001.sql3
-rw-r--r--src/db/rev.sql21
-rw-r--r--src/public/font/Facebook.woff2bin46298 -> 0 bytes
-rw-r--r--src/public/font/Helvetica Neue.woff2bin43230 -> 0 bytes
-rw-r--r--src/public/font/Material Icons.woff2bin389031 -> 0 bytes
-rw-r--r--src/public/font/SF Pro.woff2bin2719451 -> 0 bytes
-rw-r--r--src/public/js/lib.js11
-rw-r--r--src/public/js/post.js6
-rw-r--r--src/public/js/thirdparty/jquery.min.js4
-rw-r--r--src/scss/_mixins.scss3
-rw-r--r--src/scss/_variables.scss19
-rw-r--r--src/scss/common.scss17
-rw-r--r--src/scss/people.scss15
-rw-r--r--src/scss/post.scss11
-rw-r--r--src/scss/settings.scss7
-rwxr-xr-xsrc/shim/shim.php298
-rw-r--r--src/web/_controller/_index.php23
-rw-r--r--src/web/_controller/_meta.php12
-rw-r--r--src/web/_controller/_modal.php28
-rw-r--r--src/web/_controller/_post.php (renamed from src/web/_controller/_util/post.php)113
-rw-r--r--src/web/_controller/_template.php21
-rw-r--r--src/web/_controller/apps/auth.php56
-rw-r--r--src/web/_controller/apps/error.php21
-rw-r--r--src/web/_controller/apps/home.php26
-rw-r--r--src/web/_controller/apps/people.php48
-rw-r--r--src/web/_controller/apps/profile.php44
-rw-r--r--src/web/_controller/apps/settings.php41
-rw-r--r--src/web/_controller/auth.php45
-rw-r--r--src/web/_controller/error.php36
-rw-r--r--src/web/_controller/home.php27
-rw-r--r--src/web/_controller/index.php16
-rw-r--r--src/web/_controller/modal.php38
-rw-r--r--src/web/_controller/people.php45
-rw-r--r--src/web/_controller/profile.php44
-rw-r--r--src/web/_controller/settings.php34
-rw-r--r--src/web/_controller/template.php23
-rw-r--r--src/web/_model/apps/auth.php13
-rw-r--r--src/web/_model/apps/error.php31
-rw-r--r--src/web/_model/apps/home.php22
-rw-r--r--src/web/_model/apps/people.php90
-rw-r--r--src/web/_model/apps/profile.php65
-rw-r--r--src/web/_model/apps/settings.php16
-rw-r--r--src/web/_model/auth.php42
-rw-r--r--src/web/_model/cache.php37
-rw-r--r--src/web/_model/error.php3
-rw-r--r--src/web/_model/format.php36
-rw-r--r--src/web/_model/home.php17
-rw-r--r--src/web/_model/main.php119
-rw-r--r--src/web/_model/people.php72
-rw-r--r--src/web/_model/profile.php70
-rw-r--r--src/web/_model/request.php40
-rw-r--r--src/web/_model/settings.php3
-rw-r--r--src/web/_views/_modal/about.php (renamed from src/web/_views/modal/about.php)0
-rw-r--r--src/web/_views/_modal/new_post.php (renamed from src/web/_views/modal/new_post.php)25
-rw-r--r--src/web/_views/_modal/register.php (renamed from src/web/_views/modal/register.php)2
-rw-r--r--src/web/_views/_template/comment.php (renamed from src/web/_views/template/comment.php)7
-rw-r--r--src/web/_views/_template/error.php (renamed from src/web/_views/template/error.php)0
-rw-r--r--src/web/_views/_template/modal.php (renamed from src/web/_views/template/modal.php)2
-rw-r--r--src/web/_views/_template/post.php (renamed from src/web/_views/template/post.php)13
-rw-r--r--src/web/_views/_template/posts.php (renamed from src/web/_views/template/posts.php)11
-rw-r--r--src/web/_views/_template/toast.php (renamed from src/web/_views/template/toast.php)18
-rw-r--r--src/web/_views/apps/people/people.php7
-rw-r--r--src/web/_views/auth/main.php (renamed from src/web/_views/apps/auth/login.php)6
-rw-r--r--src/web/_views/error/main.php (renamed from src/web/_views/apps/error/main.php)0
-rw-r--r--src/web/_views/head.php15
-rw-r--r--src/web/_views/header.php38
-rw-r--r--src/web/_views/home/main.php (renamed from src/web/_views/apps/home/main.php)8
-rw-r--r--src/web/_views/people/card.php (renamed from src/web/_views/apps/people/card.php)2
-rw-r--r--src/web/_views/people/footer.php (renamed from src/web/_views/apps/people/footer.php)0
-rw-r--r--src/web/_views/people/header.php (renamed from src/web/_views/apps/people/header.php)0
-rw-r--r--src/web/_views/people/main.php (renamed from src/web/_views/apps/people/main.php)12
-rw-r--r--src/web/_views/people/people.php5
-rw-r--r--src/web/_views/profile/main.php (renamed from src/web/_views/apps/profile/main.php)28
-rw-r--r--src/web/_views/settings/main.php (renamed from src/web/_views/apps/settings/main.php)7
-rw-r--r--src/web/config.php56
-rw-r--r--src/web/config/aesthetic.php83
-rw-r--r--src/web/config/routes.php12
-rw-r--r--src/web/core/_controller.php69
-rw-r--r--src/web/core/_model.php44
-rw-r--r--src/web/core/database.php282
-rw-r--r--src/web/core/loader.php101
-rw-r--r--src/web/core/router.php159
-rw-r--r--src/web/helper/error.php9
-rw-r--r--src/web/helper/lang.php81
-rw-r--r--src/web/index.php46
-rw-r--r--src/web/lang/api.php (renamed from src/web/lang/en_US/api_lang.php)2
-rw-r--r--src/web/lang/auth.php (renamed from src/web/lang/en_US/apps/auth.php)4
-rw-r--r--src/web/lang/common.php (renamed from src/web/lang/en_US/common_lang.php)45
-rw-r--r--src/web/lang/en_US/error_lang.php8
-rw-r--r--src/web/lang/home.php (renamed from src/web/lang/en_US/apps/home.php)4
-rw-r--r--src/web/lang/people.php (renamed from src/web/lang/en_US/apps/people.php)4
-rw-r--r--src/web/lang/post.php35
-rw-r--r--src/web/lang/profile.php (renamed from src/web/lang/en_US/apps/profile.php)7
-rw-r--r--src/web/lang/settings.php (renamed from src/web/lang/en_US/apps/settings.php)2
-rw-r--r--src/web/lib/_base.php61
-rw-r--r--src/web/lib/_controller.php49
-rw-r--r--src/web/lib/_model.php61
-rw-r--r--src/web/lib/hooks.php31
-rw-r--r--src/web/lib/image.php (renamed from src/web/helper/image.php)0
-rw-r--r--src/web/lib/utils.php6
-rw-r--r--src/web/stamp.php46
103 files changed, 1091 insertions, 2285 deletions
diff --git a/src/db/ext.sql b/src/db/ext.sql
deleted file mode 100644
index 2f3376f..0000000
--- a/src/db/ext.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-BEGIN TRANSACTION;
-SET search_path = public;
-
-CREATE EXTENSION IF NOT EXISTS pgcrypto;
-CREATE EXTENSION IF NOT EXISTS pgjwt;
-
-COMMIT TRANSACTION;
diff --git a/src/db/migrations/0000.sql b/src/db/migrations/0000.sql
index aa20d2f..e921578 100644
--- a/src/db/migrations/0000.sql
+++ b/src/db/migrations/0000.sql
@@ -3,30 +3,6 @@ SET search_path = public;
-- Migration Start
-CREATE SCHEMA sys;
-
-ALTER SCHEMA sys OWNER TO xssbook;
-
-CREATE DOMAIN sys."*/*" AS BYTEA;
-
-CREATE TABLE sys.database_info (
- name TEXT DEFAULT ''::text NOT NULL,
- jwt_secret TEXT DEFAULT ''::text NOT NULL,
- curr_revision INTEGER DEFAULT 0 NOT NULL
-);
-
-ALTER TABLE sys.database_info
- ADD CONSTRAINT database_info_pkey PRIMARY KEY (name);
-
-ALTER TABLE sys.database_info OWNER TO xssbook;
-
-INSERT INTO sys.database_info
- (name, curr_revision) VALUES (current_database(), 0);
-
-CREATE TYPE sys.JWT AS (
- token TEXT
-);
-
CREATE SCHEMA admin;
ALTER SCHEMA admin OWNER TO xssbook;
diff --git a/src/db/migrations/0001.sql b/src/db/migrations/0001.sql
index d20d895..9f6f312 100644
--- a/src/db/migrations/0001.sql
+++ b/src/db/migrations/0001.sql
@@ -2,9 +2,6 @@ BEGIN TRANSACTION;
SET search_path = public;
-- Migration Start
-CREATE ROLE authenticator LOGIN NOINHERIT NOCREATEDB NOCREATEROLE NOSUPERUSER;
--- scary, make sure the db is not public!!!
-ALTER ROLE authenticator WITH PASSWORD 'postgrest';
CREATE ROLE rest_anon NOLOGIN;
CREATE ROLE rest_user NOLOGIN;
GRANT rest_anon TO authenticator;
diff --git a/src/db/rev.sql b/src/db/rev.sql
deleted file mode 100644
index dff1cfe..0000000
--- a/src/db/rev.sql
+++ /dev/null
@@ -1,21 +0,0 @@
-CREATE OR REPLACE FUNCTION curr_revision()
-RETURNS INTEGER
-LANGUAGE plpgsql VOLATILE
-AS $BODY$
-DECLARE
- _revision INTEGER;
-BEGIN
- BEGIN
- SELECT curr_revision INTO _revision
- FROM sys.database_info
- WHERE name = current_database();
- RETURN _revision;
- EXCEPTION WHEN OTHERS THEN
- RETURN 0;
- END;
-END
-$BODY$;
-
-GRANT EXECUTE ON FUNCTION curr_revision() TO xssbook;
-
-SELECT curr_revision();
diff --git a/src/public/font/Facebook.woff2 b/src/public/font/Facebook.woff2
deleted file mode 100644
index fcfea6c..0000000
--- a/src/public/font/Facebook.woff2
+++ /dev/null
Binary files differ
diff --git a/src/public/font/Helvetica Neue.woff2 b/src/public/font/Helvetica Neue.woff2
deleted file mode 100644
index c02d45d..0000000
--- a/src/public/font/Helvetica Neue.woff2
+++ /dev/null
Binary files differ
diff --git a/src/public/font/Material Icons.woff2 b/src/public/font/Material Icons.woff2
deleted file mode 100644
index 4b3b9d4..0000000
--- a/src/public/font/Material Icons.woff2
+++ /dev/null
Binary files differ
diff --git a/src/public/font/SF Pro.woff2 b/src/public/font/SF Pro.woff2
deleted file mode 100644
index 5f7f7fb..0000000
--- a/src/public/font/SF Pro.woff2
+++ /dev/null
Binary files differ
diff --git a/src/public/js/lib.js b/src/public/js/lib.js
index e19f6c6..e7dba8a 100644
--- a/src/public/js/lib.js
+++ b/src/public/js/lib.js
@@ -45,8 +45,8 @@ var $$ = (selector) => {
});
let config = { childList: true, subtree: true };
- let MutationObserver = window.MutationObserver;
- let observer = new MutationObserver(onMutate);
+ let MutationObserver = window.MutationObserver;
+ let observer = new MutationObserver(onMutate);
observer.observe(document.body, config);
});
@@ -61,6 +61,7 @@ var $$ = (selector) => {
///
var errorToastAjax = (xhr) => {
+ console.log(xhr)
let data = xhr.responseJSON;
let msg, detail, hint;
@@ -81,21 +82,21 @@ var errorToastAjax = (xhr) => {
if (hint) {
query += '&hint=' + hint;
}
- let url = '/template/toast' + query;
+ let url = '/_template/toast' + query;
$.get(url, function (data) {
$('#toast-container').prepend(data);
})
}
var errorToast = (msg) => {
- let url = '/template/toast?msg=' + msg;
+ let url = '/_template/toast?msg=' + msg;
$.get(url, function (data) {
$('#toast-container').prepend(data);
})
}
var successToast = (msg) => {
- let url = '/template/toast?type=success&msg=' + msg;
+ let url = '/_template/toast?type=success&msg=' + msg;
$.get(url, function (data) {
$('#toast-container').prepend(data);
})
diff --git a/src/public/js/post.js b/src/public/js/post.js
index a7b05c6..4ede5b5 100644
--- a/src/public/js/post.js
+++ b/src/public/js/post.js
@@ -14,7 +14,7 @@ $$('.action-load-comments').on('click', function() {
let commmentCount = Number(me.attr('commentCount'));
let commentMax = Number(me.attr('commentMax'));
- let url = '/_util/post/comments?page=' + page + '&id=' + postId + '&max' + commentMax;
+ let url = '/_post/comments?page=' + page + '&id=' + postId + '&max' + commentMax;
$.get(url, function (data) {
if (data === '') {
me.remove();
@@ -47,7 +47,7 @@ $$('#action-load-posts').on('click', function() {
let postMax = Number(me.attr('postMax'));
let filterUid = me.attr('userId');
- let url = '/_util/post/posts?page=' + page + '&max=' + postMax;
+ let url = '/_post/posts?page=' + page + '&max=' + postMax;
if (!isNaN(filterUid)) {
console.log(filterUid);
@@ -89,7 +89,7 @@ $$('.action-new-comment-form').on('submit', function(e) {
const onComment = function(data) {
let id = data[0].id;
$.get({
- url: '/_util/post/comment?id=' + id,
+ url: '/_post/comment?id=' + id,
success: getComment
});
}
diff --git a/src/public/js/thirdparty/jquery.min.js b/src/public/js/thirdparty/jquery.min.js
index 7f37b5d..874a70c 100644
--- a/src/public/js/thirdparty/jquery.min.js
+++ b/src/public/js/thirdparty/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce});
+/*! jQuery v4.0.0-beta.2 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,!0):t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";if(!e.document)throw Error("jQuery requires a window with a document");var n=[],r=Object.getPrototypeOf,i=n.slice,o=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},a=n.push,s=n.indexOf,u={},l=u.toString,c=u.hasOwnProperty,f=c.toString,p=f.call(Object),d={};function h(e){return null==e?e+"":"object"==typeof e?u[l.call(e)]||"object":typeof e}function g(e){return null!=e&&e===e.window}function v(e){var t=!!e&&e.length,n=h(e);return!("function"==typeof e||g(e))&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var y=e.document,m={type:!0,src:!0,nonce:!0,noModule:!0};function x(e,t,n){var r,i=(n=n||y).createElement("script");for(r in i.text=e,m)t&&t[r]&&(i[r]=t[r]);n.head.appendChild(i).parentNode&&i.parentNode.removeChild(i)}var b="4.0.0-beta.2",w=/HTML$/i,T=function(e,t){return new T.fn.init(e,t)};function C(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}T.fn=T.prototype={jquery:b,constructor:T,length:0,toArray:function(){return i.call(this)},get:function(e){return null==e?i.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=T.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return T.each(this,e)},map:function(e){return this.pushStack(T.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(i.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(T.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(T.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()}},T.extend=T.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"!=typeof a&&"function"!=typeof a&&(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(T.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||T.isPlainObject(n)?n:{},i=!1,a[t]=T.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},T.extend({expando:"jQuery"+(b+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!!e&&"[object Object]"===l.call(e)&&(!(t=r(e))||"function"==typeof(n=c.call(t,"constructor")&&t.constructor)&&f.call(n)===p)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){x(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(v(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=T.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(v(Object(e))?T.merge(n,"string"==typeof e?[e]:e):a.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:s.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!w.test(t||n&&n.nodeName||"HTML")},contains:function(e,t){var n=t&&t.parentNode;return e===n||!!(n&&1===n.nodeType&&(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,a=0,s=[];if(v(e))for(r=e.length;a<r;a++)null!=(i=t(e[a],a,n))&&s.push(i);else for(a in e)null!=(i=t(e[a],a,n))&&s.push(i);return o(s)},guid:1,support:d}),"function"==typeof Symbol&&(T.fn[Symbol.iterator]=n[Symbol.iterator]),T.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){u["[object "+t+"]"]=t.toLowerCase()});var j=n.pop,E="[\\x20\\t\\r\\n\\f]",k=y.documentMode;try{y.querySelector(":has(*,:jqfake)"),d.cssHas=!1}catch(e){d.cssHas=!0}var S=[];k&&S.push(":enabled",":disabled","\\["+E+"*name"+E+"*="+E+"*(?:''|\"\")"),d.cssHas||S.push(":has"),S=S.length&&new RegExp(S.join("|"));var D=RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),A="(?:\\\\[\\da-fA-F]{1,6}"+E+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",q=RegExp("^"+E+"*([>+~]|"+E+")"+E+"*"),N=RegExp(E+"|>"),O=/[+~]/,H=y.documentElement,L=H.matches||H.msMatchesSelector;function P(){var e=[];return function t(n,r){return e.push(n+" ")>T.expr.cacheLength&&delete t[e.shift()],t[n+" "]=r}}function R(e){return e&&void 0!==e.getElementsByTagName&&e}var M="\\["+E+"*("+A+")(?:"+E+"*([*^$|!~]?=)"+E+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+A+"))|)"+E+"*\\]",W=":("+A+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",$={ID:RegExp("^#("+A+")"),CLASS:RegExp("^\\.("+A+")"),TAG:RegExp("^("+A+"|[*])"),ATTR:RegExp("^"+M),PSEUDO:RegExp("^"+W),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i")},I=new RegExp(W),F=RegExp("\\\\[\\da-fA-F]{1,6}"+E+"?|\\\\([^\\r\\n\\f])","g"),B=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))};function _(e){return e.replace(F,B)}function U(e){T.error("Syntax error, unrecognized expression: "+e)}var X=RegExp("^"+E+"*,"+E+"*"),z=P();function V(e,t){var n,r,i,o,a,s,u,l=z[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=T.expr.preFilter;while(a){for(o in(!n||(r=X.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=q.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(D," ")}),a=a.slice(n.length)),$)(r=T.expr.match[o].exec(a))&&(!u[o]||(r=u[o](r)))&&(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?U(e):z(e,s).slice(0)}function Y(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function G(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===h(n))for(s in i=!0,n)G(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,"function"!=typeof r&&(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(T(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o}var Q=/[^\x20\t\r\n\f]+/g;T.fn.extend({attr:function(e,t){return G(this,T.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){T.removeAttr(this,e)})}}),T.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o){if(void 0===e.getAttribute)return T.prop(e,t,n);if(1===o&&T.isXMLDoc(e)||(i=T.attrHooks[t.toLowerCase()]),void 0!==n){if(null===n||!1===n&&0!==t.toLowerCase().indexOf("aria-")){T.removeAttr(e,t);return}return i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n),n)}return i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=e.getAttribute(t))?void 0:r}},attrHooks:{},removeAttr:function(e,t){var n,r=0,i=t&&t.match(Q);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),k&&(T.attrHooks.type={set:function(e,t){if("radio"===t&&C(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}});var J=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function K(e,t){return t?"\0"===e?"\uFFFD":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}T.escapeSelector=function(e){return(e+"").replace(J,K)};var Z=n.sort,ee=n.splice;function et(e,t){if(e===t)return en=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)?e==y||e.ownerDocument==y&&T.contains(y,e)?-1:t==y||t.ownerDocument==y&&T.contains(y,t)?1:0:4&n?-1:1)}T.uniqueSort=function(e){var t,n=[],r=0,i=0;if(en=!1,Z.call(e,et),en){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)ee.call(e,n[r],1)}return e},T.fn.uniqueSort=function(){return this.pushStack(T.uniqueSort(i.apply(this)))};var en,er,ei,eo,ea,es,eu=0,el=0,ec=P(),ef=P(),ep=P(),ed=RegExp(E+"+","g"),eh=RegExp("^"+A+"$"),eg=T.extend({needsContext:RegExp("^"+E+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)","i")},$),ev=/^(?:input|select|textarea|button)$/i,ey=/^h\d$/i,em=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ex=function(){eE()},eb=eS(function(e){return!0===e.disabled&&C(e,"fieldset")},{dir:"parentNode",next:"legend"});function ew(e,t,n,r){var i,o,s,u,l,c,f,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&(eE(t),t=t||eo,es)){if(11!==d&&(l=em.exec(e))){if(i=l[1]){if(9===d)return(s=t.getElementById(i))&&a.call(n,s),n;if(p&&(s=p.getElementById(i))&&T.contains(t,s))return a.call(n,s),n}else if(l[2])return a.apply(n,t.getElementsByTagName(e)),n;else if((i=l[3])&&t.getElementsByClassName)return a.apply(n,t.getElementsByClassName(i)),n}if(!ep[e+" "]&&(!S||!S.test(e))){if(f=e,p=t,1===d&&(N.test(e)||q.test(e))){((p=O.test(e)&&R(t.parentNode)||t)!=t||k)&&((u=t.getAttribute("id"))?u=T.escapeSelector(u):t.setAttribute("id",u=T.expando)),o=(c=V(e)).length;while(o--)c[o]=(u?"#"+u:":scope")+" "+Y(c[o]);f=c.join(",")}try{return a.apply(n,p.querySelectorAll(f)),n}catch(t){ep(e,!0)}finally{u===T.expando&&t.removeAttribute("id")}}}return eN(e.replace(D,"$1"),t,n,r)}function eT(e){return e[T.expando]=!0,e}function eC(e){return function(t){if("form"in t)return t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||!e!==t.isDisabled&&eb(t)===e:t.disabled===e;return"label"in t&&t.disabled===e}}function ej(e){return eT(function(t){return t=+t,eT(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function eE(e){var t,n=e?e.ownerDocument||e:y;n!=eo&&9===n.nodeType&&(ea=(eo=n).documentElement,es=!T.isXMLDoc(eo),k&&y!=eo&&(t=eo.defaultView)&&t.top!==t&&t.addEventListener("unload",ex))}for(er in ew.matches=function(e,t){return ew(e,null,null,t)},ew.matchesSelector=function(e,t){if(eE(e),es&&!ep[t+" "]&&(!S||!S.test(t)))try{return L.call(e,t)}catch(e){ep(t,!0)}return ew(t,eo,null,[e]).length>0},T.expr={cacheLength:50,createPseudo:eT,match:eg,find:{ID:function(e,t){if(void 0!==t.getElementById&&es){var n=t.getElementById(e);return n?[n]:[]}},TAG:function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},CLASS:function(e,t){if(void 0!==t.getElementsByClassName&&es)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=_(e[1]),e[3]=_(e[3]||e[4]||e[5]||""),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||U(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&U(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return $.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&I.test(n)&&(t=V(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{ID:function(e){var t=_(e);return function(e){return e.getAttribute("id")===t}},TAG:function(e){var t=_(e).toLowerCase();return"*"===e?function(){return!0}:function(e){return C(e,t)}},CLASS:function(e){var t=ec[e+" "];return t||(t=RegExp("(^|"+E+")"+e+"("+E+"|$)"),ec(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var i=T.attr(r,e);return null==i?"!="===t:!t||((i+="","="===t)?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(ed," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s,m=!1;if(g){if(o){while(h){f=t;while(f=f[h])if(s?C(f,v):1===f.nodeType)return!1;d=h="only"===e&&!d&&"nextSibling"}return!0}if(d=[a?g.firstChild:g.lastChild],a&&y){m=(p=(l=(c=g[T.expando]||(g[T.expando]={}))[e]||[])[0]===eu&&l[1])&&l[2],f=p&&g.childNodes[p];while(f=++p&&f&&f[h]||(m=p=0)||d.pop())if(1===f.nodeType&&++m&&f===t){c[e]=[eu,p,m];break}}else if(y&&(m=p=(l=(c=t[T.expando]||(t[T.expando]={}))[e]||[])[0]===eu&&l[1]),!1===m){while(f=++p&&f&&f[h]||(m=p=0)||d.pop())if((s?C(f,v):1===f.nodeType)&&++m&&(y&&((c=f[T.expando]||(f[T.expando]={}))[e]=[eu,m]),f===t))break}return(m-=i)===r||m%r==0&&m/r>=0}}},PSEUDO:function(e,t){var n=T.expr.pseudos[e]||T.expr.setFilters[e.toLowerCase()]||U("unsupported pseudo: "+e);return n[T.expando]?n(t):n}},pseudos:{not:eT(function(e){var t=[],n=[],r=eq(e.replace(D,"$1"));return r[T.expando]?eT(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:eT(function(e){return function(t){return ew(e,t).length>0}}),contains:eT(function(e){return e=_(e),function(t){return(t.textContent||T.text(t)).indexOf(e)>-1}}),lang:eT(function(e){return eh.test(e||"")||U("unsupported lang: "+e),e=_(e).toLowerCase(),function(t){var n;do if(n=es?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===ea},focus:function(e){return e===eo.activeElement&&eo.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:eC(!1),disabled:eC(!0),checked:function(e){return C(e,"input")&&!!e.checked||C(e,"option")&&!!e.selected},selected:function(e){return k&&e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.expr.pseudos.empty(e)},header:function(e){return ey.test(e.nodeName)},input:function(e){return ev.test(e.nodeName)},button:function(e){return C(e,"input")&&"button"===e.type||C(e,"button")},text:function(e){return C(e,"input")&&"text"===e.type},first:ej(function(){return[0]}),last:ej(function(e,t){return[t-1]}),eq:ej(function(e,t,n){return[n<0?n+t:n]}),even:ej(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ej(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ej(function(e,t,n){var r;for(r=n<0?n+t:n>t?t:n;--r>=0;)e.push(r);return e}),gt:ej(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.expr.pseudos.nth=T.expr.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.expr.pseudos[er]=function(e){return function(t){return C(t,"input")&&t.type===e}}(er);for(er in{submit:!0,reset:!0})T.expr.pseudos[er]=function(e){return function(t){return(C(t,"input")||C(t,"button"))&&t.type===e}}(er);function ek(){}function eS(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=el++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f=[eu,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a){if(c=t[T.expando]||(t[T.expando]={}),i&&C(t,i))t=t[r]||t;else if((l=c[o])&&l[0]===eu&&l[1]===s)return f[2]=l[2];else if(c[o]=f,f[2]=e(t,n,u))return!0}return!1}}function eD(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function eA(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function eq(e,t){var n,r,i,o,u=[],l=[],c=ef[e+" "];if(!c){t||(t=V(e)),o=t.length;while(o--)(c=function e(t){for(var n,r,i,o=t.length,u=T.expr.relative[t[0].type],l=u||T.expr.relative[" "],c=u?1:0,f=eS(function(e){return e===n},l,!0),p=eS(function(e){return s.call(n,e)>-1},l,!0),d=[function(e,t,r){var i=!u&&(r||t!=ei)||((n=t).nodeType?f(e,t,r):p(e,t,r));return n=null,i}];c<o;c++)if(r=T.expr.relative[t[c].type])d=[eS(eD(d),r)];else{if((r=T.expr.filter[t[c].type].apply(null,t[c].matches))[T.expando]){for(i=++c;i<o&&!T.expr.relative[t[i].type];i++);return function e(t,n,r,i,o,u){return i&&!i[T.expando]&&(i=e(i)),o&&!o[T.expando]&&(o=e(o,u)),eT(function(e,u,l,c){var f,p,d,h,g=[],v=[],y=u.length,m=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)ew(e,t[r],n);return n}(n||"*",l.nodeType?[l]:l,[]),x=t&&(e||!n)?eA(m,g,t,l,c):m;if(r?r(x,h=o||(e?t:y||i)?[]:u,l,c):h=x,i){f=eA(h,v),i(f,[],l,c),p=f.length;while(p--)(d=f[p])&&(h[v[p]]=!(x[v[p]]=d))}if(e){if(o||t){if(o){f=[],p=h.length;while(p--)(d=h[p])&&f.push(x[p]=d);o(null,h=[],f,c)}p=h.length;while(p--)(d=h[p])&&(f=o?s.call(e,d):g[p])>-1&&(e[f]=!(u[f]=d))}}else h=eA(h===u?h.splice(y,h.length):h),o?o(null,u,h,c):a.apply(u,h)})}(c>1&&eD(d),c>1&&Y(t.slice(0,c-1).concat({value:" "===t[c-2].type?"*":""})).replace(D,"$1"),r,c<i&&e(t.slice(c,i)),i<o&&e(t=t.slice(i)),i<o&&Y(t))}d.push(r)}return eD(d)}(t[o]))[T.expando]?u.push(c):l.push(c);(c=ef(e,(n=u.length>0,r=l.length>0,i=function(e,t,i,o,s){var c,f,p,d=0,h="0",g=e&&[],v=[],y=ei,m=e||r&&T.expr.find.TAG("*",s),x=eu+=null==y?1:Math.random()||.1;for(s&&(ei=t==eo||t||s);null!=(c=m[h]);h++){if(r&&c){f=0,t||c.ownerDocument==eo||(eE(c),i=!es);while(p=l[f++])if(p(c,t||eo,i)){a.call(o,c);break}s&&(eu=x)}n&&((c=!p&&c)&&d--,e&&g.push(c))}if(d+=h,n&&h!==d){f=0;while(p=u[f++])p(g,v,t,i);if(e){if(d>0)while(h--)g[h]||v[h]||(v[h]=j.call(o));v=eA(v)}a.apply(o,v),s&&!e&&v.length>0&&d+u.length>1&&T.uniqueSort(o)}return s&&(eu=x,ei=y),g},n?eT(i):i))).selector=e}return c}function eN(e,t,n,r){var i,o,s,u,l,c="function"==typeof e&&e,f=!r&&V(e=c.selector||e);if(n=n||[],1===f.length){if((o=f[0]=f[0].slice(0)).length>2&&"ID"===(s=o[0]).type&&9===t.nodeType&&es&&T.expr.relative[o[1].type]){if(!(t=(T.expr.find.ID(_(s.matches[0]),t)||[])[0]))return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=eg.needsContext.test(e)?0:o.length;while(i--){if(s=o[i],T.expr.relative[u=s.type])break;if((l=T.expr.find[u])&&(r=l(_(s.matches[0]),O.test(o[0].type)&&R(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Y(o)))return a.apply(n,r),n;break}}}return(c||eq(e,f))(r,t,!es,n,!t||O.test(e)&&R(t.parentNode)||t),n}function eO(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&T(e).is(n))break;r.push(e)}return r}function eH(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}ek.prototype=T.expr.filters=T.expr.pseudos,T.expr.setFilters=new ek,eE(),T.find=ew,ew.compile=eq,ew.select=eN,ew.setDocument=eE,ew.tokenize=V;var eL=T.expr.match.needsContext,eP=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function eR(e){return"<"===e[0]&&">"===e[e.length-1]&&e.length>=3}function eM(e,t,n){return"function"==typeof t?T.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?T.grep(e,function(e){return e===t!==n}):"string"!=typeof t?T.grep(e,function(e){return s.call(t,e)>-1!==n}):T.filter(t,e,n)}T.filter=function(e,t,n){var r=t[0];return(n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType)?T.find.matchesSelector(r,e)?[r]:[]:T.find.matches(e,T.grep(t,function(e){return 1===e.nodeType}))},T.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(T(e).filter(function(){for(t=0;t<r;t++)if(T.contains(i[t],this))return!0}));for(t=0,n=this.pushStack([]);t<r;t++)T.find(e,i[t],n);return r>1?T.uniqueSort(n):n},filter:function(e){return this.pushStack(eM(this,e||[],!1))},not:function(e){return this.pushStack(eM(this,e||[],!0))},is:function(e){return!!eM(this,"string"==typeof e&&eL.test(e)?T(e):e||[],!1).length}});var eW,e$=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(T.fn.init=function(e,t){var n,r;if(!e)return this;if(e.nodeType)return this[0]=e,this.length=1,this;if("function"==typeof e)return void 0!==eW.ready?eW.ready(e):e(T);if(eR(n=e+""))n=[null,e,null];else{if("string"!=typeof e)return T.makeArray(e,this);n=e$.exec(e)}if(n&&(n[1]||!t)){if(!n[1])return(r=y.getElementById(n[2]))&&(this[0]=r,this.length=1),this;if(t=t instanceof T?t[0]:t,T.merge(this,T.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:y,!0)),eP.test(n[1])&&T.isPlainObject(t))for(n in t)"function"==typeof this[n]?this[n](t[n]):this.attr(n,t[n]);return this}return!t||t.jquery?(t||eW).find(e):this.constructor(t).find(e)}).prototype=T.fn,eW=T(y);var eI=/^(?:parents|prev(?:Until|All))/,eF={children:!0,contents:!0,next:!0,prev:!0};function eB(e,t){while((e=e[t])&&1!==e.nodeType);return e}function e_(e){return e}function eU(e){throw e}function eX(e,t,n,r){var i;try{e&&"function"==typeof(i=e.promise)?i.call(e).done(t).fail(n):e&&"function"==typeof(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n(e)}}T.fn.extend({has:function(e){var t=T(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(T.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&T(e);if(!eL.test(e)){for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&T.find.matchesSelector(n,e))){o.push(n);break}}return this.pushStack(o.length>1?T.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(T(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(T.uniqueSort(T.merge(this.get(),T(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),T.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return eO(e,"parentNode")},parentsUntil:function(e,t,n){return eO(e,"parentNode",n)},next:function(e){return eB(e,"nextSibling")},prev:function(e){return eB(e,"previousSibling")},nextAll:function(e){return eO(e,"nextSibling")},prevAll:function(e){return eO(e,"previousSibling")},nextUntil:function(e,t,n){return eO(e,"nextSibling",n)},prevUntil:function(e,t,n){return eO(e,"previousSibling",n)},siblings:function(e){return eH((e.parentNode||{}).firstChild,e)},children:function(e){return eH(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(C(e,"template")&&(e=e.content||e),T.merge([],e.childNodes))}},function(e,t){T.fn[e]=function(n,r){var i=T.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=T.filter(r,i)),this.length>1&&(eF[e]||T.uniqueSort(i),eI.test(e)&&i.reverse()),this.pushStack(i)}}),T.Callbacks=function(e){e="string"==typeof e?(t=e,n={},T.each(t.match(Q)||[],function(e,t){n[t]=!0}),n):T.extend({},e);var t,n,r,i,o,a,s=[],u=[],l=-1,c=function(){for(a=a||e.once,o=r=!0;u.length;l=-1){i=u.shift();while(++l<s.length)!1===s[l].apply(i[0],i[1])&&e.stopOnFalse&&(l=s.length,i=!1)}e.memory||(i=!1),r=!1,a&&(s=i?[]:"")},f={add:function(){return s&&(i&&!r&&(l=s.length-1,u.push(i)),function t(n){T.each(n,function(n,r){"function"==typeof r?e.unique&&f.has(r)||s.push(r):r&&r.length&&"string"!==h(r)&&t(r)})}(arguments),i&&!r&&c()),this},remove:function(){return T.each(arguments,function(e,t){var n;while((n=T.inArray(t,s,n))>-1)s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?T.inArray(e,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=i="",this},disabled:function(){return!s},lock:function(){return a=u=[],i||r||(s=i=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),r||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},T.extend({Deferred:function(t){var n=[["notify","progress",T.Callbacks("memory"),T.Callbacks("memory"),2],["resolve","done",T.Callbacks("once memory"),T.Callbacks("once memory"),0,"resolved"],["reject","fail",T.Callbacks("once memory"),T.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return T.Deferred(function(t){T.each(n,function(n,r){var i="function"==typeof e[r[4]]&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw TypeError("Thenable self-resolution");"function"==typeof(l=e&&("object"==typeof e||"function"==typeof e)&&e.then)?i?l.call(e,a(o,n,e_,i),a(o,n,eU,i)):(o++,l.call(e,a(o,n,e_,i),a(o,n,eU,i),a(o,n,e_,n.notifyWith))):(r!==e_&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){T.Deferred.exceptionHook&&T.Deferred.exceptionHook(e,c.error),t+1>=o&&(r!==eU&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(T.Deferred.getErrorHook&&(c.error=T.Deferred.getErrorHook()),e.setTimeout(c))}}return T.Deferred(function(e){n[0][3].add(a(0,e,"function"==typeof i?i:e_,e.notifyWith)),n[1][3].add(a(0,e,"function"==typeof t?t:e_)),n[2][3].add(a(0,e,"function"==typeof r?r:eU))}).promise()},promise:function(e){return null!=e?T.extend(e,i):i}},o={};return T.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),o=i.call(arguments),a=T.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?i.call(arguments):n,--t||a.resolveWith(r,o)}};if(t<=1&&(eX(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||"function"==typeof(o[n]&&o[n].then)))return a.then();while(n--)eX(o[n],s(n),a.reject);return a.promise()}});var ez=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;T.Deferred.exceptionHook=function(t,n){t&&ez.test(t.name)&&e.console.warn("jQuery.Deferred exception",t,n)},T.readyException=function(t){e.setTimeout(function(){throw t})};var eV=T.Deferred();function eY(){y.removeEventListener("DOMContentLoaded",eY),e.removeEventListener("load",eY),T.ready()}T.fn.ready=function(e){return eV.then(e).catch(function(e){T.readyException(e)}),this},T.extend({isReady:!1,readyWait:1,ready:function(e){!(!0===e?--T.readyWait:T.isReady)&&(T.isReady=!0,!0!==e&&--T.readyWait>0||eV.resolveWith(y,[T]))}}),T.ready.then=eV.then,"loading"!==y.readyState?e.setTimeout(T.ready):(y.addEventListener("DOMContentLoaded",eY),e.addEventListener("load",eY));var eG=/-([a-z])/g;function eQ(e,t){return t.toUpperCase()}function eJ(e){return e.replace(eG,eQ)}function eK(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType}function eZ(){this.expando=T.expando+eZ.uid++}eZ.uid=1,eZ.prototype={cache:function(e){var t=e[this.expando];return!t&&(t=Object.create(null),eK(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[eJ(t)]=n;else for(r in t)i[eJ(r)]=t[r];return n},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][eJ(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(eJ):(t=eJ(t))in r?[t]:t.match(Q)||[]).length;while(n--)delete r[t[n]]}(void 0===t||T.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!T.isEmptyObject(t)}};var e0=new eZ,e1=new eZ,e2=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,e3=/[A-Z]/g;function e4(e,t,n){var r,i;if(void 0===n&&1===e.nodeType){if(r="data-"+t.replace(e3,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{i=n,n="true"===i||"false"!==i&&("null"===i?null:i===+i+""?+i:e2.test(i)?JSON.parse(i):i)}catch(e){}e1.set(e,t,n)}else n=void 0}return n}T.extend({hasData:function(e){return e1.hasData(e)||e0.hasData(e)},data:function(e,t,n){return e1.access(e,t,n)},removeData:function(e,t){e1.remove(e,t)},_data:function(e,t,n){return e0.access(e,t,n)},_removeData:function(e,t){e0.remove(e,t)}}),T.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=e1.get(o),1===o.nodeType&&!e0.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&e4(o,r=eJ(r.slice(5)),i[r]);e0.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){e1.set(this,e)}):G(this,function(t){var n;if(o&&void 0===t)return void 0!==(n=e1.get(o,e))||void 0!==(n=e4(o,e))?n:void 0;this.each(function(){e1.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){e1.remove(this,e)})}}),T.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=e0.get(e,t),n&&(!r||Array.isArray(n)?r=e0.set(e,t,T.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=T.queue(e,t),r=n.length,i=n.shift(),o=T._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){T.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return e0.get(e,n)||e0.set(e,n,{empty:T.Callbacks("once memory").add(function(){e0.remove(e,[t+"queue",n])})})}}),T.fn.extend({queue:function(e,t){var n=2;return("string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n)?T.queue(this[0],e):void 0===t?this:this.each(function(){var n=T.queue(this,e,t);T._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&T.dequeue(this,e)})},dequeue:function(e){return this.each(function(){T.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=T.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=e0.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var e5=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,e9=RegExp("^(?:([+-])=|)("+e5+")([a-z%]*)$","i"),e6=["Top","Right","Bottom","Left"];function e8(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&"none"===T.css(e,"display")}var e7=/^[a-z]/,te=/^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;function tt(e){return e7.test(e)&&te.test(e[0].toUpperCase()+e.slice(1))}function tn(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return T.css(e,t,"")},u=s(),l=n&&n[3]||(tt(t)?"px":""),c=e.nodeType&&(!tt(t)||"px"!==l&&+u)&&e9.exec(T.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)T.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,T.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var tr=/^-ms-/;function ti(e){return eJ(e.replace(tr,"ms-"))}var to={};function ta(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"!==n||(i[o]=e0.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&e8(r)&&(i[o]=function(e){var t,n=e.ownerDocument,r=e.nodeName,i=to[r];return i||(t=n.body.appendChild(n.createElement(r)),i=T.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),to[r]=i),i}(r))):"none"!==n&&(i[o]="none",e0.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}T.fn.extend({show:function(){return ta(this,!0)},hide:function(){return ta(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){e8(this)?T(this).show():T(this).hide()})}});var ts=function(e){return T.contains(e.ownerDocument,e)||e.getRootNode(tu)===e.ownerDocument},tu={composed:!0};H.getRootNode||(ts=function(e){return T.contains(e.ownerDocument,e)});var tl=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,tc={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr","tbody","table"]};function tf(e,t){var n;return(n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&C(e,t))?T.merge([e],n):n}tc.tbody=tc.tfoot=tc.colgroup=tc.caption=tc.thead,tc.th=tc.td;var tp=/^$|^module$|\/(?:java|ecma)script/i;function td(e,t){for(var n=0,r=e.length;n<r;n++)e0.set(e[n],"globalEval",!t||e0.get(t[n],"globalEval"))}var th=/<|&#?\w+;/;function tg(e,t,r,i,o){for(var a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,g=e.length;d<g;d++)if((a=e[d])||0===a){if("object"===h(a)&&(a.nodeType||v(a)))T.merge(p,a.nodeType?[a]:a);else if(th.test(a)){s=s||f.appendChild(t.createElement("div")),c=(u=tc[(tl.exec(a)||["",""])[1].toLowerCase()]||n).length;while(--c>-1)s=s.appendChild(t.createElement(u[c]));s.innerHTML=T.htmlPrefilter(a),T.merge(p,s.childNodes),(s=f.firstChild).textContent=""}else p.push(t.createTextNode(a))}f.textContent="",d=0;while(a=p[d++]){if(i&&T.inArray(a,i)>-1){o&&o.push(a);continue}if(l=ts(a),s=tf(f.appendChild(a),"script"),l&&td(s),r){c=0;while(a=s[c++])tp.test(a.type||"")&&r.push(a)}}return f}function tv(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ty(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function tm(e,t,n,r){t=o(t);var i,a,s,u,l,c,f=0,p=e.length,d=p-1,h=t[0];if("function"==typeof h)return e.each(function(i){var o=e.eq(i);t[0]=h.call(this,i,o.html()),tm(o,t,n,r)});if(p&&(a=(i=tg(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=a),a||r)){for(u=(s=T.map(tf(i,"script"),tv)).length;f<p;f++)l=i,f!==d&&(l=T.clone(l,!0,!0),u&&T.merge(s,tf(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,T.map(s,ty),f=0;f<u;f++)l=s[f],tp.test(l.type||"")&&!e0.get(l,"globalEval")&&T.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?T._evalUrl&&!l.noModule&&T._evalUrl(l.src,{nonce:l.nonce,crossOrigin:l.crossOrigin},c):x(l.textContent,l,c))}return e}var tx=/^(?:checkbox|radio)$/i,tb=/^([^.]*)(?:\.(.+)|)/;function tw(){return!0}function tT(){return!1}function tC(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)tC(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=tT;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return T().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=T.guid++)),e.each(function(){T.event.add(this,t,i,r,n)})}function tj(e,t,n){if(!n){void 0===e0.get(e,t)&&T.event.add(e,t,tw);return}e0.set(e,t,!1),T.event.add(e,t,{namespace:!1,handler:function(e){var n,r=e0.get(this,t);if(1&e.isTrigger&&this[t]){if(r.length)(T.event.special[t]||{}).delegateType&&e.stopPropagation();else if(r=i.call(arguments),e0.set(this,t,r),this[t](),n=e0.get(this,t),e0.set(this,t,!1),r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(e0.set(this,t,{value:T.event.trigger(r[0],r.slice(1),this)}),e.stopPropagation(),e.isImmediatePropagationStopped=tw)}})}T.event={add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=e0.get(e);if(eK(e)){n.handler&&(n=(o=n).handler,i=o.selector),i&&T.find.matchesSelector(H,i),n.guid||(n.guid=T.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(t){return T.event.triggered!==t.type?T.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(Q)||[""]).length;while(l--){if(d=g=(s=tb.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),!d)continue;f=T.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=T.event.special[d]||{},c=T.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&T.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,(!f.setup||!1===f.setup.call(e,r,h,a))&&e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c)}}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=e0.hasData(e)&&e0.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(Q)||[""]).length;while(l--){if(d=g=(s=tb.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),!d){for(d in u)T.event.remove(e,d+t[l],n,r,!0);continue}f=T.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],(i||g===c.origType)&&(!n||n.guid===c.guid)&&(!s||s.test(c.namespace))&&(!r||r===c.selector||"**"===r&&c.selector)&&(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||T.removeEvent(e,d,v.handle),delete u[d])}T.isEmptyObject(u)&&e0.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=Array(arguments.length),u=T.event.fix(e),l=(e0.get(this,"events")||Object.create(null))[u.type]||[],c=T.event.special[u.type]||{};for(t=1,s[0]=u;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=T.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())(!u.rnamespace||!1===o.namespace||u.rnamespace.test(o.namespace))&&(u.handleObj=o,u.data=o.data,void 0!==(r=((T.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&!("click"===e.type&&e.button>=1)){for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&!("click"===e.type&&!0===l.disabled)){for(n=0,o=[],a={};n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?T(i,this).index(l)>-1:T.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(T.Event.prototype,e,{enumerable:!0,configurable:!0,get:"function"==typeof t?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[T.expando]?e:new T.Event(e)},special:T.extend(Object.create(null),{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return tx.test(t.type)&&t.click&&C(t,"input")&&tj(t,"click",!0),!1},trigger:function(e){var t=this||e;return tx.test(t.type)&&t.click&&C(t,"input")&&tj(t,"click"),!0},_default:function(e){var t=e.target;return tx.test(t.type)&&t.click&&C(t,"input")&&e0.get(t,"click")||C(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}})},T.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},T.Event=function(e,t){if(!(this instanceof T.Event))return new T.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented?tw:tT,this.target=e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&T.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[T.expando]=!0},T.Event.prototype={constructor:T.Event,isDefaultPrevented:tT,isPropagationStopped:tT,isImmediatePropagationStopped:tT,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=tw,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=tw,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=tw,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},T.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},T.event.addProp),T.each({focus:"focusin",blur:"focusout"},function(e,t){function n(e){var t=T.event.fix(e);t.type="focusin"===e.type?"focus":"blur",t.isSimulated=!0,t.target===t.currentTarget&&e0.get(this,"handle")(t)}T.event.special[e]={setup:function(){if(tj(this,e,!0),!k)return!1;this.addEventListener(t,n)},trigger:function(){return tj(this,e),!0},teardown:function(){if(!k)return!1;this.removeEventListener(t,n)},_default:function(t){return e0.get(t.target,e)},delegateType:t}}),T.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){T.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=e.relatedTarget,i=e.handleObj;return r&&(r===this||T.contains(this,r))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),T.fn.extend({on:function(e,t,n,r){return tC(this,e,t,n,r)},one:function(e,t,n,r){return tC(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,T(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(!1===t||"function"==typeof t)&&(n=t,t=void 0),!1===n&&(n=tT),this.each(function(){T.event.remove(this,e,n,t)})}});var tE=/<script|<style|<link/i;function tk(e,t){return C(e,"table")&&C(11!==t.nodeType?t:t.firstChild,"tr")&&T(e).children("tbody")[0]||e}function tS(e,t){var n,r,i,o=e0.get(e,"events");if(1===t.nodeType){if(o)for(n in e0.remove(t,"handle events"),o)for(r=0,i=o[n].length;r<i;r++)T.event.add(t,n,o[n][r]);e1.hasData(e)&&e1.set(t,T.extend({},e1.get(e)))}}function tD(e,t,n){for(var r,i=t?T.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||T.cleanData(tf(r)),r.parentNode&&(n&&ts(r)&&td(tf(r,"script")),r.parentNode.removeChild(r));return e}T.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=ts(e);if(k&&(1===e.nodeType||11===e.nodeType)&&!T.isXMLDoc(e))for(r=0,a=tf(s),i=(o=tf(e)).length;r<i;r++)C(a[r],"textarea")&&(a[r].defaultValue=o[r].defaultValue);if(t){if(n)for(r=0,o=o||tf(e),a=a||tf(s),i=o.length;r<i;r++)tS(o[r],a[r]);else tS(e,s)}return(a=tf(s,"script")).length>0&&td(a,!u&&tf(e,"script")),s},cleanData:function(e){for(var t,n,r,i=T.event.special,o=0;void 0!==(n=e[o]);o++)if(eK(n)){if(t=n[e0.expando]){if(t.events)for(r in t.events)i[r]?T.event.remove(n,r):T.removeEvent(n,r,t.handle);n[e0.expando]=void 0}n[e1.expando]&&(n[e1.expando]=void 0)}}}),T.fn.extend({detach:function(e){return tD(this,e,!0)},remove:function(e){return tD(this,e)},text:function(e){return G(this,function(e){return void 0===e?T.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=e)})},null,e,arguments.length)},append:function(){return tm(this,arguments,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&tk(this,e).appendChild(e)})},prepend:function(){return tm(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=tk(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return tm(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return tm(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(T.cleanData(tf(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return T.clone(this,e,t)})},html:function(e){return G(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tE.test(e)&&!tc[(tl.exec(e)||["",""])[1].toLowerCase()]){e=T.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(T.cleanData(tf(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return tm(this,arguments,function(t){var n=this.parentNode;0>T.inArray(this,e)&&(T.cleanData(tf(this)),n&&n.replaceChild(t,this))},e)}}),T.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){T.fn[e]=function(e){for(var n,r=[],i=T(e),o=i.length-1,s=0;s<=o;s++)n=s===o?this:this.clone(!0),T(i[s])[t](n),a.apply(r,n);return this.pushStack(r)}});var tA=RegExp("^("+e5+")(?!px)[a-z%]+$","i"),tq=/^--/;function tN(t){var n=t.ownerDocument.defaultView;return n||(n=e),n.getComputedStyle(t)}function tO(e,t,n){var r,i=tq.test(t);return(n=n||tN(e))&&(r=n.getPropertyValue(t)||n[t],i&&r&&(r=r.replace(D,"$1")||void 0),""!==r||ts(e)||(r=T.style(e,t))),void 0!==r?r+"":r}var tH=["Webkit","Moz","ms"],tL=y.createElement("div").style,tP={};function tR(e){return tP[e]||(e in tL?e:tP[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=tH.length;while(n--)if((e=tH[n]+t)in tL)return e}(e)||e)}(tX=y.createElement("div")).style&&(d.reliableTrDimensions=function(){var t,n,r;if(null==tU){if(t=y.createElement("table"),n=y.createElement("tr"),t.style.cssText="position:absolute;left:-11111px;border-collapse:separate",n.style.cssText="box-sizing:content-box;border:1px solid",n.style.height="1px",tX.style.height="9px",tX.style.display="block",H.appendChild(t).appendChild(n).appendChild(tX),0===t.offsetWidth){H.removeChild(t);return}tU=Math.round(parseFloat((r=e.getComputedStyle(n)).height))+Math.round(parseFloat(r.borderTopWidth))+Math.round(parseFloat(r.borderBottomWidth))===n.offsetHeight,H.removeChild(t)}return tU});var tM=/^(none|table(?!-c[ea]).+)/,tW={position:"absolute",visibility:"hidden",display:"block"},t$={letterSpacing:"0",fontWeight:"400"};function tI(e,t,n){var r=e9.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function tF(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=T.css(e,n+e6[a],!0,i)),r?("content"===n&&(u-=T.css(e,"padding"+e6[a],!0,i)),"margin"!==n&&(u-=T.css(e,"border"+e6[a]+"Width",!0,i))):(u+=T.css(e,"padding"+e6[a],!0,i),"padding"!==n?u+=T.css(e,"border"+e6[a]+"Width",!0,i):s+=T.css(e,"border"+e6[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function tB(e,t,n){var r=tN(e),i=(k||n)&&"border-box"===T.css(e,"boxSizing",!1,r),o=i,a=tO(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(tA.test(a)){if(!n)return a;a="auto"}return("auto"===a||k&&i||!d.reliableTrDimensions()&&C(e,"tr"))&&e.getClientRects().length&&(i="border-box"===T.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+tF(e,t,n||(i?"border":"content"),o,r,a)+"px"}function t_(e,t,n,r,i){return new t_.prototype.init(e,t,n,r,i)}T.extend({cssHooks:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=ti(t),u=tq.test(t),l=e.style;if(u||(t=tR(s)),a=T.cssHooks[t]||T.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=e9.exec(n))&&i[1]&&(n=tn(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(tt(s)?"px":"")),k&&""===n&&0===t.indexOf("background")&&(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=ti(t);return(tq.test(t)||(t=tR(s)),(a=T.cssHooks[t]||T.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=tO(e,t,r)),"normal"===i&&t in t$&&(i=t$[t]),""===n||n)?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),T.each(["height","width"],function(e,t){T.cssHooks[t]={get:function(e,n,r){if(n)return!tM.test(T.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tB(e,t,r):function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r}(e,tW,function(){return tB(e,t,r)})},set:function(e,n,r){var i,o=tN(e),a=r&&"border-box"===T.css(e,"boxSizing",!1,o),s=r?tF(e,t,r,a,o):0;return s&&(i=e9.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=T.css(e,t)),tI(e,n,s)}}}),T.each({margin:"",padding:"",border:"Width"},function(e,t){T.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+e6[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(T.cssHooks[e+t].set=tI)}),T.fn.extend({css:function(e,t){return G(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=tN(e),i=t.length;a<i;a++)o[t[a]]=T.css(e,t[a],!1,r);return o}return void 0!==n?T.style(e,t,n):T.css(e,t)},e,t,arguments.length>1)}}),T.Tween=t_,t_.prototype={constructor:t_,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||T.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(tt(n)?"px":"")},cur:function(){var e=t_.propHooks[this.prop];return e&&e.get?e.get(this):t_.propHooks._default.get(this)},run:function(e){var t,n=t_.propHooks[this.prop];return this.options.duration?this.pos=t=T.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):t_.propHooks._default.set(this),this}},t_.prototype.init.prototype=t_.prototype,t_.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=T.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){T.fx.step[e.prop]?T.fx.step[e.prop](e):1===e.elem.nodeType&&(T.cssHooks[e.prop]||null!=e.elem.style[tR(e.prop)])?T.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},T.easing={linear:function(e){return e},swing:function(e){return .5-Math.cos(e*Math.PI)/2},_default:"swing"},T.fx=t_.prototype.init,T.fx.step={};var tU,tX,tz,tV,tY=/^(?:toggle|show|hide)$/,tG=/queueHooks$/;function tQ(){return e.setTimeout(function(){tz=void 0}),tz=Date.now()}function tJ(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=e6[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function tK(e,t,n){for(var r,i=(tZ.tweeners[t]||[]).concat(tZ.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function tZ(e,t,n){var r,i,o=0,a=tZ.prefilters.length,s=T.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=tz||tQ(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return(s.notifyWith(e,[l,r,n]),r<1&&a)?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:T.extend({},t),opts:T.extend(!0,{specialEasing:{},easing:T.easing._default},n),originalProperties:t,originalOptions:n,startTime:tz||tQ(),duration:n.duration,tweens:[],createTween:function(t,n){var r=T.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=ti(n)],Array.isArray(o=e[n])&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=T.cssHooks[r])&&("expand"in a))for(n in o=a.expand(o),delete e[r],o)(n in e)||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);o<a;o++)if(r=tZ.prefilters[o].call(l,e,c,l.opts))return"function"==typeof r.stop&&(T._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return T.map(c,tK,l),"function"==typeof l.opts.start&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),T.fx.timer(T.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}T.Animation=T.extend(tZ,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return tn(n.elem,e,e9.exec(t),n),n}]},tweener:function(e,t){"function"==typeof e?(t=e,e=["*"]):e=e.match(Q);for(var n,r=0,i=e.length;r<i;r++)n=e[r],tZ.tweeners[n]=tZ.tweeners[n]||[],tZ.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&e8(e),v=e0.get(e,"fxshow");for(r in n.queue||(null==(a=T._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,T.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],tY.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||T.style(e,r)}if(!(!(u=!T.isEmptyObject(t))&&T.isEmptyObject(d)))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=e0.get(e,"display")),"none"===(c=T.css(e,"display"))&&(l?c=l:(ta([e],!0),l=e.style.display||l,c=T.css(e,"display"),ta([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===T.css(e,"float")&&(u||(p.done(function(){h.display=l}),null!=l||(l="none"===(c=h.display)?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=e0.set(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&ta([e],!0),p.done(function(){for(r in g||ta([e]),e0.remove(e,"fxshow"),d)T.style(e,r,d[r])})),u=tK(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?tZ.prefilters.unshift(e):tZ.prefilters.push(e)}}),T.speed=function(e,t,n){var r=e&&"object"==typeof e?T.extend({},e):{complete:n||t||"function"==typeof e&&e,duration:e,easing:n&&t||t&&"function"!=typeof t&&t};return T.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in T.fx.speeds?r.duration=T.fx.speeds[r.duration]:r.duration=T.fx.speeds._default),(null==r.queue||!0===r.queue)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){"function"==typeof r.old&&r.old.call(this),r.queue&&T.dequeue(this,r.queue)},r},T.fn.extend({fadeTo:function(e,t,n,r){return this.filter(e8).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=T.isEmptyObject(e),o=T.speed(t,n,r),a=function(){var t=tZ(this,T.extend({},e),o);(i||e0.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=T.timers,a=e0.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&tG.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem===this&&(null==e||o[i].queue===e)&&(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&T.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=e0.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=T.timers,a=r?r.length:0;for(n.finish=!0,T.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),T.each(["toggle","show","hide"],function(e,t){var n=T.fn[t];T.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(tJ(t,!0),e,r,i)}}),T.each({slideDown:tJ("show"),slideUp:tJ("hide"),slideToggle:tJ("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){T.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),T.timers=[],T.fx.tick=function(){var e,t=0,n=T.timers;for(tz=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||T.fx.stop(),tz=void 0},T.fx.timer=function(e){T.timers.push(e),T.fx.start()},T.fx.start=function(){tV||(tV=!0,function t(){tV&&(!1===y.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(t):e.setTimeout(t,13),T.fx.tick())}())},T.fx.stop=function(){tV=null},T.fx.speeds={slow:600,fast:200,_default:400},T.fn.delay=function(t,n){return t=T.fx&&T.fx.speeds[t]||t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})};var t0=/^(?:input|select|textarea|button)$/i,t1=/^(?:a|area)$/i;function t2(e){return(e.match(Q)||[]).join(" ")}function t3(e){return e.getAttribute&&e.getAttribute("class")||""}function t4(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(Q)||[]}T.fn.extend({prop:function(e,t){return G(this,T.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[T.propFix[e]||e]})}}),T.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return(1===o&&T.isXMLDoc(e)||(t=T.propFix[t]||t,i=T.propHooks[t]),void 0!==n)?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=e.getAttribute("tabindex");return t?parseInt(t,10):t0.test(e.nodeName)||t1.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),k&&(T.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),T.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){T.propFix[this.toLowerCase()]=this}),T.fn.extend({addClass:function(e){var t,n,r,i,o,a;return"function"==typeof e?this.each(function(t){T(this).addClass(e.call(this,t,t3(this)))}):(t=t4(e)).length?this.each(function(){if(r=t3(this),n=1===this.nodeType&&" "+t2(r)+" "){for(o=0;o<t.length;o++)i=t[o],0>n.indexOf(" "+i+" ")&&(n+=i+" ");r!==(a=t2(n))&&this.setAttribute("class",a)}}):this},removeClass:function(e){var t,n,r,i,o,a;return"function"==typeof e?this.each(function(t){T(this).removeClass(e.call(this,t,t3(this)))}):arguments.length?(t=t4(e)).length?this.each(function(){if(r=t3(this),n=1===this.nodeType&&" "+t2(r)+" "){for(o=0;o<t.length;o++){i=t[o];while(n.indexOf(" "+i+" ")>-1)n=n.replace(" "+i+" "," ")}r!==(a=t2(n))&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(e,t){var n,r,i,o;return"function"==typeof e?this.each(function(n){T(this).toggleClass(e.call(this,n,t3(this),t),t)}):"boolean"==typeof t?t?this.addClass(e):this.removeClass(e):(n=t4(e)).length?this.each(function(){for(i=0,o=T(this);i<n.length;i++)r=n[i],o.hasClass(r)?o.removeClass(r):o.addClass(r)}):this},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+t2(t3(n))+" ").indexOf(t)>-1)return!0;return!1}}),T.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r="function"==typeof e,this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,T(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=T.map(i,function(e){return null==e?"":e+""})),(t=T.valHooks[this.type]||T.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=T.valHooks[i.type]||T.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:null==(n=i.value)?"":n:void 0}}),T.extend({valHooks:{select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if((n=i[r]).selected&&!n.disabled&&(!n.parentNode.disabled||!C(n.parentNode,"optgroup"))){if(t=T(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=T.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=T.inArray(T(r).val(),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k&&(T.valHooks.option={get:function(e){var t=e.getAttribute("value");return null!=t?t:t2(T.text(e))}}),T.each(["radio","checkbox"],function(){T.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=T.inArray(T(e).val(),t)>-1}}});var t5=/^(?:focusinfocus|focusoutblur)$/,t9=function(e){e.stopPropagation()};T.extend(T.event,{trigger:function(t,n,r,i){var o,a,s,u,l,f,p,d,h=[r||y],v=c.call(t,"type")?t.type:t,m=c.call(t,"namespace")?t.namespace.split("."):[];if(a=d=s=r=r||y,!(3===r.nodeType||8===r.nodeType||t5.test(v+T.event.triggered))&&(v.indexOf(".")>-1&&(v=(m=v.split(".")).shift(),m.sort()),l=0>v.indexOf(":")&&"on"+v,(t=t[T.expando]?t:new T.Event(v,"object"==typeof t&&t)).isTrigger=i?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:T.makeArray(n,[t]),p=T.event.special[v]||{},i||!p.trigger||!1!==p.trigger.apply(r,n))){if(!i&&!p.noBubble&&!g(r)){for(u=p.delegateType||v,t5.test(u+v)||(a=a.parentNode);a;a=a.parentNode)h.push(a),s=a;s===(r.ownerDocument||y)&&h.push(s.defaultView||s.parentWindow||e)}o=0;while((a=h[o++])&&!t.isPropagationStopped())d=a,t.type=o>1?u:p.bindType||v,(f=(e0.get(a,"events")||Object.create(null))[t.type]&&e0.get(a,"handle"))&&f.apply(a,n),(f=l&&a[l])&&f.apply&&eK(a)&&(t.result=f.apply(a,n),!1===t.result&&t.preventDefault());return t.type=v,!i&&!t.isDefaultPrevented()&&(!p._default||!1===p._default.apply(h.pop(),n))&&eK(r)&&l&&"function"==typeof r[v]&&!g(r)&&((s=r[l])&&(r[l]=null),T.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,t9),r[v](),t.isPropagationStopped()&&d.removeEventListener(v,t9),T.event.triggered=void 0,s&&(r[l]=s)),t.result}},simulate:function(e,t,n){var r=T.extend(new T.Event,n,{type:e,isSimulated:!0});T.event.trigger(r,null,t)}}),T.fn.extend({trigger:function(e,t){return this.each(function(){T.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return T.event.trigger(e,t,n,!0)}});var t6=e.location,t8={guid:Date.now()},t7=/\?/;T.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{n=new e.DOMParser().parseFromString(t,"text/xml")}catch(e){}return r=n&&n.getElementsByTagName("parsererror")[0],(!n||r)&&T.error("Invalid XML: "+(r?T.map(r.childNodes,function(e){return e.textContent}).join("\n"):t)),n};var ne=/\[\]$/,nt=/\r?\n/g,nn=/^(?:submit|button|image|reset|file)$/i,nr=/^(?:input|select|textarea|keygen)/i;T.param=function(e,t){var n,r=[],i=function(e,t){var n="function"==typeof t?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!T.isPlainObject(e))T.each(e,function(){i(this.name,this.value)});else for(n in e)!function e(t,n,r,i){var o;if(Array.isArray(n))T.each(n,function(n,o){r||ne.test(t)?i(t,o):e(t+"["+("object"==typeof o&&null!=o?n:"")+"]",o,r,i)});else if(r||"object"!==h(n))i(t,n);else for(o in n)e(t+"["+o+"]",n[o],r,i)}(n,e[n],t,i);return r.join("&")},T.fn.extend({serialize:function(){return T.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=T.prop(this,"elements");return e?T.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!T(this).is(":disabled")&&nr.test(this.nodeName)&&!nn.test(e)&&(this.checked||!tx.test(e))}).map(function(e,t){var n=T(this).val();return null==n?null:Array.isArray(n)?T.map(n,function(e){return{name:t.name,value:e.replace(nt,"\r\n")}}):{name:t.name,value:n.replace(nt,"\r\n")}}).get()}});var ni=/%20/g,no=/#.*$/,na=/([?&])_=[^&]*/,ns=/^(.*?):[ \t]*([^\r\n]*)$/mg,nu=/^(?:GET|HEAD)$/,nl=/^\/\//,nc={},nf={},np="*/".concat("*"),nd=y.createElement("a");function nh(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(Q)||[];if("function"==typeof n)while(r=o[i++])"+"===r[0]?(e[r=r.slice(1)||"*"]=e[r]||[]).unshift(n):(e[r]=e[r]||[]).push(n)}}function ng(e,t,n,r){var i={},o=e===nf;function a(s){var u;return i[s]=!0,T.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function nv(e,t){var n,r,i=T.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&T.extend(!0,e,r),e}nd.href=t6.href,T.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:t6.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(t6.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":np,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":T.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?nv(nv(e,T.ajaxSettings),t):nv(T.ajaxSettings,e)},ajaxPrefilter:nh(nc),ajaxTransport:nh(nf),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var r,i,o,a,s,u,l,c,f,p,d=T.ajaxSetup({},n),h=d.context||d,g=d.context&&(h.nodeType||h.jquery)?T(h):T.event,v=T.Deferred(),m=T.Callbacks("once memory"),x=d.statusCode||{},b={},w={},C="canceled",j={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a){a={};while(t=ns.exec(o))a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(e,t){return null==l&&(b[e=w[e.toLowerCase()]=w[e.toLowerCase()]||e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e){if(l)j.always(e[j.status]);else for(t in e)x[t]=[x[t],e[t]]}return this},abort:function(e){var t=e||C;return r&&r.abort(t),E(0,t),this}};if(v.promise(j),d.url=((t||d.url||t6.href)+"").replace(nl,t6.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(Q)||[""],null==d.crossDomain){u=y.createElement("a");try{u.href=d.url,u.href=u.href,d.crossDomain=nd.protocol+"//"+nd.host!=u.protocol+"//"+u.host}catch(e){d.crossDomain=!0}}if(ng(nc,d,n,j),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=T.param(d.data,d.traditional)),l)return j;for(f in(c=T.event&&d.global)&&0==T.active++&&T.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!nu.test(d.type),i=d.url.replace(no,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(ni,"+")):(p=d.url.slice(i.length),d.data&&(d.processData||"string"==typeof d.data)&&(i+=(t7.test(i)?"&":"?")+d.data,delete d.data),!1===d.cache&&(i=i.replace(na,"$1"),p=(t7.test(i)?"&":"?")+"_="+t8.guid+++p),d.url=i+p),d.ifModified&&(T.lastModified[i]&&j.setRequestHeader("If-Modified-Since",T.lastModified[i]),T.etag[i]&&j.setRequestHeader("If-None-Match",T.etag[i])),(d.data&&d.hasContent&&!1!==d.contentType||n.contentType)&&j.setRequestHeader("Content-Type",d.contentType),j.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+np+"; q=0.01":""):d.accepts["*"]),d.headers)j.setRequestHeader(f,d.headers[f]);if(d.beforeSend&&(!1===d.beforeSend.call(h,j,d)||l))return j.abort();if(C="abort",m.add(d.complete),j.done(d.success),j.fail(d.error),r=ng(nf,d,n,j)){if(j.readyState=1,c&&g.trigger("ajaxSend",[j,d]),l)return j;d.async&&d.timeout>0&&(s=e.setTimeout(function(){j.abort("timeout")},d.timeout));try{l=!1,r.send(b,E)}catch(e){if(l)throw e;E(-1,e)}}else E(-1,"No Transport");function E(t,n,a,u){var f,p,y,b,w,C=n;!l&&(l=!0,s&&e.clearTimeout(s),r=void 0,o=u||"",j.readyState=t>0?4:0,f=t>=200&&t<300||304===t,a&&(b=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r){for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(d,j,a)),!f&&T.inArray("script",d.dataTypes)>-1&&0>T.inArray("json",d.dataTypes)&&(d.converters["text script"]=function(){}),b=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift()){if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o])){for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}}if(!0!==a){if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}}}return{state:"success",data:t}}(d,b,j,f),f?(d.ifModified&&((w=j.getResponseHeader("Last-Modified"))&&(T.lastModified[i]=w),(w=j.getResponseHeader("etag"))&&(T.etag[i]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,f=!(y=b.error))):(y=C,(t||!C)&&(C="error",t<0&&(t=0))),j.status=t,j.statusText=(n||C)+"",f?v.resolveWith(h,[p,C,j]):v.rejectWith(h,[j,C,y]),j.statusCode(x),x=void 0,c&&g.trigger(f?"ajaxSuccess":"ajaxError",[j,d,f?p:y]),m.fireWith(h,[j,C]),!c||(g.trigger("ajaxComplete",[j,d]),--T.active||T.event.trigger("ajaxStop")))}return j},getJSON:function(e,t,n){return T.get(e,t,n,"json")},getScript:function(e,t){return T.get(e,void 0,t,"script")}}),T.each(["get","post"],function(e,t){T[t]=function(e,n,r,i){return("function"==typeof n||null===n)&&(i=i||r,r=n,n=void 0),T.ajax(T.extend({url:e,type:t,dataType:i,data:n,success:r},T.isPlainObject(e)&&e))}}),T.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),T._evalUrl=function(e,t,n){return T.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,scriptAttrs:t.crossOrigin?{crossOrigin:t.crossOrigin}:void 0,converters:{"text script":function(){}},dataFilter:function(e){T.globalEval(e,t,n)}})},T.fn.extend({wrapAll:function(e){var t;return this[0]&&("function"==typeof e&&(e=e.call(this[0])),t=T(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return"function"==typeof e?this.each(function(t){T(this).wrapInner(e.call(this,t))}):this.each(function(){var t=T(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t="function"==typeof e;return this.each(function(n){T(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){T(this).replaceWith(this.childNodes)}),this}}),T.expr.pseudos.hidden=function(e){return!T.expr.pseudos.visible(e)},T.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},T.ajaxSettings.xhr=function(){return new e.XMLHttpRequest};var ny={0:200};function nm(e){return e.scriptAttrs||!e.headers&&(e.crossDomain||e.async&&0>T.inArray("json",e.dataTypes))}T.ajaxTransport(function(e){var t;return{send:function(n,r){var i,o=e.xhr();if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)o[i]=e.xhrFields[i];for(i in e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest"),n)o.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(t=o.onload=o.onerror=o.onabort=o.ontimeout=null,"abort"===e?o.abort():"error"===e?r(o.status,o.statusText):r(ny[o.status]||o.status,o.statusText,"text"===(o.responseType||"text")?{text:o.responseText}:{binary:o.response},o.getAllResponseHeaders()))}},o.onload=t(),o.onabort=o.onerror=o.ontimeout=t("error"),t=t("abort");try{o.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),T.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},converters:{"text script":function(e){return T.globalEval(e),e}}}),T.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),nm(e)&&(e.type="GET")}),T.ajaxTransport("script",function(e){if(nm(e)){var t,n;return{send:function(r,i){t=T("<script>").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),y.head.appendChild(t[0])},abort:function(){n&&n()}}}});var nx=[],nb=/(=)\?(?=&|$)|\?\?/;T.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=nx.pop()||T.expando+"_"+t8.guid++;return this[e]=!0,e}}),T.ajaxPrefilter("jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(nb.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&nb.test(t.data)&&"data");return i=t.jsonpCallback="function"==typeof t.jsonpCallback?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(nb,"$1"+i):!1!==t.jsonp&&(t.url+=(t7.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||T.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?T(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,nx.push(i)),a&&"function"==typeof o&&o(a[0]),a=o=void 0}),"script"}),T.ajaxPrefilter(function(t,n){"string"==typeof t.data||T.isPlainObject(t.data)||Array.isArray(t.data)||"processData"in n||(t.processData=!1),t.data instanceof e.FormData&&(t.contentType=!1)}),T.parseHTML=function(e,t,n){var r,i,o;return"string"==typeof e||eR(e+"")?("boolean"==typeof t&&(n=t,t=!1),t||((r=(t=y.implementation.createHTMLDocument("")).createElement("base")).href=y.location.href,t.head.appendChild(r)),i=eP.exec(e),o=!n&&[],i)?[t.createElement(i[1])]:(i=tg([e],t,o),o&&o.length&&T(o).remove(),T.merge([],i.childNodes)):[]},T.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=t2(e.slice(s)),e=e.slice(0,s)),"function"==typeof t?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&T.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?T("<div>").append(T.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},T.expr.pseudos.animated=function(e){return T.grep(T.timers,function(t){return e===t.elem}).length},T.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=T.css(e,"position"),c=T(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=T.css(e,"top"),u=T.css(e,"left"),("absolute"===l||"fixed"===l)&&(o+u).indexOf("auto")>-1?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),"function"==typeof t&&(t=t.call(e,n,T.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},T.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){T.offset.setOffset(this,e,t)});var t,n,r=this[0];return r?r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===T.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&e!==n.documentElement&&"static"===T.css(e,"position"))e=e.offsetParent||n.documentElement;e&&e!==r&&1===e.nodeType&&"static"!==T.css(e,"position")&&(i=T(e).offset(),i.top+=T.css(e,"borderTopWidth",!0),i.left+=T.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-T.css(r,"marginTop",!0),left:t.left-i.left-T.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===T.css(e,"position"))e=e.offsetParent;return e||H})}}),T.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;T.fn[e]=function(r){return G(this,function(e,r,i){var o;if(g(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),T.each({Height:"height",Width:"width"},function(e,t){T.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){T.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return G(this,function(t,n,i){var o;return g(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?T.css(t,n,s):T.style(t,n,i,s)},t,a?i:void 0,a)}})}),T.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){T.fn[t]=function(e){return this.on(t,e)}}),T.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1==arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),T.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){T.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),T.proxy=function(e,t){var n,r,o;if("string"==typeof t&&(n=e[t],t=e,e=n),"function"==typeof e)return r=i.call(arguments,2),(o=function(){return e.apply(t||this,r.concat(i.call(arguments)))}).guid=e.guid=e.guid||T.guid++,o},T.holdReady=function(e){e?T.readyWait++:T.ready(!0)},"function"==typeof define&&define.amd&&define("jquery",[],function(){return T});var nw=e.jQuery,nT=e.$;return T.noConflict=function(t){return e.$===T&&(e.$=nT),t&&e.jQuery===T&&(e.jQuery=nw),T},void 0===t&&(e.jQuery=e.$=T),T}); \ No newline at end of file
diff --git a/src/scss/_mixins.scss b/src/scss/_mixins.scss
index bcb795d..9707093 100644
--- a/src/scss/_mixins.scss
+++ b/src/scss/_mixins.scss
@@ -1,7 +1,8 @@
@mixin font-face($name) {
@font-face {
font-family: $name;
- src: url("../font/" + $name + ".woff2") format("woff2"),
+ src:
+ //url("../font/" + $name + ".woff2") format("woff2"),
url("../font/" + $name + ".woff") format("woff"),
url("../font/" + $name + ".ttf") format("truetype"),
url("../font/" + $name + ".otf") format("opentype");
diff --git a/src/scss/_variables.scss b/src/scss/_variables.scss
index e3230cd..1a48cdd 100644
--- a/src/scss/_variables.scss
+++ b/src/scss/_variables.scss
@@ -1,5 +1,5 @@
-$varient: "dark";
+$variant: "dark";
$white: #e4e6eb;
$white-alt: #b0b3b8;
@@ -13,6 +13,7 @@ $blue: #1778f2;
$blue-alt: #1d85fc;
$yellow: #dcde81;
$yellow-alt: #808037;
+$grey-000: #121315;
$grey-100: #18191a;
$grey-200: #242526;
$grey-300: #3a3b3c;
@@ -30,7 +31,7 @@ $text: null !default;
$subtext: null !default;
$btntext: null !default;
-@if $varient == "dark" {
+@if $variant == "dark" {
$base: $grey-100;
$surface0: $grey-200;
$surface1: $grey-300;
@@ -40,8 +41,8 @@ $btntext: null !default;
$btntext: $white;
}
-@if $varient == "light" {
- $base: $grey-900;
+@if $variant == "light" {
+ $base: $grey-800;
$surface0: $grey-900;
$surface1: $grey-800;
$surface2: $grey-700;
@@ -50,6 +51,16 @@ $btntext: null !default;
$btntext: $grey-500;
}
+@if $variant == "amoled" {
+ $base: $black;
+ $surface0: $grey-000;
+ $surface1: $black;
+ $surface2: $grey-200;
+ $text: $white;
+ $subtext: $white-alt;
+ $btntext: $white;
+}
+
$font: "Helvetica Neue", Helvetica, Verdana, Courier, monospace;
$header-font: "Facebook";
diff --git a/src/scss/common.scss b/src/scss/common.scss
index 4a9a291..4c3bd77 100644
--- a/src/scss/common.scss
+++ b/src/scss/common.scss
@@ -33,6 +33,12 @@ button {
cursor: pointer;
}
+button {
+ font-size: inherit;
+ font-weight: inherit;
+ font-family: inherit;
+}
+
html {
color: $text;
font-family: $font;
@@ -197,6 +203,7 @@ footer#footer {
}
.btn {
+ cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
@@ -492,6 +499,16 @@ object.inner {
}
}
+.ilang {
+ i + span:not(empty) {
+ margin-left: $inner-gap / 2;
+ }
+
+ span:empty {
+ display: none;
+ }
+}
+
#toast-container {
position: fixed;
top: $header-height;
diff --git a/src/scss/people.scss b/src/scss/people.scss
index 4511aa8..84a4f4c 100644
--- a/src/scss/people.scss
+++ b/src/scss/people.scss
@@ -9,16 +9,20 @@ main#main {
font-size: 3rem;
margin-bottom: 0;
}
+
+ > hr {
+ margin-bottom: $outer-gap;
+ }
}
#people-container {
display: grid;
width: 100%;
- padding: $inner-gap;
- margin-bottom: $outer-gap;
grid-template-columns: repeat(auto-fill, minmax($profile-width, 1fr) );
grid-auto-rows: max-content;
grid-gap: 2em;
+ padding-left: $outer-gap;
+ padding-right: $outer-gap;
.profile {
width: $profile-width;
@@ -42,5 +46,12 @@ main#main {
margin-bottom: $inner-gap;
}
}
+}
+#no-people {
+ font-weight: bold;
+ font-size: 1.2em;
+ width: fit-content;
+ margin-left: auto;
+ margin-right: auto;
}
diff --git a/src/scss/post.scss b/src/scss/post.scss
index 8913be0..5d78991 100644
--- a/src/scss/post.scss
+++ b/src/scss/post.scss
@@ -13,3 +13,14 @@
#new-post {
width: 100%;
}
+
+#no-posts {
+ span {
+ display: block;
+ }
+
+ .no-posts-title {
+ font-size: 1.4em;
+ font-weight: bold;
+ }
+}
diff --git a/src/scss/settings.scss b/src/scss/settings.scss
index eb8463d..ca5cc43 100644
--- a/src/scss/settings.scss
+++ b/src/scss/settings.scss
@@ -1,9 +1,12 @@
@import "./variables";
@import "./mixins";
+main#main {
+ padding: $outer-gap;
+ padding-bottom: 0;
+}
+
#settings {
- margin: 0 $outer-gap;
- margin-bottom: $outer-gap;
max-width: $content-width * 1.5;
min-width: $content-width;
width: 100%;
diff --git a/src/shim/shim.php b/src/shim/shim.php
deleted file mode 100755
index eb84412..0000000
--- a/src/shim/shim.php
+++ /dev/null
@@ -1,298 +0,0 @@
-#!/usr/bin/env php
-<?php /* Copyright (c) 2024 Freya Murphy */
-
-function wait_until_ready() {
- while (TRUE) {
- if (file_exists("/status/ready")) {
- echo "database ready!\n";
- break;
- }
- echo "waiting for database...\n";
- sleep(3);
- }
-}
-
-if (!file_exists("/data/xssbook.db")) {
- echo "/data/xssbook.db not found: exiting shim\n";
- die();
-}
-
-function connect_psql() {
- $user = getenv("POSTGRES_USER");
- $pass = getenv("POSTGRES_PASSWORD");
- $db = getenv("POSTGRES_DB");
- $host = 'db';
- $port = '5432';
-
- $conn_str = sprintf("pgsql:host=%s;port=%d;dbname=%s;user=%s;password=%s",
- $host,
- $port,
- $db,
- $user,
- $pass
- );
- $conn = new \PDO($conn_str);
- $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
-
- return $conn;
-}
-
-function connect_sqlite() {
- $conn_str = sprintf("sqlite:/data/xssbook.db");
- $conn = new \PDO($conn_str);
- $conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
-
- return $conn;
-}
-
-$psql = connect_psql();
-$sqlite = connect_sqlite();
-
-function error() {
- $psql->rollBack();
- die();
-}
-
-function get_date(
- $day, $month, $year
-) {
- if (checkdate($month, $day, $year)) {
- $date = "{$year}-{$month}-{$day}";
- return $date;
- } else {
- return "1970-01-01";
- }
-}
-
-function clear_all() {
- echo "clearing database\n";
- extract($GLOBALS);
- $psql->beginTransaction();
- $psql->exec(
- 'DELETE FROM xssbook.user;
- DELETE FROM xssbook.post;
- DELETE FROM xssbook.comment;
- DELETE FROM xssbook.like;
- DELETE FROM xssbook.follow;
- DELETE FROM xssbook.user_media;'
- );
-}
-
-function migrate_users() {
- echo "migrating users\n";
- extract($GLOBALS);
-
- // load queries
- $query = $sqlite->prepare(
- 'SELECT user_id, firstname, lastname, email, password, gender, date, day, month, year FROM users;'
- );
- $submit = $psql->prepare(
- 'INSERT INTO xssbook.user
- (id, username, password, first_name, last_name, email, gender, birth_date, created)
- VALUES
- (?, ?, ?, ?, ?, ?, ?, ?, to_timestamp(?));'
- );
-
- // load users
- $query->execute();
- $rows = $query->fetchAll();
- foreach ($rows as $user) {
- // submit each user
- $date = get_date(
- $user['day'], $user['month'], $user['year']
- );
- $joined = $user['date'] / 1000;
- $submit->execute(array(
- $user['user_id'],
- $user['email'],
- $user['password'],
- $user['firstname'],
- $user['lastname'],
- $user['email'],
- $user['gender'],
- $date,
- $joined
- ));
- }
-}
-
-function migrate_posts() {
- echo "migrating posts\n";
- extract($GLOBALS);
-
- // load queries
- $query = $sqlite->prepare(
- 'SELECT post_id, user_id, content, date FROM posts;'
- );
- $submit = $psql->prepare(
- 'INSERT INTO xssbook.post
- (id, user_id, content, created)
- VALUES
- (?, ?, ?, to_timestamp(?));'
- );
-
- // load posts
- $query->execute();
- $rows = $query->fetchall();
- foreach ($rows as $post) {
- $created = $post['date'] / 1000;
- $submit->execute(array(
- $post['post_id'],
- $post['user_id'],
- $post['content'],
- $created
- ));
- }
-}
-
-function migrate_comments() {
- echo "migrating comments\n";
- extract($GLOBALS);
-
- // load queries
- $query = $sqlite->prepare(
- 'SELECT comment_id, user_id, post_id, content, date FROM comments;'
- );
- $submit = $psql->prepare(
- 'INSERT INTO xssbook.comment
- (id, user_id, post_id, content, created)
- VALUES
- (?, ?, ?, ?, to_timestamp(?));'
- );
-
- // load comments
- $query->execute();
- $rows = $query->fetchall();
- foreach ($rows as $comment) {
- $created = $comment['date'] / 1000;
- $submit->execute(array(
- $comment['comment_id'],
- $comment['user_id'],
- $comment['post_id'],
- $comment['content'],
- $created
- ));
- }
-}
-
-function migrate_likes() {
- echo "migrating likes\n";
- extract($GLOBALS);
-
- // load queries
- $query = $sqlite->prepare(
- 'SELECT user_id, post_id FROM likes;'
- );
- $submit = $psql->prepare(
- 'INSERT INTO xssbook.like
- (user_id, post_id)
- VALUES
- (?, ?);'
- );
-
- // load likes
- $query->execute();
- $rows = $query->fetchall();
- foreach ($rows as $like) {
- $submit->execute(array(
- $like['user_id'],
- $like['post_id']
- ));
- }
-}
-
-function migrate_follow() {
- echo "migrating follow\n";
- extract($GLOBALS);
-
- // load queries
- $query = $sqlite->prepare(
- 'SELECT follower_id, followee_id FROM friends;'
- );
- $submit = $psql->prepare(
- 'INSERT INTO xssbook.follow
- (follower_id, followee_id)
- VALUES
- (?, ?);'
- );
-
- // load follows
- $query->execute();
- $rows = $query->fetchall();
- foreach ($rows as $follow) {
- $submit->execute(array(
- $follow['follower_id'],
- $follow['followee_id']
- ));
- }
-}
-
-function migrate_user_media($type) {
- echo "migrating user media ($type)\n";
- extract($GLOBALS);
-
- // load queries
- $submit = $psql->prepare(
- 'INSERT INTO xssbook.user_media
- (user_id, content, mime, type)
- VALUES
- (?, decode(?, \'base64\'), ?, ?);'
- );
-
- // get dir
- $dir = "/data/custom/{$type}";
- if (!is_dir($dir)) {
- return;
- }
-
- // load user media
- if ($handle = opendir($dir)) {
- while (FALSE !== ($file = readdir($handle))) {
- if ('.' === $file) continue;
- if ('..' === $file) continue;
- $n = strpos($file, ".png");
- $uid = substr($file, 0, $n);
- $path = "{$dir}/{$file}";
- $data = base64_encode(file_get_contents($path));
-
- $submit->execute(array(
- $uid,
- $data,
- 'image/png',
- $type
- ));
- }
- closedir($handle);
- }
-}
-
-function migrate_seq() {
- echo "migrating sequences\n";
- extract($GLOBALS);
-
- $tables = array('user', 'post', 'like', 'comment', 'follow', 'user_media');
-
- foreach ($tables as $table) {
- $sql = "SELECT setval('sys.{$table}_id_seq', (SELECT MAX(id) FROM xssbook.{$table}), true);";
- $psql->exec($sql);
- }
-}
-
-try {
- wait_until_ready();
- clear_all();
- migrate_users();
- migrate_posts();
- migrate_comments();
- migrate_likes();
- migrate_follow();
- migrate_user_media('avatar');
- migrate_user_media('banner');
- migrate_seq();
-} catch (Exception $ex) {
- echo "$ex\n";
- $psql->rollBack();
- die();
-}
-
-$psql->commit();
diff --git a/src/web/_controller/_index.php b/src/web/_controller/_index.php
deleted file mode 100644
index 2fd7db2..0000000
--- a/src/web/_controller/_index.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class _index_controller extends Controller {
-
- // the home model
- private $home_model;
-
- // the request model
- private $request_model;
-
- // the caceh model
- private $cache_model;
-
- public function index(): void {
- if ($this->main->session) {
- $this->redirect('/home');
- } else {
- $this->redirect('/auth/login');
- }
- }
-
-}
-
-?>
diff --git a/src/web/_controller/_meta.php b/src/web/_controller/_meta.php
index bec3c65..06c7c0a 100644
--- a/src/web/_controller/_meta.php
+++ b/src/web/_controller/_meta.php
@@ -1,21 +1,21 @@
<?php /* Copyright (c) 2024 Freya Murphy */
-class _meta_controller extends Controller {
+class _meta_controller extends XSS_Controller {
public function manifest(): void {
$json = array(
- 'short_name' => 'xssbook.com',
- 'name' => 'xssbook.com',
+ 'short_name' => CONFIG['domain'],
+ 'name' => CONFIG['domain'],
'icons' => [
array(
- 'src' => 'https://xssbook.com/public/icons/logo512.png',
+ 'src' => $this->get_url('public/icons/logo512.png'),
'type' => 'image/png',
'sizes' => '512x512',
'purpose' => 'any maskable'
)
],
- 'id' => 'https://xssbook.com/home',
- 'start_url' => 'https://xssbook.com/home',
+ 'id' => $this->get_url('home'),
+ 'start_url' => $this->get_url('home'),
'background_color' => '#181818',
'display' => 'standalone',
'scope' => '/',
diff --git a/src/web/_controller/_modal.php b/src/web/_controller/_modal.php
new file mode 100644
index 0000000..0447ca8
--- /dev/null
+++ b/src/web/_controller/_modal.php
@@ -0,0 +1,28 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class _modal_controller extends XSS_Controller {
+
+ /**
+ * @param string $name
+ * @param array $data
+ */
+ private function modal($name): void {
+ $data = $this->model->get_data();
+ $data['title'] = ucwords(lang($name . '_modal_title'));
+ $data['content'] = $name;
+ $this->view('_template/modal', $data);
+ }
+
+ public function new_post(): void {
+ $this->load_lang('post');
+ $this->modal('new_post');
+ }
+
+ public function about(): void {
+ $this->modal('about');
+ }
+
+ public function register(): void {
+ $this->load_lang('auth');
+ $this->modal('register');
+ }
+}
diff --git a/src/web/_controller/_util/post.php b/src/web/_controller/_post.php
index 5346497..56c997f 100644
--- a/src/web/_controller/_util/post.php
+++ b/src/web/_controller/_post.php
@@ -1,30 +1,22 @@
<?php /* Copyright (c) 2024 Freya Murphy */
-class Post_controller extends Controller {
+class _post_controller extends XSS_Controller {
- // the request model
- private $request_model;
+ private $auth_model;
- // the caceh model
- private $cache_model;
-
- // page size
- private $page_size;
-
- function __construct($load) {
- parent::__construct($load);
- $this->request_model = $this->load->model('request');
- $this->cache_model = $this->load->model('cache');
- $this->page_size = 10;
+ function __construct() {
+ parent::__construct();
+ $this->auth_model = $this->load_model('auth');
+ $this->load_lang('post');
}
public function index(): void {
- $this->view('template/posts');
+ $this->view('_template/posts');
}
public function post(): void {
- $pid = $this->request_model->get_int('id', 0);
+ $pid = $this->get_int('id', 0);
- $post = $this->db
+ $post = $this->db()
->select('p.*, l.id as like_id')
->from('api.post p')
->join('api.like l', 'p.id = l.post_id AND l.user_id')
@@ -33,42 +25,37 @@ class Post_controller extends Controller {
->eq($pid)
->row();
- if (!$post) {
+ if (!$post)
return;
- }
- $users = $this->cache_model->get_users([$post]);
+ $users = $this->model->get_users([$post]);
$uid = $post['user_id'];
- if (!array_key_exists($uid, $users)) {
+ if (!isset($users[$uid]))
return;
- }
$user = $users[$uid];
- $data = array(
- 'user' => $user,
- 'page_size' => $this->page_size,
- 'post' => $post
- );
- $this->view('template/post', $data);
+ $data = $this->model->get_data();
+ $data['user'] = $user;
+ $data['page_size'] = POST_PAGE_SIZE;
+ $data['post'] = $post;
+ $this->view('_template/post', $data);
}
/**
* @return array<string,mixed>
*/
public function posts(): array {
- $page = $this->request_model->get_int('page', 0);
- $max = $this->request_model->get_int('max');
- $offset = $page * $this->page_size;
- $filter_uid = $this->request_model->get_int('user_id', FALSE);
+ $page = $this->get_int('page', 0);
+ $max = $this->get_int('max');
+ $offset = $page * POST_PAGE_SIZE;
+ $filter_uid = $this->get_int('user_id', FALSE);
- $user = $this->main->user();
+ $user = $this->auth_model->session();
$uid = isset($user) ? $user['id'] : NULL;
- $query = $this->db;
-
- $query = $this->db
+ $query = $this->db()
->select('p.*, l.id as like_id')
->from('api.post p')
->join('api.like l', 'p.id = l.post_id AND l.user_id')
@@ -86,23 +73,23 @@ class Post_controller extends Controller {
$posts = $query
->order_by('p.id', 'DESC')
- ->limit($this->page_size)
+ ->limit(POST_PAGE_SIZE)
->offset($offset)
->rows();
- $users = $this->cache_model->get_users($posts);
+ $users = $this->model->get_users($posts);
$max = 0;
foreach ($posts as $post) {
$max = max($max, $post['id']);
- $data = array();
- $data['page_size'] = $this->page_size;
+ $data = $this->model->get_data();
+ $data['page_size'] = POST_PAGE_SIZE;
$data['user'] = $users[$post['user_id']];
$data['post'] = $post;
- $this->view('template/post', $data);
+ $this->view('_template/post', $data);
}
- $query = $this->db
+ $query = $this->db()
->select('COUNT(p.id) as pc')
->from('api.post p');
@@ -117,16 +104,17 @@ class Post_controller extends Controller {
return array(
'loaded' => count($posts),
'total' => $pc,
- 'page_size' => $this->page_size,
+ 'page_size' => POST_PAGE_SIZE,
+
'max' => $max,
'filter_uid' => $filter_uid
);
}
public function comment(): void {
- $cid = $this->request_model->get_int('id', 0);
+ $cid = $this->get_int('id', 0);
- $comment = $this->db
+ $comment = $this->db()
->select('*')
->from('api.comment')
->where('id')
@@ -137,7 +125,7 @@ class Post_controller extends Controller {
return;
}
- $users = $this->cache_model->get_users([$comment]);
+ $users = $this->model->get_users([$comment]);
$uid = $comment['user_id'];
if (!array_key_exists($uid, $users)) {
@@ -146,23 +134,24 @@ class Post_controller extends Controller {
$user = $users[$uid];
- $data = array(
- 'user' => $user,
- 'comment' => $comment
- );
- $this->view('template/comment', $data);
+ $data = $this->model->get_data();
+ $data['user'] = $user;
+ $data['comment'] = $comment;
+ $this->view('_template/comment', $data);
}
/**
* @return array<string,mixed>
*/
public function comments(): array {
- $page = $this->request_model->get_int('page', 0);
- $max = $this->request_model->get_int('max');
- $id = $this->request_model->get_int('id', 0);
- $offset = $page * $this->page_size;
+ $page = $this->get_int('page', 0);
+ $max = $this->get_int('max');
+ $id = $this->get_int('id', 0);
+ $offset = $page * COMMENT_PAGE_SIZE;
+
+ $user = $this->auth_model->session();
- $query = $this->db
+ $query = $this->db()
->select('*')
->from('api.comment')
->where('post_id')
@@ -177,11 +166,11 @@ class Post_controller extends Controller {
$comments = $query
->order_by('id', 'ASC')
- ->limit($this->page_size)
+ ->limit(COMMENT_PAGE_SIZE)
->offset($offset)
->rows();
- $users = $this->cache_model->get_users($comments);
+ $users = $this->model->get_users($comments);
$max = 0;
// only add this hr when not logged in
@@ -190,22 +179,22 @@ class Post_controller extends Controller {
if (
count($comments) &&
$page == 0 &&
- $this->main->session === NULL
+ $user === NULL
) {
echo '<hr>';
}
foreach ($comments as $comment) {
$max = max($max, $comment['id']);
- $data = array();
+ $data = $this->model->get_data();
$data['user'] = $users[$comment['user_id']];
$data['comment'] = $comment;
- $this->view('template/comment', $data);
+ $this->view('_template/comment', $data);
}
return array(
'loaded' => count($comments),
- 'page_size' => $this->page_size,
+ 'page_size' => COMMENT_PAGE_SIZE,
'max' => $max,
);
}
diff --git a/src/web/_controller/_template.php b/src/web/_controller/_template.php
new file mode 100644
index 0000000..9c82956
--- /dev/null
+++ b/src/web/_controller/_template.php
@@ -0,0 +1,21 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class _template_controller extends XSS_Controller {
+
+ public function toast(): void {
+ $msg = $this->get_string('msg') ?? '';
+ $detail = $this->get_string('detail');
+ $hint = $this->get_string('hint');
+ $type = $this->get_string('type', 'error');
+
+ $data = array(
+ 'msg' => $msg,
+ 'detail' => $detail,
+ 'hint' => $hint,
+ 'type' => $type,
+ );
+
+ $this->view('_template/toast', $data);
+ }
+
+}
+
diff --git a/src/web/_controller/apps/auth.php b/src/web/_controller/apps/auth.php
deleted file mode 100644
index 1df74da..0000000
--- a/src/web/_controller/apps/auth.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Auth_controller extends Controller {
-
- // the home model
- private $auth_model;
-
- // the post controller
- protected $post_controller;
-
- function __construct($load) {
- parent::__construct($load);
- $this->auth_model = $this->load->model('apps/auth');
- }
-
- public function index(): void {
- if ($this->main->session) {
- $this->redirect('/home');
- } else {
- $this->redirect('/auth/login');
- }
- }
-
- public function login(): void {
- if ($this->main->session) {
- $this->redirect('/home');
- }
-
- parent::index();
- $data = $this->auth_model->get_data();
- $this->view('head', $data);
- $this->view('apps/auth/login', $data);
- $this->view('footer', $data);
- }
-
- public function logout(): void {
- if ($this->main->session) {
- $_SESSION['jwt'] = NULL;
- }
- $this->redirect('/auth/login');
- }
-
- public function update(): void {
- if (!$this->is_ajax()) {
- $this->error(400);
- }
- if (!isset($_POST['key']) || !isset($_POST['value'])) {
- $this->error(400);
- }
- $key = $_POST['key'];
- $value = $_POST['value'];
- $_SESSION[$key] = $value;
- }
-
-}
-
-?>
diff --git a/src/web/_controller/apps/error.php b/src/web/_controller/apps/error.php
deleted file mode 100644
index 03bbd8d..0000000
--- a/src/web/_controller/apps/error.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Error_controller extends Controller {
-
- private $error_model;
-
- function __construct($load) {
- parent::__construct($load);
- $this->error_model = $this->load->model('apps/error');
- }
-
- public function index(): void {
- parent::index();
- $data = $this->error_model->get_data();
- $this->view('header', $data);
- $this->view('apps/error/main', $data);
- $this->view('footer', $data);
- }
-
-}
-
-?>
diff --git a/src/web/_controller/apps/home.php b/src/web/_controller/apps/home.php
deleted file mode 100644
index c9a116d..0000000
--- a/src/web/_controller/apps/home.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Home_controller extends Controller {
-
- // the home model
- private $home_model;
-
- // the post controller
- protected $post_controller;
-
- function __construct($load) {
- parent::__construct($load);
- $this->home_model = $this->load->model('apps/home');
- $this->post_controller = $this->load->controller('_util/post');
- }
-
- public function index(): void {
- parent::index();
- $data = $this->home_model->get_data();
- $this->view('header', $data);
- $this->view('apps/home/main', $data);
- $this->view('footer', $data);
- }
-
-}
-
-?>
diff --git a/src/web/_controller/apps/people.php b/src/web/_controller/apps/people.php
deleted file mode 100644
index 86da3b3..0000000
--- a/src/web/_controller/apps/people.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class People_controller extends Controller {
-
- // the people model
- private $people_model;
-
- // format model
- protected $format_model;
-
- function __construct($load) {
- parent::__construct($load);
- $this->people_model = $this->load->model('apps/people');
- $this->format_model = $this->load->model('format');
- }
-
- public function index(): void {
- parent::index();
- $data = $this->people_model->get_data();
- $this->view('header', $data);
- $this->view('apps/people/header', $data);
- $this->view('apps/people/main', $data);
- $this->view('apps/people/footer', $data);
- $this->view('footer', $data);
- }
-
- public function content(): void {
- $data = $this->people_model->get_data();
- $this->view('apps/people/main', $data);
- }
-
- /**
- * @return array<string,mixed>
- */
- public function people(): array {
- $data = $this->people_model->get_users();
-
- $this->view('apps/people/people', $data);
-
- $max = 0;
- foreach ($data['users'] as $user) {
- $max = max($max, $user['id']);
- }
-
- return $data;
- }
-}
-
-?>
diff --git a/src/web/_controller/apps/profile.php b/src/web/_controller/apps/profile.php
deleted file mode 100644
index 9e9fca6..0000000
--- a/src/web/_controller/apps/profile.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Profile_controller extends Controller {
-
- // the home model
- private $profile_model;
-
- // the format model
- protected $format_model;
-
- // the post controller
- protected $post_controller;
-
- // the people controller
- protected $people_controller;
-
- function __construct($load) {
- parent::__construct($load);
- $this->profile_model = $this->load->model('apps/profile');
- $this->people_controller = $this->load->controller('apps/people');
- $this->format_model = $this->load->model('format');
- $this->post_controller = $this->load->controller('_util/post');
- }
-
- public function index(): void {
-
- if ($this->main->user() && !isset($_GET['id'])) {
- $this->redirect('/profile?id=' . $this->main->user()['id']);
- }
-
- parent::index();
- $data = $this->profile_model->get_data();
-
- if (!$data) {
- $this->error(404);
- }
-
- $this->view('header', $data);
- $this->view('apps/profile/main', $data);
- $this->view('footer', $data);
- }
-
-}
-
-?>
diff --git a/src/web/_controller/apps/settings.php b/src/web/_controller/apps/settings.php
deleted file mode 100644
index 8a409cc..0000000
--- a/src/web/_controller/apps/settings.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Settings_controller extends Controller {
-
- // the home model
- private $settings_model;
-
- // the format model
- protected $format_model;
-
- // the post controller
- protected $post_controller;
-
- // the people controller
- protected $people_controller;
-
- function __construct($load) {
- parent::__construct($load);
- $this->settings_model = $this->load->model('apps/settings');
- }
-
- public function index(): void {
- if (!$this->main->session) {
- $this->redirect('/auth/login');
- }
-
- parent::index();
- $data = $this->settings_model->get_data();
-
- if (!$data) {
- $this->error(404);
- }
-
- $this->load->app_lang($this->main->info['lang'], 'auth');
- $this->view('header', $data);
- $this->view('apps/settings/main', $data);
- $this->view('footer', $data);
- }
-
-}
-
-?>
diff --git a/src/web/_controller/auth.php b/src/web/_controller/auth.php
new file mode 100644
index 0000000..fd1931c
--- /dev/null
+++ b/src/web/_controller/auth.php
@@ -0,0 +1,45 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Auth_controller extends XSS_Controller {
+
+ private $auth_model;
+
+ function __construct() {
+ parent::__construct();
+ $this->auth_model = $this->load_model('auth');
+ $this->load_lang('auth');
+ }
+
+ public function index(): void {
+ $this->load_controller('index')->index();
+ }
+
+ public function login(): void {
+ if ($this->auth_model->session())
+ $this->redirect('/home');
+
+ parent::index();
+ $data = $this->auth_model->get_data();
+ $this->view('head', $data);
+ $this->view('auth/main', $data);
+ $this->view('footer', $data);
+ }
+
+ public function logout(): void {
+ if ($this->auth_model->session())
+ $_SESSION['jwt'] = NULL;
+ $this->redirect('/auth/login');
+ }
+
+ public function update(): void {
+ $key = $this->post_data('key');
+ $value = $this->post_data('value');
+
+ if (!$key || !$value)
+ $this->error(400);
+
+ $_SESSION[$key] = $value;
+ }
+
+}
+
+?>
diff --git a/src/web/_controller/error.php b/src/web/_controller/error.php
new file mode 100644
index 0000000..55034ba
--- /dev/null
+++ b/src/web/_controller/error.php
@@ -0,0 +1,36 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Error_controller extends XSS_Controller {
+
+ private $error_model;
+
+ function __construct() {
+ parent::__construct();
+ $this->error_model = $this->load_model('error');
+ }
+
+ public function index(): void {
+ $this->code(404);
+ }
+
+ public function code($code): void {
+ parent::index();
+
+ $code = intval($code);
+ if ($code == 404 && rand(0, 100) > 95)
+ $code = 451;
+ if (!is_valid_status_code($code))
+ $code = 404;
+ $msg = status_code_msg($code);
+
+ $data = $this->error_model->get_data();
+ $data['title'] = $code;
+ $data['msg'] = $msg;
+
+ $this->view('header', $data);
+ $this->view('error/main', $data);
+ $this->view('footer', $data);
+ }
+
+}
+
+?>
diff --git a/src/web/_controller/home.php b/src/web/_controller/home.php
new file mode 100644
index 0000000..dc9da4d
--- /dev/null
+++ b/src/web/_controller/home.php
@@ -0,0 +1,27 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Home_controller extends XSS_Controller {
+
+ // the home model
+ protected $home_model;
+
+ // the post controller
+ protected $post_controller;
+
+ function __construct() {
+ parent::__construct();
+ $this->home_model = $this->load_model('home');
+ $this->post_controller = $this->load_controller('_post');
+ $this->load_lang('post', 'home');
+ }
+
+ public function index(): void {
+ parent::index();
+ $data = $this->home_model->get_data();
+ $this->view('header', $data);
+ $this->view('home/main', $data);
+ $this->view('footer', $data);
+ }
+
+}
+
+?>
diff --git a/src/web/_controller/index.php b/src/web/_controller/index.php
new file mode 100644
index 0000000..0822a22
--- /dev/null
+++ b/src/web/_controller/index.php
@@ -0,0 +1,16 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Index_controller extends XSS_Controller {
+
+ public function index(): void {
+ $auth_model = $this->load_model('auth');
+ $session = $auth_model->session();
+
+ $home = $this->get_url('home');
+ $login = $this->get_url('auth/login');
+
+ $this->redirect($session ? $home : $login);
+ }
+
+}
+
+?>
diff --git a/src/web/_controller/modal.php b/src/web/_controller/modal.php
deleted file mode 100644
index da17cca..0000000
--- a/src/web/_controller/modal.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Modal_controller extends Controller {
-
-
- function __construct($load) {
- parent::__construct($load);
- }
-
- /**
- * @param string $name
- * @param array $data
- */
- private function modal($name, $data = array()): void {
- $title = ucwords(lang($name . '_modal_title'));
- $data['title'] = $title;
- $data['content'] = $name;
- $this->view('template/modal', $data);
- }
-
- public function new_post(): void {
- $this->modal('new_post');
- }
-
- public function about(): void {
- $this->modal('about');
- }
-
- public function register(): void {
- $this->load->app_lang(
- $this->main->info['lang'],
- 'auth'
- );
- $this->modal('register');
- }
-}
-
-?>
-
diff --git a/src/web/_controller/people.php b/src/web/_controller/people.php
new file mode 100644
index 0000000..bb2db2c
--- /dev/null
+++ b/src/web/_controller/people.php
@@ -0,0 +1,45 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class People_controller extends XSS_Controller {
+
+ // the people model
+ private $people_model;
+
+ function __construct() {
+ parent::__construct();
+ $this->people_model = $this->load_model('people');
+ $this->load_lang('people');
+ }
+
+ public function index(): void {
+ parent::index();
+ $data = $this->people_model->get_data();
+ $this->view('header', $data);
+ $this->view('people/header', $data);
+ $this->view('people/main', $data);
+ $this->view('people/footer', $data);
+ $this->view('footer', $data);
+ }
+
+ public function content(): void {
+ $data = $this->people_model->get_data();
+ $this->view('people/main', $data);
+ }
+
+ /**
+ * @return array<string,mixed>
+ */
+ public function people(): array {
+ $data = $this->people_model->get_people();
+
+ $this->view('people/people', $data);
+
+ $max = 0;
+ foreach ($data['users'] as $user) {
+ $max = max($max, $user['id']);
+ }
+
+ return $data;
+ }
+}
+
+?>
diff --git a/src/web/_controller/profile.php b/src/web/_controller/profile.php
new file mode 100644
index 0000000..dd02ed2
--- /dev/null
+++ b/src/web/_controller/profile.php
@@ -0,0 +1,44 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Profile_controller extends XSS_Controller {
+
+ // the profile model
+ private $profile_model;
+
+ // the post controller
+ protected $post_controller;
+
+ // the people controller
+ protected $people_controller;
+
+ function __construct() {
+ parent::__construct();
+ $this->profile_model = $this->load_model('profile');
+ $this->people_controller = $this->load_controller('people');
+ $this->post_controller = $this->load_controller('_post');
+ $this->load_lang('profile');
+ }
+
+ public function index(): void {
+ $id = $this->get_int('id');
+
+ parent::index();
+ $data = $this->profile_model->get_data();
+
+ // profile does not exist
+ if (!$data) {
+ // not logged in and trying to access own profile
+ if (!$id)
+ $this->redirect('/auth/login');
+ // directly accessing unknown user id => 404
+ else
+ $this->error(404);
+ }
+
+ $this->view('header', $data);
+ $this->view('profile/main', $data);
+ $this->view('footer', $data);
+ }
+
+}
+
+?>
diff --git a/src/web/_controller/settings.php b/src/web/_controller/settings.php
new file mode 100644
index 0000000..e42389f
--- /dev/null
+++ b/src/web/_controller/settings.php
@@ -0,0 +1,34 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Settings_controller extends XSS_Controller {
+
+ // the settings model
+ private $settings_model;
+
+ // the auth model
+ private $auth_model;
+
+ function __construct() {
+ parent::__construct();
+ $this->settings_model = $this->load_model('settings');
+ $this->auth_model = $this->load_model('auth');
+ $this->load_lang('auth', 'settings');
+ }
+
+ public function index(): void {
+ if (!$this->auth_model->session())
+ $this->redirect('/auth/login');
+
+ parent::index();
+ $data = $this->settings_model->get_data();
+
+ if (!$data)
+ $this->error(404);
+
+ $this->view('header', $data);
+ $this->view('settings/main', $data);
+ $this->view('footer', $data);
+ }
+
+}
+
+?>
diff --git a/src/web/_controller/template.php b/src/web/_controller/template.php
deleted file mode 100644
index 879eadc..0000000
--- a/src/web/_controller/template.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Template_controller extends Controller {
-
- // the request model
- private $request_model;
-
- function __construct($load) {
- parent::__construct($load);
- $this->request_model = $this->load->model('request');
- }
-
- public function toast(): void {
- $data = array(
- 'msg' => $this->request_model->get_str('msg', FALSE),
- 'detail' => $this->request_model->get_str('detail', FALSE),
- 'hint' => $this->request_model->get_str('hint', FALSE),
- 'type' => $this->request_model->get_str('type', 'error')
- );
- $this->view('template/toast', $data);
- }
-
-}
-
diff --git a/src/web/_model/apps/auth.php b/src/web/_model/apps/auth.php
deleted file mode 100644
index c528601..0000000
--- a/src/web/_model/apps/auth.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Auth_model extends Model {
-
- function __construct($load) {
- parent::__construct($load);
- }
-
- public function get_data(): ?array {
- $data = parent::get_data();
- $data['title'] = ucfirst(lang('login'));
- return $data;
- }
-}
diff --git a/src/web/_model/apps/error.php b/src/web/_model/apps/error.php
deleted file mode 100644
index 0a08fdd..0000000
--- a/src/web/_model/apps/error.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Error_model extends Model {
-
- function __construct($load) {
- parent::__construct($load);
- }
-
- private function get_msg(&$data) {
- if (!array_key_exists('code', $_GET)) {
- http_response_code(500);
- $data['msg'] = ucfirst(lang('error'));
- $data['title'] = '500';
- } else {
- $code = $_GET['code'];
- http_response_code($code);
- $data['title'] = $code;
- $msg = ucfirst(lang('error_' . $code, FALSE));
- if (!$msg) {
- $msg = ucfirst(lang('error'));
- }
- $data['msg'] = $msg;
- }
- }
-
- public function get_data(): ?array {
- $data = parent::get_data();
- $this->get_msg($data);
- return $data;
- }
-}
-?>
diff --git a/src/web/_model/apps/home.php b/src/web/_model/apps/home.php
deleted file mode 100644
index 634bc67..0000000
--- a/src/web/_model/apps/home.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Home_model extends Model {
-
- function __construct($load) {
- parent::__construct($load);
- }
-
- private function get_posts(): array {
- return $this->db
- ->select('*')
- ->from('xssbook.post')
- ->limit(20)
- ->rows();
- }
-
- public function get_data(): ?array {
- $data = parent::get_data();
- $data['title'] = ucfirst(lang('title'));
- $data['posts'] = $this->get_posts();
- return $data;
- }
-}
diff --git a/src/web/_model/apps/people.php b/src/web/_model/apps/people.php
deleted file mode 100644
index 08366a7..0000000
--- a/src/web/_model/apps/people.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class People_model extends Model {
-
- private $request_model;
-
- function __construct($load) {
- parent::__construct($load);
- $this->request_model = $this->load->model('request');
- }
- /**
- * @param mixed $select
- */
- private function get_filted_query($select): DatabaseQuery {
- $filter_type = $this->request_model->get_str('filter', FALSE);
- $filter_uid = $this->request_model->get_int('uid', FALSE);
- $max = $this->request_model->get_int('max', FALSE);
-
- $query = $this->db
- ->select($select)
- ->from('api.user u');
-
- if ($filter_type && $filter_uid) {
- switch ($filter_type) {
- case 'follower': {
- $query = $query
- ->join('xssbook.follow f', 'f.follower_id = u.id AND f.followee_id', 'INNER')
- ->eq($filter_uid)
- ->where('f.value = TRUE');
- } break;
-
- case 'followee': {
- $query = $query
- ->join('xssbook.follow f', 'f.followee_id = u.id AND f.follower_id', 'INNER')
- ->eq($filter_uid)
- ->where('f.value = TRUE');
- } break;
- }
- }
-
- if ($max) {
- $query = $query
- ->where('u.id')
- ->le($max);
- }
-
- return $query;
- }
-
- /**
- * @return array<string,mixed>
- */
- public function get_users(): array {
- $page = $this->request_model->get_int('page', 0);
- $page_size = 24;
- $offset = $page_size * $page;
-
- $users = $this->get_filted_query('u.*')
- ->order_by('u.id', 'DESC')
- ->offset($offset)
- ->limit($page_size)
- ->rows();
-
- $count = $this->get_filted_query('COUNT(u.id) AS count')
- ->row()['count'];
-
- $max = 0;
-
- foreach ($users as $user) {
- $max = max($max, $user['id']);
- }
-
- $filter_type = $this->request_model->get_str('filter', FALSE);
- $filter_uid = $this->request_model->get_int('uid', FALSE);
-
- return array(
- 'users' => $users,
- 'count' => $count,
- 'page_size' => $page_size,
- 'max_id' => $max,
- 'filter_type' => $filter_type || '',
- 'filter_uid' => $filter_uid || ''
- );
- }
-
- public function get_data(): ?array {
- $data = parent::get_data();
- $data['title'] = ucfirst(lang('title'));
- return $data;
- }
-}
diff --git a/src/web/_model/apps/profile.php b/src/web/_model/apps/profile.php
deleted file mode 100644
index acec9c0..0000000
--- a/src/web/_model/apps/profile.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Profile_model extends Model {
-
- private $request_model;
-
- function __construct($load) {
- parent::__construct($load);
- $this->request_model = $this->load->model('request');
- }
-
- public function get_data(): ?array {
- $uid = $this->request_model->get_int('id', FALSE);
- if ($uid === FALSE) {
- if ($this->main->session) {
- $uid = $this->main->user()['id'];
- } else {
- return NULL;
- }
- }
-
- $user = $this->db
- ->select('*')
- ->from('api.user u')
- ->where('u.id')
- ->eq($uid)
- ->row();
-
- if (!$user) {
- return NULL;
- }
-
- $following = FALSE;
- $followed = FALSE;
- $follow_id = NULL;
-
- if ($this->main->session) {
- $sid = $this->main->user()['id'];
- $res = $this->db->select('f.value, f.id')
- ->from('xssbook.follow f')
- ->where('f.follower_id')
- ->eq($sid)
- ->where('f.followee_id')
- ->eq($uid)
- ->row();
- $following = $res ? $res['value'] : FALSE;
- $follow_id = $res ? $res['id'] : NULL;
- $res = $this->db->select('f.value')
- ->from('xssbook.follow f')
- ->where('f.follower_id')
- ->eq($uid)
- ->where('f.followee_id')
- ->eq($sid)
- ->row();
- $followed = $res ? $res['value'] : FALSE;
- }
-
- $data = parent::get_data();
- $data['user'] = $user;
- $data['following'] = $following;
- $data['followed'] = $followed;
- $data['follow_id'] = $follow_id;
- $data['title'] = ucfirst(lang('title', sub: [$user['first_name']]));
- return $data;
- }
-}
diff --git a/src/web/_model/apps/settings.php b/src/web/_model/apps/settings.php
deleted file mode 100644
index 1f1e3f9..0000000
--- a/src/web/_model/apps/settings.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Settings_model extends Model {
-
- private $request_model;
-
- function __construct($load) {
- parent::__construct($load);
- $this->request_model = $this->load->model('request');
- }
-
- public function get_data(): ?array {
- $data = parent::get_data();
- $data['title'] = ucfirst(lang('title'));
- return $data;
- }
-}
diff --git a/src/web/_model/auth.php b/src/web/_model/auth.php
new file mode 100644
index 0000000..50cb367
--- /dev/null
+++ b/src/web/_model/auth.php
@@ -0,0 +1,42 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Auth_model extends XSS_Model {
+
+ private static ?array $session = NULL;
+
+ /**
+ * Loads current session
+ * @param string $jwt - the user provided JWT
+ */
+ public function session(): ?array {
+ // check
+ if (self::$session)
+ return self::$session;
+ // get jwt
+ $jwt = $_SESSION['jwt'] ?? '';
+ if (!$jwt)
+ return NULL;
+ // get session
+ $result = $this->db()
+ ->select("_api.verify_jwt(?) AS user_id;")
+ ->row($jwt);
+ // invalid JWT
+ if (!$result)
+ return NULL;
+ // load user inside session
+ $user_id = $result['user_id'];
+ $user = $this->db()
+ ->select('*')
+ ->from('api.user')
+ ->where('id')
+ ->eq($user_id)
+ ->row();
+ // valid JWT, but invalid user
+ if (!$result)
+ return NULL;
+ // return session
+ self::$session = array_merge(
+ $user,
+ array('jwt' => $jwt));
+ return self::$session;
+ }
+}
diff --git a/src/web/_model/cache.php b/src/web/_model/cache.php
deleted file mode 100644
index 6cf9924..0000000
--- a/src/web/_model/cache.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Cache_model extends Model {
-
- // the user cache
- private $users;
-
- function __construct($load) {
- parent::__construct($load);
- $this->users = array();
- }
-
- /**
- * Gets a array of users
- */
- public function get_users($objs) {
- $ids = array();
- foreach ($objs as $obj) {
- $id = $obj['user_id'];
- if (!array_key_exists($id, $this->users)) {
- array_push($ids, intval($id));
- }
- }
- if (!empty($ids)) {
- $result = $this->main->db
- ->select('*')
- ->from('api.user')
- ->where_in('id', $ids)
- ->rows();
- foreach ($result as $user) {
- $id = $user['id'];
- $this->users[$id] = $user;
- }
- }
- return $this->users;
- }
-
-}
diff --git a/src/web/_model/error.php b/src/web/_model/error.php
new file mode 100644
index 0000000..ec376c7
--- /dev/null
+++ b/src/web/_model/error.php
@@ -0,0 +1,3 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Error_model extends XSS_Model {
+}
diff --git a/src/web/_model/format.php b/src/web/_model/format.php
deleted file mode 100644
index d2b7316..0000000
--- a/src/web/_model/format.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Format_model extends Model {
-
- function __construct($load) {
- parent::__construct($load);
- }
-
- /**
- * Formats a users's name
- * @param array $user - the $user
- * @returns the user's formatted display name
- */
- public function name($user) {
- $name = '';
- if ($user['first_name']) {
- $name .= $user['first_name'];
- }
- if ($user['middle_name']) {
- if ($name != '') {
- $name .= ' ';
- }
- $name .= $user['middle_name'];
- }
- if ($user['last_name']) {
- if ($name != '') {
- $name .= ' ';
- }
- $name .= $user['last_name'];
- }
- if ($name == '') {
- $name = '@' . $user['username'];
- }
- return $name;
- }
-
-}
diff --git a/src/web/_model/home.php b/src/web/_model/home.php
new file mode 100644
index 0000000..f4a33e0
--- /dev/null
+++ b/src/web/_model/home.php
@@ -0,0 +1,17 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Home_model extends XSS_Model {
+
+ private function get_posts(): ?array {
+ return $this->db()
+ ->select('*')
+ ->from('api.post')
+ ->limit(POST_PAGE_SIZE)
+ ->rows();
+ }
+
+ public function get_data(): ?array {
+ $data = parent::get_data();
+ $data['posts'] = $this->get_posts();
+ return $data;
+ }
+}
diff --git a/src/web/_model/main.php b/src/web/_model/main.php
deleted file mode 100644
index cd34740..0000000
--- a/src/web/_model/main.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Main_model {
-
- // the website database
- public $db;
-
- // the current user session (can be NULL)
- public $session;
-
- // current loaded users
- private $users;
-
- // stores the current request info
- public $info;
-
- // tthe logged in user
- private $user;
-
- /**
- * Loads the main model
- * @param Loader $load - the main loader object
- */
- function __construct($load) {
- /// load the database helper
- $this->db = new DatabaseHelper();
- /// load the current session
- if (array_key_exists('jwt', $_SESSION)) {
- $this->get_session($_SESSION['jwt']);
- } else {
- $this->session = NULL;
- };
- /// init other vars
- $this->users = array();
- $this->user = NULL;
- }
-
- /**
- * Loads current session
- * @param string $jwt - the user provided JWT
- */
- private function get_session($jwt) {
- $query = $this->db
- ->select("_api.verify_jwt(?) AS user_id;");
- $result = $query->row($jwt);
- $user_id = $result['user_id'];
- if ($user_id) {
- $this->session = array(
- 'id' => $user_id,
- 'jwt' => $jwt
- );
- $user = $this->user();
- if ($user === FALSE) {
- /// valid jwt for invalid user!!!
- $this->session = NULL;
- $this->user = NULL;
- }
- }
- }
-
- /**
- * Gets the stamp for a asset path
- * @param string $path
- */
- private function asset_stamp($path): int {
- $root = $GLOBALS['webroot'];
- $path = $root . '/../public/' . $path;
- return filemtime($path);
- }
-
- /**
- * Loads a css html link
- * @param string $path - the path to the css file
- */
- public function link_css($path) {
- $stamp = $this->asset_stamp($path);
- return '<link rel="stylesheet" href="/public/' . $path . '?stamp=' . $stamp . '">';
- }
-
- /**
- * Loads a js html link
- * @param string $path - the path to the js file
- */
- public function link_js($path) {
- $stamp = $this->asset_stamp($path);
- return '<script src="/public/'. $path . '?stamp=' . $stamp . '"></script>';
- }
-
- /**
- * Gets the current user
- */
- public function user() {
- if ($this->user) {
- return $this->user;
- }
- if ($this->session) {
- $this->user = $this->db
- ->select('*')
- ->from('api.user')
- ->where('id')
- ->eq($this->session['id'])
- ->row();
- return $this->user;
- }
- return NULL;
- }
-
- /**
- * Formats a date
- * @param string $date - the data in RFC3999 format
- * @returns the formatted date
- */
- public function date($date) {
- $date=date_create($date);
- return date_format($date, "Y-m-d D H:m");
- }
-
-}
-
-?>
diff --git a/src/web/_model/people.php b/src/web/_model/people.php
new file mode 100644
index 0000000..bf540cf
--- /dev/null
+++ b/src/web/_model/people.php
@@ -0,0 +1,72 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+class People_model extends XSS_Model {
+
+ private function get_filted_query($select): DatabaseQuery {
+ $filter_type = $this->get_string('filter');
+ $filter_uid = $this->get_int('uid');
+ $max = $this->get_int('max');
+ $query = $this->db()
+ ->select($select)
+ ->from('api.user u');
+
+ if ($filter_type && $filter_uid) {
+ switch ($filter_type) {
+ // only show followers
+ case 'follower':
+ $query = $query
+ ->join('xssbook.follow f', 'f.follower_id = u.id AND f.followee_id', 'INNER')
+ ->eq($filter_uid)
+ ->where('f.value = TRUE');
+ break;
+ // only show followees
+ case 'followee':
+ $query = $query
+ ->join('xssbook.follow f', 'f.followee_id = u.id AND f.follower_id', 'INNER')
+ ->eq($filter_uid)
+ ->where('f.value = TRUE');
+ break;
+ }
+ }
+
+ if ($max) {
+ $query = $query
+ ->where('u.id')
+ ->le($max);
+ }
+
+ return $query;
+ }
+
+ public function get_people(): array {
+ $filter_type = $this->get_string('filter');
+ $filter_uid = $this->get_int('uid');
+ $page = $this->get_int('page', 0);
+
+ $page_size = PEOPLE_PAGE_SIZE;
+ $offset = $page_size * $page;
+
+ $users = $this->get_filted_query('u.*')
+ ->order_by('u.id', 'DESC')
+ ->offset($offset)
+ ->limit($page_size)
+ ->rows();
+
+ $count = $this->get_filted_query('COUNT(u.id) AS count')
+ ->row()['count'];
+
+ $max = 0;
+
+ foreach ($users as $user)
+ $max = max($max, $user['id']);
+
+ return array(
+ 'users' => $users,
+ 'count' => $count,
+ 'page_size' => $page_size,
+ 'max_id' => $max,
+ 'filter_type' => $filter_type,
+ 'filter_uid' => $filter_uid,
+ );
+ }
+}
diff --git a/src/web/_model/profile.php b/src/web/_model/profile.php
new file mode 100644
index 0000000..d35cc46
--- /dev/null
+++ b/src/web/_model/profile.php
@@ -0,0 +1,70 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Profile_model extends XSS_Model {
+
+ private $auth_model;
+
+ function __construct() {
+ $this->auth_model = $this->load_model('auth');
+ }
+
+ public function get_data(): ?array {
+ $uid = $this->get_int('id');
+ $session = $this->auth_model->session();
+
+ if (!$uid && $session)
+ $uid = $session['id'];
+ if (!$uid)
+ return NULL;
+
+ $user = $this->db()
+ ->select('*')
+ ->from('api.user u')
+ ->where('u.id')
+ ->eq($uid)
+ ->row();
+
+ if (!$user)
+ return NULL;
+
+ // am i following $uid?
+ $following = FALSE;
+ $following_id = NULL;
+ // is $uid following me?
+ $followed = FALSE;
+
+ if ($session) {
+ $sid = $session['id'];
+ // am i following $uid?
+ $res = $this->db()
+ ->select('f.value, f.id')
+ ->from('xssbook.follow f')
+ ->where('f.follower_id')
+ ->eq($sid)
+ ->where('f.followee_id')
+ ->eq($uid)
+ ->row();
+ $following = $res ? $res['value'] : FALSE;
+ $following_id = $res ? $res['id'] : NULL;
+ // is $uid following me?
+ $res = $this->db()
+ ->select('f.value')
+ ->from('xssbook.follow f')
+ ->where('f.follower_id')
+ ->eq($uid)
+ ->where('f.followee_id')
+ ->eq($sid)
+ ->row();
+ $followed = $res ? $res['value'] : FALSE;
+ }
+
+ $data = parent::get_data();
+ $data['user'] = $user;
+ $data['following'] = $following;
+ $data['following_id'] = $following_id;
+ $data['followed'] = $followed;
+
+ $name = $this->format_name($user);
+ $data['title'] .= " - $name";
+ return $data;
+ }
+}
diff --git a/src/web/_model/request.php b/src/web/_model/request.php
deleted file mode 100644
index 4cce07a..0000000
--- a/src/web/_model/request.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Request_model extends Model {
-
- function __construct($load) {
- parent::__construct($load);
- }
-
- /**
- * Loads a string from the GET request
- * @param string $key - the name for the query param
- * @param string $default - the default value if not exists
- */
- public function get_str($key, $default = NULL): string | NULL {
- if (!array_key_exists($key, $_GET)) {
- return $default;
- } else {
- return $_GET[$key];
- }
- }
-
- /**
- * Loads a number from the GET request
- * @param string $key - the name for the query param
- * @param int $default - the default value if not exists
- */
- public function get_int($key, $default = NULL): int | NULL {
- if (!array_key_exists($key, $_GET)) {
- return $default;
- } else {
- $val = $_GET[$key];
- $val = intval($val);
- if ($val < 0) {
- return 0;
- } else {
- return $val;
- }
- }
- }
-
-}
diff --git a/src/web/_model/settings.php b/src/web/_model/settings.php
new file mode 100644
index 0000000..9748f26
--- /dev/null
+++ b/src/web/_model/settings.php
@@ -0,0 +1,3 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+class Settings_model extends XSS_Model {
+}
diff --git a/src/web/_views/modal/about.php b/src/web/_views/_modal/about.php
index 4bc7a4f..4bc7a4f 100644
--- a/src/web/_views/modal/about.php
+++ b/src/web/_views/_modal/about.php
diff --git a/src/web/_views/modal/new_post.php b/src/web/_views/_modal/new_post.php
index 66e6561..aff19a5 100644
--- a/src/web/_views/modal/new_post.php
+++ b/src/web/_views/_modal/new_post.php
@@ -1,31 +1,28 @@
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
<?php /* vi: syntax=php */ ?>
-<?php
- $user = $this->main->user();
-?>
<form id="new-post-form">
<div class="modal-content new-post-modal">
<div class="row">
- <?=pfp($user)?>
+ <?=pfp($session)?>
<div class="col ml">
- <strong><?=$user['first_name'] . ' ' . $user['last_name']?></strong>
- <span class="subtext"><?=ucfirst(lang('now'))?></span>
+ <strong><?=$session['first_name'] . ' ' . $session['last_name']?></strong>
+ <span class="subtext"><?=ucfirst(lang('now'))?></span>
</div>
</div>
<textarea
type="text"
name="content"
id="new-post-content"
- placeholder="<?=ucfirst(lang('action_new_post_text', sub: [$user['first_name']]))?>"
+ placeholder="<?=ucfirst(lang('action_new_post_text', sub: [$session['first_name']]))?>"
></textarea>
</div>
<div class="modal-footer">
- <?=ilang('action_submit',
- id: 'new-post-submit',
- class: 'btn btn-submit btn-alt grow',
- attrs: array('type' => 'submit'),
- button: TRUE
- )?>
+ <?=ilang('action_submit',
+ id: 'new-post-submit',
+ class: 'btn btn-submit btn-alt grow',
+ attrs: array('type' => 'submit'),
+ type: 'button',
+ )?>
</div>
</form>
<script>
@@ -44,7 +41,7 @@
const onPost = function(data) {
let id = data[0].id;
$.get({
- url: '/_util/post/post?id=' + id,
+ url: '/_post/post?id=' + id,
success: getPost
});
}
diff --git a/src/web/_views/modal/register.php b/src/web/_views/_modal/register.php
index 5c76fe9..2126d0d 100644
--- a/src/web/_views/modal/register.php
+++ b/src/web/_views/_modal/register.php
@@ -125,7 +125,7 @@
id: 'register-submit',
class: 'btn btn-submit btn-alt grow',
attrs: array('type' => 'submit'),
- button: TRUE
+ type: 'button',
)?>
</div>
</form>
diff --git a/src/web/_views/template/comment.php b/src/web/_views/_template/comment.php
index ceac588..b947ff6 100644
--- a/src/web/_views/template/comment.php
+++ b/src/web/_views/_template/comment.php
@@ -1,14 +1,11 @@
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
<?php /* vi: syntax=php */ ?>
-<?php
- $format_model = $this->load->model('format');
-?>
<div class="comment row mt">
<?=pfp($user)?>
<div class="ml col sub-card">
<div class="row">
- <strong><?=$format_model->name($user)?></strong>
- <span class="subtext ml"><?=$this->main->date($comment['created'])?></span>
+ <strong><?=$this->format_name($user)?></strong>
+ <span class="subtext ml"><?=$this->format_date($comment['created'])?></span>
</div>
<?=$comment['content']?>
</div>
diff --git a/src/web/_views/template/error.php b/src/web/_views/_template/error.php
index 2e02cb1..2e02cb1 100644
--- a/src/web/_views/template/error.php
+++ b/src/web/_views/_template/error.php
diff --git a/src/web/_views/template/modal.php b/src/web/_views/_template/modal.php
index 2a041a7..8e4545d 100644
--- a/src/web/_views/template/modal.php
+++ b/src/web/_views/_template/modal.php
@@ -9,6 +9,6 @@
class: 'btn btn-action modal-close',
)?>
</div>
- <?php $this->view('modal/' . $content) ?>
+ <?php $this->view('_modal/' . $content, $data) ?>
</div>
</div>
diff --git a/src/web/_views/template/post.php b/src/web/_views/_template/post.php
index 48f8bb6..f7f5de2 100644
--- a/src/web/_views/template/post.php
+++ b/src/web/_views/_template/post.php
@@ -5,14 +5,13 @@
<?=pfp($user)?>
<div class="col ml">
<strong><?=$user['first_name'] . ' ' . $user['last_name']?></strong>
- <span class="subtext"><?=$this->main->date($post['created'])?></span>
+ <span class="subtext"><?=$this->format_date($post['created'])?></span>
</div>
</div>
<p>
<?=$post['content']?>
</p>
<?php
- $self = $this->main->user();
$liked = $post['like_id'] ? 'btn-primary' : '';
$post_attrs = array(
'postId' => $post['id']
@@ -22,7 +21,7 @@
}
?>
<span class="likes subtext"><span class="count"><?=$post['like_count']?></span><?=' ' . ucfirst(lang('likes'))?></span>
-<?php if ($self): ?>
+<?php if ($session): ?>
<hr>
<div class="row">
<?=ilang('action_like',
@@ -30,7 +29,7 @@
attrs: $post_attrs
)?>
<?=ilang('action_comment', class: 'btn grow action-comment',
- click: '$(\'#action-new-comment-' . $post['id'] . '\').focus()'
+ onclick: '$(\'#action-new-comment-' . $post['id'] . '\').focus()'
)?>
</div>
<hr>
@@ -46,7 +45,7 @@
$total = $post['comment_count'];
if ($loaded >= $page_size && $page_size < $total) {
- ilang('action_load_comments',
+ echo ilang('action_load_comments',
class: 'action-load-comments btn btn-blend mt',
attrs: array(
'postId' => $post['id'],
@@ -60,9 +59,9 @@
?>
</div>
-<?php if ($self): ?>
+<?php if ($session): ?>
<div class="row pb">
- <?=pfp($self)?>
+ <?=pfp($session)?>
<form class="ml action-new-comment-form row">
<input
type="hidden"
diff --git a/src/web/_views/template/posts.php b/src/web/_views/_template/posts.php
index ed79688..4202e67 100644
--- a/src/web/_views/template/posts.php
+++ b/src/web/_views/_template/posts.php
@@ -7,9 +7,16 @@
$total = $pdata['total'];
$max = $pdata['max'];
$filterUid = $pdata['filter_uid'];
-
+?>
+<?php if ($loaded == 0): ?>
+ <div id="no-posts" class="card">
+ <span class="no-posts-title mb"><?=lang('no_posts_found')?></span>
+ <span><?=random_value(explode("\n", lang('no_posts_found_ext')))?></span>
+ </div>
+<?php endif; ?>
+<?php
if ($loaded >= $page_size && $page_size < $total) {
- ilang('action_load_posts',
+ echo ilang('action_load_posts',
id: 'action-load-posts',
class: 'btn btn-blend grow mb mt',
attrs: array(
diff --git a/src/web/_views/template/toast.php b/src/web/_views/_template/toast.php
index 0a6a82f..902955c 100644
--- a/src/web/_views/template/toast.php
+++ b/src/web/_views/_template/toast.php
@@ -3,21 +3,17 @@
<?php
$params = array();
- if ($detail) {
- array_push($params, lang('api_column_' . $detail));
- }
+ if ($detail)
+ $params[] = lang('api_column_' . $detail);
- if ($hint) {
- array_push($params, $hint);
- }
+ if ($hint)
+ $params[] = $hint;
- $lang_msg = lang($msg, FALSE, sub: $params);
-
- if(!$lang_msg) {
+ $lang_msg = lang($msg, '', sub: $params);
+ if(!$lang_msg)
$lang_msg = $msg;
- } else {
+ else
$lang_msg = ucfirst($lang_msg);
- }
?>
<div class="toast <?=$type?>">
diff --git a/src/web/_views/apps/people/people.php b/src/web/_views/apps/people/people.php
deleted file mode 100644
index 5fc0d17..0000000
--- a/src/web/_views/apps/people/people.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */ ?>
-<?php /* vi: syntax=php */ ?>
-<?php
- foreach($users as $user) {
- $this->view('apps/people/card', array('user' => $user));
- }
-?>
diff --git a/src/web/_views/apps/auth/login.php b/src/web/_views/auth/main.php
index ac4cd02..9604770 100644
--- a/src/web/_views/apps/auth/login.php
+++ b/src/web/_views/auth/main.php
@@ -32,7 +32,7 @@
</div>
<?=ilang('action_login',
class: 'btn btn-primary btn-alt grow',
- button: TRUE,
+ type: 'button',
attrs: array('type' => 'submit')
)?>
<?/*=ilang('action_forgot_passwd',
@@ -43,7 +43,7 @@
<?=ilang('action_create_account',
id: 'action-register',
class: 'btn btn-success btn-alt grow',
- button: TRUE,
+ type: 'button',
attrs: array('type' => 'submit')
)?>
</div>
@@ -79,7 +79,7 @@
});
$('#action-register').on('click', function() {
- $.get( "/modal/register", function (data) {
+ $.get( "/_modal/register", function (data) {
$(document.body).append(data);
});
})
diff --git a/src/web/_views/apps/error/main.php b/src/web/_views/error/main.php
index bcc6f90..bcc6f90 100644
--- a/src/web/_views/apps/error/main.php
+++ b/src/web/_views/error/main.php
diff --git a/src/web/_views/head.php b/src/web/_views/head.php
index cca43a1..809ab36 100644
--- a/src/web/_views/head.php
+++ b/src/web/_views/head.php
@@ -4,23 +4,14 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
- <?php if ($this->main->session): ?>
- var jwtStr = <?=json_encode($this->main->session['jwt'])?>;
+ <?php if ($session): ?>
+ var jwtStr = <?=json_encode($session['jwt'])?>;
<?php else: ?>
var jwtStr = null;
<?php endif; ?>
</script>
- <?php
- foreach ($js_files as $js) {
- echo $this->main->link_js($js);
- }
- foreach ($css_files as $css) {
- echo $this->main->link_css($css);
- }
- ?>
+ <?=CRIMSON_META($this)?>
<title><?=$title?></title>
- <!-- haa haa hee hee hoo hoo -->
- <script src="https://unpkg.com/@ruffle-rs/ruffle"></script>
</head>
<body>
<div id="toast-container">
diff --git a/src/web/_views/header.php b/src/web/_views/header.php
index 7315afb..4ba15ed 100644
--- a/src/web/_views/header.php
+++ b/src/web/_views/header.php
@@ -1,7 +1,6 @@
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
<?php /* vim: syntax=php */ ?>
<?php
- $self = $this->main->user();
$this->view('head', $data);
?>
<header id="header">
@@ -11,41 +10,29 @@
<div class="center" :class="{hidden: !visible}">
<a
id="action-home"
- class="btn <?=$this->main->info['app'] == 'home' ? 'btn-primary btn-border' : ''?>"
+ class="btn <?=ROUTER->req['app'] == 'home' ? 'btn-primary btn-border' : ''?>"
href="/home"
- title="<?=ucfirst(lang('action_home_tip'))?>"
- >
+ title="<?=ucfirst(lang('action_home_tip'))?>">
<i class="mi mi-lg">home</i>
<span><?=ucfirst(lang('action_home_text'))?></span>
</a>
<a
id="action-people"
- class="btn <?=$this->main->info['app'] == 'people' ? 'btn-primary btn-border' : ''?>"
+ class="btn <?=ROUTER->req['app'] == 'people' ? 'btn-primary btn-border' : ''?>"
href="/people"
- title="<?=ucfirst(lang('action_people_tip'))?>"
- >
+ title="<?=ucfirst(lang('action_people_tip'))?>">
<i class="mi mi-lg">people</i>
<span><?=ucfirst(lang('action_people_text'))?></span>
</a>
- <!--a
- id="action-chat"
- class="btn <?=$this->main->info['app'] == 'chat' ? 'btn-primary btn-border' : ''?>"
- href="/chat"
- title="<?=lang('action_chat_tip')?>"
- >
- <i class="mi mi-lg">chat</i>
- <span><?=lang('action_chat_text')?></span>
- </a-->
</div>
<div class="right">
<button
id="action-hamburger"
title="<?=ucfirst(lang('action_hamburger_tip'))?>"
- class="btn mr"
- >
+ class="btn mr">
<i class="mi mi-lg">menu</i>
</button>
- <?php if($self): ?>
+ <?php if($session): ?>
<script>
var userMenu = null;
@@ -53,13 +40,13 @@
userMenu.toggleClass('hidden');
}
</script>
- <?=pfp($self, FALSE, 'toggleUserMenu()')?>
+ <?=pfp($session, FALSE, 'toggleUserMenu()')?>
<div class="card col hidden" id="user-menu">
<span class="user-menu-header row mr">
- <?=pfp($self, FALSE)?>
+ <?=pfp($session, FALSE)?>
<span class="col">
- <strong><?=$this->format_model->name($self)?></strong>
- <span class="subtext"><?=$self['username']?></span>
+ <strong><?=$this->format_name($session)?></strong>
+ <span class="subtext"><?=$session['username']?></span>
</span>
</span>
<hr>
@@ -67,13 +54,12 @@
'action_profile',
id: 'action-profile',
class: 'btn',
- href: '/profile?id=' . $self['id']
+ href: '/profile?id=' . $session['id']
)?>
<?=ilang(
'action_xssbook_about',
id: 'action-xssbook-about',
class: 'btn',
- click: 'viewAbout'
)?>
<?=ilang(
'action_settings',
@@ -94,7 +80,7 @@
</div>
<script>
$('#action-xssbook-about').on('click', function() {
- $.get( "/modal/about", function (data) {
+ $.get( "/_modal/about", function (data) {
$(document.body).append(data);
});
})
diff --git a/src/web/_views/apps/home/main.php b/src/web/_views/home/main.php
index 864034a..c9373d2 100644
--- a/src/web/_views/apps/home/main.php
+++ b/src/web/_views/home/main.php
@@ -1,22 +1,22 @@
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
<?php /* vi: syntax=php */ ?>
<main id="main">
-<?php if ($self): ?>
+<?php if ($session): ?>
<div id="new-post" class="card">
<div class="row grow">
- <?=pfp($self)?>
+ <?=pfp($session)?>
<a
id="action-new-post"
class="btn btn-alt grow ml"
autocomplete="off"
aria-label="<?=ucfirst(lang('action_new_post_tip'))?>"
>
- <?=ucfirst(lang('action_new_post_text', sub: [$self['first_name']]))?>
+ <?=ucfirst(lang('action_new_post_text', sub: [$session['first_name']]))?>
</a>
</div>
<script>
$('#action-new-post').on('click', function() {
- $.get( "/modal/new_post", function (data) {
+ $.get( "/_modal/new_post", function (data) {
$(document.body).append(data);
});
})
diff --git a/src/web/_views/apps/people/card.php b/src/web/_views/people/card.php
index 93b1350..7e040ba 100644
--- a/src/web/_views/apps/people/card.php
+++ b/src/web/_views/people/card.php
@@ -7,7 +7,7 @@
<div class="col">
<?=pfp($user, FALSE)?>
<div class="col ml">
- <span class="name"><?=$this->format_model->name($user)?></span>
+ <span class="name"><?=$this->format_name($user)?></span>
<span class="subtext"><?=$user['username']?></span>
</div>
</div>
diff --git a/src/web/_views/apps/people/footer.php b/src/web/_views/people/footer.php
index f18e031..f18e031 100644
--- a/src/web/_views/apps/people/footer.php
+++ b/src/web/_views/people/footer.php
diff --git a/src/web/_views/apps/people/header.php b/src/web/_views/people/header.php
index b1099ec..b1099ec 100644
--- a/src/web/_views/apps/people/header.php
+++ b/src/web/_views/people/header.php
diff --git a/src/web/_views/apps/people/main.php b/src/web/_views/people/main.php
index ec84ab9..c602b2c 100644
--- a/src/web/_views/apps/people/main.php
+++ b/src/web/_views/people/main.php
@@ -1,18 +1,22 @@
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
-<?php /* vi: syntax=php */ ?>
<div id="people-container" class="col">
-<?php
- $pdata = $this->people();
-?>
+ <?php $pdata = $this->people(); ?>
</div>
<?php
+
$loaded = count($pdata['users']);
$page_size = $pdata['page_size'];
$total = $pdata['count'];
$max = $pdata['max_id'];
$filter_uid = $pdata['filter_uid'];
$filer_type = $pdata['filter_type'];
+
?>
+<?php if ($loaded == 0): ?>
+ <div id="no-people" class="card">
+ <?=lang('no_people_found')?>
+ </div>
+<?php endif; ?>
<?php if ($loaded >= $page_size && $page_size < $total): ?>
<?=ilang('action_load_users',
id: 'action-load-users',
diff --git a/src/web/_views/people/people.php b/src/web/_views/people/people.php
new file mode 100644
index 0000000..8726f1d
--- /dev/null
+++ b/src/web/_views/people/people.php
@@ -0,0 +1,5 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+foreach($users as $user) {
+ $this->view('people/card', array('user' => $user));
+}
+?>
diff --git a/src/web/_views/apps/profile/main.php b/src/web/_views/profile/main.php
index b2ad496..3e7129c 100644
--- a/src/web/_views/apps/profile/main.php
+++ b/src/web/_views/profile/main.php
@@ -11,47 +11,47 @@
<div class="col content grow">
<div class="row grow">
<div class="col mb">
- <strong class="name"><?=$this->format_model->name($user)?></strong>
+ <strong class="name"><?=$this->format_name($user)?></strong>
<span class="subtext"><?=$user['follower_count'] . ' ' . ucfirst(lang('followers'))?></span>
</div>
<?php if (
- $this->main->session &&
- (!isset($self) || $self['id'] != $user['id'])
+ $session &&
+ ($session['id'] != $user['id'])
): ?>
<div class="follow">
<?=ilang(
'action_follow',
id: 'action-follow-follow',
class: 'btn btn-alt',
+ sub: [$user['first_name']],
style: (!$following && !$followed) ? '' : 'display: none',
- sub: [$user['first_name']]
)?>
<?=ilang(
'action_follow_back',
id: 'action-follow-follow-back',
class: 'btn btn-alt',
+ sub: [$user['first_name']],
style: (!$following && $followed) ? '' : 'display: none',
- sub: [$user['first_name']]
)?>
<?=ilang(
'action_following',
id: 'action-follow-following',
class: 'btn btn-alt btn-primary',
+ sub: [$user['first_name']],
style: ($following && !$followed) ? '' : 'display: none',
- sub: [$user['first_name']]
)?>
<?=ilang(
'action_friends',
id: 'action-follow-friends',
class: 'btn btn-alt btn-primary',
+ sub: [$user['first_name']],
style: ($following && $followed) ? '' : 'display: none',
- sub: [$user['first_name']]
)?>
</div>
<script>
let following = <?=json_encode($following)?>;
+ let followingId = <?=json_encode($following_id)?>;
let followed = <?=json_encode($followed)?>;
- let followId = <?=json_encode($follow_id)?>;
let followee_id = <?=json_encode($user['id'])?>;
let btns = {};
@@ -84,15 +84,15 @@
}
const onPostFollow = (data) => {
- followId = data[0].id;
+ followingId = data[0].id;
following = true;
updateFollow();
}
const onClickFollow = () => {
- if (followId) {
+ if (followingId) {
$.ajax({
- url: '/api/follow?id=eq.' + followId,
+ url: '/api/follow?id=eq.' + followingId,
method: 'PATCH',
data: JSON.stringify({ followee_id, value: !following }),
success: onPatchFollow
@@ -181,7 +181,7 @@
</tr>
<tr>
<td><strong><?=ucfirst(lang('about_general_birth_date'))?></strong></td>
- <td><?=$this->main->date($user['birth_date'])?></td>
+ <td><?=$this->format_date($user['birth_date'])?></td>
</tr>
</table>
<h1><?=ucfirst(lang('about_stats'))?></h1>
@@ -204,11 +204,11 @@
</tr>
<tr>
<td><strong><?=ucfirst(lang('about_stats_joined'))?></strong></td>
- <td><?=$this->main->date($user['created'])?></td>
+ <td><?=$this->format_date($user['created'])?></td>
</tr>
<tr>
<td><strong><?=ucfirst(lang('about_stats_seen'))?></strong></td>
- <td><?=$this->main->date($user['seen'])?></td>
+ <td><?=$this->format_date($user['seen'])?></td>
</tr>
</table>
</div>
diff --git a/src/web/_views/apps/settings/main.php b/src/web/_views/settings/main.php
index 2033acc..4401fe1 100644
--- a/src/web/_views/apps/settings/main.php
+++ b/src/web/_views/settings/main.php
@@ -1,9 +1,6 @@
-<?php /* Copyright (c) 2024 Freya Murphy */ ?>
-<?php /* vi: syntax=php */ ?>
+<?php /* Copyright (c) 2024 Freya Murphy */
-<?php
-
-$user = $this->main->user();
+$user = $session;
function __create_form($user, $col) {
$ph = ucfirst(lang('ph_' . $col));
diff --git a/src/web/config.php b/src/web/config.php
new file mode 100644
index 0000000..3ca2bbd
--- /dev/null
+++ b/src/web/config.php
@@ -0,0 +1,56 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+// CONFIG
+// config values needed across the website
+//
+// domain - the default domain for the website
+//
+// allowed_hosts - accepted domains to use for the website
+//
+// base_path - the base path the website is located at
+//
+// theme_color - html hex color used for browser metadata
+//
+// routes - array of regex keys that match the request path and
+// - place it with the value if it matches
+// - e.g. '' => 'home' sends / to /home
+//
+// style - single or list of css styles to load on specific routes
+//
+// js - single or list of js script to load on specific routes
+//
+// autoload - list of directories to autoload all PHP files in them
+//
+define('SITE_CONFIG', array(
+ /* core settings */
+ 'domain' => 'xssbook.com',
+ 'allowed_hosts' => ['xssbook.com'],
+ 'base_path' => '/',
+ 'theme_color' => '#1778f2',
+ /* route overides */
+ 'routes' => array(
+ 'manifest.json' => '_meta/manifest',
+ ),
+ /* css to load on each route */
+ 'style' => array(
+ '' => 'css/common.css',
+ 'home' => ['css/home.css', 'css/post.css'],
+ 'auth' => 'css/auth.css',
+ 'people' => 'css/people.css',
+ 'profile' => ['css/profile.css', 'css/people.css', 'css/post.css'],
+ 'settings' => 'css/settings.css',
+ 'error' => 'css/error.css',
+ ),
+ /* js to load on each route */
+ 'js' => array(
+ '' => ['js/thirdparty/jquery.min.js', 'js/lib.js', 'js/modal.js'],
+ 'home' => 'js/post.js',
+ 'profile' => 'js/post.js',
+ ),
+ /* directories to autoload php code */
+ 'autoload' => array('/lib'),
+));
+
+define('POST_PAGE_SIZE', 10);
+define('COMMENT_PAGE_SIZE', 5);
+define('PEOPLE_PAGE_SIZE', 24);
diff --git a/src/web/config/aesthetic.php b/src/web/config/aesthetic.php
deleted file mode 100644
index 5a66660..0000000
--- a/src/web/config/aesthetic.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Aesthetic {
-
- private $config;
-
- function __construct() {
- $this->config = array(
- '_common' => array(
- 'js' => [
- 'js/thirdparty/jquery.min.js',
- 'js/lib.js',
- 'js/modal.js',
- ],
- 'css' => [
- 'css/common.css'
- ],
- ),
- 'error' => array(
- 'css' => [
- 'css/error.css'
- ],
- ),
- 'home' => array(
- 'js' => [
- 'js/post.js',
- ],
- 'css' => [
- 'css/home.css',
- 'css/post.css'
- ],
- ),
- 'auth' => array(
- 'css' => [
- 'css/auth.css'
- ],
- ),
- 'people' => array(
- 'css' => [
- 'css/people.css'
- ],
- ),
- 'profile' => array(
- 'js' => [
- 'js/post.js',
- ],
- 'css' => [
- 'css/profile.css',
- 'css/people.css',
- 'css/post.css'
- ],
- ),
- 'settings' => array(
- 'css' => [
- 'css/settings.css'
- ]
- ),
- );
- }
- /**
- * @param mixed $route
- * @return array<string,>
- */
- function get_files($route): array {
- $js_files = $this->config['_common']['js'];
- $css_files = $this->config['_common']['css'];
-
- if (array_key_exists($route, $this->config)) {
- $config = $this->config[$route];
- if (array_key_exists('js', $config)) {
- $js_files = array_merge($js_files, $config['js']);
- }
- if (array_key_exists('css', $config)) {
- $css_files = array_merge($css_files, $config['css']);
- }
- }
-
- return array(
- 'js_files' => $js_files,
- 'css_files' => $css_files,
- );
- }
-
-}
diff --git a/src/web/config/routes.php b/src/web/config/routes.php
deleted file mode 100644
index 20b499a..0000000
--- a/src/web/config/routes.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-
-$routes = array();
-$routes['home'] = 'apps/home';
-$routes['error'] = 'apps/error';
-$routes['auth'] = 'apps/auth';
-$routes['people'] = 'apps/people';
-$routes['profile'] = 'apps/profile';
-$routes['settings'] = 'apps/settings';
-
-$routes[''] = '_index';
-$routes['manifest.json'] = '_meta/manifest';
diff --git a/src/web/core/_controller.php b/src/web/core/_controller.php
deleted file mode 100644
index 3502ea5..0000000
--- a/src/web/core/_controller.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-abstract class Controller {
-
- // the main model
- public $main;
-
- // the loader
- public $load;
-
- // the database
- public $db;
-
- // the format model
- protected $format_model;
-
- /**
- * Creates a constructor
- * @param Loader $load - the website loaded object
- */
- function __construct($load) {
- $this->load = $load;
- $this->main = $this->load->model('main');
- $this->db = $this->main->db;
-
- $info = $this->main->info;
- $lang = $info['lang'];
- $this->load->lang($lang);
- $app = $info['app'];
- if ($app) {
- $this->load->app_lang($lang, $app);
- }
-
- $this->format_model = $this->load->model('format');
- }
-
- public function index() {}
-
- public function redirect($link) {
- header('Location: '. $link, true, 301);
- die();
- }
-
- protected function view($__name, $data = array()) {
- $__root = $GLOBALS['webroot'];
- $__path = $__root . '/_views/' . $__name . '.php';
- if (is_file($__path)) {
- extract($data);
- require($__path);
- return;
- }
- }
-
- protected function is_ajax(): bool {
- $_POST = json_decode(
- file_get_contents("php://input"), true
- );
- return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
- }
-
- protected function error($code): void {
- $_GET['code'] = $code;
- $this->main->info['app'] = 'error';
- $error_controller = $this->load->controller('apps/error');
- $error_controller->index();
- die();
- }
-
-}
-?>
diff --git a/src/web/core/_model.php b/src/web/core/_model.php
deleted file mode 100644
index dfc7163..0000000
--- a/src/web/core/_model.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-abstract class Model {
- // the main model
- // shared by all controllers and models
- public $main;
- public $load;
-
- // the database
- public $db;
-
- private $config;
-
- /**
- * Creates a model
- * @param Loader $load - the main loader object
- */
- function __construct($load) {
- $this->load = $load;
- $this->main = $this->load->model('main');
- $this->db = $this->main->db;
- $this->config = new Aesthetic();
- }
-
- /**
- * @returns the base model data
- */
- public function get_data(): ?array {
- $data = array();
- $data['self'] = $this->main->user();
-
- $info = $this->main->info;
- $app = $info['app'];
-
- if ($app) {
- $files = $this->config->get_files($app);
- $data = array_merge($data, $files);
- } else {
- $files = $this->config->get_files();
- $data = array_merge($data, $files);
- }
-
- return $data;
- }
-}
diff --git a/src/web/core/database.php b/src/web/core/database.php
deleted file mode 100644
index 25cb5ba..0000000
--- a/src/web/core/database.php
+++ /dev/null
@@ -1,282 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-
-class DatabaseQuery {
-
- private $conn;
- private $query;
-
- private $where;
- private $set;
-
- private $param;
-
- function __construct($conn) {
- $this->conn = $conn;
- $this->query = '';
-
- $this->set = FALSE;
- $this->where = FALSE;
- $this->param = array();
- }
-
- ///
- /// ARBITRARY QUERY
- ///
-
- public function query($query) {
- $this->query .= $query;
- return $this;
- }
-
- ///
- /// SELECT
- ///
-
- public function select($select) {
- $this->query .= "SELECT $select\n";
- return $this;
- }
-
- public function from($from) {
- $this->query .= "FROM $from\n";
- return $this;
- }
-
- ///
- /// INSERT
- ///
-
- public function insert_into($insert, ...$columns) {
- $this->query .= "INSERT INTO $insert\n (";
- foreach ($columns as $idx => $column) {
- if ($idx !== 0) {
- $this->query .= ",";
- }
- $this->query .= $column;
- }
- $this->query .= ")\n";
- return $this;
- }
-
- public function values(...$values) {
- $this->query .= "VALUES (";
- foreach ($values as $idx => $value) {
- if ($idx !== 0) {
- $this->query .= ",";
- }
- $this->query .= "?";
- array_push($this->param, $value);
- }
- $this->query .= ")\n";
- return $this;
- }
-
- ///
- /// WHERE
- ///
-
- public function where($cond) {
- if (!$this->where) {
- $this->where = TRUE;
- $this->query .= "WHERE ";
- } else {
- $this->query .= "AND ";
- }
- $this->query .= "$cond ";
- return $this;
- }
-
- public function where_in($column, $array) {
- if (!$this->where) {
- $this->where = TRUE;
- $this->query .= "WHERE ";
- } else {
- $this->query .= "AND ";
- }
- if (empty($array)) {
- $this->query .= "FALSE\n";
- return $this;
- }
- $in = $this->in($array);
- $this->query .= "$column $in\n";
- return $this;
- }
-
- private function in($array) {
- $in = 'IN (';
- foreach ($array as $idx => $item) {
- if ($idx != 0) {
- $in .= ",";
- }
- $in .= "?";
- array_push($this->param, $item);
- }
- $in .= ")";
- return $in;
- }
-
- ///
- /// OPERATORS
- ///
-
- public function like($item) {
- $this->query .= "LIKE ?\n";
- array_push($this->param, $item);
- return $this;
- }
-
- public function eq($item) {
- $this->query .= "= ?\n";
- array_push($this->param, $item);
- return $this;
- }
-
- public function ne($item) {
- $this->query .= "<> ?\n";
- array_push($this->param, $item);
- return $this;
- }
-
- public function lt($item) {
- $this->query .= "< ?\n";
- array_push($this->param, $item);
- return $this;
- }
-
- public function le($item) {
- $this->query .= "<= ?\n";
- array_push($this->param, $item);
- return $this;
- }
-
- ///
- /// JOINS
- ///
-
- public function join($table, $on, $type = 'LEFT') {
- $this->query .= "$type JOIN $table ON $on\n";
- return $this;
- }
-
- ///
- /// LIMIT, OFFSET, ORDER
- ///
-
- public function limit($limit) {
- $this->query .= "LIMIT ?\n";
- array_push($this->param, $limit);
- return $this;
- }
-
- public function offset($offset) {
- $this->query .= "OFFSET ?\n";
- array_push($this->param, $offset);
- return $this;
- }
-
- public function order_by($column, $order = 'ASC') {
- $this->query .= "ORDER BY " . $column . ' ' . $order . ' ';
- return $this;
- }
-
- ///
- /// COLLECT
- ///
-
- public function rows(...$params) {
- $args = $this->param;
- foreach ($params as $param) {
- array_push($args, $param);
- }
- $stmt = $this->conn->prepare($this->query);
- try {
- $stmt->execute($args);
- } catch (Exception $ex) {
- echo $ex;
- echo '<br> >> caused by <<<br>';
- echo str_replace("\n", "<br>", $this->query);
- }
- return $stmt->fetchAll(PDO::FETCH_ASSOC);
- }
-
- public function row(...$params) {
- $args = $this->param;
- foreach ($params as $param) {
- array_push($args, $param);
- }
- $stmt = $this->conn->prepare($this->query);
- $stmt->execute($args);
- return $stmt->fetch(PDO::FETCH_ASSOC);
- }
-
- public function execute(...$params) {
- $args = $this->param;
- foreach ($params as $param) {
- array_push($args, $param);
- }
- $stmt = $this->conn->prepare($this->query);
- try {
- $stmt->execute($args);
- return TRUE;
- } catch (Exception $_e) {
- echo $_e;
- echo '<br> >> caused by <<<br>';
- echo str_replace("\n", "<br>", $this->query);
- return FALSE;
- }
- }
-}
-
-/**
- * DatabaseHelper
- * allows queries on the
- * postgres database
- */
-class DatabaseHelper {
-
- private $conn;
-
- function __construct() {
- $this->conn = NULL;
- }
-
- private function connect() {
- if ($this->conn === NULL) {
- $user = getenv("POSTGRES_USER");
- $pass = getenv("POSTGRES_PASSWORD");
- $db = getenv("POSTGRES_DB");
- $host = 'db';
- $port = '5432';
-
- $conn_str = sprintf("pgsql:host=%s;port=%d;dbname=%s;user=%s;password=%s",
- $host,
- $port,
- $db,
- $user,
- $pass
- );
- $this->conn = new \PDO($conn_str);
- $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
- }
- return $this->conn;
- }
-
- public function select($select) {
- $conn = $this->connect();
- $query = new DatabaseQuery($conn);
- return $query->select($select);
- }
-
- public function insert_into($insert, ...$columns) {
- $conn = $this->connect();
- $query = new DatabaseQuery($conn);
- return $query->insert_into($insert, ...$columns);
- }
-
- public function query($query_str) {
- $conn = $this->connect();
- $query = new DatabaseQuery($conn);
- return $query->query($query_str);
- }
-}
-
diff --git a/src/web/core/loader.php b/src/web/core/loader.php
deleted file mode 100644
index 2091533..0000000
--- a/src/web/core/loader.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Loader {
-
- // keep track of what has been loaded
- private $loaded;
-
- function __construct() {
- $this->loaded = array();
- }
-
- /**
- * Loads a $type of object from a $dir with a given $name
- * @param string $name - the name of the object to load
- * @param string $dir - the directory theese objects are stored in
- * @param string $type - the type of the object
- */
- private function load_type($name, $dir, $type): object|NULL {
- $path = $dir . '/' . $name . '.php';
- if (array_key_exists($path, $this->loaded)) {
- return $this->loaded[$path];
- }
-
- if (!file_exists($path)) {
- return NULL;
- }
-
- $parts = explode('/', $name);
- $part = end($parts);
- $class = ucfirst($part) . '_' . $type;
- require($path);
-
- $ref = NULL;
- try {
- $ref = new ReflectionClass($class);
- } catch (Exception $_e) {}
-
- if ($ref === NULL) {
- return NULL;
- }
-
- $obj = $ref->newInstance($this);
- $this->loaded[$path] = $obj;
-
- return $obj;
- }
-
- /**
- * Loads a model
- * @param string $name - the name of the model to load
- */
- public function model($name): object|NULL {
- $root = $GLOBALS['webroot'];
- $dir = $root . '/_model';
- return $this->load_type($name, $dir, 'model');
- }
-
- /**
- * Loads a controller
- * @param string $name - the name of the controller to load
- */
- public function controller($name): Controller|NULL {
- $root = $GLOBALS['webroot'];
- $dir = $root . '/_controller';
- return $this->load_type($name, $dir, 'controller');
- }
-
- /**
- * Loads the given common lang
- * @param string $lang_code 0 the language code
- */
- public function lang($lang_code): void {
- $dir = $GLOBALS['webroot'] . '/lang/' . $lang_code . '/';
- $lang = $GLOBALS['lang'];
- if ($handle = opendir($dir)) {
- while (false !== ($entry = readdir($handle))) {
- if ($entry === '.' || $entry === '..' || $entry === 'apps') {
- continue;
- }
- $path = $dir . $entry;
- require($path);
- }
- }
- $GLOBALS['lang'] = $lang;
- }
-
- /**
- * Loads a given app specific lang
- * @param string $lang_code - the language code
- * @param string $name - the name of the app
- */
- public function app_lang($lang_code, $name): void {
- $dir = $GLOBALS['webroot'] . '/lang/' . $lang_code . '/apps/';
- $file = $dir . $name . '.php';
- if (file_exists($file)) {
- $lang = $GLOBALS['lang'];
- require($dir . $name . '.php');
- $GLOBALS['lang'] = $lang;
- }
- }
-
-}
diff --git a/src/web/core/router.php b/src/web/core/router.php
deleted file mode 100644
index 557665b..0000000
--- a/src/web/core/router.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-class Router {
-
- // the loader
- private $load;
-
- // the main model
- private $main;
-
- /**
- * Creates a router
- * @param Loader $load - the main laoder object
- */
- function __construct($load) {
- $this->load = $load;
- $this->main = $this->load->model('main');
- }
-
- /**
- * @param string $path - the current request path
- * Gets the current route
- * @return array<string,mixed>
- */
- private function get_req_route($path): array {
- // trim the path
- $path = trim($path);
- // remove first '/'
- $path = substr($path, 1);
- // get path parts
- $parts = explode('/', $path);
-
- $len = count($parts);
-
- // get route info
- $route = array();
- // e.g. /
- if ($path === '') {
- $route = array(
- 'route' => '',
- 'slug' => 'index',
- );
- // e.g. /home /login
- } else if ($len === 1) {
- $route = array(
- 'route' => $parts[0],
- 'slug' => 'index',
- );
- // e.g. /home/posts
- } else {
- $route = array (
- 'route' => implode('/', array_slice($parts, 0, -1)),
- 'slug' => end($parts)
- );
- };
-
- $route['app'] = $route['route'];
- $routes = $GLOBALS['routes'];
- if (array_key_exists($route['route'], $routes)) {
- $route['route'] = $routes[$route['route']];
- }
-
- return $route;
- }
-
- /**
- * Gets the curret request info
- * @return array<string,mixed>
- */
- private function get_req(): array|bool {
- $method = $_SERVER['REQUEST_METHOD'];
-
- $uri = parse_url($_SERVER['REQUEST_URI']);
- if (!$uri) {
- return FALSE;
- }
-
- $path = $uri['path'];
-
- return array_merge(
- array(
- 'uri' => $uri,
- 'method' => $method,
- 'lang' => $this->get_lang(),
- ),
- $this->get_req_route($path),
- );
- }
-
- /**
- * Gets the current language
- * @return string
- */
- private function get_lang(): string {
- return 'en_US';
- }
-
- /**
- * Handles a router error code
- * @param int $code - the http error code
- * @param bool $recursed
- */
- private function handle_error($code, $recursed): void {
- if ($recursed) {
- die($code . ' (recursed)');
- }
-
- $this->main->info = array();
- $this->main->info['slug'] = 'index';
- $this->main->info['app'] = 'error';
- $this->main->info['route'] = 'apps/error';
- $this->main->info['lang'] = $this->get_lang();
- $req = $this->main->info;
- $_GET['code'] = $code;
-
- $this->handle_req($req, TRUE);
- }
-
- /**
- * @param array $req
- * @param bool $recursed
- */
- private function handle_req($req, $recursed = FALSE): void {
-
- if ($req === FALSE) {
- $this->handle_error(500, $recursed);
- return;
- }
-
- $controller = $this->load->controller($req['route']);
-
- if ($controller === NULL) {
- $this->handle_error(404, $recursed);
- return;
- }
-
- $ref = NULL;
- try {
- $ref = new ReflectionMethod($controller, $req['slug']);
- } catch (Exception $_e) {}
-
- if ($ref === NULL || !$ref->isPublic()) {
- $this->handle_error(404, $recursed);
- return;
-
- }
-
- $ref->invoke($controller);
- }
-
- /**
- * Handels the incomming reuqest
- */
- public function handle_request(): void {
- $req = $this->get_req();
- $this->main->info = $req;
- $this->handle_req($req);
- }
-
-}
diff --git a/src/web/helper/error.php b/src/web/helper/error.php
deleted file mode 100644
index 2b6959e..0000000
--- a/src/web/helper/error.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-
-function error_page($code, $msg) {
- $root = $GLOBALS['webroot'];
- error_reporting(E_ERROR | E_PARSE);
- http_response_code($code);
- require($root . '/_views/template/error.php');
- die();
-}
diff --git a/src/web/helper/lang.php b/src/web/helper/lang.php
deleted file mode 100644
index 3397d63..0000000
--- a/src/web/helper/lang.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-$lang = array();
-
-function lang($key, $default = NULL, $sub = NULL) {
- $lang = $GLOBALS['lang'];
- if(array_key_exists($key, $lang)) {
- if ($sub) {
- return sprintf($lang[$key], ...$sub);
- } else {
- return $lang[$key];
- }
- } else if ($default !== NULL) {
- return $default;
- } else {
- return $key;
- }
-}
-
-function ilang($key,
- $class = NULL,
- $style = NULL,
- $id = NULL,
- $href = NULL,
- $click = NULL,
- $attrs = array(),
- $sub = NULL,
- $button = FALSE,
-) {
- $text = ucfirst(lang($key . "_text", FALSE, sub: $sub));
- $tip = lang($key . "_tip", FALSE, sub: $sub);
- $icon = lang($key . "_icon", FALSE);
- $content = lang($key . "_content", FALSE);
-
- if ($click || $button) {
- echo '<button ';
- } else {
- echo '<a ';
- }
- if ($tip) {
- echo 'title="' . $tip . '" ';
- echo 'aria-label="' . $tip . '" ';
- }
- if ($class) {
- echo 'class="' . $class . '" ';
- }
- if ($style) {
- echo 'style="' . $style . '" ';
- }
- if ($id) {
- echo 'id="' . $id . '" ';
- }
- if ($click) {
- echo 'onclick="' . $click . '" ';
- }
- if ($href) {
- echo 'href="' . $href . '" ';
- }
- foreach ($attrs as $key => $attr) {
- echo $key . '="' . $attr . '" ';
- }
- echo '> ';
- if ($icon) {
- echo '<i class="' . $icon . '">';
- if ($content) {
- echo $content;
- }
- echo '</i>';
- }
- if ($text) {
- echo '<span';
- if ($icon) {
- echo ' style="margin-left: .5em;"';
- }
- echo '>' . $text . '</span>';
- }
- if ($click || $button) {
- echo '</button>';
- } else {
- echo '</a>';
- }
-}
diff --git a/src/web/index.php b/src/web/index.php
deleted file mode 100644
index 75c1b62..0000000
--- a/src/web/index.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-
-$webroot = dirname(__FILE__);
-
-// load all the helper files
-require($webroot . '/helper/image.php');
-require($webroot . '/helper/error.php');
-require($webroot . '/helper/lang.php');
-
-// load all the config files
-require($webroot . '/config/aesthetic.php');
-require($webroot . '/config/routes.php');
-
-// load all core files
-require($webroot . '/core/_controller.php');
-require($webroot . '/core/_model.php');
-require($webroot . '/core/database.php');
-require($webroot . '/core/loader.php');
-require($webroot . '/core/router.php');
-
-session_save_path('/var/lib/php/session');
-session_start();
-setcookie(
- session_name(),
- session_id(),
- array(
- 'expires' => time() + 60*60*24*7,
- 'path' => '/',
- 'domain' => NULL,
- 'secure' => FALSE,
- 'httponly' => FALSE,
- 'samesite' => 'Lax'
- )
-);
-
-function __init() {
- $load = new Loader();
- $router = new Router($load);
- $router->handle_request();
-};
-
-if (!file_exists('/status/ready')) {
- error_page(503, 'Service Unavailable');
-}
-
-__init();
diff --git a/src/web/lang/en_US/api_lang.php b/src/web/lang/api.php
index bc118dd..123052e 100644
--- a/src/web/lang/en_US/api_lang.php
+++ b/src/web/lang/api.php
@@ -29,5 +29,3 @@ $lang['api_unknown'] = 'An unknown error as occurred';
// toast messages
$lang['toast_date_empty'] = 'Birthday cannot be empty';
-
-?>
diff --git a/src/web/lang/en_US/apps/auth.php b/src/web/lang/auth.php
index fb9d758..b87ddd7 100644
--- a/src/web/lang/en_US/apps/auth.php
+++ b/src/web/lang/auth.php
@@ -1,4 +1,4 @@
-<?php
+<?php /* Copyright (c) 2024 Freya Murphy */
$lang['login'] = 'Login';
$lang['login_branding'] = 'Connect with javascript and the world around you on XSSBook.';
@@ -30,5 +30,3 @@ $lang['action_forgot_passwd_text'] = 'Forgot password?';
$lang['register_modal_title'] = 'Create New Account';
$lang['action_register_text'] = 'Register';
$lang['action_register_tip'] = 'Register';
-
-?>
diff --git a/src/web/lang/en_US/common_lang.php b/src/web/lang/common.php
index 073229f..8ed1df7 100644
--- a/src/web/lang/en_US/common_lang.php
+++ b/src/web/lang/common.php
@@ -1,9 +1,21 @@
<?php /* Copyright (c) 2024 Freya Murphy */
-$lang['version'] = 'Version 2.0.8';
+$lang['version'] = 'Version 2.1.0';
$lang['copyright'] = 'Freya Murphy © 2024';
-// Navigation Bar Lang
+// Defaults
+$lang['title'] = '';
+
+// General
+$lang['xssbook'] = 'XSSBook';
+$lang['action_submit_text'] = 'Submit';
+$lang['action_submit_tip'] = 'Submit';
+$lang['action_close_text'] = '';
+$lang['action_close_tip'] = 'Close';
+$lang['action_close_icon'] = 'mi mi-sm';
+$lang['action_close_content'] = 'close';
+
+// Header
$lang['action_home_text'] = 'Home';
$lang['action_home_tip'] = 'Goto your home page.';
$lang['action_people_text'] = 'People';
@@ -15,38 +27,13 @@ $lang['action_hamburger_tip'] = 'View header dropdown.';
$lang['action_login_text'] = 'Login';
$lang['action_login_tip'] = 'Login or signup';
-// Post lang
-$lang['action_like_text'] = 'Like';
-$lang['action_like_tip'] = 'Like this post.';
-$lang['action_like_icon'] = 'mi mi-sm';
-$lang['action_like_content'] = 'thumb_up';
-$lang['action_comment_text'] = 'Comment';
-$lang['action_comment_tip'] = 'Focus the comment box.';
-$lang['action_comment_icon'] = 'mi mi-sm';
-$lang['action_comment_content'] = 'comment';
-$lang['action_new_comment_text'] = 'Write a comment';
-$lang['action_new_comment_tip'] = 'Write a comment, then press enter to submit.';
-$lang['action_load_comments_text'] = 'Load more comments';
-$lang['action_load_comments_tip'] = 'Load more comments';
-
-// General
-$lang['action_submit_text'] = 'Submit';
-$lang['action_submit_tip'] = 'Submit';
-$lang['action_close_text'] = '';
-$lang['action_close_tip'] = 'Close';
-$lang['action_close_icon'] = 'mi mi-sm';
-$lang['action_close_content'] = 'close';
-
-// Modals
+// Modal
$lang['action_modal_close_text'] = '';
$lang['action_modal_close_tip'] = 'Close modal.';
$lang['action_modal_close_icon'] = 'mi mi-sm';
$lang['action_modal_close_content'] = 'close';
-$lang['new_post_modal_title'] = 'Author New Post';
-$lang['action_new_post_text'] = 'What\'s on your mind, %s';
-$lang['action_new_post_tip'] = 'Author a new post.';
-
+// About Modal
$lang['about_modal_title'] = 'XSSBook';
// User Menu
diff --git a/src/web/lang/en_US/error_lang.php b/src/web/lang/en_US/error_lang.php
deleted file mode 100644
index afecaa1..0000000
--- a/src/web/lang/en_US/error_lang.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php /* Copyright (c) 2024 Freya Murphy */
-
-$lang['error_400'] = 'Bad request';
-$lang['error_404'] = 'Resource not found';
-$lang['error_500'] = 'Whoops! Server error :(';
-$lang['error'] = 'An unknown error has occoured';
-
-?>
diff --git a/src/web/lang/en_US/apps/home.php b/src/web/lang/home.php
index a30eb88..a8bf849 100644
--- a/src/web/lang/en_US/apps/home.php
+++ b/src/web/lang/home.php
@@ -1,9 +1,7 @@
-<?php
+<?php /* Copyright (c) 2024 Freya Murphy */
$lang['title'] = 'Home';
// actions
$lang['action_load_posts_text'] = 'Load more posts';
$lang['action_load_posts_tip'] = 'Load more posts';
-
-?>
diff --git a/src/web/lang/en_US/apps/people.php b/src/web/lang/people.php
index 2bfc240..55204aa 100644
--- a/src/web/lang/en_US/apps/people.php
+++ b/src/web/lang/people.php
@@ -1,4 +1,4 @@
-<?php
+<?php /* Copyright (c) 2024 Freya Murphy */
$lang['title'] = 'Directory';
$lang['desc'] = 'Explore other people on xssbook!';
@@ -14,4 +14,4 @@ $lang['tbl_gender'] = 'Gender ';
$lang['action_load_users_text'] = 'Load more users';
$lang['action_load_users_tip'] = 'Load more users';
-?>
+$lang['no_people_found'] = 'No one is here... :(';
diff --git a/src/web/lang/post.php b/src/web/lang/post.php
new file mode 100644
index 0000000..39cb24d
--- /dev/null
+++ b/src/web/lang/post.php
@@ -0,0 +1,35 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+// Posts
+$lang['action_like_text'] = 'Like';
+$lang['action_like_tip'] = 'Like this post.';
+$lang['action_like_icon'] = 'mi mi-sm';
+$lang['action_like_content'] = 'thumb_up';
+
+$lang['no_posts_found'] = 'No posts here...';
+$lang['no_posts_found_ext'] =
+"We ate them all.
+They got lost in transit.
+All stuck in line at the DMV.
+Death has taken them.
+[REDACTED]
+They were non-RFC complient.
+Submit a formal complaint at your local IRS office.
+They are in jail for killing child processes.
+They didn't deem you worthy.
+Meta stole them for AI training.";
+
+// Comments
+$lang['action_comment_text'] = 'Comment';
+$lang['action_comment_tip'] = 'Focus the comment box.';
+$lang['action_comment_icon'] = 'mi mi-sm';
+$lang['action_comment_content'] = 'comment';
+$lang['action_new_comment_text'] = 'Write a comment';
+$lang['action_new_comment_tip'] = 'Write a comment, then press enter to submit.';
+$lang['action_load_comments_text'] = 'Load more comments';
+$lang['action_load_comments_tip'] = 'Load more comments';
+
+// New Post Modal
+$lang['new_post_modal_title'] = 'Author New Post';
+$lang['action_new_post_text'] = 'What\'s on your mind, %s';
+$lang['action_new_post_tip'] = 'Author a new post.';
diff --git a/src/web/lang/en_US/apps/profile.php b/src/web/lang/profile.php
index bb91e02..d7bbf2b 100644
--- a/src/web/lang/en_US/apps/profile.php
+++ b/src/web/lang/profile.php
@@ -1,6 +1,5 @@
-<?php
-
-$lang['title'] = '%s\'s profile';
+<?php /* Copyright (c) 2024 Freya Murphy */
+$lang['title'] = '';
$lang['joined'] = 'Joined: ';
$lang['seen'] = 'Seen: ';
@@ -42,5 +41,3 @@ $lang['about_stats_comments'] = 'Comments Created';
$lang['about_stats_following'] = 'Accounts Followed';
$lang['about_stats_joined'] = 'Date Joined';
$lang['about_stats_seen'] = 'Last Seen';
-
-?>
diff --git a/src/web/lang/en_US/apps/settings.php b/src/web/lang/settings.php
index 81ba0ec..537cdca 100644
--- a/src/web/lang/en_US/apps/settings.php
+++ b/src/web/lang/settings.php
@@ -1,4 +1,4 @@
-<?php
+<?php /* Copyright (c) 2024 Freya Murphy */
$lang['title'] = 'Settings';
diff --git a/src/web/lib/_base.php b/src/web/lib/_base.php
new file mode 100644
index 0000000..790bac9
--- /dev/null
+++ b/src/web/lib/_base.php
@@ -0,0 +1,61 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+trait XSS_Base {
+
+ /**
+ * Formats a users's name
+ * @param array $user - the $user
+ * @returns the user's formatted display name
+ */
+ public function format_name(array $user): string {
+ $name = '';
+ // first_name
+ if ($user['first_name'])
+ $name .= $user['first_name'];
+ // middle_name
+ if ($user['middle_name']) {
+ if ($name != '')
+ $name .= ' ';
+ $name .= $user['middle_name'];
+ }
+ // last_name
+ if ($user['last_name']) {
+ if ($name != '')
+ $name .= ' ';
+ $name .= $user['last_name'];
+ }
+ if ($name == '') {
+ $name = '@' . $user['username'];
+ }
+ return $name;
+ }
+
+ /**
+ * Formats a ISO date
+ * @param $iso_date the ISO date
+ */
+ public function format_date(string $iso_date): string
+ {
+ return date("Y-m-d D H:i", strtotime($iso_date));
+ }
+
+ /**
+ * Loads a STRING from $_GET, or returns $default on failure
+ */
+ public function get_string(string $key, ?string $default = NULL): ?string {
+ if (isset($_GET[$key]))
+ return $_GET[$key];
+ return $default;
+ }
+
+ /**
+ * Loads a INT from $_GET, or returns $default on failure
+ */
+ public function get_int(string $key, ?int $default = NULL): ?int {
+ $value = $this->get_string($key);
+ if ($value)
+ return intval($value);
+ return $default;
+ }
+
+}
diff --git a/src/web/lib/_controller.php b/src/web/lib/_controller.php
new file mode 100644
index 0000000..122a7a7
--- /dev/null
+++ b/src/web/lib/_controller.php
@@ -0,0 +1,49 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+class XSS_Controller extends Controller {
+ use XSS_Base;
+
+ protected $model;
+
+ public function __construct() {
+ $this->model = new XSS_model();
+ $this->load_lang('common', 'api');
+ }
+
+ /**
+ * Formats a users's name
+ * @param array $user - the $user
+ * @returns the user's formatted display name
+ */
+ public function format_name(array $user): string {
+ $name = '';
+ // first_name
+ if ($user['first_name'])
+ $name .= $user['first_name'];
+ // middle_name
+ if ($user['middle_name']) {
+ if ($name != '')
+ $name .= ' ';
+ $name .= $user['middle_name'];
+ }
+ // last_name
+ if ($user['last_name']) {
+ if ($name != '')
+ $name .= ' ';
+ $name .= $user['last_name'];
+ }
+ if ($name == '') {
+ $name = '@' . $user['username'];
+ }
+ return $name;
+ }
+
+ /**
+ * Formats a ISO date
+ * @param $iso_date the ISO date
+ */
+ public function format_date(string $iso_date): string
+ {
+ return date("Y-m-d D H:i", strtotime($iso_date));
+ }
+}
diff --git a/src/web/lib/_model.php b/src/web/lib/_model.php
new file mode 100644
index 0000000..c29e015
--- /dev/null
+++ b/src/web/lib/_model.php
@@ -0,0 +1,61 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+class XSS_Model extends Model {
+ use XSS_Base;
+
+ private static array $loaded_users = array();
+
+ /**
+ * Gets an array of users with IDs specified by 'user_id' in $objs
+ */
+ public function get_users($objs) {
+ // null check
+ if (!$objs)
+ return self::$loaded_users;
+
+ $ids = array();
+ // get all user_id's to load (not in loaded_users)
+ foreach ($objs as $obj) {
+ $id = $obj['user_id'];
+ if (!isset(self::$loaded_users[$id]))
+ $ids[] = intval($id);
+ }
+ // if there are users to load
+ if (count($ids)) {
+ $result = $this->db()
+ ->select('*')
+ ->from('api.user')
+ ->where_in('id', $ids)
+ ->rows();
+ foreach ($result as $user)
+ self::$loaded_users[$user['id']] = $user;
+ }
+ // return result
+ return self::$loaded_users;
+ }
+
+ /**
+ * Gets the page's title
+ */
+ public function get_title(): string {
+ $xssbook = lang('xssbook');
+ $title = lang('title');
+ if ($title)
+ return "$xssbook - $title";
+ return $xssbook;
+ }
+
+ /**
+ * Adds title to base data
+ */
+ #[\Override]
+ public function get_data(): ?array {
+ $data = parent::get_data();
+ // title
+ $data['title'] = $this->get_title();
+ // session
+ $auth_model = $this->load_model('auth');
+ $data['session'] = $auth_model->session();;
+ return $data;
+ }
+}
diff --git a/src/web/lib/hooks.php b/src/web/lib/hooks.php
new file mode 100644
index 0000000..45316ec
--- /dev/null
+++ b/src/web/lib/hooks.php
@@ -0,0 +1,31 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+function XSSBOOK_begin_session(): void {
+ session_start();
+ setcookie(
+ session_name(),
+ session_id(),
+ array(
+ 'expires' => time() + 60*60*24*7,
+ 'path' => '/',
+ 'domain' => NULL,
+ 'secure' => FALSE,
+ 'httponly' => FALSE,
+ 'samesite' => 'Lax'
+ )
+ );
+}
+
+function CRIMSON_init_hook(): void {
+ //date_default_timezone_set('America/New_York');
+ XSSBOOK_begin_session();
+}
+
+function CRIMSON_pre_route_hook(Router $router): void {
+}
+
+function CRIMSON_error_hook(?array $req, int $code): never {
+ $error_controller = ROUTER->load_controller('error');
+ $error_controller->code($code);
+ CRIMSON_DIE();
+}
diff --git a/src/web/helper/image.php b/src/web/lib/image.php
index 6d42678..6d42678 100644
--- a/src/web/helper/image.php
+++ b/src/web/lib/image.php
diff --git a/src/web/lib/utils.php b/src/web/lib/utils.php
new file mode 100644
index 0000000..254f9ea
--- /dev/null
+++ b/src/web/lib/utils.php
@@ -0,0 +1,6 @@
+<?php /* Copyright (c) 2024 Freya Murphy */
+
+function random_value(array $array): mixed {
+ shuffle($array);
+ return end($array);
+}
diff --git a/src/web/stamp.php b/src/web/stamp.php
new file mode 100644
index 0000000..7a1956b
--- /dev/null
+++ b/src/web/stamp.php
@@ -0,0 +1,46 @@
+<?php
+$__stamps = array();
+$__stamps['public/css/home.css'] = 1734805900;
+$__stamps['public/css/error.css'] = 1734805900;
+$__stamps['public/css/post.css'] = 1734805900;
+$__stamps['public/css/people.css'] = 1734805900;
+$__stamps['public/css/profile.css'] = 1734805900;
+$__stamps['public/css/auth.css'] = 1734805900;
+$__stamps['public/css/common.css'] = 1734805900;
+$__stamps['public/css/settings.css'] = 1734805900;
+$__stamps['public/favicon.ico'] = 1721008734;
+$__stamps['public/font/Facebook.otf'] = 1721008734;
+$__stamps['public/font/Facebook.ttf'] = 1734674363;
+$__stamps['public/font/Facebook.woff'] = 1734674376;
+$__stamps['public/font/Facebook.woff2'] = 1734674377;
+$__stamps['public/font/Helvetica'] = ;
+$__stamps['public/Neue.otf'] = ;
+$__stamps['public/font/Helvetica'] = ;
+$__stamps['public/Neue.ttf'] = ;
+$__stamps['public/font/Helvetica'] = ;
+$__stamps['public/Neue.woff'] = ;
+$__stamps['public/font/Helvetica'] = ;
+$__stamps['public/Neue.woff2'] = ;
+$__stamps['public/font/Material'] = ;
+$__stamps['public/Icons.ttf'] = ;
+$__stamps['public/font/SF'] = ;
+$__stamps['public/Pro.otf'] = ;
+$__stamps['public/font/SF'] = ;
+$__stamps['public/Pro.ttf'] = ;
+$__stamps['public/font/SF'] = ;
+$__stamps['public/Pro.woff'] = ;
+$__stamps['public/font/SF'] = ;
+$__stamps['public/Pro.woff2'] = ;
+$__stamps['public/font/Material'] = ;
+$__stamps['public/Icons.otf'] = ;
+$__stamps['public/font/Material'] = ;
+$__stamps['public/Icons.woff'] = ;
+$__stamps['public/font/Material'] = ;
+$__stamps['public/Icons.woff2'] = ;
+$__stamps['public/js/lib.js'] = 1734680679;
+$__stamps['public/js/modal.js'] = 1721008734;
+$__stamps['public/js/post.js'] = 1734678976;
+$__stamps['public/js/thirdparty/jquery.min.js'] = 1721008734;
+$__stamps['public/icons/logo512.png'] = 1731184206;
+define('FILE_TIMES', $__stamps);
+unset($__stamps);