/*
 jQuery JavaScript Library v3.6.0
 https://jquery.com/

 Includes Sizzle.js
 https://sizzlejs.com/

 Copyright OpenJS Foundation and other contributors
 Released under the MIT license
 https://jquery.org/license

 Date: 2021-03-02T17:08Z
 Sizzle CSS Selector Engine v2.3.6
 https://sizzlejs.com/

 Copyright JS Foundation and other contributors
 Released under the MIT license
 https://js.foundation/

 Date: 2021-02-16
 Bootstrap v3.3.7 (http://getbootstrap.com)
 Copyright 2011-2016 Twitter, Inc.
 Licensed under the MIT license
*/
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(c,l,n){c!=Array.prototype&&c!=Object.prototype&&(c[l]=n.value)};$jscomp.getGlobal=function(c){return"undefined"!=typeof window&&window===c?c:"undefined"!=typeof global&&null!=global?global:c};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";
$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var c=0;return function(l){return $jscomp.SYMBOL_PREFIX+(l||"")+c++}}();
$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var c=$jscomp.global.Symbol.iterator;c||(c=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[c]&&$jscomp.defineProperty(Array.prototype,c,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(c){var l=0;return $jscomp.iteratorPrototype(function(){return l<c.length?{done:!1,value:c[l++]}:{done:!0}})};
$jscomp.iteratorPrototype=function(c){$jscomp.initSymbolIterator();c={next:c};c[$jscomp.global.Symbol.iterator]=function(){return this};return c};$jscomp.findInternal=function(c,l,n){c instanceof String&&(c=String(c));for(var h=c.length,g=0;g<h;g++){var f=c[g];if(l.call(n,f,g,c))return{i:g,v:f}}return{i:-1,v:void 0}};
$jscomp.polyfill=function(c,l,n,h){if(l){n=$jscomp.global;c=c.split(".");for(h=0;h<c.length-1;h++){var g=c[h];g in n||(n[g]={});n=n[g]}c=c[c.length-1];h=n[c];l=l(h);l!=h&&null!=l&&$jscomp.defineProperty(n,c,{configurable:!0,writable:!0,value:l})}};$jscomp.polyfill("Array.prototype.find",function(c){return c?c:function(c,n){return $jscomp.findInternal(this,c,n).v}},"es6","es3");
(function(c,l){"object"===typeof module&&"object"===typeof module.exports?module.exports=c.document?l(c,!0):function(c){if(!c.document)throw Error("jQuery requires a window with a document");return l(c)}:l(c)})("undefined"!==typeof window?window:this,function(c,l){function n(a,b,d){d=d||A;var k,e=d.createElement("script");e.text=a;if(b)for(k in Ob)(a=b[k]||b.getAttribute&&b.getAttribute(k))&&e.setAttribute(k,a);d.head.appendChild(e).parentNode.removeChild(e)}function h(a){return null==a?a+"":"object"===
typeof a||"function"===typeof a?ya[cb.call(a)]||"object":typeof a}function g(a){var b=!!a&&"length"in a&&a.length,d=h(a);return t(a)||na(a)?!1:"array"===d||0===b||"number"===typeof b&&0<b&&b-1 in a}function f(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}function m(a,b,d){return t(b)?e.grep(a,function(a,e){return!!b.call(a,e,a)!==d}):b.nodeType?e.grep(a,function(a){return a===b!==d}):"string"!==typeof b?e.grep(a,function(a){return-1<Ga.call(b,a)!==d}):e.filter(b,a,d)}function p(a,
b){for(;(a=a[b])&&1!==a.nodeType;);return a}function B(a){var b={};e.each(a.match(V)||[],function(a,k){b[k]=!0});return b}function w(a){return a}function x(a){throw a;}function Z(a,b,d,k){var e;try{a&&t(e=a.promise)?e.call(a).done(b).fail(d):a&&t(e=a.then)?e.call(a,b,d):b.apply(void 0,[a].slice(k))}catch(r){d.apply(void 0,[r])}}function W(){A.removeEventListener("DOMContentLoaded",W);c.removeEventListener("load",W);e.ready()}function Ha(a,b){return b.toUpperCase()}function R(a){return a.replace(Pb,
"ms-").replace(Qb,Ha)}function za(){this.expando=e.expando+za.uid++}function db(a,b,d){if(void 0===d&&1===a.nodeType)if(d="data-"+b.replace(Rb,"-$&").toLowerCase(),d=a.getAttribute(d),"string"===typeof d){try{var k=d;d="true"===k?!0:"false"===k?!1:"null"===k?null:k===+k+""?+k:Sb.test(k)?JSON.parse(k):k}catch(q){}C.set(a,b,d)}else d=void 0;return d}function eb(a,b,d,k){var q,r=20,c=k?function(){return k.cur()}:function(){return e.css(a,b,"")},f=c(),g=d&&d[3]||(e.cssNumber[b]?"":"px"),u=a.nodeType&&
(e.cssNumber[b]||"px"!==g&&+f)&&Aa.exec(e.css(a,b));if(u&&u[3]!==g){f/=2;g=g||u[3];for(u=+f||1;r--;)e.style(a,b,u+g),0>=(1-q)*(1-(q=c()/f||.5))&&(r=0),u/=q;u*=2;e.style(a,b,u+g);d=d||[]}if(d){u=+u||+f||0;var m=d[1]?u+(d[1]+1)*d[2]:+d[2];k&&(k.unit=g,k.start=u,k.end=m)}return m}function aa(a,b){for(var d,k,q=[],r=0,c=a.length;r<c;r++)if(k=a[r],k.style)if(d=k.style.display,b){if("none"===d&&(q[r]=v.get(k,"display")||null,q[r]||(k.style.display="")),""===k.style.display&&oa(k)){d=r;var f=k.ownerDocument;
k=k.nodeName;var g=fb[k];g||(f=f.body.appendChild(f.createElement(k)),g=e.css(f,"display"),f.parentNode.removeChild(f),"none"===g&&(g="block"),fb[k]=g);f=g;q[d]=f}}else"none"!==d&&(q[r]="none",v.set(k,"display",d));for(r=0;r<c;r++)null!=q[r]&&(a[r].style.display=q[r]);return a}function J(a,b){var d="undefined"!==typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!==typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&f(a,b)?e.merge([a],d):d}function Oa(a,
b){for(var d=0,k=a.length;d<k;d++)v.set(a[d],"globalEval",!b||v.get(b[d],"globalEval"))}function gb(a,b,d,k,q){for(var r,c,f,g=b.createDocumentFragment(),u=[],m=0,p=a.length;m<p;m++)if((r=a[m])||0===r)if("object"===h(r))e.merge(u,r.nodeType?[r]:r);else if(Ub.test(r)){c=c||g.appendChild(b.createElement("div"));f=(hb.exec(r)||["",""])[1].toLowerCase();f=H[f]||H._default;c.innerHTML=f[1]+e.htmlPrefilter(r)+f[2];for(f=f[0];f--;)c=c.lastChild;e.merge(u,c.childNodes);c=g.firstChild;c.textContent=""}else u.push(b.createTextNode(r));
g.textContent="";for(m=0;r=u[m++];)if(k&&-1<e.inArray(r,k))q&&q.push(r);else if(a=pa(r),c=J(g.appendChild(r),"script"),a&&Oa(c),d)for(f=0;r=c[f++];)ib.test(r.type||"")&&d.push(r);return g}function fa(){return!0}function qa(){return!1}function Vb(a,b){a:{try{var d=A.activeElement;break a}catch(k){}d=void 0}return a===d===("focus"===b)}function Pa(a,b,d,k,q,r){var c;if("object"===typeof b){"string"!==typeof d&&(k=k||d,d=void 0);for(c in b)Pa(a,c,d,k,b[c],r);return a}null==k&&null==q?(q=d,k=d=void 0):
null==q&&("string"===typeof d?(q=k,k=void 0):(q=k,k=d,d=void 0));if(!1===q)q=qa;else if(!q)return a;if(1===r){var f=q;q=function(a){e().off(a);return f.apply(this,arguments)};q.guid=f.guid||(f.guid=e.guid++)}return a.each(function(){e.event.add(this,b,q,k,d)})}function ha(a,b,d){d?(v.set(a,b,!1),e.event.add(a,b,{namespace:!1,handler:function(a){var k=v.get(this,b);if(a.isTrigger&1&&this[b])if(k.length)(e.event.special[b]||{}).delegateType&&a.stopPropagation();else{k=da.call(arguments);v.set(this,
b,k);var c=d(this,b);this[b]();var f=v.get(this,b);k!==f||c?v.set(this,b,!1):f={};if(k!==f)return a.stopImmediatePropagation(),a.preventDefault(),f&&f.value}else k.length&&(v.set(this,b,{value:e.event.trigger(e.extend(k[0],e.Event.prototype),k.slice(1),this)}),a.stopImmediatePropagation())}})):void 0===v.get(a,b)&&e.event.add(a,b,fa)}function jb(a,b){return f(a,"table")&&f(11!==b.nodeType?b:b.firstChild,"tr")?e(a).children("tbody")[0]||a:a}function Wb(a){a.type=(null!==a.getAttribute("type"))+"/"+
a.type;return a}function Xb(a){"true/"===(a.type||"").slice(0,5)?a.type=a.type.slice(5):a.removeAttribute("type");return a}function kb(a,b){var d,k,q;if(1===b.nodeType){if(v.hasData(a)){var c=v.get(a);if(q=c.events)for(k in v.remove(b,"handle events"),q)for(c=0,d=q[k].length;c<d;c++)e.event.add(b,k,q[k][c])}C.hasData(a)&&(a=C.access(a),a=e.extend({},a),C.set(b,a))}}function ra(a,b,d,k){b=lb(b);var q,c=0,f=a.length,g=f-1,D=b[0],u=t(D);if(u||1<f&&"string"===typeof D&&!y.checkClone&&Yb.test(D))return a.each(function(e){var q=
a.eq(e);u&&(b[0]=D.call(this,e,q.html()));ra(q,b,d,k)});if(f){var m=gb(b,a[0].ownerDocument,!1,a,k);var h=m.firstChild;1===m.childNodes.length&&(m=h);if(h||k){h=e.map(J(m,"script"),Wb);for(q=h.length;c<f;c++){var p=m;c!==g&&(p=e.clone(p,!0,!0),q&&e.merge(h,J(p,"script")));d.call(a[c],p,c)}if(q)for(m=h[h.length-1].ownerDocument,e.map(h,Xb),c=0;c<q;c++)p=h[c],ib.test(p.type||"")&&!v.access(p,"globalEval")&&e.contains(m,p)&&(p.src&&"module"!==(p.type||"").toLowerCase()?e._evalUrl&&!p.noModule&&e._evalUrl(p.src,
{nonce:p.nonce||p.getAttribute("nonce")},m):n(p.textContent.replace($b,""),p,m))}}return a}function mb(a,b,d){for(var k=b?e.filter(b,a):a,q=0;null!=(b=k[q]);q++)d||1!==b.nodeType||e.cleanData(J(b)),b.parentNode&&(d&&pa(b)&&Oa(J(b,"script")),b.parentNode.removeChild(b));return a}function Ba(a,b,d){var k=a.style;if(d=d||Ca(a)){var q=d.getPropertyValue(b)||d[b];""!==q||pa(a)||(q=e.style(a,b));if(!y.pixelBoxStyles()&&Qa.test(q)&&ac.test(b)){a=k.width;b=k.minWidth;var c=k.maxWidth;k.minWidth=k.maxWidth=
k.width=q;q=d.width;k.width=a;k.minWidth=b;k.maxWidth=c}}return void 0!==q?q+"":q}function nb(a,b){return{get:function(){if(a())delete this.get;else return(this.get=b).apply(this,arguments)}}}function Ra(a){var b=e.cssProps[a]||ob[a];if(b)return b;if(a in pb)return a;a:{b=a;for(var d=b[0].toUpperCase()+b.slice(1),k=qb.length;k--;)if(b=qb[k]+d,b in pb)break a;b=void 0}return ob[a]=b||a}function rb(a,b,d){return(a=Aa.exec(b))?Math.max(0,a[2]-(d||0))+(a[3]||"px"):b}function Sa(a,b,d,k,q,c){var f="width"===
b?1:0,r=0,g=0;if(d===(k?"border":"content"))return 0;for(;4>f;f+=2)"margin"===d&&(g+=e.css(a,d+X[f],!0,q)),k?("content"===d&&(g-=e.css(a,"padding"+X[f],!0,q)),"margin"!==d&&(g-=e.css(a,"border"+X[f]+"Width",!0,q))):(g+=e.css(a,"padding"+X[f],!0,q),"padding"!==d?g+=e.css(a,"border"+X[f]+"Width",!0,q):r+=e.css(a,"border"+X[f]+"Width",!0,q));!k&&0<=c&&(g+=Math.max(0,Math.ceil(a["offset"+b[0].toUpperCase()+b.slice(1)]-c-g-r-.5))||0);return g}function sb(a,b,d){var k=Ca(a),q=(!y.boxSizingReliable()||d)&&
"border-box"===e.css(a,"boxSizing",!1,k),c=q,g=Ba(a,b,k),m="offset"+b[0].toUpperCase()+b.slice(1);if(Qa.test(g)){if(!d)return g;g="auto"}(!y.boxSizingReliable()&&q||!y.reliableTrDimensions()&&f(a,"tr")||"auto"===g||!parseFloat(g)&&"inline"===e.css(a,"display",!1,k))&&a.getClientRects().length&&(q="border-box"===e.css(a,"boxSizing",!1,k),(c=m in a)&&(g=a[m]));g=parseFloat(g)||0;return g+Sa(a,b,d||(q?"border":"content"),c,k,g)+"px"}function N(a,b,d,k,e){return new N.prototype.init(a,b,d,k,e)}function Ta(){Ia&&
(!1===A.hidden&&c.requestAnimationFrame?c.requestAnimationFrame(Ta):c.setTimeout(Ta,e.fx.interval),e.fx.tick())}function tb(){c.setTimeout(function(){sa=void 0});return sa=Date.now()}function La(a,b){var d=0,k={height:a};for(b=b?1:0;4>d;d+=2-b){var e=X[d];k["margin"+e]=k["padding"+e]=a}b&&(k.opacity=k.width=a);return k}function ub(a,b,d){for(var k,e=(E.tweeners[b]||[]).concat(E.tweeners["*"]),c=0,f=e.length;c<f;c++)if(k=e[c].call(d,b,a))return k}function bc(a,b){var d,k;for(d in a){var q=R(d);var c=
b[q];var f=a[d];Array.isArray(f)&&(c=f[1],f=a[d]=f[0]);d!==q&&(a[q]=f,delete a[d]);if((k=e.cssHooks[q])&&"expand"in k)for(d in f=k.expand(f),delete a[q],f)d in a||(a[d]=f[d],b[d]=c);else b[q]=c}}function E(a,b,d){var k,c=0,f=E.prefilters.length,g=e.Deferred().always(function(){delete m.elem}),m=function(){if(k)return!1;var b=sa||tb();b=Math.max(0,h.startTime+h.duration-b);for(var d=1-(b/h.duration||0),e=0,c=h.tweens.length;e<c;e++)h.tweens[e].run(d);g.notifyWith(a,[h,d,b]);if(1>d&&c)return b;c||g.notifyWith(a,
[h,1,0]);g.resolveWith(a,[h]);return!1},h=g.promise({elem:a,props:e.extend({},b),opts:e.extend(!0,{specialEasing:{},easing:e.easing._default},d),originalProperties:b,originalOptions:d,startTime:sa||tb(),duration:d.duration,tweens:[],createTween:function(b,d){b=e.Tween(a,h.opts,b,d,h.opts.specialEasing[b]||h.opts.easing);h.tweens.push(b);return b},stop:function(b){var d=0,e=b?h.tweens.length:0;if(k)return this;for(k=!0;d<e;d++)h.tweens[d].run(1);b?(g.notifyWith(a,[h,1,0]),g.resolveWith(a,[h,b])):g.rejectWith(a,
[h,b]);return this}});d=h.props;for(bc(d,h.opts.specialEasing);c<f;c++)if(b=E.prefilters[c].call(h,a,d,h.opts))return t(b.stop)&&(e._queueHooks(h.elem,h.opts.queue).stop=b.stop.bind(b)),b;e.map(d,ub,h);t(h.opts.start)&&h.opts.start.call(a,h);h.progress(h.opts.progress).done(h.opts.done,h.opts.complete).fail(h.opts.fail).always(h.opts.always);e.fx.timer(e.extend(m,{elem:a,anim:h,queue:h.opts.queue}));return h}function P(a){return(a.match(V)||[]).join(" ")}function ia(a){return a.getAttribute&&a.getAttribute("class")||
""}function Ua(a){return Array.isArray(a)?a:"string"===typeof a?a.match(V)||[]:[]}function Va(a,b,d,k){var c;if(Array.isArray(b))e.each(b,function(b,e){d||cc.test(a)?k(a,e):Va(a+"["+("object"===typeof e&&null!=e?b:"")+"]",e,d,k)});else if(d||"object"!==h(b))k(a,b);else for(c in b)Va(a+"["+c+"]",b[c],d,k)}function vb(a){return function(b,d){"string"!==typeof b&&(d=b,b="*");var e=0,c=b.toLowerCase().match(V)||[];if(t(d))for(;b=c[e++];)"+"===b[0]?(b=b.slice(1)||"*",(a[b]=a[b]||[]).unshift(d)):(a[b]=
a[b]||[]).push(d)}}function wb(a,b,d,k){function c(q){var r;f[q]=!0;e.each(a[q]||[],function(a,e){a=e(b,d,k);if("string"===typeof a&&!g&&!f[a])return b.dataTypes.unshift(a),c(a),!1;if(g)return!(r=a)});return r}var f={},g=a===Wa;return c(b.dataTypes[0])||!f["*"]&&c("*")}function Xa(a,b){var d,k,c=e.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((c[d]?a:k||(k={}))[d]=b[d]);k&&e.extend(!0,a,k);return a}function dc(a,b,d){for(var e,c,f,g,h=a.contents,m=a.dataTypes;"*"===m[0];)m.shift(),void 0===
e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(c in h)if(h[c]&&h[c].test(e)){m.unshift(c);break}if(m[0]in d)f=m[0];else{for(c in d){if(!m[0]||a.converters[c+" "+m[0]]){f=c;break}g||(g=c)}f=f||g}if(f)return f!==m[0]&&m.unshift(f),d[f]}function ec(a,b,d,e){var k,c,f={},g=a.dataTypes.slice();if(g[1])for(m in a.converters)f[m.toLowerCase()]=a.converters[m];for(c=g.shift();c;){a.responseFields[c]&&(d[a.responseFields[c]]=b);!h&&e&&a.dataFilter&&(b=a.dataFilter(b,a.dataType));var h=c;if(c=
g.shift())if("*"===c)c=h;else if("*"!==h&&h!==c){var m=f[h+" "+c]||f["* "+c];if(!m)for(k in f){var p=k.split(" ");if(p[1]===c&&(m=f[h+" "+p[0]]||f["* "+p[0]])){!0===m?m=f[k]:!0!==f[k]&&(c=p[0],g.unshift(p[1]));break}}if(!0!==m)if(m&&a.throws)b=m(b);else try{b=m(b)}catch(Tb){return{state:"parsererror",error:m?Tb:"No conversion from "+h+" to "+c}}}}return{state:"success",data:b}}var Q=[],xb=Object.getPrototypeOf,da=Q.slice,lb=Q.flat?function(a){return Q.flat.call(a)}:function(a){return Q.concat.apply([],
a)},Ya=Q.push,Ga=Q.indexOf,ya={},cb=ya.toString,Ma=ya.hasOwnProperty,yb=Ma.toString,fc=yb.call(Object),y={},t=function(a){return"function"===typeof a&&"number"!==typeof a.nodeType&&"function"!==typeof a.item},na=function(a){return null!=a&&a===a.window},A=c.document,Ob={type:!0,src:!0,nonce:!0,noModule:!0},e=function(a,b){return new e.fn.init(a,b)};e.fn=e.prototype={jquery:"3.6.0",constructor:e,length:0,toArray:function(){return da.call(this)},get:function(a){return null==a?da.call(this):0>a?this[a+
this.length]:this[a]},pushStack:function(a){a=e.merge(this.constructor(),a);a.prevObject=this;return a},each:function(a){return e.each(this,a)},map:function(a){return this.pushStack(e.map(this,function(b,d){return a.call(b,d,b)}))},slice:function(){return this.pushStack(da.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(e.grep(this,function(a,b){return(b+1)%2}))},odd:function(){return this.pushStack(e.grep(this,
function(a,b){return b%2}))},eq:function(a){var b=this.length;a=+a+(0>a?b:0);return this.pushStack(0<=a&&a<b?[this[a]]:[])},end:function(){return this.prevObject||this.constructor()},push:Ya,sort:Q.sort,splice:Q.splice};e.extend=e.fn.extend=function(){var a,b,d,k=arguments[0]||{},c=1,f=arguments.length,g=!1;"boolean"===typeof k&&(g=k,k=arguments[c]||{},c++);"object"===typeof k||t(k)||(k={});c===f&&(k=this,c--);for(;c<f;c++)if(null!=(a=arguments[c]))for(b in a){var h=a[b];if("__proto__"!==b&&k!==h)if(g&&
h&&(e.isPlainObject(h)||(d=Array.isArray(h)))){var m=k[b];m=d&&!Array.isArray(m)?[]:d||e.isPlainObject(m)?m:{};d=!1;k[b]=e.extend(g,m,h)}else void 0!==h&&(k[b]=h)}return k};e.extend({expando:"jQuery"+("3.6.0"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw Error(a);},noop:function(){},isPlainObject:function(a){if(!a||"[object Object]"!==cb.call(a))return!1;a=xb(a);if(!a)return!0;a=Ma.call(a,"constructor")&&a.constructor;return"function"===typeof a&&yb.call(a)===fc},isEmptyObject:function(a){for(var b in a)return!1;
return!0},globalEval:function(a,b,d){n(a,{nonce:b&&b.nonce},d)},each:function(a,b){var d,e=0;if(g(a))for(d=a.length;e<d&&!1!==b.call(a[e],e,a[e]);e++);else for(e in a)if(!1===b.call(a[e],e,a[e]))break;return a},makeArray:function(a,b){b=b||[];null!=a&&(g(Object(a))?e.merge(b,"string"===typeof a?[a]:a):Ya.call(b,a));return b},inArray:function(a,b,d){return null==b?-1:Ga.call(b,a,d)},merge:function(a,b){for(var d=+b.length,e=0,c=a.length;e<d;e++)a[c++]=b[e];a.length=c;return a},grep:function(a,b,d){for(var e=
[],c=0,f=a.length,g=!d;c<f;c++)d=!b(a[c],c),d!==g&&e.push(a[c]);return e},map:function(a,b,d){var e,c=0,f=[];if(g(a))for(e=a.length;c<e;c++){var h=b(a[c],c,d);null!=h&&f.push(h)}else for(c in a)h=b(a[c],c,d),null!=h&&f.push(h);return lb(f)},guid:1,support:y});$jscomp.initSymbol();"function"===typeof Symbol&&($jscomp.initSymbol(),$jscomp.initSymbolIterator(),$jscomp.initSymbol(),$jscomp.initSymbolIterator(),e.fn[Symbol.iterator]=Q[Symbol.iterator]);e.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
function(a,b){ya["[object "+b+"]"]=b.toLowerCase()});var la=function(a){function b(a,b,d,e){var k,c,f,g,q=b&&b.ownerDocument;var K=b?b.nodeType:9;d=d||[];if("string"!==typeof a||!a||1!==K&&9!==K&&11!==K)return d;if(!e&&(Da(b),b=b||G,Y)){if(11!==K&&(g=Fa.exec(a)))if(k=g[1])if(9===K)if(c=b.getElementById(k)){if(c.id===k)return d.push(c),d}else return d;else{if(q&&(c=q.getElementById(k))&&Z(b,c)&&c.id===k)return d.push(c),d}else{if(g[2])return ta.apply(d,b.getElementsByTagName(a)),d;if((k=g[3])&&L.getElementsByClassName&&
b.getElementsByClassName)return ta.apply(d,b.getElementsByClassName(k)),d}if(!(!L.qsa||Q[a+" "]||O&&O.test(a)||1===K&&"object"===b.nodeName.toLowerCase())){k=a;q=b;if(1===K&&(qa.test(a)||fa.test(a))){q=ma.test(a)&&l(b.parentNode)||b;q===b&&L.scope||((f=b.getAttribute("id"))?f=f.replace(wa,xa):b.setAttribute("id",f=M));k=ha(a);for(K=k.length;K--;)k[K]=(f?"#"+f:":scope")+" "+B(k[K]);k=k.join(",")}try{return ta.apply(d,q.querySelectorAll(k)),d}catch(Hc){Q(a,!0)}finally{f===M&&b.removeAttribute("id")}}}return Ia(a.replace(aa,
"$1"),b,d,e)}function d(){function a(d,e){b.push(d+" ")>F.cacheLength&&delete a[b.shift()];return a[d+" "]=e}var b=[];return a}function e(a){a[M]=!0;return a}function c(a){var b=G.createElement("fieldset");try{return!!a(b)}catch(S){return!1}finally{b.parentNode&&b.parentNode.removeChild(b)}}function f(a,b){a=a.split("|");for(var d=a.length;d--;)F.attrHandle[a[d]]=b}function g(a,b){var d=b&&a,e=d&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(e)return e;if(d)for(;d=d.nextSibling;)if(d===
b)return-1;return a?1:-1}function h(a){return function(b){return"input"===b.nodeName.toLowerCase()&&b.type===a}}function m(a){return function(b){var d=b.nodeName.toLowerCase();return("input"===d||"button"===d)&&b.type===a}}function u(a){return function(b){return"form"in b?b.parentNode&&!1===b.disabled?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&Ga(b)===a:b.disabled===a:"label"in b?b.disabled===a:!1}}function p(a){return e(function(b){b=
+b;return e(function(d,e){for(var k,c=a([],d.length,b),f=c.length;f--;)d[k=c[f]]&&(d[k]=!(e[k]=d[k]))})})}function l(a){return a&&"undefined"!==typeof a.getElementsByTagName&&a}function n(){}function B(a){for(var b=0,d=a.length,e="";b<d;b++)e+=a[b].value;return e}function w(a,b,d){var e=b.dir,k=b.next,c=k||e,f=d&&"parentNode"===c,g=V++;return b.first?function(b,d,k){for(;b=b[e];)if(1===b.nodeType||f)return a(b,d,k);return!1}:function(b,d,q){var r,K=[E,g];if(q)for(;b=b[e];){if((1===b.nodeType||f)&&
a(b,d,q))return!0}else for(;b=b[e];)if(1===b.nodeType||f){var h=b[M]||(b[M]={});h=h[b.uniqueID]||(h[b.uniqueID]={});if(k&&k===b.nodeName.toLowerCase())b=b[e]||b;else{if((r=h[c])&&r[0]===E&&r[1]===g)return K[2]=r[2];h[c]=K;if(K[2]=a(b,d,q))return!0}}return!1}}function v(a){return 1<a.length?function(b,d,e){for(var k=a.length;k--;)if(!a[k](b,d,e))return!1;return!0}:a[0]}function t(a,b,d,e,k){for(var c,f=[],g=0,q=a.length,r=null!=b;g<q;g++)if(c=a[g])if(!d||d(c,e,k))f.push(c),r&&b.push(g);return f}function x(a,
d,k,c,f,g){c&&!c[M]&&(c=x(c));f&&!f[M]&&(f=x(f,g));return e(function(e,g,q,r){var h,K=[],m=[],S=g.length,p;if(!(p=e)){p=d||"*";for(var I=q.nodeType?[q]:q,u=[],Ja=0,Ka=I.length;Ja<Ka;Ja++)b(p,I[Ja],u);p=u}p=!a||!e&&d?p:t(p,K,a,q,r);I=k?f||(e?a:S||c)?[]:g:p;k&&k(p,I,q,r);if(c){var D=t(I,m);c(D,[],q,r);for(q=D.length;q--;)if(h=D[q])I[m[q]]=!(p[m[q]]=h)}if(e){if(f||a){if(f){D=[];for(q=I.length;q--;)(h=I[q])&&D.push(p[q]=h);f(null,I=[],D,r)}for(q=I.length;q--;)(h=I[q])&&-1<(D=f?Ea(e,h):K[q])&&(e[D]=!(g[D]=
h))}}else I=t(I===g?I.splice(S,I.length):I),f?f(null,g,I,r):ta.apply(g,I)})}function z(a){var b,d,e=a.length,k=F.relative[a[0].type];var c=k||F.relative[" "];for(var f=k?1:0,g=w(function(a){return a===b},c,!0),q=w(function(a){return-1<Ea(b,a)},c,!0),r=[function(a,d,e){a=!k&&(e||d!==ua)||((b=d).nodeType?g(a,d,e):q(a,d,e));b=null;return a}];f<e;f++)if(c=F.relative[a[f].type])r=[w(v(r),c)];else{c=F.filter[a[f].type].apply(null,a[f].matches);if(c[M]){for(d=++f;d<e&&!F.relative[a[d].type];d++);return x(1<
f&&v(r),1<f&&B(a.slice(0,f-1).concat({value:" "===a[f-2].type?"*":""})).replace(aa,"$1"),c,f<d&&z(a.slice(f,d)),d<e&&z(a=a.slice(d)),d<e&&B(a))}r.push(c)}return v(r)}function A(a,d){var k=0<d.length,c=0<a.length,f=function(e,f,g,q,r){var h,m,K=0,S="0",I=e&&[],p=[],u=ua,D=e||c&&F.find.TAG("*",r),Ja=E+=null==u?1:Math.random()||.1,Ka=D.length;for(r&&(ua=f==G||f||r);S!==Ka&&null!=(h=D[S]);S++){if(c&&h){var Na=0;f||h.ownerDocument==G||(Da(h),g=!Y);for(;m=a[Na++];)if(m(h,f||G,g)){q.push(h);break}r&&(E=
Ja)}k&&((h=!m&&h)&&K--,e&&I.push(h))}K+=S;if(k&&S!==K){for(Na=0;m=d[Na++];)m(I,p,f,g);if(e){if(0<K)for(;S--;)I[S]||p[S]||(p[S]=ia.call(q));p=t(p)}ta.apply(q,p);r&&!e&&0<p.length&&1<K+d.length&&b.uniqueSort(q)}r&&(E=Ja,ua=u);return I};return k?e(f):f}var y,ua,va,C,G,T,Y,O,J,N,Z,M="sizzle"+1*new Date,H=a.document,E=0,V=0,R=d(),W=d(),X=d(),Q=d(),U=function(a,b){a===b&&(C=!0);return 0},da={}.hasOwnProperty,P=[],ia=P.pop,la=P.push,ta=P.push,ea=P.slice,Ea=function(a,b){for(var d=0,e=a.length;d<e;d++)if(a[d]===
b)return d;return-1},na=/[\x20\t\r\n\f]+/g,aa=/^[\x20\t\r\n\f]+|((?:^|[^\\])(?:\\.)*)[\x20\t\r\n\f]+$/g,pa=/^[\x20\t\r\n\f]*,[\x20\t\r\n\f]*/,fa=/^[\x20\t\r\n\f]*([>+~]|[\x20\t\r\n\f])[\x20\t\r\n\f]*/,qa=/[\x20\t\r\n\f]|>/,ra=/:((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)(?:\((('((?:\\.|[^\\'])*)'|"((?:\\.|[^\\"])*)")|((?:\\.|[^\\()[\]]|\[[\x20\t\r\n\f]*((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)(?:[\x20\t\r\n\f]*([*^$|!~]?=)[\x20\t\r\n\f]*(?:'((?:\\.|[^\\'])*)'|"((?:\\.|[^\\"])*)"|((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+))|)[\x20\t\r\n\f]*\])*)|.*)\)|)/,
sa=/^(?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+$/,ba={ID:/^#((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)/,CLASS:/^\.((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)/,TAG:/^((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+|[*])/,ATTR:/^\[[\x20\t\r\n\f]*((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)(?:[\x20\t\r\n\f]*([*^$|!~]?=)[\x20\t\r\n\f]*(?:'((?:\\.|[^\\'])*)'|"((?:\\.|[^\\"])*)"|((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+))|)[\x20\t\r\n\f]*\]/,
PSEUDO:/^:((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)(?:\((('((?:\\.|[^\\'])*)'|"((?:\\.|[^\\"])*)")|((?:\\.|[^\\()[\]]|\[[\x20\t\r\n\f]*((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+)(?:[\x20\t\r\n\f]*([*^$|!~]?=)[\x20\t\r\n\f]*(?:'((?:\\.|[^\\'])*)'|"((?:\\.|[^\\"])*)"|((?:\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\[^\r\n\f]|[\w-]|[^\x00-\x7f])+))|)[\x20\t\r\n\f]*\])*)|.*)\)|)/,CHILD:/^:(only|first|last|nth|nth-last)-(child|of-type)(?:\([\x20\t\r\n\f]*(even|odd|(([+-]|)(\d*)n|)[\x20\t\r\n\f]*(?:([+-]|)[\x20\t\r\n\f]*(\d+)|))[\x20\t\r\n\f]*\)|)/i,
bool:/^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,needsContext:/^[\x20\t\r\n\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\([\x20\t\r\n\f]*((?:-\d)?\d*)[\x20\t\r\n\f]*\)|)(?=[^-]|$)/i},za=/HTML$/i,Aa=/^(?:input|select|textarea|button)$/i,Ba=/^h\d$/i,ca=/^[^{]+\{\s*\[native \w/,Fa=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ma=/[+~]/,ja=/\\[\da-fA-F]{1,6}[\x20\t\r\n\f]?|\\([^\r\n\f])/g,ka=function(a,b){a="0x"+a.slice(1)-
65536;return b?b:0>a?String.fromCharCode(a+65536):String.fromCharCode(a>>10|55296,a&1023|56320)},wa=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,xa=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},ya=function(){Da()},Ga=w(function(a){return!0===a.disabled&&"fieldset"===a.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{ta.apply(P=ea.call(H.childNodes),H.childNodes),P[H.childNodes.length].nodeType}catch(K){ta={apply:P.length?
function(a,b){la.apply(a,ea.call(b))}:function(a,b){for(var d=a.length,e=0;a[d++]=b[e++];);a.length=d-1}}}var L=b.support={};var Ha=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!za.test(a&&a.namespaceURI||b&&b.nodeName||"HTML")};var Da=b.setDocument=function(a){var b;a=a?a.ownerDocument||a:H;if(a==G||9!==a.nodeType||!a.documentElement)return G;G=a;T=G.documentElement;Y=!Ha(G);H!=G&&(b=G.defaultView)&&b.top!==b&&(b.addEventListener?b.addEventListener("unload",ya,!1):b.attachEvent&&
b.attachEvent("onunload",ya));L.scope=c(function(a){T.appendChild(a).appendChild(G.createElement("div"));return"undefined"!==typeof a.querySelectorAll&&!a.querySelectorAll(":scope fieldset div").length});L.attributes=c(function(a){a.className="i";return!a.getAttribute("className")});L.getElementsByTagName=c(function(a){a.appendChild(G.createComment(""));return!a.getElementsByTagName("*").length});L.getElementsByClassName=ca.test(G.getElementsByClassName);L.getById=c(function(a){T.appendChild(a).id=
M;return!G.getElementsByName||!G.getElementsByName(M).length});L.getById?(F.filter.ID=function(a){var b=a.replace(ja,ka);return function(a){return a.getAttribute("id")===b}},F.find.ID=function(a,b){if("undefined"!==typeof b.getElementById&&Y)return(a=b.getElementById(a))?[a]:[]}):(F.filter.ID=function(a){var b=a.replace(ja,ka);return function(a){return(a="undefined"!==typeof a.getAttributeNode&&a.getAttributeNode("id"))&&a.value===b}},F.find.ID=function(a,b){if("undefined"!==typeof b.getElementById&&
Y){var d,e=b.getElementById(a);if(e){if((d=e.getAttributeNode("id"))&&d.value===a)return[e];var k=b.getElementsByName(a);for(b=0;e=k[b++];)if((d=e.getAttributeNode("id"))&&d.value===a)return[e]}return[]}});F.find.TAG=L.getElementsByTagName?function(a,b){if("undefined"!==typeof b.getElementsByTagName)return b.getElementsByTagName(a);if(L.qsa)return b.querySelectorAll(a)}:function(a,b){var d=[],e=0;b=b.getElementsByTagName(a);if("*"===a){for(;a=b[e++];)1===a.nodeType&&d.push(a);return d}return b};F.find.CLASS=
L.getElementsByClassName&&function(a,b){if("undefined"!==typeof b.getElementsByClassName&&Y)return b.getElementsByClassName(a)};J=[];O=[];if(L.qsa=ca.test(G.querySelectorAll))c(function(a){T.appendChild(a).innerHTML="<a id='"+M+"'></a><select id='"+M+"-\r\\' msallowcapture=''><option selected=''></option></select>";a.querySelectorAll("[msallowcapture^='']").length&&O.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")");a.querySelectorAll("[selected]").length||O.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)");
a.querySelectorAll("[id~="+M+"-]").length||O.push("~=");var b=G.createElement("input");b.setAttribute("name","");a.appendChild(b);a.querySelectorAll("[name='']").length||O.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")");a.querySelectorAll(":checked").length||O.push(":checked");a.querySelectorAll("a#"+M+"+*").length||O.push(".#.+[+~]");a.querySelectorAll("\\\f");O.push("[\\r\\n\\f]")}),c(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";
var b=G.createElement("input");b.setAttribute("type","hidden");a.appendChild(b).setAttribute("name","D");a.querySelectorAll("[name=d]").length&&O.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?=");2!==a.querySelectorAll(":enabled").length&&O.push(":enabled",":disabled");T.appendChild(a).disabled=!0;2!==a.querySelectorAll(":disabled").length&&O.push(":enabled",":disabled");a.querySelectorAll("*,:x");O.push(",.*:")});(L.matchesSelector=ca.test(N=T.matches||T.webkitMatchesSelector||T.mozMatchesSelector||T.oMatchesSelector||
T.msMatchesSelector))&&c(function(a){L.disconnectedMatch=N.call(a,"*");N.call(a,"[s!='']:x");J.push("!=",":((?:\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\[^\\r\\n\\f]|[\\w-]|[^\x00-\\x7f])+)(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|\\[[\\x20\\t\\r\\n\\f]*((?:\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\[^\\r\\n\\f]|[\\w-]|[^\x00-\\x7f])+)(?:[\\x20\\t\\r\\n\\f]*([*^$|!~]?=)[\\x20\\t\\r\\n\\f]*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|((?:\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\[^\\r\\n\\f]|[\\w-]|[^\x00-\\x7f])+))|)[\\x20\\t\\r\\n\\f]*\\])*)|.*)\\)|)")});
O=O.length&&new RegExp(O.join("|"));J=J.length&&new RegExp(J.join("|"));Z=(b=ca.test(T.compareDocumentPosition))||ca.test(T.contains)?function(a,b){var d=9===a.nodeType?a.documentElement:a;b=b&&b.parentNode;return a===b||!!(b&&1===b.nodeType&&(d.contains?d.contains(b):a.compareDocumentPosition&&a.compareDocumentPosition(b)&16))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1};U=b?function(a,b){if(a===b)return C=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;if(d)return d;
d=(a.ownerDocument||a)==(b.ownerDocument||b)?a.compareDocumentPosition(b):1;return d&1||!L.sortDetached&&b.compareDocumentPosition(a)===d?a==G||a.ownerDocument==H&&Z(H,a)?-1:b==G||b.ownerDocument==H&&Z(H,b)?1:va?Ea(va,a)-Ea(va,b):0:d&4?-1:1}:function(a,b){if(a===b)return C=!0,0;var d=0,e=a.parentNode,k=b.parentNode,c=[a],f=[b];if(!e||!k)return a==G?-1:b==G?1:e?-1:k?1:va?Ea(va,a)-Ea(va,b):0;if(e===k)return g(a,b);for(;a=a.parentNode;)c.unshift(a);for(a=b;a=a.parentNode;)f.unshift(a);for(;c[d]===f[d];)d++;
return d?g(c[d],f[d]):c[d]==H?-1:f[d]==H?1:0};return G};b.matches=function(a,d){return b(a,null,null,d)};b.matchesSelector=function(a,d){Da(a);if(!(!L.matchesSelector||!Y||Q[d+" "]||J&&J.test(d)||O&&O.test(d)))try{var e=N.call(a,d);if(e||L.disconnectedMatch||a.document&&11!==a.document.nodeType)return e}catch(Na){Q(d,!0)}return 0<b(d,G,null,[a]).length};b.contains=function(a,b){(a.ownerDocument||a)!=G&&Da(a);return Z(a,b)};b.attr=function(a,b){(a.ownerDocument||a)!=G&&Da(a);var d=F.attrHandle[b.toLowerCase()];
d=d&&da.call(F.attrHandle,b.toLowerCase())?d(a,b,!Y):void 0;return void 0!==d?d:L.attributes||!Y?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null};b.escape=function(a){return(a+"").replace(wa,xa)};b.error=function(a){throw Error("Syntax error, unrecognized expression: "+a);};b.uniqueSort=function(a){var b,d=[],e=0,k=0;C=!L.detectDuplicates;va=!L.sortStable&&a.slice(0);a.sort(U);if(C){for(;b=a[k++];)b===a[k]&&(e=d.push(k));for(;e--;)a.splice(d[e],1)}va=null;return a};var oa=b.getText=
function(a){var b="",d=0;var e=a.nodeType;if(!e)for(;e=a[d++];)b+=oa(e);else if(1===e||9===e||11===e){if("string"===typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)b+=oa(a)}else if(3===e||4===e)return a.nodeValue;return b};var F=b.selectors={cacheLength:50,createPseudo:e,match:ba,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){a[1]=a[1].replace(ja,
ka);a[3]=(a[3]||a[4]||a[5]||"").replace(ja,ka);"~="===a[2]&&(a[3]=" "+a[3]+" ");return a.slice(0,4)},CHILD:function(a){a[1]=a[1].toLowerCase();"nth"===a[1].slice(0,3)?(a[3]||b.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&b.error(a[0]);return a},PSEUDO:function(a){var b,d=!a[6]&&a[2];if(ba.CHILD.test(a[0]))return null;a[3]?a[2]=a[4]||a[5]||"":d&&ra.test(d)&&(b=ha(d,!0))&&(b=d.indexOf(")",d.length-b)-d.length)&&(a[0]=a[0].slice(0,b),
a[2]=d.slice(0,b));return a.slice(0,3)}},filter:{TAG:function(a){var b=a.replace(ja,ka).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+a+"([\\x20\\t\\r\\n\\f]|$)"),R(a,function(a){return b.test("string"===typeof a.className&&a.className||"undefined"!==typeof a.getAttribute&&a.getAttribute("class")||"")}))},ATTR:function(a,d,e){return function(k){k=b.attr(k,
a);if(null==k)return"!="===d;if(!d)return!0;k+="";return"="===d?k===e:"!="===d?k!==e:"^="===d?e&&0===k.indexOf(e):"*="===d?e&&-1<k.indexOf(e):"$="===d?e&&k.slice(-e.length)===e:"~="===d?-1<(" "+k.replace(na," ")+" ").indexOf(e):"|="===d?k===e||k.slice(0,e.length+1)===e+"-":!1}},CHILD:function(a,b,d,e,k){var c="nth"!==a.slice(0,3),f="last"!==a.slice(-4),g="of-type"===b;return 1===e&&0===k?function(a){return!!a.parentNode}:function(b,d,q){var r,h;d=c!==f?"nextSibling":"previousSibling";var m=b.parentNode,
I=g&&b.nodeName.toLowerCase();q=!q&&!g;var p=!1;if(m){if(c){for(;d;){for(r=b;r=r[d];)if(g?r.nodeName.toLowerCase()===I:1===r.nodeType)return!1;var u=d="only"===a&&!u&&"nextSibling"}return!0}u=[f?m.firstChild:m.lastChild];if(f&&q){r=m;var D=r[M]||(r[M]={});D=D[r.uniqueID]||(D[r.uniqueID]={});p=D[a]||[];p=(h=p[0]===E&&p[1])&&p[2];for(r=h&&m.childNodes[h];r=++h&&r&&r[d]||(p=h=0)||u.pop();)if(1===r.nodeType&&++p&&r===b){D[a]=[E,h,p];break}}else if(q&&(r=b,D=r[M]||(r[M]={}),D=D[r.uniqueID]||(D[r.uniqueID]=
{}),p=D[a]||[],p=h=p[0]===E&&p[1]),!1===p)for(;(r=++h&&r&&r[d]||(p=h=0)||u.pop())&&((g?r.nodeName.toLowerCase()!==I:1!==r.nodeType)||!++p||(q&&(D=r[M]||(r[M]={}),D=D[r.uniqueID]||(D[r.uniqueID]={}),D[a]=[E,p]),r!==b)););p-=k;return p===e||0===p%e&&0<=p/e}}},PSEUDO:function(a,d){var k=F.pseudos[a]||F.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);if(k[M])return k(d);if(1<k.length){var c=[a,a,"",d];return F.setFilters.hasOwnProperty(a.toLowerCase())?e(function(a,b){for(var e,c=k(a,d),
f=c.length;f--;)e=Ea(a,c[f]),a[e]=!(b[e]=c[f])}):function(a){return k(a,0,c)}}return k}},pseudos:{not:e(function(a){var b=[],d=[],k=Ca(a.replace(aa,"$1"));return k[M]?e(function(a,b,d,e){e=k(a,null,e,[]);for(var c=a.length;c--;)if(d=e[c])a[c]=!(b[c]=d)}):function(a,e,c){b[0]=a;k(b,null,c,d);b[0]=null;return!d.pop()}}),has:e(function(a){return function(d){return 0<b(a,d).length}}),contains:e(function(a){a=a.replace(ja,ka);return function(b){return-1<(b.textContent||oa(b)).indexOf(a)}}),lang:e(function(a){sa.test(a||
"")||b.error("unsupported lang: "+a);a=a.replace(ja,ka).toLowerCase();return function(b){var d;do if(d=Y?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return d=d.toLowerCase(),d===a||0===d.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var d=a.location&&a.location.hash;return d&&d.slice(1)===b.id},root:function(a){return a===T},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:u(!1),
disabled:u(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return!0===a.selected},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(6>a.nodeType)return!1;return!0},parent:function(a){return!F.pseudos.empty(a)},header:function(a){return Ba.test(a.nodeName)},input:function(a){return Aa.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===
b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:p(function(){return[0]}),last:p(function(a,b){return[b-1]}),eq:p(function(a,b,d){return[0>d?d+b:d]}),even:p(function(a,b){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:p(function(a,b){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:p(function(a,b,d){for(b=0>d?d+b:d>b?b:d;0<=--b;)a.push(b);return a}),gt:p(function(a,b,
d){for(d=0>d?d+b:d;++d<b;)a.push(d);return a})}};F.pseudos.nth=F.pseudos.eq;for(y in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})F.pseudos[y]=h(y);for(y in{submit:!0,reset:!0})F.pseudos[y]=m(y);n.prototype=F.filters=F.pseudos;F.setFilters=new n;var ha=b.tokenize=function(a,d){var e,k,c,f,g;if(f=W[a+" "])return d?0:f.slice(0);f=a;var q=[];for(g=F.preFilter;f;){if(!r||(e=pa.exec(f)))e&&(f=f.slice(e[0].length)||f),q.push(k=[]);var r=!1;if(e=fa.exec(f))r=e.shift(),k.push({value:r,type:e[0].replace(aa,
" ")}),f=f.slice(r.length);for(c in F.filter)!(e=ba[c].exec(f))||g[c]&&!(e=g[c](e))||(r=e.shift(),k.push({value:r,type:c,matches:e}),f=f.slice(r.length));if(!r)break}return d?f.length:f?b.error(a):W(a,q).slice(0)};var Ca=b.compile=function(a,b){var d,e=[],k=[],c=X[a+" "];if(!c){b||(b=ha(a));for(d=b.length;d--;)c=z(b[d]),c[M]?e.push(c):k.push(c);c=X(a,A(k,e));c.selector=a}return c};var Ia=b.select=function(a,b,d,e){var k,c,f,g="function"===typeof a&&a,q=!e&&ha(a=g.selector||a);d=d||[];if(1===q.length){var r=
q[0]=q[0].slice(0);if(2<r.length&&"ID"===(c=r[0]).type&&9===b.nodeType&&Y&&F.relative[r[1].type]){b=(F.find.ID(c.matches[0].replace(ja,ka),b)||[])[0];if(!b)return d;g&&(b=b.parentNode);a=a.slice(r.shift().value.length)}for(k=ba.needsContext.test(a)?0:r.length;k--;){c=r[k];if(F.relative[f=c.type])break;if(f=F.find[f])if(e=f(c.matches[0].replace(ja,ka),ma.test(r[0].type)&&l(b.parentNode)||b)){r.splice(k,1);a=e.length&&B(r);if(!a)return ta.apply(d,e),d;break}}}(g||Ca(a,q))(e,b,!Y,d,!b||ma.test(a)&&l(b.parentNode)||
b);return d};L.sortStable=M.split("").sort(U).join("")===M;L.detectDuplicates=!!C;Da();L.sortDetached=c(function(a){return a.compareDocumentPosition(G.createElement("fieldset"))&1});c(function(a){a.innerHTML="<a href='#'></a>";return"#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,d){if(!d)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)});L.attributes&&c(function(a){a.innerHTML="<input/>";a.firstChild.setAttribute("value","");return""===a.firstChild.getAttribute("value")})||
f("value",function(a,b,d){if(!d&&"input"===a.nodeName.toLowerCase())return a.defaultValue});c(function(a){return null==a.getAttribute("disabled")})||f("checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",function(a,b,d){var e;if(!d)return!0===a[b]?b.toLowerCase():(e=a.getAttributeNode(b))&&e.specified?e.value:null});return b}(c);e.find=la;e.expr=la.selectors;e.expr[":"]=e.expr.pseudos;e.uniqueSort=e.unique=la.uniqueSort;e.text=
la.getText;e.isXMLDoc=la.isXML;e.contains=la.contains;e.escapeSelector=la.escape;var ba=function(a,b,d){for(var k=[],c=void 0!==d;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(c&&e(a).is(d))break;k.push(a)}return k},zb=function(a,b){for(var d=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&d.push(a);return d},Ab=e.expr.match.needsContext,Bb=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;e.filter=function(a,b,d){var k=b[0];d&&(a=":not("+a+")");return 1===b.length&&1===k.nodeType?e.find.matchesSelector(k,
a)?[k]:[]:e.find.matches(a,e.grep(b,function(a){return 1===a.nodeType}))};e.fn.extend({find:function(a){var b,d=this.length,k=this;if("string"!==typeof a)return this.pushStack(e(a).filter(function(){for(b=0;b<d;b++)if(e.contains(k[b],this))return!0}));var c=this.pushStack([]);for(b=0;b<d;b++)e.find(a,k[b],c);return 1<d?e.uniqueSort(c):c},filter:function(a){return this.pushStack(m(this,a||[],!1))},not:function(a){return this.pushStack(m(this,a||[],!0))},is:function(a){return!!m(this,"string"===typeof a&&
Ab.test(a)?e(a):a||[],!1).length}});var gc=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(e.fn.init=function(a,b,d){if(!a)return this;d=d||hc;if("string"===typeof a){var k="<"===a[0]&&">"===a[a.length-1]&&3<=a.length?[null,a,null]:gc.exec(a);if(!k||!k[1]&&b)return!b||b.jquery?(b||d).find(a):this.constructor(b).find(a);if(k[1]){if(b=b instanceof e?b[0]:b,e.merge(this,e.parseHTML(k[1],b&&b.nodeType?b.ownerDocument||b:A,!0)),Bb.test(k[1])&&e.isPlainObject(b))for(k in b)if(t(this[k]))this[k](b[k]);else this.attr(k,
b[k])}else if(a=A.getElementById(k[2]))this[0]=a,this.length=1;return this}return a.nodeType?(this[0]=a,this.length=1,this):t(a)?void 0!==d.ready?d.ready(a):a(e):e.makeArray(a,this)}).prototype=e.fn;var hc=e(A);var ic=/^(?:parents|prev(?:Until|All))/,jc={children:!0,contents:!0,next:!0,prev:!0};e.fn.extend({has:function(a){var b=e(a,this),d=b.length;return this.filter(function(){for(var a=0;a<d;a++)if(e.contains(this,b[a]))return!0})},closest:function(a,b){var d,k=0,c=this.length,f=[],g="string"!==
typeof a&&e(a);if(!Ab.test(a))for(;k<c;k++)for(d=this[k];d&&d!==b;d=d.parentNode)if(11>d.nodeType&&(g?-1<g.index(d):1===d.nodeType&&e.find.matchesSelector(d,a))){f.push(d);break}return this.pushStack(1<f.length?e.uniqueSort(f):f)},index:function(a){return a?"string"===typeof a?Ga.call(e(a),this[0]):Ga.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(e.uniqueSort(e.merge(this.get(),e(a,b))))},addBack:function(a){return this.add(null==
a?this.prevObject:this.prevObject.filter(a))}});e.each({parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},parents:function(a){return ba(a,"parentNode")},parentsUntil:function(a,b,d){return ba(a,"parentNode",d)},next:function(a){return p(a,"nextSibling")},prev:function(a){return p(a,"previousSibling")},nextAll:function(a){return ba(a,"nextSibling")},prevAll:function(a){return ba(a,"previousSibling")},nextUntil:function(a,b,d){return ba(a,"nextSibling",d)},prevUntil:function(a,b,d){return ba(a,
"previousSibling",d)},siblings:function(a){return zb((a.parentNode||{}).firstChild,a)},children:function(a){return zb(a.firstChild)},contents:function(a){if(null!=a.contentDocument&&xb(a.contentDocument))return a.contentDocument;f(a,"template")&&(a=a.content||a);return e.merge([],a.childNodes)}},function(a,b){e.fn[a]=function(d,k){var c=e.map(this,b,d);"Until"!==a.slice(-5)&&(k=d);k&&"string"===typeof k&&(c=e.filter(k,c));1<this.length&&(jc[a]||e.uniqueSort(c),ic.test(a)&&c.reverse());return this.pushStack(c)}});
var V=/[^\x20\t\r\n\f]+/g;e.Callbacks=function(a){a="string"===typeof a?B(a):e.extend({},a);var b,d,k,c,f=[],g=[],m=-1,p=function(){c=c||a.once;for(k=b=!0;g.length;m=-1)for(d=g.shift();++m<f.length;)!1===f[m].apply(d[0],d[1])&&a.stopOnFalse&&(m=f.length,d=!1);a.memory||(d=!1);b=!1;c&&(f=d?[]:"")},u={add:function(){f&&(d&&!b&&(m=f.length-1,g.push(d)),function Zb(b){e.each(b,function(b,d){t(d)?a.unique&&u.has(d)||f.push(d):d&&d.length&&"string"!==h(d)&&Zb(d)})}(arguments),d&&!b&&p());return this},remove:function(){e.each(arguments,
function(a,b){for(var d;-1<(d=e.inArray(b,f,d));)f.splice(d,1),d<=m&&m--});return this},has:function(a){return a?-1<e.inArray(a,f):0<f.length},empty:function(){f&&(f=[]);return this},disable:function(){c=g=[];f=d="";return this},disabled:function(){return!f},lock:function(){c=g=[];d||b||(f=d="");return this},locked:function(){return!!c},fireWith:function(a,d){c||(d=d||[],d=[a,d.slice?d.slice():d],g.push(d),b||p());return this},fire:function(){u.fireWith(this,arguments);return this},fired:function(){return!!k}};
return u};e.extend({Deferred:function(a){var b=[["notify","progress",e.Callbacks("memory"),e.Callbacks("memory"),2],["resolve","done",e.Callbacks("once memory"),e.Callbacks("once memory"),0,"resolved"],["reject","fail",e.Callbacks("once memory"),e.Callbacks("once memory"),1,"rejected"]],d="pending",k={state:function(){return d},always:function(){f.done(arguments).fail(arguments);return this},"catch":function(a){return k.then(null,a)},pipe:function(){var a=arguments;return e.Deferred(function(d){e.each(b,
function(b,e){var k=t(a[e[4]])&&a[e[4]];f[e[1]](function(){var a=k&&k.apply(this,arguments);if(a&&t(a.promise))a.promise().progress(d.notify).done(d.resolve).fail(d.reject);else d[e[0]+"With"](this,k?[a]:arguments)})});a=null}).promise()},then:function(a,d,k){function f(a,b,d,k){return function(){var q=this,r=arguments,h=function(){if(!(a<g)){var e=d.apply(q,r);if(e===b.promise())throw new TypeError("Thenable self-resolution");var c=e&&("object"===typeof e||"function"===typeof e)&&e.then;t(c)?k?c.call(e,
f(g,b,w,k),f(g,b,x,k)):(g++,c.call(e,f(g,b,w,k),f(g,b,x,k),f(g,b,w,b.notifyWith))):(d!==w&&(q=void 0,r=[e]),(k||b.resolveWith)(q,r))}},m=k?h:function(){try{h()}catch(z){e.Deferred.exceptionHook&&e.Deferred.exceptionHook(z,m.stackTrace),a+1>=g&&(d!==x&&(q=void 0,r=[z]),b.rejectWith(q,r))}};a?m():(e.Deferred.getStackHook&&(m.stackTrace=e.Deferred.getStackHook()),c.setTimeout(m))}}var g=0;return e.Deferred(function(e){b[0][3].add(f(0,e,t(k)?k:w,e.notifyWith));b[1][3].add(f(0,e,t(a)?a:w));b[2][3].add(f(0,
e,t(d)?d:x))}).promise()},promise:function(a){return null!=a?e.extend(a,k):k}},f={};e.each(b,function(a,e){var c=e[2],g=e[5];k[e[1]]=c.add;g&&c.add(function(){d=g},b[3-a][2].disable,b[3-a][3].disable,b[0][2].lock,b[0][3].lock);c.add(e[3].fire);f[e[0]]=function(){f[e[0]+"With"](this===f?void 0:this,arguments);return this};f[e[0]+"With"]=c.fireWith});k.promise(f);a&&a.call(f,f);return f},when:function(a){var b=arguments.length,d=b,k=Array(d),c=da.call(arguments),f=e.Deferred(),g=function(a){return function(d){k[a]=
this;c[a]=1<arguments.length?da.call(arguments):d;--b||f.resolveWith(k,c)}};if(1>=b&&(Z(a,f.done(g(d)).resolve,f.reject,!b),"pending"===f.state()||t(c[d]&&c[d].then)))return f.then();for(;d--;)Z(c[d],g(d),f.reject);return f.promise()}});var kc=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;e.Deferred.exceptionHook=function(a,b){c.console&&c.console.warn&&a&&kc.test(a.name)&&c.console.warn("jQuery.Deferred exception: "+a.message,a.stack,b)};e.readyException=function(a){c.setTimeout(function(){throw a;
})};var Za=e.Deferred();e.fn.ready=function(a){Za.then(a).catch(function(a){e.readyException(a)});return this};e.extend({isReady:!1,readyWait:1,ready:function(a){(!0===a?--e.readyWait:e.isReady)||(e.isReady=!0,!0!==a&&0<--e.readyWait||Za.resolveWith(A,[e]))}});e.ready.then=Za.then;"complete"===A.readyState||"loading"!==A.readyState&&!A.documentElement.doScroll?c.setTimeout(e.ready):(A.addEventListener("DOMContentLoaded",W),c.addEventListener("load",W));var U=function(a,b,d,k,c,f,g){var q=0,r=a.length,
m=null==d;if("object"===h(d))for(q in c=!0,d)U(a,b,q,d[q],!0,f,g);else if(void 0!==k&&(c=!0,t(k)||(g=!0),m&&(g?(b.call(a,k),b=null):(m=b,b=function(a,b,d){return m.call(e(a),d)})),b))for(;q<r;q++)b(a[q],d,g?k:k.call(a[q],q,b(a[q],d)));return c?a:m?b.call(a):r?b(a[0],d):f},Pb=/^-ms-/,Qb=/-([a-z])/g,ca=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};za.uid=1;za.prototype={cache:function(a){var b=a[this.expando];b||(b={},ca(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,
{value:b,configurable:!0})));return b},set:function(a,b,d){var e;a=this.cache(a);if("string"===typeof b)a[R(b)]=d;else for(e in b)a[R(e)]=b[e];return a},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][R(b)]},access:function(a,b,d){if(void 0===b||b&&"string"===typeof b&&void 0===d)return this.get(a,b);this.set(a,b,d);return void 0!==d?d:b},remove:function(a,b){var d,k=a[this.expando];if(void 0!==k){if(void 0!==b)for(Array.isArray(b)?b=b.map(R):(b=R(b),b=b in k?[b]:
b.match(V)||[]),d=b.length;d--;)delete k[b[d]];if(void 0===b||e.isEmptyObject(k))a.nodeType?a[this.expando]=void 0:delete a[this.expando]}},hasData:function(a){a=a[this.expando];return void 0!==a&&!e.isEmptyObject(a)}};var v=new za,C=new za,Sb=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Rb=/[A-Z]/g;e.extend({hasData:function(a){return C.hasData(a)||v.hasData(a)},data:function(a,b,d){return C.access(a,b,d)},removeData:function(a,b){C.remove(a,b)},_data:function(a,b,d){return v.access(a,b,d)},_removeData:function(a,
b){v.remove(a,b)}});e.fn.extend({data:function(a,b){var d,e=this[0],c=e&&e.attributes;if(void 0===a){if(this.length){var f=C.get(e);if(1===e.nodeType&&!v.get(e,"hasDataAttrs")){for(d=c.length;d--;)if(c[d]){var g=c[d].name;0===g.indexOf("data-")&&(g=R(g.slice(5)),db(e,g,f[g]))}v.set(e,"hasDataAttrs",!0)}}return f}return"object"===typeof a?this.each(function(){C.set(this,a)}):U(this,function(b){if(e&&void 0===b){var d=C.get(e,a);if(void 0!==d)return d;d=db(e,a);if(void 0!==d)return d}else this.each(function(){C.set(this,
a,b)})},null,b,1<arguments.length,null,!0)},removeData:function(a){return this.each(function(){C.remove(this,a)})}});e.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var c=v.get(a,b);d&&(!c||Array.isArray(d)?c=v.access(a,b,e.makeArray(d)):c.push(d));return c||[]}},dequeue:function(a,b){b=b||"fx";var d=e.queue(a,b),c=d.length,f=d.shift(),g=e._queueHooks(a,b),h=function(){e.dequeue(a,b)};"inprogress"===f&&(f=d.shift(),c--);f&&("fx"===b&&d.unshift("inprogress"),delete g.stop,f.call(a,h,g));
!c&&g&&g.empty.fire()},_queueHooks:function(a,b){var d=b+"queueHooks";return v.get(a,d)||v.access(a,d,{empty:e.Callbacks("once memory").add(function(){v.remove(a,[b+"queue",d])})})}});e.fn.extend({queue:function(a,b){var d=2;"string"!==typeof a&&(b=a,a="fx",d--);return arguments.length<d?e.queue(this[0],a):void 0===b?this:this.each(function(){var d=e.queue(this,a,b);e._queueHooks(this,a);"fx"===a&&"inprogress"!==d[0]&&e.dequeue(this,a)})},dequeue:function(a){return this.each(function(){e.dequeue(this,
a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var d,c=1,f=e.Deferred(),g=this,h=this.length,m=function(){--c||f.resolveWith(g,[g])};"string"!==typeof a&&(b=a,a=void 0);for(a=a||"fx";h--;)(d=v.get(g[h],a+"queueHooks"))&&d.empty&&(c++,d.empty.add(m));m();return f.promise(b)}});var Cb=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Aa=new RegExp("^(?:([+-])=|)("+Cb+")([a-z%]*)$","i"),X=["Top","Right","Bottom","Left"],ea=A.documentElement,pa=function(a){return e.contains(a.ownerDocument,
a)},lc={composed:!0};ea.getRootNode&&(pa=function(a){return e.contains(a.ownerDocument,a)||a.getRootNode(lc)===a.ownerDocument});var oa=function(a,b){a=b||a;return"none"===a.style.display||""===a.style.display&&pa(a)&&"none"===e.css(a,"display")},fb={};e.fn.extend({show:function(){return aa(this,!0)},hide:function(){return aa(this)},toggle:function(a){return"boolean"===typeof a?a?this.show():this.hide():this.each(function(){oa(this)?e(this).show():e(this).hide()})}});var Fa=/^(?:checkbox|radio)$/i,
hb=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,ib=/^$|^module$|\/(?:java|ecma)script/i;(function(){var a=A.createDocumentFragment().appendChild(A.createElement("div")),b=A.createElement("input");b.setAttribute("type","radio");b.setAttribute("checked","checked");b.setAttribute("name","t");a.appendChild(b);y.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked;a.innerHTML="<textarea>x</textarea>";y.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue;a.innerHTML="<option></option>";y.option=!!a.lastChild})();
var H={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,"",""]};H.tbody=H.tfoot=H.colgroup=H.caption=H.thead;H.th=H.td;y.option||(H.optgroup=H.option=[1,"<select multiple='multiple'>","</select>"]);var Ub=/<|&#?\w+;/,Db=/^([^.]*)(?:\.(.+)|)/;e.event={global:{},add:function(a,b,d,c,f){var k,g,q,h;var m=v.get(a);if(ca(a)){if(d.handler){var p=d;d=p.handler;f=p.selector}f&&
e.find.matchesSelector(ea,f);d.guid||(d.guid=e.guid++);(g=m.events)||(g=m.events=Object.create(null));(k=m.handle)||(k=m.handle=function(b){return"undefined"!==typeof e&&e.event.triggered!==b.type?e.event.dispatch.apply(a,arguments):void 0});b=(b||"").match(V)||[""];for(m=b.length;m--;){var l=Db.exec(b[m])||[];var n=q=l[1];var B=(l[2]||"").split(".").sort();n&&(l=e.event.special[n]||{},n=(f?l.delegateType:l.bindType)||n,l=e.event.special[n]||{},q=e.extend({type:n,origType:q,data:c,handler:d,guid:d.guid,
selector:f,needsContext:f&&e.expr.match.needsContext.test(f),namespace:B.join(".")},p),(h=g[n])||(h=g[n]=[],h.delegateCount=0,l.setup&&!1!==l.setup.call(a,c,B,k)||a.addEventListener&&a.addEventListener(n,k)),l.add&&(l.add.call(a,q),q.handler.guid||(q.handler.guid=d.guid)),f?h.splice(h.delegateCount++,0,q):h.push(q),e.event.global[n]=!0)}}},remove:function(a,b,d,c,f){var k,g,q,h,m,p=v.hasData(a)&&v.get(a);if(p&&(q=p.events)){b=(b||"").match(V)||[""];for(h=b.length;h--;){var l=Db.exec(b[h])||[];var n=
m=l[1];var B=(l[2]||"").split(".").sort();if(n){var w=e.event.special[n]||{};n=(c?w.delegateType:w.bindType)||n;var t=q[n]||[];l=l[2]&&new RegExp("(^|\\.)"+B.join("\\.(?:.*\\.|)")+"(\\.|$)");for(g=k=t.length;k--;){var x=t[k];!f&&m!==x.origType||d&&d.guid!==x.guid||l&&!l.test(x.namespace)||c&&c!==x.selector&&("**"!==c||!x.selector)||(t.splice(k,1),x.selector&&t.delegateCount--,w.remove&&w.remove.call(a,x))}g&&!t.length&&(w.teardown&&!1!==w.teardown.call(a,B,p.handle)||e.removeEvent(a,n,p.handle),delete q[n])}else for(n in q)e.event.remove(a,
n+b[h],d,c,!0)}e.isEmptyObject(q)&&v.remove(a,"handle events")}},dispatch:function(a){var b,d,c,f=Array(arguments.length),g=e.event.fix(a);var h=(v.get(this,"events")||Object.create(null))[g.type]||[];var m=e.event.special[g.type]||{};f[0]=g;for(b=1;b<arguments.length;b++)f[b]=arguments[b];g.delegateTarget=this;if(!m.preDispatch||!1!==m.preDispatch.call(this,g)){var p=e.event.handlers.call(this,g,h);for(b=0;(c=p[b++])&&!g.isPropagationStopped();)for(g.currentTarget=c.elem,h=0;(d=c.handlers[h++])&&
!g.isImmediatePropagationStopped();)if(!g.rnamespace||!1===d.namespace||g.rnamespace.test(d.namespace))g.handleObj=d,g.data=d.data,d=((e.event.special[d.origType]||{}).handle||d.handler).apply(c.elem,f),void 0!==d&&!1===(g.result=d)&&(g.preventDefault(),g.stopPropagation());m.postDispatch&&m.postDispatch.call(this,g);return g.result}},handlers:function(a,b){var d,c=[],f=b.delegateCount,g=a.target;if(f&&g.nodeType&&!("click"===a.type&&1<=a.button))for(;g!==this;g=g.parentNode||this)if(1===g.nodeType&&
("click"!==a.type||!0!==g.disabled)){var h=[];var m={};for(d=0;d<f;d++){var p=b[d];var u=p.selector+" ";void 0===m[u]&&(m[u]=p.needsContext?-1<e(u,this).index(g):e.find(u,this,null,[g]).length);m[u]&&h.push(p)}h.length&&c.push({elem:g,handlers:h})}f<b.length&&c.push({elem:this,handlers:b.slice(f)});return c},addProp:function(a,b){Object.defineProperty(e.Event.prototype,a,{enumerable:!0,configurable:!0,get:t(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},
set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[e.expando]?a:new e.Event(a)},special:{load:{noBubble:!0},click:{setup:function(a){a=this||a;Fa.test(a.type)&&a.click&&f(a,"input")&&ha(a,"click",fa);return!1},trigger:function(a){a=this||a;Fa.test(a.type)&&a.click&&f(a,"input")&&ha(a,"click");return!0},_default:function(a){a=a.target;return Fa.test(a.type)&&a.click&&f(a,"input")&&v.get(a,"click")||f(a,"a")}},beforeunload:{postDispatch:function(a){void 0!==
a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}};e.removeEvent=function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d)};e.Event=function(a,b){if(!(this instanceof e.Event))return new e.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&!1===a.returnValue?fa:qa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=
a.relatedTarget):this.type=a;b&&e.extend(this,b);this.timeStamp=a&&a.timeStamp||Date.now();this[e.expando]=!0};e.Event.prototype={constructor:e.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=fa;a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=fa;a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=
this.originalEvent;this.isImmediatePropagationStopped=fa;a&&!this.isSimulated&&a.stopImmediatePropagation();this.stopPropagation()}};e.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},e.event.addProp);
e.each({focus:"focusin",blur:"focusout"},function(a,b){e.event.special[a]={setup:function(){ha(this,a,Vb);return!1},trigger:function(){ha(this,a);return!0},_default:function(){return!0},delegateType:b}});e.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){e.event.special[a]={delegateType:b,bindType:b,handle:function(a){var d=a.relatedTarget,c=a.handleObj;if(!d||d!==this&&!e.contains(this,d)){a.type=c.origType;var f=c.handler.apply(this,
arguments);a.type=b}return f}}});e.fn.extend({on:function(a,b,d,e){return Pa(this,a,b,d,e)},one:function(a,b,d,e){return Pa(this,a,b,d,e,1)},off:function(a,b,d){if(a&&a.preventDefault&&a.handleObj){var c=a.handleObj;e(a.delegateTarget).off(c.namespace?c.origType+"."+c.namespace:c.origType,c.selector,c.handler);return this}if("object"===typeof a){for(c in a)this.off(c,b,a[c]);return this}if(!1===b||"function"===typeof b)d=b,b=void 0;!1===d&&(d=qa);return this.each(function(){e.event.remove(this,a,
d,b)})}});var mc=/<script|<style|<link/i,Yb=/checked\s*(?:[^=]|=\s*.checked.)/i,$b=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;e.extend({htmlPrefilter:function(a){return a},clone:function(a,b,d){var c,f=a.cloneNode(!0),g=pa(a);if(!(y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||e.isXMLDoc(a))){var h=J(f);var m=J(a);var p=0;for(c=m.length;p<c;p++){var u=m[p],n=h[p],l=n.nodeName.toLowerCase();if("input"===l&&Fa.test(u.type))n.checked=u.checked;else if("input"===l||"textarea"===l)n.defaultValue=u.defaultValue}}if(b)if(d)for(m=
m||J(a),h=h||J(f),p=0,c=m.length;p<c;p++)kb(m[p],h[p]);else kb(a,f);h=J(f,"script");0<h.length&&Oa(h,!g&&J(a,"script"));return f},cleanData:function(a){for(var b,d,c,f=e.event.special,g=0;void 0!==(d=a[g]);g++)if(ca(d)){if(b=d[v.expando]){if(b.events)for(c in b.events)f[c]?e.event.remove(d,c):e.removeEvent(d,c,b.handle);d[v.expando]=void 0}d[C.expando]&&(d[C.expando]=void 0)}}});e.fn.extend({detach:function(a){return mb(this,a,!0)},remove:function(a){return mb(this,a)},text:function(a){return U(this,
function(a){return void 0===a?e.text(this):this.empty().each(function(){if(1===this.nodeType||11===this.nodeType||9===this.nodeType)this.textContent=a})},null,a,arguments.length)},append:function(){return ra(this,arguments,function(a){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||jb(this,a).appendChild(a)})},prepend:function(){return ra(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ra(this,
arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ra(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(e.cleanData(J(a,!1)),a.textContent="");return this},clone:function(a,b){a=null==a?!1:a;b=null==b?a:b;return this.map(function(){return e.clone(this,a,b)})},html:function(a){return U(this,function(a){var b=this[0]||{},c=0,f=this.length;
if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"===typeof a&&!mc.test(a)&&!H[(hb.exec(a)||["",""])[1].toLowerCase()]){a=e.htmlPrefilter(a);try{for(;c<f;c++)b=this[c]||{},1===b.nodeType&&(e.cleanData(J(b,!1)),b.innerHTML=a);b=0}catch(r){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ra(this,arguments,function(b){var d=this.parentNode;0>e.inArray(this,a)&&(e.cleanData(J(this)),d&&d.replaceChild(b,this))},a)}});e.each({appendTo:"append",prependTo:"prepend",
insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){e.fn[a]=function(a){for(var d=[],c=e(a),f=c.length-1,g=0;g<=f;g++)a=g===f?this:this.clone(!0),e(c[g])[b](a),Ya.apply(d,a.get());return this.pushStack(d)}});var Qa=new RegExp("^("+Cb+")(?!px)[a-z%]+$","i"),Ca=function(a){var b=a.ownerDocument.defaultView;b&&b.opener||(b=c);return b.getComputedStyle(a)},Eb=function(a,b,d){var e,c={};for(e in b)c[e]=a.style[e],a.style[e]=b[e];d=d.call(a);for(e in b)a.style[e]=c[e];return d},
ac=new RegExp(X.join("|"),"i");(function(){function a(){if(n){p.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0";n.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%";ea.appendChild(p).appendChild(n);var a=c.getComputedStyle(n);b="1%"!==a.top;m=12===Math.round(parseFloat(a.marginLeft));n.style.right="60%";g=36===Math.round(parseFloat(a.right));d=36===Math.round(parseFloat(a.width));
n.style.position="absolute";f=12===Math.round(parseFloat(n.offsetWidth/3));ea.removeChild(p);n=null}}var b,d,f,g,h,m,p=A.createElement("div"),n=A.createElement("div");n.style&&(n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===n.style.backgroundClip,e.extend(y,{boxSizingReliable:function(){a();return d},pixelBoxStyles:function(){a();return g},pixelPosition:function(){a();return b},reliableMarginLeft:function(){a();return m},scrollboxSize:function(){a();
return f},reliableTrDimensions:function(){if(null==h){var a=A.createElement("table");var b=A.createElement("tr");var d=A.createElement("div");a.style.cssText="position:absolute;left:-11111px;border-collapse:separate";b.style.cssText="border:1px solid";b.style.height="1px";d.style.height="9px";d.style.display="block";ea.appendChild(a).appendChild(b).appendChild(d);d=c.getComputedStyle(b);h=parseInt(d.height,10)+parseInt(d.borderTopWidth,10)+parseInt(d.borderBottomWidth,10)===b.offsetHeight;ea.removeChild(a)}return h}}))})();
var qb=["Webkit","Moz","ms"],pb=A.createElement("div").style,ob={},nc=/^(none|table(?!-c[ea]).+)/,Fb=/^--/,oc={position:"absolute",visibility:"hidden",display:"block"},Gb={letterSpacing:"0",fontWeight:"400"};e.extend({cssHooks:{opacity:{get:function(a,b){if(b)return a=Ba(a,"opacity"),""===a?"1":a}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!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,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(a,b,d,c){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var f,k=R(b),g=Fb.test(b),h=a.style;g||(b=Ra(k));var m=e.cssHooks[b]||e.cssHooks[k];if(void 0!==d){var p=typeof d;"string"===p&&(f=Aa.exec(d))&&f[1]&&(d=eb(a,b,f),p="number");null!=d&&d===d&&("number"!==p||g||(d+=f&&f[3]||(e.cssNumber[k]?"":"px")),y.clearCloneStyle||""!==d||0!==b.indexOf("background")||(h[b]="inherit"),m&&"set"in m&&void 0===
(d=m.set(a,d,c))||(g?h.setProperty(b,d):h[b]=d))}else return m&&"get"in m&&void 0!==(f=m.get(a,!1,c))?f:h[b]}},css:function(a,b,d,c){var f;var k=R(b);Fb.test(b)||(b=Ra(k));(k=e.cssHooks[b]||e.cssHooks[k])&&"get"in k&&(f=k.get(a,!0,d));void 0===f&&(f=Ba(a,b,c));"normal"===f&&b in Gb&&(f=Gb[b]);return""===d||d?(a=parseFloat(f),!0===d||isFinite(a)?a||0:f):f}});e.each(["height","width"],function(a,b){e.cssHooks[b]={get:function(a,c,f){if(c)return!nc.test(e.css(a,"display"))||a.getClientRects().length&&
a.getBoundingClientRect().width?sb(a,b,f):Eb(a,oc,function(){return sb(a,b,f)})},set:function(a,c,f){var d,k=Ca(a),g=!y.scrollboxSize()&&"absolute"===k.position,h=(g||f)&&"border-box"===e.css(a,"boxSizing",!1,k);f=f?Sa(a,b,f,h,k):0;h&&g&&(f-=Math.ceil(a["offset"+b[0].toUpperCase()+b.slice(1)]-parseFloat(k[b])-Sa(a,b,"border",!1,k)-.5));f&&(d=Aa.exec(c))&&"px"!==(d[3]||"px")&&(a.style[b]=c,c=e.css(a,b));return rb(a,c,f)}}});e.cssHooks.marginLeft=nb(y.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ba(a,
"marginLeft"))||a.getBoundingClientRect().left-Eb(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"});e.each({margin:"",padding:"",border:"Width"},function(a,b){e.cssHooks[a+b]={expand:function(d){var e=0,c={};for(d="string"===typeof d?d.split(" "):[d];4>e;e++)c[a+X[e]+b]=d[e]||d[e-2]||d[0];return c}};"margin"!==a&&(e.cssHooks[a+b].set=rb)});e.fn.extend({css:function(a,b){return U(this,function(a,b,c){var d,f={},k=0;if(Array.isArray(b)){c=Ca(a);for(d=b.length;k<d;k++)f[b[k]]=
e.css(a,b[k],!1,c);return f}return void 0!==c?e.style(a,b,c):e.css(a,b)},a,b,1<arguments.length)}});e.Tween=N;N.prototype={constructor:N,init:function(a,b,d,c,f,g){this.elem=a;this.prop=d;this.easing=f||e.easing._default;this.options=b;this.start=this.now=this.cur();this.end=c;this.unit=g||(e.cssNumber[d]?"":"px")},cur:function(){var a=N.propHooks[this.prop];return a&&a.get?a.get(this):N.propHooks._default.get(this)},run:function(a){var b,d=N.propHooks[this.prop];this.pos=this.options.duration?b=
e.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):b=a;this.now=(this.end-this.start)*b+this.start;this.options.step&&this.options.step.call(this.elem,this.now,this);d&&d.set?d.set(this):N.propHooks._default.set(this);return this}};N.prototype.init.prototype=N.prototype;N.propHooks={_default:{get:function(a){return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(a=e.css(a.elem,a.prop,""))&&"auto"!==a?a:0},set:function(a){if(e.fx.step[a.prop])e.fx.step[a.prop](a);
else 1!==a.elem.nodeType||!e.cssHooks[a.prop]&&null==a.elem.style[Ra(a.prop)]?a.elem[a.prop]=a.now:e.style(a.elem,a.prop,a.now+a.unit)}}};N.propHooks.scrollTop=N.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}};e.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"};e.fx=N.prototype.init;e.fx.step={};var sa,Ia,pc=/^(?:toggle|show|hide)$/,qc=/queueHooks$/;e.Animation=e.extend(E,{tweeners:{"*":[function(a,
b){var d=this.createTween(a,b);eb(d.elem,a,Aa.exec(b),d);return d}]},tweener:function(a,b){t(a)?(b=a,a=["*"]):a=a.match(V);for(var d,e=0,c=a.length;e<c;e++)d=a[e],E.tweeners[d]=E.tweeners[d]||[],E.tweeners[d].unshift(b)},prefilters:[function(a,b,d){var c;var f="width"in b||"height"in b;var g=this,h={},m=a.style,p=a.nodeType&&oa(a),u=v.get(a,"fxshow");if(!d.queue){var n=e._queueHooks(a,"fx");if(null==n.unqueued){n.unqueued=0;var l=n.empty.fire;n.empty.fire=function(){n.unqueued||l()}}n.unqueued++;
g.always(function(){g.always(function(){n.unqueued--;e.queue(a,"fx").length||n.empty.fire()})})}for(c in b){var B=b[c];if(pc.test(B)){delete b[c];var w=w||"toggle"===B;if(B===(p?"hide":"show"))if("show"===B&&u&&void 0!==u[c])p=!0;else continue;h[c]=u&&u[c]||e.style(a,c)}}if((b=!e.isEmptyObject(b))||!e.isEmptyObject(h)){if(f&&1===a.nodeType){d.overflow=[m.overflow,m.overflowX,m.overflowY];var t=u&&u.display;null==t&&(t=v.get(a,"display"));f=e.css(a,"display");"none"===f&&(t?f=t:(aa([a],!0),t=a.style.display||
t,f=e.css(a,"display"),aa([a])));("inline"===f||"inline-block"===f&&null!=t)&&"none"===e.css(a,"float")&&(b||(g.done(function(){m.display=t}),null==t&&(f=m.display,t="none"===f?"":f)),m.display="inline-block")}d.overflow&&(m.overflow="hidden",g.always(function(){m.overflow=d.overflow[0];m.overflowX=d.overflow[1];m.overflowY=d.overflow[2]}));b=!1;for(c in h)b||(u?"hidden"in u&&(p=u.hidden):u=v.access(a,"fxshow",{display:t}),w&&(u.hidden=!p),p&&aa([a],!0),g.done(function(){p||aa([a]);v.remove(a,"fxshow");
for(c in h)e.style(a,c,h[c])})),b=ub(p?u[c]:0,c,g),c in u||(u[c]=b.start,p&&(b.end=b.start,b.start=0))}}],prefilter:function(a,b){b?E.prefilters.unshift(a):E.prefilters.push(a)}});e.speed=function(a,b,d){var c=a&&"object"===typeof a?e.extend({},a):{complete:d||!d&&b||t(a)&&a,duration:a,easing:d&&b||b&&!t(b)&&b};e.fx.off?c.duration=0:"number"!==typeof c.duration&&(c.duration=c.duration in e.fx.speeds?e.fx.speeds[c.duration]:e.fx.speeds._default);if(null==c.queue||!0===c.queue)c.queue="fx";c.old=c.complete;
c.complete=function(){t(c.old)&&c.old.call(this);c.queue&&e.dequeue(this,c.queue)};return c};e.fn.extend({fadeTo:function(a,b,d,e){return this.filter(oa).css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,c){var f=e.isEmptyObject(a),g=e.speed(b,d,c);b=function(){var b=E(this,e.extend({},a),g);(f||v.get(this,"finish"))&&b.stop(!0)};b.finish=b;return f||!1===g.queue?this.each(b):this.queue(g.queue,b)},stop:function(a,b,d){var c=function(a){var b=a.stop;delete a.stop;b(d)};
"string"!==typeof a&&(d=b,b=a,a=void 0);b&&this.queue(a||"fx",[]);return this.each(function(){var b=!0,f=null!=a&&a+"queueHooks",g=e.timers,k=v.get(this);if(f)k[f]&&k[f].stop&&c(k[f]);else for(f in k)k[f]&&k[f].stop&&qc.test(f)&&c(k[f]);for(f=g.length;f--;)g[f].elem!==this||null!=a&&g[f].queue!==a||(g[f].anim.stop(d),b=!1,g.splice(f,1));!b&&d||e.dequeue(this,a)})},finish:function(a){!1!==a&&(a=a||"fx");return this.each(function(){var b=v.get(this),d=b[a+"queue"];var c=b[a+"queueHooks"];var f=e.timers,
g=d?d.length:0;b.finish=!0;e.queue(this,a,[]);c&&c.stop&&c.stop.call(this,!0);for(c=f.length;c--;)f[c].elem===this&&f[c].queue===a&&(f[c].anim.stop(!0),f.splice(c,1));for(c=0;c<g;c++)d[c]&&d[c].finish&&d[c].finish.call(this);delete b.finish})}});e.each(["toggle","show","hide"],function(a,b){var d=e.fn[b];e.fn[b]=function(a,e,c){return null==a||"boolean"===typeof a?d.apply(this,arguments):this.animate(La(b,!0),a,e,c)}});e.each({slideDown:La("show"),slideUp:La("hide"),slideToggle:La("toggle"),fadeIn:{opacity:"show"},
fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){e.fn[a]=function(a,e,c){return this.animate(b,a,e,c)}});e.timers=[];e.fx.tick=function(){var a=0,b=e.timers;for(sa=Date.now();a<b.length;a++){var d=b[a];d()||b[a]!==d||b.splice(a--,1)}b.length||e.fx.stop();sa=void 0};e.fx.timer=function(a){e.timers.push(a);e.fx.start()};e.fx.interval=13;e.fx.start=function(){Ia||(Ia=!0,Ta())};e.fx.stop=function(){Ia=null};e.fx.speeds={slow:600,fast:200,_default:400};e.fn.delay=function(a,b){a=e.fx?
e.fx.speeds[a]||a:a;return this.queue(b||"fx",function(b,e){var d=c.setTimeout(b,a);e.stop=function(){c.clearTimeout(d)}})};(function(){var a=A.createElement("input"),b=A.createElement("select").appendChild(A.createElement("option"));a.type="checkbox";y.checkOn=""!==a.value;y.optSelected=b.selected;a=A.createElement("input");a.value="t";a.type="radio";y.radioValue="t"===a.value})();var ma=e.expr.attrHandle;e.fn.extend({attr:function(a,b){return U(this,e.attr,a,b,1<arguments.length)},removeAttr:function(a){return this.each(function(){e.removeAttr(this,
a)})}});e.extend({attr:function(a,b,d){var c,f,g=a.nodeType;if(3!==g&&8!==g&&2!==g){if("undefined"===typeof a.getAttribute)return e.prop(a,b,d);1===g&&e.isXMLDoc(a)||(f=e.attrHooks[b.toLowerCase()]||(e.expr.match.bool.test(b)?rc:void 0));if(void 0!==d){if(null===d){e.removeAttr(a,b);return}if(f&&"set"in f&&void 0!==(c=f.set(a,d,b)))return c;a.setAttribute(b,d+"");return d}if(f&&"get"in f&&null!==(c=f.get(a,b)))return c;c=e.find.attr(a,b);return null==c?void 0:c}},attrHooks:{type:{set:function(a,b){if(!y.radioValue&&
"radio"===b&&f(a,"input")){var d=a.value;a.setAttribute("type",b);d&&(a.value=d);return b}}}},removeAttr:function(a,b){var d=0,e=b&&b.match(V);if(e&&1===a.nodeType)for(;b=e[d++];)a.removeAttribute(b)}});var rc={set:function(a,b,d){!1===b?e.removeAttr(a,d):a.setAttribute(d,d);return d}};e.each(e.expr.match.bool.source.match(/\w+/g),function(a,b){var d=ma[b]||e.find.attr;ma[b]=function(a,b,e){var c=b.toLowerCase();if(!e){var f=ma[c];ma[c]=g;var g=null!=d(a,b,e)?c:null;ma[c]=f}return g}});var sc=/^(?:input|select|textarea|button)$/i,
tc=/^(?:a|area)$/i;e.fn.extend({prop:function(a,b){return U(this,e.prop,a,b,1<arguments.length)},removeProp:function(a){return this.each(function(){delete this[e.propFix[a]||a]})}});e.extend({prop:function(a,b,d){var c,f=a.nodeType;if(3!==f&&8!==f&&2!==f){if(1!==f||!e.isXMLDoc(a)){b=e.propFix[b]||b;var g=e.propHooks[b]}return void 0!==d?g&&"set"in g&&void 0!==(c=g.set(a,d,b))?c:a[b]=d:g&&"get"in g&&null!==(c=g.get(a,b))?c:a[b]}},propHooks:{tabIndex:{get:function(a){var b=e.find.attr(a,"tabindex");
return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}});y.optSelected||(e.propHooks.selected={get:function(a){(a=a.parentNode)&&a.parentNode&&a.parentNode.selectedIndex;return null},set:function(a){if(a=a.parentNode)a.selectedIndex,a.parentNode&&a.parentNode.selectedIndex}});e.each("tabIndex readOnly maxLength cellSpacing cellPadding rowSpan colSpan useMap frameBorder contentEditable".split(" "),function(){e.propFix[this.toLowerCase()]=
this});e.fn.extend({addClass:function(a){var b,d,c,f,g=0;if(t(a))return this.each(function(b){e(this).addClass(a.call(this,b,ia(this)))});var h=Ua(a);if(h.length)for(;b=this[g++];){var m=ia(b);if(d=1===b.nodeType&&" "+P(m)+" "){for(f=0;c=h[f++];)0>d.indexOf(" "+c+" ")&&(d+=c+" ");d=P(d);m!==d&&b.setAttribute("class",d)}}return this},removeClass:function(a){var b,d,c,f,g=0;if(t(a))return this.each(function(b){e(this).removeClass(a.call(this,b,ia(this)))});if(!arguments.length)return this.attr("class",
"");var h=Ua(a);if(h.length)for(;b=this[g++];){var m=ia(b);if(d=1===b.nodeType&&" "+P(m)+" "){for(f=0;c=h[f++];)for(;-1<d.indexOf(" "+c+" ");)d=d.replace(" "+c+" "," ");d=P(d);m!==d&&b.setAttribute("class",d)}}return this},toggleClass:function(a,b){var d=typeof a,c="string"===d||Array.isArray(a);return"boolean"===typeof b&&c?b?this.addClass(a):this.removeClass(a):t(a)?this.each(function(d){e(this).toggleClass(a.call(this,d,ia(this),b),b)}):this.each(function(){var b,f;if(c){var g=0;var k=e(this);
for(f=Ua(a);b=f[g++];)k.hasClass(b)?k.removeClass(b):k.addClass(b)}else if(void 0===a||"boolean"===d)(b=ia(this))&&v.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||!1===a?"":v.get(this,"__className__")||"")})},hasClass:function(a){var b,d=0;for(a=" "+a+" ";b=this[d++];)if(1===b.nodeType&&-1<(" "+P(ia(b))+" ").indexOf(a))return!0;return!1}});var uc=/\r/g;e.fn.extend({val:function(a){var b,d,c=this[0];if(arguments.length){var f=t(a);return this.each(function(d){1===this.nodeType&&
(d=f?a.call(this,d,e(this).val()):a,null==d?d="":"number"===typeof d?d+="":Array.isArray(d)&&(d=e.map(d,function(a){return null==a?"":a+""})),b=e.valHooks[this.type]||e.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,d,"value")||(this.value=d))})}if(c){if((b=e.valHooks[c.type]||e.valHooks[c.nodeName.toLowerCase()])&&"get"in b&&void 0!==(d=b.get(c,"value")))return d;d=c.value;return"string"===typeof d?d.replace(uc,""):null==d?"":d}}});e.extend({valHooks:{option:{get:function(a){var b=
e.find.attr(a,"value");return null!=b?b:P(e.text(a))}},select:{get:function(a){var b=a.options,d=a.selectedIndex,c="select-one"===a.type,g=c?null:[],h=c?d+1:b.length;for(a=0>d?h:c?d:0;a<h;a++){var m=b[a];if(!(!m.selected&&a!==d||m.disabled||m.parentNode.disabled&&f(m.parentNode,"optgroup"))){m=e(m).val();if(c)return m;g.push(m)}}return g},set:function(a,b){for(var d,c=a.options,f=e.makeArray(b),g=c.length;g--;)if(b=c[g],b.selected=-1<e.inArray(e.valHooks.option.get(b),f))d=!0;d||(a.selectedIndex=
-1);return f}}}});e.each(["radio","checkbox"],function(){e.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=-1<e.inArray(e(a).val(),b)}};y.checkOn||(e.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});y.focusin="onfocusin"in c;var Hb=/^(?:focusinfocus|focusoutblur)$/,Ib=function(a){a.stopPropagation()};e.extend(e.event,{trigger:function(a,b,d,f){var g,k,h,m=[d||A],p=Ma.call(a,"type")?a.type:a;var n=Ma.call(a,"namespace")?a.namespace.split("."):
[];var l=h=g=d=d||A;if(3!==d.nodeType&&8!==d.nodeType&&!Hb.test(p+e.event.triggered)){-1<p.indexOf(".")&&(n=p.split("."),p=n.shift(),n.sort());var B=0>p.indexOf(":")&&"on"+p;a=a[e.expando]?a:new e.Event(p,"object"===typeof a&&a);a.isTrigger=f?2:3;a.namespace=n.join(".");a.rnamespace=a.namespace?new RegExp("(^|\\.)"+n.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;a.result=void 0;a.target||(a.target=d);b=null==b?[a]:e.makeArray(b,[a]);n=e.event.special[p]||{};if(f||!n.trigger||!1!==n.trigger.apply(d,b)){if(!f&&
!n.noBubble&&!na(d)){var w=n.delegateType||p;Hb.test(w+p)||(l=l.parentNode);for(;l;l=l.parentNode)m.push(l),g=l;g===(d.ownerDocument||A)&&m.push(g.defaultView||g.parentWindow||c)}for(g=0;(l=m[g++])&&!a.isPropagationStopped();)h=l,a.type=1<g?w:n.bindType||p,(k=(v.get(l,"events")||Object.create(null))[a.type]&&v.get(l,"handle"))&&k.apply(l,b),(k=B&&l[B])&&k.apply&&ca(l)&&(a.result=k.apply(l,b),!1===a.result&&a.preventDefault());a.type=p;f||a.isDefaultPrevented()||n._default&&!1!==n._default.apply(m.pop(),
b)||!ca(d)||!B||!t(d[p])||na(d)||((g=d[B])&&(d[B]=null),e.event.triggered=p,a.isPropagationStopped()&&h.addEventListener(p,Ib),d[p](),a.isPropagationStopped()&&h.removeEventListener(p,Ib),e.event.triggered=void 0,g&&(d[B]=g));return a.result}}},simulate:function(a,b,d){a=e.extend(new e.Event,d,{type:a,isSimulated:!0});e.event.trigger(a,null,b)}});e.fn.extend({trigger:function(a,b){return this.each(function(){e.event.trigger(a,b,this)})},triggerHandler:function(a,b){var d=this[0];if(d)return e.event.trigger(a,
b,d,!0)}});y.focusin||e.each({focus:"focusin",blur:"focusout"},function(a,b){var d=function(a){e.event.simulate(b,a.target,e.event.fix(a))};e.event.special[b]={setup:function(){var e=this.ownerDocument||this.document||this,c=v.access(e,b);c||e.addEventListener(a,d,!0);v.access(e,b,(c||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,c=v.access(e,b)-1;c?v.access(e,b,c):(e.removeEventListener(a,d,!0),v.remove(e,b))}}});var wa=c.location,Jb=Date.now(),$a=/\?/;e.parseXML=function(a){if(!a||
"string"!==typeof a)return null;try{var b=(new c.DOMParser).parseFromString(a,"text/xml")}catch(k){}var d=b&&b.getElementsByTagName("parsererror")[0];b&&!d||e.error("Invalid XML: "+(d?e.map(d.childNodes,function(a){return a.textContent}).join("\n"):a));return b};var cc=/\[\]$/,Kb=/\r?\n/g,vc=/^(?:submit|button|image|reset|file)$/i,wc=/^(?:input|select|textarea|keygen)/i;e.param=function(a,b){var d,c=[],f=function(a,b){b=t(b)?b():b;c[c.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==b?"":
b)};if(null==a)return"";if(Array.isArray(a)||a.jquery&&!e.isPlainObject(a))e.each(a,function(){f(this.name,this.value)});else for(d in a)Va(d,a[d],b,f);return c.join("&")};e.fn.extend({serialize:function(){return e.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=e.prop(this,"elements");return a?e.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!e(this).is(":disabled")&&wc.test(this.nodeName)&&!vc.test(a)&&(this.checked||!Fa.test(a))}).map(function(a,
b){a=e(this).val();return null==a?null:Array.isArray(a)?e.map(a,function(a){return{name:b.name,value:a.replace(Kb,"\r\n")}}):{name:b.name,value:a.replace(Kb,"\r\n")}}).get()}});var xc=/%20/g,yc=/#.*$/,zc=/([?&])_=[^&]*/,Ac=/^(.*?):[ \t]*([^\r\n]*)$/mg,Bc=/^(?:GET|HEAD)$/,Cc=/^\/\//,Lb={},Wa={},Mb="*/".concat("*"),ab=A.createElement("a");ab.href=wa.href;e.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:wa.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(wa.protocol),
global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mb,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":e.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?
Xa(Xa(a,e.ajaxSettings),b):Xa(e.ajaxSettings,a)},ajaxPrefilter:vb(Lb),ajaxTransport:vb(Wa),ajax:function(a,b){function d(a,b,d,k){var h,q=b;if(!E){E=!0;m&&c.clearTimeout(m);f=void 0;g=k||"";z.readyState=0<a?4:0;k=200<=a&&300>a||304===a;d&&(h=dc(l,z,d));!k&&-1<e.inArray("script",l.dataTypes)&&0>e.inArray("json",l.dataTypes)&&(l.converters["text script"]=function(){});h=ec(l,h,z,k);if(k)if(l.ifModified&&((d=z.getResponseHeader("Last-Modified"))&&(e.lastModified[C]=d),(d=z.getResponseHeader("etag"))&&
(e.etag[C]=d)),204===a||"HEAD"===l.type)q="nocontent";else if(304===a)q="notmodified";else{q=h.state;var n=h.data;var r=h.error;k=!r}else if(r=q,a||!q)q="error",0>a&&(a=0);z.status=a;z.statusText=(b||q)+"";k?t.resolveWith(B,[n,q,z]):t.rejectWith(B,[z,q,r]);z.statusCode(x);x=void 0;p&&w.trigger(k?"ajaxSuccess":"ajaxError",[z,l,k?n:r]);v.fireWith(B,[z,q]);p&&(w.trigger("ajaxComplete",[z,l]),--e.active||e.event.trigger("ajaxStop"))}}"object"===typeof a&&(b=a,a=void 0);b=b||{};var f,g,h,m,p,n,l=e.ajaxSetup({},
b),B=l.context||l,w=l.context&&(B.nodeType||B.jquery)?e(B):e.event,t=e.Deferred(),v=e.Callbacks("once memory"),x=l.statusCode||{},y={},H={},J="canceled",z={readyState:0,getResponseHeader:function(a){var b;if(E){if(!h)for(h={};b=Ac.exec(g);)h[b[1].toLowerCase()+" "]=(h[b[1].toLowerCase()+" "]||[]).concat(b[2]);b=h[a.toLowerCase()+" "]}return null==b?null:b.join(", ")},getAllResponseHeaders:function(){return E?g:null},setRequestHeader:function(a,b){null==E&&(a=H[a.toLowerCase()]=H[a.toLowerCase()]||
a,y[a]=b);return this},overrideMimeType:function(a){null==E&&(l.mimeType=a);return this},statusCode:function(a){var b;if(a)if(E)z.always(a[z.status]);else for(b in a)x[b]=[x[b],a[b]];return this},abort:function(a){a=a||J;f&&f.abort(a);d(0,a);return this}};t.promise(z);l.url=((a||l.url||wa.href)+"").replace(Cc,wa.protocol+"//");l.type=b.method||b.type||l.method||l.type;l.dataTypes=(l.dataType||"*").toLowerCase().match(V)||[""];if(null==l.crossDomain){a=A.createElement("a");try{a.href=l.url,a.href=
a.href,l.crossDomain=ab.protocol+"//"+ab.host!==a.protocol+"//"+a.host}catch(ua){l.crossDomain=!0}}l.data&&l.processData&&"string"!==typeof l.data&&(l.data=e.param(l.data,l.traditional));wb(Lb,l,b,z);if(E)return z;(p=e.event&&l.global)&&0===e.active++&&e.event.trigger("ajaxStart");l.type=l.type.toUpperCase();l.hasContent=!Bc.test(l.type);var C=l.url.replace(yc,"");l.hasContent?l.data&&l.processData&&0===(l.contentType||"").indexOf("application/x-www-form-urlencoded")&&(l.data=l.data.replace(xc,"+")):
(a=l.url.slice(C.length),l.data&&(l.processData||"string"===typeof l.data)&&(C+=($a.test(C)?"&":"?")+l.data,delete l.data),!1===l.cache&&(C=C.replace(zc,"$1"),a=($a.test(C)?"&":"?")+"_="+Jb++ +a),l.url=C+a);l.ifModified&&(e.lastModified[C]&&z.setRequestHeader("If-Modified-Since",e.lastModified[C]),e.etag[C]&&z.setRequestHeader("If-None-Match",e.etag[C]));(l.data&&l.hasContent&&!1!==l.contentType||b.contentType)&&z.setRequestHeader("Content-Type",l.contentType);z.setRequestHeader("Accept",l.dataTypes[0]&&
l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Mb+"; q=0.01":""):l.accepts["*"]);for(n in l.headers)z.setRequestHeader(n,l.headers[n]);if(l.beforeSend&&(!1===l.beforeSend.call(B,z,l)||E))return z.abort();J="abort";v.add(l.complete);z.done(l.success);z.fail(l.error);if(f=wb(Wa,l,b,z)){z.readyState=1;p&&w.trigger("ajaxSend",[z,l]);if(E)return z;l.async&&0<l.timeout&&(m=c.setTimeout(function(){z.abort("timeout")},l.timeout));try{var E=!1;f.send(y,d)}catch(ua){if(E)throw ua;
d(-1,ua)}}else d(-1,"No Transport");return z},getJSON:function(a,b,d){return e.get(a,b,d,"json")},getScript:function(a,b){return e.get(a,void 0,b,"script")}});e.each(["get","post"],function(a,b){e[b]=function(a,c,f,g){t(c)&&(g=g||f,f=c,c=void 0);return e.ajax(e.extend({url:a,type:b,dataType:g,data:c,success:f},e.isPlainObject(a)&&a))}});e.ajaxPrefilter(function(a){for(var b in a.headers)"content-type"===b.toLowerCase()&&(a.contentType=a.headers[b]||"")});e._evalUrl=function(a,b,d){return e.ajax({url:a,
type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(a){e.globalEval(a,b,d)}})};e.fn.extend({wrapAll:function(a){this[0]&&(t(a)&&(a=a.call(this[0])),a=e(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&a.insertBefore(this[0]),a.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this));return this},wrapInner:function(a){return t(a)?this.each(function(b){e(this).wrapInner(a.call(this,
b))}):this.each(function(){var b=e(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){var b=t(a);return this.each(function(d){e(this).wrapAll(b?a.call(this,d):a)})},unwrap:function(a){this.parent(a).not("body").each(function(){e(this).replaceWith(this.childNodes)});return this}});e.expr.pseudos.hidden=function(a){return!e.expr.pseudos.visible(a)};e.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)};e.ajaxSettings.xhr=function(){try{return new c.XMLHttpRequest}catch(a){}};
var Dc={0:200,1223:204},xa=e.ajaxSettings.xhr();y.cors=!!xa&&"withCredentials"in xa;y.ajax=xa=!!xa;e.ajaxTransport(function(a){var b,d;if(y.cors||xa&&!a.crossDomain)return{send:function(e,f){var g,k=a.xhr();k.open(a.type,a.url,a.async,a.username,a.password);if(a.xhrFields)for(g in a.xhrFields)k[g]=a.xhrFields[g];a.mimeType&&k.overrideMimeType&&k.overrideMimeType(a.mimeType);a.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)k.setRequestHeader(g,e[g]);b=function(a){return function(){b&&
(b=d=k.onload=k.onerror=k.onabort=k.ontimeout=k.onreadystatechange=null,"abort"===a?k.abort():"error"===a?"number"!==typeof k.status?f(0,"error"):f(k.status,k.statusText):f(Dc[k.status]||k.status,k.statusText,"text"!==(k.responseType||"text")||"string"!==typeof k.responseText?{binary:k.response}:{text:k.responseText},k.getAllResponseHeaders()))}};k.onload=b();d=k.onerror=k.ontimeout=b("error");void 0!==k.onabort?k.onabort=d:k.onreadystatechange=function(){4===k.readyState&&c.setTimeout(function(){b&&
d()})};b=b("abort");try{k.send(a.hasContent&&a.data||null)}catch(Ka){if(b)throw Ka;}},abort:function(){b&&b()}}});e.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)});e.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){e.globalEval(a);return a}}});e.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1);a.crossDomain&&(a.type=
"GET")});e.ajaxTransport("script",function(a){if(a.crossDomain||a.scriptAttrs){var b,d;return{send:function(c,f){b=e("<script>").attr(a.scriptAttrs||{}).prop({charset:a.scriptCharset,src:a.url}).on("load error",d=function(a){b.remove();d=null;a&&f("error"===a.type?404:200,a.type)});A.head.appendChild(b[0])},abort:function(){d&&d()}}}});var Nb=[],bb=/(=)\?(?=&|$)|\?\?/;e.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Nb.pop()||e.expando+"_"+Jb++;this[a]=!0;return a}});e.ajaxPrefilter("json jsonp",
function(a,b,d){var f,g=!1!==a.jsonp&&(bb.test(a.url)?"url":"string"===typeof a.data&&0===(a.contentType||"").indexOf("application/x-www-form-urlencoded")&&bb.test(a.data)&&"data");if(g||"jsonp"===a.dataTypes[0]){var h=a.jsonpCallback=t(a.jsonpCallback)?a.jsonpCallback():a.jsonpCallback;g?a[g]=a[g].replace(bb,"$1"+h):!1!==a.jsonp&&(a.url+=($a.test(a.url)?"&":"?")+a.jsonp+"="+h);a.converters["script json"]=function(){f||e.error(h+" was not called");return f[0]};a.dataTypes[0]="json";var m=c[h];c[h]=
function(){f=arguments};d.always(function(){void 0===m?e(c).removeProp(h):c[h]=m;a[h]&&(a.jsonpCallback=b.jsonpCallback,Nb.push(h));f&&t(m)&&m(f[0]);f=m=void 0});return"script"}});y.createHTMLDocument=function(){var a=A.implementation.createHTMLDocument("").body;a.innerHTML="<form></form><form></form>";return 2===a.childNodes.length}();e.parseHTML=function(a,b,d){if("string"!==typeof a)return[];"boolean"===typeof b&&(d=b,b=!1);if(!b)if(y.createHTMLDocument){b=A.implementation.createHTMLDocument("");
var c=b.createElement("base");c.href=A.location.href;b.head.appendChild(c)}else b=A;c=Bb.exec(a);d=!d&&[];if(c)return[b.createElement(c[1])];c=gb([a],b,d);d&&d.length&&e(d).remove();return e.merge([],c.childNodes)};e.fn.load=function(a,b,d){var c,f,g=this,h=a.indexOf(" ");if(-1<h){var m=P(a.slice(h));a=a.slice(0,h)}t(b)?(d=b,b=void 0):b&&"object"===typeof b&&(c="POST");0<g.length&&e.ajax({url:a,type:c||"GET",dataType:"html",data:b}).done(function(a){f=arguments;g.html(m?e("<div>").append(e.parseHTML(a)).find(m):
a)}).always(d&&function(a,b){g.each(function(){d.apply(this,f||[a.responseText,b,a])})});return this};e.expr.pseudos.animated=function(a){return e.grep(e.timers,function(b){return a===b.elem}).length};e.offset={setOffset:function(a,b,d){var c=e.css(a,"position"),f=e(a),g={};"static"===c&&(a.style.position="relative");var h=f.offset();var m=e.css(a,"top");var p=e.css(a,"left");("absolute"===c||"fixed"===c)&&-1<(m+p).indexOf("auto")?(p=f.position(),m=p.top,p=p.left):(m=parseFloat(m)||0,p=parseFloat(p)||
0);t(b)&&(b=b.call(a,d,e.extend({},h)));null!=b.top&&(g.top=b.top-h.top+m);null!=b.left&&(g.left=b.left-h.left+p);"using"in b?b.using.call(a,g):f.css(g)}};e.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){e.offset.setOffset(this,a,b)});var b;if(b=this[0]){if(!b.getClientRects().length)return{top:0,left:0};var d=b.getBoundingClientRect();b=b.ownerDocument.defaultView;return{top:d.top+b.pageYOffset,left:d.left+b.pageXOffset}}},position:function(){if(this[0]){var a,
b=this[0],d={top:0,left:0};if("fixed"===e.css(b,"position"))var c=b.getBoundingClientRect();else{c=this.offset();var f=b.ownerDocument;for(a=b.offsetParent||f.documentElement;a&&(a===f.body||a===f.documentElement)&&"static"===e.css(a,"position");)a=a.parentNode;a&&a!==b&&1===a.nodeType&&(d=e(a).offset(),d.top+=e.css(a,"borderTopWidth",!0),d.left+=e.css(a,"borderLeftWidth",!0))}return{top:c.top-d.top-e.css(b,"marginTop",!0),left:c.left-d.left-e.css(b,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=
this.offsetParent;a&&"static"===e.css(a,"position");)a=a.offsetParent;return a||ea})}});e.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var d="pageYOffset"===b;e.fn[a]=function(c){return U(this,function(a,c,e){if(na(a))var f=a;else 9===a.nodeType&&(f=a.defaultView);if(void 0===e)return f?f[b]:a[c];f?f.scrollTo(d?f.pageXOffset:e,d?e:f.pageYOffset):a[c]=e},a,c,arguments.length)}});e.each(["top","left"],function(a,b){e.cssHooks[b]=nb(y.pixelPosition,function(a,c){if(c)return c=
Ba(a,b),Qa.test(c)?e(a).position()[b]+"px":c})});e.each({Height:"height",Width:"width"},function(a,b){e.each({padding:"inner"+a,content:b,"":"outer"+a},function(d,c){e.fn[c]=function(f,g){var h=arguments.length&&(d||"boolean"!==typeof f),k=d||(!0===f||!0===g?"margin":"border");return U(this,function(b,d,f){return na(b)?0===c.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(d=b.documentElement,Math.max(b.body["scroll"+a],d["scroll"+a],b.body["offset"+a],d["offset"+
a],d["client"+a])):void 0===f?e.css(b,d,k):e.style(b,d,f,k)},b,h?f:void 0,h)}})});e.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){e.fn[b]=function(a){return this.on(b,a)}});e.fn.extend({bind:function(a,b,d){return this.on(a,null,b,d)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,d,c){return this.on(b,a,d,c)},undelegate:function(a,b,d){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",d)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||
a)}});e.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(a,b){e.fn[b]=function(a,c){return 0<arguments.length?this.on(b,null,a,c):this.trigger(b)}});var Ec=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;e.proxy=function(a,b){if("string"===typeof b){var d=a[b];b=a;a=d}if(t(a)){var c=da.call(arguments,2);d=function(){return a.apply(b||this,c.concat(da.call(arguments)))};
d.guid=a.guid=a.guid||e.guid++;return d}};e.holdReady=function(a){a?e.readyWait++:e.ready(!0)};e.isArray=Array.isArray;e.parseJSON=JSON.parse;e.nodeName=f;e.isFunction=t;e.isWindow=na;e.camelCase=R;e.type=h;e.now=Date.now;e.isNumeric=function(a){var b=e.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))};e.trim=function(a){return null==a?"":(a+"").replace(Ec,"")};"function"===typeof define&&define.amd&&define("jquery",[],function(){return e});var Fc=c.jQuery,Gc=c.$;e.noConflict=function(a){c.$===
e&&(c.$=Gc);a&&c.jQuery===e&&(c.jQuery=Fc);return e};"undefined"===typeof l&&(c.jQuery=c.$=e);return e});if("undefined"===typeof jQuery)throw Error("Bootstrap's JavaScript requires jQuery");+function(c){c=c.fn.jquery.split(" ")[0].split(".");if(2>c[0]&&9>c[1]||1==c[0]&&9==c[1]&&1>c[2]||3<c[0])throw Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4");}(jQuery);
+function(c){function l(){var c=document.createElement("bootstrap"),h={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},g;for(g in h)if(void 0!==c.style[g])return{end:h[g]};return!1}c.fn.emulateTransitionEnd=function(l){var h=!1,g=this;c(this).one("bsTransitionEnd",function(){h=!0});setTimeout(function(){h||c(g).trigger(c.support.transition.end)},l);return this};c(function(){c.support.transition=l();c.support.transition&&
(c.event.special.bsTransitionEnd={bindType:c.support.transition.end,delegateType:c.support.transition.end,handle:function(l){if(c(l.target).is(this))return l.handleObj.handler.apply(this,arguments)}})})}(jQuery);
+function(c){var l=function(h){c(h).on("click",'[data-dismiss="alert"]',this.close)};l.VERSION="3.3.7";l.TRANSITION_DURATION=150;l.prototype.close=function(h){function g(){p.detach().trigger("closed.bs.alert").remove()}var f=c(this),m=f.attr("data-target");m||(m=(m=f.attr("href"))&&m.replace(/.*(?=#[^\s]*$)/,""));var p=c("#"===m?[]:m);h&&h.preventDefault();p.length||(p=f.closest(".alert"));p.trigger(h=c.Event("close.bs.alert"));h.isDefaultPrevented()||(p.removeClass("in"),c.support.transition&&p.hasClass("fade")?
p.one("bsTransitionEnd",g).emulateTransitionEnd(l.TRANSITION_DURATION):g())};var n=c.fn.alert;c.fn.alert=function(h){return this.each(function(){var g=c(this),f=g.data("bs.alert");f||g.data("bs.alert",f=new l(this));"string"==typeof h&&f[h].call(g)})};c.fn.alert.Constructor=l;c.fn.alert.noConflict=function(){c.fn.alert=n;return this};c(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',l.prototype.close)}(jQuery);
+function(c){function l(g){return this.each(function(){var f=c(this),h=f.data("bs.button"),p="object"==typeof g&&g;h||f.data("bs.button",h=new n(this,p));"toggle"==g?h.toggle():g&&h.setState(g)})}var n=function(g,f){this.$element=c(g);this.options=c.extend({},n.DEFAULTS,f);this.isLoading=!1};n.VERSION="3.3.7";n.DEFAULTS={loadingText:"loading..."};n.prototype.setState=function(g){var f=this.$element,h=f.is("input")?"val":"html",p=f.data();g+="Text";null==p.resetText&&f.data("resetText",f[h]());setTimeout(c.proxy(function(){f[h](null==
p[g]?this.options[g]:p[g]);"loadingText"==g?(this.isLoading=!0,f.addClass("disabled").attr("disabled","disabled").prop("disabled",!0)):this.isLoading&&(this.isLoading=!1,f.removeClass("disabled").removeAttr("disabled").prop("disabled",!1))},this),0)};n.prototype.toggle=function(){var c=!0,f=this.$element.closest('[data-toggle="buttons"]');if(f.length){var h=this.$element.find("input");"radio"==h.prop("type")?(h.prop("checked")&&(c=!1),f.find(".active").removeClass("active"),this.$element.addClass("active")):
"checkbox"==h.prop("type")&&(h.prop("checked")!==this.$element.hasClass("active")&&(c=!1),this.$element.toggleClass("active"));h.prop("checked",this.$element.hasClass("active"));c&&h.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var h=c.fn.button;c.fn.button=l;c.fn.button.Constructor=n;c.fn.button.noConflict=function(){c.fn.button=h;return this};c(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(g){var f=
c(g.target).closest(".btn");l.call(f,"toggle");c(g.target).is('input[type="radio"], input[type="checkbox"]')||(g.preventDefault(),f.is("input,button")?f.trigger("focus"):f.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(g){c(g.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(g.type))})}(jQuery);
+function(c){function l(f){return this.each(function(){var g=c(this),h=g.data("bs.carousel"),l=c.extend({},n.DEFAULTS,g.data(),"object"==typeof f&&f),w="string"==typeof f?f:l.slide;h||g.data("bs.carousel",h=new n(this,l));if("number"==typeof f)h.to(f);else if(w)h[w]();else l.interval&&h.pause().cycle()})}var n=function(f,g){this.$element=c(f);this.$indicators=this.$element.find(".carousel-indicators");this.options=g;this.$items=this.$active=this.interval=this.sliding=this.paused=null;this.options.keyboard&&
this.$element.on("keydown.bs.carousel",c.proxy(this.keydown,this));"hover"!=this.options.pause||"ontouchstart"in document.documentElement||this.$element.on("mouseenter.bs.carousel",c.proxy(this.pause,this)).on("mouseleave.bs.carousel",c.proxy(this.cycle,this))};n.VERSION="3.3.7";n.TRANSITION_DURATION=600;n.DEFAULTS={interval:5E3,pause:"hover",wrap:!0,keyboard:!0};n.prototype.keydown=function(c){if(!/input|textarea/i.test(c.target.tagName)){switch(c.which){case 37:this.prev();break;case 39:this.next();
break;default:return}c.preventDefault()}};n.prototype.cycle=function(f){f||(this.paused=!1);this.interval&&clearInterval(this.interval);this.options.interval&&!this.paused&&(this.interval=setInterval(c.proxy(this.next,this),this.options.interval));return this};n.prototype.getItemIndex=function(c){this.$items=c.parent().children(".item");return this.$items.index(c||this.$active)};n.prototype.getItemForDirection=function(c,g){var f=this.getItemIndex(g);return("prev"==c&&0===f||"next"==c&&f==this.$items.length-
1)&&!this.options.wrap?g:this.$items.eq((f+("prev"==c?-1:1))%this.$items.length)};n.prototype.to=function(c){var f=this,g=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(c>this.$items.length-1||0>c))return this.sliding?this.$element.one("slid.bs.carousel",function(){f.to(c)}):g==c?this.pause().cycle():this.slide(c>g?"next":"prev",this.$items.eq(c))};n.prototype.pause=function(f){f||(this.paused=!0);this.$element.find(".next, .prev").length&&c.support.transition&&(this.$element.trigger(c.support.transition.end),
this.cycle(!0));this.interval=clearInterval(this.interval);return this};n.prototype.next=function(){if(!this.sliding)return this.slide("next")};n.prototype.prev=function(){if(!this.sliding)return this.slide("prev")};n.prototype.slide=function(f,g){var h=this.$element.find(".item.active"),m=g||this.getItemForDirection(f,h);g=this.interval;var l="next"==f?"left":"right",x=this;if(m.hasClass("active"))return this.sliding=!1;var Z=m[0],W=c.Event("slide.bs.carousel",{relatedTarget:Z,direction:l});this.$element.trigger(W);
if(!W.isDefaultPrevented()){this.sliding=!0;g&&this.pause();this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),(W=c(this.$indicators.children()[this.getItemIndex(m)]))&&W.addClass("active"));var Ha=c.Event("slid.bs.carousel",{relatedTarget:Z,direction:l});c.support.transition&&this.$element.hasClass("slide")?(m.addClass(f),m[0].offsetWidth,h.addClass(l),m.addClass(l),h.one("bsTransitionEnd",function(){m.removeClass([f,l].join(" ")).addClass("active");h.removeClass(["active",
l].join(" "));x.sliding=!1;setTimeout(function(){x.$element.trigger(Ha)},0)}).emulateTransitionEnd(n.TRANSITION_DURATION)):(h.removeClass("active"),m.addClass("active"),this.sliding=!1,this.$element.trigger(Ha));g&&this.cycle();return this}};var h=c.fn.carousel;c.fn.carousel=l;c.fn.carousel.Constructor=n;c.fn.carousel.noConflict=function(){c.fn.carousel=h;return this};var g=function(f){var g,h=c(this),n=c(h.attr("data-target")||(g=h.attr("href"))&&g.replace(/.*(?=#[^\s]+$)/,""));if(n.hasClass("carousel")){g=
c.extend({},n.data(),h.data());if(h=h.attr("data-slide-to"))g.interval=!1;l.call(n,g);h&&n.data("bs.carousel").to(h);f.preventDefault()}};c(document).on("click.bs.carousel.data-api","[data-slide]",g).on("click.bs.carousel.data-api","[data-slide-to]",g);c(window).on("load",function(){c('[data-ride="carousel"]').each(function(){var f=c(this);l.call(f,f.data())})})}(jQuery);
+function(c){function l(f){var g;f=f.attr("data-target")||(g=f.attr("href"))&&g.replace(/.*(?=#[^\s]+$)/,"");return c(f)}function n(f){return this.each(function(){var g=c(this),p=g.data("bs.collapse"),l=c.extend({},h.DEFAULTS,g.data(),"object"==typeof f&&f);!p&&l.toggle&&/show|hide/.test(f)&&(l.toggle=!1);p||g.data("bs.collapse",p=new h(this,l));if("string"==typeof f)p[f]()})}var h=function(f,g){this.$element=c(f);this.options=c.extend({},h.DEFAULTS,g);this.$trigger=c('[data-toggle="collapse"][href="#'+
f.id+'"],[data-toggle="collapse"][data-target="#'+f.id+'"]');this.transitioning=null;this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger);this.options.toggle&&this.toggle()};h.VERSION="3.3.7";h.TRANSITION_DURATION=350;h.DEFAULTS={toggle:!0};h.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"};h.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var f,g=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");
if(g&&g.length&&(f=g.data("bs.collapse"))&&f.transitioning)return;var p=c.Event("show.bs.collapse");this.$element.trigger(p);if(!p.isDefaultPrevented()){g&&g.length&&(n.call(g,"hide"),f||g.data("bs.collapse",null));var l=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[l](0).attr("aria-expanded",!0);this.$trigger.removeClass("collapsed").attr("aria-expanded",!0);this.transitioning=1;f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[l]("");this.transitioning=
0;this.$element.trigger("shown.bs.collapse")};if(!c.support.transition)return f.call(this);g=c.camelCase(["scroll",l].join("-"));this.$element.one("bsTransitionEnd",c.proxy(f,this)).emulateTransitionEnd(h.TRANSITION_DURATION)[l](this.$element[0][g])}}};h.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var f=c.Event("hide.bs.collapse");this.$element.trigger(f);if(!f.isDefaultPrevented()){f=this.dimension();this.$element[f](this.$element[f]())[0].offsetHeight;this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",
!1);this.$trigger.addClass("collapsed").attr("aria-expanded",!1);this.transitioning=1;var g=function(){this.transitioning=0;this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!c.support.transition)return g.call(this);this.$element[f](0).one("bsTransitionEnd",c.proxy(g,this)).emulateTransitionEnd(h.TRANSITION_DURATION)}}};h.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};h.prototype.getParent=function(){return c(this.options.parent).find('[data-toggle="collapse"][data-parent="'+
this.options.parent+'"]').each(c.proxy(function(f,g){f=c(g);this.addAriaAndCollapsedClass(l(f),f)},this)).end()};h.prototype.addAriaAndCollapsedClass=function(c,g){var f=c.hasClass("in");c.attr("aria-expanded",f);g.toggleClass("collapsed",!f).attr("aria-expanded",f)};var g=c.fn.collapse;c.fn.collapse=n;c.fn.collapse.Constructor=h;c.fn.collapse.noConflict=function(){c.fn.collapse=g;return this};c(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(f){var g=c(this);g.attr("data-target")||
f.preventDefault();f=l(g);g=f.data("bs.collapse")?"toggle":g.data();n.call(f,g)})}(jQuery);
+function(c){function l(f){var g=f.attr("data-target");g||(g=(g=f.attr("href"))&&/#[A-Za-z]/.test(g)&&g.replace(/.*(?=#[^\s]*$)/,""));return(g=g&&c(g))&&g.length?g:f.parent()}function n(f){f&&3===f.which||(c(".dropdown-backdrop").remove(),c('[data-toggle="dropdown"]').each(function(){var g=c(this),h=l(g),n={relatedTarget:this};!h.hasClass("open")||f&&"click"==f.type&&/input|textarea/i.test(f.target.tagName)&&c.contains(h[0],f.target)||(h.trigger(f=c.Event("hide.bs.dropdown",n)),f.isDefaultPrevented()||
(g.attr("aria-expanded","false"),h.removeClass("open").trigger(c.Event("hidden.bs.dropdown",n))))}))}var h=function(f){c(f).on("click.bs.dropdown",this.toggle)};h.VERSION="3.3.7";h.prototype.toggle=function(f){var g=c(this);if(!g.is(".disabled, :disabled")){var h=l(g);f=h.hasClass("open");n();if(!f){if("ontouchstart"in document.documentElement&&!h.closest(".navbar-nav").length)c(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(c(this)).on("click",n);var B={relatedTarget:this};
h.trigger(f=c.Event("show.bs.dropdown",B));if(f.isDefaultPrevented())return;g.trigger("focus").attr("aria-expanded","true");h.toggleClass("open").trigger(c.Event("shown.bs.dropdown",B))}return!1}};h.prototype.keydown=function(f){if(/(38|40|27|32)/.test(f.which)&&!/input|textarea/i.test(f.target.tagName)){var g=c(this);f.preventDefault();f.stopPropagation();if(!g.is(".disabled, :disabled")){var h=l(g),n=h.hasClass("open");if(!n&&27!=f.which||n&&27==f.which)return 27==f.which&&h.find('[data-toggle="dropdown"]').trigger("focus"),
g.trigger("click");g=h.find(".dropdown-menu li:not(.disabled):visible a");g.length&&(h=g.index(f.target),38==f.which&&0<h&&h--,40==f.which&&h<g.length-1&&h++,~h||(h=0),g.eq(h).trigger("focus"))}}};var g=c.fn.dropdown;c.fn.dropdown=function(f){return this.each(function(){var g=c(this),p=g.data("bs.dropdown");p||g.data("bs.dropdown",p=new h(this));"string"==typeof f&&p[f].call(g)})};c.fn.dropdown.Constructor=h;c.fn.dropdown.noConflict=function(){c.fn.dropdown=g;return this};c(document).on("click.bs.dropdown.data-api",
n).on("click.bs.dropdown.data-api",".dropdown form",function(c){c.stopPropagation()}).on("click.bs.dropdown.data-api",'[data-toggle="dropdown"]',h.prototype.toggle).on("keydown.bs.dropdown.data-api",'[data-toggle="dropdown"]',h.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",h.prototype.keydown)}(jQuery);
+function(c){function l(g,f){return this.each(function(){var h=c(this),p=h.data("bs.modal"),l=c.extend({},n.DEFAULTS,h.data(),"object"==typeof g&&g);p||h.data("bs.modal",p=new n(this,l));if("string"==typeof g)p[g](f);else l.show&&p.show(f)})}var n=function(g,f){this.options=f;this.$body=c(document.body);this.$element=c(g);this.$dialog=this.$element.find(".modal-dialog");this.originalBodyPad=this.isShown=this.$backdrop=null;this.scrollbarWidth=0;this.ignoreBackdropClick=!1;this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,
c.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};n.VERSION="3.3.7";n.TRANSITION_DURATION=300;n.BACKDROP_TRANSITION_DURATION=150;n.DEFAULTS={backdrop:!0,keyboard:!0,show:!0};n.prototype.toggle=function(c){return this.isShown?this.hide():this.show(c)};n.prototype.show=function(g){var f=this,h=c.Event("show.bs.modal",{relatedTarget:g});this.$element.trigger(h);this.isShown||h.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),
this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',c.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){f.$element.one("mouseup.dismiss.bs.modal",function(g){c(g.target).is(f.$element)&&(f.ignoreBackdropClick=!0)})}),this.backdrop(function(){var h=c.support.transition&&f.$element.hasClass("fade");f.$element.parent().length||f.$element.appendTo(f.$body);f.$element.show().scrollTop(0);f.adjustDialog();h&&f.$element[0].offsetWidth;
f.$element.addClass("in");f.enforceFocus();var m=c.Event("shown.bs.modal",{relatedTarget:g});h?f.$dialog.one("bsTransitionEnd",function(){f.$element.trigger("focus").trigger(m)}).emulateTransitionEnd(n.TRANSITION_DURATION):f.$element.trigger("focus").trigger(m)}))};n.prototype.hide=function(g){g&&g.preventDefault();g=c.Event("hide.bs.modal");this.$element.trigger(g);this.isShown&&!g.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),c(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),
this.$dialog.off("mousedown.dismiss.bs.modal"),c.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",c.proxy(this.hideModal,this)).emulateTransitionEnd(n.TRANSITION_DURATION):this.hideModal())};n.prototype.enforceFocus=function(){c(document).off("focusin.bs.modal").on("focusin.bs.modal",c.proxy(function(c){document===c.target||this.$element[0]===c.target||this.$element.has(c.target).length||this.$element.trigger("focus")},this))};n.prototype.escape=function(){if(this.isShown&&
this.options.keyboard)this.$element.on("keydown.dismiss.bs.modal",c.proxy(function(c){27==c.which&&this.hide()},this));else this.isShown||this.$element.off("keydown.dismiss.bs.modal")};n.prototype.resize=function(){if(this.isShown)c(window).on("resize.bs.modal",c.proxy(this.handleUpdate,this));else c(window).off("resize.bs.modal")};n.prototype.hideModal=function(){var c=this;this.$element.hide();this.backdrop(function(){c.$body.removeClass("modal-open");c.resetAdjustments();c.resetScrollbar();c.$element.trigger("hidden.bs.modal")})};
n.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove();this.$backdrop=null};n.prototype.backdrop=function(g){var f=this,h=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var l=c.support.transition&&h;this.$backdrop=c(document.createElement("div")).addClass("modal-backdrop "+h).appendTo(this.$body);this.$element.on("click.dismiss.bs.modal",c.proxy(function(c){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:c.target===c.currentTarget&&("static"==
this.options.backdrop?this.$element[0].focus():this.hide())},this));l&&this.$backdrop[0].offsetWidth;this.$backdrop.addClass("in");g&&(l?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(n.BACKDROP_TRANSITION_DURATION):g())}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),h=function(){f.removeBackdrop();g&&g()},c.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",h).emulateTransitionEnd(n.BACKDROP_TRANSITION_DURATION):h()):g&&g()};
n.prototype.handleUpdate=function(){this.adjustDialog()};n.prototype.adjustDialog=function(){var c=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&c?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!c?this.scrollbarWidth:""})};n.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})};n.prototype.checkScrollbar=function(){var c=window.innerWidth;c||(c=document.documentElement.getBoundingClientRect(),
c=c.right-Math.abs(c.left));this.bodyIsOverflowing=document.body.clientWidth<c;this.scrollbarWidth=this.measureScrollbar()};n.prototype.setScrollbar=function(){var c=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"";this.bodyIsOverflowing&&this.$body.css("padding-right",c+this.scrollbarWidth)};n.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)};n.prototype.measureScrollbar=function(){var c=document.createElement("div");
c.className="modal-scrollbar-measure";this.$body.append(c);var f=c.offsetWidth-c.clientWidth;this.$body[0].removeChild(c);return f};var h=c.fn.modal;c.fn.modal=l;c.fn.modal.Constructor=n;c.fn.modal.noConflict=function(){c.fn.modal=h;return this};c(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(g){var f=c(this),h=f.attr("href"),p=c(f.attr("data-target")||h&&h.replace(/.*(?=#[^\s]+$)/,""));h=p.data("bs.modal")?"toggle":c.extend({remote:!/#/.test(h)&&h},p.data(),f.data());f.is("a")&&
g.preventDefault();p.one("show.bs.modal",function(c){if(!c.isDefaultPrevented())p.one("hidden.bs.modal",function(){f.is(":visible")&&f.trigger("focus")})});l.call(p,h,this)})}(jQuery);
+function(c){var l=function(c,g){this.inState=this.$element=this.hoverState=this.timeout=this.enabled=this.options=this.type=null;this.init("tooltip",c,g)};l.VERSION="3.3.7";l.TRANSITION_DURATION=150;l.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}};l.prototype.init=function(h,g,
f){this.enabled=!0;this.type=h;this.$element=c(g);this.options=this.getOptions(f);this.$viewport=this.options.viewport&&c(c.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport);this.inState={click:!1,hover:!1,focus:!1};if(this.$element[0]instanceof document.constructor&&!this.options.selector)throw Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");h=this.options.trigger.split(" ");
for(g=h.length;g--;)if(f=h[g],"click"==f)this.$element.on("click."+this.type,this.options.selector,c.proxy(this.toggle,this));else if("manual"!=f){var m="hover"==f?"mouseleave":"focusout";this.$element.on(("hover"==f?"mouseenter":"focusin")+"."+this.type,this.options.selector,c.proxy(this.enter,this));this.$element.on(m+"."+this.type,this.options.selector,c.proxy(this.leave,this))}this.options.selector?this._options=c.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()};l.prototype.getDefaults=
function(){return l.DEFAULTS};l.prototype.getOptions=function(h){h=c.extend({},this.getDefaults(),this.$element.data(),h);h.delay&&"number"==typeof h.delay&&(h.delay={show:h.delay,hide:h.delay});return h};l.prototype.getDelegateOptions=function(){var h={},g=this.getDefaults();this._options&&c.each(this._options,function(c,m){g[c]!=m&&(h[c]=m)});return h};l.prototype.enter=function(h){var g=h instanceof this.constructor?h:c(h.currentTarget).data("bs."+this.type);g||(g=new this.constructor(h.currentTarget,
this.getDelegateOptions()),c(h.currentTarget).data("bs."+this.type,g));h instanceof c.Event&&(g.inState["focusin"==h.type?"focus":"hover"]=!0);if(g.tip().hasClass("in")||"in"==g.hoverState)g.hoverState="in";else{clearTimeout(g.timeout);g.hoverState="in";if(!g.options.delay||!g.options.delay.show)return g.show();g.timeout=setTimeout(function(){"in"==g.hoverState&&g.show()},g.options.delay.show)}};l.prototype.isInStateTrue=function(){for(var c in this.inState)if(this.inState[c])return!0;return!1};l.prototype.leave=
function(h){var g=h instanceof this.constructor?h:c(h.currentTarget).data("bs."+this.type);g||(g=new this.constructor(h.currentTarget,this.getDelegateOptions()),c(h.currentTarget).data("bs."+this.type,g));h instanceof c.Event&&(g.inState["focusout"==h.type?"focus":"hover"]=!1);if(!g.isInStateTrue()){clearTimeout(g.timeout);g.hoverState="out";if(!g.options.delay||!g.options.delay.hide)return g.hide();g.timeout=setTimeout(function(){"out"==g.hoverState&&g.hide()},g.options.delay.hide)}};l.prototype.show=
function(){var h=c.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(h);var g=c.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(!h.isDefaultPrevented()&&g){var f=this;h=this.tip();g=this.getUID(this.type);this.setContent();h.attr("id",g);this.$element.attr("aria-describedby",g);this.options.animation&&h.addClass("fade");g="function"==typeof this.options.placement?this.options.placement.call(this,h[0],this.$element[0]):this.options.placement;
var m=/\s?auto?\s?/i,p=m.test(g);p&&(g=g.replace(m,"")||"top");h.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this);this.options.container?h.appendTo(this.options.container):h.insertAfter(this.$element);this.$element.trigger("inserted.bs."+this.type);m=this.getPosition();var n=h[0].offsetWidth,w=h[0].offsetHeight;if(p){p=g;var x=this.getPosition(this.$viewport);g="bottom"==g&&m.bottom+w>x.bottom?"top":"top"==g&&m.top-w<x.top?"bottom":"right"==g&&m.right+n>x.width?
"left":"left"==g&&m.left-n<x.left?"right":g;h.removeClass(p).addClass(g)}m=this.getCalculatedOffset(g,m,n,w);this.applyPlacement(m,g);g=function(){var c=f.hoverState;f.$element.trigger("shown.bs."+f.type);f.hoverState=null;"out"==c&&f.leave(f)};c.support.transition&&this.$tip.hasClass("fade")?h.one("bsTransitionEnd",g).emulateTransitionEnd(l.TRANSITION_DURATION):g()}}};l.prototype.applyPlacement=function(h,g){var f=this.tip(),m=f[0].offsetWidth,l=f[0].offsetHeight,n=parseInt(f.css("margin-top"),10),
w=parseInt(f.css("margin-left"),10);isNaN(n)&&(n=0);isNaN(w)&&(w=0);h.top+=n;h.left+=w;c.offset.setOffset(f[0],c.extend({using:function(c){f.css({top:Math.round(c.top),left:Math.round(c.left)})}},h),0);f.addClass("in");n=f[0].offsetWidth;w=f[0].offsetHeight;"top"==g&&w!=l&&(h.top=h.top+l-w);var x=this.getViewportAdjustedDelta(g,h,n,w);x.left?h.left+=x.left:h.top+=x.top;m=(g=/top|bottom/.test(g))?2*x.left-m+n:2*x.top-l+w;l=g?"offsetWidth":"offsetHeight";f.offset(h);this.replaceArrow(m,f[0][l],g)};
l.prototype.replaceArrow=function(c,g,f){this.arrow().css(f?"left":"top",50*(1-c/g)+"%").css(f?"top":"left","")};l.prototype.setContent=function(){var c=this.tip(),g=this.getTitle();c.find(".tooltip-inner")[this.options.html?"html":"text"](g);c.removeClass("fade in top bottom left right")};l.prototype.hide=function(h){function g(){"in"!=f.hoverState&&m.detach();f.$element&&f.$element.removeAttr("aria-describedby").trigger("hidden.bs."+f.type);h&&h()}var f=this,m=c(this.$tip),p=c.Event("hide.bs."+
this.type);this.$element.trigger(p);if(!p.isDefaultPrevented())return m.removeClass("in"),c.support.transition&&m.hasClass("fade")?m.one("bsTransitionEnd",g).emulateTransitionEnd(l.TRANSITION_DURATION):g(),this.hoverState=null,this};l.prototype.fixTitle=function(){var c=this.$element;(c.attr("title")||"string"!=typeof c.attr("data-original-title"))&&c.attr("data-original-title",c.attr("title")||"").attr("title","")};l.prototype.hasContent=function(){return this.getTitle()};l.prototype.getPosition=
function(h){h=h||this.$element;var g=h[0],f="BODY"==g.tagName,m=g.getBoundingClientRect();null==m.width&&(m=c.extend({},m,{width:m.right-m.left,height:m.bottom-m.top}));g=window.SVGElement&&g instanceof window.SVGElement;g=f?{top:0,left:0}:g?null:h.offset();h={scroll:f?document.documentElement.scrollTop||document.body.scrollTop:h.scrollTop()};f=f?{width:c(window).width(),height:c(window).height()}:null;return c.extend({},m,h,f,g)};l.prototype.getCalculatedOffset=function(c,g,f,m){return"bottom"==
c?{top:g.top+g.height,left:g.left+g.width/2-f/2}:"top"==c?{top:g.top-m,left:g.left+g.width/2-f/2}:"left"==c?{top:g.top+g.height/2-m/2,left:g.left-f}:{top:g.top+g.height/2-m/2,left:g.left+g.width}};l.prototype.getViewportAdjustedDelta=function(c,g,f,m){var h={top:0,left:0};if(!this.$viewport)return h;var l=this.options.viewport&&this.options.viewport.padding||0,n=this.getPosition(this.$viewport);/right|left/.test(c)?(f=g.top-l-n.scroll,g=g.top+l-n.scroll+m,f<n.top?h.top=n.top-f:g>n.top+n.height&&(h.top=
n.top+n.height-g)):(m=g.left-l,g=g.left+l+f,m<n.left?h.left=n.left-m:g>n.right&&(h.left=n.left+n.width-g));return h};l.prototype.getTitle=function(){var c=this.$element,g=this.options;return c.attr("data-original-title")||("function"==typeof g.title?g.title.call(c[0]):g.title)};l.prototype.getUID=function(c){do c+=~~(1E6*Math.random());while(document.getElementById(c));return c};l.prototype.tip=function(){if(!this.$tip&&(this.$tip=c(this.options.template),1!=this.$tip.length))throw Error(this.type+
" `template` option must consist of exactly 1 top-level element!");return this.$tip};l.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")};l.prototype.enable=function(){this.enabled=!0};l.prototype.disable=function(){this.enabled=!1};l.prototype.toggleEnabled=function(){this.enabled=!this.enabled};l.prototype.toggle=function(h){var g=this;h&&(g=c(h.currentTarget).data("bs."+this.type),g||(g=new this.constructor(h.currentTarget,this.getDelegateOptions()),c(h.currentTarget).data("bs."+
this.type,g)));h?(g.inState.click=!g.inState.click,g.isInStateTrue()?g.enter(g):g.leave(g)):g.tip().hasClass("in")?g.leave(g):g.enter(g)};l.prototype.destroy=function(){var c=this;clearTimeout(this.timeout);this.hide(function(){c.$element.off("."+c.type).removeData("bs."+c.type);c.$tip&&c.$tip.detach();c.$tip=null;c.$arrow=null;c.$viewport=null;c.$element=null})};var n=c.fn.tooltip;c.fn.tooltip=function(h){return this.each(function(){var g=c(this),f=g.data("bs.tooltip"),m="object"==typeof h&&h;if(f||
!/destroy|hide/.test(h))if(f||g.data("bs.tooltip",f=new l(this,m)),"string"==typeof h)f[h]()})};c.fn.tooltip.Constructor=l;c.fn.tooltip.noConflict=function(){c.fn.tooltip=n;return this}}(jQuery);
+function(c){var l=function(c,g){this.init("popover",c,g)};if(!c.fn.tooltip)throw Error("Popover requires tooltip.js");l.VERSION="3.3.7";l.DEFAULTS=c.extend({},c.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'});l.prototype=c.extend({},c.fn.tooltip.Constructor.prototype);l.prototype.constructor=l;l.prototype.getDefaults=function(){return l.DEFAULTS};
l.prototype.setContent=function(){var c=this.tip(),g=this.getTitle(),f=this.getContent();c.find(".popover-title")[this.options.html?"html":"text"](g);c.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof f?"html":"append":"text"](f);c.removeClass("fade top bottom left right in");c.find(".popover-title").html()||c.find(".popover-title").hide()};l.prototype.hasContent=function(){return this.getTitle()||this.getContent()};l.prototype.getContent=function(){var c=this.$element,
g=this.options;return c.attr("data-content")||("function"==typeof g.content?g.content.call(c[0]):g.content)};l.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=c.fn.popover;c.fn.popover=function(h){return this.each(function(){var g=c(this),f=g.data("bs.popover"),m="object"==typeof h&&h;if(f||!/destroy|hide/.test(h))if(f||g.data("bs.popover",f=new l(this,m)),"string"==typeof h)f[h]()})};c.fn.popover.Constructor=l;c.fn.popover.noConflict=function(){c.fn.popover=
n;return this}}(jQuery);
+function(c){function l(g,f){this.$body=c(document.body);this.$scrollElement=c(g).is(document.body)?c(window):c(g);this.options=c.extend({},l.DEFAULTS,f);this.selector=(this.options.target||"")+" .nav li > a";this.offsets=[];this.targets=[];this.activeTarget=null;this.scrollHeight=0;this.$scrollElement.on("scroll.bs.scrollspy",c.proxy(this.process,this));this.refresh();this.process()}function n(g){return this.each(function(){var f=c(this),h=f.data("bs.scrollspy"),p="object"==typeof g&&g;h||f.data("bs.scrollspy",
h=new l(this,p));if("string"==typeof g)h[g]()})}l.VERSION="3.3.7";l.DEFAULTS={offset:10};l.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)};l.prototype.refresh=function(){var g=this,f="offset",h=0;this.offsets=[];this.targets=[];this.scrollHeight=this.getScrollHeight();c.isWindow(this.$scrollElement[0])||(f="position",h=this.$scrollElement.scrollTop());this.$body.find(this.selector).map(function(){var g=
c(this);g=g.data("target")||g.attr("href");var m=/^#./.test(g)&&c(g);return m&&m.length&&m.is(":visible")&&[[m[f]().top+h,g]]||null}).sort(function(c,f){return c[0]-f[0]}).each(function(){g.offsets.push(this[0]);g.targets.push(this[1])})};l.prototype.process=function(){var c=this.$scrollElement.scrollTop()+this.options.offset,f=this.getScrollHeight(),h=this.options.offset+f-this.$scrollElement.height(),l=this.offsets,n=this.targets,w=this.activeTarget,x;this.scrollHeight!=f&&this.refresh();if(c>=
h)return w!=(x=n[n.length-1])&&this.activate(x);if(w&&c<l[0])return this.activeTarget=null,this.clear();for(x=l.length;x--;)w!=n[x]&&c>=l[x]&&(void 0===l[x+1]||c<l[x+1])&&this.activate(n[x])};l.prototype.activate=function(g){this.activeTarget=g;this.clear();g=c(this.selector+'[data-target="'+g+'"],'+this.selector+'[href="'+g+'"]').parents("li").addClass("active");g.parent(".dropdown-menu").length&&(g=g.closest("li.dropdown").addClass("active"));g.trigger("activate.bs.scrollspy")};l.prototype.clear=
function(){c(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var h=c.fn.scrollspy;c.fn.scrollspy=n;c.fn.scrollspy.Constructor=l;c.fn.scrollspy.noConflict=function(){c.fn.scrollspy=h;return this};c(window).on("load.bs.scrollspy.data-api",function(){c('[data-spy="scroll"]').each(function(){var g=c(this);n.call(g,g.data())})})}(jQuery);
+function(c){function l(f){return this.each(function(){var g=c(this),h=g.data("bs.tab");h||g.data("bs.tab",h=new n(this));if("string"==typeof f)h[f]()})}var n=function(f){this.element=c(f)};n.VERSION="3.3.7";n.TRANSITION_DURATION=150;n.prototype.show=function(){var f=this.element,g=f.closest("ul:not(.dropdown-menu)"),h=f.data("target");h||(h=(h=f.attr("href"))&&h.replace(/.*(?=#[^\s]*$)/,""));if(!f.parent("li").hasClass("active")){var l=g.find(".active:last a"),n=c.Event("hide.bs.tab",{relatedTarget:f[0]}),
x=c.Event("show.bs.tab",{relatedTarget:l[0]});l.trigger(n);f.trigger(x);x.isDefaultPrevented()||n.isDefaultPrevented()||(h=c(h),this.activate(f.closest("li"),g),this.activate(h,h.parent(),function(){l.trigger({type:"hidden.bs.tab",relatedTarget:f[0]});f.trigger({type:"shown.bs.tab",relatedTarget:l[0]})}))}};n.prototype.activate=function(f,g,h){function l(){m.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1);f.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",
!0);p?(f[0].offsetWidth,f.addClass("in")):f.removeClass("fade");f.parent(".dropdown-menu").length&&f.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0);h&&h()}var m=g.find("> .active"),p=h&&c.support.transition&&(m.length&&m.hasClass("fade")||!!g.find("> .fade").length);m.length&&p?m.one("bsTransitionEnd",l).emulateTransitionEnd(n.TRANSITION_DURATION):l();m.removeClass("in")};var h=c.fn.tab;c.fn.tab=l;c.fn.tab.Constructor=n;c.fn.tab.noConflict=function(){c.fn.tab=
h;return this};var g=function(f){f.preventDefault();l.call(c(this),"show")};c(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',g).on("click.bs.tab.data-api",'[data-toggle="pill"]',g)}(jQuery);
+function(c){function l(g){return this.each(function(){var f=c(this),h=f.data("bs.affix"),l="object"==typeof g&&g;h||f.data("bs.affix",h=new n(this,l));if("string"==typeof g)h[g]()})}var n=function(g,f){this.options=c.extend({},n.DEFAULTS,f);this.$target=c(this.options.target).on("scroll.bs.affix.data-api",c.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",c.proxy(this.checkPositionWithEventLoop,this));this.$element=c(g);this.pinnedOffset=this.unpin=this.affixed=null;this.checkPosition()};
n.VERSION="3.3.7";n.RESET="affix affix-top affix-bottom";n.DEFAULTS={offset:0,target:window};n.prototype.getState=function(c,f,h,l){var g=this.$target.scrollTop(),m=this.$element.offset(),n=this.$target.height();if(null!=h&&"top"==this.affixed)return g<h?"top":!1;if("bottom"==this.affixed)return null!=h?g+this.unpin<=m.top?!1:"bottom":g+n<=c-l?!1:"bottom";var p=null==this.affixed;m=p?g:m.top;return null!=h&&g<=h?"top":null!=l&&m+(p?n:f)>=c-l?"bottom":!1};n.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;
this.$element.removeClass(n.RESET).addClass("affix");var c=this.$target.scrollTop();return this.pinnedOffset=this.$element.offset().top-c};n.prototype.checkPositionWithEventLoop=function(){setTimeout(c.proxy(this.checkPosition,this),1)};n.prototype.checkPosition=function(){if(this.$element.is(":visible")){var g=this.$element.height(),f=this.options.offset,h=f.top,l=f.bottom,B=Math.max(c(document).height(),c(document.body).height());"object"!=typeof f&&(l=h=f);"function"==typeof h&&(h=f.top(this.$element));
"function"==typeof l&&(l=f.bottom(this.$element));f=this.getState(B,g,h,l);if(this.affixed!=f){null!=this.unpin&&this.$element.css("top","");h="affix"+(f?"-"+f:"");var w=c.Event(h+".bs.affix");this.$element.trigger(w);if(w.isDefaultPrevented())return;this.affixed=f;this.unpin="bottom"==f?this.getPinnedOffset():null;this.$element.removeClass(n.RESET).addClass(h).trigger(h.replace("affix","affixed")+".bs.affix")}"bottom"==f&&this.$element.offset({top:B-g-l})}};var h=c.fn.affix;c.fn.affix=l;c.fn.affix.Constructor=
n;c.fn.affix.noConflict=function(){c.fn.affix=h;return this};c(window).on("load",function(){c('[data-spy="affix"]').each(function(){var g=c(this),f=g.data();f.offset=f.offset||{};null!=f.offsetBottom&&(f.offset.bottom=f.offsetBottom);null!=f.offsetTop&&(f.offset.top=f.offsetTop);l.call(g,f)})})}(jQuery);jQuery(document).ready(function(c){c('a[rel="tooltip"]').tooltip()});var systemInitiatedDark=window.matchMedia("(prefers-color-scheme: dark)"),theme=sessionStorage.getItem("theme");
systemInitiatedDark.matches?document.getElementById("theme-switch").checked=!0:(document.getElementById("theme-switch").checked=!1,document.getElementById("theme-toggle").innerHTML="Dark Mode");function prefersColorTest(c){c.matches?(document.documentElement.setAttribute("data-theme","dark"),document.getElementById("theme-switch").checked=!0):(document.documentElement.setAttribute("data-theme","light"),document.getElementById("theme-switch").checked=!1);sessionStorage.setItem("theme","")}systemInitiatedDark.addListener(prefersColorTest);
function modeSwitcher(){var c=sessionStorage.getItem("theme");"dark"===c?(document.documentElement.setAttribute("data-theme","light"),sessionStorage.setItem("theme","light"),document.getElementById("theme-switch").checked=!1):"light"===c?(document.documentElement.setAttribute("data-theme","dark"),sessionStorage.setItem("theme","dark"),document.getElementById("theme-switch").checked=!0):systemInitiatedDark.matches?(document.documentElement.setAttribute("data-theme","light"),sessionStorage.setItem("theme",
"light"),document.getElementById("theme-switch").checked=!1):(document.documentElement.setAttribute("data-theme","dark"),document.getElementById("theme-switch").checked=!0,sessionStorage.setItem("theme","dark"))}
"dark"===theme?(document.documentElement.setAttribute("data-theme","dark"),sessionStorage.setItem("theme","dark"),document.getElementById("theme-switch").checked=!0):"light"===theme&&(document.documentElement.setAttribute("data-theme","light"),sessionStorage.setItem("theme","light"),document.getElementById("theme-switch").checked=!1);
