PageSourceSearch

https://shinhoglobal.com/js/custom/lyt-cn-face.js?VXHwurS78G

js shinhoglobal.com collected 2026-09-25 18:33:33 UTC 525,278 bytes, 17,790 lines download raw bytes

1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, {
40/******/ 				configurable: false,
41/******/ 				enumerable: true,
42/******/ 				get: getter
43/******/ 			});
44/******/ 		}
45/******/ 	};
46/******/
47/******/ 	// getDefaultExport function for compatibility with non-harmony modules
48/******/ 	__webpack_require__.n = function(module) {
49/******/ 		var getter = module && module.__esModule ?
50/******/ 			function getDefault() { return module['default']; } :
51/******/ 			function getModuleExports() { return module; };
52/******/ 		__webpack_require__.d(getter, 'a', getter);
53/******/ 		return getter;
54/******/ 	};
55/******/
56/******/ 	// Object.prototype.hasOwnProperty.call
57/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58/******/
59/******/ 	// __webpack_public_path__
60/******/ 	__webpack_require__.p = "";
61/******/
62/******/ 	// Load entry module and return exports
63/******/ 	return __webpack_require__(__webpack_require__.s = 35);
64/******/ })
65/************************************************************************/
66/******/ ([
67/* 0 */
68/***/ (function(module, exports, __webpack_require__) {
69
70var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
71 * jQuery JavaScript Library v1.12.4
72 * http://jquery.com/
73 *
74 * Includes Sizzle.js
75 * http://sizzlejs.com/
76 *
77 * Copyright jQuery Foundation and other contributors
78 * Released under the MIT license
79 * http://jquery.org/license
80 *
81 * Date: 2016-05-20T17:17Z
82 */
83
84(function (global, factory) {
85
86	if (typeof module === "object" && typeof module.exports === "object") {
87		// For CommonJS and CommonJS-like environments where a proper `window`
88		// is present, execute the factory and get jQuery.
89		// For environments that do not have a `window` with a `document`
90		// (such as Node.js), expose a factory as module.exports.
91		// This accentuates the need for the creation of a real `window`.
92		// e.g. var jQuery = require("jquery")(window);
93		// See ticket #14549 for more info.
94		module.exports = global.document ? factory(global, true) : function (w) {
95			if (!w.document) {
96				throw new Error("jQuery requires a window with a document");
97			}
98			return factory(w);
99		};
100	} else {
101		factory(global);
102	}
103
104	// Pass this if window is not defined yet
105})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
106
107	// Support: Firefox 18+
108	// Can't be in strict mode, several libs including ASP.NET trace
109	// the stack via arguments.caller.callee and Firefox dies if
vendor: 4,159 bytes, lines 110-294
110	// you try to trace through "use strict" call chains. (#13335)
111	//"use strict";
112	var deletedIds = [];
113
114	var document = window.document;
115
116	var slice = deletedIds.slice;
117
118	var concat = deletedIds.concat;
119
120	var push = deletedIds.push;
121
122	var indexOf = deletedIds.indexOf;
123
124	var class2type = {};
125
126	var toString = class2type.toString;
127
128	var hasOwn = class2type.hasOwnProperty;
129
130	var support = {};
131
132	var version = "1.12.4",
133
134
135	// Define a local copy of jQuery
136	jQuery = function (selector, context) {
137
138		// The jQuery object is actually just the init constructor 'enhanced'
139		// Need init if jQuery is called (just allow error to be thrown if not included)
140		return new jQuery.fn.init(selector, context);
141	},
142
143
144	// Support: Android<4.1, IE<9
145	// Make sure we trim BOM and NBSP
146	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
147
148
149	// Matches dashed string for camelizing
150	rmsPrefix = /^-ms-/,
151	    rdashAlpha = /-([\da-z])/gi,
152
153
154	// Used by jQuery.camelCase as callback to replace()
155	fcamelCase = function (all, letter) {
156		return letter.toUpperCase();
157	};
158
159	jQuery.fn = jQuery.prototype = {
160
161		// The current version of jQuery being used
162		jquery: version,
163
164		constructor: jQuery,
165
166		// Start with an empty selector
167		selector: "",
168
169		// The default length of a jQuery object is 0
170		length: 0,
171
172		toArray: function () {
173			return slice.call(this);
174		},
175
176		// Get the Nth element in the matched element set OR
177		// Get the whole matched element set as a clean array
178		get: function (num) {
179			return num != null ?
180
181			// Return just the one element from the set
182			num < 0 ? this[num + this.length] : this[num] :
183
184			// Return all the elements in a clean array
185			slice.call(this);
186		},
187
188		// Take an array of elements and push it onto the stack
189		// (returning the new matched element set)
190		pushStack: function (elems) {
191
192			// Build a new jQuery matched element set
193			var ret = jQuery.merge(this.constructor(), elems);
194
195			// Add the old object onto the stack (as a reference)
196			ret.prevObject = this;
197			ret.context = this.context;
198
199			// Return the newly-formed element set
200			return ret;
201		},
202
203		// Execute a callback for every element in the matched set.
204		each: function (callback) {
205			return jQuery.each(this, callback);
206		},
207
208		map: function (callback) {
209			return this.pushStack(jQuery.map(this, function (elem, i) {
210				return callback.call(elem, i, elem);
211			}));
212		},
213
214		slice: function () {
215			return this.pushStack(slice.apply(this, arguments));
216		},
217
218		first: function () {
219			return this.eq(0);
220		},
221
222		last: function () {
223			return this.eq(-1);
224		},
225
226		eq: function (i) {
227			var len = this.length,
228			    j = +i + (i < 0 ? len : 0);
229			return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
230		},
231
232		end: function () {
233			return this.prevObject || this.constructor();
234		},
235
236		// For internal use only.
237		// Behaves like an Array's method, not like a jQuery method.
238		push: push,
239		sort: deletedIds.sort,
240		splice: deletedIds.splice
241	};
242
243	jQuery.extend = jQuery.fn.extend = function () {
244		var src,
245		    copyIsArray,
246		    copy,
247		    name,
248		    options,
249		    clone,
250		    target = arguments[0] || {},
251		    i = 1,
252		    length = arguments.length,
253		    deep = false;
254
255		// Handle a deep copy situation
256		if (typeof target === "boolean") {
257			deep = target;
258
259			// skip the boolean and the target
260			target = arguments[i] || {};
261			i++;
262		}
263
264		// Handle case when target is a string or something (possible in deep copy)
265		if (typeof target !== "object" && !jQuery.isFunction(target)) {
266			target = {};
267		}
268
269		// extend jQuery itself if only one argument is passed
270		if (i === length) {
271			target = this;
272			i--;
273		}
274
275		for (; i < length; i++) {
276
277			// Only deal with non-null/undefined values
278			if ((options = arguments[i]) != null) {
279
280				// Extend the base object
281				for (name in options) {
282					src = target[name];
283					copy = options[name];
284
285					// Prevent never-ending loop
286					if (target === copy) {
287						continue;
288					}
289
290					// Recurse if we're merging plain objects or arrays
291					if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
292
293						if (copyIsArray) {
294							copyIsArray = false;
vendor: 8,553 bytes, lines 295-636
295							clone = src && jQuery.isArray(src) ? src : [];
296						} else {
297							clone = src && jQuery.isPlainObject(src) ? src : {};
298						}
299
300						// Never move original objects, clone them
301						target[name] = jQuery.extend(deep, clone, copy);
302
303						// Don't bring in undefined values
304					} else if (copy !== undefined) {
305						target[name] = copy;
306					}
307				}
308			}
309		}
310
311		// Return the modified object
312		return target;
313	};
314
315	jQuery.extend({
316
317		// Unique for each copy of jQuery on the page
318		expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
319
320		// Assume jQuery is ready without the ready module
321		isReady: true,
322
323		error: function (msg) {
324			throw new Error(msg);
325		},
326
327		noop: function () {},
328
329		// See test/unit/core.js for details concerning isFunction.
330		// Since version 1.3, DOM methods and functions like alert
331		// aren't supported. They return false on IE (#2968).
332		isFunction: function (obj) {
333			return jQuery.type(obj) === "function";
334		},
335
336		isArray: Array.isArray || function (obj) {
337			return jQuery.type(obj) === "array";
338		},
339
340		isWindow: function (obj) {
341			/* jshint eqeqeq: false */
342			return obj != null && obj == obj.window;
343		},
344
345		isNumeric: function (obj) {
346
347			// parseFloat NaNs numeric-cast false positives (null|true|false|"")
348			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
349			// subtraction forces infinities to NaN
350			// adding 1 corrects loss of precision from parseFloat (#15100)
351			var realStringObj = obj && obj.toString();
352			return !jQuery.isArray(obj) && realStringObj - parseFloat(realStringObj) + 1 >= 0;
353		},
354
355		isEmptyObject: function (obj) {
356			var name;
357			for (name in obj) {
358				return false;
359			}
360			return true;
361		},
362
363		isPlainObject: function (obj) {
364			var key;
365
366			// Must be an Object.
367			// Because of IE, we also have to check the presence of the constructor property.
368			// Make sure that DOM nodes and window objects don't pass through, as well
369			if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
370				return false;
371			}
372
373			try {
374
375				// Not own constructor property must be Object
376				if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
377					return false;
378				}
379			} catch (e) {
380
381				// IE8,9 Will throw exceptions on certain host objects #9897
382				return false;
383			}
384
385			// Support: IE<9
386			// Handle iteration over inherited properties before own properties.
387			if (!support.ownFirst) {
388				for (key in obj) {
389					return hasOwn.call(obj, key);
390				}
391			}
392
393			// Own properties are enumerated firstly, so to speed up,
394			// if last one is own, then all properties are own.
395			for (key in obj) {}
396
397			return key === undefined || hasOwn.call(obj, key);
398		},
399
400		type: function (obj) {
401			if (obj == null) {
402				return obj + "";
403			}
404			return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
405		},
406
407		// Workarounds based on findings by Jim Driscoll
408		// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
409		globalEval: function (data) {
410			if (data && jQuery.trim(data)) {
411
412				// We use execScript on Internet Explorer
413				// We use an anonymous function so that context is window
414				// rather than jQuery in Firefox
415				(window.execScript || function (data) {
416					window["eval"].call(window, data); // jscs:ignore requireDotNotation
417				})(data);
418			}
419		},
420
421		// Convert dashed to camelCase; used by the css and data modules
422		// Microsoft forgot to hump their vendor prefix (#9572)
423		camelCase: function (string) {
424			return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
425		},
426
427		nodeName: function (elem, name) {
428			return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
429		},
430
431		each: function (obj, callback) {
432			var length,
433			    i = 0;
434
435			if (isArrayLike(obj)) {
436				length = obj.length;
437				for (; i < length; i++) {
438					if (callback.call(obj[i], i, obj[i]) === false) {
439						break;
440					}
441				}
442			} else {
443				for (i in obj) {
444					if (callback.call(obj[i], i, obj[i]) === false) {
445						break;
446					}
447				}
448			}
449
450			return obj;
451		},
452
453		// Support: Android<4.1, IE<9
454		trim: function (text) {
455			return text == null ? "" : (text + "").replace(rtrim, "");
456		},
457
458		// results is for internal usage only
459		makeArray: function (arr, results) {
460			var ret = results || [];
461
462			if (arr != null) {
463				if (isArrayLike(Object(arr))) {
464					jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
465				} else {
466					push.call(ret, arr);
467				}
468			}
469
470			return ret;
471		},
472
473		inArray: function (elem, arr, i) {
474			var len;
475
476			if (arr) {
477				if (indexOf) {
478					return indexOf.call(arr, elem, i);
479				}
480
481				len = arr.length;
482				i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
483
484				for (; i < len; i++) {
485
486					// Skip accessing in sparse arrays
487					if (i in arr && arr[i] === elem) {
488						return i;
489					}
490				}
491			}
492
493			return -1;
494		},
495
496		merge: function (first, second) {
497			var len = +second.length,
498			    j = 0,
499			    i = first.length;
500
501			while (j < len) {
502				first[i++] = second[j++];
503			}
504
505			// Support: IE<9
506			// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
507			if (len !== len) {
508				while (second[j] !== undefined) {
509					first[i++] = second[j++];
510				}
511			}
512
513			first.length = i;
514
515			return first;
516		},
517
518		grep: function (elems, callback, invert) {
519			var callbackInverse,
520			    matches = [],
521			    i = 0,
522			    length = elems.length,
523			    callbackExpect = !invert;
524
525			// Go through the array, only saving the items
526			// that pass the validator function
527			for (; i < length; i++) {
528				callbackInverse = !callback(elems[i], i);
529				if (callbackInverse !== callbackExpect) {
530					matches.push(elems[i]);
531				}
532			}
533
534			return matches;
535		},
536
537		// arg is for internal usage only
538		map: function (elems, callback, arg) {
539			var length,
540			    value,
541			    i = 0,
542			    ret = [];
543
544			// Go through the array, translating each of the items to their new values
545			if (isArrayLike(elems)) {
546				length = elems.length;
547				for (; i < length; i++) {
548					value = callback(elems[i], i, arg);
549
550					if (value != null) {
551						ret.push(value);
552					}
553				}
554
555				// Go through every key on the object,
556			} else {
557				for (i in elems) {
558					value = callback(elems[i], i, arg);
559
560					if (value != null) {
561						ret.push(value);
562					}
563				}
564			}
565
566			// Flatten any nested arrays
567			return concat.apply([], ret);
568		},
569
570		// A global GUID counter for objects
571		guid: 1,
572
573		// Bind a function to a context, optionally partially applying any
574		// arguments.
575		proxy: function (fn, context) {
576			var args, proxy, tmp;
577
578			if (typeof context === "string") {
579				tmp = fn[context];
580				context = fn;
581				fn = tmp;
582			}
583
584			// Quick check to determine if target is callable, in the spec
585			// this throws a TypeError, but we will just return undefined.
586			if (!jQuery.isFunction(fn)) {
587				return undefined;
588			}
589
590			// Simulated bind
591			args = slice.call(arguments, 2);
592			proxy = function () {
593				return fn.apply(context || this, args.concat(slice.call(arguments)));
594			};
595
596			// Set the guid of unique handler to the same of original handler, so it can be removed
597			proxy.guid = fn.guid = fn.guid || jQuery.guid++;
598
599			return proxy;
600		},
601
602		now: function () {
603			return +new Date();
604		},
605
606		// jQuery.support is not used in Core but other projects attach their
607		// properties to it so it needs to exist.
608		support: support
609	});
610
611	// JSHint would error on this code due to the Symbol not being defined in ES5.
612	// Defining this global in .jshintrc would create a danger of using the global
613	// unguarded in another place, it seems safer to just disable JSHint for these
614	// three lines.
615	/* jshint ignore: start */
616	if (typeof Symbol === "function") {
617		jQuery.fn[Symbol.iterator] = deletedIds[Symbol.iterator];
618	}
619	/* jshint ignore: end */
620
621	// Populate the class2type map
622	jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) {
623		class2type["[object " + name + "]"] = name.toLowerCase();
624	});
625
626	function isArrayLike(obj) {
627
628		// Support: iOS 8.2 (not reproducible in simulator)
629		// `in` check used to prevent JIT error (gh-2145)
630		// hasOwn isn't used here due to false negatives
631		// regarding Nodelist length in IE
632		var length = !!obj && "length" in obj && obj.length,
633		    type = jQuery.type(obj);
634
635		if (type === "function" || jQuery.isWindow(obj)) {
636			return false;
vendor: 4,770 bytes, lines 637-782
637		}
638
639		return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
640	}
641	var Sizzle =
642	/*!
643  * Sizzle CSS Selector Engine v2.2.1
644  * http://sizzlejs.com/
645  *
646  * Copyright jQuery Foundation and other contributors
647  * Released under the MIT license
648  * http://jquery.org/license
649  *
650  * Date: 2015-10-17
651  */
652	function (window) {
653
654		var i,
655		    support,
656		    Expr,
657		    getText,
658		    isXML,
659		    tokenize,
660		    compile,
661		    select,
662		    outermostContext,
663		    sortInput,
664		    hasDuplicate,
665
666
667		// Local document vars
668		setDocument,
669		    document,
670		    docElem,
671		    documentIsHTML,
672		    rbuggyQSA,
673		    rbuggyMatches,
674		    matches,
675		    contains,
676
677
678		// Instance-specific data
679		expando = "sizzle" + 1 * new Date(),
680		    preferredDoc = window.document,
681		    dirruns = 0,
682		    done = 0,
683		    classCache = createCache(),
684		    tokenCache = createCache(),
685		    compilerCache = createCache(),
686		    sortOrder = function (a, b) {
687			if (a === b) {
688				hasDuplicate = true;
689			}
690			return 0;
691		},
692
693
694		// General-purpose constants
695		MAX_NEGATIVE = 1 << 31,
696
697
698		// Instance methods
699		hasOwn = {}.hasOwnProperty,
700		    arr = [],
701		    pop = arr.pop,
702		    push_native = arr.push,
703		    push = arr.push,
704		    slice = arr.slice,
705
706		// Use a stripped-down indexOf as it's faster than native
707		// http://jsperf.com/thor-indexof-vs-for/5
708		indexOf = function (list, elem) {
709			var i = 0,
710			    len = list.length;
711			for (; i < len; i++) {
712				if (list[i] === elem) {
713					return i;
714				}
715			}
716			return -1;
717		},
718		    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
719
720
721		// Regular expressions
722
723		// http://www.w3.org/TR/css3-selectors/#whitespace
724		whitespace = "[\\x20\\t\\r\\n\\f]",
725
726
727		// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
728		identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
729
730
731		// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
732		attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
733		// Operator (capture 2)
734		"*([*^$|!~]?=)" + whitespace +
735		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
736		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
737		    pseudos = ":(" + identifier + ")(?:\\((" +
738		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
739		// 1. quoted (capture 3; capture 4 or capture 5)
740		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
741		// 2. simple (capture 6)
742		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
743		// 3. anything else (capture 2)
744		".*" + ")\\)|)",
745
746
747		// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
748		rwhitespace = new RegExp(whitespace + "+", "g"),
749		    rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
750		    rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
751		    rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
752		    rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
753		    rpseudo = new RegExp(pseudos),
754		    ridentifier = new RegExp("^" + identifier + "$"),
755		    matchExpr = {
756			"ID": new RegExp("^#(" + identifier + ")"),
757			"CLASS": new RegExp("^\\.(" + identifier + ")"),
758			"TAG": new RegExp("^(" + identifier + "|[*])"),
759			"ATTR": new RegExp("^" + attributes),
760			"PSEUDO": new RegExp("^" + pseudos),
761			"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
762			"bool": new RegExp("^(?:" + booleans + ")$", "i"),
763			// For use in libraries implementing .is()
764			// We use this for POS matching in `select`
765			"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
766		},
767		    rinputs = /^(?:input|select|textarea|button)$/i,
768		    rheader = /^h\d$/i,
769		    rnative = /^[^{]+\{\s*\[native \w/,
770
771
772		// Easily-parseable/retrievable ID or TAG or CLASS selectors
773		rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
774		    rsibling = /[+~]/,
775		    rescape = /'|\\/g,
776
777
778		// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
779		runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
780		    funescape = function (_, escaped, escapedWhitespace) {
781			var high = "0x" + escaped - 0x10000;
782			// NaN means non-codepoint
783			// Support: Firefox<24
784			// Workaround erroneous numeric interpretation of +"0x"
785			return high !== high || escapedWhitespace ? escaped : high < 0 ?
786			// BMP codepoint
787			String.fromCharCode(high + 0x10000) :
788			// Supplemental Plane codepoint (surrogate pair)
789			String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
790		},
791
792
793		// Used for iframes
794		// See setDocument()
795		// Removing the function wrapper causes a "Permission Denied"
796		// error in IE
797		unloadHandler = function () {
798			setDocument();
799		};
800
801		// Optimize for push.apply( _, NodeList )
802		try {
803			push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
804			// Support: Android<4.0
805			// Detect silently failing push.apply
806			arr[preferredDoc.childNodes.length].nodeType;
807		} catch (e) {
808			push = { apply: arr.length ?
809
810				// Leverage slice if possible
811				function (target, els) {
812					push_native.apply(target, slice.call(els));
813				} :
814
815				// Support: IE<9
816				// Otherwise append directly
817				function (target, els) {
818					var j = target.length,
819					    i = 0;
820					// Can't trust NodeList.length
821					while (target[j++] = els[i++]) {}
822					target.length = j - 1;
823				}
824			};
825		}
826
827		function Sizzle(selector, context, results, seed) {
828			var m,
829			    i,
830			    elem,
831			    nid,
832			    nidselect,
833			    match,
834			    groups,
835			    newSelector,
836			    newContext = context && context.ownerDocument,
837
838
839			// nodeType defaults to 9, since context defaults to document
840			nodeType = context ? context.nodeType : 9;
841
842			results = results || [];
843
844			// Return early from calls with invalid selector or context
845			if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
846
847				return results;
848			}
849
850			// Try to shortcut find operations (as opposed to filters) in HTML documents
851			if (!seed) {
852
853				if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
854					setDocument(context);
855				}
856				context = context || document;
857
858				if (documentIsHTML) {
859
860					// If the selector is sufficiently simple, try using a "get*By*" DOM method
861					// (excepting DocumentFragment context, where the methods don't exist)
862					if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {
863
864						// ID selector
865						if (m = match[1]) {
866
867							// Document context
868							if (nodeType === 9) {
869								if (elem = context.getElementById(m)) {
870
871									// Support: IE, Opera, Webkit
872									// TODO: identify versions
873									// getElementById can match elements by name instead of ID
874									if (elem.id === m) {
875										results.push(elem);
876										return results;
877									}
878								} else {
879									return results;
880								}
881
882								// Element context
883							} else {
884
885								// Support: IE, Opera, Webkit
886								// TODO: identify versions
887								// getElementById can match elements by name instead of ID
888								if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) {
889
890									results.push(elem);
891									return results;
892								}
893							}
894
895							// Type selector
896						} else if (match[2]) {
897							push.apply(results, context.getElementsByTagName(selector));
898							return results;
899
900							// Class selector
901						} else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) {
902
903							push.apply(results, context.getElementsByClassName(m));
904							return results;
905						}
906					}
907
908					// Take advantage of querySelectorAll
909					if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
910
911						if (nodeType !== 1) {
912							newContext = context;
913							newSelector = selector;
914
915							// qSA looks outside Element context, which is not what we want
916							// Thanks to Andrew Dupont for this workaround technique
917							// Support: IE <=8
918							// Exclude object elements
919						} else if (context.nodeName.toLowerCase() !== "object") {
920
921							// Capture the context ID, setting it first if necessary
922							if (nid = context.getAttribute("id")) {
923								nid = nid.replace(rescape, "\\$&");
924							} else {
925								context.setAttribute("id", nid = expando);
926							}
927
928							// Prefix every selector in the list
929							groups = tokenize(selector);
930							i = groups.length;
931							nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']";
932							while (i--) {
933								groups[i] = nidselect + " " + toSelector(groups[i]);
934							}
935							newSelector = groups.join(",");
936
937							// Expand context for sibling selectors
vendor: 18,442 bytes, lines 938-1532
938							newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
939						}
940
941						if (newSelector) {
942							try {
943								push.apply(results, newContext.querySelectorAll(newSelector));
944								return results;
945							} catch (qsaError) {} finally {
946								if (nid === expando) {
947									context.removeAttribute("id");
948								}
949							}
950						}
951					}
952				}
953			}
954
955			// All others
956			return select(selector.replace(rtrim, "$1"), context, results, seed);
957		}
958
959		/**
960   * Create key-value caches of limited size
961   * @returns {function(string, object)} Returns the Object data after storing it on itself with
962   *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
963   *	deleting the oldest entry
964   */
965		function createCache() {
966			var keys = [];
967
968			function cache(key, value) {
969				// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
970				if (keys.push(key + " ") > Expr.cacheLength) {
971					// Only keep the most recent entries
972					delete cache[keys.shift()];
973				}
974				return cache[key + " "] = value;
975			}
976			return cache;
977		}
978
979		/**
980   * Mark a function for special use by Sizzle
981   * @param {Function} fn The function to mark
982   */
983		function markFunction(fn) {
984			fn[expando] = true;
985			return fn;
986		}
987
988		/**
989   * Support testing using an element
990   * @param {Function} fn Passed the created div and expects a boolean result
991   */
992		function assert(fn) {
993			var div = document.createElement("div");
994
995			try {
996				return !!fn(div);
997			} catch (e) {
998				return false;
999			} finally {
1000				// Remove from its parent by default
1001				if (div.parentNode) {
1002					div.parentNode.removeChild(div);
1003				}
1004				// release memory in IE
1005				div = null;
1006			}
1007		}
1008
1009		/**
1010   * Adds the same handler for all of the specified attrs
1011   * @param {String} attrs Pipe-separated list of attributes
1012   * @param {Function} handler The method that will be applied
1013   */
1014		function addHandle(attrs, handler) {
1015			var arr = attrs.split("|"),
1016			    i = arr.length;
1017
1018			while (i--) {
1019				Expr.attrHandle[arr[i]] = handler;
1020			}
1021		}
1022
1023		/**
1024   * Checks document order of two siblings
1025   * @param {Element} a
1026   * @param {Element} b
1027   * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1028   */
1029		function siblingCheck(a, b) {
1030			var cur = b && a,
1031			    diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);
1032
1033			// Use IE sourceIndex if available on both nodes
1034			if (diff) {
1035				return diff;
1036			}
1037
1038			// Check if b follows a
1039			if (cur) {
1040				while (cur = cur.nextSibling) {
1041					if (cur === b) {
1042						return -1;
1043					}
1044				}
1045			}
1046
1047			return a ? 1 : -1;
1048		}
1049
1050		/**
1051   * Returns a function to use in pseudos for input types
1052   * @param {String} type
1053   */
1054		function createInputPseudo(type) {
1055			return function (elem) {
1056				var name = elem.nodeName.toLowerCase();
1057				return name === "input" && elem.type === type;
1058			};
1059		}
1060
1061		/**
1062   * Returns a function to use in pseudos for buttons
1063   * @param {String} type
1064   */
1065		function createButtonPseudo(type) {
1066			return function (elem) {
1067				var name = elem.nodeName.toLowerCase();
1068				return (name === "input" || name === "button") && elem.type === type;
1069			};
1070		}
1071
1072		/**
1073   * Returns a function to use in pseudos for positionals
1074   * @param {Function} fn
1075   */
1076		function createPositionalPseudo(fn) {
1077			return markFunction(function (argument) {
1078				argument = +argument;
1079				return markFunction(function (seed, matches) {
1080					var j,
1081					    matchIndexes = fn([], seed.length, argument),
1082					    i = matchIndexes.length;
1083
1084					// Match elements found at the specified indexes
1085					while (i--) {
1086						if (seed[j = matchIndexes[i]]) {
1087							seed[j] = !(matches[j] = seed[j]);
1088						}
1089					}
1090				});
1091			});
1092		}
1093
1094		/**
1095   * Checks a node for validity as a Sizzle context
1096   * @param {Element|Object=} context
1097   * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1098   */
1099		function testContext(context) {
1100			return context && typeof context.getElementsByTagName !== "undefined" && context;
1101		}
1102
1103		// Expose support vars for convenience
1104		support = Sizzle.support = {};
1105
1106		/**
1107   * Detects XML nodes
1108   * @param {Element|Object} elem An element or a document
1109   * @returns {Boolean} True iff elem is a non-HTML XML node
1110   */
1111		isXML = Sizzle.isXML = function (elem) {
1112			// documentElement is verified for cases where it doesn't yet exist
1113			// (such as loading iframes in IE - #4833)
1114			var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1115			return documentElement ? documentElement.nodeName !== "HTML" : false;
1116		};
1117
1118		/**
1119   * Sets document-related variables once based on the current document
1120   * @param {Element|Object} [doc] An element or document object to use to set the document
1121   * @returns {Object} Returns the current document
1122   */
1123		setDocument = Sizzle.setDocument = function (node) {
1124			var hasCompare,
1125			    parent,
1126			    doc = node ? node.ownerDocument || node : preferredDoc;
1127
1128			// Return early if doc is invalid or already selected
1129			if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
1130				return document;
1131			}
1132
1133			// Update global variables
1134			document = doc;
1135			docElem = document.documentElement;
1136			documentIsHTML = !isXML(document);
1137
1138			// Support: IE 9-11, Edge
1139			// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1140			if ((parent = document.defaultView) && parent.top !== parent) {
1141				// Support: IE 11
1142				if (parent.addEventListener) {
1143					parent.addEventListener("unload", unloadHandler, false);
1144
1145					// Support: IE 9 - 10 only
1146				} else if (parent.attachEvent) {
1147					parent.attachEvent("onunload", unloadHandler);
1148				}
1149			}
1150
1151			/* Attributes
1152   ---------------------------------------------------------------------- */
1153
1154			// Support: IE<8
1155			// Verify that getAttribute really returns attributes and not properties
1156			// (excepting IE8 booleans)
1157			support.attributes = assert(function (div) {
1158				div.className = "i";
1159				return !div.getAttribute("className");
1160			});
1161
1162			/* getElement(s)By*
1163   ---------------------------------------------------------------------- */
1164
1165			// Check if getElementsByTagName("*") returns only elements
1166			support.getElementsByTagName = assert(function (div) {
1167				div.appendChild(document.createComment(""));
1168				return !div.getElementsByTagName("*").length;
1169			});
1170
1171			// Support: IE<9
1172			support.getElementsByClassName = rnative.test(document.getElementsByClassName);
1173
1174			// Support: IE<10
1175			// Check if getElementById returns elements by name
1176			// The broken getElementById methods don't pick up programatically-set names,
1177			// so use a roundabout getElementsByName test
1178			support.getById = assert(function (div) {
1179				docElem.appendChild(div).id = expando;
1180				return !document.getElementsByName || !document.getElementsByName(expando).length;
1181			});
1182
1183			// ID find and filter
1184			if (support.getById) {
1185				Expr.find["ID"] = function (id, context) {
1186					if (typeof context.getElementById !== "undefined" && documentIsHTML) {
1187						var m = context.getElementById(id);
1188						return m ? [m] : [];
1189					}
1190				};
1191				Expr.filter["ID"] = function (id) {
1192					var attrId = id.replace(runescape, funescape);
1193					return function (elem) {
1194						return elem.getAttribute("id") === attrId;
1195					};
1196				};
1197			} else {
1198				// Support: IE6/7
1199				// getElementById is not reliable as a find shortcut
1200				delete Expr.find["ID"];
1201
1202				Expr.filter["ID"] = function (id) {
1203					var attrId = id.replace(runescape, funescape);
1204					return function (elem) {
1205						var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
1206						return node && node.value === attrId;
1207					};
1208				};
1209			}
1210
1211			// Tag
1212			Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) {
1213				if (typeof context.getElementsByTagName !== "undefined") {
1214					return context.getElementsByTagName(tag);
1215
1216					// DocumentFragment nodes don't have gEBTN
1217				} else if (support.qsa) {
1218					return context.querySelectorAll(tag);
1219				}
1220			} : function (tag, context) {
1221				var elem,
1222				    tmp = [],
1223				    i = 0,
1224
1225				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1226				results = context.getElementsByTagName(tag);
1227
1228				// Filter out possible comments
1229				if (tag === "*") {
1230					while (elem = results[i++]) {
1231						if (elem.nodeType === 1) {
1232							tmp.push(elem);
1233						}
1234					}
1235
1236					return tmp;
1237				}
1238				return results;
1239			};
1240
1241			// Class
1242			Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
1243				if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
1244					return context.getElementsByClassName(className);
1245				}
1246			};
1247
1248			/* QSA/matchesSelector
1249   ---------------------------------------------------------------------- */
1250
1251			// QSA and matchesSelector support
1252
1253			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1254			rbuggyMatches = [];
1255
1256			// qSa(:focus) reports false when true (Chrome 21)
1257			// We allow this because of a bug in IE8/9 that throws an error
1258			// whenever `document.activeElement` is accessed on an iframe
1259			// So, we allow :focus to pass through QSA all the time to avoid the IE error
1260			// See http://bugs.jquery.com/ticket/13378
1261			rbuggyQSA = [];
1262
1263			if (support.qsa = rnative.test(document.querySelectorAll)) {
1264				// Build QSA regex
1265				// Regex strategy adopted from Diego Perini
1266				assert(function (div) {
1267					// Select is set to empty string on purpose
1268					// This is to test IE's treatment of not explicitly
1269					// setting a boolean content attribute,
1270					// since its presence should be enough
1271					// http://bugs.jquery.com/ticket/12359
1272					docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>";
1273
1274					// Support: IE8, Opera 11-12.16
1275					// Nothing should be selected when empty strings follow ^= or $= or *=
1276					// The test attribute must be unknown in Opera but "safe" for WinRT
1277					// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1278					if (div.querySelectorAll("[msallowcapture^='']").length) {
1279						rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
1280					}
1281
1282					// Support: IE8
1283					// Boolean attributes and "value" are not treated correctly
1284					if (!div.querySelectorAll("[selected]").length) {
1285						rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
1286					}
1287
1288					// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1289					if (!div.querySelectorAll("[id~=" + expando + "-]").length) {
1290						rbuggyQSA.push("~=");
1291					}
1292
1293					// Webkit/Opera - :checked should return selected option elements
1294					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1295					// IE8 throws error here and will not see later tests
1296					if (!div.querySelectorAll(":checked").length) {
1297						rbuggyQSA.push(":checked");
1298					}
1299
1300					// Support: Safari 8+, iOS 8+
1301					// https://bugs.webkit.org/show_bug.cgi?id=136851
1302					// In-page `selector#id sibing-combinator selector` fails
1303					if (!div.querySelectorAll("a#" + expando + "+*").length) {
1304						rbuggyQSA.push(".#.+[+~]");
1305					}
1306				});
1307
1308				assert(function (div) {
1309					// Support: Windows 8 Native Apps
1310					// The type and name attributes are restricted during .innerHTML assignment
1311					var input = document.createElement("input");
1312					input.setAttribute("type", "hidden");
1313					div.appendChild(input).setAttribute("name", "D");
1314
1315					// Support: IE8
1316					// Enforce case-sensitivity of name attribute
1317					if (div.querySelectorAll("[name=d]").length) {
1318						rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
1319					}
1320
1321					// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1322					// IE8 throws error here and will not see later tests
1323					if (!div.querySelectorAll(":enabled").length) {
1324						rbuggyQSA.push(":enabled", ":disabled");
1325					}
1326
1327					// Opera 10-11 does not throw on post-comma invalid pseudos
1328					div.querySelectorAll("*,:x");
1329					rbuggyQSA.push(",.*:");
1330				});
1331			}
1332
1333			if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {
1334
1335				assert(function (div) {
1336					// Check to see if it's possible to do matchesSelector
1337					// on a disconnected node (IE 9)
1338					support.disconnectedMatch = matches.call(div, "div");
1339
1340					// This should fail with an exception
1341					// Gecko does not error, returns false instead
1342					matches.call(div, "[s!='']:x");
1343					rbuggyMatches.push("!=", pseudos);
1344				});
1345			}
1346
1347			rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
1348			rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
1349
1350			/* Contains
1351   ---------------------------------------------------------------------- */
1352			hasCompare = rnative.test(docElem.compareDocumentPosition);
1353
1354			// Element contains another
1355			// Purposefully self-exclusive
1356			// As in, an element does not contain itself
1357			contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
1358				var adown = a.nodeType === 9 ? a.documentElement : a,
1359				    bup = b && b.parentNode;
1360				return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
1361			} : function (a, b) {
1362				if (b) {
1363					while (b = b.parentNode) {
1364						if (b === a) {
1365							return true;
1366						}
1367					}
1368				}
1369				return false;
1370			};
1371
1372			/* Sorting
1373   ---------------------------------------------------------------------- */
1374
1375			// Document order sorting
1376			sortOrder = hasCompare ? function (a, b) {
1377
1378				// Flag for duplicate removal
1379				if (a === b) {
1380					hasDuplicate = true;
1381					return 0;
1382				}
1383
1384				// Sort on method existence if only one input has compareDocumentPosition
1385				var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1386				if (compare) {
1387					return compare;
1388				}
1389
1390				// Calculate position if both inputs belong to the same document
1391				compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) :
1392
1393				// Otherwise we know they are disconnected
1394				1;
1395
1396				// Disconnected nodes
1397				if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {
1398
1399					// Choose the first element that is related to our preferred document
1400					if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
1401						return -1;
1402					}
1403					if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
1404						return 1;
1405					}
1406
1407					// Maintain original order
1408					return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
1409				}
1410
1411				return compare & 4 ? -1 : 1;
1412			} : function (a, b) {
1413				// Exit early if the nodes are identical
1414				if (a === b) {
1415					hasDuplicate = true;
1416					return 0;
1417				}
1418
1419				var cur,
1420				    i = 0,
1421				    aup = a.parentNode,
1422				    bup = b.parentNode,
1423				    ap = [a],
1424				    bp = [b];
1425
1426				// Parentless nodes are either documents or disconnected
1427				if (!aup || !bup) {
1428					return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
1429
1430					// If the nodes are siblings, we can do a quick check
1431				} else if (aup === bup) {
1432					return siblingCheck(a, b);
1433				}
1434
1435				// Otherwise we need full lists of their ancestors for comparison
1436				cur = a;
1437				while (cur = cur.parentNode) {
1438					ap.unshift(cur);
1439				}
1440				cur = b;
1441				while (cur = cur.parentNode) {
1442					bp.unshift(cur);
1443				}
1444
1445				// Walk down the tree looking for a discrepancy
1446				while (ap[i] === bp[i]) {
1447					i++;
1448				}
1449
1450				return i ?
1451				// Do a sibling check if the nodes have a common ancestor
1452				siblingCheck(ap[i], bp[i]) :
1453
1454				// Otherwise nodes in our document sort first
1455				ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
1456			};
1457
1458			return document;
1459		};
1460
1461		Sizzle.matches = function (expr, elements) {
1462			return Sizzle(expr, null, null, elements);
1463		};
1464
1465		Sizzle.matchesSelector = function (elem, expr) {
1466			// Set document vars if needed
1467			if ((elem.ownerDocument || elem) !== document) {
1468				setDocument(elem);
1469			}
1470
1471			// Make sure that attribute selectors are quoted
1472			expr = expr.replace(rattributeQuotes, "='$1']");
1473
1474			if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
1475
1476				try {
1477					var ret = matches.call(elem, expr);
1478
1479					// IE 9's matchesSelector returns false on disconnected nodes
1480					if (ret || support.disconnectedMatch ||
1481					// As well, disconnected nodes are said to be in a document
1482					// fragment in IE 9
1483					elem.document && elem.document.nodeType !== 11) {
1484						return ret;
1485					}
1486				} catch (e) {}
1487			}
1488
1489			return Sizzle(expr, document, null, [elem]).length > 0;
1490		};
1491
1492		Sizzle.contains = function (context, elem) {
1493			// Set document vars if needed
1494			if ((context.ownerDocument || context) !== document) {
1495				setDocument(context);
1496			}
1497			return contains(context, elem);
1498		};
1499
1500		Sizzle.attr = function (elem, name) {
1501			// Set document vars if needed
1502			if ((elem.ownerDocument || elem) !== document) {
1503				setDocument(elem);
1504			}
1505
1506			var fn = Expr.attrHandle[name.toLowerCase()],
1507
1508			// Don't get fooled by Object.prototype properties (jQuery #13807)
1509			val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;
1510
1511			return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
1512		};
1513
1514		Sizzle.error = function (msg) {
1515			throw new Error("Syntax error, unrecognized expression: " + msg);
1516		};
1517
1518		/**
1519   * Document sorting and removing duplicates
1520   * @param {ArrayLike} results
1521   */
1522		Sizzle.uniqueSort = function (results) {
1523			var elem,
1524			    duplicates = [],
1525			    j = 0,
1526			    i = 0;
1527
1528			// Unless we *know* we can detect duplicates, assume their presence
1529			hasDuplicate = !support.detectDuplicates;
1530			sortInput = !support.sortStable && results.slice(0);
1531			results.sort(sortOrder);
1532
vendor: 12,805 bytes, lines 1533-1939
1533			if (hasDuplicate) {
1534				while (elem = results[i++]) {
1535					if (elem === results[i]) {
1536						j = duplicates.push(i);
1537					}
1538				}
1539				while (j--) {
1540					results.splice(duplicates[j], 1);
1541				}
1542			}
1543
1544			// Clear input after sorting to release objects
1545			// See https://github.com/jquery/sizzle/pull/225
1546			sortInput = null;
1547
1548			return results;
1549		};
1550
1551		/**
1552   * Utility function for retrieving the text value of an array of DOM nodes
1553   * @param {Array|Element} elem
1554   */
1555		getText = Sizzle.getText = function (elem) {
1556			var node,
1557			    ret = "",
1558			    i = 0,
1559			    nodeType = elem.nodeType;
1560
1561			if (!nodeType) {
1562				// If no nodeType, this is expected to be an array
1563				while (node = elem[i++]) {
1564					// Do not traverse comment nodes
1565					ret += getText(node);
1566				}
1567			} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
1568				// Use textContent for elements
1569				// innerText usage removed for consistency of new lines (jQuery #11153)
1570				if (typeof elem.textContent === "string") {
1571					return elem.textContent;
1572				} else {
1573					// Traverse its children
1574					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
1575						ret += getText(elem);
1576					}
1577				}
1578			} else if (nodeType === 3 || nodeType === 4) {
1579				return elem.nodeValue;
1580			}
1581			// Do not include comment or processing instruction nodes
1582
1583			return ret;
1584		};
1585
1586		Expr = Sizzle.selectors = {
1587
1588			// Can be adjusted by the user
1589			cacheLength: 50,
1590
1591			createPseudo: markFunction,
1592
1593			match: matchExpr,
1594
1595			attrHandle: {},
1596
1597			find: {},
1598
1599			relative: {
1600				">": { dir: "parentNode", first: true },
1601				" ": { dir: "parentNode" },
1602				"+": { dir: "previousSibling", first: true },
1603				"~": { dir: "previousSibling" }
1604			},
1605
1606			preFilter: {
1607				"ATTR": function (match) {
1608					match[1] = match[1].replace(runescape, funescape);
1609
1610					// Move the given value to match[3] whether quoted or unquoted
1611					match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
1612
1613					if (match[2] === "~=") {
1614						match[3] = " " + match[3] + " ";
1615					}
1616
1617					return match.slice(0, 4);
1618				},
1619
1620				"CHILD": function (match) {
1621					/* matches from matchExpr["CHILD"]
1622     	1 type (only|nth|...)
1623     	2 what (child|of-type)
1624     	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1625     	4 xn-component of xn+y argument ([+-]?\d*n|)
1626     	5 sign of xn-component
1627     	6 x of xn-component
1628     	7 sign of y-component
1629     	8 y of y-component
1630     */
1631					match[1] = match[1].toLowerCase();
1632
1633					if (match[1].slice(0, 3) === "nth") {
1634						// nth-* requires argument
1635						if (!match[3]) {
1636							Sizzle.error(match[0]);
1637						}
1638
1639						// numeric x and y parameters for Expr.filter.CHILD
1640						// remember that false/true cast respectively to 0/1
1641						match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
1642						match[5] = +(match[7] + match[8] || match[3] === "odd");
1643
1644						// other types prohibit arguments
1645					} else if (match[3]) {
1646						Sizzle.error(match[0]);
1647					}
1648
1649					return match;
1650				},
1651
1652				"PSEUDO": function (match) {
1653					var excess,
1654					    unquoted = !match[6] && match[2];
1655
1656					if (matchExpr["CHILD"].test(match[0])) {
1657						return null;
1658					}
1659
1660					// Accept quoted arguments as-is
1661					if (match[3]) {
1662						match[2] = match[4] || match[5] || "";
1663
1664						// Strip excess characters from unquoted arguments
1665					} else if (unquoted && rpseudo.test(unquoted) && (
1666					// Get excess from tokenize (recursively)
1667					excess = tokenize(unquoted, true)) && (
1668					// advance to the next closing parenthesis
1669					excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
1670
1671						// excess is a negative index
1672						match[0] = match[0].slice(0, excess);
1673						match[2] = unquoted.slice(0, excess);
1674					}
1675
1676					// Return only captures needed by the pseudo filter method (type and argument)
1677					return match.slice(0, 3);
1678				}
1679			},
1680
1681			filter: {
1682
1683				"TAG": function (nodeNameSelector) {
1684					var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
1685					return nodeNameSelector === "*" ? function () {
1686						return true;
1687					} : function (elem) {
1688						return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1689					};
1690				},
1691
1692				"CLASS": function (className) {
1693					var pattern = classCache[className + " "];
1694
1695					return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
1696						return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
1697					});
1698				},
1699
1700				"ATTR": function (name, operator, check) {
1701					return function (elem) {
1702						var result = Sizzle.attr(elem, name);
1703
1704						if (result == null) {
1705							return operator === "!=";
1706						}
1707						if (!operator) {
1708							return true;
1709						}
1710
1711						result += "";
1712
1713						return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
1714					};
1715				},
1716
1717				"CHILD": function (type, what, argument, first, last) {
1718					var simple = type.slice(0, 3) !== "nth",
1719					    forward = type.slice(-4) !== "last",
1720					    ofType = what === "of-type";
1721
1722					return first === 1 && last === 0 ?
1723
1724					// Shortcut for :nth-*(n)
1725					function (elem) {
1726						return !!elem.parentNode;
1727					} : function (elem, context, xml) {
1728						var cache,
1729						    uniqueCache,
1730						    outerCache,
1731						    node,
1732						    nodeIndex,
1733						    start,
1734						    dir = simple !== forward ? "nextSibling" : "previousSibling",
1735						    parent = elem.parentNode,
1736						    name = ofType && elem.nodeName.toLowerCase(),
1737						    useCache = !xml && !ofType,
1738						    diff = false;
1739
1740						if (parent) {
1741
1742							// :(first|last|only)-(child|of-type)
1743							if (simple) {
1744								while (dir) {
1745									node = elem;
1746									while (node = node[dir]) {
1747										if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
1748
1749											return false;
1750										}
1751									}
1752									// Reverse direction for :only-* (if we haven't yet done so)
1753									start = dir = type === "only" && !start && "nextSibling";
1754								}
1755								return true;
1756							}
1757
1758							start = [forward ? parent.firstChild : parent.lastChild];
1759
1760							// non-xml :nth-child(...) stores cache data on `parent`
1761							if (forward && useCache) {
1762
1763								// Seek `elem` from a previously-cached index
1764
1765								// ...in a gzip-friendly way
1766								node = parent;
1767								outerCache = node[expando] || (node[expando] = {});
1768
1769								// Support: IE <9 only
1770								// Defend against cloned attroperties (jQuery gh-1709)
1771								uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
1772
1773								cache = uniqueCache[type] || [];
1774								nodeIndex = cache[0] === dirruns && cache[1];
1775								diff = nodeIndex && cache[2];
1776								node = nodeIndex && parent.childNodes[nodeIndex];
1777
1778								while (node = ++nodeIndex && node && node[dir] || (
1779
1780								// Fallback to seeking `elem` from the start
1781								diff = nodeIndex = 0) || start.pop()) {
1782
1783									// When found, cache indexes on `parent` and break
1784									if (node.nodeType === 1 && ++diff && node === elem) {
1785										uniqueCache[type] = [dirruns, nodeIndex, diff];
1786										break;
1787									}
1788								}
1789							} else {
1790								// Use previously-cached element index if available
1791								if (useCache) {
1792									// ...in a gzip-friendly way
1793									node = elem;
1794									outerCache = node[expando] || (node[expando] = {});
1795
1796									// Support: IE <9 only
1797									// Defend against cloned attroperties (jQuery gh-1709)
1798									uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
1799
1800									cache = uniqueCache[type] || [];
1801									nodeIndex = cache[0] === dirruns && cache[1];
1802									diff = nodeIndex;
1803								}
1804
1805								// xml :nth-child(...)
1806								// or :nth-last-child(...) or :nth(-last)?-of-type(...)
1807								if (diff === false) {
1808									// Use the same loop as above to seek `elem` from the start
1809									while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {
1810
1811										if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
1812
1813											// Cache the index of each encountered element
1814											if (useCache) {
1815												outerCache = node[expando] || (node[expando] = {});
1816
1817												// Support: IE <9 only
1818												// Defend against cloned attroperties (jQuery gh-1709)
1819												uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
1820
1821												uniqueCache[type] = [dirruns, diff];
1822											}
1823
1824											if (node === elem) {
1825												break;
1826											}
1827										}
1828									}
1829								}
1830							}
1831
1832							// Incorporate the offset, then check against cycle size
1833							diff -= last;
1834							return diff === first || diff % first === 0 && diff / first >= 0;
1835						}
1836					};
1837				},
1838
1839				"PSEUDO": function (pseudo, argument) {
1840					// pseudo-class names are case-insensitive
1841					// http://www.w3.org/TR/selectors/#pseudo-classes
1842					// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1843					// Remember that setFilters inherits from pseudos
1844					var args,
1845					    fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo);
1846
1847					// The user may use createPseudo to indicate that
1848					// arguments are needed to create the filter function
1849					// just as Sizzle does
1850					if (fn[expando]) {
1851						return fn(argument);
1852					}
1853
1854					// But maintain support for old signatures
1855					if (fn.length > 1) {
1856						args = [pseudo, pseudo, "", argument];
1857						return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
1858							var idx,
1859							    matched = fn(seed, argument),
1860							    i = matched.length;
1861							while (i--) {
1862								idx = indexOf(seed, matched[i]);
1863								seed[idx] = !(matches[idx] = matched[i]);
1864							}
1865						}) : function (elem) {
1866							return fn(elem, 0, args);
1867						};
1868					}
1869
1870					return fn;
1871				}
1872			},
1873
1874			pseudos: {
1875				// Potentially complex pseudos
1876				"not": markFunction(function (selector) {
1877					// Trim the selector passed to compile
1878					// to avoid treating leading and trailing
1879					// spaces as combinators
1880					var input = [],
1881					    results = [],
1882					    matcher = compile(selector.replace(rtrim, "$1"));
1883
1884					return matcher[expando] ? markFunction(function (seed, matches, context, xml) {
1885						var elem,
1886						    unmatched = matcher(seed, null, xml, []),
1887						    i = seed.length;
1888
1889						// Match elements unmatched by `matcher`
1890						while (i--) {
1891							if (elem = unmatched[i]) {
1892								seed[i] = !(matches[i] = elem);
1893							}
1894						}
1895					}) : function (elem, context, xml) {
1896						input[0] = elem;
1897						matcher(input, null, xml, results);
1898						// Don't keep the element (issue #299)
1899						input[0] = null;
1900						return !results.pop();
1901					};
1902				}),
1903
1904				"has": markFunction(function (selector) {
1905					return function (elem) {
1906						return Sizzle(selector, elem).length > 0;
1907					};
1908				}),
1909
1910				"contains": markFunction(function (text) {
1911					text = text.replace(runescape, funescape);
1912					return function (elem) {
1913						return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
1914					};
1915				}),
1916
1917				// "Whether an element is represented by a :lang() selector
1918				// is based solely on the element's language value
1919				// being equal to the identifier C,
1920				// or beginning with the identifier C immediately followed by "-".
1921				// The matching of C against the element's language value is performed case-insensitively.
1922				// The identifier C does not have to be a valid language name."
1923				// http://www.w3.org/TR/selectors/#lang-pseudo
1924				"lang": markFunction(function (lang) {
1925					// lang value must be a valid identifier
1926					if (!ridentifier.test(lang || "")) {
1927						Sizzle.error("unsupported lang: " + lang);
1928					}
1929					lang = lang.replace(runescape, funescape).toLowerCase();
1930					return function (elem) {
1931						var elemLang;
1932						do {
1933							if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
1934
1935								elemLang = elemLang.toLowerCase();
1936								return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
1937							}
1938						} while ((elem = elem.parentNode) && elem.nodeType === 1);
1939						return false;
vendor: 4,299 bytes, lines 1940-2093
1940					};
1941				}),
1942
1943				// Miscellaneous
1944				"target": function (elem) {
1945					var hash = window.location && window.location.hash;
1946					return hash && hash.slice(1) === elem.id;
1947				},
1948
1949				"root": function (elem) {
1950					return elem === docElem;
1951				},
1952
1953				"focus": function (elem) {
1954					return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1955				},
1956
1957				// Boolean properties
1958				"enabled": function (elem) {
1959					return elem.disabled === false;
1960				},
1961
1962				"disabled": function (elem) {
1963					return elem.disabled === true;
1964				},
1965
1966				"checked": function (elem) {
1967					// In CSS3, :checked should return both checked and selected elements
1968					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1969					var nodeName = elem.nodeName.toLowerCase();
1970					return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
1971				},
1972
1973				"selected": function (elem) {
1974					// Accessing this property makes selected-by-default
1975					// options in Safari work properly
1976					if (elem.parentNode) {
1977						elem.parentNode.selectedIndex;
1978					}
1979
1980					return elem.selected === true;
1981				},
1982
1983				// Contents
1984				"empty": function (elem) {
1985					// http://www.w3.org/TR/selectors/#empty-pseudo
1986					// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1987					//   but not by others (comment: 8; processing instruction: 7; etc.)
1988					// nodeType < 6 works because attributes (2) do not appear as children
1989					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
1990						if (elem.nodeType < 6) {
1991							return false;
1992						}
1993					}
1994					return true;
1995				},
1996
1997				"parent": function (elem) {
1998					return !Expr.pseudos["empty"](elem);
1999				},
2000
2001				// Element/input types
2002				"header": function (elem) {
2003					return rheader.test(elem.nodeName);
2004				},
2005
2006				"input": function (elem) {
2007					return rinputs.test(elem.nodeName);
2008				},
2009
2010				"button": function (elem) {
2011					var name = elem.nodeName.toLowerCase();
2012					return name === "input" && elem.type === "button" || name === "button";
2013				},
2014
2015				"text": function (elem) {
2016					var attr;
2017					return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && (
2018
2019					// Support: IE<8
2020					// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2021					(attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
2022				},
2023
2024				// Position-in-collection
2025				"first": createPositionalPseudo(function () {
2026					return [0];
2027				}),
2028
2029				"last": createPositionalPseudo(function (matchIndexes, length) {
2030					return [length - 1];
2031				}),
2032
2033				"eq": createPositionalPseudo(function (matchIndexes, length, argument) {
2034					return [argument < 0 ? argument + length : argument];
2035				}),
2036
2037				"even": createPositionalPseudo(function (matchIndexes, length) {
2038					var i = 0;
2039					for (; i < length; i += 2) {
2040						matchIndexes.push(i);
2041					}
2042					return matchIndexes;
2043				}),
2044
2045				"odd": createPositionalPseudo(function (matchIndexes, length) {
2046					var i = 1;
2047					for (; i < length; i += 2) {
2048						matchIndexes.push(i);
2049					}
2050					return matchIndexes;
2051				}),
2052
2053				"lt": createPositionalPseudo(function (matchIndexes, length, argument) {
2054					var i = argument < 0 ? argument + length : argument;
2055					for (; --i >= 0;) {
2056						matchIndexes.push(i);
2057					}
2058					return matchIndexes;
2059				}),
2060
2061				"gt": createPositionalPseudo(function (matchIndexes, length, argument) {
2062					var i = argument < 0 ? argument + length : argument;
2063					for (; ++i < length;) {
2064						matchIndexes.push(i);
2065					}
2066					return matchIndexes;
2067				})
2068			}
2069		};
2070
2071		Expr.pseudos["nth"] = Expr.pseudos["eq"];
2072
2073		// Add button/input type pseudos
2074		for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
2075			Expr.pseudos[i] = createInputPseudo(i);
2076		}
2077		for (i in { submit: true, reset: true }) {
2078			Expr.pseudos[i] = createButtonPseudo(i);
2079		}
2080
2081		// Easy API for creating new setFilters
2082		function setFilters() {}
2083		setFilters.prototype = Expr.filters = Expr.pseudos;
2084		Expr.setFilters = new setFilters();
2085
2086		tokenize = Sizzle.tokenize = function (selector, parseOnly) {
2087			var matched,
2088			    match,
2089			    tokens,
2090			    type,
2091			    soFar,
2092			    groups,
2093			    preFilters,
vendor: 7,182 bytes, lines 2094-2359
2094			    cached = tokenCache[selector + " "];
2095
2096			if (cached) {
2097				return parseOnly ? 0 : cached.slice(0);
2098			}
2099
2100			soFar = selector;
2101			groups = [];
2102			preFilters = Expr.preFilter;
2103
2104			while (soFar) {
2105
2106				// Comma and first run
2107				if (!matched || (match = rcomma.exec(soFar))) {
2108					if (match) {
2109						// Don't consume trailing commas as valid
2110						soFar = soFar.slice(match[0].length) || soFar;
2111					}
2112					groups.push(tokens = []);
2113				}
2114
2115				matched = false;
2116
2117				// Combinators
2118				if (match = rcombinators.exec(soFar)) {
2119					matched = match.shift();
2120					tokens.push({
2121						value: matched,
2122						// Cast descendant combinators to space
2123						type: match[0].replace(rtrim, " ")
2124					});
2125					soFar = soFar.slice(matched.length);
2126				}
2127
2128				// Filters
2129				for (type in Expr.filter) {
2130					if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
2131						matched = match.shift();
2132						tokens.push({
2133							value: matched,
2134							type: type,
2135							matches: match
2136						});
2137						soFar = soFar.slice(matched.length);
2138					}
2139				}
2140
2141				if (!matched) {
2142					break;
2143				}
2144			}
2145
2146			// Return the length of the invalid excess
2147			// if we're just parsing
2148			// Otherwise, throw an error or return tokens
2149			return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) :
2150			// Cache the tokens
2151			tokenCache(selector, groups).slice(0);
2152		};
2153
2154		function toSelector(tokens) {
2155			var i = 0,
2156			    len = tokens.length,
2157			    selector = "";
2158			for (; i < len; i++) {
2159				selector += tokens[i].value;
2160			}
2161			return selector;
2162		}
2163
2164		function addCombinator(matcher, combinator, base) {
2165			var dir = combinator.dir,
2166			    checkNonElements = base && dir === "parentNode",
2167			    doneName = done++;
2168
2169			return combinator.first ?
2170			// Check against closest ancestor/preceding element
2171			function (elem, context, xml) {
2172				while (elem = elem[dir]) {
2173					if (elem.nodeType === 1 || checkNonElements) {
2174						return matcher(elem, context, xml);
2175					}
2176				}
2177			} :
2178
2179			// Check against all ancestor/preceding elements
2180			function (elem, context, xml) {
2181				var oldCache,
2182				    uniqueCache,
2183				    outerCache,
2184				    newCache = [dirruns, doneName];
2185
2186				// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2187				if (xml) {
2188					while (elem = elem[dir]) {
2189						if (elem.nodeType === 1 || checkNonElements) {
2190							if (matcher(elem, context, xml)) {
2191								return true;
2192							}
2193						}
2194					}
2195				} else {
2196					while (elem = elem[dir]) {
2197						if (elem.nodeType === 1 || checkNonElements) {
2198							outerCache = elem[expando] || (elem[expando] = {});
2199
2200							// Support: IE <9 only
2201							// Defend against cloned attroperties (jQuery gh-1709)
2202							uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});
2203
2204							if ((oldCache = uniqueCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
2205
2206								// Assign to newCache so results back-propagate to previous elements
2207								return newCache[2] = oldCache[2];
2208							} else {
2209								// Reuse newcache so results back-propagate to previous elements
2210								uniqueCache[dir] = newCache;
2211
2212								// A match means we're done; a fail means we have to keep checking
2213								if (newCache[2] = matcher(elem, context, xml)) {
2214									return true;
2215								}
2216							}
2217						}
2218					}
2219				}
2220			};
2221		}
2222
2223		function elementMatcher(matchers) {
2224			return matchers.length > 1 ? function (elem, context, xml) {
2225				var i = matchers.length;
2226				while (i--) {
2227					if (!matchers[i](elem, context, xml)) {
2228						return false;
2229					}
2230				}
2231				return true;
2232			} : matchers[0];
2233		}
2234
2235		function multipleContexts(selector, contexts, results) {
2236			var i = 0,
2237			    len = contexts.length;
2238			for (; i < len; i++) {
2239				Sizzle(selector, contexts[i], results);
2240			}
2241			return results;
2242		}
2243
2244		function condense(unmatched, map, filter, context, xml) {
2245			var elem,
2246			    newUnmatched = [],
2247			    i = 0,
2248			    len = unmatched.length,
2249			    mapped = map != null;
2250
2251			for (; i < len; i++) {
2252				if (elem = unmatched[i]) {
2253					if (!filter || filter(elem, context, xml)) {
2254						newUnmatched.push(elem);
2255						if (mapped) {
2256							map.push(i);
2257						}
2258					}
2259				}
2260			}
2261
2262			return newUnmatched;
2263		}
2264
2265		function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
2266			if (postFilter && !postFilter[expando]) {
2267				postFilter = setMatcher(postFilter);
2268			}
2269			if (postFinder && !postFinder[expando]) {
2270				postFinder = setMatcher(postFinder, postSelector);
2271			}
2272			return markFunction(function (seed, results, context, xml) {
2273				var temp,
2274				    i,
2275				    elem,
2276				    preMap = [],
2277				    postMap = [],
2278				    preexisting = results.length,
2279
2280
2281				// Get initial elements from seed or context
2282				elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
2283
2284
2285				// Prefilter to get matcher input, preserving a map for seed-results synchronization
2286				matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems,
2287				    matcherOut = matcher ?
2288				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2289				postFinder || (seed ? preFilter : preexisting || postFilter) ?
2290
2291				// ...intermediate processing is necessary
2292				[] :
2293
2294				// ...otherwise use results directly
2295				results : matcherIn;
2296
2297				// Find primary matches
2298				if (matcher) {
2299					matcher(matcherIn, matcherOut, context, xml);
2300				}
2301
2302				// Apply postFilter
2303				if (postFilter) {
2304					temp = condense(matcherOut, postMap);
2305					postFilter(temp, [], context, xml);
2306
2307					// Un-match failing elements by moving them back to matcherIn
2308					i = temp.length;
2309					while (i--) {
2310						if (elem = temp[i]) {
2311							matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
2312						}
2313					}
2314				}
2315
2316				if (seed) {
2317					if (postFinder || preFilter) {
2318						if (postFinder) {
2319							// Get the final matcherOut by condensing this intermediate into postFinder contexts
2320							temp = [];
2321							i = matcherOut.length;
2322							while (i--) {
2323								if (elem = matcherOut[i]) {
2324									// Restore matcherIn since elem is not yet a final match
2325									temp.push(matcherIn[i] = elem);
2326								}
2327							}
2328							postFinder(null, matcherOut = [], temp, xml);
2329						}
2330
2331						// Move matched elements from seed to results to keep them synchronized
2332						i = matcherOut.length;
2333						while (i--) {
2334							if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {
2335
2336								seed[temp] = !(results[temp] = elem);
2337							}
2338						}
2339					}
2340
2341					// Add elements to results, through postFinder if defined
2342				} else {
2343					matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
2344					if (postFinder) {
2345						postFinder(null, results, matcherOut, xml);
2346					} else {
2347						push.apply(results, matcherOut);
2348					}
2349				}
2350			});
2351		}
2352
2353		function matcherFromTokens(tokens) {
2354			var checkContext,
2355			    matcher,
2356			    j,
2357			    len = tokens.length,
2358			    leadingRelative = Expr.relative[tokens[0].type],
2359			    implicitRelative = leadingRelative || Expr.relative[" "],
vendor: 7,952 bytes, lines 2360-2596
2360			    i = leadingRelative ? 1 : 0,
2361
2362
2363			// The foundational matcher ensures that elements are reachable from top-level context(s)
2364			matchContext = addCombinator(function (elem) {
2365				return elem === checkContext;
2366			}, implicitRelative, true),
2367			    matchAnyContext = addCombinator(function (elem) {
2368				return indexOf(checkContext, elem) > -1;
2369			}, implicitRelative, true),
2370			    matchers = [function (elem, context, xml) {
2371				var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
2372				// Avoid hanging onto element (issue #299)
2373				checkContext = null;
2374				return ret;
2375			}];
2376
2377			for (; i < len; i++) {
2378				if (matcher = Expr.relative[tokens[i].type]) {
2379					matchers = [addCombinator(elementMatcher(matchers), matcher)];
2380				} else {
2381					matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
2382
2383					// Return special upon seeing a positional matcher
2384					if (matcher[expando]) {
2385						// Find the next relative operator (if any) for proper handling
2386						j = ++i;
2387						for (; j < len; j++) {
2388							if (Expr.relative[tokens[j].type]) {
2389								break;
2390							}
2391						}
2392						return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(
2393						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2394						tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
2395					}
2396					matchers.push(matcher);
2397				}
2398			}
2399
2400			return elementMatcher(matchers);
2401		}
2402
2403		function matcherFromGroupMatchers(elementMatchers, setMatchers) {
2404			var bySet = setMatchers.length > 0,
2405			    byElement = elementMatchers.length > 0,
2406			    superMatcher = function (seed, context, xml, results, outermost) {
2407				var elem,
2408				    j,
2409				    matcher,
2410				    matchedCount = 0,
2411				    i = "0",
2412				    unmatched = seed && [],
2413				    setMatched = [],
2414				    contextBackup = outermostContext,
2415
2416				// We must always have either seed elements or outermost context
2417				elems = seed || byElement && Expr.find["TAG"]("*", outermost),
2418
2419				// Use integer dirruns iff this is the outermost matcher
2420				dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
2421				    len = elems.length;
2422
2423				if (outermost) {
2424					outermostContext = context === document || context || outermost;
2425				}
2426
2427				// Add elements passing elementMatchers directly to results
2428				// Support: IE<9, Safari
2429				// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2430				for (; i !== len && (elem = elems[i]) != null; i++) {
2431					if (byElement && elem) {
2432						j = 0;
2433						if (!context && elem.ownerDocument !== document) {
2434							setDocument(elem);
2435							xml = !documentIsHTML;
2436						}
2437						while (matcher = elementMatchers[j++]) {
2438							if (matcher(elem, context || document, xml)) {
2439								results.push(elem);
2440								break;
2441							}
2442						}
2443						if (outermost) {
2444							dirruns = dirrunsUnique;
2445						}
2446					}
2447
2448					// Track unmatched elements for set filters
2449					if (bySet) {
2450						// They will have gone through all possible matchers
2451						if (elem = !matcher && elem) {
2452							matchedCount--;
2453						}
2454
2455						// Lengthen the array for every element, matched or not
2456						if (seed) {
2457							unmatched.push(elem);
2458						}
2459					}
2460				}
2461
2462				// `i` is now the count of elements visited above, and adding it to `matchedCount`
2463				// makes the latter nonnegative.
2464				matchedCount += i;
2465
2466				// Apply set filters to unmatched elements
2467				// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2468				// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2469				// no element matchers and no seed.
2470				// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2471				// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2472				// numerically zero.
2473				if (bySet && i !== matchedCount) {
2474					j = 0;
2475					while (matcher = setMatchers[j++]) {
2476						matcher(unmatched, setMatched, context, xml);
2477					}
2478
2479					if (seed) {
2480						// Reintegrate element matches to eliminate the need for sorting
2481						if (matchedCount > 0) {
2482							while (i--) {
2483								if (!(unmatched[i] || setMatched[i])) {
2484									setMatched[i] = pop.call(results);
2485								}
2486							}
2487						}
2488
2489						// Discard index placeholder values to get only actual matches
2490						setMatched = condense(setMatched);
2491					}
2492
2493					// Add matches to results
2494					push.apply(results, setMatched);
2495
2496					// Seedless set matches succeeding multiple successful matchers stipulate sorting
2497					if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
2498
2499						Sizzle.uniqueSort(results);
2500					}
2501				}
2502
2503				// Override manipulation of globals by nested matchers
2504				if (outermost) {
2505					dirruns = dirrunsUnique;
2506					outermostContext = contextBackup;
2507				}
2508
2509				return unmatched;
2510			};
2511
2512			return bySet ? markFunction(superMatcher) : superMatcher;
2513		}
2514
2515		compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
2516			var i,
2517			    setMatchers = [],
2518			    elementMatchers = [],
2519			    cached = compilerCache[selector + " "];
2520
2521			if (!cached) {
2522				// Generate a function of recursive functions that can be used to check each element
2523				if (!match) {
2524					match = tokenize(selector);
2525				}
2526				i = match.length;
2527				while (i--) {
2528					cached = matcherFromTokens(match[i]);
2529					if (cached[expando]) {
2530						setMatchers.push(cached);
2531					} else {
2532						elementMatchers.push(cached);
2533					}
2534				}
2535
2536				// Cache the compiled function
2537				cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
2538
2539				// Save selector and tokenization
2540				cached.selector = selector;
2541			}
2542			return cached;
2543		};
2544
2545		/**
2546   * A low-level selection function that works with Sizzle's compiled
2547   *  selector functions
2548   * @param {String|Function} selector A selector or a pre-compiled
2549   *  selector function built with Sizzle.compile
2550   * @param {Element} context
2551   * @param {Array} [results]
2552   * @param {Array} [seed] A set of elements to match against
2553   */
2554		select = Sizzle.select = function (selector, context, results, seed) {
2555			var i,
2556			    tokens,
2557			    token,
2558			    type,
2559			    find,
2560			    compiled = typeof selector === "function" && selector,
2561			    match = !seed && tokenize(selector = compiled.selector || selector);
2562
2563			results = results || [];
2564
2565			// Try to minimize operations if there is only one selector in the list and no seed
2566			// (the latter of which guarantees us context)
2567			if (match.length === 1) {
2568
2569				// Reduce context if the leading compound selector is an ID
2570				tokens = match[0] = match[0].slice(0);
2571				if (tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
2572
2573					context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
2574					if (!context) {
2575						return results;
2576
2577						// Precompiled matchers will still verify ancestry, so step up a level
2578					} else if (compiled) {
2579						context = context.parentNode;
2580					}
2581
2582					selector = selector.slice(tokens.shift().value.length);
2583				}
2584
2585				// Fetch a seed set for right-to-left matching
2586				i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
2587				while (i--) {
2588					token = tokens[i];
2589
2590					// Abort if we hit a combinator
2591					if (Expr.relative[type = token.type]) {
2592						break;
2593					}
2594					if (find = Expr.find[type]) {
2595						// Search, expanding context for leading sibling combinators
2596						if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testC
vendor: 5,935 bytes, lines 2596-2810
2596ontext(context.parentNode) || context)) {
2597
2598							// If seed is empty or no tokens remain, we can return early
2599							tokens.splice(i, 1);
2600							selector = seed.length && toSelector(tokens);
2601							if (!selector) {
2602								push.apply(results, seed);
2603								return results;
2604							}
2605
2606							break;
2607						}
2608					}
2609				}
2610			}
2611
2612			// Compile and execute a filtering function if one is not provided
2613			// Provide `match` to avoid retokenization if we modified the selector above
2614			(compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
2615			return results;
2616		};
2617
2618		// One-time assignments
2619
2620		// Sort stability
2621		support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
2622
2623		// Support: Chrome 14-35+
2624		// Always assume duplicates if they aren't passed to the comparison function
2625		support.detectDuplicates = !!hasDuplicate;
2626
2627		// Initialize against the default document
2628		setDocument();
2629
2630		// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2631		// Detached nodes confoundingly follow *each other*
2632		support.sortDetached = assert(function (div1) {
2633			// Should return 1, but returns 4 (following)
2634			return div1.compareDocumentPosition(document.createElement("div")) & 1;
2635		});
2636
2637		// Support: IE<8
2638		// Prevent attribute/property "interpolation"
2639		// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2640		if (!assert(function (div) {
2641			div.innerHTML = "<a href='#'></a>";
2642			return div.firstChild.getAttribute("href") === "#";
2643		})) {
2644			addHandle("type|href|height|width", function (elem, name, isXML) {
2645				if (!isXML) {
2646					return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
2647				}
2648			});
2649		}
2650
2651		// Support: IE<9
2652		// Use defaultValue in place of getAttribute("value")
2653		if (!support.attributes || !assert(function (div) {
2654			div.innerHTML = "<input/>";
2655			div.firstChild.setAttribute("value", "");
2656			return div.firstChild.getAttribute("value") === "";
2657		})) {
2658			addHandle("value", function (elem, name, isXML) {
2659				if (!isXML && elem.nodeName.toLowerCase() === "input") {
2660					return elem.defaultValue;
2661				}
2662			});
2663		}
2664
2665		// Support: IE<9
2666		// Use getAttributeNode to fetch booleans when getAttribute lies
2667		if (!assert(function (div) {
2668			return div.getAttribute("disabled") == null;
2669		})) {
2670			addHandle(booleans, function (elem, name, isXML) {
2671				var val;
2672				if (!isXML) {
2673					return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
2674				}
2675			});
2676		}
2677
2678		return Sizzle;
2679	}(window);
2680
2681	jQuery.find = Sizzle;
2682	jQuery.expr = Sizzle.selectors;
2683	jQuery.expr[":"] = jQuery.expr.pseudos;
2684	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2685	jQuery.text = Sizzle.getText;
2686	jQuery.isXMLDoc = Sizzle.isXML;
2687	jQuery.contains = Sizzle.contains;
2688
2689	var dir = function (elem, dir, until) {
2690		var matched = [],
2691		    truncate = until !== undefined;
2692
2693		while ((elem = elem[dir]) && elem.nodeType !== 9) {
2694			if (elem.nodeType === 1) {
2695				if (truncate && jQuery(elem).is(until)) {
2696					break;
2697				}
2698				matched.push(elem);
2699			}
2700		}
2701		return matched;
2702	};
2703
2704	var siblings = function (n, elem) {
2705		var matched = [];
2706
2707		for (; n; n = n.nextSibling) {
2708			if (n.nodeType === 1 && n !== elem) {
2709				matched.push(n);
2710			}
2711		}
2712
2713		return matched;
2714	};
2715
2716	var rneedsContext = jQuery.expr.match.needsContext;
2717
2718	var rsingleTag = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/;
2719
2720	var risSimple = /^.[^:#\[\.,]*$/;
2721
2722	// Implement the identical functionality for filter and not
2723	function winnow(elements, qualifier, not) {
2724		if (jQuery.isFunction(qualifier)) {
2725			return jQuery.grep(elements, function (elem, i) {
2726				/* jshint -W018 */
2727				return !!qualifier.call(elem, i, elem) !== not;
2728			});
2729		}
2730
2731		if (qualifier.nodeType) {
2732			return jQuery.grep(elements, function (elem) {
2733				return elem === qualifier !== not;
2734			});
2735		}
2736
2737		if (typeof qualifier === "string") {
2738			if (risSimple.test(qualifier)) {
2739				return jQuery.filter(qualifier, elements, not);
2740			}
2741
2742			qualifier = jQuery.filter(qualifier, elements);
2743		}
2744
2745		return jQuery.grep(elements, function (elem) {
2746			return jQuery.inArray(elem, qualifier) > -1 !== not;
2747		});
2748	}
2749
2750	jQuery.filter = function (expr, elems, not) {
2751		var elem = elems[0];
2752
2753		if (not) {
2754			expr = ":not(" + expr + ")";
2755		}
2756
2757		return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
2758			return elem.nodeType === 1;
2759		}));
2760	};
2761
2762	jQuery.fn.extend({
2763		find: function (selector) {
2764			var i,
2765			    ret = [],
2766			    self = this,
2767			    len = self.length;
2768
2769			if (typeof selector !== "string") {
2770				return this.pushStack(jQuery(selector).filter(function () {
2771					for (i = 0; i < len; i++) {
2772						if (jQuery.contains(self[i], this)) {
2773							return true;
2774						}
2775					}
2776				}));
2777			}
2778
2779			for (i = 0; i < len; i++) {
2780				jQuery.find(selector, self[i], ret);
2781			}
2782
2783			// Needed because $( selector, context ) becomes $( context ).find( selector )
2784			ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret);
2785			ret.selector = this.selector ? this.selector + " " + selector : selector;
2786			return ret;
2787		},
2788		filter: function (selector) {
2789			return this.pushStack(winnow(this, selector || [], false));
2790		},
2791		not: function (selector) {
2792			return this.pushStack(winnow(this, selector || [], true));
2793		},
2794		is: function (selector) {
2795			return !!winnow(this,
2796
2797			// If this is a positional/relative selector, check membership in the returned set
2798			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2799			typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
2800		}
2801	});
2802
2803	// Initialize a jQuery object
2804
2805
2806	// A central reference to the root jQuery(document)
2807	var rootjQuery,
2808
2809
2810	// A simple way to check for HTML strings
vendor: 9,553 bytes, lines 2811-3167
2811	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2812	// Strict HTML recognition (#11290: must start with <)
2813	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2814	    init = jQuery.fn.init = function (selector, context, root) {
2815		var match, elem;
2816
2817		// HANDLE: $(""), $(null), $(undefined), $(false)
2818		if (!selector) {
2819			return this;
2820		}
2821
2822		// init accepts an alternate rootjQuery
2823		// so migrate can support jQuery.sub (gh-2101)
2824		root = root || rootjQuery;
2825
2826		// Handle HTML strings
2827		if (typeof selector === "string") {
2828			if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
2829
2830				// Assume that strings that start and end with <> are HTML and skip the regex check
2831				match = [null, selector, null];
2832			} else {
2833				match = rquickExpr.exec(selector);
2834			}
2835
2836			// Match html or make sure no context is specified for #id
2837			if (match && (match[1] || !context)) {
2838
2839				// HANDLE: $(html) -> $(array)
2840				if (match[1]) {
2841					context = context instanceof jQuery ? context[0] : context;
2842
2843					// scripts is true for back-compat
2844					// Intentionally let the error be thrown if parseHTML is not present
2845					jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));
2846
2847					// HANDLE: $(html, props)
2848					if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
2849						for (match in context) {
2850
2851							// Properties of context are called as methods if possible
2852							if (jQuery.isFunction(this[match])) {
2853								this[match](context[match]);
2854
2855								// ...and otherwise set as attributes
2856							} else {
2857								this.attr(match, context[match]);
2858							}
2859						}
2860					}
2861
2862					return this;
2863
2864					// HANDLE: $(#id)
2865				} else {
2866					elem = document.getElementById(match[2]);
2867
2868					// Check parentNode to catch when Blackberry 4.6 returns
2869					// nodes that are no longer in the document #6963
2870					if (elem && elem.parentNode) {
2871
2872						// Handle the case where IE and Opera return items
2873						// by name instead of ID
2874						if (elem.id !== match[2]) {
2875							return rootjQuery.find(selector);
2876						}
2877
2878						// Otherwise, we inject the element directly into the jQuery object
2879						this.length = 1;
2880						this[0] = elem;
2881					}
2882
2883					this.context = document;
2884					this.selector = selector;
2885					return this;
2886				}
2887
2888				// HANDLE: $(expr, $(...))
2889			} else if (!context || context.jquery) {
2890				return (context || root).find(selector);
2891
2892				// HANDLE: $(expr, context)
2893				// (which is just equivalent to: $(context).find(expr)
2894			} else {
2895				return this.constructor(context).find(selector);
2896			}
2897
2898			// HANDLE: $(DOMElement)
2899		} else if (selector.nodeType) {
2900			this.context = this[0] = selector;
2901			this.length = 1;
2902			return this;
2903
2904			// HANDLE: $(function)
2905			// Shortcut for document ready
2906		} else if (jQuery.isFunction(selector)) {
2907			return typeof root.ready !== "undefined" ? root.ready(selector) :
2908
2909			// Execute immediately if ready is not present
2910			selector(jQuery);
2911		}
2912
2913		if (selector.selector !== undefined) {
2914			this.selector = selector.selector;
2915			this.context = selector.context;
2916		}
2917
2918		return jQuery.makeArray(selector, this);
2919	};
2920
2921	// Give the init function the jQuery prototype for later instantiation
2922	init.prototype = jQuery.fn;
2923
2924	// Initialize central reference
2925	rootjQuery = jQuery(document);
2926
2927	var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2928
2929
2930	// methods guaranteed to produce a unique set when starting from a unique set
2931	guaranteedUnique = {
2932		children: true,
2933		contents: true,
2934		next: true,
2935		prev: true
2936	};
2937
2938	jQuery.fn.extend({
2939		has: function (target) {
2940			var i,
2941			    targets = jQuery(target, this),
2942			    len = targets.length;
2943
2944			return this.filter(function () {
2945				for (i = 0; i < len; i++) {
2946					if (jQuery.contains(this, targets[i])) {
2947						return true;
2948					}
2949				}
2950			});
2951		},
2952
2953		closest: function (selectors, context) {
2954			var cur,
2955			    i = 0,
2956			    l = this.length,
2957			    matched = [],
2958			    pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0;
2959
2960			for (; i < l; i++) {
2961				for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
2962
2963					// Always skip document fragments
2964					if (cur.nodeType < 11 && (pos ? pos.index(cur) > -1 :
2965
2966					// Don't pass non-elements to Sizzle
2967					cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {
2968
2969						matched.push(cur);
2970						break;
2971					}
2972				}
2973			}
2974
2975			return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
2976		},
2977
2978		// Determine the position of an element within
2979		// the matched set of elements
2980		index: function (elem) {
2981
2982			// No argument, return index in parent
2983			if (!elem) {
2984				return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
2985			}
2986
2987			// index in selector
2988			if (typeof elem === "string") {
2989				return jQuery.inArray(this[0], jQuery(elem));
2990			}
2991
2992			// Locate the position of the desired element
2993			return jQuery.inArray(
2994
2995			// If it receives a jQuery object, the first element is used
2996			elem.jquery ? elem[0] : elem, this);
2997		},
2998
2999		add: function (selector, context) {
3000			return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
3001		},
3002
3003		addBack: function (selector) {
3004			return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
3005		}
3006	});
3007
3008	function sibling(cur, dir) {
3009		do {
3010			cur = cur[dir];
3011		} while (cur && cur.nodeType !== 1);
3012
3013		return cur;
3014	}
3015
3016	jQuery.each({
3017		parent: function (elem) {
3018			var parent = elem.parentNode;
3019			return parent && parent.nodeType !== 11 ? parent : null;
3020		},
3021		parents: function (elem) {
3022			return dir(elem, "parentNode");
3023		},
3024		parentsUntil: function (elem, i, until) {
3025			return dir(elem, "parentNode", until);
3026		},
3027		next: function (elem) {
3028			return sibling(elem, "nextSibling");
3029		},
3030		prev: function (elem) {
3031			return sibling(elem, "previousSibling");
3032		},
3033		nextAll: function (elem) {
3034			return dir(elem, "nextSibling");
3035		},
3036		prevAll: function (elem) {
3037			return dir(elem, "previousSibling");
3038		},
3039		nextUntil: function (elem, i, until) {
3040			return dir(elem, "nextSibling", until);
3041		},
3042		prevUntil: function (elem, i, until) {
3043			return dir(elem, "previousSibling", until);
3044		},
3045		siblings: function (elem) {
3046			return siblings((elem.parentNode || {}).firstChild, elem);
3047		},
3048		children: function (elem) {
3049			return siblings(elem.firstChild);
3050		},
3051		contents: function (elem) {
3052			return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.merge([], elem.childNodes);
3053		}
3054	}, function (name, fn) {
3055		jQuery.fn[name] = function (until, selector) {
3056			var ret = jQuery.map(this, fn, until);
3057
3058			if (name.slice(-5) !== "Until") {
3059				selector = until;
3060			}
3061
3062			if (selector && typeof selector === "string") {
3063				ret = jQuery.filter(selector, ret);
3064			}
3065
3066			if (this.length > 1) {
3067
3068				// Remove duplicates
3069				if (!guaranteedUnique[name]) {
3070					ret = jQuery.uniqueSort(ret);
3071				}
3072
3073				// Reverse order for parents* and prev-derivatives
3074				if (rparentsprev.test(name)) {
3075					ret = ret.reverse();
3076				}
3077			}
3078
3079			return this.pushStack(ret);
3080		};
3081	});
3082	var rnotwhite = /\S+/g;
3083
3084	// Convert String-formatted options into Object-formatted ones
3085	function createOptions(options) {
3086		var object = {};
3087		jQuery.each(options.match(rnotwhite) || [], function (_, flag) {
3088			object[flag] = true;
3089		});
3090		return object;
3091	}
3092
3093	/*
3094  * Create a callback list using the following parameters:
3095  *
3096  *	options: an optional list of space-separated options that will change how
3097  *			the callback list behaves or a more traditional option object
3098  *
3099  * By default a callback list will act like an event callback list and can be
3100  * "fired" multiple times.
3101  *
3102  * Possible options:
3103  *
3104  *	once:			will ensure the callback list can only be fired once (like a Deferred)
3105  *
3106  *	memory:			will keep track of previous values and will call any callback added
3107  *					after the list has been fired right away with the latest "memorized"
3108  *					values (like a Deferred)
3109  *
3110  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3111  *
3112  *	stopOnFalse:	interrupt callings when a callback returns false
3113  *
3114  */
3115	jQuery.Callbacks = function (options) {
3116
3117		// Convert options from String-formatted to Object-formatted if needed
3118		// (we check in cache first)
3119		options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
3120
3121		var // Flag to know if list is currently firing
3122		firing,
3123
3124
3125		// Last fire value for non-forgettable lists
3126		memory,
3127
3128
3129		// Flag to know if list was already fired
3130		fired,
3131
3132
3133		// Flag to prevent firing
3134		locked,
3135
3136
3137		// Actual callback list
3138		list = [],
3139
3140
3141		// Queue of execution data for repeatable lists
3142		queue = [],
3143
3144
3145		// Index of currently firing callback (modified by add/remove as needed)
3146		firingIndex = -1,
3147
3148
3149		// Fire callbacks
3150		fire = function () {
3151
3152			// Enforce single-firing
3153			locked = options.once;
3154
3155			// Execute callbacks for all pending executions,
3156			// respecting firingIndex overrides and runtime changes
3157			fired = firing = true;
3158			for (; queue.length; firingIndex = -1) {
3159				memory = queue.shift();
3160				while (++firingIndex < list.length) {
3161
3162					// Run callback and check for early termination
3163					if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
3164
3165						// Jump to end and forget the data so .add doesn't re-fire
3166						firingIndex = list.length;
3167						memory = false;
vendor: 8,134 bytes, lines 3168-3497
3168					}
3169				}
3170			}
3171
3172			// Forget the data if we're done with it
3173			if (!options.memory) {
3174				memory = false;
3175			}
3176
3177			firing = false;
3178
3179			// Clean up if we're done firing for good
3180			if (locked) {
3181
3182				// Keep an empty list if we have data for future add calls
3183				if (memory) {
3184					list = [];
3185
3186					// Otherwise, this object is spent
3187				} else {
3188					list = "";
3189				}
3190			}
3191		},
3192
3193
3194		// Actual Callbacks object
3195		self = {
3196
3197			// Add a callback or a collection of callbacks to the list
3198			add: function () {
3199				if (list) {
3200
3201					// If we have memory from a past run, we should fire after adding
3202					if (memory && !firing) {
3203						firingIndex = list.length - 1;
3204						queue.push(memory);
3205					}
3206
3207					(function add(args) {
3208						jQuery.each(args, function (_, arg) {
3209							if (jQuery.isFunction(arg)) {
3210								if (!options.unique || !self.has(arg)) {
3211									list.push(arg);
3212								}
3213							} else if (arg && arg.length && jQuery.type(arg) !== "string") {
3214
3215								// Inspect recursively
3216								add(arg);
3217							}
3218						});
3219					})(arguments);
3220
3221					if (memory && !firing) {
3222						fire();
3223					}
3224				}
3225				return this;
3226			},
3227
3228			// Remove a callback from the list
3229			remove: function () {
3230				jQuery.each(arguments, function (_, arg) {
3231					var index;
3232					while ((index = jQuery.inArray(arg, list, index)) > -1) {
3233						list.splice(index, 1);
3234
3235						// Handle firing indexes
3236						if (index <= firingIndex) {
3237							firingIndex--;
3238						}
3239					}
3240				});
3241				return this;
3242			},
3243
3244			// Check if a given callback is in the list.
3245			// If no argument is given, return whether or not list has callbacks attached.
3246			has: function (fn) {
3247				return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
3248			},
3249
3250			// Remove all callbacks from the list
3251			empty: function () {
3252				if (list) {
3253					list = [];
3254				}
3255				return this;
3256			},
3257
3258			// Disable .fire and .add
3259			// Abort any current/pending executions
3260			// Clear all callbacks and values
3261			disable: function () {
3262				locked = queue = [];
3263				list = memory = "";
3264				return this;
3265			},
3266			disabled: function () {
3267				return !list;
3268			},
3269
3270			// Disable .fire
3271			// Also disable .add unless we have memory (since it would have no effect)
3272			// Abort any pending executions
3273			lock: function () {
3274				locked = true;
3275				if (!memory) {
3276					self.disable();
3277				}
3278				return this;
3279			},
3280			locked: function () {
3281				return !!locked;
3282			},
3283
3284			// Call all callbacks with the given context and arguments
3285			fireWith: function (context, args) {
3286				if (!locked) {
3287					args = args || [];
3288					args = [context, args.slice ? args.slice() : args];
3289					queue.push(args);
3290					if (!firing) {
3291						fire();
3292					}
3293				}
3294				return this;
3295			},
3296
3297			// Call all the callbacks with the given arguments
3298			fire: function () {
3299				self.fireWith(this, arguments);
3300				return this;
3301			},
3302
3303			// To know if the callbacks have already been called at least once
3304			fired: function () {
3305				return !!fired;
3306			}
3307		};
3308
3309		return self;
3310	};
3311
3312	jQuery.extend({
3313
3314		Deferred: function (func) {
3315			var tuples = [
3316
3317			// action, add listener, listener list, final state
3318			["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]],
3319			    state = "pending",
3320			    promise = {
3321				state: function () {
3322					return state;
3323				},
3324				always: function () {
3325					deferred.done(arguments).fail(arguments);
3326					return this;
3327				},
3328				then: function () /* fnDone, fnFail, fnProgress */{
3329					var fns = arguments;
3330					return jQuery.Deferred(function (newDefer) {
3331						jQuery.each(tuples, function (i, tuple) {
3332							var fn = jQuery.isFunction(fns[i]) && fns[i];
3333
3334							// deferred[ done | fail | progress ] for forwarding actions to newDefer
3335							deferred[tuple[1]](function () {
3336								var returned = fn && fn.apply(this, arguments);
3337								if (returned && jQuery.isFunction(returned.promise)) {
3338									returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
3339								} else {
3340									newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);
3341								}
3342							});
3343						});
3344						fns = null;
3345					}).promise();
3346				},
3347
3348				// Get a promise for this deferred
3349				// If obj is provided, the promise aspect is added to the object
3350				promise: function (obj) {
3351					return obj != null ? jQuery.extend(obj, promise) : promise;
3352				}
3353			},
3354			    deferred = {};
3355
3356			// Keep pipe for back-compat
3357			promise.pipe = promise.then;
3358
3359			// Add list-specific methods
3360			jQuery.each(tuples, function (i, tuple) {
3361				var list = tuple[2],
3362				    stateString = tuple[3];
3363
3364				// promise[ done | fail | progress ] = list.add
3365				promise[tuple[1]] = list.add;
3366
3367				// Handle state
3368				if (stateString) {
3369					list.add(function () {
3370
3371						// state = [ resolved | rejected ]
3372						state = stateString;
3373
3374						// [ reject_list | resolve_list ].disable; progress_list.lock
3375					}, tuples[i ^ 1][2].disable, tuples[2][2].lock);
3376				}
3377
3378				// deferred[ resolve | reject | notify ]
3379				deferred[tuple[0]] = function () {
3380					deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);
3381					return this;
3382				};
3383				deferred[tuple[0] + "With"] = list.fireWith;
3384			});
3385
3386			// Make the deferred a promise
3387			promise.promise(deferred);
3388
3389			// Call given func if any
3390			if (func) {
3391				func.call(deferred, deferred);
3392			}
3393
3394			// All done!
3395			return deferred;
3396		},
3397
3398		// Deferred helper
3399		when: function (subordinate /* , ..., subordinateN */) {
3400			var i = 0,
3401			    resolveValues = slice.call(arguments),
3402			    length = resolveValues.length,
3403
3404
3405			// the count of uncompleted subordinates
3406			remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,
3407
3408
3409			// the master Deferred.
3410			// If resolveValues consist of only a single Deferred, just use that.
3411			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3412
3413
3414			// Update function for both resolve and progress values
3415			updateFunc = function (i, contexts, values) {
3416				return function (value) {
3417					contexts[i] = this;
3418					values[i] = arguments.length > 1 ? slice.call(arguments) : value;
3419					if (values === progressValues) {
3420						deferred.notifyWith(contexts, values);
3421					} else if (! --remaining) {
3422						deferred.resolveWith(contexts, values);
3423					}
3424				};
3425			},
3426			    progressValues,
3427			    progressContexts,
3428			    resolveContexts;
3429
3430			// add listeners to Deferred subordinates; treat others as resolved
3431			if (length > 1) {
3432				progressValues = new Array(length);
3433				progressContexts = new Array(length);
3434				resolveContexts = new Array(length);
3435				for (; i < length; i++) {
3436					if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
3437						resolveValues[i].promise().progress(updateFunc(i, progressContexts, progressValues)).done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject);
3438					} else {
3439						--remaining;
3440					}
3441				}
3442			}
3443
3444			// if we're not waiting on anything, resolve the master
3445			if (!remaining) {
3446				deferred.resolveWith(resolveContexts, resolveValues);
3447			}
3448
3449			return deferred.promise();
3450		}
3451	});
3452
3453	// The deferred used on DOM ready
3454	var readyList;
3455
3456	jQuery.fn.ready = function (fn) {
3457
3458		// Add the callback
3459		jQuery.ready.promise().done(fn);
3460
3461		return this;
3462	};
3463
3464	jQuery.extend({
3465
3466		// Is the DOM ready to be used? Set to true once it occurs.
3467		isReady: false,
3468
3469		// A counter to track how many items to wait for before
3470		// the ready event fires. See #6781
3471		readyWait: 1,
3472
3473		// Hold (or release) the ready event
3474		holdReady: function (hold) {
3475			if (hold) {
3476				jQuery.readyWait++;
3477			} else {
3478				jQuery.ready(true);
3479			}
3480		},
3481
3482		// Handle when the DOM is ready
3483		ready: function (wait) {
3484
3485			// Abort if there are pending holds or we're already ready
3486			if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
3487				return;
3488			}
3489
3490			// Remember that the DOM is ready
3491			jQuery.isReady = true;
3492
3493			// If a normal DOM Ready event fired, decrement, and wait if need be
3494			if (wait !== true && --jQuery.readyWait > 0) {
3495				return;
3496			}
3497
3498			// If there are functions bound, to execute
3499			readyList.resolveWith(document, [jQuery]);
3500
3501			// Trigger any bound ready events
3502			if (jQuery.fn.triggerHandler) {
3503				jQuery(document).triggerHandler("ready");
3504				jQuery(document).off("ready");
3505			}
3506		}
3507	});
3508
3509	/**
3510  * Clean-up method for dom ready events
3511  */
3512	function detach() {
3513		if (document.addEventListener) {
3514			document.removeEventListener("DOMContentLoaded", completed);
3515			window.removeEventListener("load", completed);
3516		} else {
3517			document.detachEvent("onreadystatechange", completed);
3518			window.detachEvent("onload", completed);
3519		}
3520	}
3521
3522	/**
3523  * The ready event handler and self cleanup method
3524  */
3525	function completed() {
3526
3527		// readyState === "complete" is good enough for us to call the dom ready in oldIE
3528		if (document.addEventListener || window.event.type === "load" || document.readyState === "complete") {
3529
3530			detach();
3531			jQuery.ready();
3532		}
3533	}
3534
3535	jQuery.ready.promise = function (obj) {
3536		if (!readyList) {
3537
3538			readyList = jQuery.Deferred();
3539
3540			// Catch cases where $(document).ready() is called
3541			// after the browser event has already occurred.
3542			// Support: IE6-10
3543			// Older IE sometimes signals "interactive" too soon
3544			if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {
3545
3546				// Handle it asynchronously to allow scripts the opportunity to delay ready
3547				window.setTimeout(jQuery.ready);
3548
3549				// Standards-based browsers support DOMContentLoaded
3550			} else if (document.addEventListener) {
3551
3552				// Use the handy event callback
3553				document.addEventListener("DOMContentLoaded", completed);
3554
3555				// A fallback to window.onload, that will always work
3556				window.addEventListener("load", completed);
3557
3558				// If IE event model is used
3559			} else {
3560
3561				// Ensure firing before onload, maybe late but safe also for iframes
3562				document.attachEvent("onreadystatechange", completed);
3563
3564				// A fallback to window.onload, that will always work
3565				window.attachEvent("onload", completed);
3566
3567				// If IE and not a frame
3568				// continually check to see if the document is ready
3569				var top = false;
3570
3571				try {
3572					top = window.frameElement == null && document.documentElement;
3573				} catch (e) {}
3574
3575				if (top && top.doScroll) {
3576					(function doScrollCheck() {
3577						if (!jQuery.isReady) {
3578
3579							try {
3580
3581								// Use the trick by Diego Perini
3582								// http://javascript.nwbox.com/IEContentLoaded/
3583								top.doScroll("left");
3584							} catch (e) {
3585								return window.setTimeout(doScrollCheck, 50);
3586							}
3587
3588							// detach all dom ready events
3589							detach();
3590
3591							// and execute any waiting functions
3592							jQuery.ready();
3593						}
3594					})();
3595				}
3596			}
3597		}
3598		return readyList.promise(obj);
3599	};
3600
3601	// Kick off the DOM ready check even if the user does not
3602	jQuery.ready.promise();
3603
3604	// Support: IE<9
3605	// Iteration over object's inherited properties before its own
3606	var i;
3607	for (i in jQuery(support)) {
3608		break;
3609	}
3610	support.ownFirst = i === "0";
3611
3612	// Note: most support tests are defined in their respective modules.
3613	// false until the test is run
3614	support.inlineBlockNeedsLayout = false;
3615
3616	// Execute ASAP in case we need to set body.style.zoom
3617	jQuery(function () {
3618
3619		// Minified: var a,b,c,d
3620		var val, div, body, container;
3621
3622		body = document.getElementsByTagName("body")[0];
3623		if (!body || !body.style) {
3624
3625			// Return for frameset docs that don't have a body
3626			return;
3627		}
3628
3629		// Setup
3630		div = document.createElement("div");
3631		container = document.createElement("div");
3632		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
3633		body.appendChild(container).appendChild(div);
3634
3635		if (typeof div.style.zoom !== "undefined") {
3636
3637			// Support: IE<8
3638			// Check if natively block-level elements act like inline-block
3639			// elements when setting their display to 'inline' and giving
3640			// them layout
3641			div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
3642
3643			support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
3644			if (val) {
3645
3646				// Prevent IE 6 from affecting layout for positioned elements #11048
3647				// Prevent IE from shrinking the body in IE 7 mode #12869
vendor: 12,463 bytes, lines 3648-4159
3648				// Support: IE<8
3649				body.style.zoom = 1;
3650			}
3651		}
3652
3653		body.removeChild(container);
3654	});
3655
3656	(function () {
3657		var div = document.createElement("div");
3658
3659		// Support: IE<9
3660		support.deleteExpando = true;
3661		try {
3662			delete div.test;
3663		} catch (e) {
3664			support.deleteExpando = false;
3665		}
3666
3667		// Null elements to avoid leaks in IE.
3668		div = null;
3669	})();
3670	var acceptData = function (elem) {
3671		var noData = jQuery.noData[(elem.nodeName + " ").toLowerCase()],
3672		    nodeType = +elem.nodeType || 1;
3673
3674		// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
3675		return nodeType !== 1 && nodeType !== 9 ? false :
3676
3677		// Nodes accept data unless otherwise specified; rejection can be conditional
3678		!noData || noData !== true && elem.getAttribute("classid") === noData;
3679	};
3680
3681	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3682	    rmultiDash = /([A-Z])/g;
3683
3684	function dataAttr(elem, key, data) {
3685
3686		// If nothing was found internally, try to fetch any
3687		// data from the HTML5 data-* attribute
3688		if (data === undefined && elem.nodeType === 1) {
3689
3690			var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();
3691
3692			data = elem.getAttribute(name);
3693
3694			if (typeof data === "string") {
3695				try {
3696					data = data === "true" ? true : data === "false" ? false : data === "null" ? null :
3697
3698					// Only convert to a number if it doesn't change the string
3699					+data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
3700				} catch (e) {}
3701
3702				// Make sure we set the data so it isn't changed later
3703				jQuery.data(elem, key, data);
3704			} else {
3705				data = undefined;
3706			}
3707		}
3708
3709		return data;
3710	}
3711
3712	// checks a cache object for emptiness
3713	function isEmptyDataObject(obj) {
3714		var name;
3715		for (name in obj) {
3716
3717			// if the public data object is empty, the private is still empty
3718			if (name === "data" && jQuery.isEmptyObject(obj[name])) {
3719				continue;
3720			}
3721			if (name !== "toJSON") {
3722				return false;
3723			}
3724		}
3725
3726		return true;
3727	}
3728
3729	function internalData(elem, name, data, pvt /* Internal Use Only */) {
3730		if (!acceptData(elem)) {
3731			return;
3732		}
3733
3734		var ret,
3735		    thisCache,
3736		    internalKey = jQuery.expando,
3737
3738
3739		// We have to handle DOM nodes and JS objects differently because IE6-7
3740		// can't GC object references properly across the DOM-JS boundary
3741		isNode = elem.nodeType,
3742
3743
3744		// Only DOM nodes need the global jQuery cache; JS object data is
3745		// attached directly to the object so GC can occur automatically
3746		cache = isNode ? jQuery.cache : elem,
3747
3748
3749		// Only defining an ID for JS objects if its cache already exists allows
3750		// the code to shortcut on the same path as a DOM node with no cache
3751		id = isNode ? elem[internalKey] : elem[internalKey] && internalKey;
3752
3753		// Avoid doing any more work than we need to when trying to get data on an
3754		// object that has no data at all
3755		if ((!id || !cache[id] || !pvt && !cache[id].data) && data === undefined && typeof name === "string") {
3756			return;
3757		}
3758
3759		if (!id) {
3760
3761			// Only DOM nodes need a new unique ID for each element since their data
3762			// ends up in the global cache
3763			if (isNode) {
3764				id = elem[internalKey] = deletedIds.pop() || jQuery.guid++;
3765			} else {
3766				id = internalKey;
3767			}
3768		}
3769
3770		if (!cache[id]) {
3771
3772			// Avoid exposing jQuery metadata on plain JS objects when the object
3773			// is serialized using JSON.stringify
3774			cache[id] = isNode ? {} : { toJSON: jQuery.noop };
3775		}
3776
3777		// An object can be passed to jQuery.data instead of a key/value pair; this gets
3778		// shallow copied over onto the existing cache
3779		if (typeof name === "object" || typeof name === "function") {
3780			if (pvt) {
3781				cache[id] = jQuery.extend(cache[id], name);
3782			} else {
3783				cache[id].data = jQuery.extend(cache[id].data, name);
3784			}
3785		}
3786
3787		thisCache = cache[id];
3788
3789		// jQuery data() is stored in a separate object inside the object's internal data
3790		// cache in order to avoid key collisions between internal data and user-defined
3791		// data.
3792		if (!pvt) {
3793			if (!thisCache.data) {
3794				thisCache.data = {};
3795			}
3796
3797			thisCache = thisCache.data;
3798		}
3799
3800		if (data !== undefined) {
3801			thisCache[jQuery.camelCase(name)] = data;
3802		}
3803
3804		// Check for both converted-to-camel and non-converted data property names
3805		// If a data property was specified
3806		if (typeof name === "string") {
3807
3808			// First Try to find as-is property data
3809			ret = thisCache[name];
3810
3811			// Test for null|undefined property data
3812			if (ret == null) {
3813
3814				// Try to find the camelCased property
3815				ret = thisCache[jQuery.camelCase(name)];
3816			}
3817		} else {
3818			ret = thisCache;
3819		}
3820
3821		return ret;
3822	}
3823
3824	function internalRemoveData(elem, name, pvt) {
3825		if (!acceptData(elem)) {
3826			return;
3827		}
3828
3829		var thisCache,
3830		    i,
3831		    isNode = elem.nodeType,
3832
3833
3834		// See jQuery.data for more information
3835		cache = isNode ? jQuery.cache : elem,
3836		    id = isNode ? elem[jQuery.expando] : jQuery.expando;
3837
3838		// If there is already no cache entry for this object, there is no
3839		// purpose in continuing
3840		if (!cache[id]) {
3841			return;
3842		}
3843
3844		if (name) {
3845
3846			thisCache = pvt ? cache[id] : cache[id].data;
3847
3848			if (thisCache) {
3849
3850				// Support array or space separated string names for data keys
3851				if (!jQuery.isArray(name)) {
3852
3853					// try the string as a key before any manipulation
3854					if (name in thisCache) {
3855						name = [name];
3856					} else {
3857
3858						// split the camel cased version by spaces unless a key with the spaces exists
3859						name = jQuery.camelCase(name);
3860						if (name in thisCache) {
3861							name = [name];
3862						} else {
3863							name = name.split(" ");
3864						}
3865					}
3866				} else {
3867
3868					// If "name" is an array of keys...
3869					// When data is initially created, via ("key", "val") signature,
3870					// keys will be converted to camelCase.
3871					// Since there is no way to tell _how_ a key was added, remove
3872					// both plain key and camelCase key. #12786
3873					// This will only penalize the array argument path.
3874					name = name.concat(jQuery.map(name, jQuery.camelCase));
3875				}
3876
3877				i = name.length;
3878				while (i--) {
3879					delete thisCache[name[i]];
3880				}
3881
3882				// If there is no data left in the cache, we want to continue
3883				// and let the cache object itself get destroyed
3884				if (pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache)) {
3885					return;
3886				}
3887			}
3888		}
3889
3890		// See jQuery.data for more information
3891		if (!pvt) {
3892			delete cache[id].data;
3893
3894			// Don't destroy the parent cache unless the internal data object
3895			// had been the only thing left in it
3896			if (!isEmptyDataObject(cache[id])) {
3897				return;
3898			}
3899		}
3900
3901		// Destroy the cache
3902		if (isNode) {
3903			jQuery.cleanData([elem], true);
3904
3905			// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3906			/* jshint eqeqeq: false */
3907		} else if (support.deleteExpando || cache != cache.window) {
3908			/* jshint eqeqeq: true */
3909			delete cache[id];
3910
3911			// When all else fails, undefined
3912		} else {
3913			cache[id] = undefined;
3914		}
3915	}
3916
3917	jQuery.extend({
3918		cache: {},
3919
3920		// The following elements (space-suffixed to avoid Object.prototype collisions)
3921		// throw uncatchable exceptions if you attempt to set expando properties
3922		noData: {
3923			"applet ": true,
3924			"embed ": true,
3925
3926			// ...but Flash objects (which have this classid) *can* handle expandos
3927			"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
3928		},
3929
3930		hasData: function (elem) {
3931			elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando];
3932			return !!elem && !isEmptyDataObject(elem);
3933		},
3934
3935		data: function (elem, name, data) {
3936			return internalData(elem, name, data);
3937		},
3938
3939		removeData: function (elem, name) {
3940			return internalRemoveData(elem, name);
3941		},
3942
3943		// For internal use only.
3944		_data: function (elem, name, data) {
3945			return internalData(elem, name, data, true);
3946		},
3947
3948		_removeData: function (elem, name) {
3949			return internalRemoveData(elem, name, true);
3950		}
3951	});
3952
3953	jQuery.fn.extend({
3954		data: function (key, value) {
3955			var i,
3956			    name,
3957			    data,
3958			    elem = this[0],
3959			    attrs = elem && elem.attributes;
3960
3961			// Special expections of .data basically thwart jQuery.access,
3962			// so implement the relevant behavior ourselves
3963
3964			// Gets all values
3965			if (key === undefined) {
3966				if (this.length) {
3967					data = jQuery.data(elem);
3968
3969					if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) {
3970						i = attrs.length;
3971						while (i--) {
3972
3973							// Support: IE11+
3974							// The attrs elements can be null (#14894)
3975							if (attrs[i]) {
3976								name = attrs[i].name;
3977								if (name.indexOf("data-") === 0) {
3978									name = jQuery.camelCase(name.slice(5));
3979									dataAttr(elem, name, data[name]);
3980								}
3981							}
3982						}
3983						jQuery._data(elem, "parsedAttrs", true);
3984					}
3985				}
3986
3987				return data;
3988			}
3989
3990			// Sets multiple values
3991			if (typeof key === "object") {
3992				return this.each(function () {
3993					jQuery.data(this, key);
3994				});
3995			}
3996
3997			return arguments.length > 1 ?
3998
3999			// Sets one value
4000			this.each(function () {
4001				jQuery.data(this, key, value);
4002			}) :
4003
4004			// Gets one value
4005			// Try to fetch any internally stored data first
4006			elem ? dataAttr(elem, key, jQuery.data(elem, key)) : undefined;
4007		},
4008
4009		removeData: function (key) {
4010			return this.each(function () {
4011				jQuery.removeData(this, key);
4012			});
4013		}
4014	});
4015
4016	jQuery.extend({
4017		queue: function (elem, type, data) {
4018			var queue;
4019
4020			if (elem) {
4021				type = (type || "fx") + "queue";
4022				queue = jQuery._data(elem, type);
4023
4024				// Speed up dequeue by getting out quickly if this is just a lookup
4025				if (data) {
4026					if (!queue || jQuery.isArray(data)) {
4027						queue = jQuery._data(elem, type, jQuery.makeArray(data));
4028					} else {
4029						queue.push(data);
4030					}
4031				}
4032				return queue || [];
4033			}
4034		},
4035
4036		dequeue: function (elem, type) {
4037			type = type || "fx";
4038
4039			var queue = jQuery.queue(elem, type),
4040			    startLength = queue.length,
4041			    fn = queue.shift(),
4042			    hooks = jQuery._queueHooks(elem, type),
4043			    next = function () {
4044				jQuery.dequeue(elem, type);
4045			};
4046
4047			// If the fx queue is dequeued, always remove the progress sentinel
4048			if (fn === "inprogress") {
4049				fn = queue.shift();
4050				startLength--;
4051			}
4052
4053			if (fn) {
4054
4055				// Add a progress sentinel to prevent the fx queue from being
4056				// automatically dequeued
4057				if (type === "fx") {
4058					queue.unshift("inprogress");
4059				}
4060
4061				// clear up the last queue stop function
4062				delete hooks.stop;
4063				fn.call(elem, next, hooks);
4064			}
4065
4066			if (!startLength && hooks) {
4067				hooks.empty.fire();
4068			}
4069		},
4070
4071		// not intended for public consumption - generates a queueHooks object,
4072		// or returns the current one
4073		_queueHooks: function (elem, type) {
4074			var key = type + "queueHooks";
4075			return jQuery._data(elem, key) || jQuery._data(elem, key, {
4076				empty: jQuery.Callbacks("once memory").add(function () {
4077					jQuery._removeData(elem, type + "queue");
4078					jQuery._removeData(elem, key);
4079				})
4080			});
4081		}
4082	});
4083
4084	jQuery.fn.extend({
4085		queue: function (type, data) {
4086			var setter = 2;
4087
4088			if (typeof type !== "string") {
4089				data = type;
4090				type = "fx";
4091				setter--;
4092			}
4093
4094			if (arguments.length < setter) {
4095				return jQuery.queue(this[0], type);
4096			}
4097
4098			return data === undefined ? this : this.each(function () {
4099				var queue = jQuery.queue(this, type, data);
4100
4101				// ensure a hooks for this queue
4102				jQuery._queueHooks(this, type);
4103
4104				if (type === "fx" && queue[0] !== "inprogress") {
4105					jQuery.dequeue(this, type);
4106				}
4107			});
4108		},
4109		dequeue: function (type) {
4110			return this.each(function () {
4111				jQuery.dequeue(this, type);
4112			});
4113		},
4114		clearQueue: function (type) {
4115			return this.queue(type || "fx", []);
4116		},
4117
4118		// Get a promise resolved when queues of a certain type
4119		// are emptied (fx is the type by default)
4120		promise: function (type, obj) {
4121			var tmp,
4122			    count = 1,
4123			    defer = jQuery.Deferred(),
4124			    elements = this,
4125			    i = this.length,
4126			    resolve = function () {
4127				if (! --count) {
4128					defer.resolveWith(elements, [elements]);
4129				}
4130			};
4131
4132			if (typeof type !== "string") {
4133				obj = type;
4134				type = undefined;
4135			}
4136			type = type || "fx";
4137
4138			while (i--) {
4139				tmp = jQuery._data(elements[i], type + "queueHooks");
4140				if (tmp && tmp.empty) {
4141					count++;
4142					tmp.empty.add(resolve);
4143				}
4144			}
4145			resolve();
4146			return defer.promise(obj);
4147		}
4148	});
4149
4150	(function () {
4151		var shrinkWrapBlocksVal;
4152
4153		support.shrinkWrapBlocks = function () {
4154			if (shrinkWrapBlocksVal != null) {
4155				return shrinkWrapBlocksVal;
4156			}
4157
4158			// Will be changed later if needed.
4159			shrinkWrapBlocksVal = false;
4160
4161			// Minified: var b,c,d
4162			var div, body, container;
4163
4164			body = document.getElementsByTagName("body")[0];
4165			if (!body || !body.style) {
4166
4167				// Test fired too early or in an unsupported environment, exit.
4168				return;
4169			}
4170
4171			// Setup
4172			div = document.createElement("div");
4173			container = document.createElement("div");
4174			container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
4175			body.appendChild(container).appendChild(div);
4176
4177			// Support: IE6
4178			// Check if elements with layout shrink-wrap their children
4179			if (typeof div.style.zoom !== "undefined") {
4180
4181				// Reset CSS: box-sizing; display; margin; border
4182				div.style.cssText =
4183
4184				// Support: Firefox<29, Android 2.3
4185				// Vendor-prefix box-sizing
4186				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;" + "padding:1px;width:1px;zoom:1";
4187				div.appendChild(document.createElement("div")).style.width = "5px";
4188				shrinkWrapBlocksVal = div.offsetWidth !== 3;
4189			}
4190
4191			body.removeChild(container);
4192
4193			return shrinkWrapBlocksVal;
4194		};
4195	})();
4196	var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
4197
4198	var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
4199
4200	var cssExpand = ["Top", "Right", "Bottom", "Left"];
4201
4202	var isHidden = function (elem, el) {
4203
4204		// isHidden might be called from jQuery#filter function;
4205		// in that case, element will be second argument
4206		elem = el || elem;
4207		return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);
4208	};
4209
4210	function adjustCSS(elem, prop, valueParts, tween) {
4211		var adjusted,
4212		    scale = 1,
4213		    maxIterations = 20,
4214		    currentValue = tween ? function () {
4215			return tween.cur();
4216		} : function () {
4217			return jQuery.css(elem, prop, "");
4218		},
4219		    initial = currentValue(),
4220		    unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),
4221
4222
4223		// Starting value computation is required for potential unit mismatches
4224		initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
4225
4226		if (initialInUnit && initialInUnit[3] !== unit) {
4227
4228			// Trust units reported by jQuery.css
4229			unit = unit || initialInUnit[3];
4230
4231			// Make sure we update the tween properties later on
4232			valueParts = valueParts || [];
4233
4234			// Iteratively approximate from a nonzero starting point
4235			initialInUnit = +initial || 1;
4236
4237			do {
4238
4239				// If previous iteration zeroed out, double until we get *something*.
4240				// Use string for doubling so we don't accidentally see scale as unchanged below
4241				scale = scale || ".5";
4242
4243				// Adjust and apply
4244				initialInUnit = initialInUnit / scale;
4245				jQuery.style(elem, prop, initialInUnit + unit);
4246
4247				// Update scale, tolerating zero or NaN from tween.cur()
4248				// Break the loop if scale is unchanged or perfect, or if we've just had enough.
4249			} while (scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations);
4250		}
4251
4252		if (valueParts) {
4253			initialInUnit = +initialInUnit || +initial || 0;
4254
4255			// Apply relative offset (+=/-=) if specified
4256			adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
4257			if (tween) {
4258				tween.unit = unit;
4259				tween.start = initialInUnit;
4260				tween.end = adjusted;
4261			}
4262		}
4263		return adjusted;
4264	}
4265
4266	// Multifunctional method to get and set values of a collection
4267	// The value/s can optionally be executed if it's a function
4268	var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
4269		var i = 0,
4270		    length = elems.length,
4271		    bulk = key == null;
4272
4273		// Sets many values
4274		if (jQuery.type(key) === "object") {
4275			chainable = true;
4276			for (i in key) {
4277				access(elems, fn, i, key[i], true, emptyGet, raw);
4278			}
4279
4280			// Sets one value
4281		} else if (value !== undefined) {
4282			chainable = true;
4283
4284			if (!jQuery.isFunction(value)) {
4285				raw = true;
4286			}
4287
4288			if (bulk) {
4289
4290				// Bulk operations run against the entire set
4291				if (raw) {
4292					fn.call(elems, value);
4293					fn = null;
4294
4295					// ...except when executing function values
4296				} else {
4297					bulk = fn;
4298					fn = function (elem, key, value) {
4299						return bulk.call(jQuery(elem), value);
4300					};
4301				}
4302			}
4303
4304			if (fn) {
4305				for (; i < length; i++) {
4306					fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
4307				}
4308			}
4309		}
4310
4311		return chainable ? elems :
4312
4313		// Gets
4314		bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet;
4315	};
4316	var rcheckableType = /^(?:checkbox|radio)$/i;
4317
4318	var rtagName = /<([\w:-]+)/;
4319
4320	var rscriptType = /^$|\/(?:java|ecma)script/i;
4321
4322	var rleadingWhitespace = /^\s+/;
4323
4324	var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + "mark|meter|nav|output|picture|progress|section|summary|template|time|video";
4325
4326	function createSafeFragment(document) {
4327		var list = nodeNames.split("|"),
4328		    safeFrag = document.createDocumentFragment();
4329
4330		if (safeFrag.createElement) {
4331			while (list.length) {
4332				safeFrag.createElement(list.pop());
4333			}
4334		}
4335		return safeFrag;
4336	}
4337
4338	(function () {
4339		var div = document.createElement("div"),
4340		    fragment = document.createDocumentFragment(),
4341		    input = document.createElement("input");
4342
4343		// Setup
4344		div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
4345
4346		// IE strips leading whitespace when .innerHTML is used
4347		support.leadingWhitespace = div.firstChild.nodeType === 3;
4348
4349		// Make sure that tbody elements aren't automatically inserted
4350		// IE will insert them into empty tables
4351		support.tbody = !div.getElementsByTagName("tbody").length;
4352
4353		// Make sure that link elements get serialized correctly by innerHTML
4354		// This requires a wrapper element in IE
4355		support.htmlSerialize = !!div.getElementsByTagName("link").length;
4356
4357		// Makes sure cloning an html5 element does not cause problems
4358		// Where outerHTML is undefined, this still works
4359		support.html5Clone = document.createElement("nav").cloneNode(true).outerHTML !== "<:nav></:nav>";
4360
4361		// Check if a disconnected checkbox will retain its checked
4362		// value of true after appended to the DOM (IE6/7)
4363		input.type = "checkbox";
4364		input.checked = true;
4365		fragment.appendChild(input);
4366		support.appendChecked = input.checked;
4367
4368		// Make sure textarea (and checkbox) defaultValue is properly cloned
4369		// Support: IE6-IE11+
4370		div.innerHTML = "<textarea>x</textarea>";
4371		support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
4372
4373		// #11217 - WebKit loses check when the name is after the checked attribute
4374		fragment.appendChild(div);
4375
4376		// Support: Windows Web Apps (WWA)
4377		// `name` and `type` must use .setAttribute for WWA (#14901)
4378		input = document.createElement("input");
4379		input.setAttribute("type", "radio");
4380		input.setAttribute("checked", "checked");
4381		input.setAttribute("name", "t");
4382
4383		div.appendChild(input);
4384
4385		// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4386		// old WebKit doesn't clone checked state correctly in fragments
4387		support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
4388
4389		// Support: IE<9
4390		// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
4391		support.noCloneEvent = !!div.addEventListener;
4392
4393		// Support: IE<9
4394		// Since attributes and properties are the same in IE,
4395		// cleanData must set properties to undefined rather than use removeAttribute
4396		div[jQuery.expando] = 1;
4397		support.attributes = !div.getAttribute(jQuery.expando);
4398	})();
4399
4400	// We have to close these tags to support XHTML (#13200)
4401	var wrapMap = {
4402		option: [1, "<select multiple='multiple'>", "</select>"],
4403		legend: [1, "<fieldset>", "</fieldset>"],
4404		area: [1, "<map>", "</map>"],
4405
4406		// Support: IE8
4407		param: [1, "<object>", "</object>"],
4408		thead: [1, "<table>", "</table>"],
4409		tr: [2, "<table><tbody>", "</tbody></table>"],
4410		col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
4411		td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
4412
4413		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
4414		// unless wrapped in a div with non-breaking characters in front of it.
4415		_default: support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]
4416	};
4417
4418	// Support: IE8-IE9
4419	wrapMap.optgroup = wrapMap.option;
4420
4421	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4422	wrapMap.th = wrapMap.td;
4423
4424	function getAll(context, tag) {
4425		var elems,
4426		    elem,
4427		    i = 0,
4428		    found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName(tag || "*") : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll(tag || "*") : undefined;
4429
4430		if (!found) {
4431			for (found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++) {
4432				if (!tag || jQuery.nodeName(elem, tag)) {
4433					found.push(elem);
4434				} else {
4435					jQuery.merge(found, getAll(elem, tag));
4436				}
4437			}
4438		}
4439
4440		return tag === undefined || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], found) : found;
4441	}
4442
4443	// Mark scripts as having already been evaluated
4444	function setGlobalEval(elems, refElements) {
4445		var elem,
4446		    i = 0;
4447		for (; (elem = elems[i]) != null; i++) {
4448			jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval"));
4449		}
4450	}
4451
4452	var rhtml = /<|&#?\w+;/,
4453	    rtbody = /<tbody/i;
4454
4455	function fixDefaultChecked(elem) {
4456		if (rcheckableType.test(elem.type)) {
4457			elem.defaultChecked = elem.checked;
4458		}
4459	}
4460
4461	function buildFragment(elems, context, scripts, selection, ignored) {
4462		var j,
4463		    elem,
4464		    contains,
4465		    tmp,
4466		    tag,
4467		    tbody,
4468		    wrap,
4469		    l = elems.length,
4470
4471
4472		// Ensure a safe fragment
4473		safe = createSafeFragment(context),
4474		    nodes = [],
4475		    i = 0;
4476
4477		for (; i < l; i++) {
4478			elem = elems[i];
4479
4480			if (elem || elem === 0) {
4481
4482				// Add nodes directly
4483				if (jQuery.type(elem) === "object") {
4484					jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
4485
4486					// Convert non-html into a text node
4487				} else if (!rhtml.test(elem)) {
4488					nodes.push(context.createTextNode(elem));
4489
4490					// Convert html into DOM nodes
4491				} else {
4492					tmp = tmp || safe.appendChild(context.createElement("div"));
4493
4494					// Deserialize a standard representation
4495					tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
4496					wrap = wrapMap[tag] || wrapMap._default;
4497
4498					tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
4499
4500					// Descend through wrappers to the right content
4501					j = wrap[0];
4502					while (j--) {
4503						tmp = tmp.lastChild;
4504					}
4505
4506					// Manually add leading whitespace removed by IE
4507					if (!support.leadingWhitespace && rleadingWhitespace.test(elem)) {
4508						nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0]));
4509					}
4510
4511					// Remove IE's autoinserted <tbody> from table fragments
4512					if (!support.tbody) {
4513
4514						// String was a <table>, *may* have spurious <tbody>
4515						elem = tag === "table" && !rtbody.test(elem) ? tmp.firstChild :
4516
4517						// String was a bare <thead> or <tfoot>
4518						wrap[1] === "<table>" && !rtbody.test(elem) ? tmp : 0;
4519
4520						j = elem && elem.childNodes.length;
4521						while (j--) {
4522							if (jQuery.nodeName(tbody = elem.childNodes[j], "tbody") && !tbody.childNodes.length) {
4523
4524								elem.removeChild(tbody);
4525							}
4526						}
4527					}
4528
4529					jQuery.merge(nodes, tmp.childNodes);
4530
4531					// Fix #12392 for WebKit and IE > 9
4532					tmp.textContent = "";
4533
4534					// Fix #12392 for oldIE
4535					while (tmp.firstChild) {
4536						tmp.removeChild(tmp.firstChild);
4537					}
4538
4539					// Remember the top-level container for proper cleanup
4540					tmp = safe.lastChild;
4541				}
4542			}
4543		}
4544
4545		// Fix #11356: Clear elements from fragment
4546		if (tmp) {
4547			safe.removeChild(tmp);
4548		}
4549
4550		// Reset defaultChecked for any radios and checkboxes
4551		// about to be appended to the DOM in IE 6/7 (#8060)
4552		if (!support.appendChecked) {
4553			jQuery.grep(getAll(nodes, "input"), fixDefaultChecked);
4554		}
4555
4556		i = 0;
4557		while (elem = nodes[i++]) {
4558
4559			// Skip elements already in the context collection (trac-4087)
4560			if (selection && jQuery.inArray(elem, selection) > -1) {
4561				if (ignored) {
4562					ignored.push(elem);
4563				}
4564
4565				continue;
4566			}
4567
4568			contains = jQuery.contains(elem.ownerDocument, elem);
4569
4570			// Append to fragment
4571			tmp = getAll(safe.appendChild(elem), "script");
4572
4573			// Preserve script evaluation history
4574			if (contains) {
4575				setGlobalEval(tmp);
4576			}
4577
4578			// Capture executables
4579			if (scripts) {
4580				j = 0;
4581				while (elem = tmp[j++]) {
4582					if (rscriptType.test(elem.type || "")) {
4583						scripts.push(elem);
4584					}
4585				}
4586			}
4587		}
4588
4589		tmp = null;
4590
4591		return safe;
4592	}
4593
4594	(function () {
4595		var i,
4596		    eventName,
4597		    div = document.createElement("div");
4598
4599		// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
4600		for (i in { submit: true, change: true, focusin: true }) {
4601			eventName = "on" + i;
4602
vendor: 28,100 bytes, lines 4603-5571
4603			if (!(support[i] = eventName in window)) {
4604
4605				// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
4606				div.setAttribute(eventName, "t");
4607				support[i] = div.attributes[eventName].expando === false;
4608			}
4609		}
4610
4611		// Null elements to avoid leaks in IE.
4612		div = null;
4613	})();
4614
4615	var rformElems = /^(?:input|select|textarea)$/i,
4616	    rkeyEvent = /^key/,
4617	    rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4618	    rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4619	    rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4620
4621	function returnTrue() {
4622		return true;
4623	}
4624
4625	function returnFalse() {
4626		return false;
4627	}
4628
4629	// Support: IE9
4630	// See #13393 for more info
4631	function safeActiveElement() {
4632		try {
4633			return document.activeElement;
4634		} catch (err) {}
4635	}
4636
4637	function on(elem, types, selector, data, fn, one) {
4638		var origFn, type;
4639
4640		// Types can be a map of types/handlers
4641		if (typeof types === "object") {
4642
4643			// ( types-Object, selector, data )
4644			if (typeof selector !== "string") {
4645
4646				// ( types-Object, data )
4647				data = data || selector;
4648				selector = undefined;
4649			}
4650			for (type in types) {
4651				on(elem, type, selector, data, types[type], one);
4652			}
4653			return elem;
4654		}
4655
4656		if (data == null && fn == null) {
4657
4658			// ( types, fn )
4659			fn = selector;
4660			data = selector = undefined;
4661		} else if (fn == null) {
4662			if (typeof selector === "string") {
4663
4664				// ( types, selector, fn )
4665				fn = data;
4666				data = undefined;
4667			} else {
4668
4669				// ( types, data, fn )
4670				fn = data;
4671				data = selector;
4672				selector = undefined;
4673			}
4674		}
4675		if (fn === false) {
4676			fn = returnFalse;
4677		} else if (!fn) {
4678			return elem;
4679		}
4680
4681		if (one === 1) {
4682			origFn = fn;
4683			fn = function (event) {
4684
4685				// Can use an empty set, since event contains the info
4686				jQuery().off(event);
4687				return origFn.apply(this, arguments);
4688			};
4689
4690			// Use same guid so caller can remove using origFn
4691			fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
4692		}
4693		return elem.each(function () {
4694			jQuery.event.add(this, types, fn, data, selector);
4695		});
4696	}
4697
4698	/*
4699  * Helper functions for managing events -- not part of the public interface.
4700  * Props to Dean Edwards' addEvent library for many of the ideas.
4701  */
4702	jQuery.event = {
4703
4704		global: {},
4705
4706		add: function (elem, types, handler, data, selector) {
4707			var tmp,
4708			    events,
4709			    t,
4710			    handleObjIn,
4711			    special,
4712			    eventHandle,
4713			    handleObj,
4714			    handlers,
4715			    type,
4716			    namespaces,
4717			    origType,
4718			    elemData = jQuery._data(elem);
4719
4720			// Don't attach events to noData or text/comment nodes (but allow plain objects)
4721			if (!elemData) {
4722				return;
4723			}
4724
4725			// Caller can pass in an object of custom data in lieu of the handler
4726			if (handler.handler) {
4727				handleObjIn = handler;
4728				handler = handleObjIn.handler;
4729				selector = handleObjIn.selector;
4730			}
4731
4732			// Make sure that the handler has a unique ID, used to find/remove it later
4733			if (!handler.guid) {
4734				handler.guid = jQuery.guid++;
4735			}
4736
4737			// Init the element's event structure and main handler, if this is the first
4738			if (!(events = elemData.events)) {
4739				events = elemData.events = {};
4740			}
4741			if (!(eventHandle = elemData.handle)) {
4742				eventHandle = elemData.handle = function (e) {
4743
4744					// Discard the second event of a jQuery.event.trigger() and
4745					// when an event is called after a page has unloaded
4746					return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply(eventHandle.elem, arguments) : undefined;
4747				};
4748
4749				// Add elem as a property of the handle fn to prevent a memory leak
4750				// with IE non-native events
4751				eventHandle.elem = elem;
4752			}
4753
4754			// Handle multiple events separated by a space
4755			types = (types || "").match(rnotwhite) || [""];
4756			t = types.length;
4757			while (t--) {
4758				tmp = rtypenamespace.exec(types[t]) || [];
4759				type = origType = tmp[1];
4760				namespaces = (tmp[2] || "").split(".").sort();
4761
4762				// There *must* be a type, no attaching namespace-only handlers
4763				if (!type) {
4764					continue;
4765				}
4766
4767				// If event changes its type, use the special event handlers for the changed type
4768				special = jQuery.event.special[type] || {};
4769
4770				// If selector defined, determine special event api type, otherwise given type
4771				type = (selector ? special.delegateType : special.bindType) || type;
4772
4773				// Update special based on newly reset type
4774				special = jQuery.event.special[type] || {};
4775
4776				// handleObj is passed to all event handlers
4777				handleObj = jQuery.extend({
4778					type: type,
4779					origType: origType,
4780					data: data,
4781					handler: handler,
4782					guid: handler.guid,
4783					selector: selector,
4784					needsContext: selector && jQuery.expr.match.needsContext.test(selector),
4785					namespace: namespaces.join(".")
4786				}, handleObjIn);
4787
4788				// Init the event handler queue if we're the first
4789				if (!(handlers = events[type])) {
4790					handlers = events[type] = [];
4791					handlers.delegateCount = 0;
4792
4793					// Only use addEventListener/attachEvent if the special events handler returns false
4794					if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
4795
4796						// Bind the global event handler to the element
4797						if (elem.addEventListener) {
4798							elem.addEventListener(type, eventHandle, false);
4799						} else if (elem.attachEvent) {
4800							elem.attachEvent("on" + type, eventHandle);
4801						}
4802					}
4803				}
4804
4805				if (special.add) {
4806					special.add.call(elem, handleObj);
4807
4808					if (!handleObj.handler.guid) {
4809						handleObj.handler.guid = handler.guid;
4810					}
4811				}
4812
4813				// Add to the element's handler list, delegates in front
4814				if (selector) {
4815					handlers.splice(handlers.delegateCount++, 0, handleObj);
4816				} else {
4817					handlers.push(handleObj);
4818				}
4819
4820				// Keep track of which events have ever been used, for event optimization
4821				jQuery.event.global[type] = true;
4822			}
4823
4824			// Nullify elem to prevent memory leaks in IE
4825			elem = null;
4826		},
4827
4828		// Detach an event or set of events from an element
4829		remove: function (elem, types, handler, selector, mappedTypes) {
4830			var j,
4831			    handleObj,
4832			    tmp,
4833			    origCount,
4834			    t,
4835			    events,
4836			    special,
4837			    handlers,
4838			    type,
4839			    namespaces,
4840			    origType,
4841			    elemData = jQuery.hasData(elem) && jQuery._data(elem);
4842
4843			if (!elemData || !(events = elemData.events)) {
4844				return;
4845			}
4846
4847			// Once for each type.namespace in types; type may be omitted
4848			types = (types || "").match(rnotwhite) || [""];
4849			t = types.length;
4850			while (t--) {
4851				tmp = rtypenamespace.exec(types[t]) || [];
4852				type = origType = tmp[1];
4853				namespaces = (tmp[2] || "").split(".").sort();
4854
4855				// Unbind all events (on this namespace, if provided) for the element
4856				if (!type) {
4857					for (type in events) {
4858						jQuery.event.remove(elem, type + types[t], handler, selector, true);
4859					}
4860					continue;
4861				}
4862
4863				special = jQuery.event.special[type] || {};
4864				type = (selector ? special.delegateType : special.bindType) || type;
4865				handlers = events[type] || [];
4866				tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
4867
4868				// Remove matching events
4869				origCount = j = handlers.length;
4870				while (j--) {
4871					handleObj = handlers[j];
4872
4873					if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
4874						handlers.splice(j, 1);
4875
4876						if (handleObj.selector) {
4877							handlers.delegateCount--;
4878						}
4879						if (special.remove) {
4880							special.remove.call(elem, handleObj);
4881						}
4882					}
4883				}
4884
4885				// Remove generic event handler if we removed something and no more handlers exist
4886				// (avoids potential for endless recursion during removal of special event handlers)
4887				if (origCount && !handlers.length) {
4888					if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
4889
4890						jQuery.removeEvent(elem, type, elemData.handle);
4891					}
4892
4893					delete events[type];
4894				}
4895			}
4896
4897			// Remove the expando if it's no longer used
4898			if (jQuery.isEmptyObject(events)) {
4899				delete elemData.handle;
4900
4901				// removeData also checks for emptiness and clears the expando if empty
4902				// so use it instead of delete
4903				jQuery._removeData(elem, "events");
4904			}
4905		},
4906
4907		trigger: function (event, data, elem, onlyHandlers) {
4908			var handle,
4909			    ontype,
4910			    cur,
4911			    bubbleType,
4912			    special,
4913			    tmp,
4914			    i,
4915			    eventPath = [elem || document],
4916			    type = hasOwn.call(event, "type") ? event.type : event,
4917			    namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
4918
4919			cur = tmp = elem = elem || document;
4920
4921			// Don't do events on text and comment nodes
4922			if (elem.nodeType === 3 || elem.nodeType === 8) {
4923				return;
4924			}
4925
4926			// focus/blur morphs to focusin/out; ensure we're not firing them right now
4927			if (rfocusMorph.test(type + jQuery.event.triggered)) {
4928				return;
4929			}
4930
4931			if (type.indexOf(".") > -1) {
4932
4933				// Namespaced trigger; create a regexp to match event type in handle()
4934				namespaces = type.split(".");
4935				type = namespaces.shift();
4936				namespaces.sort();
4937			}
4938			ontype = type.indexOf(":") < 0 && "on" + type;
4939
4940			// Caller can pass in a jQuery.Event object, Object, or just an event type string
4941			event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);
4942
4943			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4944			event.isTrigger = onlyHandlers ? 2 : 3;
4945			event.namespace = namespaces.join(".");
4946			event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
4947
4948			// Clean up the event in case it is being reused
4949			event.result = undefined;
4950			if (!event.target) {
4951				event.target = elem;
4952			}
4953
4954			// Clone any incoming data and prepend the event, creating the handler arg list
4955			data = data == null ? [event] : jQuery.makeArray(data, [event]);
4956
4957			// Allow special events to draw outside the lines
4958			special = jQuery.event.special[type] || {};
4959			if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
4960				return;
4961			}
4962
4963			// Determine event propagation path in advance, per W3C events spec (#9951)
4964			// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4965			if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {
4966
4967				bubbleType = special.delegateType || type;
4968				if (!rfocusMorph.test(bubbleType + type)) {
4969					cur = cur.parentNode;
4970				}
4971				for (; cur; cur = cur.parentNode) {
4972					eventPath.push(cur);
4973					tmp = cur;
4974				}
4975
4976				// Only add window if we got to document (e.g., not plain obj or detached DOM)
4977				if (tmp === (elem.ownerDocument || document)) {
4978					eventPath.push(tmp.defaultView || tmp.parentWindow || window);
4979				}
4980			}
4981
4982			// Fire handlers on the event path
4983			i = 0;
4984			while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
4985
4986				event.type = i > 1 ? bubbleType : special.bindType || type;
4987
4988				// jQuery handler
4989				handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle");
4990
4991				if (handle) {
4992					handle.apply(cur, data);
4993				}
4994
4995				// Native handler
4996				handle = ontype && cur[ontype];
4997				if (handle && handle.apply && acceptData(cur)) {
4998					event.result = handle.apply(cur, data);
4999					if (event.result === false) {
5000						event.preventDefault();
5001					}
5002				}
5003			}
5004			event.type = type;
5005
5006			// If nobody prevented the default action, do it now
5007			if (!onlyHandlers && !event.isDefaultPrevented()) {
5008
5009				if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
5010
5011					// Call a native DOM method on the target with the same name name as the event.
5012					// Can't use an .isFunction() check here because IE6/7 fails that test.
5013					// Don't do default actions on window, that's where global variables be (#6170)
5014					if (ontype && elem[type] && !jQuery.isWindow(elem)) {
5015
5016						// Don't re-trigger an onFOO event when we call its FOO() method
5017						tmp = elem[ontype];
5018
5019						if (tmp) {
5020							elem[ontype] = null;
5021						}
5022
5023						// Prevent re-triggering of the same event, since we already bubbled it above
5024						jQuery.event.triggered = type;
5025						try {
5026							elem[type]();
5027						} catch (e) {
5028
5029							// IE<9 dies on focus/blur to hidden element (#1486,#12518)
5030							// only reproducible on winXP IE8 native, not IE9 in IE8 mode
5031						}
5032						jQuery.event.triggered = undefined;
5033
5034						if (tmp) {
5035							elem[ontype] = tmp;
5036						}
5037					}
5038				}
5039			}
5040
5041			return event.result;
5042		},
5043
5044		dispatch: function (event) {
5045
5046			// Make a writable jQuery.Event from the native event object
5047			event = jQuery.event.fix(event);
5048
5049			var i,
5050			    j,
5051			    ret,
5052			    matched,
5053			    handleObj,
5054			    handlerQueue = [],
5055			    args = slice.call(arguments),
5056			    handlers = (jQuery._data(this, "events") || {})[event.type] || [],
5057			    special = jQuery.event.special[event.type] || {};
5058
5059			// Use the fix-ed jQuery.Event rather than the (read-only) native event
5060			args[0] = event;
5061			event.delegateTarget = this;
5062
5063			// Call the preDispatch hook for the mapped type, and let it bail if desired
5064			if (special.preDispatch && special.preDispatch.call(this, event) === false) {
5065				return;
5066			}
5067
5068			// Determine handlers
5069			handlerQueue = jQuery.event.handlers.call(this, event, handlers);
5070
5071			// Run delegates first; they may want to stop propagation beneath us
5072			i = 0;
5073			while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
5074				event.currentTarget = matched.elem;
5075
5076				j = 0;
5077				while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
5078
5079					// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5080					// a subset or equal to those in the bound event (both can have no namespace).
5081					if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {
5082
5083						event.handleObj = handleObj;
5084						event.data = handleObj.data;
5085
5086						ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
5087
5088						if (ret !== undefined) {
5089							if ((event.result = ret) === false) {
5090								event.preventDefault();
5091								event.stopPropagation();
5092							}
5093						}
5094					}
5095				}
5096			}
5097
5098			// Call the postDispatch hook for the mapped type
5099			if (special.postDispatch) {
5100				special.postDispatch.call(this, event);
5101			}
5102
5103			return event.result;
5104		},
5105
5106		handlers: function (event, handlers) {
5107			var i,
5108			    matches,
5109			    sel,
5110			    handleObj,
5111			    handlerQueue = [],
5112			    delegateCount = handlers.delegateCount,
5113			    cur = event.target;
5114
5115			// Support (at least): Chrome, IE9
5116			// Find delegate handlers
5117			// Black-hole SVG <use> instance trees (#13180)
5118			//
5119			// Support: Firefox<=42+
5120			// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
5121			if (delegateCount && cur.nodeType && (event.type !== "click" || isNaN(event.button) || event.button < 1)) {
5122
5123				/* jshint eqeqeq: false */
5124				for (; cur != this; cur = cur.parentNode || this) {
5125					/* jshint eqeqeq: true */
5126
5127					// Don't check non-elements (#13208)
5128					// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5129					if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) {
5130						matches = [];
5131						for (i = 0; i < delegateCount; i++) {
5132							handleObj = handlers[i];
5133
5134							// Don't conflict with Object.prototype properties (#13203)
5135							sel = handleObj.selector + " ";
5136
5137							if (matches[sel] === undefined) {
5138								matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
5139							}
5140							if (matches[sel]) {
5141								matches.push(handleObj);
5142							}
5143						}
5144						if (matches.length) {
5145							handlerQueue.push({ elem: cur, handlers: matches });
5146						}
5147					}
5148				}
5149			}
5150
5151			// Add the remaining (directly-bound) handlers
5152			if (delegateCount < handlers.length) {
5153				handlerQueue.push({ elem: this, handlers: handlers.slice(delegateCount) });
5154			}
5155
5156			return handlerQueue;
5157		},
5158
5159		fix: function (event) {
5160			if (event[jQuery.expando]) {
5161				return event;
5162			}
5163
5164			// Create a writable copy of the event object and normalize some properties
5165			var i,
5166			    prop,
5167			    copy,
5168			    type = event.type,
5169			    originalEvent = event,
5170			    fixHook = this.fixHooks[type];
5171
5172			if (!fixHook) {
5173				this.fixHooks[type] = fixHook = rmouseEvent.test(type) ? this.mouseHooks : rkeyEvent.test(type) ? this.keyHooks : {};
5174			}
5175			copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;
5176
5177			event = new jQuery.Event(originalEvent);
5178
5179			i = copy.length;
5180			while (i--) {
5181				prop = copy[i];
5182				event[prop] = originalEvent[prop];
5183			}
5184
5185			// Support: IE<9
5186			// Fix target property (#1925)
5187			if (!event.target) {
5188				event.target = originalEvent.srcElement || document;
5189			}
5190
5191			// Support: Safari 6-8+
5192			// Target should not be a text node (#504, #13143)
5193			if (event.target.nodeType === 3) {
5194				event.target = event.target.parentNode;
5195			}
5196
5197			// Support: IE<9
5198			// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
5199			event.metaKey = !!event.metaKey;
5200
5201			return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
5202		},
5203
5204		// Includes some event props shared by KeyEvent and MouseEvent
5205		props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which").split(" "),
5206
5207		fixHooks: {},
5208
5209		keyHooks: {
5210			props: "char charCode key keyCode".split(" "),
5211			filter: function (event, original) {
5212
5213				// Add which for key events
5214				if (event.which == null) {
5215					event.which = original.charCode != null ? original.charCode : original.keyCode;
5216				}
5217
5218				return event;
5219			}
5220		},
5221
5222		mouseHooks: {
5223			props: ("button buttons clientX clientY fromElement offsetX offsetY " + "pageX pageY screenX screenY toElement").split(" "),
5224			filter: function (event, original) {
5225				var body,
5226				    eventDoc,
5227				    doc,
5228				    button = original.button,
5229				    fromElement = original.fromElement;
5230
5231				// Calculate pageX/Y if missing and clientX/Y available
5232				if (event.pageX == null && original.clientX != null) {
5233					eventDoc = event.target.ownerDocument || document;
5234					doc = eventDoc.documentElement;
5235					body = eventDoc.body;
5236
5237					event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
5238					event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
5239				}
5240
5241				// Add relatedTarget, if necessary
5242				if (!event.relatedTarget && fromElement) {
5243					event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
5244				}
5245
5246				// Add which for click: 1 === left; 2 === middle; 3 === right
5247				// Note: button is not normalized, so don't use it
5248				if (!event.which && button !== undefined) {
5249					event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
5250				}
5251
5252				return event;
5253			}
5254		},
5255
5256		special: {
5257			load: {
5258
5259				// Prevent triggered image.load events from bubbling to window.load
5260				noBubble: true
5261			},
5262			focus: {
5263
5264				// Fire native event if possible so blur/focus sequence is correct
5265				trigger: function () {
5266					if (this !== safeActiveElement() && this.focus) {
5267						try {
5268							this.focus();
5269							return false;
5270						} catch (e) {
5271
5272							// Support: IE<9
5273							// If we error on focus to hidden element (#1486, #12518),
5274							// let .trigger() run the handlers
5275						}
5276					}
5277				},
5278				delegateType: "focusin"
5279			},
5280			blur: {
5281				trigger: function () {
5282					if (this === safeActiveElement() && this.blur) {
5283						this.blur();
5284						return false;
5285					}
5286				},
5287				delegateType: "focusout"
5288			},
5289			click: {
5290
5291				// For checkbox, fire native event so checked state will be right
5292				trigger: function () {
5293					if (jQuery.nodeName(this, "input") && this.type === "checkbox" && this.click) {
5294						this.click();
5295						return false;
5296					}
5297				},
5298
5299				// For cross-browser consistency, don't fire native .click() on links
5300				_default: function (event) {
5301					return jQuery.nodeName(event.target, "a");
5302				}
5303			},
5304
5305			beforeunload: {
5306				postDispatch: function (event) {
5307
5308					// Support: Firefox 20+
5309					// Firefox doesn't alert if the returnValue field is not set.
5310					if (event.result !== undefined && event.originalEvent) {
5311						event.originalEvent.returnValue = event.result;
5312					}
5313				}
5314			}
5315		},
5316
5317		// Piggyback on a donor event to simulate a different one
5318		simulate: function (type, elem, event) {
5319			var e = jQuery.extend(new jQuery.Event(), event, {
5320				type: type,
5321				isSimulated: true
5322
5323				// Previously, `originalEvent: {}` was set here, so stopPropagation call
5324				// would not be triggered on donor event, since in our own
5325				// jQuery.event.stopPropagation function we had a check for existence of
5326				// originalEvent.stopPropagation method, so, consequently it would be a noop.
5327				//
5328				// Guard for simulated events was moved to jQuery.event.stopPropagation function
5329				// since `originalEvent` should point to the original event for the
5330				// constancy with other events and for more focused logic
5331			});
5332
5333			jQuery.event.trigger(e, null, elem);
5334
5335			if (e.isDefaultPrevented()) {
5336				event.preventDefault();
5337			}
5338		}
5339	};
5340
5341	jQuery.removeEvent = document.removeEventListener ? function (elem, type, handle) {
5342
5343		// This "if" is needed for plain objects
5344		if (elem.removeEventListener) {
5345			elem.removeEventListener(type, handle);
5346		}
5347	} : function (elem, type, handle) {
5348		var name = "on" + type;
5349
5350		if (elem.detachEvent) {
5351
5352			// #8545, #7054, preventing memory leaks for custom events in IE6-8
5353			// detachEvent needed property on element, by name of that event,
5354			// to properly expose it to GC
5355			if (typeof elem[name] === "undefined") {
5356				elem[name] = null;
5357			}
5358
5359			elem.detachEvent(name, handle);
5360		}
5361	};
5362
5363	jQuery.Event = function (src, props) {
5364
5365		// Allow instantiation without the 'new' keyword
5366		if (!(this instanceof jQuery.Event)) {
5367			return new jQuery.Event(src, props);
5368		}
5369
5370		// Event object
5371		if (src && src.type) {
5372			this.originalEvent = src;
5373			this.type = src.type;
5374
5375			// Events bubbling up the document may have been marked as prevented
5376			// by a handler lower down the tree; reflect the correct value.
5377			this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&
5378
5379			// Support: IE < 9, Android < 4.0
5380			src.returnValue === false ? returnTrue : returnFalse;
5381
5382			// Event type
5383		} else {
5384			this.type = src;
5385		}
5386
5387		// Put explicitly provided properties onto the event object
5388		if (props) {
5389			jQuery.extend(this, props);
5390		}
5391
5392		// Create a timestamp if incoming event doesn't have one
5393		this.timeStamp = src && src.timeStamp || jQuery.now();
5394
5395		// Mark it as fixed
5396		this[jQuery.expando] = true;
5397	};
5398
5399	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5400	// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5401	jQuery.Event.prototype = {
5402		constructor: jQuery.Event,
5403		isDefaultPrevented: returnFalse,
5404		isPropagationStopped: returnFalse,
5405		isImmediatePropagationStopped: returnFalse,
5406
5407		preventDefault: function () {
5408			var e = this.originalEvent;
5409
5410			this.isDefaultPrevented = returnTrue;
5411			if (!e) {
5412				return;
5413			}
5414
5415			// If preventDefault exists, run it on the original event
5416			if (e.preventDefault) {
5417				e.preventDefault();
5418
5419				// Support: IE
5420				// Otherwise set the returnValue property of the original event to false
5421			} else {
5422				e.returnValue = false;
5423			}
5424		},
5425		stopPropagation: function () {
5426			var e = this.originalEvent;
5427
5428			this.isPropagationStopped = returnTrue;
5429
5430			if (!e || this.isSimulated) {
5431				return;
5432			}
5433
5434			// If stopPropagation exists, run it on the original event
5435			if (e.stopPropagation) {
5436				e.stopPropagation();
5437			}
5438
5439			// Support: IE
5440			// Set the cancelBubble property of the original event to true
5441			e.cancelBubble = true;
5442		},
5443		stopImmediatePropagation: function () {
5444			var e = this.originalEvent;
5445
5446			this.isImmediatePropagationStopped = returnTrue;
5447
5448			if (e && e.stopImmediatePropagation) {
5449				e.stopImmediatePropagation();
5450			}
5451
5452			this.stopPropagation();
5453		}
5454	};
5455
5456	// Create mouseenter/leave events using mouseover/out and event-time checks
5457	// so that event delegation works in jQuery.
5458	// Do the same for pointerenter/pointerleave and pointerover/pointerout
5459	//
5460	// Support: Safari 7 only
5461	// Safari sends mouseenter too often; see:
5462	// https://code.google.com/p/chromium/issues/detail?id=470258
5463	// for the description of the bug (it existed in older Chrome versions as well).
5464	jQuery.each({
5465		mouseenter: "mouseover",
5466		mouseleave: "mouseout",
5467		pointerenter: "pointerover",
5468		pointerleave: "pointerout"
5469	}, function (orig, fix) {
5470		jQuery.event.special[orig] = {
5471			delegateType: fix,
5472			bindType: fix,
5473
5474			handle: function (event) {
5475				var ret,
5476				    target = this,
5477				    related = event.relatedTarget,
5478				    handleObj = event.handleObj;
5479
5480				// For mouseenter/leave call the handler if related is outside the target.
5481				// NB: No relatedTarget if the mouse left/entered the browser window
5482				if (!related || related !== target && !jQuery.contains(target, related)) {
5483					event.type = handleObj.origType;
5484					ret = handleObj.handler.apply(this, arguments);
5485					event.type = fix;
5486				}
5487				return ret;
5488			}
5489		};
5490	});
5491
5492	// IE submit delegation
5493	if (!support.submit) {
5494
5495		jQuery.event.special.submit = {
5496			setup: function () {
5497
5498				// Only need this for delegated form submit events
5499				if (jQuery.nodeName(this, "form")) {
5500					return false;
5501				}
5502
5503				// Lazy-add a submit handler when a descendant form may potentially be submitted
5504				jQuery.event.add(this, "click._submit keypress._submit", function (e) {
5505
5506					// Node name check avoids a VML-related crash in IE (#9807)
5507					var elem = e.target,
5508					    form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ?
5509
5510					// Support: IE <=8
5511					// We use jQuery.prop instead of elem.form
5512					// to allow fixing the IE8 delegated submit issue (gh-2332)
5513					// by 3rd party polyfills/workarounds.
5514					jQuery.prop(elem, "form") : undefined;
5515
5516					if (form && !jQuery._data(form, "submit")) {
5517						jQuery.event.add(form, "submit._submit", function (event) {
5518							event._submitBubble = true;
5519						});
5520						jQuery._data(form, "submit", true);
5521					}
5522				});
5523
5524				// return undefined since we don't need an event listener
5525			},
5526
5527			postDispatch: function (event) {
5528
5529				// If form was submitted by the user, bubble the event up the tree
5530				if (event._submitBubble) {
5531					delete event._submitBubble;
5532					if (this.parentNode && !event.isTrigger) {
5533						jQuery.event.simulate("submit", this.parentNode, event);
5534					}
5535				}
5536			},
5537
5538			teardown: function () {
5539
5540				// Only need this for delegated form submit events
5541				if (jQuery.nodeName(this, "form")) {
5542					return false;
5543				}
5544
5545				// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5546				jQuery.event.remove(this, "._submit");
5547			}
5548		};
5549	}
5550
5551	// IE change delegation and checkbox/radio fix
5552	if (!support.change) {
5553
5554		jQuery.event.special.change = {
5555
5556			setup: function () {
5557
5558				if (rformElems.test(this.nodeName)) {
5559
5560					// IE doesn't fire change on a check/radio until blur; trigger it on click
5561					// after a propertychange. Eat the blur-change in special.change.handle.
5562					// This still fires onchange a second time for check/radio after blur.
5563					if (this.type === "checkbox" || this.type === "radio") {
5564						jQuery.event.add(this, "propertychange._change", function (event) {
5565							if (event.originalEvent.propertyName === "checked") {
5566								this._justChanged = true;
5567							}
5568						});
5569						jQuery.event.add(this, "click._change", function (event) {
5570							if (this._justChanged && !event.isTrigger) {
5571								this._justChanged = false;
5572							}
5573
5574							// Allow triggered, simulated change events (#11500)
5575							jQuery.event.simulate("change", this, event);
5576						});
5577					}
5578					return false;
5579				}
5580
5581				// Delegated event; lazy-add a change handler on descendant inputs
5582				jQuery.event.add(this, "beforeactivate._change", function (e) {
5583					var elem = e.target;
5584
5585					if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "change")) {
5586						jQuery.event.add(elem, "change._change", function (event) {
5587							if (this.parentNode && !event.isSimulated && !event.isTrigger) {
5588								jQuery.event.simulate("change", this.parentNode, event);
5589							}
5590						});
5591						jQuery._data(elem, "change", true);
5592					}
5593				});
5594			},
5595
5596			handle: function (event) {
5597				var elem = event.target;
5598
5599				// Swallow native change events from checkbox/radio, we already triggered them above
5600				if (this !== elem || event.isSimulated || event.isTrigger || elem.type !== "radio" && elem.type !== "checkbox") {
5601
5602					return event.handleObj.handler.apply(this, arguments);
5603				}
5604			},
5605
5606			teardown: function () {
5607				jQuery.event.remove(this, "._change");
5608
5609				return !rformElems.test(this.nodeName);
5610			}
5611		};
5612	}
5613
5614	// Support: Firefox
5615	// Firefox doesn't have focus(in | out) events
vendor: 1,180 bytes, lines 5616-5647
5616	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5617	//
5618	// Support: Chrome, Safari
5619	// focus(in | out) events fire after focus & blur events,
5620	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5621	// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
5622	if (!support.focusin) {
5623		jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {
5624
5625			// Attach a single capturing handler on the document while someone wants focusin/focusout
5626			var handler = function (event) {
5627				jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
5628			};
5629
5630			jQuery.event.special[fix] = {
5631				setup: function () {
5632					var doc = this.ownerDocument || this,
5633					    attaches = jQuery._data(doc, fix);
5634
5635					if (!attaches) {
5636						doc.addEventListener(orig, handler, true);
5637					}
5638					jQuery._data(doc, fix, (attaches || 0) + 1);
5639				},
5640				teardown: function () {
5641					var doc = this.ownerDocument || this,
5642					    attaches = jQuery._data(doc, fix) - 1;
5643
5644					if (!attaches) {
5645						doc.removeEventListener(orig, handler, true);
5646						jQuery._removeData(doc, fix);
5647					} else {
vendor: 11,646 bytes, lines 5648-6057
5648						jQuery._data(doc, fix, attaches);
5649					}
5650				}
5651			};
5652		});
5653	}
5654
5655	jQuery.fn.extend({
5656
5657		on: function (types, selector, data, fn) {
5658			return on(this, types, selector, data, fn);
5659		},
5660		one: function (types, selector, data, fn) {
5661			return on(this, types, selector, data, fn, 1);
5662		},
5663		off: function (types, selector, fn) {
5664			var handleObj, type;
5665			if (types && types.preventDefault && types.handleObj) {
5666
5667				// ( event )  dispatched jQuery.Event
5668				handleObj = types.handleObj;
5669				jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
5670				return this;
5671			}
5672			if (typeof types === "object") {
5673
5674				// ( types-object [, selector] )
5675				for (type in types) {
5676					this.off(type, selector, types[type]);
5677				}
5678				return this;
5679			}
5680			if (selector === false || typeof selector === "function") {
5681
5682				// ( types [, fn] )
5683				fn = selector;
5684				selector = undefined;
5685			}
5686			if (fn === false) {
5687				fn = returnFalse;
5688			}
5689			return this.each(function () {
5690				jQuery.event.remove(this, types, fn, selector);
5691			});
5692		},
5693
5694		trigger: function (type, data) {
5695			return this.each(function () {
5696				jQuery.event.trigger(type, data, this);
5697			});
5698		},
5699		triggerHandler: function (type, data) {
5700			var elem = this[0];
5701			if (elem) {
5702				return jQuery.event.trigger(type, data, elem, true);
5703			}
5704		}
5705	});
5706
5707	var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5708	    rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5709	    rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
5710
5711
5712	// Support: IE 10-11, Edge 10240+
5713	// In IE/Edge using regex groups here causes severe slowdowns.
5714	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5715	rnoInnerhtml = /<script|<style|<link/i,
5716
5717
5718	// checked="checked" or checked
5719	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5720	    rscriptTypeMasked = /^true\/(.*)/,
5721	    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5722	    safeFragment = createSafeFragment(document),
5723	    fragmentDiv = safeFragment.appendChild(document.createElement("div"));
5724
5725	// Support: IE<8
5726	// Manipulating tables requires a tbody
5727	function manipulationTarget(elem, content) {
5728		return jQuery.nodeName(elem, "table") && jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody")) : elem;
5729	}
5730
5731	// Replace/restore the type attribute of script elements for safe DOM manipulation
5732	function disableScript(elem) {
5733		elem.type = (jQuery.find.attr(elem, "type") !== null) + "/" + elem.type;
5734		return elem;
5735	}
5736	function restoreScript(elem) {
5737		var match = rscriptTypeMasked.exec(elem.type);
5738		if (match) {
5739			elem.type = match[1];
5740		} else {
5741			elem.removeAttribute("type");
5742		}
5743		return elem;
5744	}
5745
5746	function cloneCopyEvent(src, dest) {
5747		if (dest.nodeType !== 1 || !jQuery.hasData(src)) {
5748			return;
5749		}
5750
5751		var type,
5752		    i,
5753		    l,
5754		    oldData = jQuery._data(src),
5755		    curData = jQuery._data(dest, oldData),
5756		    events = oldData.events;
5757
5758		if (events) {
5759			delete curData.handle;
5760			curData.events = {};
5761
5762			for (type in events) {
5763				for (i = 0, l = events[type].length; i < l; i++) {
5764					jQuery.event.add(dest, type, events[type][i]);
5765				}
5766			}
5767		}
5768
5769		// make the cloned public data object a copy from the original
5770		if (curData.data) {
5771			curData.data = jQuery.extend({}, curData.data);
5772		}
5773	}
5774
5775	function fixCloneNodeIssues(src, dest) {
5776		var nodeName, e, data;
5777
5778		// We do not need to do anything for non-Elements
5779		if (dest.nodeType !== 1) {
5780			return;
5781		}
5782
5783		nodeName = dest.nodeName.toLowerCase();
5784
5785		// IE6-8 copies events bound via attachEvent when using cloneNode.
5786		if (!support.noCloneEvent && dest[jQuery.expando]) {
5787			data = jQuery._data(dest);
5788
5789			for (e in data.events) {
5790				jQuery.removeEvent(dest, e, data.handle);
5791			}
5792
5793			// Event data gets referenced instead of copied if the expando gets copied too
5794			dest.removeAttribute(jQuery.expando);
5795		}
5796
5797		// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
5798		if (nodeName === "script" && dest.text !== src.text) {
5799			disableScript(dest).text = src.text;
5800			restoreScript(dest);
5801
5802			// IE6-10 improperly clones children of object elements using classid.
5803			// IE10 throws NoModificationAllowedError if parent is null, #12132.
5804		} else if (nodeName === "object") {
5805			if (dest.parentNode) {
5806				dest.outerHTML = src.outerHTML;
5807			}
5808
5809			// This path appears unavoidable for IE9. When cloning an object
5810			// element in IE9, the outerHTML strategy above is not sufficient.
5811			// If the src has innerHTML and the destination does not,
5812			// copy the src.innerHTML into the dest.innerHTML. #10324
5813			if (support.html5Clone && src.innerHTML && !jQuery.trim(dest.innerHTML)) {
5814				dest.innerHTML = src.innerHTML;
5815			}
5816		} else if (nodeName === "input" && rcheckableType.test(src.type)) {
5817
5818			// IE6-8 fails to persist the checked state of a cloned checkbox
5819			// or radio button. Worse, IE6-7 fail to give the cloned element
5820			// a checked appearance if the defaultChecked value isn't also set
5821
5822			dest.defaultChecked = dest.checked = src.checked;
5823
5824			// IE6-7 get confused and end up setting the value of a cloned
5825			// checkbox/radio button to an empty string instead of "on"
5826			if (dest.value !== src.value) {
5827				dest.value = src.value;
5828			}
5829
5830			// IE6-8 fails to return the selected option to the default selected
5831			// state when cloning options
5832		} else if (nodeName === "option") {
5833			dest.defaultSelected = dest.selected = src.defaultSelected;
5834
5835			// IE6-8 fails to set the defaultValue to the correct value when
5836			// cloning other types of input fields
5837		} else if (nodeName === "input" || nodeName === "textarea") {
5838			dest.defaultValue = src.defaultValue;
5839		}
5840	}
5841
5842	function domManip(collection, args, callback, ignored) {
5843
5844		// Flatten any nested arrays
5845		args = concat.apply([], args);
5846
5847		var first,
5848		    node,
5849		    hasScripts,
5850		    scripts,
5851		    doc,
5852		    fragment,
5853		    i = 0,
5854		    l = collection.length,
5855		    iNoClone = l - 1,
5856		    value = args[0],
5857		    isFunction = jQuery.isFunction(value);
5858
5859		// We can't cloneNode fragments that contain checked, in WebKit
5860		if (isFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
5861			return collection.each(function (index) {
5862				var self = collection.eq(index);
5863				if (isFunction) {
5864					args[0] = value.call(this, index, self.html());
5865				}
5866				domManip(self, args, callback, ignored);
5867			});
5868		}
5869
5870		if (l) {
5871			fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
5872			first = fragment.firstChild;
5873
5874			if (fragment.childNodes.length === 1) {
5875				fragment = first;
5876			}
5877
5878			// Require either new content or an interest in ignored elements to invoke the callback
5879			if (first || ignored) {
5880				scripts = jQuery.map(getAll(fragment, "script"), disableScript);
5881				hasScripts = scripts.length;
5882
5883				// Use the original fragment for the last item
5884				// instead of the first because it can end up
5885				// being emptied incorrectly in certain situations (#8070).
5886				for (; i < l; i++) {
5887					node = fragment;
5888
5889					if (i !== iNoClone) {
5890						node = jQuery.clone(node, true, true);
5891
5892						// Keep references to cloned scripts for later restoration
5893						if (hasScripts) {
5894
5895							// Support: Android<4.1, PhantomJS<2
5896							// push.apply(_, arraylike) throws on ancient WebKit
5897							jQuery.merge(scripts, getAll(node, "script"));
5898						}
5899					}
5900
5901					callback.call(collection[i], node, i);
5902				}
5903
5904				if (hasScripts) {
5905					doc = scripts[scripts.length - 1].ownerDocument;
5906
5907					// Reenable scripts
5908					jQuery.map(scripts, restoreScript);
5909
5910					// Evaluate executable scripts on first document insertion
5911					for (i = 0; i < hasScripts; i++) {
5912						node = scripts[i];
5913						if (rscriptType.test(node.type || "") && !jQuery._data(node, "globalEval") && jQuery.contains(doc, node)) {
5914
5915							if (node.src) {
5916
5917								// Optional AJAX dependency, but won't run scripts if not present
5918								if (jQuery._evalUrl) {
5919									jQuery._evalUrl(node.src);
5920								}
5921							} else {
5922								jQuery.globalEval((node.text || node.textContent || node.innerHTML || "").replace(rcleanScript, ""));
5923							}
5924						}
5925					}
5926				}
5927
5928				// Fix #11809: Avoid leaking memory
5929				fragment = first = null;
5930			}
5931		}
5932
5933		return collection;
5934	}
5935
5936	function remove(elem, selector, keepData) {
5937		var node,
5938		    elems = selector ? jQuery.filter(selector, elem) : elem,
5939		    i = 0;
5940
5941		for (; (node = elems[i]) != null; i++) {
5942
5943			if (!keepData && node.nodeType === 1) {
5944				jQuery.cleanData(getAll(node));
5945			}
5946
5947			if (node.parentNode) {
5948				if (keepData && jQuery.contains(node.ownerDocument, node)) {
5949					setGlobalEval(getAll(node, "script"));
5950				}
5951				node.parentNode.removeChild(node);
5952			}
5953		}
5954
5955		return elem;
5956	}
5957
5958	jQuery.extend({
5959		htmlPrefilter: function (html) {
5960			return html.replace(rxhtmlTag, "<$1></$2>");
5961		},
5962
5963		clone: function (elem, dataAndEvents, deepDataAndEvents) {
5964			var destElements,
5965			    node,
5966			    clone,
5967			    i,
5968			    srcElements,
5969			    inPage = jQuery.contains(elem.ownerDocument, elem);
5970
5971			if (support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) {
5972
5973				clone = elem.cloneNode(true);
5974
5975				// IE<=8 does not properly clone detached, unknown element nodes
5976			} else {
5977				fragmentDiv.innerHTML = elem.outerHTML;
5978				fragmentDiv.removeChild(clone = fragmentDiv.firstChild);
5979			}
5980
5981			if ((!support.noCloneEvent || !support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
5982
5983				// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
5984				destElements = getAll(clone);
5985				srcElements = getAll(elem);
5986
5987				// Fix all IE cloning issues
5988				for (i = 0; (node = srcElements[i]) != null; ++i) {
5989
5990					// Ensure that the destination node is not null; Fixes #9587
5991					if (destElements[i]) {
5992						fixCloneNodeIssues(node, destElements[i]);
5993					}
5994				}
5995			}
5996
5997			// Copy the events from the original to the clone
5998			if (dataAndEvents) {
5999				if (deepDataAndEvents) {
6000					srcElements = srcElements || getAll(elem);
6001					destElements = destElements || getAll(clone);
6002
6003					for (i = 0; (node = srcElements[i]) != null; i++) {
6004						cloneCopyEvent(node, destElements[i]);
6005					}
6006				} else {
6007					cloneCopyEvent(elem, clone);
6008				}
6009			}
6010
6011			// Preserve script evaluation history
6012			destElements = getAll(clone, "script");
6013			if (destElements.length > 0) {
6014				setGlobalEval(destElements, !inPage && getAll(elem, "script"));
6015			}
6016
6017			destElements = srcElements = node = null;
6018
6019			// Return the cloned set
6020			return clone;
6021		},
6022
6023		cleanData: function (elems, /* internal */forceAcceptData) {
6024			var elem,
6025			    type,
6026			    id,
6027			    data,
6028			    i = 0,
6029			    internalKey = jQuery.expando,
6030			    cache = jQuery.cache,
6031			    attributes = support.attributes,
6032			    special = jQuery.event.special;
6033
6034			for (; (elem = elems[i]) != null; i++) {
6035				if (forceAcceptData || acceptData(elem)) {
6036
6037					id = elem[internalKey];
6038					data = id && cache[id];
6039
6040					if (data) {
6041						if (data.events) {
6042							for (type in data.events) {
6043								if (special[type]) {
6044									jQuery.event.remove(elem, type);
6045
6046									// This is a shortcut to avoid jQuery.event.remove's overhead
6047								} else {
6048									jQuery.removeEvent(elem, type, data.handle);
6049								}
6050							}
6051						}
6052
6053						// Remove cache only if it was not already removed by jQuery.event.remove
6054						if (cache[id]) {
6055
6056							delete cache[id];
6057
6058							// Support: IE<9
6059							// IE does not allow us to delete expando properties from nodes
6060							// IE creates expando attributes along with the property
6061							// IE does not have a removeAttribute function on Document nodes
6062							if (!attributes && typeof elem.removeAttribute !== "undefined") {
6063								elem.removeAttribute(internalKey);
6064
6065								// Webkit & Blink performance suffers when deleting properties
6066								// from DOM nodes, so set to undefined instead
6067								// https://code.google.com/p/chromium/issues/detail?id=378607
6068							} else {
6069								elem[internalKey] = undefined;
6070							}
6071
6072							deletedIds.push(id);
6073						}
6074					}
6075				}
6076			}
6077		}
6078	});
6079
6080	jQuery.fn.extend({
6081
6082		// Keep domManip exposed until 3.0 (gh-2225)
6083		domManip: domManip,
6084
6085		detach: function (selector) {
6086			return remove(this, selector, true);
6087		},
6088
6089		remove: function (selector) {
6090			return remove(this, selector);
6091		},
6092
6093		text: function (value) {
6094			return access(this, function (value) {
6095				return value === undefined ? jQuery.text(this) : this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value));
6096			}, null, value, arguments.length);
6097		},
6098
6099		append: function () {
6100			return domManip(this, arguments, function (elem) {
6101				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
6102					var target = manipulationTarget(this, elem);
6103					target.appendChild(elem);
6104				}
6105			});
6106		},
6107
6108		prepend: function () {
6109			return domManip(this, arguments, function (elem) {
6110				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
6111					var target = manipulationTarget(this, elem);
6112					target.insertBefore(elem, target.firstChild);
6113				}
6114			});
6115		},
6116
6117		before: function () {
6118			return domManip(this, arguments, function (elem) {
6119				if (this.parentNode) {
6120					this.parentNode.insertBefore(elem, this);
6121				}
6122			});
6123		},
6124
6125		after: function () {
6126			return domManip(this, arguments, function (elem) {
6127				if (this.parentNode) {
6128					this.parentNode.insertBefore(elem, this.nextSibling);
6129				}
6130			});
6131		},
6132
6133		empty: function () {
6134			var elem,
6135			    i = 0;
6136
6137			for (; (elem = this[i]) != null; i++) {
6138
6139				// Remove element nodes and prevent memory leaks
6140				if (elem.nodeType === 1) {
6141					jQuery.cleanData(getAll(elem, false));
6142				}
6143
6144				// Remove any remaining nodes
6145				while (elem.firstChild) {
6146					elem.removeChild(elem.firstChild);
6147				}
6148
6149				// If this is a select, ensure that it displays empty (#12336)
6150				// Support: IE<9
6151				if (elem.options && jQuery.nodeName(elem, "select")) {
6152					elem.options.length = 0;
6153				}
6154			}
6155
6156			return this;
6157		},
6158
6159		clone: function (dataAndEvents, deepDataAndEvents) {
6160			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6161			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6162
6163			return this.map(function () {
6164				return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
6165			});
6166		},
6167
6168		html: function (value) {
6169			return access(this, function (value) {
6170				var elem = this[0] || {},
6171				    i = 0,
6172				    l = this.length;
6173
6174				if (value === undefined) {
6175					return elem.nodeType === 1 ? elem.innerHTML.replace(rinlinejQuery, "") : undefined;
6176				}
6177
6178				// See if we can take a shortcut and just use innerHTML
6179				if (typeof value === "string" && !rnoInnerhtml.test(value) && (support.htmlSerialize || !rnoshimcache.test(value)) && (support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
6180
6181					value = jQuery.htmlPrefilter(value);
6182
6183					try {
6184						for (; i < l; i++) {
6185
6186							// Remove element nodes and prevent memory leaks
6187							elem = this[i] || {};
6188							if (elem.nodeType === 1) {
6189								jQuery.cleanData(getAll(elem, false));
6190								elem.innerHTML = value;
6191							}
6192						}
6193
6194						elem = 0;
6195
6196						// If using innerHTML throws an exception, use the fallback method
6197					} catch (e) {}
6198				}
6199
6200				if (elem) {
6201					this.empty().append(value);
6202				}
6203			}, null, value, arguments.length);
6204		},
6205
6206		replaceWith: function () {
6207			var ignored = [];
6208
6209			// Make the changes, replacing each non-ignored context element with the new content
6210			return domManip(this, arguments, function (elem) {
6211				var parent = this.parentNode;
6212
6213				if (jQuery.inArray(this, ignored) < 0) {
6214					jQuery.cleanData(getAll(this));
6215					if (parent) {
6216						parent.replaceChild(elem, this);
6217					}
6218				}
6219
6220				// Force callback invocation
6221			}, ignored);
6222		}
6223	});
6224
6225	jQuery.each({
6226		appendTo: "append",
vendor: 1,203 bytes, lines 6227-6274
6227		prependTo: "prepend",
6228		insertBefore: "before",
6229		insertAfter: "after",
6230		replaceAll: "replaceWith"
6231	}, function (name, original) {
6232		jQuery.fn[name] = function (selector) {
6233			var elems,
6234			    i = 0,
6235			    ret = [],
6236			    insert = jQuery(selector),
6237			    last = insert.length - 1;
6238
6239			for (; i <= last; i++) {
6240				elems = i === last ? this : this.clone(true);
6241				jQuery(insert[i])[original](elems);
6242
6243				// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6244				push.apply(ret, elems.get());
6245			}
6246
6247			return this.pushStack(ret);
6248		};
6249	});
6250
6251	var iframe,
6252	    elemdisplay = {
6253
6254		// Support: Firefox
6255		// We have to pre-define these values for FF (#10227)
6256		HTML: "block",
6257		BODY: "block"
6258	};
6259
6260	/**
6261  * Retrieve the actual display of a element
6262  * @param {String} name nodeName of the element
6263  * @param {Object} doc Document object
6264  */
6265
6266	// Called only from within defaultDisplay
6267	function actualDisplay(name, doc) {
6268		var elem = jQuery(doc.createElement(name)).appendTo(doc.body),
6269		    display = jQuery.css(elem[0], "display");
6270
6271		// We don't have any data stored on the element,
6272		// so use "detach" method as fast way to get rid of the element
6273		elem.detach();
6274
6275		return display;
6276	}
6277
6278	/**
6279  * Try to determine the default display value of an element
6280  * @param {String} nodeName
6281  */
6282	function defaultDisplay(nodeName) {
6283		var doc = document,
6284		    display = elemdisplay[nodeName];
6285
6286		if (!display) {
6287			display = actualDisplay(nodeName, doc);
6288
6289			// If the simple way fails, read from inside an iframe
6290			if (display === "none" || !display) {
6291
6292				// Use the already-created iframe if possible
6293				iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);
6294
6295				// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
6296				doc = (iframe[0].contentWindow || iframe[0].contentDocument).document;
6297
6298				// Support: IE
6299				doc.write();
6300				doc.close();
6301
6302				display = actualDisplay(nodeName, doc);
6303				iframe.detach();
6304			}
6305
6306			// Store the correct default display
6307			elemdisplay[nodeName] = display;
6308		}
6309
6310		return display;
6311	}
6312	var rmargin = /^margin/;
6313
6314	var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
6315
6316	var swap = function (elem, options, callback, args) {
6317		var ret,
6318		    name,
6319		    old = {};
6320
6321		// Remember the old values, and insert the new ones
6322		for (name in options) {
6323			old[name] = elem.style[name];
6324			elem.style[name] = options[name];
6325		}
6326
6327		ret = callback.apply(elem, args || []);
6328
6329		// Revert the old values
6330		for (name in options) {
6331			elem.style[name] = old[name];
6332		}
6333
6334		return ret;
6335	};
6336
6337	var documentElement = document.documentElement;
6338
6339	(function () {
6340		var pixelPositionVal,
6341		    pixelMarginRightVal,
6342		    boxSizingReliableVal,
6343		    reliableHiddenOffsetsVal,
6344		    reliableMarginRightVal,
6345		    reliableMarginLeftVal,
6346		    container = document.createElement("div"),
6347		    div = document.createElement("div");
6348
6349		// Finish early in limited (non-browser) environments
6350		if (!div.style) {
6351			return;
6352		}
6353
6354		div.style.cssText = "float:left;opacity:.5";
6355
6356		// Support: IE<9
6357		// Make sure that element opacity exists (as opposed to filter)
6358		support.opacity = div.style.opacity === "0.5";
6359
6360		// Verify style float existence
6361		// (IE uses styleFloat instead of cssFloat)
6362		support.cssFloat = !!div.style.cssFloat;
6363
6364		div.style.backgroundClip = "content-box";
6365		div.cloneNode(true).style.backgroundClip = "";
6366		support.clearCloneStyle = div.style.backgroundClip === "content-box";
6367
6368		container = document.createElement("div");
6369		container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute";
6370		div.innerHTML = "";
6371		container.appendChild(div);
6372
6373		// Support: Firefox<29, Android 2.3
6374		// Vendor-prefix box-sizing
6375		support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" || div.style.WebkitBoxSizing === "";
6376
6377		jQuery.extend(support, {
6378			reliableHiddenOffsets: function () {
6379				if (pixelPositionVal == null) {
6380					computeStyleTests();
6381				}
6382				return reliableHiddenOffsetsVal;
6383			},
6384
6385			boxSizingReliable: function () {
6386
6387				// We're checking for pixelPositionVal here instead of boxSizingReliableVal
6388				// since that compresses better and they're computed together anyway.
6389				if (pixelPositionVal == null) {
6390					computeStyleTests();
6391				}
6392				return boxSizingReliableVal;
6393			},
6394
6395			pixelMarginRight: function () {
6396
6397				// Support: Android 4.0-4.3
6398				if (pixelPositionVal == null) {
6399					computeStyleTests();
6400				}
6401				return pixelMarginRightVal;
6402			},
6403
6404			pixelPosition: function () {
6405				if (pixelPositionVal == null) {
6406					computeStyleTests();
6407				}
6408				return pixelPositionVal;
6409			},
6410
6411			reliableMarginRight: function () {
6412
6413				// Support: Android 2.3
6414				if (pixelPositionVal == null) {
6415					computeStyleTests();
6416				}
6417				return reliableMarginRightVal;
6418			},
6419
6420			reliableMarginLeft: function () {
6421
6422				// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
6423				if (pixelPositionVal == null) {
6424					computeStyleTests();
6425				}
6426				return reliableMarginLeftVal;
6427			}
6428		});
6429
6430		function computeStyleTests() {
6431			var contents,
6432			    divStyle,
6433			    documentElement = document.documentElement;
6434
6435			// Setup
6436			documentElement.appendChild(container);
6437
6438			div.style.cssText =
6439
6440			// Support: Android 2.3
6441			// Vendor-prefix box-sizing
6442			"-webkit-box-sizing:border-box;box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%";
6443
6444			// Support: IE<9
6445			// Assume reasonable values in the absence of getComputedStyle
6446			pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
6447			pixelMarginRightVal = reliableMarginRightVal = true;
6448
6449			// Check for getComputedStyle so that this code is not run in IE<9.
6450			if (window.getComputedStyle) {
6451				divStyle = window.getComputedStyle(div);
6452				pixelPositionVal = (divStyle || {}).top !== "1%";
6453				reliableMarginLeftVal = (divStyle || {}).marginLeft === "2px";
6454				boxSizingReliableVal = (divStyle || { width: "4px" }).width === "4px";
6455
6456				// Support: Android 4.0 - 4.3 only
6457				// Some styles come back with percentage values, even though they shouldn't
6458				div.style.marginRight = "50%";
6459				pixelMarginRightVal = (divStyle || { marginRight: "4px" }).marginRight === "4px";
6460
6461				// Support: Android 2.3 only
6462				// Div with explicit width and no margin-right incorrectly
6463				// gets computed margin-right based on width of container (#3333)
6464				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6465				contents = div.appendChild(document.createElement("div"));
6466
6467				// Reset CSS: box-sizing; display; margin; border; padding
6468				contents.style.cssText = div.style.cssText =
6469
6470				// Support: Android 2.3
6471				// Vendor-prefix box-sizing
6472				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
6473				contents.style.marginRight = contents.style.width = "0";
6474				div.style.width = "1px";
6475
6476				reliableMarginRightVal = !parseFloat((window.getComputedStyle(contents) || {}).marginRight);
6477
6478				div.removeChild(contents);
6479			}
6480
6481			// Support: IE6-8
6482			// First check that getClientRects works as expected
6483			// Check if table cells still have offsetWidth/Height when they are set
6484			// to display:none and there are still other visible table cells in a
6485			// table row; if so, offsetWidth/Height are not reliable for use when
6486			// determining if an element has been hidden directly using
6487			// display:none (it is still safe to use offsets if a parent element is
6488			// hidden; don safety goggles and see bug #4512 for more information).
6489			div.style.display = "none";
6490			reliableHiddenOffsetsVal = div.getClientRects().length === 0;
6491			if (reliableHiddenOffsetsVal) {
6492				div.style.display = "";
6493				div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
6494				div.childNodes[0].style.borderCollapse = "separate";
6495				contents = div.getElementsByTagName("td");
6496				contents[0].style.cssText = "margin:0;border:0;padding:0;display:none";
6497				reliableHiddenOffsetsVal = contents[0].offsetHeight === 0;
6498				if (reliableHiddenOffsetsVal) {
6499					contents[0].style.display = "";
6500					contents[1].style.display = "none";
6501					reliableHiddenOffsetsVal = contents[0].offsetHeight === 0;
6502				}
6503			}
6504
6505			// Teardown
6506			documentElement.removeChild(container);
6507		}
6508	})();
6509
6510	var getStyles,
6511	    curCSS,
6512	    rposition = /^(top|right|bottom|left)$/;
6513
6514	if (window.getComputedStyle) {
6515		getStyles = function (elem) {
6516
6517			// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
6518			// IE throws on elements created in popups
6519			// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6520			var view = elem.ownerDocument.defaultView;
6521
6522			if (!view || !view.opener) {
6523				view = window;
6524			}
6525
6526			return view.getComputedStyle(elem);
6527		};
6528
6529		curCSS = function (elem, name, computed) {
6530			var width,
6531			    minWidth,
6532			    maxWidth,
6533			    ret,
6534			    style = elem.style;
6535
6536			computed = computed || getStyles(elem);
6537
6538			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
6539			ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined;
6540
6541			// Support: Opera 12.1x only
6542			// Fall back to style even without computed
6543			// computed is undefined for elems on document fragments
6544			if ((ret === "" || ret === undefined) && !jQuery.contains(elem.ownerDocument, elem)) {
6545				ret = jQuery.style(elem, name);
6546			}
6547
6548			if (computed) {
6549
6550				// A tribute to the "awesome hack by Dean Edwards"
6551				// Chrome < 17 and Safari 5.0 uses "computed value"
6552				// instead of "used value" for margin-right
6553				// Safari 5.1.7 (at least) returns percentage for a larger set of values,
6554				// but width seems to be reliably pixels
6555				// this is against the CSSOM draft spec:
6556				// http://dev.w3.org/csswg/cssom/#resolved-values
6557				if (!support.pixelMarginRight() && rnumnonpx.test(ret) && rmargin.test(name)) {
6558
6559					// Remember the original values
6560					width = style.width;
6561					minWidth = style.minWidth;
6562					maxWidth = style.maxWidth;
6563
6564					// Put in the new values to get a computed value out
6565					style.minWidth = style.maxWidth = style.width = ret;
6566					ret = computed.width;
6567
6568					// Revert the changed values
6569					style.width = width;
6570					style.minWidth = minWidth;
6571					style.maxWidth = maxWidth;
6572				}
6573			}
6574
vendor: 4,252 bytes, lines 6575-6727
6575			// Support: IE
6576			// IE returns zIndex value as an integer.
6577			return ret === undefined ? ret : ret + "";
6578		};
6579	} else if (documentElement.currentStyle) {
6580		getStyles = function (elem) {
6581			return elem.currentStyle;
6582		};
6583
6584		curCSS = function (elem, name, computed) {
6585			var left,
6586			    rs,
6587			    rsLeft,
6588			    ret,
6589			    style = elem.style;
6590
6591			computed = computed || getStyles(elem);
6592			ret = computed ? computed[name] : undefined;
6593
6594			// Avoid setting ret to empty string here
6595			// so we don't default to auto
6596			if (ret == null && style && style[name]) {
6597				ret = style[name];
6598			}
6599
6600			// From the awesome hack by Dean Edwards
6601			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6602
6603			// If we're not dealing with a regular pixel number
6604			// but a number that has a weird ending, we need to convert it to pixels
6605			// but not position css attributes, as those are
6606			// proportional to the parent element instead
6607			// and we can't measure the parent instead because it
6608			// might trigger a "stacking dolls" problem
6609			if (rnumnonpx.test(ret) && !rposition.test(name)) {
6610
6611				// Remember the original values
6612				left = style.left;
6613				rs = elem.runtimeStyle;
6614				rsLeft = rs && rs.left;
6615
6616				// Put in the new values to get a computed value out
6617				if (rsLeft) {
6618					rs.left = elem.currentStyle.left;
6619				}
6620				style.left = name === "fontSize" ? "1em" : ret;
6621				ret = style.pixelLeft + "px";
6622
6623				// Revert the changed values
6624				style.left = left;
6625				if (rsLeft) {
6626					rs.left = rsLeft;
6627				}
6628			}
6629
6630			// Support: IE
6631			// IE returns zIndex value as an integer.
6632			return ret === undefined ? ret : ret + "" || "auto";
6633		};
6634	}
6635
6636	function addGetHookIf(conditionFn, hookFn) {
6637
6638		// Define the hook, we'll check on the first run if it's really needed.
6639		return {
6640			get: function () {
6641				if (conditionFn()) {
6642
6643					// Hook not needed (or it's not possible to use it due
6644					// to missing dependency), remove it.
6645					delete this.get;
6646					return;
6647				}
6648
6649				// Hook needed; redefine it so that the support test is not executed again.
6650				return (this.get = hookFn).apply(this, arguments);
6651			}
6652		};
6653	}
6654
6655	var ralpha = /alpha\([^)]*\)/i,
6656	    ropacity = /opacity\s*=\s*([^)]*)/i,
6657
6658
6659	// swappable if display is none or starts with table except
6660	// "table", "table-cell", or "table-caption"
6661	// see here for display values:
6662	// https://developer.mozilla.org/en-US/docs/CSS/display
6663	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6664	    rnumsplit = new RegExp("^(" + pnum + ")(.*)$", "i"),
6665	    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6666	    cssNormalTransform = {
6667		letterSpacing: "0",
6668		fontWeight: "400"
6669	},
6670	    cssPrefixes = ["Webkit", "O", "Moz", "ms"],
6671	    emptyStyle = document.createElement("div").style;
6672
6673	// return a css property mapped to a potentially vendor prefixed property
6674	function vendorPropName(name) {
6675
6676		// shortcut for names that are not vendor prefixed
6677		if (name in emptyStyle) {
6678			return name;
6679		}
6680
6681		// check for vendor prefixed names
6682		var capName = name.charAt(0).toUpperCase() + name.slice(1),
6683		    i = cssPrefixes.length;
6684
6685		while (i--) {
6686			name = cssPrefixes[i] + capName;
6687			if (name in emptyStyle) {
6688				return name;
6689			}
6690		}
6691	}
6692
6693	function showHide(elements, show) {
6694		var display,
6695		    elem,
6696		    hidden,
6697		    values = [],
6698		    index = 0,
6699		    length = elements.length;
6700
6701		for (; index < length; index++) {
6702			elem = elements[index];
6703			if (!elem.style) {
6704				continue;
6705			}
6706
6707			values[index] = jQuery._data(elem, "olddisplay");
6708			display = elem.style.display;
6709			if (show) {
6710
6711				// Reset the inline display of this element to learn if it is
6712				// being hidden by cascaded rules or not
6713				if (!values[index] && display === "none") {
6714					elem.style.display = "";
6715				}
6716
6717				// Set elements which have been overridden with display: none
6718				// in a stylesheet to whatever the default browser style is
6719				// for such an element
6720				if (elem.style.display === "" && isHidden(elem)) {
6721					values[index] = jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
6722				}
6723			} else {
6724				hidden = isHidden(elem);
6725
6726				if (display && display !== "none" || !hidden) {
6727					jQuery._data(elem, "olddisplay", hidden ? display : jQuery.css(elem, "dis
vendor: 6,095 bytes, lines 6727-6928
6727play"));
6728				}
6729			}
6730		}
6731
6732		// Set the display of most of the elements in a second loop
6733		// to avoid the constant reflow
6734		for (index = 0; index < length; index++) {
6735			elem = elements[index];
6736			if (!elem.style) {
6737				continue;
6738			}
6739			if (!show || elem.style.display === "none" || elem.style.display === "") {
6740				elem.style.display = show ? values[index] || "" : "none";
6741			}
6742		}
6743
6744		return elements;
6745	}
6746
6747	function setPositiveNumber(elem, value, subtract) {
6748		var matches = rnumsplit.exec(value);
6749		return matches ?
6750
6751		// Guard against undefined "subtract", e.g., when used as in cssHooks
6752		Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : value;
6753	}
6754
6755	function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
6756		var i = extra === (isBorderBox ? "border" : "content") ?
6757
6758		// If we already have the right measurement, avoid augmentation
6759		4 :
6760
6761		// Otherwise initialize for horizontal or vertical properties
6762		name === "width" ? 1 : 0,
6763		    val = 0;
6764
6765		for (; i < 4; i += 2) {
6766
6767			// both box models exclude margin, so add it if we want it
6768			if (extra === "margin") {
6769				val += jQuery.css(elem, extra + cssExpand[i], true, styles);
6770			}
6771
6772			if (isBorderBox) {
6773
6774				// border-box includes padding, so remove it if we want content
6775				if (extra === "content") {
6776					val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
6777				}
6778
6779				// at this point, extra isn't border nor margin, so remove border
6780				if (extra !== "margin") {
6781					val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
6782				}
6783			} else {
6784
6785				// at this point, extra isn't content, so add padding
6786				val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
6787
6788				// at this point, extra isn't content nor padding, so add border
6789				if (extra !== "padding") {
6790					val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
6791				}
6792			}
6793		}
6794
6795		return val;
6796	}
6797
6798	function getWidthOrHeight(elem, name, extra) {
6799
6800		// Start with offset property, which is equivalent to the border-box value
6801		var valueIsBorderBox = true,
6802		    val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6803		    styles = getStyles(elem),
6804		    isBorderBox = support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box";
6805
6806		// some non-html elements return undefined for offsetWidth, so check for null/undefined
6807		// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
6808		// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
6809		if (val <= 0 || val == null) {
6810
6811			// Fall back to computed then uncomputed css if necessary
6812			val = curCSS(elem, name, styles);
6813			if (val < 0 || val == null) {
6814				val = elem.style[name];
6815			}
6816
6817			// Computed unit is not pixels. Stop here and return.
6818			if (rnumnonpx.test(val)) {
6819				return val;
6820			}
6821
6822			// we need the check for style in case a browser which returns unreliable values
6823			// for getComputedStyle silently falls back to the reliable elem.style
6824			valueIsBorderBox = isBorderBox && (support.boxSizingReliable() || val === elem.style[name]);
6825
6826			// Normalize "", auto, and prepare for extra
6827			val = parseFloat(val) || 0;
6828		}
6829
6830		// use the active box-sizing model to add/subtract irrelevant styles
6831		return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px";
6832	}
6833
6834	jQuery.extend({
6835
6836		// Add in style property hooks for overriding the default
6837		// behavior of getting and setting a style property
6838		cssHooks: {
6839			opacity: {
6840				get: function (elem, computed) {
6841					if (computed) {
6842
6843						// We should always get a number back from opacity
6844						var ret = curCSS(elem, "opacity");
6845						return ret === "" ? "1" : ret;
6846					}
6847				}
6848			}
6849		},
6850
6851		// Don't automatically add "px" to these possibly-unitless properties
6852		cssNumber: {
6853			"animationIterationCount": true,
6854			"columnCount": true,
6855			"fillOpacity": true,
6856			"flexGrow": true,
6857			"flexShrink": true,
6858			"fontWeight": true,
6859			"lineHeight": true,
6860			"opacity": true,
6861			"order": true,
6862			"orphans": true,
6863			"widows": true,
6864			"zIndex": true,
6865			"zoom": true
6866		},
6867
6868		// Add in properties whose names you wish to fix before
6869		// setting or getting the value
6870		cssProps: {
6871
6872			// normalize float css property
6873			"float": support.cssFloat ? "cssFloat" : "styleFloat"
6874		},
6875
6876		// Get and set the style property on a DOM Node
6877		style: function (elem, name, value, extra) {
6878
6879			// Don't set styles on text and comment nodes
6880			if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
6881				return;
6882			}
6883
6884			// Make sure that we're working with the right name
6885			var ret,
6886			    type,
6887			    hooks,
6888			    origName = jQuery.camelCase(name),
6889			    style = elem.style;
6890
6891			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);
6892
6893			// gets hook for the prefixed version
6894			// followed by the unprefixed version
6895			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
6896
6897			// Check if we're setting a value
6898			if (value !== undefined) {
6899				type = typeof value;
6900
6901				// Convert "+=" or "-=" to relative numbers (#7345)
6902				if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
6903					value = adjustCSS(elem, name, ret);
6904
6905					// Fixes bug #9237
6906					type = "number";
6907				}
6908
6909				// Make sure that null and NaN values aren't set. See: #7116
6910				if (value == null || value !== value) {
6911					return;
6912				}
6913
6914				// If a number was passed in, add the unit (except for certain CSS properties)
6915				if (type === "number") {
6916					value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
6917				}
6918
6919				// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6920				// but it would mean to define eight
6921				// (for every problematic property) identical functions
6922				if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
6923					style[name] = "inherit";
6924				}
6925
6926				// If a hook was provided, use that value, otherwise just set the specified value
6927				if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {
6928
vendor: 4,360 bytes, lines 6929-7055
6929					// Support: IE
6930					// Swallow errors from 'invalid' CSS values (#5509)
6931					try {
6932						style[name] = value;
6933					} catch (e) {}
6934				}
6935			} else {
6936
6937				// If a hook was provided get the non-computed value from there
6938				if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {
6939
6940					return ret;
6941				}
6942
6943				// Otherwise just get the value from the style object
6944				return style[name];
6945			}
6946		},
6947
6948		css: function (elem, name, extra, styles) {
6949			var num,
6950			    val,
6951			    hooks,
6952			    origName = jQuery.camelCase(name);
6953
6954			// Make sure that we're working with the right name
6955			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);
6956
6957			// gets hook for the prefixed version
6958			// followed by the unprefixed version
6959			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
6960
6961			// If a hook was provided get the computed value from there
6962			if (hooks && "get" in hooks) {
6963				val = hooks.get(elem, true, extra);
6964			}
6965
6966			// Otherwise, if a way to get the computed value exists, use that
6967			if (val === undefined) {
6968				val = curCSS(elem, name, styles);
6969			}
6970
6971			//convert "normal" to computed value
6972			if (val === "normal" && name in cssNormalTransform) {
6973				val = cssNormalTransform[name];
6974			}
6975
6976			// Return, converting to number if forced or a qualifier was provided and val looks numeric
6977			if (extra === "" || extra) {
6978				num = parseFloat(val);
6979				return extra === true || isFinite(num) ? num || 0 : val;
6980			}
6981			return val;
6982		}
6983	});
6984
6985	jQuery.each(["height", "width"], function (i, name) {
6986		jQuery.cssHooks[name] = {
6987			get: function (elem, computed, extra) {
6988				if (computed) {
6989
6990					// certain elements can have dimension info if we invisibly show them
6991					// however, it must have a current display style that would benefit from this
6992					return rdisplayswap.test(jQuery.css(elem, "display")) && elem.offsetWidth === 0 ? swap(elem, cssShow, function () {
6993						return getWidthOrHeight(elem, name, extra);
6994					}) : getWidthOrHeight(elem, name, extra);
6995				}
6996			},
6997
6998			set: function (elem, value, extra) {
6999				var styles = extra && getStyles(elem);
7000				return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box", styles) : 0);
7001			}
7002		};
7003	});
7004
7005	if (!support.opacity) {
7006		jQuery.cssHooks.opacity = {
7007			get: function (elem, computed) {
7008
7009				// IE uses filters for opacity
7010				return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? 0.01 * parseFloat(RegExp.$1) + "" : computed ? "1" : "";
7011			},
7012
7013			set: function (elem, value) {
7014				var style = elem.style,
7015				    currentStyle = elem.currentStyle,
7016				    opacity = jQuery.isNumeric(value) ? "alpha(opacity=" + value * 100 + ")" : "",
7017				    filter = currentStyle && currentStyle.filter || style.filter || "";
7018
7019				// IE has trouble with opacity if it does not have layout
7020				// Force it by setting the zoom level
7021				style.zoom = 1;
7022
7023				// if setting opacity to 1, and no other filters exist -
7024				// attempt to remove filter attribute #6652
7025				// if value === "", then remove inline opacity #12685
7026				if ((value >= 1 || value === "") && jQuery.trim(filter.replace(ralpha, "")) === "" && style.removeAttribute) {
7027
7028					// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7029					// if "filter:" is present at all, clearType is disabled, we want to avoid this
7030					// style.removeAttribute is IE Only, but so apparently is this code path...
7031					style.removeAttribute("filter");
7032
7033					// if there is no filter style applied in a css rule
7034					// or unset inline opacity, we are done
7035					if (value === "" || currentStyle && !currentStyle.filter) {
7036						return;
7037					}
7038				}
7039
7040				// otherwise, set new filter values
7041				style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity;
7042			}
7043		};
7044	}
7045
7046	jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function (elem, computed) {
7047		if (computed) {
7048			return swap(elem, { "display": "inline-block" }, curCSS, [elem, "marginRight"]);
7049		}
7050	});
7051
7052	jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
7053		if (computed) {
7054			return (parseFloat(curCSS(elem, "marginLeft")) || (
7055
vendor: 4,554 bytes, lines 7056-7219
7056			// Support: IE<=11+
7057			// Running getBoundingClientRect on a disconnected node in IE throws an error
7058			// Support: IE8 only
7059			// getClientRects() errors on disconnected elems
7060			jQuery.contains(elem.ownerDocument, elem) ? elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function () {
7061				return elem.getBoundingClientRect().left;
7062			}) : 0)) + "px";
7063		}
7064	});
7065
7066	// These hooks are used by animate to expand properties
7067	jQuery.each({
7068		margin: "",
7069		padding: "",
7070		border: "Width"
7071	}, function (prefix, suffix) {
7072		jQuery.cssHooks[prefix + suffix] = {
7073			expand: function (value) {
7074				var i = 0,
7075				    expanded = {},
7076
7077
7078				// assumes a single number if not a string
7079				parts = typeof value === "string" ? value.split(" ") : [value];
7080
7081				for (; i < 4; i++) {
7082					expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
7083				}
7084
7085				return expanded;
7086			}
7087		};
7088
7089		if (!rmargin.test(prefix)) {
7090			jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
7091		}
7092	});
7093
7094	jQuery.fn.extend({
7095		css: function (name, value) {
7096			return access(this, function (elem, name, value) {
7097				var styles,
7098				    len,
7099				    map = {},
7100				    i = 0;
7101
7102				if (jQuery.isArray(name)) {
7103					styles = getStyles(elem);
7104					len = name.length;
7105
7106					for (; i < len; i++) {
7107						map[name[i]] = jQuery.css(elem, name[i], false, styles);
7108					}
7109
7110					return map;
7111				}
7112
7113				return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
7114			}, name, value, arguments.length > 1);
7115		},
7116		show: function () {
7117			return showHide(this, true);
7118		},
7119		hide: function () {
7120			return showHide(this);
7121		},
7122		toggle: function (state) {
7123			if (typeof state === "boolean") {
7124				return state ? this.show() : this.hide();
7125			}
7126
7127			return this.each(function () {
7128				if (isHidden(this)) {
7129					jQuery(this).show();
7130				} else {
7131					jQuery(this).hide();
7132				}
7133			});
7134		}
7135	});
7136
7137	function Tween(elem, options, prop, end, easing) {
7138		return new Tween.prototype.init(elem, options, prop, end, easing);
7139	}
7140	jQuery.Tween = Tween;
7141
7142	Tween.prototype = {
7143		constructor: Tween,
7144		init: function (elem, options, prop, end, easing, unit) {
7145			this.elem = elem;
7146			this.prop = prop;
7147			this.easing = easing || jQuery.easing._default;
7148			this.options = options;
7149			this.start = this.now = this.cur();
7150			this.end = end;
7151			this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
7152		},
7153		cur: function () {
7154			var hooks = Tween.propHooks[this.prop];
7155
7156			return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
7157		},
7158		run: function (percent) {
7159			var eased,
7160			    hooks = Tween.propHooks[this.prop];
7161
7162			if (this.options.duration) {
7163				this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
7164			} else {
7165				this.pos = eased = percent;
7166			}
7167			this.now = (this.end - this.start) * eased + this.start;
7168
7169			if (this.options.step) {
7170				this.options.step.call(this.elem, this.now, this);
7171			}
7172
7173			if (hooks && hooks.set) {
7174				hooks.set(this);
7175			} else {
7176				Tween.propHooks._default.set(this);
7177			}
7178			return this;
7179		}
7180	};
7181
7182	Tween.prototype.init.prototype = Tween.prototype;
7183
7184	Tween.propHooks = {
7185		_default: {
7186			get: function (tween) {
7187				var result;
7188
7189				// Use a property on the element directly when it is not a DOM element,
7190				// or when there is no matching style property that exists.
7191				if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
7192					return tween.elem[tween.prop];
7193				}
7194
7195				// passing an empty string as a 3rd parameter to .css will automatically
7196				// attempt a parseFloat and fallback to a string if the parse fails
7197				// so, simple values such as "10px" are parsed to Float.
7198				// complex values such as "rotate(1rad)" are returned as is.
7199				result = jQuery.css(tween.elem, tween.prop, "");
7200
7201				// Empty strings, null, undefined and "auto" are converted to 0.
7202				return !result || result === "auto" ? 0 : result;
7203			},
7204			set: function (tween) {
7205
7206				// use step hook for back compat - use cssHook if its there - use .style if its
7207				// available and use plain properties where available
7208				if (jQuery.fx.step[tween.prop]) {
7209					jQuery.fx.step[tween.prop](tween);
7210				} else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
7211					jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
7212				} else {
7213					tween.elem[tween.prop] = tween.now;
7214				}
7215			}
7216		}
7217	};
7218
7219	// Support: IE <=9
vendor: 5,745 bytes, lines 7220-7439
7220	// Panic based approach to setting things on disconnected nodes
7221
7222	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7223		set: function (tween) {
7224			if (tween.elem.nodeType && tween.elem.parentNode) {
7225				tween.elem[tween.prop] = tween.now;
7226			}
7227		}
7228	};
7229
7230	jQuery.easing = {
7231		linear: function (p) {
7232			return p;
7233		},
7234		swing: function (p) {
7235			return 0.5 - Math.cos(p * Math.PI) / 2;
7236		},
7237		_default: "swing"
7238	};
7239
7240	jQuery.fx = Tween.prototype.init;
7241
7242	// Back Compat <1.8 extension point
7243	jQuery.fx.step = {};
7244
7245	var fxNow,
7246	    timerId,
7247	    rfxtypes = /^(?:toggle|show|hide)$/,
7248	    rrun = /queueHooks$/;
7249
7250	// Animations created synchronously will run synchronously
7251	function createFxNow() {
7252		window.setTimeout(function () {
7253			fxNow = undefined;
7254		});
7255		return fxNow = jQuery.now();
7256	}
7257
7258	// Generate parameters to create a standard animation
7259	function genFx(type, includeWidth) {
7260		var which,
7261		    attrs = { height: type },
7262		    i = 0;
7263
7264		// if we include width, step value is 1 to do all cssExpand values,
7265		// if we don't include width, step value is 2 to skip over Left and Right
7266		includeWidth = includeWidth ? 1 : 0;
7267		for (; i < 4; i += 2 - includeWidth) {
7268			which = cssExpand[i];
7269			attrs["margin" + which] = attrs["padding" + which] = type;
7270		}
7271
7272		if (includeWidth) {
7273			attrs.opacity = attrs.width = type;
7274		}
7275
7276		return attrs;
7277	}
7278
7279	function createTween(value, prop, animation) {
7280		var tween,
7281		    collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
7282		    index = 0,
7283		    length = collection.length;
7284		for (; index < length; index++) {
7285			if (tween = collection[index].call(animation, prop, value)) {
7286
7287				// we're done with this property
7288				return tween;
7289			}
7290		}
7291	}
7292
7293	function defaultPrefilter(elem, props, opts) {
7294		/* jshint validthis: true */
7295		var prop,
7296		    value,
7297		    toggle,
7298		    tween,
7299		    hooks,
7300		    oldfire,
7301		    display,
7302		    checkDisplay,
7303		    anim = this,
7304		    orig = {},
7305		    style = elem.style,
7306		    hidden = elem.nodeType && isHidden(elem),
7307		    dataShow = jQuery._data(elem, "fxshow");
7308
7309		// handle queue: false promises
7310		if (!opts.queue) {
7311			hooks = jQuery._queueHooks(elem, "fx");
7312			if (hooks.unqueued == null) {
7313				hooks.unqueued = 0;
7314				oldfire = hooks.empty.fire;
7315				hooks.empty.fire = function () {
7316					if (!hooks.unqueued) {
7317						oldfire();
7318					}
7319				};
7320			}
7321			hooks.unqueued++;
7322
7323			anim.always(function () {
7324
7325				// doing this makes sure that the complete handler will be called
7326				// before this completes
7327				anim.always(function () {
7328					hooks.unqueued--;
7329					if (!jQuery.queue(elem, "fx").length) {
7330						hooks.empty.fire();
7331					}
7332				});
7333			});
7334		}
7335
7336		// height/width overflow pass
7337		if (elem.nodeType === 1 && ("height" in props || "width" in props)) {
7338
7339			// Make sure that nothing sneaks out
7340			// Record all 3 overflow attributes because IE does not
7341			// change the overflow attribute when overflowX and
7342			// overflowY are set to the same value
7343			opts.overflow = [style.overflow, style.overflowX, style.overflowY];
7344
7345			// Set display property to inline-block for height/width
7346			// animations on inline elements that are having width/height animated
7347			display = jQuery.css(elem, "display");
7348
7349			// Test default display if display is currently "none"
7350			checkDisplay = display === "none" ? jQuery._data(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display;
7351
7352			if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") {
7353
7354				// inline-level elements accept inline-block;
7355				// block-level elements need to be inline with layout
7356				if (!support.inlineBlockNeedsLayout || defaultDisplay(elem.nodeName) === "inline") {
7357					style.display = "inline-block";
7358				} else {
7359					style.zoom = 1;
7360				}
7361			}
7362		}
7363
7364		if (opts.overflow) {
7365			style.overflow = "hidden";
7366			if (!support.shrinkWrapBlocks()) {
7367				anim.always(function () {
7368					style.overflow = opts.overflow[0];
7369					style.overflowX = opts.overflow[1];
7370					style.overflowY = opts.overflow[2];
7371				});
7372			}
7373		}
7374
7375		// show/hide pass
7376		for (prop in props) {
7377			value = props[prop];
7378			if (rfxtypes.exec(value)) {
7379				delete props[prop];
7380				toggle = toggle || value === "toggle";
7381				if (value === (hidden ? "hide" : "show")) {
7382
7383					// If there is dataShow left over from a stopped hide or show
7384					// and we are going to proceed with show, we should pretend to be hidden
7385					if (value === "show" && dataShow && dataShow[prop] !== undefined) {
7386						hidden = true;
7387					} else {
7388						continue;
7389					}
7390				}
7391				orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
7392
7393				// Any non-fx value stops us from restoring the original display value
7394			} else {
7395				display = undefined;
7396			}
7397		}
7398
7399		if (!jQuery.isEmptyObject(orig)) {
7400			if (dataShow) {
7401				if ("hidden" in dataShow) {
7402					hidden = dataShow.hidden;
7403				}
7404			} else {
7405				dataShow = jQuery._data(elem, "fxshow", {});
7406			}
7407
7408			// store state if its toggle - enables .stop().toggle() to "reverse"
7409			if (toggle) {
7410				dataShow.hidden = !hidden;
7411			}
7412			if (hidden) {
7413				jQuery(elem).show();
7414			} else {
7415				anim.done(function () {
7416					jQuery(elem).hide();
7417				});
7418			}
7419			anim.done(function () {
7420				var prop;
7421				jQuery._removeData(elem, "fxshow");
7422				for (prop in orig) {
7423					jQuery.style(elem, prop, orig[prop]);
7424				}
7425			});
7426			for (prop in orig) {
7427				tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
7428
7429				if (!(prop in dataShow)) {
7430					dataShow[prop] = tween.start;
7431					if (hidden) {
7432						tween.end = tween.start;
7433						tween.start = prop === "width" || prop === "height" ? 1 : 0;
7434					}
7435				}
7436			}
7437
7438			// If this is a noop like .hide().hide(), restore an overwritten display value
7439		} else if ((display === "none" ? defaultDisplay(elem.nodeName) : dis
vendor: 5,869 bytes, lines 7439-7665
7439play) === "inline") {
7440			style.display = display;
7441		}
7442	}
7443
7444	function propFilter(props, specialEasing) {
7445		var index, name, easing, value, hooks;
7446
7447		// camelCase, specialEasing and expand cssHook pass
7448		for (index in props) {
7449			name = jQuery.camelCase(index);
7450			easing = specialEasing[name];
7451			value = props[index];
7452			if (jQuery.isArray(value)) {
7453				easing = value[1];
7454				value = props[index] = value[0];
7455			}
7456
7457			if (index !== name) {
7458				props[name] = value;
7459				delete props[index];
7460			}
7461
7462			hooks = jQuery.cssHooks[name];
7463			if (hooks && "expand" in hooks) {
7464				value = hooks.expand(value);
7465				delete props[name];
7466
7467				// not quite $.extend, this wont overwrite keys already present.
7468				// also - reusing 'index' from above because we have the correct "name"
7469				for (index in value) {
7470					if (!(index in props)) {
7471						props[index] = value[index];
7472						specialEasing[index] = easing;
7473					}
7474				}
7475			} else {
7476				specialEasing[name] = easing;
7477			}
7478		}
7479	}
7480
7481	function Animation(elem, properties, options) {
7482		var result,
7483		    stopped,
7484		    index = 0,
7485		    length = Animation.prefilters.length,
7486		    deferred = jQuery.Deferred().always(function () {
7487
7488			// don't match elem in the :animated selector
7489			delete tick.elem;
7490		}),
7491		    tick = function () {
7492			if (stopped) {
7493				return false;
7494			}
7495			var currentTime = fxNow || createFxNow(),
7496			    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
7497
7498
7499			// Support: Android 2.3
7500			// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7501			temp = remaining / animation.duration || 0,
7502			    percent = 1 - temp,
7503			    index = 0,
7504			    length = animation.tweens.length;
7505
7506			for (; index < length; index++) {
7507				animation.tweens[index].run(percent);
7508			}
7509
7510			deferred.notifyWith(elem, [animation, percent, remaining]);
7511
7512			if (percent < 1 && length) {
7513				return remaining;
7514			} else {
7515				deferred.resolveWith(elem, [animation]);
7516				return false;
7517			}
7518		},
7519		    animation = deferred.promise({
7520			elem: elem,
7521			props: jQuery.extend({}, properties),
7522			opts: jQuery.extend(true, {
7523				specialEasing: {},
7524				easing: jQuery.easing._default
7525			}, options),
7526			originalProperties: properties,
7527			originalOptions: options,
7528			startTime: fxNow || createFxNow(),
7529			duration: options.duration,
7530			tweens: [],
7531			createTween: function (prop, end) {
7532				var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
7533				animation.tweens.push(tween);
7534				return tween;
7535			},
7536			stop: function (gotoEnd) {
7537				var index = 0,
7538
7539
7540				// if we are going to the end, we want to run all the tweens
7541				// otherwise we skip this part
7542				length = gotoEnd ? animation.tweens.length : 0;
7543				if (stopped) {
7544					return this;
7545				}
7546				stopped = true;
7547				for (; index < length; index++) {
7548					animation.tweens[index].run(1);
7549				}
7550
7551				// resolve when we played the last frame
7552				// otherwise, reject
7553				if (gotoEnd) {
7554					deferred.notifyWith(elem, [animation, 1, 0]);
7555					deferred.resolveWith(elem, [animation, gotoEnd]);
7556				} else {
7557					deferred.rejectWith(elem, [animation, gotoEnd]);
7558				}
7559				return this;
7560			}
7561		}),
7562		    props = animation.props;
7563
7564		propFilter(props, animation.opts.specialEasing);
7565
7566		for (; index < length; index++) {
7567			result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
7568			if (result) {
7569				if (jQuery.isFunction(result.stop)) {
7570					jQuery._queueHooks(animation.elem, animation.opts.queue).stop = jQuery.proxy(result.stop, result);
7571				}
7572				return result;
7573			}
7574		}
7575
7576		jQuery.map(props, createTween, animation);
7577
7578		if (jQuery.isFunction(animation.opts.start)) {
7579			animation.opts.start.call(elem, animation);
7580		}
7581
7582		jQuery.fx.timer(jQuery.extend(tick, {
7583			elem: elem,
7584			anim: animation,
7585			queue: animation.opts.queue
7586		}));
7587
7588		// attach callbacks from options
7589		return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
7590	}
7591
7592	jQuery.Animation = jQuery.extend(Animation, {
7593
7594		tweeners: {
7595			"*": [function (prop, value) {
7596				var tween = this.createTween(prop, value);
7597				adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
7598				return tween;
7599			}]
7600		},
7601
7602		tweener: function (props, callback) {
7603			if (jQuery.isFunction(props)) {
7604				callback = props;
7605				props = ["*"];
7606			} else {
7607				props = props.match(rnotwhite);
7608			}
7609
7610			var prop,
7611			    index = 0,
7612			    length = props.length;
7613
7614			for (; index < length; index++) {
7615				prop = props[index];
7616				Animation.tweeners[prop] = Animation.tweeners[prop] || [];
7617				Animation.tweeners[prop].unshift(callback);
7618			}
7619		},
7620
7621		prefilters: [defaultPrefilter],
7622
7623		prefilter: function (callback, prepend) {
7624			if (prepend) {
7625				Animation.prefilters.unshift(callback);
7626			} else {
7627				Animation.prefilters.push(callback);
7628			}
7629		}
7630	});
7631
7632	jQuery.speed = function (speed, easing, fn) {
7633		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
7634			complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
7635			duration: speed,
7636			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
7637		};
7638
7639		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
7640
7641		// normalize opt.queue - true/undefined/null -> "fx"
7642		if (opt.queue == null || opt.queue === true) {
7643			opt.queue = "fx";
7644		}
7645
7646		// Queueing
7647		opt.old = opt.complete;
7648
7649		opt.complete = function () {
7650			if (jQuery.isFunction(opt.old)) {
7651				opt.old.call(this);
7652			}
7653
7654			if (opt.queue) {
7655				jQuery.dequeue(this, opt.queue);
7656			}
7657		};
7658
7659		return opt;
7660	};
7661
7662	jQuery.fn.extend({
7663		fadeTo: function (speed, to, easing, callback) {
7664
7665			// show any hidden elements after setting opacity to 0
vendor: 8,995 bytes, lines 7666-8006
7666			return this.filter(isHidden).css("opacity", 0).show()
7667
7668			// animate to the value specified
7669			.end().animate({ opacity: to }, speed, easing, callback);
7670		},
7671		animate: function (prop, speed, easing, callback) {
7672			var empty = jQuery.isEmptyObject(prop),
7673			    optall = jQuery.speed(speed, easing, callback),
7674			    doAnimation = function () {
7675
7676				// Operate on a copy of prop so per-property easing won't be lost
7677				var anim = Animation(this, jQuery.extend({}, prop), optall);
7678
7679				// Empty animations, or finishing resolves immediately
7680				if (empty || jQuery._data(this, "finish")) {
7681					anim.stop(true);
7682				}
7683			};
7684			doAnimation.finish = doAnimation;
7685
7686			return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
7687		},
7688		stop: function (type, clearQueue, gotoEnd) {
7689			var stopQueue = function (hooks) {
7690				var stop = hooks.stop;
7691				delete hooks.stop;
7692				stop(gotoEnd);
7693			};
7694
7695			if (typeof type !== "string") {
7696				gotoEnd = clearQueue;
7697				clearQueue = type;
7698				type = undefined;
7699			}
7700			if (clearQueue && type !== false) {
7701				this.queue(type || "fx", []);
7702			}
7703
7704			return this.each(function () {
7705				var dequeue = true,
7706				    index = type != null && type + "queueHooks",
7707				    timers = jQuery.timers,
7708				    data = jQuery._data(this);
7709
7710				if (index) {
7711					if (data[index] && data[index].stop) {
7712						stopQueue(data[index]);
7713					}
7714				} else {
7715					for (index in data) {
7716						if (data[index] && data[index].stop && rrun.test(index)) {
7717							stopQueue(data[index]);
7718						}
7719					}
7720				}
7721
7722				for (index = timers.length; index--;) {
7723					if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
7724
7725						timers[index].anim.stop(gotoEnd);
7726						dequeue = false;
7727						timers.splice(index, 1);
7728					}
7729				}
7730
7731				// start the next in the queue if the last step wasn't forced
7732				// timers currently will call their complete callbacks, which will dequeue
7733				// but only if they were gotoEnd
7734				if (dequeue || !gotoEnd) {
7735					jQuery.dequeue(this, type);
7736				}
7737			});
7738		},
7739		finish: function (type) {
7740			if (type !== false) {
7741				type = type || "fx";
7742			}
7743			return this.each(function () {
7744				var index,
7745				    data = jQuery._data(this),
7746				    queue = data[type + "queue"],
7747				    hooks = data[type + "queueHooks"],
7748				    timers = jQuery.timers,
7749				    length = queue ? queue.length : 0;
7750
7751				// enable finishing flag on private data
7752				data.finish = true;
7753
7754				// empty the queue first
7755				jQuery.queue(this, type, []);
7756
7757				if (hooks && hooks.stop) {
7758					hooks.stop.call(this, true);
7759				}
7760
7761				// look for any active animations, and finish them
7762				for (index = timers.length; index--;) {
7763					if (timers[index].elem === this && timers[index].queue === type) {
7764						timers[index].anim.stop(true);
7765						timers.splice(index, 1);
7766					}
7767				}
7768
7769				// look for any animations in the old queue and finish them
7770				for (index = 0; index < length; index++) {
7771					if (queue[index] && queue[index].finish) {
7772						queue[index].finish.call(this);
7773					}
7774				}
7775
7776				// turn off finishing flag
7777				delete data.finish;
7778			});
7779		}
7780	});
7781
7782	jQuery.each(["toggle", "show", "hide"], function (i, name) {
7783		var cssFn = jQuery.fn[name];
7784		jQuery.fn[name] = function (speed, easing, callback) {
7785			return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
7786		};
7787	});
7788
7789	// Generate shortcuts for custom animations
7790	jQuery.each({
7791		slideDown: genFx("show"),
7792		slideUp: genFx("hide"),
7793		slideToggle: genFx("toggle"),
7794		fadeIn: { opacity: "show" },
7795		fadeOut: { opacity: "hide" },
7796		fadeToggle: { opacity: "toggle" }
7797	}, function (name, props) {
7798		jQuery.fn[name] = function (speed, easing, callback) {
7799			return this.animate(props, speed, easing, callback);
7800		};
7801	});
7802
7803	jQuery.timers = [];
7804	jQuery.fx.tick = function () {
7805		var timer,
7806		    timers = jQuery.timers,
7807		    i = 0;
7808
7809		fxNow = jQuery.now();
7810
7811		for (; i < timers.length; i++) {
7812			timer = timers[i];
7813
7814			// Checks the timer has not already been removed
7815			if (!timer() && timers[i] === timer) {
7816				timers.splice(i--, 1);
7817			}
7818		}
7819
7820		if (!timers.length) {
7821			jQuery.fx.stop();
7822		}
7823		fxNow = undefined;
7824	};
7825
7826	jQuery.fx.timer = function (timer) {
7827		jQuery.timers.push(timer);
7828		if (timer()) {
7829			jQuery.fx.start();
7830		} else {
7831			jQuery.timers.pop();
7832		}
7833	};
7834
7835	jQuery.fx.interval = 13;
7836
7837	jQuery.fx.start = function () {
7838		if (!timerId) {
7839			timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval);
7840		}
7841	};
7842
7843	jQuery.fx.stop = function () {
7844		window.clearInterval(timerId);
7845		timerId = null;
7846	};
7847
7848	jQuery.fx.speeds = {
7849		slow: 600,
7850		fast: 200,
7851
7852		// Default speed
7853		_default: 400
7854	};
7855
7856	// Based off of the plugin by Clint Helfers, with permission.
7857	// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7858	jQuery.fn.delay = function (time, type) {
7859		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
7860		type = type || "fx";
7861
7862		return this.queue(type, function (next, hooks) {
7863			var timeout = window.setTimeout(next, time);
7864			hooks.stop = function () {
7865				window.clearTimeout(timeout);
7866			};
7867		});
7868	};
7869
7870	(function () {
7871		var a,
7872		    input = document.createElement("input"),
7873		    div = document.createElement("div"),
7874		    select = document.createElement("select"),
7875		    opt = select.appendChild(document.createElement("option"));
7876
7877		// Setup
7878		div = document.createElement("div");
7879		div.setAttribute("className", "t");
7880		div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
7881		a = div.getElementsByTagName("a")[0];
7882
7883		// Support: Windows Web Apps (WWA)
7884		// `type` must use .setAttribute for WWA (#14901)
7885		input.setAttribute("type", "checkbox");
7886		div.appendChild(input);
7887
7888		a = div.getElementsByTagName("a")[0];
7889
7890		// First batch of tests.
7891		a.style.cssText = "top:1px";
7892
7893		// Test setAttribute on camelCase class.
7894		// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
7895		support.getSetAttribute = div.className !== "t";
7896
7897		// Get the style information from getAttribute
7898		// (IE uses .cssText instead)
7899		support.style = /top/.test(a.getAttribute("style"));
7900
7901		// Make sure that URLs aren't manipulated
7902		// (IE normalizes it by default)
7903		support.hrefNormalized = a.getAttribute("href") === "/a";
7904
7905		// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
7906		support.checkOn = !!input.value;
7907
7908		// Make sure that a selected-by-default option has a working selected property.
7909		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
7910		support.optSelected = opt.selected;
7911
7912		// Tests for enctype support on a form (#6743)
7913		support.enctype = !!document.createElement("form").enctype;
7914
7915		// Make sure that the options inside disabled selects aren't marked as disabled
7916		// (WebKit marks them as disabled)
7917		select.disabled = true;
7918		support.optDisabled = !opt.disabled;
7919
7920		// Support: IE8 only
7921		// Check if we can trust getAttribute("value")
7922		input = document.createElement("input");
7923		input.setAttribute("value", "");
7924		support.input = input.getAttribute("value") === "";
7925
7926		// Check if an input maintains its value after becoming a radio
7927		input.value = "t";
7928		input.setAttribute("type", "radio");
7929		support.radioValue = input.value === "t";
7930	})();
7931
7932	var rreturn = /\r/g,
7933	    rspaces = /[\x20\t\r\n\f]+/g;
7934
7935	jQuery.fn.extend({
7936		val: function (value) {
7937			var hooks,
7938			    ret,
7939			    isFunction,
7940			    elem = this[0];
7941
7942			if (!arguments.length) {
7943				if (elem) {
7944					hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
7945
7946					if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
7947						return ret;
7948					}
7949
7950					ret = elem.value;
7951
7952					return typeof ret === "string" ?
7953
7954					// handle most common string cases
7955					ret.replace(rreturn, "") :
7956
7957					// handle cases where value is null/undef or number
7958					ret == null ? "" : ret;
7959				}
7960
7961				return;
7962			}
7963
7964			isFunction = jQuery.isFunction(value);
7965
7966			return this.each(function (i) {
7967				var val;
7968
7969				if (this.nodeType !== 1) {
7970					return;
7971				}
7972
7973				if (isFunction) {
7974					val = value.call(this, i, jQuery(this).val());
7975				} else {
7976					val = value;
7977				}
7978
7979				// Treat null/undefined as ""; convert numbers to string
7980				if (val == null) {
7981					val = "";
7982				} else if (typeof val === "number") {
7983					val += "";
7984				} else if (jQuery.isArray(val)) {
7985					val = jQuery.map(val, function (value) {
7986						return value == null ? "" : value + "";
7987					});
7988				}
7989
7990				hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
7991
7992				// If set returns undefined, fall back to normal setting
7993				if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
7994					this.value = val;
7995				}
7996			});
7997		}
7998	});
7999
8000	jQuery.extend({
8001		valHooks: {
8002			option: {
8003				get: function (elem) {
8004					var val = jQuery.find.attr(elem, "value");
8005					return val != null ? val :
8006
vendor: 4,966 bytes, lines 8007-8195
8007					// Support: IE10-11+
8008					// option.text throws exceptions (#14686, #14858)
8009					// Strip and collapse whitespace
8010					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8011					jQuery.trim(jQuery.text(elem)).replace(rspaces, " ");
8012				}
8013			},
8014			select: {
8015				get: function (elem) {
8016					var value,
8017					    option,
8018					    options = elem.options,
8019					    index = elem.selectedIndex,
8020					    one = elem.type === "select-one" || index < 0,
8021					    values = one ? null : [],
8022					    max = one ? index + 1 : options.length,
8023					    i = index < 0 ? max : one ? index : 0;
8024
8025					// Loop through all the selected options
8026					for (; i < max; i++) {
8027						option = options[i];
8028
8029						// oldIE doesn't update selected after form reset (#2551)
8030						if ((option.selected || i === index) && (
8031
8032						// Don't return options that are disabled or in a disabled optgroup
8033						support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {
8034
8035							// Get the specific value for the option
8036							value = jQuery(option).val();
8037
8038							// We don't need an array for one selects
8039							if (one) {
8040								return value;
8041							}
8042
8043							// Multi-Selects return an array
8044							values.push(value);
8045						}
8046					}
8047
8048					return values;
8049				},
8050
8051				set: function (elem, value) {
8052					var optionSet,
8053					    option,
8054					    options = elem.options,
8055					    values = jQuery.makeArray(value),
8056					    i = options.length;
8057
8058					while (i--) {
8059						option = options[i];
8060
8061						if (jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
8062
8063							// Support: IE6
8064							// When new option element is added to select box we need to
8065							// force reflow of newly added node in order to workaround delay
8066							// of initialization properties
8067							try {
8068								option.selected = optionSet = true;
8069							} catch (_) {
8070
8071								// Will be executed only in IE6
8072								option.scrollHeight;
8073							}
8074						} else {
8075							option.selected = false;
8076						}
8077					}
8078
8079					// Force browsers to behave consistently when non-matching value is set
8080					if (!optionSet) {
8081						elem.selectedIndex = -1;
8082					}
8083
8084					return options;
8085				}
8086			}
8087		}
8088	});
8089
8090	// Radios and checkboxes getter/setter
8091	jQuery.each(["radio", "checkbox"], function () {
8092		jQuery.valHooks[this] = {
8093			set: function (elem, value) {
8094				if (jQuery.isArray(value)) {
8095					return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
8096				}
8097			}
8098		};
8099		if (!support.checkOn) {
8100			jQuery.valHooks[this].get = function (elem) {
8101				return elem.getAttribute("value") === null ? "on" : elem.value;
8102			};
8103		}
8104	});
8105
8106	var nodeHook,
8107	    boolHook,
8108	    attrHandle = jQuery.expr.attrHandle,
8109	    ruseDefault = /^(?:checked|selected)$/i,
8110	    getSetAttribute = support.getSetAttribute,
8111	    getSetInput = support.input;
8112
8113	jQuery.fn.extend({
8114		attr: function (name, value) {
8115			return access(this, jQuery.attr, name, value, arguments.length > 1);
8116		},
8117
8118		removeAttr: function (name) {
8119			return this.each(function () {
8120				jQuery.removeAttr(this, name);
8121			});
8122		}
8123	});
8124
8125	jQuery.extend({
8126		attr: function (elem, name, value) {
8127			var ret,
8128			    hooks,
8129			    nType = elem.nodeType;
8130
8131			// Don't get/set attributes on text, comment and attribute nodes
8132			if (nType === 3 || nType === 8 || nType === 2) {
8133				return;
8134			}
8135
8136			// Fallback to prop when attributes are not supported
8137			if (typeof elem.getAttribute === "undefined") {
8138				return jQuery.prop(elem, name, value);
8139			}
8140
8141			// All attributes are lowercase
8142			// Grab necessary hook if one is defined
8143			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
8144				name = name.toLowerCase();
8145				hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : nodeHook);
8146			}
8147
8148			if (value !== undefined) {
8149				if (value === null) {
8150					jQuery.removeAttr(elem, name);
8151					return;
8152				}
8153
8154				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
8155					return ret;
8156				}
8157
8158				elem.setAttribute(name, value + "");
8159				return value;
8160			}
8161
8162			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
8163				return ret;
8164			}
8165
8166			ret = jQuery.find.attr(elem, name);
8167
8168			// Non-existent attributes return null, we normalize to undefined
8169			return ret == null ? undefined : ret;
8170		},
8171
8172		attrHooks: {
8173			type: {
8174				set: function (elem, value) {
8175					if (!support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
8176
8177						// Setting the type on a radio button after the value resets the value in IE8-9
8178						// Reset value to default in case type is set after value during creation
8179						var val = elem.value;
8180						elem.setAttribute("type", value);
8181						if (val) {
8182							elem.value = val;
8183						}
8184						return value;
8185					}
8186				}
8187			}
8188		},
8189
8190		removeAttr: function (elem, value) {
8191			var name,
8192			    propName,
8193			    i = 0,
8194			    attrNames = value && value.match(rnotwhite);
8195
vendor: 4,714 bytes, lines 8196-8359
8196			if (attrNames && elem.nodeType === 1) {
8197				while (name = attrNames[i++]) {
8198					propName = jQuery.propFix[name] || name;
8199
8200					// Boolean attributes get special treatment (#10870)
8201					if (jQuery.expr.match.bool.test(name)) {
8202
8203						// Set corresponding property to false
8204						if (getSetInput && getSetAttribute || !ruseDefault.test(name)) {
8205							elem[propName] = false;
8206
8207							// Support: IE<9
8208							// Also clear defaultChecked/defaultSelected (if appropriate)
8209						} else {
8210							elem[jQuery.camelCase("default-" + name)] = elem[propName] = false;
8211						}
8212
8213						// See #9699 for explanation of this approach (setting first, then removal)
8214					} else {
8215						jQuery.attr(elem, name, "");
8216					}
8217
8218					elem.removeAttribute(getSetAttribute ? name : propName);
8219				}
8220			}
8221		}
8222	});
8223
8224	// Hooks for boolean attributes
8225	boolHook = {
8226		set: function (elem, value, name) {
8227			if (value === false) {
8228
8229				// Remove boolean attributes when set to false
8230				jQuery.removeAttr(elem, name);
8231			} else if (getSetInput && getSetAttribute || !ruseDefault.test(name)) {
8232
8233				// IE<8 needs the *property* name
8234				elem.setAttribute(!getSetAttribute && jQuery.propFix[name] || name, name);
8235			} else {
8236
8237				// Support: IE<9
8238				// Use defaultChecked and defaultSelected for oldIE
8239				elem[jQuery.camelCase("default-" + name)] = elem[name] = true;
8240			}
8241			return name;
8242		}
8243	};
8244
8245	jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {
8246		var getter = attrHandle[name] || jQuery.find.attr;
8247
8248		if (getSetInput && getSetAttribute || !ruseDefault.test(name)) {
8249			attrHandle[name] = function (elem, name, isXML) {
8250				var ret, handle;
8251				if (!isXML) {
8252
8253					// Avoid an infinite loop by temporarily removing this function from the getter
8254					handle = attrHandle[name];
8255					attrHandle[name] = ret;
8256					ret = getter(elem, name, isXML) != null ? name.toLowerCase() : null;
8257					attrHandle[name] = handle;
8258				}
8259				return ret;
8260			};
8261		} else {
8262			attrHandle[name] = function (elem, name, isXML) {
8263				if (!isXML) {
8264					return elem[jQuery.camelCase("default-" + name)] ? name.toLowerCase() : null;
8265				}
8266			};
8267		}
8268	});
8269
8270	// fix oldIE attroperties
8271	if (!getSetInput || !getSetAttribute) {
8272		jQuery.attrHooks.value = {
8273			set: function (elem, value, name) {
8274				if (jQuery.nodeName(elem, "input")) {
8275
8276					// Does not return so that setAttribute is also used
8277					elem.defaultValue = value;
8278				} else {
8279
8280					// Use nodeHook if defined (#1954); otherwise setAttribute is fine
8281					return nodeHook && nodeHook.set(elem, value, name);
8282				}
8283			}
8284		};
8285	}
8286
8287	// IE6/7 do not support getting/setting some attributes with get/setAttribute
8288	if (!getSetAttribute) {
8289
8290		// Use this for any attribute in IE6/7
8291		// This fixes almost every IE6/7 issue
8292		nodeHook = {
8293			set: function (elem, value, name) {
8294
8295				// Set the existing or create a new attribute node
8296				var ret = elem.getAttributeNode(name);
8297				if (!ret) {
8298					elem.setAttributeNode(ret = elem.ownerDocument.createAttribute(name));
8299				}
8300
8301				ret.value = value += "";
8302
8303				// Break association with cloned elements by also using setAttribute (#9646)
8304				if (name === "value" || value === elem.getAttribute(name)) {
8305					return value;
8306				}
8307			}
8308		};
8309
8310		// Some attributes are constructed with empty-string values when not defined
8311		attrHandle.id = attrHandle.name = attrHandle.coords = function (elem, name, isXML) {
8312			var ret;
8313			if (!isXML) {
8314				return (ret = elem.getAttributeNode(name)) && ret.value !== "" ? ret.value : null;
8315			}
8316		};
8317
8318		// Fixing value retrieval on a button requires this module
8319		jQuery.valHooks.button = {
8320			get: function (elem, name) {
8321				var ret = elem.getAttributeNode(name);
8322				if (ret && ret.specified) {
8323					return ret.value;
8324				}
8325			},
8326			set: nodeHook.set
8327		};
8328
8329		// Set contenteditable to false on removals(#10429)
8330		// Setting to empty string throws an error as an invalid value
8331		jQuery.attrHooks.contenteditable = {
8332			set: function (elem, value, name) {
8333				nodeHook.set(elem, value === "" ? false : value, name);
8334			}
8335		};
8336
8337		// Set width and height to auto instead of 0 on empty string( Bug #8150 )
8338		// This is for removals
8339		jQuery.each(["width", "height"], function (i, name) {
8340			jQuery.attrHooks[name] = {
8341				set: function (elem, value) {
8342					if (value === "") {
8343						elem.setAttribute(name, "auto");
8344						return value;
8345					}
8346				}
8347			};
8348		});
8349	}
8350
8351	if (!support.style) {
8352		jQuery.attrHooks.style = {
8353			get: function (elem) {
8354
8355				// Return undefined in the case of empty string
8356				// Note: IE uppercases css property names, but if we were to .toLowerCase()
8357				// .cssText, that would destroy case sensitivity in URL's, like in "background"
8358				return elem.style.cssText || undefined;
8359			},
8360			set: function (elem, value) {
8361				return elem.style.cssText = value + "";
8362			}
8363		};
8364	}
8365
8366	var rfocusable = /^(?:input|select|textarea|button|object)$/i,
8367	    rclickable = /^(?:a|area)$/i;
8368
8369	jQuery.fn.extend({
8370		prop: function (name, value) {
8371			return access(this, jQuery.prop, name, value, arguments.length > 1);
8372		},
8373
8374		removeProp: function (name) {
8375			name = jQuery.propFix[name] || name;
8376			return this.each(function () {
8377
8378				// try/catch handles cases where IE balks (such as removing a property on window)
8379				try {
8380					this[name] = undefined;
8381					delete this[name];
8382				} catch (e) {}
8383			});
8384		}
8385	});
8386
8387	jQuery.extend({
8388		prop: function (elem, name, value) {
8389			var ret,
8390			    hooks,
8391			    nType = elem.nodeType;
8392
8393			// Don't get/set properties on text, comment and attribute nodes
8394			if (nType === 3 || nType === 8 || nType === 2) {
8395				return;
8396			}
8397
8398			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
8399
8400				// Fix name and attach hooks
8401				name = jQuery.propFix[name] || name;
8402				hooks = jQuery.propHooks[name];
8403			}
8404
8405			if (value !== undefined) {
8406				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
8407					return ret;
8408				}
8409
8410				return elem[name] = value;
8411			}
8412
8413			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
8414				return ret;
8415			}
8416
8417			return elem[name];
8418		},
8419
8420		propHooks: {
8421			tabIndex: {
8422				get: function (elem) {
8423
8424					// elem.tabIndex doesn't always return the
8425					// correct value when it hasn't been explicitly set
8426					// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8427					// Use proper attribute retrieval(#12072)
8428					var tabindex = jQuery.find.attr(elem, "tabindex");
8429
8430					return tabindex ? parseInt(tabindex, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : -1;
8431				}
8432			}
8433		},
8434
8435		propFix: {
8436			"for": "htmlFor",
8437			"class": "className"
8438		}
8439	});
8440
8441	// Some attributes require a special call on IE
8442	// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
8443	if (!support.hrefNormalized) {
8444
8445		// href/src property should get the full normalized URL (#10299/#12915)
8446		jQuery.each(["href", "src"], function (i, name) {
8447			jQuery.propHooks[name] = {
8448				get: function (elem) {
8449					return elem.getAttribute(name, 4);
8450				}
8451			};
8452		});
8453	}
8454
8455	// Support: Safari, IE9+
8456	// Accessing the selectedIndex property
8457	// forces the browser to respect setting selected
8458	// on the option
8459	// The getter ensures a default option is selected
8460	// when in an optgroup
8461	if (!support.optSelected) {
8462		jQuery.propHooks.selected = {
8463			get: function (elem) {
8464				var parent = elem.parentNode;
8465
8466				if (parent) {
8467					parent.selectedIndex;
8468
8469					// Make sure that it also works with optgroups, see #5701
8470					if (parent.parentNode) {
8471						parent.parentNode.selectedIndex;
8472					}
8473				}
8474				return null;
8475			},
8476			set: function (elem) {
8477				var parent = elem.parentNode;
8478				if (parent) {
8479					parent.selectedIndex;
8480
8481					if (parent.parentNode) {
8482						parent.parentNode.selectedIndex;
8483					}
8484				}
8485			}
8486		};
8487	}
8488
8489	jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
8490		jQuery.propFix[this.toLowerCase()] = this;
8491	});
8492
8493	// IE6/7 call enctype encoding
8494	if (!support.enctype) {
8495		jQuery.propFix.enctype = "encoding";
8496	}
8497
8498	var rclass = /[\t\r\n\f]/g;
8499
8500	function getClass(elem) {
8501		return jQuery.attr(elem, "class") || "";
8502	}
8503
8504	jQuery.fn.extend({
8505		addClass: function (value) {
8506			var classes,
8507			    elem,
8508			    cur,
8509			    curValue,
8510			    clazz,
8511			    j,
8512			    finalValue,
8513			    i = 0;
8514
8515			if (jQuery.isFunction(value)) {
8516				return this.each(function (j) {
8517					jQuery(this).addClass(value.call(this, j, getClass(this)));
8518				});
8519			}
8520
8521			if (typeof value === "string" && value) {
8522				classes = value.match(rnotwhite) || [];
8523
8524				while (elem = this[i++]) {
8525					curValue = getClass(elem);
8526					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");
8527
8528					if (cur) {
8529						j = 0;
8530						while (clazz = classes[j++]) {
8531							if (cur.indexOf(" " + clazz + " ") < 0) {
8532								cur += clazz + " ";
8533							}
8534						}
8535
8536						// only assign if different to avoid unneeded rendering.
8537						finalValue = jQuery.trim(cur);
8538						if (curValue !== finalValue) {
8539							jQuery.attr(elem, "class", finalValue);
8540						}
8541					}
8542				}
8543			}
8544
8545			return this;
8546		},
8547
8548		removeClass: function (value) {
8549			var classes,
8550			    elem,
8551			    cur,
8552			    curValue,
8553			    clazz,
8554			    j,
8555			    finalValue,
8556			    i = 0;
8557
8558			if (jQuery.isFunction(value)) {
8559				return this.each(function (j) {
8560					jQuery(this).removeClass(value.call(this, j, getClass(this)));
8561				});
8562			}
8563
8564			if (!arguments.length) {
8565				return this.attr("class", "");
8566			}
8567
8568			if (typeof value === "string" && value) {
8569				classes = value.match(rnotwhite) || [];
8570
8571				while (elem = this[i++]) {
8572					curValue = getClass(elem);
8573
8574					// This expression is here for better compressibility (see addClass)
8575					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");
8576
8577					if (cur) {
8578						j = 0;
8579						while (clazz = classes[j++]) {
8580
8581							// Remove *all* instances
8582							while (cur.indexOf(" " + clazz + " ") > -1) {
8583								cur = cur.replace(" " + clazz + " ", " ");
8584							}
8585						}
8586
8587						// Only assign if different to avoid unneeded rendering.
8588						finalValue = jQuery.trim(cur);
8589						if (curValue !== finalValue) {
8590							jQuery.attr(elem, "class", finalValue);
8591						}
8592					}
8593				}
8594			}
8595
8596			return this;
8597		},
8598
8599		toggleClass: function (value, stateVal) {
8600			var type = typeof value;
8601
8602			if (typeof stateVal === "boolean" && type === "string") {
8603				return stateVal ? this.addClass(value) : this.removeClass(value);
8604			}
8605
8606			if (jQuery.isFunction(value)) {
8607				return this.each(function (i) {
8608					jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
8609				});
8610			}
8611
8612			return this.each(function () {
8613				var className, i, self, classNames;
8614
8615				if (type === "string") {
8616
8617					// Toggle individual class names
8618					i = 0;
8619					self = jQuery(this);
8620					classNames = value.match(rnotwhite) || [];
8621
8622					while (className = classNames[i++]) {
8623
8624						// Check each className given, space separated list
8625						if (self.hasClass(className)) {
8626							self.removeClass(className);
8627						} else {
8628							self.addClass(className);
8629						}
8630					}
8631
8632					// Toggle whole class name
8633				} else if (value === undefined || type === "boolean") {
8634					className = getClass(this);
8635					if (className) {
8636
8637						// store className if set
8638						jQuery._data(this, "__className__", className);
8639					}
8640
8641					// If the element has a class name or if we're passed "false",
8642					// then remove the whole classname (if there was one, the above saved it).
8643					// Otherwise bring back whatever was previously saved (if anything),
8644					// falling back to the empty string if nothing was stored.
8645					jQuery.attr(this, "class", className || value === false ? "" : jQuery._data(this, "__className__") || "");
8646				}
8647			});
8648		},
8649
8650		hasClass: function (selector) {
8651			var className,
8652			    elem,
8653			    i = 0;
8654
8655			className = " " + selector + " ";
8656			while (elem = this[i++]) {
8657				if (elem.nodeType === 1 && (" " + getClass(elem) + " ").replace(rclass, " ").indexOf(className) > -1) {
8658					return true;
8659				}
8660			}
8661
8662			return false;
8663		}
8664	});
8665
8666	// Return jQuery for attributes-only inclusion
8667
8668
8669	jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {
8670
8671		// Handle event binding
8672		jQuery.fn[name] = function (data, fn) {
8673			return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
8674		};
8675	});
8676
8677	jQuery.fn.extend({
8678		hover: function (fnOver, fnOut) {
8679			return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
8680		}
8681	});
8682
8683	var location = window.location;
8684
8685	var nonce = jQuery.now();
8686
8687	var rquery = /\?/;
8688
8689	var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
8690
8691	jQuery.parseJSON = function (data) {
8692
8693		// Attempt to parse using the native JSON parser first
8694		if (window.JSON && window.JSON.parse) {
8695
8696			// Support: Android 2.3
8697			// Workaround failure to string-cast null input
8698			return window.JSON.parse(data + "");
8699		}
8700
8701		var requireNonComma,
8702		    depth = null,
8703		    str = jQuery.trim(data + "");
8704
8705		// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
8706		// after removing valid tokens
8707		return str && !jQuery.trim(str.replace(rvalidtokens, function (token, comma, open, close) {
8708
8709			// Force termination if we see a misplaced comma
8710			if (requireNonComma && comma) {
8711				depth = 0;
8712			}
8713
8714			// Perform no more replacements after returning to outermost depth
8715			if (depth === 0) {
8716				return token;
8717			}
8718
8719			// Commas must not follow "[", "{", or ","
8720			requireNonComma = open || comma;
8721
8722			// Determine new depth
8723			// array/object open ("[" or "{"): depth += true - false (increment)
8724			// array/object close ("]" or "}"): depth += false - true (decrement)
8725			// other cases ("," or primitive): depth += true - true (numeric cast)
8726			depth += !close - !open;
8727
8728			// Remove this token
8729			return "";
8730		})) ? Function("return " + str)() : jQuery.error("Invalid JSON: " + data);
8731	};
8732
8733	// Cross-browser xml parsing
8734	jQuery.parseXML = function (data) {
8735		var xml, tmp;
8736		if (!data || typeof data !== "string") {
8737			return null;
8738		}
8739		try {
8740			if (window.DOMParser) {
8741				// Standard
8742				tmp = new window.DOMParser();
8743				xml = tmp.parseFromString(data, "text/xml");
8744			} else {
8745				// IE
8746				xml = new window.ActiveXObject("Microsoft.XMLDOM");
8747				xml.async = "false";
8748				xml.loadXML(data);
8749			}
8750		} catch (e) {
8751			xml = undefined;
8752		}
8753		if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) {
8754			jQuery.error("Invalid XML: " + data);
8755		}
8756		return xml;
8757	};
8758
8759	var rhash = /#.*$/,
8760	    rts = /([?&])_=[^&]*/,
8761
8762
8763	// IE leaves an \r character at EOL
8764	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
8765
8766
vendor: 13,733 bytes, lines 8767-9311
8767	// #7653, #8125, #8152: local protocol detection
8768	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8769	    rnoContent = /^(?:GET|HEAD)$/,
8770	    rprotocol = /^\/\//,
8771	    rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
8772
8773
8774	/* Prefilters
8775  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8776  * 2) These are called:
8777  *    - BEFORE asking for a transport
8778  *    - AFTER param serialization (s.data is a string if s.processData is true)
8779  * 3) key is the dataType
8780  * 4) the catchall symbol "*" can be used
8781  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8782  */
8783	prefilters = {},
8784
8785
8786	/* Transports bindings
8787  * 1) key is the dataType
8788  * 2) the catchall symbol "*" can be used
8789  * 3) selection will start with transport dataType and THEN go to "*" if needed
8790  */
8791	transports = {},
8792
8793
8794	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8795	allTypes = "*/".concat("*"),
8796
8797
8798	// Document location
8799	ajaxLocation = location.href,
8800
8801
8802	// Segment location into parts
8803	ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || [];
8804
8805	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8806	function addToPrefiltersOrTransports(structure) {
8807
8808		// dataTypeExpression is optional and defaults to "*"
8809		return function (dataTypeExpression, func) {
8810
8811			if (typeof dataTypeExpression !== "string") {
8812				func = dataTypeExpression;
8813				dataTypeExpression = "*";
8814			}
8815
8816			var dataType,
8817			    i = 0,
8818			    dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];
8819
8820			if (jQuery.isFunction(func)) {
8821
8822				// For each dataType in the dataTypeExpression
8823				while (dataType = dataTypes[i++]) {
8824
8825					// Prepend if requested
8826					if (dataType.charAt(0) === "+") {
8827						dataType = dataType.slice(1) || "*";
8828						(structure[dataType] = structure[dataType] || []).unshift(func);
8829
8830						// Otherwise append
8831					} else {
8832						(structure[dataType] = structure[dataType] || []).push(func);
8833					}
8834				}
8835			}
8836		};
8837	}
8838
8839	// Base inspection function for prefilters and transports
8840	function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
8841
8842		var inspected = {},
8843		    seekingTransport = structure === transports;
8844
8845		function inspect(dataType) {
8846			var selected;
8847			inspected[dataType] = true;
8848			jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
8849				var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
8850				if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
8851
8852					options.dataTypes.unshift(dataTypeOrTransport);
8853					inspect(dataTypeOrTransport);
8854					return false;
8855				} else if (seekingTransport) {
8856					return !(selected = dataTypeOrTransport);
8857				}
8858			});
8859			return selected;
8860		}
8861
8862		return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
8863	}
8864
8865	// A special extend for ajax options
8866	// that takes "flat" options (not to be deep extended)
8867	// Fixes #9887
8868	function ajaxExtend(target, src) {
8869		var deep,
8870		    key,
8871		    flatOptions = jQuery.ajaxSettings.flatOptions || {};
8872
8873		for (key in src) {
8874			if (src[key] !== undefined) {
8875				(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
8876			}
8877		}
8878		if (deep) {
8879			jQuery.extend(true, target, deep);
8880		}
8881
8882		return target;
8883	}
8884
8885	/* Handles responses to an ajax request:
8886  * - finds the right dataType (mediates between content-type and expected dataType)
8887  * - returns the corresponding response
8888  */
8889	function ajaxHandleResponses(s, jqXHR, responses) {
8890		var firstDataType,
8891		    ct,
8892		    finalDataType,
8893		    type,
8894		    contents = s.contents,
8895		    dataTypes = s.dataTypes;
8896
8897		// Remove auto dataType and get content-type in the process
8898		while (dataTypes[0] === "*") {
8899			dataTypes.shift();
8900			if (ct === undefined) {
8901				ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8902			}
8903		}
8904
8905		// Check if we're dealing with a known content-type
8906		if (ct) {
8907			for (type in contents) {
8908				if (contents[type] && contents[type].test(ct)) {
8909					dataTypes.unshift(type);
8910					break;
8911				}
8912			}
8913		}
8914
8915		// Check to see if we have a response for the expected dataType
8916		if (dataTypes[0] in responses) {
8917			finalDataType = dataTypes[0];
8918		} else {
8919
8920			// Try convertible dataTypes
8921			for (type in responses) {
8922				if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
8923					finalDataType = type;
8924					break;
8925				}
8926				if (!firstDataType) {
8927					firstDataType = type;
8928				}
8929			}
8930
8931			// Or just use first one
8932			finalDataType = finalDataType || firstDataType;
8933		}
8934
8935		// If we found a dataType
8936		// We add the dataType to the list if needed
8937		// and return the corresponding response
8938		if (finalDataType) {
8939			if (finalDataType !== dataTypes[0]) {
8940				dataTypes.unshift(finalDataType);
8941			}
8942			return responses[finalDataType];
8943		}
8944	}
8945
8946	/* Chain conversions given the request and the original response
8947  * Also sets the responseXXX fields on the jqXHR instance
8948  */
8949	function ajaxConvert(s, response, jqXHR, isSuccess) {
8950		var conv2,
8951		    current,
8952		    conv,
8953		    tmp,
8954		    prev,
8955		    converters = {},
8956
8957
8958		// Work with a copy of dataTypes in case we need to modify it for conversion
8959		dataTypes = s.dataTypes.slice();
8960
8961		// Create converters map with lowercased keys
8962		if (dataTypes[1]) {
8963			for (conv in s.converters) {
8964				converters[conv.toLowerCase()] = s.converters[conv];
8965			}
8966		}
8967
8968		current = dataTypes.shift();
8969
8970		// Convert to each sequential dataType
8971		while (current) {
8972
8973			if (s.responseFields[current]) {
8974				jqXHR[s.responseFields[current]] = response;
8975			}
8976
8977			// Apply the dataFilter if provided
8978			if (!prev && isSuccess && s.dataFilter) {
8979				response = s.dataFilter(response, s.dataType);
8980			}
8981
8982			prev = current;
8983			current = dataTypes.shift();
8984
8985			if (current) {
8986
8987				// There's only work to do if current dataType is non-auto
8988				if (current === "*") {
8989
8990					current = prev;
8991
8992					// Convert response if prev dataType is non-auto and differs from current
8993				} else if (prev !== "*" && prev !== current) {
8994
8995					// Seek a direct converter
8996					conv = converters[prev + " " + current] || converters["* " + current];
8997
8998					// If none found, seek a pair
8999					if (!conv) {
9000						for (conv2 in converters) {
9001
9002							// If conv2 outputs current
9003							tmp = conv2.split(" ");
9004							if (tmp[1] === current) {
9005
9006								// If prev can be converted to accepted input
9007								conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
9008								if (conv) {
9009
9010									// Condense equivalence converters
9011									if (conv === true) {
9012										conv = converters[conv2];
9013
9014										// Otherwise, insert the intermediate dataType
9015									} else if (converters[conv2] !== true) {
9016										current = tmp[0];
9017										dataTypes.unshift(tmp[1]);
9018									}
9019									break;
9020								}
9021							}
9022						}
9023					}
9024
9025					// Apply converter (if not an equivalence)
9026					if (conv !== true) {
9027
9028						// Unless errors are allowed to bubble, catch and return them
9029						if (conv && s["throws"]) {
9030							// jscs:ignore requireDotNotation
9031							response = conv(response);
9032						} else {
9033							try {
9034								response = conv(response);
9035							} catch (e) {
9036								return {
9037									state: "parsererror",
9038									error: conv ? e : "No conversion from " + prev + " to " + current
9039								};
9040							}
9041						}
9042					}
9043				}
9044			}
9045		}
9046
9047		return { state: "success", data: response };
9048	}
9049
9050	jQuery.extend({
9051
9052		// Counter for holding the number of active queries
9053		active: 0,
9054
9055		// Last-Modified header cache for next request
9056		lastModified: {},
9057		etag: {},
9058
9059		ajaxSettings: {
9060			url: ajaxLocation,
9061			type: "GET",
9062			isLocal: rlocalProtocol.test(ajaxLocParts[1]),
9063			global: true,
9064			processData: true,
9065			async: true,
9066			contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9067			/*
9068   timeout: 0,
9069   data: null,
9070   dataType: null,
9071   username: null,
9072   password: null,
9073   cache: null,
9074   throws: false,
9075   traditional: false,
9076   headers: {},
9077   */
9078
9079			accepts: {
9080				"*": allTypes,
9081				text: "text/plain",
9082				html: "text/html",
9083				xml: "application/xml, text/xml",
9084				json: "application/json, text/javascript"
9085			},
9086
9087			contents: {
9088				xml: /\bxml\b/,
9089				html: /\bhtml/,
9090				json: /\bjson\b/
9091			},
9092
9093			responseFields: {
9094				xml: "responseXML",
9095				text: "responseText",
9096				json: "responseJSON"
9097			},
9098
9099			// Data converters
9100			// Keys separate source (or catchall "*") and destination types with a single space
9101			converters: {
9102
9103				// Convert anything to text
9104				"* text": String,
9105
9106				// Text to html (true = no transformation)
9107				"text html": true,
9108
9109				// Evaluate text as a json expression
9110				"text json": jQuery.parseJSON,
9111
9112				// Parse text as xml
9113				"text xml": jQuery.parseXML
9114			},
9115
9116			// For options that shouldn't be deep extended:
9117			// you can add your own custom options here if
9118			// and when you create one that shouldn't be
9119			// deep extended (see ajaxExtend)
9120			flatOptions: {
9121				url: true,
9122				context: true
9123			}
9124		},
9125
9126		// Creates a full fledged settings object into target
9127		// with both ajaxSettings and settings fields.
9128		// If target is omitted, writes into ajaxSettings.
9129		ajaxSetup: function (target, settings) {
9130			return settings ?
9131
9132			// Building a settings object
9133			ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :
9134
9135			// Extending ajaxSettings
9136			ajaxExtend(jQuery.ajaxSettings, target);
9137		},
9138
9139		ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
9140		ajaxTransport: addToPrefiltersOrTransports(transports),
9141
9142		// Main method
9143		ajax: function (url, options) {
9144
9145			// If url is an object, simulate pre-1.5 signature
9146			if (typeof url === "object") {
9147				options = url;
9148				url = undefined;
9149			}
9150
9151			// Force options to be an object
9152			options = options || {};
9153
9154			var
9155
9156			// Cross-domain detection vars
9157			parts,
9158
9159
9160			// Loop variable
9161			i,
9162
9163
9164			// URL without anti-cache param
9165			cacheURL,
9166
9167
9168			// Response headers as string
9169			responseHeadersString,
9170
9171
9172			// timeout handle
9173			timeoutTimer,
9174
9175
9176			// To know if global events are to be dispatched
9177			fireGlobals,
9178			    transport,
9179
9180
9181			// Response headers
9182			responseHeaders,
9183
9184
9185			// Create the final options object
9186			s = jQuery.ajaxSetup({}, options),
9187
9188
9189			// Callbacks context
9190			callbackContext = s.context || s,
9191
9192
9193			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9194			globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,
9195
9196
9197			// Deferreds
9198			deferred = jQuery.Deferred(),
9199			    completeDeferred = jQuery.Callbacks("once memory"),
9200
9201
9202			// Status-dependent callbacks
9203			statusCode = s.statusCode || {},
9204
9205
9206			// Headers (they are sent all at once)
9207			requestHeaders = {},
9208			    requestHeadersNames = {},
9209
9210
9211			// The jqXHR state
9212			state = 0,
9213
9214
9215			// Default abort message
9216			strAbort = "canceled",
9217
9218
9219			// Fake xhr
9220			jqXHR = {
9221				readyState: 0,
9222
9223				// Builds headers hashtable if needed
9224				getResponseHeader: function (key) {
9225					var match;
9226					if (state === 2) {
9227						if (!responseHeaders) {
9228							responseHeaders = {};
9229							while (match = rheaders.exec(responseHeadersString)) {
9230								responseHeaders[match[1].toLowerCase()] = match[2];
9231							}
9232						}
9233						match = responseHeaders[key.toLowerCase()];
9234					}
9235					return match == null ? null : match;
9236				},
9237
9238				// Raw string
9239				getAllResponseHeaders: function () {
9240					return state === 2 ? responseHeadersString : null;
9241				},
9242
9243				// Caches the header
9244				setRequestHeader: function (name, value) {
9245					var lname = name.toLowerCase();
9246					if (!state) {
9247						name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
9248						requestHeaders[name] = value;
9249					}
9250					return this;
9251				},
9252
9253				// Overrides response content-type header
9254				overrideMimeType: function (type) {
9255					if (!state) {
9256						s.mimeType = type;
9257					}
9258					return this;
9259				},
9260
9261				// Status-dependent callbacks
9262				statusCode: function (map) {
9263					var code;
9264					if (map) {
9265						if (state < 2) {
9266							for (code in map) {
9267
9268								// Lazy-add the new callback in a way that preserves old ones
9269								statusCode[code] = [statusCode[code], map[code]];
9270							}
9271						} else {
9272
9273							// Execute the appropriate callbacks
9274							jqXHR.always(map[jqXHR.status]);
9275						}
9276					}
9277					return this;
9278				},
9279
9280				// Cancel the request
9281				abort: function (statusText) {
9282					var finalText = statusText || strAbort;
9283					if (transport) {
9284						transport.abort(finalText);
9285					}
9286					done(0, finalText);
9287					return this;
9288				}
9289			};
9290
9291			// Attach deferreds
9292			deferred.promise(jqXHR).complete = completeDeferred.add;
9293			jqXHR.success = jqXHR.done;
9294			jqXHR.error = jqXHR.fail;
9295
9296			// Remove hash character (#7531: and string promotion)
9297			// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
9298			// Handle falsy url in the settings object (#10093: consistency with old signature)
9299			// We also use the url parameter if available
9300			s.url = ((url || s.url || ajaxLocation) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//");
9301
9302			// Alias method option to type as per ticket #12004
9303			s.type = options.method || options.type || s.method || s.type;
9304
9305			// Extract dataTypes list
9306			s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""];
9307
9308			// A cross-domain request is in order when we have a protocol:host:port mismatch
9309			if (s.crossDomain == null) {
9310				parts = rurl.exec(s.url.toLowerCase());
9311				s.crossDomain = !!(parts && (parts[1] !== ajaxLocParts[1] || parts[2] !== ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? "80" : "443")) !== (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? "80" : "443")))
vendor: 9,321 bytes, lines 9311-9682
9311);
9312			}
9313
9314			// Convert data if not already a string
9315			if (s.data && s.processData && typeof s.data !== "string") {
9316				s.data = jQuery.param(s.data, s.traditional);
9317			}
9318
9319			// Apply prefilters
9320			inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
9321
9322			// If request was aborted inside a prefilter, stop there
9323			if (state === 2) {
9324				return jqXHR;
9325			}
9326
9327			// We can fire global events as of now if asked to
9328			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9329			fireGlobals = jQuery.event && s.global;
9330
9331			// Watch for a new set of requests
9332			if (fireGlobals && jQuery.active++ === 0) {
9333				jQuery.event.trigger("ajaxStart");
9334			}
9335
9336			// Uppercase the type
9337			s.type = s.type.toUpperCase();
9338
9339			// Determine if request has content
9340			s.hasContent = !rnoContent.test(s.type);
9341
9342			// Save the URL in case we're toying with the If-Modified-Since
9343			// and/or If-None-Match header later on
9344			cacheURL = s.url;
9345
9346			// More options handling for requests with no content
9347			if (!s.hasContent) {
9348
9349				// If data is available, append data to url
9350				if (s.data) {
9351					cacheURL = s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data;
9352
9353					// #9682: remove data so that it's not used in an eventual retry
9354					delete s.data;
9355				}
9356
9357				// Add anti-cache in url if needed
9358				if (s.cache === false) {
9359					s.url = rts.test(cacheURL) ?
9360
9361					// If there is already a '_' parameter, set its value
9362					cacheURL.replace(rts, "$1_=" + nonce++) :
9363
9364					// Otherwise add one to the end
9365					cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++;
9366				}
9367			}
9368
9369			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9370			if (s.ifModified) {
9371				if (jQuery.lastModified[cacheURL]) {
9372					jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
9373				}
9374				if (jQuery.etag[cacheURL]) {
9375					jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
9376				}
9377			}
9378
9379			// Set the correct header, if data is being sent
9380			if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
9381				jqXHR.setRequestHeader("Content-Type", s.contentType);
9382			}
9383
9384			// Set the Accepts header for the server, depending on the dataType
9385			jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);
9386
9387			// Check for headers option
9388			for (i in s.headers) {
9389				jqXHR.setRequestHeader(i, s.headers[i]);
9390			}
9391
9392			// Allow custom headers/mimetypes and early abort
9393			if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {
9394
9395				// Abort if not done already and return
9396				return jqXHR.abort();
9397			}
9398
9399			// aborting is no longer a cancellation
9400			strAbort = "abort";
9401
9402			// Install callbacks on deferreds
9403			for (i in { success: 1, error: 1, complete: 1 }) {
9404				jqXHR[i](s[i]);
9405			}
9406
9407			// Get transport
9408			transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
9409
9410			// If no transport, we auto-abort
9411			if (!transport) {
9412				done(-1, "No Transport");
9413			} else {
9414				jqXHR.readyState = 1;
9415
9416				// Send global event
9417				if (fireGlobals) {
9418					globalEventContext.trigger("ajaxSend", [jqXHR, s]);
9419				}
9420
9421				// If request was aborted inside ajaxSend, stop there
9422				if (state === 2) {
9423					return jqXHR;
9424				}
9425
9426				// Timeout
9427				if (s.async && s.timeout > 0) {
9428					timeoutTimer = window.setTimeout(function () {
9429						jqXHR.abort("timeout");
9430					}, s.timeout);
9431				}
9432
9433				try {
9434					state = 1;
9435					transport.send(requestHeaders, done);
9436				} catch (e) {
9437
9438					// Propagate exception as error if not done
9439					if (state < 2) {
9440						done(-1, e);
9441
9442						// Simply rethrow otherwise
9443					} else {
9444						throw e;
9445					}
9446				}
9447			}
9448
9449			// Callback for when everything is done
9450			function done(status, nativeStatusText, responses, headers) {
9451				var isSuccess,
9452				    success,
9453				    error,
9454				    response,
9455				    modified,
9456				    statusText = nativeStatusText;
9457
9458				// Called once
9459				if (state === 2) {
9460					return;
9461				}
9462
9463				// State is "done" now
9464				state = 2;
9465
9466				// Clear timeout if it exists
9467				if (timeoutTimer) {
9468					window.clearTimeout(timeoutTimer);
9469				}
9470
9471				// Dereference transport for early garbage collection
9472				// (no matter how long the jqXHR object will be used)
9473				transport = undefined;
9474
9475				// Cache response headers
9476				responseHeadersString = headers || "";
9477
9478				// Set readyState
9479				jqXHR.readyState = status > 0 ? 4 : 0;
9480
9481				// Determine if successful
9482				isSuccess = status >= 200 && status < 300 || status === 304;
9483
9484				// Get response data
9485				if (responses) {
9486					response = ajaxHandleResponses(s, jqXHR, responses);
9487				}
9488
9489				// Convert no matter what (that way responseXXX fields are always set)
9490				response = ajaxConvert(s, response, jqXHR, isSuccess);
9491
9492				// If successful, handle type chaining
9493				if (isSuccess) {
9494
9495					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9496					if (s.ifModified) {
9497						modified = jqXHR.getResponseHeader("Last-Modified");
9498						if (modified) {
9499							jQuery.lastModified[cacheURL] = modified;
9500						}
9501						modified = jqXHR.getResponseHeader("etag");
9502						if (modified) {
9503							jQuery.etag[cacheURL] = modified;
9504						}
9505					}
9506
9507					// if no content
9508					if (status === 204 || s.type === "HEAD") {
9509						statusText = "nocontent";
9510
9511						// if not modified
9512					} else if (status === 304) {
9513						statusText = "notmodified";
9514
9515						// If we have data, let's convert it
9516					} else {
9517						statusText = response.state;
9518						success = response.data;
9519						error = response.error;
9520						isSuccess = !error;
9521					}
9522				} else {
9523
9524					// We extract error from statusText
9525					// then normalize statusText and status for non-aborts
9526					error = statusText;
9527					if (status || !statusText) {
9528						statusText = "error";
9529						if (status < 0) {
9530							status = 0;
9531						}
9532					}
9533				}
9534
9535				// Set data for the fake xhr object
9536				jqXHR.status = status;
9537				jqXHR.statusText = (nativeStatusText || statusText) + "";
9538
9539				// Success/Error
9540				if (isSuccess) {
9541					deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
9542				} else {
9543					deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
9544				}
9545
9546				// Status-dependent callbacks
9547				jqXHR.statusCode(statusCode);
9548				statusCode = undefined;
9549
9550				if (fireGlobals) {
9551					globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
9552				}
9553
9554				// Complete
9555				completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
9556
9557				if (fireGlobals) {
9558					globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
9559
9560					// Handle the global AJAX counter
9561					if (! --jQuery.active) {
9562						jQuery.event.trigger("ajaxStop");
9563					}
9564				}
9565			}
9566
9567			return jqXHR;
9568		},
9569
9570		getJSON: function (url, data, callback) {
9571			return jQuery.get(url, data, callback, "json");
9572		},
9573
9574		getScript: function (url, callback) {
9575			return jQuery.get(url, undefined, callback, "script");
9576		}
9577	});
9578
9579	jQuery.each(["get", "post"], function (i, method) {
9580		jQuery[method] = function (url, data, callback, type) {
9581
9582			// shift arguments if data argument was omitted
9583			if (jQuery.isFunction(data)) {
9584				type = type || callback;
9585				callback = data;
9586				data = undefined;
9587			}
9588
9589			// The url can be an options object (which then must have .url)
9590			return jQuery.ajax(jQuery.extend({
9591				url: url,
9592				type: method,
9593				dataType: type,
9594				data: data,
9595				success: callback
9596			}, jQuery.isPlainObject(url) && url));
9597		};
9598	});
9599
9600	jQuery._evalUrl = function (url) {
9601		return jQuery.ajax({
9602			url: url,
9603
9604			// Make this explicit, since user can override this through ajaxSetup (#11264)
9605			type: "GET",
9606			dataType: "script",
9607			cache: true,
9608			async: false,
9609			global: false,
9610			"throws": true
9611		});
9612	};
9613
9614	jQuery.fn.extend({
9615		wrapAll: function (html) {
9616			if (jQuery.isFunction(html)) {
9617				return this.each(function (i) {
9618					jQuery(this).wrapAll(html.call(this, i));
9619				});
9620			}
9621
9622			if (this[0]) {
9623
9624				// The elements to wrap the target around
9625				var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
9626
9627				if (this[0].parentNode) {
9628					wrap.insertBefore(this[0]);
9629				}
9630
9631				wrap.map(function () {
9632					var elem = this;
9633
9634					while (elem.firstChild && elem.firstChild.nodeType === 1) {
9635						elem = elem.firstChild;
9636					}
9637
9638					return elem;
9639				}).append(this);
9640			}
9641
9642			return this;
9643		},
9644
9645		wrapInner: function (html) {
9646			if (jQuery.isFunction(html)) {
9647				return this.each(function (i) {
9648					jQuery(this).wrapInner(html.call(this, i));
9649				});
9650			}
9651
9652			return this.each(function () {
9653				var self = jQuery(this),
9654				    contents = self.contents();
9655
9656				if (contents.length) {
9657					contents.wrapAll(html);
9658				} else {
9659					self.append(html);
9660				}
9661			});
9662		},
9663
9664		wrap: function (html) {
9665			var isFunction = jQuery.isFunction(html);
9666
9667			return this.each(function (i) {
9668				jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
9669			});
9670		},
9671
9672		unwrap: function () {
9673			return this.parent().each(function () {
9674				if (!jQuery.nodeName(this, "body")) {
9675					jQuery(this).replaceWith(this.childNodes);
9676				}
9677			}).end();
9678		}
9679	});
9680
9681	function getDisplay(elem) {
9682		return elem.style && elem.style.display || jQuery.css(elem, "dis
9682play");
9683	}
9684
9685	function filterHidden(elem) {
9686
9687		// Disconnected elements are considered hidden
9688		if (!jQuery.contains(elem.ownerDocument || document, elem)) {
9689			return true;
9690		}
9691		while (elem && elem.nodeType === 1) {
9692			if (getDisplay(elem) === "none" || elem.type === "hidden") {
9693				return true;
9694			}
9695			elem = elem.parentNode;
9696		}
9697		return false;
9698	}
9699
9700	jQuery.expr.filters.hidden = function (elem) {
9701
9702		// Support: Opera <= 12.12
9703		// Opera reports offsetWidths and offsetHeights less than zero on some elements
9704		return support.reliableHiddenOffsets() ? elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && !elem.getClientRects().length : filterHidden(elem);
9705	};
9706
9707	jQuery.expr.filters.visible = function (elem) {
9708		return !jQuery.expr.filters.hidden(elem);
9709	};
9710
9711	var r20 = /%20/g,
9712	    rbracket = /\[\]$/,
9713	    rCRLF = /\r?\n/g,
9714	    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
9715	    rsubmittable = /^(?:input|select|textarea|keygen)/i;
9716
9717	function buildParams(prefix, obj, traditional, add) {
9718		var name;
9719
9720		if (jQuery.isArray(obj)) {
9721
9722			// Serialize array item.
9723			jQuery.each(obj, function (i, v) {
9724				if (traditional || rbracket.test(prefix)) {
9725
9726					// Treat each array item as a scalar.
9727					add(prefix, v);
9728				} else {
9729
9730					// Item is non-scalar (array or object), encode its numeric index.
9731					buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add);
9732				}
9733			});
9734		} else if (!traditional && jQuery.type(obj) === "object") {
9735
9736			// Serialize object item.
9737			for (name in obj) {
9738				buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
9739			}
9740		} else {
9741
9742			// Serialize scalar item.
9743			add(prefix, obj);
9744		}
9745	}
9746
9747	// Serialize an array of form elements or a set of
9748	// key/values into a query string
9749	jQuery.param = function (a, traditional) {
9750		var prefix,
9751		    s = [],
9752		    add = function (key, value) {
9753
9754			// If value is a function, invoke it and return its value
9755			value = jQuery.isFunction(value) ? value() : value == null ? "" : value;
9756			s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
9757		};
9758
9759		// Set traditional to true for jQuery <= 1.3.2 behavior.
9760		if (traditional === undefined) {
9761			traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
9762		}
9763
9764		// If an array was passed in, assume that it is an array of form elements.
9765		if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
9766
9767			// Serialize the form elements
9768			jQuery.each(a, function () {
9769				add(this.name, this.value);
9770			});
9771		} else {
9772
9773			// If traditional, encode the "old" way (the way 1.3.2 or older
9774			// did it), otherwise encode params recursively.
9775			for (prefix in a) {
9776				buildParams(prefix, a[prefix], traditional, add);
9777			}
9778		}
9779
9780		// Return the resulting serialization
9781		return s.join("&").replace(r20, "+");
9782	};
9783
9784	jQuery.fn.extend({
9785		serialize: function () {
9786			return jQuery.param(this.serializeArray());
9787		},
9788		serializeArray: function () {
9789			return this.map(function () {
9790
9791				// Can add propHook for "elements" to filter or add form elements
9792				var elements = jQuery.prop(this, "elements");
9793				return elements ? jQuery.makeArray(elements) : this;
9794			}).filter(function () {
9795				var type = this.type;
9796
9797				// Use .is(":disabled") so that fieldset[disabled] works
9798				return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
9799			}).map(function (i, elem) {
9800				var val = jQuery(this).val();
9801
9802				return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val) {
9803					return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
9804				}) : { name: elem.name, value: val.replace(rCRLF, "\r\n") };
9805			}).get();
9806		}
9807	});
9808
9809	// Create the request object
9810	// (This is still attached to ajaxSettings for backward compatibility)
9811	jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
9812
9813	// Support: IE6-IE8
9814	function () {
9815
9816		// XHR cannot access local files, always use ActiveX for that case
9817		if (this.isLocal) {
9818			return createActiveXHR();
9819		}
9820
9821		// Support: IE 9-11
9822		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
9823		// is used. In IE 9+ always use the native XHR.
9824		// Note: this condition won't catch Edge as it doesn't define
9825		// document.documentMode but it also doesn't support ActiveX so it won't
9826		// reach this code.
9827		if (document.documentMode > 8) {
9828			return createStandardXHR();
9829		}
9830
9831		// Support: IE<9
9832		// oldIE XHR does not support non-RFC2616 methods (#13240)
9833		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
9834		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
9835		// Although this check for six methods instead of eight
9836		// since IE also does not support "trace" and "connect"
9837		return (/^(get|post|head|put|delete|options)$/i.test(this.type) && createStandardXHR() || createActiveXHR()
9838		);
9839	} :
9840
9841	// For all other browsers, use the standard XMLHttpRequest object
9842	createStandardXHR;
9843
9844	var xhrId = 0,
9845	    xhrCallbacks = {},
9846	    xhrSupported = jQuery.ajaxSettings.xhr();
9847
9848	// Support: IE<10
9849	// Open requests must be manually aborted on unload (#5280)
9850	// See https://support.microsoft.com/kb/2856746 for more info
9851	if (window.attachEvent) {
9852		window.attachEvent("onunload", function () {
9853			for (var key in xhrCallbacks) {
9854				xhrCallbacks[key](undefined, true);
9855			}
9856		});
9857	}
9858
9859	// Determine support properties
9860	support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
9861	xhrSupported = support.ajax = !!xhrSupported;
9862
9863	// Create transport if the browser can provide an xhr
9864	if (xhrSupported) {
9865
9866		jQuery.ajaxTransport(function (options) {
9867
9868			// Cross domain only allowed if supported through XMLHttpRequest
9869			if (!options.crossDomain || support.cors) {
9870
9871				var callback;
9872
9873				return {
9874					send: function (headers, complete) {
9875						var i,
9876						    xhr = options.xhr(),
9877						    id = ++xhrId;
9878
9879						// Open the socket
9880						xhr.open(options.type, options.url, options.async, options.username, options.password);
9881
9882						// Apply custom fields if provided
9883						if (options.xhrFields) {
9884							for (i in options.xhrFields) {
9885								xhr[i] = options.xhrFields[i];
9886							}
9887						}
9888
9889						// Override mime type if needed
9890						if (options.mimeType && xhr.overrideMimeType) {
9891							xhr.overrideMimeType(options.mimeType);
9892						}
9893
9894						// X-Requested-With header
9895						// For cross-domain requests, seeing as conditions for a preflight are
9896						// akin to a jigsaw puzzle, we simply never set it to be sure.
9897						// (it can always be set on a per-request basis or even using ajaxSetup)
vendor: 8,552 bytes, lines 9898-10207
9898						// For same-domain requests, won't change header if already provided.
9899						if (!options.crossDomain && !headers["X-Requested-With"]) {
9900							headers["X-Requested-With"] = "XMLHttpRequest";
9901						}
9902
9903						// Set headers
9904						for (i in headers) {
9905
9906							// Support: IE<9
9907							// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
9908							// request header to a null-value.
9909							//
9910							// To keep consistent with other XHR implementations, cast the value
9911							// to string and ignore `undefined`.
9912							if (headers[i] !== undefined) {
9913								xhr.setRequestHeader(i, headers[i] + "");
9914							}
9915						}
9916
9917						// Do send the request
9918						// This may raise an exception which is actually
9919						// handled in jQuery.ajax (so no try/catch here)
9920						xhr.send(options.hasContent && options.data || null);
9921
9922						// Listener
9923						callback = function (_, isAbort) {
9924							var status, statusText, responses;
9925
9926							// Was never called and is aborted or complete
9927							if (callback && (isAbort || xhr.readyState === 4)) {
9928
9929								// Clean up
9930								delete xhrCallbacks[id];
9931								callback = undefined;
9932								xhr.onreadystatechange = jQuery.noop;
9933
9934								// Abort manually if needed
9935								if (isAbort) {
9936									if (xhr.readyState !== 4) {
9937										xhr.abort();
9938									}
9939								} else {
9940									responses = {};
9941									status = xhr.status;
9942
9943									// Support: IE<10
9944									// Accessing binary-data responseText throws an exception
9945									// (#11426)
9946									if (typeof xhr.responseText === "string") {
9947										responses.text = xhr.responseText;
9948									}
9949
9950									// Firefox throws an exception when accessing
9951									// statusText for faulty cross-domain requests
9952									try {
9953										statusText = xhr.statusText;
9954									} catch (e) {
9955
9956										// We normalize with Webkit giving an empty statusText
9957										statusText = "";
9958									}
9959
9960									// Filter status for non standard behaviors
9961
9962									// If the request is local and we have data: assume a success
9963									// (success with no data won't get notified, that's the best we
9964									// can do given current implementations)
9965									if (!status && options.isLocal && !options.crossDomain) {
9966										status = responses.text ? 200 : 404;
9967
9968										// IE - #1450: sometimes returns 1223 when it should be 204
9969									} else if (status === 1223) {
9970										status = 204;
9971									}
9972								}
9973							}
9974
9975							// Call complete if needed
9976							if (responses) {
9977								complete(status, statusText, responses, xhr.getAllResponseHeaders());
9978							}
9979						};
9980
9981						// Do send the request
9982						// `xhr.send` may raise an exception, but it will be
9983						// handled in jQuery.ajax (so no try/catch here)
9984						if (!options.async) {
9985
9986							// If we're in sync mode we fire the callback
9987							callback();
9988						} else if (xhr.readyState === 4) {
9989
9990							// (IE6 & IE7) if it's in cache and has been
9991							// retrieved directly we need to fire the callback
9992							window.setTimeout(callback);
9993						} else {
9994
9995							// Register the callback, but delay it in case `xhr.send` throws
9996							// Add to the list of active xhr callbacks
9997							xhr.onreadystatechange = xhrCallbacks[id] = callback;
9998						}
9999					},
10000
10001					abort: function () {
10002						if (callback) {
10003							callback(undefined, true);
10004						}
10005					}
10006				};
10007			}
10008		});
10009	}
10010
10011	// Functions to create xhrs
10012	function createStandardXHR() {
10013		try {
10014			return new window.XMLHttpRequest();
10015		} catch (e) {}
10016	}
10017
10018	function createActiveXHR() {
10019		try {
10020			return new window.ActiveXObject("Microsoft.XMLHTTP");
10021		} catch (e) {}
10022	}
10023
10024	// Install script dataType
10025	jQuery.ajaxSetup({
10026		accepts: {
10027			script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
10028		},
10029		contents: {
10030			script: /\b(?:java|ecma)script\b/
10031		},
10032		converters: {
10033			"text script": function (text) {
10034				jQuery.globalEval(text);
10035				return text;
10036			}
10037		}
10038	});
10039
10040	// Handle cache's special case and global
10041	jQuery.ajaxPrefilter("script", function (s) {
10042		if (s.cache === undefined) {
10043			s.cache = false;
10044		}
10045		if (s.crossDomain) {
10046			s.type = "GET";
10047			s.global = false;
10048		}
10049	});
10050
10051	// Bind script tag hack transport
10052	jQuery.ajaxTransport("script", function (s) {
10053
10054		// This transport only deals with cross domain requests
10055		if (s.crossDomain) {
10056
10057			var script,
10058			    head = document.head || jQuery("head")[0] || document.documentElement;
10059
10060			return {
10061
10062				send: function (_, callback) {
10063
10064					script = document.createElement("script");
10065
10066					script.async = true;
10067
10068					if (s.scriptCharset) {
10069						script.charset = s.scriptCharset;
10070					}
10071
10072					script.src = s.url;
10073
10074					// Attach handlers for all browsers
10075					script.onload = script.onreadystatechange = function (_, isAbort) {
10076
10077						if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
10078
10079							// Handle memory leak in IE
10080							script.onload = script.onreadystatechange = null;
10081
10082							// Remove the script
10083							if (script.parentNode) {
10084								script.parentNode.removeChild(script);
10085							}
10086
10087							// Dereference the script
10088							script = null;
10089
10090							// Callback if not abort
10091							if (!isAbort) {
10092								callback(200, "success");
10093							}
10094						}
10095					};
10096
10097					// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
10098					// Use native DOM manipulation to avoid our domManip AJAX trickery
10099					head.insertBefore(script, head.firstChild);
10100				},
10101
10102				abort: function () {
10103					if (script) {
10104						script.onload(undefined, true);
10105					}
10106				}
10107			};
10108		}
10109	});
10110
10111	var oldCallbacks = [],
10112	    rjsonp = /(=)\?(?=&|$)|\?\?/;
10113
10114	// Default jsonp settings
10115	jQuery.ajaxSetup({
10116		jsonp: "callback",
10117		jsonpCallback: function () {
10118			var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
10119			this[callback] = true;
10120			return callback;
10121		}
10122	});
10123
10124	// Detect, normalize options and install callbacks for jsonp requests
10125	jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
10126
10127		var callbackName,
10128		    overwritten,
10129		    responseContainer,
10130		    jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");
10131
10132		// Handle iff the expected data type is "jsonp" or we have a parameter to set
10133		if (jsonProp || s.dataTypes[0] === "jsonp") {
10134
10135			// Get callback name, remembering preexisting value associated with it
10136			callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
10137
10138			// Insert callback into url or form data
10139			if (jsonProp) {
10140				s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
10141			} else if (s.jsonp !== false) {
10142				s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
10143			}
10144
10145			// Use data converter to retrieve json after script execution
10146			s.converters["script json"] = function () {
10147				if (!responseContainer) {
10148					jQuery.error(callbackName + " was not called");
10149				}
10150				return responseContainer[0];
10151			};
10152
10153			// force json dataType
10154			s.dataTypes[0] = "json";
10155
10156			// Install callback
10157			overwritten = window[callbackName];
10158			window[callbackName] = function () {
10159				responseContainer = arguments;
10160			};
10161
10162			// Clean-up function (fires after converters)
10163			jqXHR.always(function () {
10164
10165				// If previous value didn't exist - remove it
10166				if (overwritten === undefined) {
10167					jQuery(window).removeProp(callbackName);
10168
10169					// Otherwise restore preexisting value
10170				} else {
10171					window[callbackName] = overwritten;
10172				}
10173
10174				// Save back as free
10175				if (s[callbackName]) {
10176
10177					// make sure that re-using the options doesn't screw things around
10178					s.jsonpCallback = originalSettings.jsonpCallback;
10179
10180					// save the callback name for future use
10181					oldCallbacks.push(callbackName);
10182				}
10183
10184				// Call if it was a function and we have a response
10185				if (responseContainer && jQuery.isFunction(overwritten)) {
10186					overwritten(responseContainer[0]);
10187				}
10188
10189				responseContainer = overwritten = undefined;
10190			});
10191
10192			// Delegate to script
10193			return "script";
10194		}
10195	});
10196
10197	// data: string of html
10198	// context (optional): If specified, the fragment will be created in this context,
10199	// defaults to document
10200	// keepScripts (optional): If true, will include scripts passed in the html string
10201	jQuery.parseHTML = function (data, context, keepScripts) {
10202		if (!data || typeof data !== "string") {
10203			return null;
10204		}
10205		if (typeof context === "boolean") {
10206			keepScripts = context;
10207			context = false;
10208		}
10209		context = context || document;
10210
10211		var parsed = rsingleTag.exec(data),
10212		    scripts = !keepScripts && [];
10213
10214		// Single tag
10215		if (parsed) {
10216			return [context.createElement(parsed[1])];
10217		}
10218
10219		parsed = buildFragment([data], context, scripts);
10220
10221		if (scripts && scripts.length) {
10222			jQuery(scripts).remove();
10223		}
10224
10225		return jQuery.merge([], parsed.childNodes);
10226	};
10227
10228	// Keep a copy of the old load method
10229	var _load = jQuery.fn.load;
10230
10231	/**
10232  * Load a url into a page
10233  */
10234	jQuery.fn.load = function (url, params, callback) {
10235		if (typeof url !== "string" && _load) {
10236			return _load.apply(this, arguments);
10237		}
10238
10239		var selector,
10240		    type,
10241		    response,
10242		    self = this,
10243		    off = url.indexOf(" ");
10244
10245		if (off > -1) {
10246			selector = jQuery.trim(url.slice(off, url.length));
10247			url = url.slice(0, off);
10248		}
10249
10250		// If it's a function
10251		if (jQuery.isFunction(params)) {
10252
10253			// We assume that it's the callback
10254			callback = params;
10255			params = undefined;
10256
10257			// Otherwise, build a param string
10258		} else if (params && typeof params === "object") {
10259			type = "POST";
10260		}
10261
10262		// If we have elements to modify, make the request
10263		if (self.length > 0) {
10264			jQuery.ajax({
10265				url: url,
10266
10267				// If "type" variable is undefined, then "GET" method will be used.
10268				// Make value of this field explicit since
10269				// user can override it through ajaxSetup method
10270				type: type || "GET",
10271				dataType: "html",
10272				data: params
10273			}).done(function (responseText) {
10274
10275				// Save response for use in complete callback
10276				response = arguments;
10277
10278				self.html(selector ?
10279
10280				// If a selector was specified, locate the right elements in a dummy div
10281				// Exclude scripts to avoid IE 'Permission Denied' errors
10282				jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
10283
10284				// Otherwise use the full result
10285				responseText);
10286
10287				// If the request succeeds, this function gets "data", "status", "jqXHR"
10288				// but they are ignored because response was set above.
10289				// If it fails, this function gets "jqXHR", "status", "error"
10290			}).always(callback && function (jqXHR, status) {
10291				self.each(function () {
10292					callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
10293				});
10294			});
10295		}
10296
10297		return this;
10298	};
10299
10300	// Attach a bunch of functions for handling common AJAX events
10301	jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) {
10302		jQuery.fn[type] = function (fn) {
10303			return this.on(type, fn);
10304		};
10305	});
10306
10307	jQuery.expr.filters.animated = function (elem) {
10308		return jQuery.grep(jQuery.timers, function (fn) {
10309			return elem === fn.elem;
10310		}).length;
10311	};
10312
10313	/**
10314  * Gets a window from an element
10315  */
10316	function getWindow(elem) {
10317		return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false;
10318	}
10319
10320	jQuery.offset = {
10321		setOffset: function (elem, options, i) {
10322			var curPosition,
10323			    curLeft,
10324			    curCSSTop,
10325			    curTop,
10326			    curOffset,
10327			    curCSSLeft,
10328			    calculatePosition,
10329			    position = jQuery.css(elem, "position"),
10330			    curElem = jQuery(elem),
10331			    props = {};
10332
10333			// set position first, in-case top/left are set even on static elem
10334			if (position === "static") {
10335				elem.style.position = "relative";
10336			}
10337
10338			curOffset = curElem.offset();
10339			curCSSTop = jQuery.css(elem, "top");
10340			curCSSLeft = jQuery.css(elem, "left");
10341			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1;
10342
10343			// need to be able to calculate position if either top or left
10344			// is auto and position is either absolute or fixed
10345			if (calculatePosition) {
10346				curPosition = curElem.position();
10347				curTop = curPosition.top;
10348				curLeft = curPosition.left;
10349			} else {
10350				curTop = parseFloat(curCSSTop) || 0;
10351				curLeft = parseFloat(curCSSLeft) || 0;
10352			}
10353
10354			if (jQuery.isFunction(options)) {
10355
10356				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10357				options = options.call(elem, i, jQuery.extend({}, curOffset));
10358			}
10359
10360			if (options.top != null) {
10361				props.top = options.top - curOffset.top + curTop;
10362			}
10363			if (options.left != null) {
10364				props.left = options.left - curOffset.left + curLeft;
10365			}
10366
10367			if ("using" in options) {
10368				options.using.call(elem, props);
10369			} else {
10370				curElem.css(props);
10371			}
10372		}
10373	};
10374
10375	jQuery.fn.extend({
10376		offset: function (options) {
10377			if (arguments.length) {
vendor: 7,971 bytes, lines 10378-10625
10378				return options === undefined ? this : this.each(function (i) {
10379					jQuery.offset.setOffset(this, options, i);
10380				});
10381			}
10382
10383			var docElem,
10384			    win,
10385			    box = { top: 0, left: 0 },
10386			    elem = this[0],
10387			    doc = elem && elem.ownerDocument;
10388
10389			if (!doc) {
10390				return;
10391			}
10392
10393			docElem = doc.documentElement;
10394
10395			// Make sure it's not a disconnected DOM node
10396			if (!jQuery.contains(docElem, elem)) {
10397				return box;
10398			}
10399
10400			// If we don't have gBCR, just use 0,0 rather than error
10401			// BlackBerry 5, iOS 3 (original iPhone)
10402			if (typeof elem.getBoundingClientRect !== "undefined") {
10403				box = elem.getBoundingClientRect();
10404			}
10405			win = getWindow(doc);
10406			return {
10407				top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),
10408				left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
10409			};
10410		},
10411
10412		position: function () {
10413			if (!this[0]) {
10414				return;
10415			}
10416
10417			var offsetParent,
10418			    offset,
10419			    parentOffset = { top: 0, left: 0 },
10420			    elem = this[0];
10421
10422			// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10423			// because it is its only offset parent
10424			if (jQuery.css(elem, "position") === "fixed") {
10425
10426				// we assume that getBoundingClientRect is available when computed position is fixed
10427				offset = elem.getBoundingClientRect();
10428			} else {
10429
10430				// Get *real* offsetParent
10431				offsetParent = this.offsetParent();
10432
10433				// Get correct offsets
10434				offset = this.offset();
10435				if (!jQuery.nodeName(offsetParent[0], "html")) {
10436					parentOffset = offsetParent.offset();
10437				}
10438
10439				// Add offsetParent borders
10440				parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true);
10441				parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true);
10442			}
10443
10444			// Subtract parent offsets and element margins
10445			// note: when an element has margin: auto the offsetLeft and marginLeft
10446			// are the same in Safari causing offset.left to incorrectly be 0
10447			return {
10448				top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
10449				left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
10450			};
10451		},
10452
10453		offsetParent: function () {
10454			return this.map(function () {
10455				var offsetParent = this.offsetParent;
10456
10457				while (offsetParent && !jQuery.nodeName(offsetParent, "html") && jQuery.css(offsetParent, "position") === "static") {
10458					offsetParent = offsetParent.offsetParent;
10459				}
10460				return offsetParent || documentElement;
10461			});
10462		}
10463	});
10464
10465	// Create scrollLeft and scrollTop methods
10466	jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) {
10467		var top = /Y/.test(prop);
10468
10469		jQuery.fn[method] = function (val) {
10470			return access(this, function (elem, method, val) {
10471				var win = getWindow(elem);
10472
10473				if (val === undefined) {
10474					return win ? prop in win ? win[prop] : win.document.documentElement[method] : elem[method];
10475				}
10476
10477				if (win) {
10478					win.scrollTo(!top ? val : jQuery(win).scrollLeft(), top ? val : jQuery(win).scrollTop());
10479				} else {
10480					elem[method] = val;
10481				}
10482			}, method, val, arguments.length, null);
10483		};
10484	});
10485
10486	// Support: Safari<7-8+, Chrome<37-44+
10487	// Add the top/left cssHooks using jQuery.fn.position
10488	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10489	// getComputedStyle returns percent when specified for top/left/bottom/right
10490	// rather than make the css module depend on the offset module, we just check for it here
10491	jQuery.each(["top", "left"], function (i, prop) {
10492		jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
10493			if (computed) {
10494				computed = curCSS(elem, prop);
10495
10496				// if curCSS returns percentage, fallback to offset
10497				return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
10498			}
10499		});
10500	});
10501
10502	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10503	jQuery.each({ Height: "height", Width: "width" }, function (name, type) {
10504		jQuery.each({ padding: "inner" + name, content: type, "": "outer" + name }, function (defaultExtra, funcName) {
10505
10506			// margin is only for outerHeight, outerWidth
10507			jQuery.fn[funcName] = function (margin, value) {
10508				var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
10509				    extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
10510
10511				return access(this, function (elem, type, value) {
10512					var doc;
10513
10514					if (jQuery.isWindow(elem)) {
10515
10516						// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
10517						// isn't a whole lot we can do. See pull request at this URL for discussion:
10518						// https://github.com/jquery/jquery/pull/764
10519						return elem.document.documentElement["client" + name];
10520					}
10521
10522					// Get document width or height
10523					if (elem.nodeType === 9) {
10524						doc = elem.documentElement;
10525
10526						// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10527						// whichever is greatest
10528						// unfortunately, this causes bug #3838 in IE6/8 only,
10529						// but there is currently no good, small way to fix it.
10530						return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
10531					}
10532
10533					return value === undefined ?
10534
10535					// Get width or height on the element, requesting but not forcing parseFloat
10536					jQuery.css(elem, type, extra) :
10537
10538					// Set width or height on the element
10539					jQuery.style(elem, type, value, extra);
10540				}, type, chainable ? margin : undefined, chainable, null);
10541			};
10542		});
10543	});
10544
10545	jQuery.fn.extend({
10546
10547		bind: function (types, data, fn) {
10548			return this.on(types, null, data, fn);
10549		},
10550		unbind: function (types, fn) {
10551			return this.off(types, null, fn);
10552		},
10553
10554		delegate: function (selector, types, data, fn) {
10555			return this.on(types, selector, data, fn);
10556		},
10557		undelegate: function (selector, types, fn) {
10558
10559			// ( namespace ) or ( selector, types [, fn] )
10560			return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
10561		}
10562	});
10563
10564	// The number of elements contained in the matched element set
10565	jQuery.fn.size = function () {
10566		return this.length;
10567	};
10568
10569	jQuery.fn.andSelf = jQuery.fn.addBack;
10570
10571	// Register as a named AMD module, since jQuery can be concatenated with other
10572	// files that may use define, but not via a proper concatenation script that
10573	// understands anonymous AMD modules. A named AMD is safest and most robust
10574	// way to register. Lowercase jquery is used because AMD module names are
10575	// derived from file names, and jQuery is normally delivered in a lowercase
10576	// file name. Do this after creating the global so that if an AMD module wants
10577	// to call noConflict to hide this version of jQuery, it will work.
10578
10579	// Note that for maximum portability, libraries that are not jQuery should
10580	// declare themselves as anonymous modules, and avoid setting a global if an
10581	// AMD loader is present. jQuery is a special case. For more information, see
10582	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10583
10584	if (true) {
10585		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
10586			return jQuery;
10587		}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
10588				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
10589	}
10590
10591	var
10592
10593	// Map over jQuery in case of overwrite
10594	_jQuery = window.jQuery,
10595
10596
10597	// Map over the $ in case of overwrite
10598	_$ = window.$;
10599
10600	jQuery.noConflict = function (deep) {
10601		if (window.$ === jQuery) {
10602			window.$ = _$;
10603		}
10604
10605		if (deep && window.jQuery === jQuery) {
10606			window.jQuery = _jQuery;
10607		}
10608
10609		return jQuery;
10610	};
10611
10612	// Expose jQuery and $ identifiers, even in
10613	// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10614	// and CommonJS for browser emulators (#13566)
10615	if (!noGlobal) {
10616		window.jQuery = window.$ = jQuery;
10617	}
10618
10619	return jQuery;
10620});
10621
10622/***/ }),
10623/* 1 */,
10624/* 2 */,
10625/* 3 */
vendor: 10,907 bytes, lines 10626-11049
10626/***/ (function(module, exports) {
10627
10628/*
10629	MIT License http://www.opensource.org/licenses/mit-license.php
10630	Author Tobias Koppers @sokra
10631*/
10632// css base code, injected by the css-loader
10633module.exports = function (useSourceMap) {
10634	var list = [];
10635
10636	// return the list of modules as css string
10637	list.toString = function toString() {
10638		return this.map(function (item) {
10639			var content = cssWithMappingToString(item, useSourceMap);
10640			if (item[2]) {
10641				return "@media " + item[2] + "{" + content + "}";
10642			} else {
10643				return content;
10644			}
10645		}).join("");
10646	};
10647
10648	// import a list of modules into the list
10649	list.i = function (modules, mediaQuery) {
10650		if (typeof modules === "string") modules = [[null, modules, ""]];
10651		var alreadyImportedModules = {};
10652		for (var i = 0; i < this.length; i++) {
10653			var id = this[i][0];
10654			if (typeof id === "number") alreadyImportedModules[id] = true;
10655		}
10656		for (i = 0; i < modules.length; i++) {
10657			var item = modules[i];
10658			// skip already imported module
10659			// this implementation is not 100% perfect for weird media query combinations
10660			//  when a module is imported multiple times with different media queries.
10661			//  I hope this will never occur (Hey this way we have smaller bundles)
10662			if (typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
10663				if (mediaQuery && !item[2]) {
10664					item[2] = mediaQuery;
10665				} else if (mediaQuery) {
10666					item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
10667				}
10668				list.push(item);
10669			}
10670		}
10671	};
10672	return list;
10673};
10674
10675function cssWithMappingToString(item, useSourceMap) {
10676	var content = item[1] || '';
10677	var cssMapping = item[3];
10678	if (!cssMapping) {
10679		return content;
10680	}
10681
10682	if (useSourceMap && typeof btoa === 'function') {
10683		var sourceMapping = toComment(cssMapping);
10684		var sourceURLs = cssMapping.sources.map(function (source) {
10685			return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */';
10686		});
10687
10688		return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
10689	}
10690
10691	return [content].join('\n');
10692}
10693
10694// Adapted from convert-source-map (MIT)
10695function toComment(sourceMap) {
10696	// eslint-disable-next-line no-undef
10697	var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
10698	var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;
10699
10700	return '/*# ' + data + ' */';
10701}
10702
10703/***/ }),
10704/* 4 */
10705/***/ (function(module, exports, __webpack_require__) {
10706
10707/*
10708	MIT License http://www.opensource.org/licenses/mit-license.php
10709	Author Tobias Koppers @sokra
10710*/
10711
10712var stylesInDom = {};
10713
10714var	memoize = function (fn) {
10715	var memo;
10716
10717	return function () {
10718		if (typeof memo === "undefined") memo = fn.apply(this, arguments);
10719		return memo;
10720	};
10721};
10722
10723var isOldIE = memoize(function () {
10724	// Test for IE <= 9 as proposed by Browserhacks
10725	// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
10726	// Tests for existence of standard globals is to allow style-loader
10727	// to operate correctly into non-standard environments
10728	// @see https://github.com/webpack-contrib/style-loader/issues/177
10729	return window && document && document.all && !window.atob;
10730});
10731
10732var getElement = (function (fn) {
10733	var memo = {};
10734
10735	return function(selector) {
10736		if (typeof memo[selector] === "undefined") {
10737			memo[selector] = fn.call(this, selector);
10738		}
10739
10740		return memo[selector]
10741	};
10742})(function (target) {
10743	return document.querySelector(target)
10744});
10745
10746var singleton = null;
10747var	singletonCounter = 0;
10748var	stylesInsertedAtTop = [];
10749
10750var	fixUrls = __webpack_require__(11);
10751
10752module.exports = function(list, options) {
10753	if (typeof DEBUG !== "undefined" && DEBUG) {
10754		if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
10755	}
10756
10757	options = options || {};
10758
10759	options.attrs = typeof options.attrs === "object" ? options.attrs : {};
10760
10761	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
10762	// tags it will allow on a page
10763	if (!options.singleton) options.singleton = isOldIE();
10764
10765	// By default, add <style> tags to the <head> element
10766	if (!options.insertInto) options.insertInto = "head";
10767
10768	// By default, add <style> tags to the bottom of the target
10769	if (!options.insertAt) options.insertAt = "bottom";
10770
10771	var styles = listToStyles(list, options);
10772
10773	addStylesToDom(styles, options);
10774
10775	return function update (newList) {
10776		var mayRemove = [];
10777
10778		for (var i = 0; i < styles.length; i++) {
10779			var item = styles[i];
10780			var domStyle = stylesInDom[item.id];
10781
10782			domStyle.refs--;
10783			mayRemove.push(domStyle);
10784		}
10785
10786		if(newList) {
10787			var newStyles = listToStyles(newList, options);
10788			addStylesToDom(newStyles, options);
10789		}
10790
10791		for (var i = 0; i < mayRemove.length; i++) {
10792			var domStyle = mayRemove[i];
10793
10794			if(domStyle.refs === 0) {
10795				for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();
10796
10797				delete stylesInDom[domStyle.id];
10798			}
10799		}
10800	};
10801};
10802
10803function addStylesToDom (styles, options) {
10804	for (var i = 0; i < styles.length; i++) {
10805		var item = styles[i];
10806		var domStyle = stylesInDom[item.id];
10807
10808		if(domStyle) {
10809			domStyle.refs++;
10810
10811			for(var j = 0; j < domStyle.parts.length; j++) {
10812				domStyle.parts[j](item.parts[j]);
10813			}
10814
10815			for(; j < item.parts.length; j++) {
10816				domStyle.parts.push(addStyle(item.parts[j], options));
10817			}
10818		} else {
10819			var parts = [];
10820
10821			for(var j = 0; j < item.parts.length; j++) {
10822				parts.push(addStyle(item.parts[j], options));
10823			}
10824
10825			stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
10826		}
10827	}
10828}
10829
10830function listToStyles (list, options) {
10831	var styles = [];
10832	var newStyles = {};
10833
10834	for (var i = 0; i < list.length; i++) {
10835		var item = list[i];
10836		var id = options.base ? item[0] + options.base : item[0];
10837		var css = item[1];
10838		var media = item[2];
10839		var sourceMap = item[3];
10840		var part = {css: css, media: media, sourceMap: sourceMap};
10841
10842		if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});
10843		else newStyles[id].parts.push(part);
10844	}
10845
10846	return styles;
10847}
10848
10849function insertStyleElement (options, style) {
10850	var target = getElement(options.insertInto)
10851
10852	if (!target) {
10853		throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");
10854	}
10855
10856	var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];
10857
10858	if (options.insertAt === "top") {
10859		if (!lastStyleElementInsertedAtTop) {
10860			target.insertBefore(style, target.firstChild);
10861		} else if (lastStyleElementInsertedAtTop.nextSibling) {
10862			target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);
10863		} else {
10864			target.appendChild(style);
10865		}
10866		stylesInsertedAtTop.push(style);
10867	} else if (options.insertAt === "bottom") {
10868		target.appendChild(style);
10869	} else {
10870		throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
10871	}
10872}
10873
10874function removeStyleElement (style) {
10875	if (style.parentNode === null) return false;
10876	style.parentNode.removeChild(style);
10877
10878	var idx = stylesInsertedAtTop.indexOf(style);
10879	if(idx >= 0) {
10880		stylesInsertedAtTop.splice(idx, 1);
10881	}
10882}
10883
10884function createStyleElement (options) {
10885	var style = document.createElement("style");
10886
10887	options.attrs.type = "text/css";
10888
10889	addAttrs(style, options.attrs);
10890	insertStyleElement(options, style);
10891
10892	return style;
10893}
10894
10895function createLinkElement (options) {
10896	var link = document.createElement("link");
10897
10898	options.attrs.type = "text/css";
10899	options.attrs.rel = "stylesheet";
10900
10901	addAttrs(link, options.attrs);
10902	insertStyleElement(options, link);
10903
10904	return link;
10905}
10906
10907function addAttrs (el, attrs) {
10908	Object.keys(attrs).forEach(function (key) {
10909		el.setAttribute(key, attrs[key]);
10910	});
10911}
10912
10913function addStyle (obj, options) {
10914	var style, update, remove, result;
10915
10916	// If a transform function was defined, run it on the css
10917	if (options.transform && obj.css) {
10918	    result = options.transform(obj.css);
10919
10920	    if (result) {
10921	    	// If transform returns a value, use that instead of the original css.
10922	    	// This allows running runtime transformations on the css.
10923	    	obj.css = result;
10924	    } else {
10925	    	// If the transform function returns a falsy value, don't add this css.
10926	    	// This allows conditional loading of css
10927	    	return function() {
10928	    		// noop
10929	    	};
10930	    }
10931	}
10932
10933	if (options.singleton) {
10934		var styleIndex = singletonCounter++;
10935
10936		style = singleton || (singleton = createStyleElement(options));
10937
10938		update = applyToSingletonTag.bind(null, style, styleIndex, false);
10939		remove = applyToSingletonTag.bind(null, style, styleIndex, true);
10940
10941	} else if (
10942		obj.sourceMap &&
10943		typeof URL === "function" &&
10944		typeof URL.createObjectURL === "function" &&
10945		typeof URL.revokeObjectURL === "function" &&
10946		typeof Blob === "function" &&
10947		typeof btoa === "function"
10948	) {
10949		style = createLinkElement(options);
10950		update = updateLink.bind(null, style, options);
10951		remove = function () {
10952			removeStyleElement(style);
10953
10954			if(style.href) URL.revokeObjectURL(style.href);
10955		};
10956	} else {
10957		style = createStyleElement(options);
10958		update = applyToTag.bind(null, style);
10959		remove = function () {
10960			removeStyleElement(style);
10961		};
10962	}
10963
10964	update(obj);
10965
10966	return function updateStyle (newObj) {
10967		if (newObj) {
10968			if (
10969				newObj.css === obj.css &&
10970				newObj.media === obj.media &&
10971				newObj.sourceMap === obj.sourceMap
10972			) {
10973				return;
10974			}
10975
10976			update(obj = newObj);
10977		} else {
10978			remove();
10979		}
10980	};
10981}
10982
10983var replaceText = (function () {
10984	var textStore = [];
10985
10986	return function (index, replacement) {
10987		textStore[index] = replacement;
10988
10989		return textStore.filter(Boolean).join('\n');
10990	};
10991})();
10992
10993function applyToSingletonTag (style, index, remove, obj) {
10994	var css = remove ? "" : obj.css;
10995
10996	if (style.styleSheet) {
10997		style.styleSheet.cssText = replaceText(index, css);
10998	} else {
10999		var cssNode = document.createTextNode(css);
11000		var childNodes = style.childNodes;
11001
11002		if (childNodes[index]) style.removeChild(childNodes[index]);
11003
11004		if (childNodes.length) {
11005			style.insertBefore(cssNode, childNodes[index]);
11006		} else {
11007			style.appendChild(cssNode);
11008		}
11009	}
11010}
11011
11012function applyToTag (style, obj) {
11013	var css = obj.css;
11014	var media = obj.media;
11015
11016	if(media) {
11017		style.setAttribute("media", media)
11018	}
11019
11020	if(style.styleSheet) {
11021		style.styleSheet.cssText = css;
11022	} else {
11023		while(style.firstChild) {
11024			style.removeChild(style.firstChild);
11025		}
11026
11027		style.appendChild(document.createTextNode(css));
11028	}
11029}
11030
11031function updateLink (link, options, obj) {
11032	var css = obj.css;
11033	var sourceMap = obj.sourceMap;
11034
11035	/*
11036		If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled
11037		and there is no publicPath defined then lets turn convertToAbsoluteUrls
11038		on by default.  Otherwise default to the convertToAbsoluteUrls option
11039		directly
11040	*/
11041	var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;
11042
11043	if (options.convertToAbsoluteUrls || autoFixUrls) {
11044		css = fixUrls(css);
11045	}
11046
11047	if (sourceMap) {
11048		// http://stackoverflow.com/a/26603875
11049		css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)
11049))) + " */";
11050	}
11051
11052	var blob = new Blob([css], { type: "text/css" });
11053
11054	var oldSrc = link.href;
11055
11056	link.href = URL.createObjectURL(blob);
11057
11058	if(oldSrc) URL.revokeObjectURL(oldSrc);
11059}
11060
11061
11062/***/ }),
11063/* 5 */,
11064/* 6 */,
11065/* 7 */,
11066/* 8 */,
11067/* 9 */,
11068/* 10 */,
11069/* 11 */
11070/***/ (function(module, exports) {
11071
11072
11073/**
11074 * When source maps are enabled, `style-loader` uses a link element with a data-uri to
11075 * embed the css on the page. This breaks all relative urls because now they are relative to a
11076 * bundle instead of the current page.
11077 *
11078 * One solution is to only use full urls, but that may be impossible.
11079 *
11080 * Instead, this function "fixes" the relative urls to be absolute according to the current page location.
11081 *
11082 * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.
11083 *
11084 */
11085
11086module.exports = function (css) {
11087	// get current location
11088	var location = typeof window !== "undefined" && window.location;
11089
11090	if (!location) {
11091		throw new Error("fixUrls requires window.location");
11092	}
11093
11094	// blank or null?
11095	if (!css || typeof css !== "string") {
11096		return css;
11097	}
11098
11099	var baseUrl = location.protocol + "//" + location.host;
11100	var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");
11101
11102	// convert each url(...)
11103	/*
11104 This regular expression is just a way to recursively match brackets within
11105 a string.
11106 	 /url\s*\(  = Match on the word "url" with any whitespace after it and then a parens
11107    (  = Start a capturing group
11108      (?:  = Start a non-capturing group
11109          [^)(]  = Match anything that isn't a parentheses
11110          |  = OR
11111          \(  = Match a start parentheses
11112              (?:  = Start another non-capturing groups
11113                  [^)(]+  = Match anything that isn't a parentheses
11114                  |  = OR
11115                  \(  = Match a start parentheses
11116                      [^)(]*  = Match anything that isn't a parentheses
11117                  \)  = Match a end parentheses
11118              )  = End Group
11119              *\) = Match anything and then a close parens
11120          )  = Close non-capturing group
11121          *  = Match anything
11122       )  = Close capturing group
11123  \)  = Match a close parens
11124 	 /gi  = Get all matches, not the first.  Be case insensitive.
11125  */
11126	var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function (fullMatch, origUrl) {
11127		// strip quotes (if they exist)
11128		var unquotedOrigUrl = origUrl.trim().replace(/^"(.*)"$/, function (o, $1) {
11129			return $1;
11130		}).replace(/^'(.*)'$/, function (o, $1) {
11131			return $1;
11132		});
11133
11134		// already a full url? no change
11135		if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) {
11136			return fullMatch;
11137		}
11138
11139		// convert the url to a full url
11140		var newUrl;
11141
11142		if (unquotedOrigUrl.indexOf("//") === 0) {
11143			//TODO: should we add protocol?
11144			newUrl = unquotedOrigUrl;
11145		} else if (unquotedOrigUrl.indexOf("/") === 0) {
11146			// path should be relative to the base url
11147			newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'
11148		} else {
11149			// path should be relative to current directory
11150			newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'
11151		}
11152
11153		// send back the fixed url(...)
11154		return "url(" + JSON.stringify(newUrl) + ")";
11155	});
11156
11157	// send back the fixed css
11158	return fixedCss;
11159};
11160
11161/***/ }),
11162/* 12 */,
11163/* 13 */,
11164/* 14 */,
11165/* 15 */,
11166/* 16 */,
11167/* 17 */,
11168/* 18 */,
11169/* 19 */,
11170/* 20 */,
11171/* 21 */,
11172/* 22 */,
11173/* 23 */,
11174/* 24 */,
11175/* 25 */,
11176/* 26 */,
11177/* 27 */
11178/***/ (function(module, exports, __webpack_require__) {
11179
11180var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*
11181     _ _      _       _
11182 ___| (_) ___| | __  (_)___
11183/ __| | |/ __| |/ /  | / __|
11184\__ \ | | (__|   < _ | \__ \
11185|___/_|_|\___|_|\_(_)/ |___/
11186                   |__/
11187
11188 Version: 1.9.0
11189  Author: Ken Wheeler
11190 Website: http://kenwheeler.github.io
11191    Docs: http://kenwheeler.github.io/slick
11192    Repo: http://github.com/kenwheeler/slick
11193  Issues: http://github.com/kenwheeler/slick/issues
11194
11195 */
11196/* global window, document, define, jQuery, setInterval, clearInterval */
11197(function (factory) {
11198
11199  if (true) {
11200    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
11201				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
11202				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
11203				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
11204  } else if (typeof exports !== 'undefined') {
11205    module.exports = factory(require('jquery'));
11206  } else {
11207    factory(jQuery);
11208  }
11209})($ => {
11210  'use strict';
11211
11212  var Slick = window.Slick || {};
11213
11214  Slick = function () {
11215    let instanceUid = 0;
11216
11217    function Slick(element, settings) {
11218      let _ = this,
11219          dataSettings;
11220
11221      _.defaults = {
11222        accessibility: true,
11223        adaptiveHeight: false,
11224        appendArrows: $(element),
11225        appendDots: $(element),
11226        arrows: true,
11227        asNavFor: null,
11228        prevArrow: '<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',
11229        nextArrow: '<button class="slick-next" aria-label="Next" type="button">Next</button>',
11230        autoplay: false,
11231        autoplaySpeed: 3000,
11232        centerMode: false,
11233        centerPadding: '50px',
11234        cssEase: 'ease',
11235        customPaging: function (slider, i) {
11236          return $('<button type="button" />').text(i + 1);
11237        },
11238        dots: false,
11239        dotsClass: 'slick-dots',
11240        draggable: true,
11241        easing: 'linear',
11242        edgeFriction: 0.35,
11243        fade: false,
11244        focusOnSelect: false,
11245        focusOnChange: false,
11246        infinite: true,
11247        initialSlide: 0,
11248        lazyLoad: 'ondemand',
11249        mobileFirst: false,
11250        pauseOnHover: true,
11251        pauseOnFocus: true,
11252        pauseOnDotsHover: false,
11253        respondTo: 'window',
11254        responsive: null,
11255        rows: 1,
11256        rtl: false,
11257        slide: '',
11258        slidesPerRow: 1,
11259        slidesToShow: 1,
11260        slidesToScroll: 1,
11261        speed: 500,
11262        swipe: true,
11263        swipeToSlide: false,
11264        touchMove: true,
11265        touchThreshold: 5,
11266        useCSS: true,
11267        useTransform: true,
11268        variableWidth: false,
11269        vertical: false,
11270        verticalSwiping: false,
11271        waitForAnimate: true,
11272        zIndex: 1000
11273      };
11274
11275      _.initials = {
11276        animating: false,
11277        dragging: false,
11278        autoPlayTimer: null,
11279        currentDirection: 0,
11280        currentLeft: null,
11281        currentSlide: 0,
11282        direction: 1,
11283        $dots: null,
11284        listWidth: null,
11285        listHeight: null,
11286        loadIndex: 0,
11287        $nextArrow: null,
11288        $prevArrow: null,
11289        scrolling: false,
11290        slideCount: null,
11291        slideWidth: null,
11292        $slideTrack: null,
11293        $slides: null,
11294        sliding: false,
11295        slideOffset: 0,
11296        swipeLeft: null,
11297        swiping: false,
11298        $list: null,
11299        touchObject: {},
11300        transformsEnabled: false,
11301        unslicked: false
11302      };
11303
11304      $.extend(_, _.initials);
11305
11306      _.activeBreakpoint = null;
11307      _.animType = null;
11308      _.animProp = null;
11309      _.breakpoints = [];
11310      _.breakpointSettings = [];
11311      _.cssTransitions = false;
11312      _.focussed = false;
11313      _.interrupted = false;
11314      _.hidden = 'hidden';
11315      _.paused = true;
11316      _.positionProp = null;
11317      _.respondTo = null;
11318      _.rowCount = 1;
11319      _.shouldClick = true;
11320      _.$slider = $(element);
11321      _.$slidesCache = null;
11322      _.transformType = null;
11323      _.transitionType = null;
11324      _.visibilityChange = 'visibilitychange';
11325      _.windowWidth = 0;
11326      _.windowTimer = null;
11327
11328      dataSettings = $(element).data('slick') || {};
11329
11330      _.options = $.extend({}, _.defaults, settings, dataSettings);
11331
11332      _.currentSlide = _.options.initialSlide;
11333
11334      _.originalSettings = _.options;
11335
11336      if (typeof document.mozHidden !== 'undefined') {
11337        _.hidden = 'mozHidden';
11338        _.visibilityChange = 'mozvisibilitychange';
11339      } else if (typeof document.webkitHidden !== 'undefined') {
11340        _.hidden = 'webkitHidden';
11341        _.visibilityChange = 'webkitvisibilitychange';
11342      }
11343
11344      _.autoPlay = $.proxy(_.autoPlay, _);
11345      _.autoPlayClear = $.proxy(_.autoPlayClear, _);
11346      _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);
11347      _.changeSlide = $.proxy(_.changeSlide, _);
11348      _.clickHandler = $.proxy(_.clickHandler, _);
11349      _.selectHandler = $.proxy(_.selectHandler, _);
11350      _.setPosition = $.proxy(_.setPosition, _);
11351      _.swipeHandler = $.proxy(_.swipeHandler, _);
11352      _.dragHandler = $.proxy(_.dragHandler, _);
11353      _.keyHandler = $.proxy(_.keyHandler, _);
11354
11355      _.instanceUid = instanceUid++;
11356
11357      // A simple way to check for HTML strings
11358      // Strict HTML recognition (must start with <)
11359      // Extracted from jQuery v1.11 source
11360      _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/;
11361
11362      _.registerBreakpoints();
11363      _.init(true);
11364    }
11365
11366    return Slick;
11367  }();
11368
11369  Slick.prototype.activateADA = function () {
11370    var _ = this;
11371
11372    _.$slideTrack.find('.slick-active').attr({
11373      'aria-hidden': 'false'
11374    }).find('a, input, button, select').attr({
11375      'tabindex': '0'
11376    });
11377  };
11378
11379  Slick.prototype.addSlide = Slick.prototype.slickAdd = function (markup, index, addBefore) {
11380    let _ = this;
11381
11382    if (typeof index === 'boolean') {
11383      addBefore = index;
11384      index = null;
11385    } else if (index < 0 || index >= _.slideCount) {
11386      return false;
vendor: 7,284 bytes, lines 11387-11649
11387    }
11388
11389    _.unload();
11390
11391    if (typeof index === 'number') {
11392      if (index === 0 && _.$slides.length === 0) {
11393        $(markup).appendTo(_.$slideTrack);
11394      } else if (addBefore) {
11395        $(markup).insertBefore(_.$slides.eq(index));
11396      } else {
11397        $(markup).insertAfter(_.$slides.eq(index));
11398      }
11399    } else if (addBefore === true) {
11400      $(markup).prependTo(_.$slideTrack);
11401    } else {
11402      $(markup).appendTo(_.$slideTrack);
11403    }
11404
11405    _.$slides = _.$slideTrack.children(this.options.slide);
11406
11407    _.$slideTrack.children(this.options.slide).detach();
11408
11409    _.$slideTrack.append(_.$slides);
11410
11411    _.$slides.each((index, element) => {
11412      $(element).attr('data-slick-index', index);
11413    });
11414
11415    _.$slidesCache = _.$slides;
11416
11417    _.reinit();
11418  };
11419
11420  Slick.prototype.animateHeight = function () {
11421    var _ = this;
11422    if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
11423      var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
11424      _.$list.animate({
11425        height: targetHeight
11426      }, _.options.speed);
11427    }
11428  };
11429
11430  Slick.prototype.animateSlide = function (targetLeft, callback) {
11431    let animProps = {},
11432        _ = this;
11433
11434    _.animateHeight();
11435
11436    if (_.options.rtl === true && _.options.vertical === false) {
11437      targetLeft = -targetLeft;
11438    }
11439    if (_.transformsEnabled === false) {
11440      if (_.options.vertical === false) {
11441        _.$slideTrack.animate({
11442          left: targetLeft
11443        }, _.options.speed, _.options.easing, callback);
11444      } else {
11445        _.$slideTrack.animate({
11446          top: targetLeft
11447        }, _.options.speed, _.options.easing, callback);
11448      }
11449    } else if (_.cssTransitions === false) {
11450      if (_.options.rtl === true) {
11451        _.currentLeft = -_.currentLeft;
11452      }
11453      $({
11454        animStart: _.currentLeft
11455      }).animate({
11456        animStart: targetLeft
11457      }, {
11458        duration: _.options.speed,
11459        easing: _.options.easing,
11460        step: function (now) {
11461          now = Math.ceil(now);
11462          if (_.options.vertical === false) {
11463            animProps[_.animType] = 'translate(' + now + 'px, 0px)';
11464            _.$slideTrack.css(animProps);
11465          } else {
11466            animProps[_.animType] = 'translate(0px,' + now + 'px)';
11467            _.$slideTrack.css(animProps);
11468          }
11469        },
11470        complete: function () {
11471          if (callback) {
11472            callback.call();
11473          }
11474        }
11475      });
11476    } else {
11477
11478      _.applyTransition();
11479      targetLeft = Math.ceil(targetLeft);
11480
11481      if (_.options.vertical === false) {
11482        animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';
11483      } else {
11484        animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';
11485      }
11486      _.$slideTrack.css(animProps);
11487
11488      if (callback) {
11489        setTimeout(function () {
11490
11491          _.disableTransition();
11492
11493          callback.call();
11494        }, _.options.speed);
11495      }
11496    }
11497  };
11498
11499  Slick.prototype.getNavTarget = function () {
11500    let _ = this,
11501        asNavFor = _.options.asNavFor;
11502
11503    if (asNavFor && asNavFor !== null) {
11504      asNavFor = $(asNavFor).not(_.$slider);
11505    }
11506
11507    return asNavFor;
11508  };
11509
11510  Slick.prototype.asNavFor = function (index) {
11511    let _ = this,
11512        asNavFor = _.getNavTarget();
11513
11514    if (asNavFor !== null && typeof asNavFor === 'object') {
11515      asNavFor.each(function () {
11516        var target = $(this).slick('getSlick');
11517        if (!target.unslicked) {
11518          target.slideHandler(index, true);
11519        }
11520      });
11521    }
11522  };
11523
11524  Slick.prototype.applyTransition = function (slide) {
11525    let _ = this,
11526        transition = {};
11527
11528    if (_.options.fade === false) {
11529      transition[_.transitionType] = `${_.transformType} ${_.options.speed}ms ${_.options.cssEase}`;
11530    } else {
11531      transition[_.transitionType] = `opacity ${_.options.speed}ms ${_.options.cssEase}`;
11532    }
11533
11534    if (_.options.fade === false) {
11535      _.$slideTrack.css(transition);
11536    } else {
11537      _.$slides.eq(slide).css(transition);
11538    }
11539  };
11540
11541  Slick.prototype.autoPlay = function () {
11542    let _ = this;
11543
11544    _.autoPlayClear();
11545
11546    if (_.slideCount > _.options.slidesToShow) {
11547      _.autoPlayTimer = setInterval(_.autoPlayIterator, _.options.autoplaySpeed);
11548    }
11549  };
11550
11551  Slick.prototype.autoPlayClear = function () {
11552    let _ = this;
11553
11554    if (_.autoPlayTimer) {
11555      clearInterval(_.autoPlayTimer);
11556    }
11557  };
11558
11559  Slick.prototype.autoPlayIterator = function () {
11560    let _ = this,
11561        slideTo = _.currentSlide + _.options.slidesToScroll;
11562
11563    if (!_.paused && !_.interrupted && !_.focussed) {
11564      if (_.options.infinite === false) {
11565        if (_.direction === 1 && _.currentSlide + 1 === _.slideCount - 1) {
11566          _.direction = 0;
11567        } else if (_.direction === 0) {
11568          slideTo = _.currentSlide - _.options.slidesToScroll;
11569
11570          if (_.currentSlide - 1 === 0) {
11571            _.direction = 1;
11572          }
11573        }
11574      }
11575
11576      _.slideHandler(slideTo);
11577    }
11578  };
11579
11580  Slick.prototype.buildArrows = function () {
11581    let _ = this;
11582
11583    if (_.options.arrows === true) {
11584      _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow');
11585      _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow');
11586
11587      if (_.slideCount > _.options.slidesToShow) {
11588        _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');
11589        _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');
11590
11591        if (_.htmlExpr.test(_.options.prevArrow)) {
11592          _.$prevArrow.prependTo(_.options.appendArrows);
11593        }
11594
11595        if (_.htmlExpr.test(_.options.nextArrow)) {
11596          _.$nextArrow.appendTo(_.options.appendArrows);
11597        }
11598
11599        if (_.options.infinite !== true) {
11600          _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
11601        }
11602      } else {
11603        _.$prevArrow.add(_.$nextArrow).addClass('slick-hidden').attr({
11604          'aria-disabled': 'true',
11605          'tabindex': '-1'
11606        });
11607      }
11608    }
11609  };
11610
11611  Slick.prototype.buildDots = function () {
11612    let _ = this,
11613        i,
11614        dot;
11615
11616    if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
11617      _.$slider.addClass('slick-dotted');
11618
11619      dot = $('<ul />').addClass(_.options.dotsClass);
11620
11621      for (i = 0; i <= _.getDotCount(); i += 1) {
11622        dot.append($('<li />').append(_.options.customPaging.call(this, _, i)));
11623      }
11624
11625      _.$dots = dot.appendTo(_.options.appendDots);
11626
11627      _.$dots.find('li').first().addClass('slick-active');
11628    }
11629  };
11630
11631  Slick.prototype.buildOut = function () {
11632    let _ = this;
11633
11634    _.$slides = _.$slider.children(_.options.slide + ':not(.slick-cloned)').addClass('slick-slide');
11635
11636    _.slideCount = _.$slides.length;
11637
11638    _.$slides.each((index, element) => {
11639      $(element).attr('data-slick-index', index).data('originalStyling', $(element).attr('style') || '');
11640    });
11641
11642    _.$slider.addClass('slick-slider');
11643
11644    _.$slideTrack = _.slideCount === 0 ? $('<div class="slick-track"/>').appendTo(_.$slider) : _.$slides.wrapAll('<div class="slick-track"/>').parent();
11645
11646    _.$list = _.$slideTrack.wrap('<div class="slick-list"/>').parent();
11647    _.$slideTrack.css('opacity', 0);
11648
11649    if (_.options.centerMode === true || _.options.swipeToSlide === true) {
11650      _.options.slidesToScroll = 1;
11651    }
11652
11653    $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');
11654
11655    _.setupInfinite();
11656
11657    _.buildArrows();
11658
11659    _.buildDots();
11660
11661    _.updateDots();
11662
11663    _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);
11664
11665    if (_.options.draggable === true) {
11666      _.$list.addClass('draggable');
11667    }
11668  };
11669
11670  Slick.prototype.buildRows = function () {
11671    let _ = this,
11672        a,
11673        b,
11674        c,
11675        newSlides,
11676        numOfSlides,
11677        originalSlides,
11678        slidesPerSection;
11679
11680    newSlides = document.createDocumentFragment();
11681    originalSlides = _.$slider.children();
11682
11683    if (_.options.rows > 0) {
11684      slidesPerSection = _.options.slidesPerRow * _.options.rows;
11685      numOfSlides = Math.ceil(originalSlides.length / slidesPerSection);
11686
11687      for (a = 0; a < numOfSlides; a++) {
11688        var slide = document.createElement('div');
11689        for (b = 0; b < _.options.rows; b++) {
11690          var row = document.createElement('div');
11691          for (c = 0; c < _.options.slidesPerRow; c++) {
11692            var target = a * slidesPerSection + (b * _.options.slidesPerRow + c);
11693            if (originalSlides.get(target)) {
11694              row.appendChild(originalSlides.get(target));
11695            }
11696          }
11697          slide.appendChild(row);
11698        }
11699        newSlides.appendChild(slide);
11700      }
11701
11702      _.$slider.empty().append(newSlides);
11703      _.$slider.children().children().children().css({
11704        'width': 100 / _.options.slidesPerRow + '%',
11705        'display': 'inline-block'
11706      });
11707    }
11708  };
11709
11710  Slick.prototype.checkResponsive = function (initial, forceUpdate) {
11711    let _ = this,
11712        breakpoint,
11713        targetBreakpoint,
11714        respondToWidth,
11715        triggerBreakpoint = false;
11716    var sliderWidth = _.$slider.width();
11717    var windowWidth = window.innerWidth || $(window).width();
11718
11719    if (_.respondTo === 'window') {
11720      respondToWidth = windowWidth;
11721    } else if (_.respondTo === 'slider') {
11722      respondToWidth = sliderWidth;
11723    } else if (_.respondTo === 'min') {
11724      respondToWidth = Math.min(windowWidth, sliderWidth);
11725    }
11726
11727    if (_.options.responsive && _.options.responsive.length && _.options.responsive !== null) {
11728      targetBreakpoint = null;
11729
11730      for (breakpoint in _.breakpoints) {
11731        if (_.breakpoints.hasOwnProperty(breakpoint)) {
11732          if (_.originalSettings.mobileFirst === false) {
11733            if (respondToWidth < _.breakpoints[breakpoint]) {
11734              targetBreakpoint = _.breakpoints[breakpoint];
11735            }
11736          } else if (respondToWidth > _.breakpoints[breakpoint]) {
11737            targetBreakpoint = _.breakpoints[breakpoint];
11738          }
11739        }
11740      }
11741
11742      if (targetBreakpoint !== null) {
11743        if (_.activeBreakpoint !== null) {
11744          if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {
11745            _.activeBreakpoint = targetBreakpoint;
11746            if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
11747              _.unslick(targetBreakpoint);
11748            } else {
11749              _.options = $.extend({}, _.originalSettings, _.breakpointSettings[targetBreakpoint]);
11750              if (initial === true) {
11751                _.currentSlide = _.options.initialSlide;
11752              }
11753              _.refresh(initial);
11754            }
11755            triggerBreakpoint = targetBreakpoint;
11756          }
11757        } else {
11758          _.activeBreakpoint = targetBreakpoint;
11759          if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
11760            _.unslick(targetBreakpoint);
11761          } else {
11762            _.options = $.extend({}, _.originalSettings, _.breakpointSettings[targetBreakpoint]);
11763            if (initial === true) {
11764              _.currentSlide = _.options.initialSlide;
11765            }
11766            _.refresh(initial);
11767          }
11768          triggerBreakpoint = targetBreakpoint;
11769        }
11770      } else if (_.activeBreakpoint !== null) {
11771        _.activeBreakpoint = null;
11772        _.options = _.originalSettings;
11773        if (initial === true) {
11774          _.currentSlide = _.options.initialSlide;
11775        }
11776        _.refresh(initial);
vendor: 7,622 bytes, lines 11777-12055
11777        triggerBreakpoint = targetBreakpoint;
11778      }
11779
11780      // only trigger breakpoints during an actual break. not on initialize.
11781      if (!initial && triggerBreakpoint !== false) {
11782        _.$slider.trigger('breakpoint', [_, triggerBreakpoint]);
11783      }
11784    }
11785  };
11786
11787  Slick.prototype.changeSlide = function (event, dontAnimate) {
11788
11789    var _ = this,
11790        $target = $(event.currentTarget),
11791        indexOffset,
11792        slideOffset,
11793        unevenOffset;
11794
11795    // If target is a link, prevent default action.
11796    if ($target.is('a')) {
11797      event.preventDefault();
11798    }
11799
11800    // If target is not the <li> element (ie: a child), find the <li>.
11801    if (!$target.is('li')) {
11802      $target = $target.closest('li');
11803    }
11804
11805    unevenOffset = _.slideCount % _.options.slidesToScroll !== 0;
11806    indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;
11807
11808    switch (event.data.message) {
11809
11810      case 'previous':
11811        slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;
11812        if (_.slideCount > _.options.slidesToShow) {
11813          _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);
11814        }
11815        break;
11816
11817      case 'next':
11818        slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;
11819        if (_.slideCount > _.options.slidesToShow) {
11820          _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);
11821        }
11822        break;
11823
11824      case 'index':
11825        var index = event.data.index === 0 ? 0 : event.data.index || $target.index() * _.options.slidesToScroll;
11826
11827        _.slideHandler(_.checkNavigable(index), false, dontAnimate);
11828        $target.children().trigger('focus');
11829        break;
11830
11831      default:
11832
11833    }
11834  };
11835
11836  Slick.prototype.checkNavigable = function (index) {
11837    let _ = this,
11838        navigables,
11839        prevNavigable;
11840
11841    navigables = _.getNavigableIndexes();
11842    prevNavigable = 0;
11843    if (index > navigables[navigables.length - 1]) {
11844      index = navigables[navigables.length - 1];
11845    } else {
11846      for (let n in navigables) {
11847        if (index < navigables[n]) {
11848          index = prevNavigable;
11849          break;
11850        }
11851        prevNavigable = navigables[n];
11852      }
11853    }
11854
11855    return index;
11856  };
11857
11858  Slick.prototype.cleanUpEvents = function () {
11859    let _ = this;
11860
11861    if (_.options.dots && _.$dots !== null) {
11862      $('li', _.$dots).off('click.slick', _.changeSlide).off('mouseenter.slick', $.proxy(_.interrupt, _, true)).off('mouseleave.slick', $.proxy(_.interrupt, _, false));
11863
11864      if (_.options.accessibility === true) {
11865        _.$dots.off('keydown.slick', _.keyHandler);
11866      }
11867    }
11868
11869    _.$slider.off('focus.slick blur.slick');
11870
11871    if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
11872      _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);
11873      _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);
11874
11875      if (_.options.accessibility === true) {
11876        _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler);
11877        _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler);
11878      }
11879    }
11880
11881    _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);
11882    _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);
11883    _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);
11884    _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);
11885
11886    _.$list.off('click.slick', _.clickHandler);
11887
11888    $(document).off(_.visibilityChange, _.visibility);
11889
11890    _.cleanUpSlideEvents();
11891
11892    if (_.options.accessibility === true) {
11893      _.$list.off('keydown.slick', _.keyHandler);
11894    }
11895
11896    if (_.options.focusOnSelect === true) {
11897      $(_.$slideTrack).children().off('click.slick', _.selectHandler);
11898    }
11899
11900    $(window).off(`orientationchange.slick.slick-${_.instanceUid}`, _.orientationChange);
11901
11902    $(window).off(`resize.slick.slick-${_.instanceUid}`, _.resize);
11903
11904    $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);
11905
11906    $(window).off(`load.slick.slick-${_.instanceUid}`, _.setPosition);
11907  };
11908
11909  Slick.prototype.cleanUpSlideEvents = function () {
11910    let _ = this;
11911
11912    _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true));
11913    _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false));
11914  };
11915
11916  Slick.prototype.cleanUpRows = function () {
11917    let _ = this,
11918        originalSlides;
11919
11920    if (_.options.rows > 0) {
11921      originalSlides = _.$slides.children().children();
11922      originalSlides.removeAttr('style');
11923      _.$slider.empty().append(originalSlides);
11924    }
11925  };
11926
11927  Slick.prototype.clickHandler = function (event) {
11928    let _ = this;
11929
11930    if (_.shouldClick === false) {
11931      event.stopImmediatePropagation();
11932      event.stopPropagation();
11933      event.preventDefault();
11934    }
11935  };
11936
11937  Slick.prototype.destroy = function (refresh) {
11938    let _ = this;
11939
11940    _.autoPlayClear();
11941
11942    _.touchObject = {};
11943
11944    _.cleanUpEvents();
11945
11946    $('.slick-cloned', _.$slider).detach();
11947
11948    if (_.$dots) {
11949      _.$dots.remove();
11950    }
11951
11952    if (_.$prevArrow && _.$prevArrow.length) {
11953      _.$prevArrow.removeClass('slick-disabled slick-arrow slick-hidden').removeAttr('aria-hidden aria-disabled tabindex').css('display', '');
11954
11955      if (_.htmlExpr.test(_.options.prevArrow)) {
11956        _.$prevArrow.remove();
11957      }
11958    }
11959
11960    if (_.$nextArrow && _.$nextArrow.length) {
11961      _.$nextArrow.removeClass('slick-disabled slick-arrow slick-hidden').removeAttr('aria-hidden aria-disabled tabindex').css('display', '');
11962
11963      if (_.htmlExpr.test(_.options.nextArrow)) {
11964        _.$nextArrow.remove();
11965      }
11966    }
11967
11968    if (_.$slides) {
11969      _.$slides.removeClass('slick-slide slick-active slick-center slick-visible slick-current').removeAttr('aria-hidden').removeAttr('data-slick-index').each(function () {
11970        $(this).attr('style', $(this).data('originalStyling'));
11971      });
11972
11973      _.$slideTrack.children(this.options.slide).detach();
11974
11975      _.$slideTrack.detach();
11976
11977      _.$list.detach();
11978
11979      _.$slider.append(_.$slides);
11980    }
11981
11982    _.cleanUpRows();
11983
11984    _.$slider.removeClass('slick-slider');
11985    _.$slider.removeClass('slick-initialized');
11986    _.$slider.removeClass('slick-dotted');
11987
11988    _.unslicked = true;
11989
11990    if (!refresh) {
11991      _.$slider.trigger('destroy', [_]);
11992    }
11993  };
11994
11995  Slick.prototype.disableTransition = function (slide) {
11996    let _ = this,
11997        transition = {};
11998
11999    transition[_.transitionType] = '';
12000
12001    if (_.options.fade === false) {
12002      _.$slideTrack.css(transition);
12003    } else {
12004      _.$slides.eq(slide).css(transition);
12005    }
12006  };
12007
12008  Slick.prototype.fadeSlide = function (slideIndex, callback) {
12009    let _ = this;
12010
12011    if (_.cssTransitions === false) {
12012      _.$slides.eq(slideIndex).css({
12013        zIndex: _.options.zIndex
12014      });
12015
12016      _.$slides.eq(slideIndex).animate({
12017        opacity: 1
12018      }, _.options.speed, _.options.easing, callback);
12019    } else {
12020      _.applyTransition(slideIndex);
12021
12022      _.$slides.eq(slideIndex).css({
12023        opacity: 1,
12024        zIndex: _.options.zIndex
12025      });
12026
12027      if (callback) {
12028        setTimeout(() => {
12029
12030          _.disableTransition(slideIndex);
12031
12032          callback.call();
12033        }, _.options.speed);
12034      }
12035    }
12036  };
12037
12038  Slick.prototype.fadeSlideOut = function (slideIndex) {
12039    let _ = this;
12040
12041    if (_.cssTransitions === false) {
12042      _.$slides.eq(slideIndex).animate({
12043        opacity: 0,
12044        zIndex: _.options.zIndex - 2
12045      }, _.options.speed, _.options.easing);
12046    } else {
12047      _.applyTransition(slideIndex);
12048
12049      _.$slides.eq(slideIndex).css({
12050        opacity: 0,
12051        zIndex: _.options.zIndex - 2
12052      });
12053    }
12054  };
12055
12056  Slick.prototype.filterSlides = Slick.prototype.slickFilter = function (filter) {
12057    let _ = this;
12058
12059    if (filter !== null) {
12060      _.$slidesCache = _.$slides;
12061
12062      _.unload();
12063
12064      _.$slideTrack.children(this.options.slide).detach();
12065
12066      _.$slidesCache.filter(filter).appendTo(_.$slideTrack);
12067
12068      _.reinit();
12069    }
12070  };
12071
12072  Slick.prototype.focusHandler = function () {
12073    let _ = this;
12074
12075    // If any child element receives focus within the slider we need to pause the autoplay
12076    _.$slider.off('focus.slick blur.slick').on('focus.slick', '*', function (event) {
12077      var $sf = $(this);
12078
12079      setTimeout(() => {
12080        if (_.options.pauseOnFocus) {
12081          if ($sf.is(':focus')) {
12082            _.focussed = true;
12083            _.autoPlay();
12084          }
12085        }
12086      }, 0);
12087    }).on('blur.slick', '*', function (event) {
12088      var $sf = $(this);
12089
12090      // When a blur occurs on any elements within the slider we become unfocused
12091      if (_.options.pauseOnFocus) {
12092        _.focussed = false;
12093        _.autoPlay();
12094      }
12095    });
12096  };
12097
12098  Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function () {
12099    let _ = this;
12100    return _.currentSlide;
12101  };
12102
12103  Slick.prototype.getDotCount = function () {
12104    let _ = this;
12105
12106    var breakPoint = 0;
12107    var counter = 0;
12108    var pagerQty = 0;
12109
12110    if (_.options.infinite === true) {
12111      if (_.slideCount <= _.options.slidesToShow) {
12112        ++pagerQty;
12113      } else {
12114        while (breakPoint < _.slideCount) {
12115          ++pagerQty;
12116          breakPoint = counter + _.options.slidesToScroll;
12117          counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
12118        }
12119      }
12120    } else if (_.options.centerMode === true) {
12121      pagerQty = _.slideCount;
12122    } else if (!_.options.asNavFor) {
12123      pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);
12124    } else {
12125      while (breakPoint < _.slideCount) {
12126        ++pagerQty;
12127        breakPoint = counter + _.options.slidesToScroll;
12128        counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
12129      }
12130    }
12131
12132    return pagerQty - 1;
12133  };
12134
12135  Slick.prototype.getLeft = function (slideIndex) {
12136    let _ = this,
12137        targetLeft,
12138        verticalHeight,
12139        verticalOffset = 0,
12140        targetSlide,
12141        coef;
12142
12143    _.slideOffset = 0;
12144    verticalHeight = _.$slides.first().outerHeight(true);
12145
12146    if (_.options.infinite === true) {
12147      if (_.slideCount > _.options.slidesToShow) {
12148        _.slideOffset = _.slideWidth * _.options.slidesToShow * -1;
12149        coef = -1;
12150
12151        if (_.options.vertical === true && _.options.centerMode === true) {
12152          if (_.options.slidesToShow === 2) {
12153            coef = -1.5;
12154          } else if (_.options.slidesToShow === 1) {
12155            coef = -2;
12156          }
12157        }
12158        verticalOffset = verticalHeight * _.options.slidesToShow * coef;
12159      }
12160      if (_.slideCount % _.options.slidesToScroll !== 0) {
12161        if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {
12162          if (slideIndex > _.slideCount) {
12163            _.slideOffset = (_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth * -1;
12164            verticalOffset = (_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight * -1;
12165          } else {
12166            _.slideOffset = _.slideCount % _.options.slidesToScroll * _.slideWidth * -1;
12167            verticalOffset = _.slideCount % _.options.slidesToScroll * verticalHeight * -1;
12168          }
12169        }
12170      }
12171    } else if (slideIndex + _.options.slidesToShow > _.slideCount) {
12172      _.slideOffset = (slideIndex + _.options.slidesToShow - _.slideCount) * _.slideWidth;
12173      verticalOffset = (slideIndex + _.options.slidesToShow - _.slideCount) * verticalHeight;
12174    }
12175
12176    if (_.slideCount <= _.options.slidesToShow) {
12177      _.slideOffset = 0;
12178      verticalOffset = 0;
12179    }
12180
12181    if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) {
12182      _.slideOffset = _.slideWidth * Math.floor(_.options.slidesToShow) / 2 - _.slideWidth * _.slideCount / 2;
12183    } else if (_.options.centerMode === true && _.options.infinite === true) {
12184      _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;
12185    } else if (_.options.centerMode === true) {
12186      _.slideOffset = 0;
12187      _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);
12188    }
12189
12190    if (_.options.vertical === false) {
12191      targetLeft = slideIndex * _.slideWidth * -1 + _.slideOffset;
12192    } else {
12193      targetLeft = slideIndex * verticalHeight * -1 + verticalOffset;
12194    }
12195
12196    if (_.options.variableWidth === true) {
12197      if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
12198        targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);
12199      } else {
12200        targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);
12201      }
12202
12203      if (_.options.rtl === true) {
12204        if (targetSlide[0]) {
12205          targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
12206        } else {
12207          targetLeft = 0;
12208        }
12209      } else {
12210        targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
12211      }
12212
12213      if (_.options.centerMode === true) {
12214        if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
12215          targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);
12216        } else {
12217          targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);
12218        }
12219
12220        if (_.options.rtl === true) {
12221          if (targetSlide[0]) {
12222            targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
12223          } else {
12224            targetLeft = 0;
12225          }
12226        } else {
12227          targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
12228        }
12229
12230        targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;
12231      }
12232    }
12233
12234    return targetLeft;
12235  };
12236
12237  Slick.prototype.getOption = Slick.prototype.slickGetOption = function (option) {
12238    let _ = this;
12239
12240    return _.options[option];
12241  };
12242
12243  Slick.prototype.getNavigableIndexes = function () {
12244    let _ = this,
12245        breakPoint = 0,
12246        counter = 0,
12247        indexes = [],
12248        max;
12249
12250    if (_.options.infinite === false) {
12251      max = _.slideCount;
12252    } else {
12253      breakPoint = _.options.slidesToScroll * -1;
12254      counter = _.options.slidesToScroll * -1;
12255      max = _.slideCount * 2;
12256    }
12257
12258    while (breakPoint < max) {
12259      indexes.push(breakPoint);
12260      breakPoint = counter + _.options.slidesToScroll;
12261      counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
12262    }
12263
12264    return indexes;
12265  };
12266
12267  Slick.prototype.getSlick = function () {
12268    return this;
12269  };
12270
12271  Slick.prototype.getSlideCount = function () {
12272
12273    var _ = this,
12274        slidesTraversed,
12275        swipedSlide,
12276        swipeTarget,
12277        centerOffset;
12278
12279    centerOffset = _.options.centerMode === true ? Math.floor(_.$list.width() / 2) : 0;
12280    swipeTarget = _.swipeLeft * -1 + centerOffset;
12281
12282    if (_.options.swipeToSlide === true) {
12283
12284      _.$slideTrack.find('.slick-slide').each(function (index, slide) {
12285
12286        var slideOuterWidth, slideOffset, slideRightBoundary;
12287        slideOuterWidth = $(slide).outerWidth();
12288        slideOffset = slide.offsetLeft;
12289        if (_.options.centerMode !== true) {
12290          slideOffset += slideOuterWidth / 2;
12291        }
12292
12293        slideRightBoundary = slideOffset + slideOuterWidth;
12294
12295        if (swipeTarget < slideRightBoundary) {
12296          swipedSlide = slide;
12297          return false;
12298        }
12299      });
12300
12301      slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;
12302
12303      return slidesTraversed;
12304    }
12305    return _.options.slidesToScroll;
12306  };
12307
12308  Slick.prototype.goTo = Slick.prototype.slickGoTo = function (slide, dontAnimate) {
12309    let _ = this;
12310
12311    _.changeSlide({
12312      data: {
12313        message: 'index',
12314        index: parseInt(slide)
12315      }
12316    }, dontAnimate);
12317  };
12318
12319  Slick.prototype.init = function (creation) {
12320    let _ = this;
12321
12322    if (!$(_.$slider).hasClass('slick-initialized')) {
12323      $(_.$slider).addClass('slick-initialized');
12324
12325      _.buildRows();
12326      _.buildOut();
12327      _.setProps();
12328      _.startLoad();
12329      _.loadSlider();
12330      _.initializeEvents();
12331      _.updateArrows();
12332      _.updateDots();
12333      _.checkResponsive(true);
12334      _.focusHandler();
12335    }
12336
12337    if (creation) {
12338      _.$slider.trigger('init', [_]);
12339    }
12340
12341    if (_.options.accessibility === true) {
12342      _.initADA();
12343    }
12344
12345    if (_.options.autoplay) {
12346      _.paused = false;
12347      _.autoPlay();
12348    }
12349  };
12350
12351  Slick.prototype.initADA = function () {
12352    var _ = this,
12353        numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow),
12354        tabControlIndexes = _.getNavigableIndexes().filter(val => {
12355      return val >= 0 && val < _.slideCount;
12356    });
12357
12358    _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({
12359      'aria-hidden': 'true',
12360      'tabindex': '-1'
12361    }).find('a, input, button, select').attr({
12362      'tabindex': '-1'
12363    });
12364
12365    if (_.$dots !== null) {
12366      _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function (i) {
12367        var slideControlIndex = tabControlIndexes.indexOf(i);
12368
12369        $(this).attr({
12370          'role': 'tabpanel',
12371          'id': `slick-slide${_.instanceUid}${i}`,
12372          'tabindex': -1
12373        });
12374
12375        if (slideControlIndex !== -1) {
12376          var ariaButtonControl = `slick-slide-control${_.instanceUid}${slideControlIndex}`;
12377          if ($(`#${ariaButtonControl}`).length) {
12378            $(this).attr({
12379              'aria-describedby': ariaButtonControl
12380            });
12381          }
12382        }
12383      });
12384
12385      _.$dots.attr('role', 'tablist').find('li').each(function (i) {
12386        var mappedSlideIndex = tabControlIndexes[i];
12387
12388        $(this).attr({
12389          'role': 'presentation'
12390        });
12391
12392        $(this).find('button').first().attr({
12393          'role': 'tab',
12394          'id': `slick-slide-control${_.instanceUid}${i}`,
12395          'aria-controls': `slick-slide${_.instanceUid}${mappedSlideIndex}`,
12396          'aria-label': `${i + 1} of ${numDotGroups}`,
12397          'aria-selected': null,
12398          'tabindex': '-1'
12399        });
12400      }).eq(_.currentSlide).find('button').attr({
12401        'aria-selected': 'true',
12402        'tabindex': '0'
12403      }).end();
12404    }
12405
12406    for (let i = _.currentSlide, max = i + _.options.slidesToShow; i < max; i++) {
12407      if (_.options.focusOnChange) {
12408        _.$slides.eq(i).attr({ 'tabindex': '0' });
12409      } else {
12410        _.$slides.eq(i).removeAttr('tabindex');
12411      }
12412    }
12413
12414    _.activateADA();
12415  };
12416
12417  Slick.prototype.initArrowEvents = function () {
12418    let _ = this;
12419
12420    if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
12421      _.$prevArrow.off('click.slick').on('click.slick', {
12422        message: 'previous'
12423      }, _.changeSlide);
12424      _.$nextArrow.off('click.slick').on('click.slick', {
12425        message: 'next'
12426      }, _.changeSlide);
12427
12428      if (_.options.accessibility === true) {
12429        _.$prevArrow.on('keydown.slick', _.keyHandler);
12430        _.$nextArrow.on('keydown.slick', _.keyHandler);
12431      }
12432    }
12433  };
12434
12435  Slick.prototype.initDotEvents = function () {
12436    let _ = this;
12437
12438    if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
12439      $('li', _.$dots).on('click.slick', {
12440        message: 'index'
12441      }, _.changeSlide);
12442
12443      if (_.options.accessibility === true) {
12444        _.$dots.on('keydown.slick', _.keyHandler);
12445      }
12446    }
12447
12448    if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) {
12449      $('li', _.$dots).on('mouseenter.slick', $.proxy(_.interrupt, _, true)).on('mouseleave.slick', $.proxy(_.interrupt, _, false));
12450    }
12451  };
12452
12453  Slick.prototype.initSlideEvents = function () {
12454    let _ = this;
12455
12456    if (_.options.pauseOnHover) {
12457      _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true));
12458      _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false));
12459    }
12460  };
12461
12462  Slick.prototype.initializeEvents = function () {
12463    let _ = this;
12464
12465    _.initArrowEvents();
12466
12467    _.initDotEvents();
12468    _.initSlideEvents();
12469
12470    _.$list.on('touchstart.slick mousedown.slick', {
12471      action: 'start'
12472    }, _.swipeHandler);
12473    _.$list.on('touchmove.slick mousemove.slick', {
12474      action: 'move'
12475    }, _.swipeHandler);
12476    _.$list.on('touchend.slick mouseup.slick', {
12477      action: 'end'
12478    }, _.swipeHandler);
vendor: 12,224 bytes, lines 12479-12928
12479    _.$list.on('touchcancel.slick mouseleave.slick', {
12480      action: 'end'
12481    }, _.swipeHandler);
12482
12483    _.$list.on('click.slick', _.clickHandler);
12484
12485    $(document).on(_.visibilityChange, $.proxy(_.visibility, _));
12486
12487    if (_.options.accessibility === true) {
12488      _.$list.on('keydown.slick', _.keyHandler);
12489    }
12490
12491    if (_.options.focusOnSelect === true) {
12492      $(_.$slideTrack).children().on('click.slick', _.selectHandler);
12493    }
12494
12495    $(window).on(`orientationchange.slick.slick-${_.instanceUid}`, $.proxy(_.orientationChange, _));
12496
12497    $(window).on(`resize.slick.slick-${_.instanceUid}`, $.proxy(_.resize, _));
12498
12499    $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);
12500
12501    $(window).on(`load.slick.slick-${_.instanceUid}`, _.setPosition);
12502    $(_.setPosition);
12503  };
12504
12505  Slick.prototype.initUI = function () {
12506    let _ = this;
12507
12508    if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
12509      _.$prevArrow.show();
12510      _.$nextArrow.show();
12511    }
12512
12513    if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
12514      _.$dots.show();
12515    }
12516  };
12517
12518  Slick.prototype.keyHandler = function (event) {
12519    let _ = this;
12520    // Dont slide if the cursor is inside the form fields and arrow keys are pressed
12521    if (!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {
12522      if (event.keyCode === 37 && _.options.accessibility === true) {
12523        _.changeSlide({
12524          data: {
12525            message: _.options.rtl === true ? 'next' : 'previous'
12526          }
12527        });
12528      } else if (event.keyCode === 39 && _.options.accessibility === true) {
12529        _.changeSlide({
12530          data: {
12531            message: _.options.rtl === true ? 'previous' : 'next'
12532          }
12533        });
12534      }
12535    }
12536  };
12537
12538  Slick.prototype.lazyLoad = function () {
12539    let _ = this,
12540        loadRange,
12541        cloneRange,
12542        rangeStart,
12543        rangeEnd;
12544
12545    function loadImages(imagesScope) {
12546      $('img[data-lazy]', imagesScope).each(function () {
12547        let image = $(this),
12548            imageSource = $(this).attr('data-lazy'),
12549            imageSrcSet = $(this).attr('data-srcset'),
12550            imageSizes = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'),
12551            imageToLoad = document.createElement('img');
12552
12553        imageToLoad.onload = function () {
12554          image.animate({ opacity: 0 }, 100, () => {
12555
12556            if (imageSrcSet) {
12557              image.attr('srcset', imageSrcSet);
12558
12559              if (imageSizes) {
12560                image.attr('sizes', imageSizes);
12561              }
12562            }
12563
12564            image.attr('src', imageSource).animate({ opacity: 1 }, 200, function () {
12565              image.removeAttr('data-lazy data-srcset data-sizes').removeClass('slick-loading');
12566            });
12567            _.$slider.trigger('lazyLoaded', [_, image, imageSource]);
12568          });
12569        };
12570
12571        imageToLoad.onerror = function () {
12572          image.removeAttr('data-lazy').removeClass('slick-loading').addClass('slick-lazyload-error');
12573
12574          _.$slider.trigger('lazyLoadError', [_, image, imageSource]);
12575        };
12576
12577        imageToLoad.src = imageSource;
12578      });
12579    }
12580
12581    if (_.options.centerMode === true) {
12582      if (_.options.infinite === true) {
12583        rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);
12584        rangeEnd = rangeStart + _.options.slidesToShow + 2;
12585      } else {
12586        rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));
12587        rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;
12588      }
12589    } else {
12590      rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;
12591      rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);
12592      if (_.options.fade === true) {
12593        if (rangeStart > 0) rangeStart--;
12594        if (rangeEnd <= _.slideCount) rangeEnd++;
12595      }
12596    }
12597
12598    loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);
12599
12600    if (_.options.lazyLoad === 'anticipated') {
12601      var prevSlide = rangeStart - 1,
12602          nextSlide = rangeEnd,
12603          $slides = _.$slider.find('.slick-slide');
12604
12605      for (let i = 0; i < _.options.slidesToScroll; i++) {
12606        if (prevSlide < 0) prevSlide = _.slideCount - 1;
12607        loadRange = loadRange.add($slides.eq(prevSlide));
12608        loadRange = loadRange.add($slides.eq(nextSlide));
12609        prevSlide--;
12610        nextSlide++;
12611      }
12612    }
12613
12614    loadImages(loadRange);
12615
12616    if (_.slideCount <= _.options.slidesToShow) {
12617      cloneRange = _.$slider.find('.slick-slide');
12618      loadImages(cloneRange);
12619    } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {
12620      cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);
12621      loadImages(cloneRange);
12622    } else if (_.currentSlide === 0) {
12623      cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);
12624      loadImages(cloneRange);
12625    }
12626  };
12627
12628  Slick.prototype.loadSlider = function () {
12629    let _ = this;
12630
12631    _.setPosition();
12632
12633    _.$slideTrack.css({
12634      opacity: 1
12635    });
12636
12637    _.$slider.removeClass('slick-loading');
12638
12639    _.initUI();
12640
12641    if (_.options.lazyLoad === 'progressive') {
12642      _.progressiveLazyLoad();
12643    }
12644  };
12645
12646  Slick.prototype.next = Slick.prototype.slickNext = function () {
12647    let _ = this;
12648
12649    _.changeSlide({
12650      data: {
12651        message: 'next'
12652      }
12653    });
12654  };
12655
12656  Slick.prototype.orientationChange = function () {
12657    let _ = this;
12658
12659    _.checkResponsive();
12660    _.setPosition();
12661  };
12662
12663  Slick.prototype.pause = Slick.prototype.slickPause = function () {
12664    let _ = this;
12665
12666    _.autoPlayClear();
12667    _.paused = true;
12668  };
12669
12670  Slick.prototype.play = Slick.prototype.slickPlay = function () {
12671    let _ = this;
12672
12673    _.autoPlay();
12674    _.options.autoplay = true;
12675    _.paused = false;
12676    _.focussed = false;
12677    _.interrupted = false;
12678  };
12679
12680  Slick.prototype.postSlide = function (index) {
12681    let _ = this;
12682
12683    if (!_.unslicked) {
12684      _.$slider.trigger('afterChange', [_, index]);
12685
12686      _.animating = false;
12687
12688      if (_.slideCount > _.options.slidesToShow) {
12689        _.setPosition();
12690      }
12691
12692      _.swipeLeft = null;
12693
12694      if (_.options.autoplay) {
12695        _.autoPlay();
12696      }
12697
12698      if (_.options.accessibility === true) {
12699        _.initADA();
12700
12701        if (_.options.focusOnChange) {
12702          var $currentSlide = $(_.$slides.get(_.currentSlide));
12703          $currentSlide.attr('tabindex', 0).focus();
12704        }
12705      }
12706    }
12707  };
12708
12709  Slick.prototype.prev = Slick.prototype.slickPrev = function () {
12710    let _ = this;
12711
12712    _.changeSlide({
12713      data: {
12714        message: 'previous'
12715      }
12716    });
12717  };
12718
12719  Slick.prototype.preventDefault = function (event) {
12720    event.preventDefault();
12721  };
12722
12723  Slick.prototype.progressiveLazyLoad = function (tryCount) {
12724    tryCount = tryCount || 1;
12725
12726    var _ = this,
12727        $imgsToLoad = $('img[data-lazy]', _.$slider),
12728        image,
12729        imageSource,
12730        imageSrcSet,
12731        imageSizes,
12732        imageToLoad;
12733
12734    if ($imgsToLoad.length) {
12735      image = $imgsToLoad.first();
12736      imageSource = image.attr('data-lazy');
12737      imageSrcSet = image.attr('data-srcset');
12738      imageSizes = image.attr('data-sizes') || _.$slider.attr('data-sizes');
12739      imageToLoad = document.createElement('img');
12740
12741      imageToLoad.onload = function () {
12742        if (imageSrcSet) {
12743          image.attr('srcset', imageSrcSet);
12744
12745          if (imageSizes) {
12746            image.attr('sizes', imageSizes);
12747          }
12748        }
12749
12750        image.attr('src', imageSource).removeAttr('data-lazy data-srcset data-sizes').removeClass('slick-loading');
12751
12752        if (_.options.adaptiveHeight === true) {
12753          _.setPosition();
12754        }
12755
12756        _.$slider.trigger('lazyLoaded', [_, image, imageSource]);
12757        _.progressiveLazyLoad();
12758      };
12759
12760      imageToLoad.onerror = function () {
12761        if (tryCount < 3) {
12762          /**
12763           * try to load the image 3 times,
12764           * leave a slight delay so we don't get
12765           * servers blocking the request.
12766           */
12767          setTimeout(function () {
12768            _.progressiveLazyLoad(tryCount + 1);
12769          }, 500);
12770        } else {
12771          image.removeAttr('data-lazy').removeClass('slick-loading').addClass('slick-lazyload-error');
12772
12773          _.$slider.trigger('lazyLoadError', [_, image, imageSource]);
12774
12775          _.progressiveLazyLoad();
12776        }
12777      };
12778
12779      imageToLoad.src = imageSource;
12780    } else {
12781      _.$slider.trigger('allImagesLoaded', [_]);
12782    }
12783  };
12784
12785  Slick.prototype.refresh = function (initializing) {
12786    let _ = this,
12787        currentSlide,
12788        lastVisibleIndex;
12789
12790    lastVisibleIndex = _.slideCount - _.options.slidesToShow;
12791
12792    // in non-infinite sliders, we don't want to go past the
12793    // last visible index.
12794    if (!_.options.infinite && _.currentSlide > lastVisibleIndex) {
12795      _.currentSlide = lastVisibleIndex;
12796    }
12797
12798    // if less slides than to show, go to start.
12799    if (_.slideCount <= _.options.slidesToShow) {
12800      _.currentSlide = 0;
12801    }
12802
12803    currentSlide = _.currentSlide;
12804
12805    _.destroy(true);
12806
12807    $.extend(_, _.initials, { currentSlide });
12808
12809    _.init();
12810
12811    if (!initializing) {
12812      _.changeSlide({
12813        data: {
12814          message: 'index',
12815          index: currentSlide
12816        }
12817      }, false);
12818    }
12819  };
12820
12821  Slick.prototype.registerBreakpoints = function () {
12822    let _ = this,
12823        breakpoint,
12824        currentBreakpoint,
12825        l,
12826        responsiveSettings = _.options.responsive || null;
12827
12828    if ($.type(responsiveSettings) === 'array' && responsiveSettings.length) {
12829      _.respondTo = _.options.respondTo || 'window';
12830
12831      for (breakpoint in responsiveSettings) {
12832        l = _.breakpoints.length - 1;
12833
12834        if (responsiveSettings.hasOwnProperty(breakpoint)) {
12835          currentBreakpoint = responsiveSettings[breakpoint].breakpoint;
12836
12837          // loop through the breakpoints and cut out any existing
12838          // ones with the same breakpoint number, we don't want dupes.
12839          while (l >= 0) {
12840            if (_.breakpoints[l] && _.breakpoints[l] === currentBreakpoint) {
12841              _.breakpoints.splice(l, 1);
12842            }
12843            l--;
12844          }
12845
12846          _.breakpoints.push(currentBreakpoint);
12847          _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;
12848        }
12849      }
12850
12851      _.breakpoints.sort((a, b) => {
12852        return _.options.mobileFirst ? a - b : b - a;
12853      });
12854    }
12855  };
12856
12857  Slick.prototype.reinit = function () {
12858    let _ = this;
12859
12860    _.$slides = _.$slideTrack.children(_.options.slide).addClass('slick-slide');
12861
12862    _.slideCount = _.$slides.length;
12863
12864    if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {
12865      _.currentSlide = _.currentSlide - _.options.slidesToScroll;
12866    }
12867
12868    if (_.slideCount <= _.options.slidesToShow) {
12869      _.currentSlide = 0;
12870    }
12871
12872    _.registerBreakpoints();
12873
12874    _.setProps();
12875    _.setupInfinite();
12876    _.buildArrows();
12877    _.updateArrows();
12878    _.initArrowEvents();
12879    _.buildDots();
12880    _.updateDots();
12881    _.initDotEvents();
12882    _.cleanUpSlideEvents();
12883    _.initSlideEvents();
12884
12885    _.checkResponsive(false, true);
12886
12887    if (_.options.focusOnSelect === true) {
12888      $(_.$slideTrack).children().on('click.slick', _.selectHandler);
12889    }
12890
12891    _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);
12892
12893    _.setPosition();
12894    _.focusHandler();
12895
12896    _.paused = !_.options.autoplay;
12897    _.autoPlay();
12898
12899    _.$slider.trigger('reInit', [_]);
12900  };
12901
12902  Slick.prototype.resize = function () {
12903    let _ = this;
12904
12905    if ($(window).width() !== _.windowWidth) {
12906      clearTimeout(_.windowDelay);
12907      _.windowDelay = window.setTimeout(() => {
12908        _.windowWidth = $(window).width();
12909        _.checkResponsive();
12910        if (!_.unslicked) {
12911          _.setPosition();
12912        }
12913      }, 50);
12914    }
12915  };
12916
12917  Slick.prototype.removeSlide = Slick.prototype.slickRemove = function (index, removeBefore, removeAll) {
12918    let _ = this;
12919
12920    if (typeof index === 'boolean') {
12921      removeBefore = index;
12922      index = removeBefore === true ? 0 : _.slideCount - 1;
12923    } else {
12924      index = removeBefore === true ? --index : index;
12925    }
12926
12927    if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {
12928      return false;
12929    }
12930
12931    _.unload();
12932
12933    if (removeAll === true) {
12934      _.$slideTrack.children().remove();
12935    } else {
12936      _.$slideTrack.children(this.options.slide).eq(index).remove();
12937    }
12938
12939    _.$slides = _.$slideTrack.children(this.options.slide);
12940
12941    _.$slideTrack.children(this.options.slide).detach();
12942
12943    _.$slideTrack.append(_.$slides);
12944
12945    _.$slidesCache = _.$slides;
12946
12947    _.reinit();
12948  };
12949
12950  Slick.prototype.setCSS = function (position) {
12951    let _ = this,
12952        positionProps = {},
12953        x,
12954        y;
12955
12956    if (_.options.rtl === true) {
12957      position = -position;
12958    }
12959    x = _.positionProp == 'left' ? `${Math.ceil(position)}px` : '0px';
12960    y = _.positionProp == 'top' ? `${Math.ceil(position)}px` : '0px';
12961
12962    positionProps[_.positionProp] = position;
12963
12964    if (_.transformsEnabled === false) {
12965      _.$slideTrack.css(positionProps);
12966    } else {
12967      positionProps = {};
12968      if (_.cssTransitions === false) {
12969        positionProps[_.animType] = `translate(${x}, ${y})`;
12970        _.$slideTrack.css(positionProps);
12971      } else {
12972        positionProps[_.animType] = `translate3d(${x}, ${y}, 0px)`;
12973        _.$slideTrack.css(positionProps);
12974      }
12975    }
12976  };
12977
12978  Slick.prototype.setDimensions = function () {
12979    let _ = this;
12980
12981    if (_.options.vertical === false) {
12982      if (_.options.centerMode === true) {
12983        _.$list.css({
12984          padding: `0px ${_.options.centerPadding}`
12985        });
12986      }
12987    } else {
12988      _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);
12989      if (_.options.centerMode === true) {
12990        _.$list.css({
12991          padding: `${_.options.centerPadding} 0px`
12992        });
12993      }
12994    }
12995
12996    _.listWidth = _.$list.width();
12997    _.listHeight = _.$list.height();
12998
12999    if (_.options.vertical === false && _.options.variableWidth === false) {
13000      _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);
13001      _.$slideTrack.width(Math.ceil(_.slideWidth * _.$slideTrack.children('.slick-slide').length));
13002    } else if (_.options.variableWidth === true) {
13003      _.$slideTrack.width(5000 * _.slideCount);
13004    } else {
13005      _.slideWidth = Math.ceil(_.listWidth);
13006      _.$slideTrack.height(Math.ceil(_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length));
13007    }
13008
13009    var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();
13010    if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);
13011  };
13012
13013  Slick.prototype.setFade = function () {
13014    let _ = this,
13015        targetLeft;
13016
13017    _.$slides.each((index, element) => {
13018      targetLeft = _.slideWidth * index * -1;
13019      if (_.options.rtl === true) {
13020        $(element).css({
13021          position: 'relative',
13022          right: targetLeft,
13023          top: 0,
13024          zIndex: _.options.zIndex - 2,
13025          opacity: 0
13026        });
13027      } else {
13028        $(element).css({
13029          position: 'relative',
13030          left: targetLeft,
13031          top: 0,
13032          zIndex: _.options.zIndex - 2,
13033          opacity: 0
13034        });
13035      }
13036    });
13037
13038    _.$slides.eq(_.currentSlide).css({
13039      zIndex: _.options.zIndex - 1,
13040      opacity: 1
13041    });
13042  };
13043
13044  Slick.prototype.setHeight = function () {
13045    let _ = this;
13046
13047    if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
13048      var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
13049      _.$list.css('height', targetHeight);
13050    }
13051  };
13052
13053  Slick.prototype.setOption = Slick.prototype.slickSetOption = function () {
13054    /**
13055     * accepts arguments in format of:
13056     *
13057     *  - for changing a single option's value:
13058     *     .slick("setOption", option, value, refresh )
13059     *
13060     *  - for changing a set of responsive options:
13061     *     .slick("setOption", 'responsive', [{}, ...], refresh )
13062     *
13063     *  - for updating multiple values at once (not responsive)
13064     *     .slick("setOption", { 'option': value, ... }, refresh )
13065     */
13066
13067    var _ = this,
13068        l,
13069        item,
13070        option,
13071        value,
13072        refresh = false,
13073        type;
13074
13075    if ($.type(arguments[0]) === 'object') {
13076      option = arguments[0];
13077      refresh = arguments[1];
13078      type = 'multiple';
13079    } else if ($.type(arguments[0]) === 'string') {
13080      option = arguments[0];
13081      value = arguments[1];
13082      refresh = arguments[2];
13083
13084      if (arguments[0] === 'responsive' && $.type(arguments[1]) === 'array') {
13085        type = 'responsive';
13086      } else if (typeof arguments[1] !== 'undefined') {
13087        type = 'single';
13088      }
13089    }
13090
13091    if (type === 'single') {
vendor: 9,092 bytes, lines 13092-13377
13092      _.options[option] = value;
13093    } else if (type === 'multiple') {
13094      $.each(option, (opt, val) => {
13095
13096        _.options[opt] = val;
13097      });
13098    } else if (type === 'responsive') {
13099      for (item in value) {
13100        if ($.type(_.options.responsive) !== 'array') {
13101          _.options.responsive = [value[item]];
13102        } else {
13103          l = _.options.responsive.length - 1;
13104
13105          // loop through the responsive object and splice out duplicates.
13106          while (l >= 0) {
13107            if (_.options.responsive[l].breakpoint === value[item].breakpoint) {
13108              _.options.responsive.splice(l, 1);
13109            }
13110
13111            l--;
13112          }
13113
13114          _.options.responsive.push(value[item]);
13115        }
13116      }
13117    }
13118
13119    if (refresh) {
13120      _.unload();
13121      _.reinit();
13122    }
13123  };
13124
13125  Slick.prototype.setPosition = function () {
13126    let _ = this;
13127
13128    _.setDimensions();
13129
13130    _.setHeight();
13131
13132    if (_.options.fade === false) {
13133      _.setCSS(_.getLeft(_.currentSlide));
13134    } else {
13135      _.setFade();
13136    }
13137
13138    _.$slider.trigger('setPosition', [_]);
13139  };
13140
13141  Slick.prototype.setProps = function () {
13142    let _ = this,
13143        bodyStyle = document.body.style;
13144
13145    _.positionProp = _.options.vertical === true ? 'top' : 'left';
13146
13147    if (_.positionProp === 'top') {
13148      _.$slider.addClass('slick-vertical');
13149    } else {
13150      _.$slider.removeClass('slick-vertical');
13151    }
13152
13153    if (bodyStyle.WebkitTransition !== undefined || bodyStyle.MozTransition !== undefined || bodyStyle.msTransition !== undefined) {
13154      if (_.options.useCSS === true) {
13155        _.cssTransitions = true;
13156      }
13157    }
13158
13159    if (_.options.fade) {
13160      if (typeof _.options.zIndex === 'number') {
13161        if (_.options.zIndex < 3) {
13162          _.options.zIndex = 3;
13163        }
13164      } else {
13165        _.options.zIndex = _.defaults.zIndex;
13166      }
13167    }
13168
13169    if (bodyStyle.OTransform !== undefined) {
13170      _.animType = 'OTransform';
13171      _.transformType = '-o-transform';
13172      _.transitionType = 'OTransition';
13173      if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
13174    }
13175    if (bodyStyle.MozTransform !== undefined) {
13176      _.animType = 'MozTransform';
13177      _.transformType = '-moz-transform';
13178      _.transitionType = 'MozTransition';
13179      if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;
13180    }
13181    if (bodyStyle.webkitTransform !== undefined) {
13182      _.animType = 'webkitTransform';
13183      _.transformType = '-webkit-transform';
13184      _.transitionType = 'webkitTransition';
13185      if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
13186    }
13187    if (bodyStyle.msTransform !== undefined) {
13188      _.animType = 'msTransform';
13189      _.transformType = '-ms-transform';
13190      _.transitionType = 'msTransition';
13191      if (bodyStyle.msTransform === undefined) _.animType = false;
13192    }
13193    if (bodyStyle.transform !== undefined && _.animType !== false) {
13194      _.animType = 'transform';
13195      _.transformType = 'transform';
13196      _.transitionType = 'transition';
13197    }
13198    _.transformsEnabled = _.options.useTransform && _.animType !== null && _.animType !== false;
13199  };
13200
13201  Slick.prototype.setSlideClasses = function (index) {
13202    let _ = this,
13203        centerOffset,
13204        allSlides,
13205        indexOffset,
13206        remainder;
13207
13208    allSlides = _.$slider.find('.slick-slide').removeClass('slick-active slick-center slick-current').attr('aria-hidden', 'true');
13209
13210    _.$slides.eq(index).addClass('slick-current');
13211
13212    if (_.options.centerMode === true) {
13213      let evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0;
13214
13215      centerOffset = Math.floor(_.options.slidesToShow / 2);
13216
13217      if (_.options.infinite === true) {
13218        if (index >= centerOffset && index <= _.slideCount - 1 - centerOffset) {
13219          _.$slides.slice(index - centerOffset + evenCoef, index + centerOffset + 1).addClass('slick-active').attr('aria-hidden', 'false');
13220        } else {
13221          indexOffset = _.options.slidesToShow + index;
13222          allSlides.slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2).addClass('slick-active').attr('aria-hidden', 'false');
13223        }
13224
13225        if (index === 0) {
13226          allSlides.eq(allSlides.length - 1 - _.options.slidesToShow).addClass('slick-center');
13227        } else if (index === _.slideCount - 1) {
13228          allSlides.eq(_.options.slidesToShow).addClass('slick-center');
13229        }
13230      }
13231
13232      _.$slides.eq(index).addClass('slick-center');
13233    } else if (index >= 0 && index <= _.slideCount - _.options.slidesToShow) {
13234
13235      _.$slides.slice(index, index + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false');
13236    } else if (allSlides.length <= _.options.slidesToShow) {
13237
13238      allSlides.addClass('slick-active').attr('aria-hidden', 'false');
13239    } else {
13240
13241      remainder = _.slideCount % _.options.slidesToShow;
13242      indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;
13243
13244      if (_.options.slidesToShow == _.options.slidesToScroll && _.slideCount - index < _.options.slidesToShow) {
13245
13246        allSlides.slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder).addClass('slick-active').attr('aria-hidden', 'false');
13247      } else {
13248
13249        allSlides.slice(indexOffset, indexOffset + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false');
13250      }
13251    }
13252
13253    if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') {
13254      _.lazyLoad();
13255    }
13256  };
13257
13258  Slick.prototype.setupInfinite = function () {
13259    let _ = this,
13260        i,
13261        slideIndex,
13262        infiniteCount;
13263
13264    if (_.options.fade === true) {
13265      _.options.centerMode = false;
13266    }
13267
13268    if (_.options.infinite === true && _.options.fade === false) {
13269      slideIndex = null;
13270
13271      if (_.slideCount > _.options.slidesToShow) {
13272        if (_.options.centerMode === true) {
13273          infiniteCount = _.options.slidesToShow + 1;
13274        } else {
13275          infiniteCount = _.options.slidesToShow;
13276        }
13277
13278        for (i = _.slideCount; i > _.slideCount - infiniteCount; i -= 1) {
13279          slideIndex = i - 1;
13280          $(_.$slides[slideIndex]).clone(true).attr('id', '').attr('data-slick-index', slideIndex - _.slideCount).prependTo(_.$slideTrack).addClass('slick-cloned');
13281        }
13282        for (i = 0; i < infiniteCount + _.slideCount; i += 1) {
13283          slideIndex = i;
13284          $(_.$slides[slideIndex]).clone(true).attr('id', '').attr('data-slick-index', slideIndex + _.slideCount).appendTo(_.$slideTrack).addClass('slick-cloned');
13285        }
13286        _.$slideTrack.find('.slick-cloned').find('[id]').each(function () {
13287          $(this).attr('id', '');
13288        });
13289      }
13290    }
13291  };
13292
13293  Slick.prototype.interrupt = function (toggle) {
13294    let _ = this;
13295
13296    if (!toggle) {
13297      _.autoPlay();
13298    }
13299    _.interrupted = toggle;
13300  };
13301
13302  Slick.prototype.selectHandler = function (event) {
13303    let _ = this;
13304
13305    var targetElement = $(event.target).is('.slick-slide') ? $(event.target) : $(event.target).parents('.slick-slide');
13306
13307    var index = parseInt(targetElement.attr('data-slick-index'));
13308
13309    if (!index) index = 0;
13310
13311    if (_.slideCount <= _.options.slidesToShow) {
13312      _.slideHandler(index, false, true);
13313      return;
13314    }
13315
13316    _.slideHandler(index);
13317  };
13318
13319  Slick.prototype.slideHandler = function (index, sync, dontAnimate) {
13320    let targetSlide,
13321        animSlide,
13322        oldSlide,
13323        slideLeft,
13324        targetLeft = null,
13325        _ = this,
13326        navTarget;
13327
13328    sync = sync || false;
13329
13330    if (_.animating === true && _.options.waitForAnimate === true) {
13331      return;
13332    }
13333
13334    if (_.options.fade === true && _.currentSlide === index) {
13335      return;
13336    }
13337
13338    if (sync === false) {
13339      _.asNavFor(index);
13340    }
13341
13342    targetSlide = index;
13343    targetLeft = _.getLeft(targetSlide);
13344    slideLeft = _.getLeft(_.currentSlide);
13345
13346    _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;
13347
13348    if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {
13349      if (_.options.fade === false) {
13350        targetSlide = _.currentSlide;
13351        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {
13352          _.animateSlide(slideLeft, () => {
13353            _.postSlide(targetSlide);
13354          });
13355        } else {
13356          _.postSlide(targetSlide);
13357        }
13358      }
13359      return;
13360    } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > _.slideCount - _.options.slidesToScroll)) {
13361      if (_.options.fade === false) {
13362        targetSlide = _.currentSlide;
13363        if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {
13364          _.animateSlide(slideLeft, () => {
13365            _.postSlide(targetSlide);
13366          });
13367        } else {
13368          _.postSlide(targetSlide);
13369        }
13370      }
13371      return;
13372    }
13373
13374    if (_.options.autoplay) {
13375      clearInterval(_.autoPlayTimer);
13376    }
13377
13378    if (targetSlide < 0) {
13379      if (_.slideCount % _.options.slidesToScroll !== 0) {
13380        animSlide = _.slideCount - _.slideCount % _.options.slidesToScroll;
13381      } else {
13382        animSlide = _.slideCount + targetSlide;
13383      }
13384    } else if (targetSlide >= _.slideCount) {
13385      if (_.slideCount % _.options.slidesToScroll !== 0) {
13386        animSlide = 0;
13387      } else {
13388        animSlide = targetSlide - _.slideCount;
13389      }
13390    } else {
13391      animSlide = targetSlide;
13392    }
13393
13394    _.animating = true;
13395
13396    _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]);
13397
13398    oldSlide = _.currentSlide;
13399    _.currentSlide = animSlide;
13400
13401    _.setSlideClasses(_.currentSlide);
13402
13403    if (_.options.asNavFor) {
13404      navTarget = _.getNavTarget();
13405      navTarget = navTarget.slick('getSlick');
13406
13407      if (navTarget.slideCount <= navTarget.options.slidesToShow) {
13408        navTarget.setSlideClasses(_.currentSlide);
13409      }
13410    }
13411
13412    _.updateDots();
13413    _.updateArrows();
13414
13415    if (_.options.fade === true) {
13416      if (dontAnimate !== true) {
13417        _.fadeSlideOut(oldSlide);
13418
13419        _.fadeSlide(animSlide, () => {
13420          _.postSlide(animSlide);
13421        });
13422      } else {
13423        _.postSlide(animSlide);
13424      }
13425      _.animateHeight();
13426      return;
13427    }
13428
13429    if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) {
13430      _.animateSlide(targetLeft, () => {
13431        _.postSlide(animSlide);
13432      });
13433    } else {
13434      _.postSlide(animSlide);
13435    }
13436  };
13437
13438  Slick.prototype.startLoad = function () {
13439    let _ = this;
13440
13441    if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
13442      _.$prevArrow.hide();
13443      _.$nextArrow.hide();
13444    }
13445
13446    if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
13447      _.$dots.hide();
13448    }
13449
13450    _.$slider.addClass('slick-loading');
13451  };
13452
13453  Slick.prototype.swipeDirection = function () {
13454
13455    var xDist,
13456        yDist,
13457        r,
13458        swipeAngle,
13459        _ = this;
13460
13461    xDist = _.touchObject.startX - _.touchObject.curX;
13462    yDist = _.touchObject.startY - _.touchObject.curY;
13463    r = Math.atan2(yDist, xDist);
13464
13465    swipeAngle = Math.round(r * 180 / Math.PI);
13466    if (swipeAngle < 0) {
13467      swipeAngle = 360 - Math.abs(swipeAngle);
13468    }
13469
13470    if (swipeAngle <= 45 && swipeAngle >= 0) {
13471      return _.options.rtl === false ? 'left' : 'right';
13472    }
13473    if (swipeAngle <= 360 && swipeAngle >= 315) {
13474      return _.options.rtl === false ? 'left' : 'right';
13475    }
13476    if (swipeAngle >= 135 && swipeAngle <= 225) {
13477      return _.options.rtl === false ? 'right' : 'left';
13478    }
13479    if (_.options.verticalSwiping === true) {
13480      if (swipeAngle >= 35 && swipeAngle <= 135) {
13481        return 'down';
13482      }
13483      return 'up';
13484    }
13485
13486    return 'vertical';
13487  };
13488
13489  Slick.prototype.swipeEnd = function (event) {
13490    let _ = this,
13491        slideCount,
13492        direction;
13493
13494    _.dragging = false;
13495    _.swiping = false;
13496
13497    if (_.scrolling) {
13498      _.scrolling = false;
13499      return false;
13500    }
13501
13502    _.interrupted = false;
13503    _.shouldClick = !(_.touchObject.swipeLength > 10);
13504
13505    if (_.touchObject.curX === undefined) {
13506      return false;
13507    }
13508
13509    if (_.touchObject.edgeHit === true) {
13510      _.$slider.trigger('edge', [_, _.swipeDirection()]);
13511    }
13512
13513    if (_.touchObject.swipeLength >= _.touchObject.minSwipe) {
13514      direction = _.swipeDirection();
13515
13516      switch (direction) {
13517        case 'left':
13518        case 'down':
13519
13520          slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide + _.getSlideCount()) : _.currentSlide + _.getSlideCount();
13521
13522          _.currentDirection = 0;
13523
13524          break;
13525
13526        case 'right':
13527        case 'up':
13528
13529          slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide - _.getSlideCount()) : _.currentSlide - _.getSlideCount();
13530
13531          _.currentDirection = 1;
13532
13533          break;
13534
13535        default:
13536      }
13537
13538      if (direction != 'vertical') {
13539        _.slideHandler(slideCount);
13540        _.touchObject = {};
13541        _.$slider.trigger('swipe', [_, direction]);
13542      }
13543    } else if (_.touchObject.startX !== _.touchObject.curX) {
13544
13545      _.slideHandler(_.currentSlide);
13546      _.touchObject = {};
13547    }
13548  };
13549
13550  Slick.prototype.swipeHandler = function (event) {
13551    let _ = this;
13552
13553    if (_.options.swipe === false || 'ontouchend' in document && _.options.swipe === false) {
13554      return;
13555    } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {
13556      return;
13557    }
13558
13559    _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ? event.originalEvent.touches.length : 1;
13560
13561    _.touchObject.minSwipe = _.listWidth / _.options.touchThreshold;
13562
13563    if (_.options.verticalSwiping === true) {
13564      _.touchObject.minSwipe = _.listHeight / _.options.touchThreshold;
13565    }
13566
13567    switch (event.data.action) {
13568      case 'start':
13569        _.swipeStart(event);
13570        break;
13571
13572      case 'move':
13573        _.swipeMove(event);
13574        break;
13575
13576      case 'end':
13577        _.swipeEnd(event);
13578        break;
13579    }
13580  };
13581
13582  Slick.prototype.swipeMove = function (event) {
13583    let _ = this,
13584        edgeWasHit = false,
13585        curLeft,
13586        swipeDirection,
13587        swipeLength,
13588        positionOffset,
13589        touches,
13590        verticalSwipeLength;
13591
13592    touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;
13593
13594    if (!_.dragging || _.scrolling || touches && touches.length !== 1) {
13595      return false;
vendor: 4,219 bytes, lines 13596-13734
13596    }
13597
13598    curLeft = _.getLeft(_.currentSlide);
13599
13600    _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;
13601    _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;
13602
13603    _.touchObject.swipeLength = Math.round(Math.sqrt(Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));
13604
13605    verticalSwipeLength = Math.round(Math.sqrt(Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));
13606
13607    if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) {
13608      _.scrolling = true;
13609      return false;
13610    }
13611
13612    if (_.options.verticalSwiping === true) {
13613      _.touchObject.swipeLength = verticalSwipeLength;
13614    }
13615
13616    swipeDirection = _.swipeDirection();
13617
13618    if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {
13619      _.swiping = true;
13620      event.preventDefault();
13621    }
13622
13623    positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);
13624    if (_.options.verticalSwiping === true) {
13625      positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;
13626    }
13627
13628    swipeLength = _.touchObject.swipeLength;
13629
13630    _.touchObject.edgeHit = false;
13631
13632    if (_.options.infinite === false) {
13633      if (_.currentSlide === 0 && swipeDirection === 'right' || _.currentSlide >= _.getDotCount() && swipeDirection === 'left') {
13634        swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;
13635        _.touchObject.edgeHit = true;
13636      }
13637    }
13638
13639    if (_.options.vertical === false) {
13640      _.swipeLeft = curLeft + swipeLength * positionOffset;
13641    } else {
13642      _.swipeLeft = curLeft + swipeLength * (_.$list.height() / _.listWidth) * positionOffset;
13643    }
13644    if (_.options.verticalSwiping === true) {
13645      _.swipeLeft = curLeft + swipeLength * positionOffset;
13646    }
13647
13648    if (_.options.fade === true || _.options.touchMove === false) {
13649      return false;
13650    }
13651
13652    if (_.animating === true) {
13653      _.swipeLeft = null;
13654      return false;
13655    }
13656
13657    _.setCSS(_.swipeLeft);
13658  };
13659
13660  Slick.prototype.swipeStart = function (event) {
13661    let _ = this,
13662        touches;
13663
13664    _.interrupted = true;
13665
13666    if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {
13667      _.touchObject = {};
13668      return false;
13669    }
13670
13671    if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {
13672      touches = event.originalEvent.touches[0];
13673    }
13674
13675    _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;
13676    _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;
13677
13678    _.dragging = true;
13679  };
13680
13681  Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function () {
13682    let _ = this;
13683
13684    if (_.$slidesCache !== null) {
13685      _.unload();
13686
13687      _.$slideTrack.children(this.options.slide).detach();
13688
13689      _.$slidesCache.appendTo(_.$slideTrack);
13690
13691      _.reinit();
13692    }
13693  };
13694
13695  Slick.prototype.unload = function () {
13696    let _ = this;
13697
13698    $('.slick-cloned', _.$slider).remove();
13699
13700    if (_.$dots) {
13701      _.$dots.remove();
13702    }
13703
13704    if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) {
13705      _.$prevArrow.remove();
13706    }
13707
13708    if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) {
13709      _.$nextArrow.remove();
13710    }
13711
13712    _.$slides.removeClass('slick-slide slick-active slick-visible slick-current').attr('aria-hidden', 'true').css('width', '');
13713  };
13714
13715  Slick.prototype.unslick = function (fromBreakpoint) {
13716    let _ = this;
13717    _.$slider.trigger('unslick', [_, fromBreakpoint]);
13718    _.destroy();
13719  };
13720
13721  Slick.prototype.updateArrows = function () {
13722    let _ = this,
13723        centerOffset;
13724
13725    centerOffset = Math.floor(_.options.slidesToShow / 2);
13726
13727    if (_.options.arrows === true && _.slideCount > _.options.slidesToShow && !_.options.infinite) {
13728      _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');
13729      _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');
13730
13731      if (_.currentSlide === 0) {
13732        _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
13733        _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');
13734      } else if (_.currentSlide >
13734= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {
13735        _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
13736        _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');
13737      } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {
13738        _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
13739        _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');
13740      }
13741    }
13742  };
13743
13744  Slick.prototype.updateDots = function () {
13745    let _ = this;
13746
13747    if (_.$dots !== null) {
13748      _.$dots.find('li').removeClass('slick-active').end();
13749
13750      _.$dots.find('li').eq(Math.floor(_.currentSlide / _.options.slidesToScroll)).addClass('slick-active');
13751    }
13752  };
13753
13754  Slick.prototype.visibility = function () {
13755    let _ = this;
13756
13757    if (_.options.autoplay) {
13758      if (document[_.hidden]) {
13759        _.interrupted = true;
13760      } else {
13761        _.interrupted = false;
13762      }
13763    }
13764  };
13765
13766  $.fn.slick = function () {
13767    var _ = this,
13768        opt = arguments[0],
13769        args = Array.prototype.slice.call(arguments, 1),
13770        l = _.length,
13771        i,
13772        ret;
13773    for (i = 0; i < l; i++) {
13774      if (typeof opt === 'object' || typeof opt === 'undefined') _[i].slick = new Slick(_[i], opt);else ret = _[i].slick[opt].apply(_[i].slick, args);
13775      if (typeof ret !== 'undefined') return ret;
13776    }
13777    return _;
13778  };
13779});
13780
13781/***/ }),
13782/* 28 */
13783/***/ (function(module, exports, __webpack_require__) {
13784
13785// style-loader: Adds some css to the DOM by adding a <style> tag
13786
13787// load the styles
13788var content = __webpack_require__(29);
13789if(typeof content === 'string') content = [[module.i, content, '']];
13790// Prepare cssTransformation
13791var transform;
13792
13793var options = {}
13794options.transform = transform
13795// add the styles to the DOM
13796var update = __webpack_require__(4)(content, options);
13797if(content.locals) module.exports = content.locals;
13798// Hot Module Replacement
13799if(false) {
13800	// When the styles change, update the <style> tags
13801	if(!content.locals) {
13802		module.hot.accept("!!../../../node_modules/css-loader/index.js!./slick.css", function() {
13803			var newContent = require("!!../../../node_modules/css-loader/index.js!./slick.css");
13804			if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
13805			update(newContent);
13806		});
13807	}
13808	// When the module is disposed, remove the <style> tags
13809	module.hot.dispose(function() { update(); });
13810}
13811
13812/***/ }),
13813/* 29 */
13814/***/ (function(module, exports, __webpack_require__) {
13815
13816exports = module.exports = __webpack_require__(3)(undefined);
13817// imports
13818
13819
13820// module
13821exports.push([module.i, "/* Slider */\r\n.slick-slider\r\n{\r\n    position: relative;\r\n\r\n    display: block;\r\n    box-sizing: border-box;\r\n\r\n    -webkit-user-select: none;\r\n       -moz-user-select: none;\r\n        -ms-user-select: none;\r\n            user-select: none;\r\n\r\n    -webkit-touch-callout: none;\r\n    -khtml-user-select: none;\r\n    -ms-touch-action: pan-y;\r\n        touch-action: pan-y;\r\n    -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.slick-list\r\n{\r\n    position: relative;\r\n\r\n    display: block;\r\n    overflow: hidden;\r\n\r\n    margin: 0;\r\n    padding: 0;\r\n}\r\n.slick-list:focus\r\n{\r\n    outline: none;\r\n}\r\n.slick-list.dragging\r\n{\r\n    cursor: pointer;\r\n    cursor: hand;\r\n}\r\n\r\n.slick-slider .slick-track,\r\n.slick-slider .slick-list\r\n{\r\n    -webkit-transform: translate3d(0, 0, 0);\r\n       -moz-transform: translate3d(0, 0, 0);\r\n        -ms-transform: translate3d(0, 0, 0);\r\n         -o-transform: translate3d(0, 0, 0);\r\n            transform: translate3d(0, 0, 0);\r\n}\r\n\r\n.slick-track\r\n{\r\n    position: relative;\r\n    top: 0;\r\n    left: 0;\r\n\r\n    display: block;\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n}\r\n.slick-track:before,\r\n.slick-track:after\r\n{\r\n    display: table;\r\n\r\n    content: '';\r\n}\r\n.slick-track:after\r\n{\r\n    clear: both;\r\n}\r\n.slick-loading .slick-track\r\n{\r\n    visibility: hidden;\r\n}\r\n\r\n.slick-slide\r\n{\r\n    display: none;\r\n    float: left;\r\n\r\n    height: 100%;\r\n    min-height: 1px;\r\n}\r\n[dir='rtl'] .slick-slide\r\n{\r\n    float: right;\r\n}\r\n.slick-slide img\r\n{\r\n    display: block;\r\n}\r\n.slick-slide.slick-loading img\r\n{\r\n    display: none;\r\n}\r\n.slick-slide.dragging img\r\n{\r\n    pointer-events: none;\r\n}\r\n.slick-initialized .slick-slide\r\n{\r\n    display: block;\r\n}\r\n.slick-loading .slick-slide\r\n{\r\n    visibility: hidden;\r\n}\r\n.slick-vertical .slick-slide\r\n{\r\n    display: block;\r\n\r\n    height: auto;\r\n\r\n    border: 1px solid transparent;\r\n}\r\n.slick-arrow.slick-hidden {\r\n    display: none;\r\n}\r\n", ""]);
13822
13823// exports
13824
13825
13826/***/ }),
13827/* 30 */
13828/***/ (function(module, exports, __webpack_require__) {
13829
13830/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery) {typeof JSON != "object" && (JSON = {}), function () {
13831  "use strict";
13832  function f(e) {
13833    return e < 10 ? "0" + e : e;
13834  }function quote(e) {
13835    return escapable.lastIndex = 0, escapable.test(e) ? '"' + e.replace(escapable, function (e) {
13836      var t = meta[e];return typeof t == "string" ? t : "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4);
13837    }) + '"' : '"' + e + '"';
13838  }function str(e, t) {
13839    var n,
13840        r,
13841        i,
13842        s,
13843        o = gap,
13844        u,
13845        a = t[e];a && typeof a == "object" && typeof a.toJSON == "function" && (a = a.toJSON(e)), typeof rep == "function" && (a = rep.call(t, e, a));switch (typeof a) {case "string":
13846        return quote(a);case "number":
13847        return isFinite(a) ? String(a) : "null";case "boolean":case "null":
13848        return String(a);case "object":
13849        if (!a) return "null";gap += indent, u = [];if (Object.prototype.toString.apply(a) === "[object Array]") {
13850          s = a.length;for (n = 0; n < s; n += 1) u[n] = str(n, a) || "null";return i = u.length === 0 ? "[]" : gap ? "[\n" + gap + u.join(",\n" + gap) + "\n" + o + "]" : "[" + u.join(",") + "]", gap = o, i;
13851        }if (rep && typeof rep == "object") {
13852          s = rep.length;for (n = 0; n < s; n += 1) typeof rep[n] == "string" && (r = rep[n], i = str(r, a), i && u.push(quote(r) + (gap ? ": " : ":") + i));
13853        } else for (r in a) Object.prototype.hasOwnProperty.call(a, r) && (i = str(r, a), i && u.push(quote(r) + (gap ? ": " : ":") + i));return i = u.length === 0 ? "{}" : gap ? "{\n" + gap + u.join(",\n" + gap) + "\n" + o + "}" : "{" + u.join(",") + "}", gap = o, i;}
13854  }typeof Date.prototype.toJSON != "function" && (Date.prototype.toJSON = function (e) {
13855    return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null;
13856  }, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (e) {
13857    return this.valueOf();
13858  });var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
13859      escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
13860      gap,
13861      indent,
13862      meta = { "\b": "\\b", "	": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" },
13863      rep;typeof JSON.stringify != "function" && (JSON.stringify = function (e, t, n) {
13864    var r;gap = "", indent = "";if (typeof n == "number") for (r = 0; r < n; r += 1) indent += " ";else typeof n == "string" && (indent = n);rep = t;if (!t || typeof t == "function" || typeof t == "object" && typeof t.length == "number") return str("", { "": e });throw new Error("JSON.stringify");
13865  }), typeof JSON.parse != "function" && (JSON.parse = function (text, reviver) {
13866    function walk(e, t) {
13867      var n,
13868          r,
13869          i = e[t];if (i && typeof i == "object") for (n in i) Object.prototype.hasOwnProperty.call(i, n) && (r = walk(i, n), r !== undefined ? i[n] = r : delete i[n]);return reviver.call(e, t, i);
13870    }var j;text = String(text), cx.lastIndex = 0, cx.test(text) && (text = text.replace(cx, function (e) {
13871      return "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4);
13872    }));if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return j = eval("(" + text + ")"), typeof reviver == "function" ? walk({ "": j }, "") : j;throw new SyntaxError("JSON.parse");
13873  });
13874}(), function (e, t) {
13875  "use strict";
13876  var n = e.History = e.History || {},
13877      r = __webpack_provided_window_dot_jQuery;if (typeof n.Adapter != "undefined") throw new Error("History.js Adapter has already been loaded...");n.Adapter = { bind: function (e, t, n) {
13878      r(e).bind(t, n);
13879    }, trigger: function (e, t, n) {
13880      r(e).trigger(t, n);
13881    }, extractEventData: function (e, n, r) {
13882      var i = n && n.originalEvent && n.originalEvent[e] || r && r[e] || t;return i;
13883    }, onDomLoad: function (e) {
13884      r(e);
13885    } }, typeof n.init != "undefined" && n.init();
13886}(window), function (e, t) {
13887  "use strict";
13888  var n = e.document,
13889      r = e.setTimeout || r,
13890      i = e.clearTimeout || i,
13891      s = e.setInterval || s,
13892      o = e.History = e.History || {};if (typeof o.initHtml4 != "undefined") throw new Error("History.js HTML4 Support has already been loaded...");o.initHtml4 = function () {
13893    if (typeof o.initHtml4.initialized != "undefined") return !1;o.initHtml4.initialized = !0, o.enabled = !0, o.savedHashes = [], o.isLastHash = function (e) {
13894      var t = o.getHashByIndex(),
13895          n;return n = e === t, n;
13896    }, o.isHashEqual = function (e, t) {
13897      return e = encodeURIComponent(e).replace(/%25/g, "%"), t = encodeURIComponent(t).replace(/%25/g, "%"), e === t;
13898    }, o.saveHash = function (e) {
13899      return o.isLastHash(e) ? !1 : (o.savedHashes.push(e), !0);
13900    }, o.getHashByIndex = function (e) {
13901      var t = null;return typeof e == "undefined" ? t = o.savedHashes[o.savedHashes.length - 1] : e < 0 ? t = o.savedHashes[o.savedHashes.length + e] : t = o.savedHashes[e], t;
13902    }, o.discardedHashes = {}, o.discardedStates = {}, o.discardState = function (e, t, n) {
13903      var r = o.getHashByState(e),
13904          i;return i = { discardedState: e, backState: n, forwardState: t }, o.discardedStates[r] = i, !0;
13905    }, o.discardHash = function (e, t, n) {
13906      var r = { discardedHash: e, backState: n, forwardState: t };return o.discardedHashes[e] = r, !0;
13907    }, o.discardedState = function (e) {
13908      var t = o.getHashByState(e),
13909          n;return n = o.discardedStates[t] || !1, n;
13910    }, o.discardedHash = function (e) {
13911      var t = o.discardedHashes[e] || !1;return t;
13912    }, o.recycleState = function (e) {
13913      var t = o.getHashByState(e);return o.discardedState(e) && delete o.discardedStates[t], !0;
13914    }, o.emulated.hashChange && (o.hashChangeInit = function () {
13915      o.checkerFunction = null;var t = "",
13916          r,
13917          i,
13918          u,
13919          a,
13920          f = Boolean(o.getHash());return o.isInternetExplorer() ? (r = "historyjs-iframe", i = n.createElement("iframe"), i.setAttribute("id", r), i.setAttribute("src", "#"), i.style.display = "none", n.body.appendChild(i), i.contentWindow.document.open(), i.contentWindow.document.close(), u = "", a = !1, o.checkerFunction = function () {
13921        if (a) return !1;a = !0;var n = o.getHash(),
13922            r = o.getHash(i.contentWindow.document);return n !== t ? (t = n, r !== n && (u = r = n, i.contentWindow.document.open(), i.contentWindow.document.close(), i.contentWindow.document.location.hash = o.escapeHash(n)), o.Adapter.trigger(e, "hashchange")) : r !== u && (u = r, f && r === "" ? o.back() : o.setHash(r, !1)), a = !1, !0;
13923      }) : o.checkerFunction = function () {
13924        var n = o.getHash() || "";return n !== t && (t = n, o.Adapter.trigger(e, "hashchange")), !0;
13925      }, o.intervalList.push(s(o.checkerFunction, o.options.hashChangeInterval)), !0;
13926    }, o.Adapter.onDomLoad(o.hashChangeInit)), o.emulated.pushState && (o.onHashChange = function (t) {
13927      var n = t && t.newURL || o.getLocationHref(),
13928          r = o.getHashByUrl(n),
13929          i = null,
13930          s = null,
13931          u = null,
13932          a;return o.isLastHash(r) ? (o.busy(!1), !1) : (o.doubleCheckComplete(), o.saveHash(r), r && o.isTraditionalAnchor(r) ? (o.Adapter.trigger(e, "anchorchange"), o.busy(!1), !1) : (i = o.extractState(o.getFullUrl(r || o.getLocationHref()), !0), o.isLastSavedState(i) ? (o.busy(!1), !1) : (s = o.getHashByState(i), a = o.discardedState(i), a ? (o.getHashByIndex(-2) === o.getHashByState(a.forwardState) ? o.back(!1) : o.forward(!1), !1) : (o.pushState(i.data, i.title, encodeURI(i.url), !1), !0))));
13933    }, o.Adapter.bind(e, "hashchange", o.onHashChange), o.pushState = function (t, n, r, i) {
13934      r = encodeURI(r).replace(/%25/g, "%");if (o.getHashByUrl(r)) throw new Error("History.js does not support states with fragment-identifiers (hashes/anchors).");if (i !== !1 && o.busy()) return o.pushQueue({ scope: o, callback: o.pushState, args: arguments, queue: i }), !1;o.busy(!0);var s = o.createStateObject(t, n, r),
13935          u = o.getHashByState(s),
13936          a = o.getState(!1),
13937          f = o.getHashByState(a),
13938          l = o.getHash(),
13939          c = o.expectedStateId == s.id;return o.storeState(s), o.expectedStateId = s.id, o.recycleState(s), o.setTitle(s), u === f ? (o.busy(!1), !1) : (o.saveState(s), c || o.Adapter.trigger(e, "statechange"), !o.isHashEqual(u, l) && !o.isHashEqual(u, o.getShortUrl(o.getLocationHref())) && o.setHash(u, !1), o.busy(!1), !0);
13940    }, o.replaceState = function (t, n, r, i) {
13941      r = encodeURI(r).replace(/%25/g, "%");if (o.getHashByUrl(r)) throw new Error("History.js does not support states with fragment-identifiers (hashes/anchors).");if (i !== !1 && o.busy()) return o.pushQueue({ scope: o, callback: o.replaceState, args: arguments, queue: i }), !1;o.busy(!0);var s = o.createStateObject(t, n, r),
13942          u = o.getHashByState(s),
13943          a = o.getState(!1),
13944          f = o.getHashByState(a),
13945          l = o.getStateByIndex(-2);return o.discardState(a, s, l), u === f ? (o.storeState(s), o.expectedStateId = s.id, o.recycleState(s), o.setTitle(s), o.saveState(s), o.Adapter.trigger(e, "statechange"), o.busy(!1)) : o.pushState(s.data, s.title, s.url, !1), !0;
13946    }), o.emulated.pushState && o.getHash() && !o.emulated.hashChange && o.Adapter.onDomLoad(function () {
13947      o.Adapter.trigger(e, "hashchange");
13948    });
13949  }, typeof o.init != "undefined" && o.init();
13950}(window), function (e, t) {
13951  "use strict";
13952  var n = e.console || t,
13953      r = e.document,
13954      i = e.navigator,
13955      s = !1,
13956      o = e.setTimeout,
13957      u = e.clearTimeout,
13958      a = e.setInterval,
13959      f = e.clearInterval,
13960      l = e.JSON,
13961      c = e.alert,
13962      h = e.History = e.History || {},
13963      p = e.history;try {
13964    s = e.sessionStorage, s.setItem("TEST", "1"), s.removeItem("TEST");
13965  } catch (d) {
13966    s = !1;
13967  }l.stringify = l.stringify || l.encode, l.parse = l.parse || l.decode;if (typeof h.init != "undefined") throw new Error("History.js Core has already been loaded...");h.init = function (e) {
13968    return typeof h.Adapter == "undefined" ? !1 : (typeof h.initCore != "undefined" && h.initCore(), typeof h.initHtml4 != "undefined" && h.initHtml4(), !0);
13969  }, h.initCore = function (d) {
13970    if (typeof h.initCore.initialized != "undefined") return !1;h.initCore.initialized = !0, h.options = h.options || {}, h.options.hashChangeInterval = h.options.hashChangeInterval || 100, h.options.safariPollInterval = h.options.safariPollInterval || 500, h.options.doubleCheckInterval = h.options.doubleCheckInterval || 500, h.options.disableSuid = h.options.disableSuid || !1, h.options.storeInterval = h.options.storeInterval || 1e3, h.options.busyDelay = h.options.busyDelay || 250, h.options.debug = h.options.debug || !1, h.options.initialTitle = h.options.initialTitle || r.title, h.options.html4Mode = h.options.html4Mode || !1, h.options.delayInit = h.options.delayInit || !1, h.intervalList = [], h.clearAllIntervals = function () {
13971      var e,
13972          t = h.intervalList;if (typeof t != "undefined" && t !== null) {
13973        for (e = 0; e < t.length; e++) f(t[e]);h.intervalList = null;
13974      }
13975    }, h.debug = function () {
13976      (h.options.debug || !1) && h.log.apply(h, arguments);
13977    }, h.log = function () {
13978      var e = typeof n != "undefined" && typeof n.log != "undefined" && typeof n.log.apply != "undefined",
13979          t = r.getElementById("log"),
13980          i,
13981          s,
13982          o,
13983          u,
13984          a;e ? (u = Array.prototype.slice.call(arguments), i = u.shift(), typeof n.debug != "undefined" ? n.debug.apply(n, [i, u]) : n.log.apply(n, [i, u])) : i = "\n" + arguments[0] + "\n";for (s = 1, o = arguments.length; s < o; ++s) {
13985        a = arguments[s];if (typeof a == "object" && typeof l != "undefined") try {
13986          a = l.stringify(a);
13987        } catch (f) {}i += "\n" + a + "\n";
13988      }return t ? (t.value += i + "\n-----\n", t.scrollTop = t.scrollHeight - t.clientHeight) : e || c(i), !0;
13989    }, h.getInternetExplorerMajorVersion = function () {
13990      var e = h.getInternetExplorerMajorVersion.cached = typeof h.getInternetExplorerMajorVersion.cached != "undefined" ? h.getInternetExplorerMajorVersion.cached : function () {
13991        var e = 3,
13992            t = r.createElement("div"),
13993            n = t.getElementsByTagName("i");while ((t.innerHTML = "<!--[if gt IE " + ++e + "]><i></i><![endif]-->") && n[0]);return e > 4 ? e : !1;
13994      }();return e;
13995    }, h.isInternetExplorer = function () {
13996      var e = h.isInternetExplorer.cached = typeof h.isInternetExplorer.cached != "undefined" ? h.isInternetExplorer.cached : Boolean(h.getInternetExplorerMajorVersion());return e;
13997    }, h.options.html4Mode ? h.emulated = { pushState: !0, hashChange: !0 } : h.emulated = { pushState: !Boolean(e.history && e.history.pushState && e.history.replaceState && !/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(i.userAgent) && !/AppleWeb
13997Kit\/5([0-2]|3[0-2])/i.test(i.userAgent)), hashChange: Boolean(!("onhashchange" in e || "onhashchange" in r) || h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 8) }, h.enabled = !h.emulated.pushState, h.bugs = { setHash: Boolean(!h.emulated.pushState && i.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)), safariPoll: Boolean(!h.emulated.pushState && i.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)), ieDoubleCheck: Boolean(h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 8), hashEscape: Boolean(h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 7) }, h.isEmptyObject = function (e) {
13998      for (var t in e) if (e.hasOwnProperty(t)) return !1;return !0;
13999    }, h.cloneObject = function (e) {
14000      var t, n;return e ? (t = l.stringify(e), n = l.parse(t)) : n = {}, n;
14001    }, h.getRootUrl = function () {
14002      var e = r.location.protocol + "//" + (r.location.hostname || r.location.host);if (r.location.port || !1) e += ":" + r.location.port;return e += "/", e;
14003    }, h.getBaseHref = function () {
14004      var e = r.getElementsByTagName("base"),
14005          t = null,
14006          n = "";return e.length === 1 && (t = e[0], n = t.href.replace(/[^\/]+$/, "")), n = n.replace(/\/+$/, ""), n && (n += "/"), n;
14007    }, h.getBaseUrl = function () {
14008      var e = h.getBaseHref() || h.getBasePageUrl() || h.getRootUrl();return e;
14009    }, h.getPageUrl = function () {
14010      var e = h.getState(!1, !1),
14011          t = (e || {}).url || h.getLocationHref(),
14012          n;return n = t.replace(/\/+$/, "").replace(/[^\/]+$/, function (e, t, n) {
14013        return (/\./.test(e) ? e : e + "/"
14014        );
14015      }), n;
14016    }, h.getBasePageUrl = function () {
14017      var e = h.getLocationHref().replace(/[#\?].*/, "").replace(/[^\/]+$/, function (e, t, n) {
14018        return (/[^\/]$/.test(e) ? "" : e
14019        );
14020      }).replace(/\/+$/, "") + "/";return e;
14021    }, h.getFullUrl = function (e, t) {
14022      var n = e,
14023          r = e.substring(0, 1);return t = typeof t == "undefined" ? !0 : t, /[a-z]+\:\/\//.test(e) || (r === "/" ? n = h.getRootUrl() + e.replace(/^\/+/, "") : r === "#" ? n = h.getPageUrl().replace(/#.*/, "") + e : r === "?" ? n = h.getPageUrl().replace(/[\?#].*/, "") + e : t ? n = h.getBaseUrl() + e.replace(/^(\.\/)+/, "") : n = h.getBasePageUrl() + e.replace(/^(\.\/)+/, "")), n.replace(/\#$/, "");
14024    }, h.getShortUrl = function (e) {
14025      var t = e,
14026          n = h.getBaseUrl(),
14027          r = h.getRootUrl();return h.emulated.pushState && (t = t.replace(n, "")), t = t.replace(r, "/"), h.isTraditionalAnchor(t) && (t = "./" + t), t = t.replace(/^(\.\/)+/g, "./").replace(/\#$/, ""), t;
14028    }, h.getLocationHref = function (e) {
14029      return e = e || r, e.URL === e.location.href ? e.location.href : e.location.href === decodeURIComponent(e.URL) ? e.URL : e.location.hash && decodeURIComponent(e.location.href.replace(/^[^#]+/, "")) === e.location.hash ? e.location.href : e.URL.indexOf("#") == -1 && e.location.href.indexOf("#") != -1 ? e.location.href : e.URL || e.location.href;
14030    }, h.store = {}, h.idToState = h.idToState || {}, h.stateToId = h.stateToId || {}, h.urlToId = h.urlToId || {}, h.storedStates = h.storedStates || [], h.savedStates = h.savedStates || [], h.normalizeStore = function () {
14031      h.store.idToState = h.store.idToState || {}, h.store.urlToId = h.store.urlToId || {}, h.store.stateToId = h.store.stateToId || {};
14032    }, h.getState = function (e, t) {
14033      typeof e == "undefined" && (e = !0), typeof t == "undefined" && (t = !0);var n = h.getLastSavedState();return !n && t && (n = h.createStateObject()), e && (n = h.cloneObject(n), n.url = n.cleanUrl || n.url), n;
14034    }, h.getIdByState = function (e) {
14035      var t = h.extractId(e.url),
14036          n;if (!t) {
14037        n = h.getStateString(e);if (typeof h.stateToId[n] != "undefined") t = h.stateToId[n];else if (typeof h.store.stateToId[n] != "undefined") t = h.store.stateToId[n];else {
14038          for (;;) {
14039            t = new Date().getTime() + String(Math.random()).replace(/\D/g, "");if (typeof h.idToState[t] == "undefined" && typeof h.store.idToState[t] == "undefined") break;
14040          }h.stateToId[n] = t, h.idToState[t] = e;
14041        }
14042      }return t;
14043    }, h.normalizeState = function (e) {
14044      var t, n;if (!e || typeof e != "object") e = {};if (typeof e.normalized != "undefined") return e;if (!e.data || typeof e.data != "object") e.data = {};return t = {}, t.normalized = !0, t.title = e.title || "", t.url = h.getFullUrl(e.url ? e.url : h.getLocationHref()), t.hash = h.getShortUrl(t.url), t.data = h.cloneObject(e.data), t.id = h.getIdByState(t), t.cleanUrl = t.url.replace(/\??\&_suid.*/, ""), t.url = t.cleanUrl, n = !h.isEmptyObject(t.data), (t.title || n) && h.options.disableSuid !== !0 && (t.hash = h.getShortUrl(t.url).replace(/\??\&_suid.*/, ""), /\?/.test(t.hash) || (t.hash += "?"), t.hash += "&_suid=" + t.id), t.hashedUrl = h.getFullUrl(t.hash), (h.emulated.pushState || h.bugs.safariPoll) && h.hasUrlDuplicate(t) && (t.url = t.hashedUrl), t;
14045    }, h.createStateObject = function (e, t, n) {
14046      var r = { data: e, title: t, url: n };return r = h.normalizeState(r), r;
14047    }
14047, h.getStateById = function (e) {
14048      e = String(e);var n = h.idToState[e] || h.store.idToState[e] || t;return n;
14049    }, h.getStateString = function (e) {
14050      var t, n, r;return t = h.normalizeState(e), n = { data: t.data, title: e.title, url: e.url }, r = l.stringify(n), r;
14051    }, h.getStateId = function (e) {
14052      var t, n;return t = h.normalizeState(e), n = t.id, n;
14053    }, h.getHashByState = function (e) {
14054      var t, n;return t = h.normalizeState(e), n = t.hash, n;
14055    }, h.extractId = function (e) {
14056      var t, n, r, i;return e.indexOf("#") != -1 ? i = e.split("#")[0] : i = e, n = /(.*)\&_suid=([0-9]+)$/.exec(i), r = n ? n[1] || e : e, t = n ? String(n[2] || "") : "", t || !1;
14057    }, h.isTraditionalAnchor = function (e) {
14058      var t = !/[\/\?\.]/.test(e);return t;
14059    }, h.extractState = function (e, t) {
14060      var n = null,
14061          r,
14062          i;return t = t || !1, r = h.extractId(e), r && (n = h.getStateById(r)), n || (i = h.getFullUrl(e), r = h.getIdByUrl(i) || !1, r && (n = h.getStateById(r)), !n && t && !h.isTraditionalAnchor(e) && (n = h.createStateObject(null, null, i))), n;
14063    }, h.getIdByUrl = function (e) {
14064      var n = h.urlToId[e] || h.store.urlToId[e] || t;return n;
14065    }, h.getLastSavedState = function () {
14066      return h.savedStates[h.savedStates.length - 1] || t;
14067    }, h.getLastStoredState = function () {
14068      return h.storedStates[h.storedStates.length - 1] || t;
14069    }, h.hasUrlDuplicate = function (e) {
14070      var t = !1,
14071          n;return n = h.extractState(e.url), t = n && n.id !== e.id, t;
14072    }, h.storeState = function (e) {
14073      return h.urlToId[e.url] = e.id, h.storedStates.push(h.cloneObject(e)), e;
14074    }, h.isLastSavedState = function (e) {
14075      var t = !1,
14076          n,
14077          r,
14078          i;return h.savedStates.length && (n = e.id, r = h.getLastSavedState(), i = r.id, t = n === i), t;
14079    }, h.saveState = function (e) {
14080      return h.isLastSavedState(e) ? !1 : (h.savedStates.push(h.cloneObject(e)), !0);
14081    }, h.getStateByIndex = function (e) {
14082      var t = null;return typeof e == "undefined" ? t = h.savedStates[h.savedStates.length - 1] : e < 0 ? t = h.savedStates[h.savedStates.length + e] : t = h.savedStates[e], t;
14083    }, h.getCurrentIndex = function () {
14084      var e = null;return h.savedStates.length < 1 ? e = 0 : e = h.savedStates.length - 1, e;
14085    }, h.getHash = function (e) {
14086      var t = h.getLocationHref(e),
14087          n;return n = h.getHashByUrl(t), n;
14088    }, h.unescapeHash = function (e) {
14089      var t = h.normalizeHash(e);return t = decodeURIComponent(t), t;
14090    }, h.normalizeHash = function (e) {
14091      var t = e.replace(/[^#]*#/, "").replace(/#.*/, "");return t;
14092    }, h.setHash = function (e, t) {
14093      var n, i;return t !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.setHash, args: arguments, queue: t }), !1) : (h.busy(!0), n = h.extractState(e, !0), n && !h.emulated.pushState ? h.pushState(n.data, n.title, n.url, !1) : h.getHash() !== e && (h.bugs.setHash ? (i = h.getPageUrl(), h.pushState(null, null, i + "#" + e, !1)) : r.location.hash = e), h);
14094    }, h.escapeHash = function (t) {
14095      var n = h.normalizeHash(t);return n = e.encodeURIComponent(n), h.bugs.hashEscape || (n = n.replace(/\%21/g, "!").replace(/\%26/g, "&").replace(/\%3D/g, "=").replace(/\%3F/g, "?")), n;
14096    }, h.getHashByUrl = function (e) {
14097      var t = String(e).replace(/([^#]*)#?([^#]*)#?(.*)/, "$2");return t = h.unescapeHash(t), t;
14098    }, h.setTitle = function (e) {
14099      var t = e.title,
14100          n;t || (n = h.getStateByIndex(0), n && n.url === e.url && (t = n.title || h.options.initialTitle));try {
14101        r.getElementsByTagName("title")[0].innerHTML = t.replace("<", "&lt;").replace(">", "&gt;").replace(" & ", " &amp; ");
14102      } catch (i) {}return r.title = t, h;
14103    }, h.queues = [], h.busy = function (e) {
14104      typeof e != "undefined" ? h.busy.flag = e : typeof h.busy.flag == "undefined" && (h.busy.flag = !1);if (!h.busy.flag) {
14105        u(h.busy.timeout);var t = function () {
14106          var e, n, r;if (h.busy.flag) return;for (e = h.queues.length - 1; e >= 0; --e) {
14107            n = h.queues[e];if (n.length === 0) continue;r = n.shift(), h.fireQueueItem(r), h.busy.timeout = o(t, h.options.busyDelay);
14108          }
14109        };h.busy.timeout = o(t, h.options.busyDelay);
14110      }return h.busy.flag;
14111    }, h.busy.flag = !1, h.fireQueueItem = function (e) {
14112      return e.callback.apply(e.scope || h, e.args || []);
14113    }, h.pushQueue = function (e) {
14114      return h.queues[e.queue || 0] = h.queues[e.queue || 0] || [], h.queues[e.queue || 0].push(e), h;
14115    }, h.queue = function (e, t) {
14116      return typeof e == "function" && (e = { callback: e }), typeof t != "undefined" && (e.queue = t), h.busy() ? h.pushQueue(e) : h.fireQueueItem(e), h;
14117    }, h.clearQueue = function () {
14118      return h.busy.flag = !1, h.queues = [], h;
14119    }, h.stateChanged = !1, h.doubleChecker = !1, h.doubleCheckComplete = function () {
14120      return h.stateChanged = !0, h.doubleCheckClear(), h;
14121    }, h.doubleCheckClear = function () {
14122      return h.doubleChecker && (u(h.doubleChecker), h.doubleChecker = !1), h;
14123    }, h.doubleCheck = function (e) {
14124      return h.stateChanged = !1, h.doubleCheckClear(), h.bugs.ieDoubleCheck && (h.doubleChecker = o(function () {
14125        return h.doubleCheckClear(), h.stateChanged || e(), !0;
14126      }, h.options.doubleCheckInterval)), h;
14127    }, h.safariStatePoll = function () {
14128      var t = h.extractState(h.getLocationHref()),
14129          n;if (!h.isLastSavedState(t)) return n = t, n || (n = h.createStateObject()), h.Adapter.trigger(e, "popstate"), h;return;
14130    }, h.back = function (e) {
14131      return e !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.back, args: arguments, queue: e }), !1) : (h.busy(!0), h.doubleCheck(function () {
14132        h.back(!1);
14133      }), p.go(-1), !0);
14134    }, h.forward = function (e) {
14135      return e !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.forward, args: arguments, queue: e }), !1) : (h.busy(!0), h.doubleCheck(function () {
14136        h.forward(!1);
14137      }), p.go(1), !0);
14138    }, h.go = function (e, t) {
14139      var n;if (e > 0) for (n = 1; n <= e; ++n) h.forward(t);else {
14140        if (!(e < 0)) throw new Error("History.go: History.go requires a positive or negative integer passed.");for (n = -1; n >= e; --n) h.back(t);
14141      }return h;
14142    };if (h.emulated.pushState) {
14143      var v = function () {};h.pushState = h.pushState || v, h.replaceState = h.replaceState || v;
14144    } else h.onPopState = function (t, n) {
14145      var r = !1,
14146          i = !1,
14147          s,
14148          o;return h.doubleCheckComplete(), s = h.getHash(), s ? (o = h.extractState(s || h.getLocationHref(), !0), o ? h.replaceState(o.data, o.title, o.url, !1) : (h.Adapter.trigger(e, "anchorchange"), h.busy(!1)), h.expectedStateId = !1, !1) : (r = h.Adapter.extractEventData("state", t, n) || !1, r ? i = h.getStateById(r) : h.expectedStateId ? i = h.getStateById(h.expectedStateId) : i = h.extractState(h.getLocationHref()), i || (i = h.createStateObject(null, null, h.getLocationHref())), h.expectedStateId = !1, h.isLastSavedState(i) ? (h.busy(!1), !1) : (h.storeState(i), h.saveState(i), h.setTitle(i), h.Adapter.trigger(e, "statechange"), h.busy(!1), !0));
14149    }, h.Adapter.bind(e, "popstate", h.onPopState), h.pushState = function (t, n, r, i) {
14150      if (h.getHashByUrl(r) && h.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if (i !== !1 && h.busy()) return h.pushQueue({ scope: h, callback: h.pushState, args: arguments, queue: i }), !1;h.busy(!0);var s = h.createStateObject(t, n, r);return h.isLastSavedState(s) ? h.busy(!1) : (h.storeState(s), h.expectedStateId = s.id, p.pushState(s.id, s.title, s.url), h.Adapter.trigger(e, "popstate")), !0;
14151    }, h.replaceState = function (t, n, r, i) {
14152      if (h.getHashByUrl(r) && h.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if (i !== !1 && h.busy()) return h.pushQueue({ scope: h, callback: h.replaceState, args: arguments, queue: i }), !1;h.busy(!0);var s = h.createStateObject(t, n, r);return h.isLastSavedState(s) ? h.busy(!1) : (h.storeState(s), h.expectedStateId = s.id, p.replaceState(s.id, s.title, s.url), h.Adapter.trigger(e, "popstate")), !0;
14153    };if (s) {
14154      try {
14155        h.store = l.parse(s.getItem("History.store")) || {};
14156      } catch (m) {
14157        h.store = {};
14158      }h.normalizeStore();
14159    } else h.store = {}, h.normalizeStore();h.Adapter.bind(e, "unload", h.clearAllIntervals), h.saveState(h.storeState(h.extractState(h.getLocationHref(), !0))), s && (h.onUnload = function () {
14160      var e, t, n;try {
14161        e = l.parse(s.getItem("History.store")) || {};
14162      } catch (r) {
14163        e = {};
14164      }e.idToState = e.idToState || {}, e.urlToId = e.urlToId || {}, e.stateToId = e.stateToId || {};for (t in h.idToState) {
14165        if (!h.idToState.hasOwnProperty(t)) continue;e.idToState[t] = h.idToState[t];
14166      }for (t in h.urlToId) {
14167        if (!h.urlToId.hasOwnProperty(t)) continue;e.urlToId[t] = h.urlToId[t];
14168      }for (t in h.stateToId) {
14169        if (!h.stateToId.hasOwnProperty(t)) continue;e.stateToId[t] = h.stateToId[t];
14170      }h.store = e, h.normalizeStore(), n = l.stringify(e);try {
14171        s.setItem("History.store", n);
14172      } catch (i) {
14173        if (i.code !== DOMException.QUOTA_EXCEEDED_ERR) throw i;s.length && (s.removeItem("History.store"), s.setItem("History.store", n));
14174      }
14175    }, h.intervalList.push(a(h.onUnload, h.options.storeInterval)), h.Adapter.bind(e, "beforeunload", h.onUnload), h.Adapter.bind(e, "unload", h.onUnload));if (!h.emulated.pushState) {
14176      h.bugs.safariPoll && h.intervalList.push(a(h.safariStatePoll, h.options.safariPollInterval));if (i.vendor === "Apple Computer, Inc." || (i.appCodeName || "") === "Mozilla") h.Adapter.bind(e, "hashchange", function () {
14177        h.Adapter.trigger(e, "popstate");
14178      }), h.getHash() && h.Adapter.onDomLoad(function () {
14179        h.Adapter.trigger(e, "hashchange");
14180      });
14181    }
14182  }, (!h.options || !h.options.delayInit) && h.init();
14183}(window);
14184/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
14185
14186/***/ }),
14187/* 31 */
14188/***/ (function(module, exports, __webpack_require__) {
14189
14190var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
14191 * jQuery Cookie Plugin v1.4.1
14192 * https://github.com/carhartl/jquery-cookie
14193 *
14194 * Copyright 2006, 2014 Klaus Hartl
14195 * Released under the MIT license
14196 */
14197(function (a) {
14198  if (true) {
14199    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_FACTORY__ = (a),
14200				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14201				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14202				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14203  } else {
14204    if (typeof exports === "object") {
14205      module.exports = a(require("jquery"));
14206    } else {
14207      a(jQuery);
14208    }
14209  }
14210})(function (f) {
14211  var e = /\+/g;function a(i) {
14212    return b.raw ? i : encodeURIComponent(i);
14213  }function h(i) {
14214    return b.raw ? i : decodeURIComponent(i);
14215  }function g(i) {
14216    return a(b.json ? JSON.stringify(i) : String(i));
14217  }function c(i) {
14218    if (i.indexOf('"') === 0) {
14219      i = i.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\");
14220    }try {
14221      i = decodeURIComponent(i.replace(e, " "));return b.json ? JSON.parse(i) : i;
14222    } catch (j) {}
14223  }function d(j, i) {
14224    var k = b.raw ? j : c(j);return f.isFunction(i) ? i(k) : k;
14225  }var b = f.cookie = function (s, r, p) {
14226    if (arguments.length > 1 && !f.isFunction(r)) {
14227      p = f.extend({}, b.defaults, p);if (typeof p.expires === "number") {
14228        var v = p.expires,
14229            w = p.expires = new Date();w.setMilliseconds(w.getMilliseconds() + v * 86400000);
14230      }return document.cookie = [a(s), "=", g(r), p.expires ? "; expires=" + p.expires.toUTCString() : "", p.path ? "; path=" + p.path : "", p.domain ? "; domain=" + p.domain : "", p.secure ? "; secure" : ""].join("");
14231    }var q = s ? undefined : {},
14232        u = document.cookie ? document.cookie.split("; ") : [],
14233        n = 0,
14234        k = u.length;for (; n < k; n++) {
14235      var m = u[n].split("="),
14236          j = h(m.shift()),
14237          o = m.join("=");if (s === j) {
14238        q = d(o, r);break;
14239      }if (!s && (o = d(o)) !== undefined) {
14240        q[j] = o;
14241      }
14242    }return q;
14243  };b.defaults = {};f.removeCookie = function (j, i) {
vendor: 7,876 bytes, lines 14244-14464
14244    f.cookie(j, "", f.extend({}, i, { expires: -1 }));return !f.cookie(j);
14245  };
14246});
14247
14248/***/ }),
14249/* 32 */
14250/***/ (function(module, exports, __webpack_require__) {
14251
14252var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
14253 * jQuery Mousewheel 3.1.13
14254 *
14255 * Copyright jQuery Foundation and other contributors
14256 * Released under the MIT license
14257 * http://jquery.org/license
14258 */
14259
14260(function (factory) {
14261    if (true) {
14262        // AMD. Register as an anonymous module.
14263        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14264				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14265				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14266				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14267    } else if (typeof exports === 'object') {
14268        // Node/CommonJS style for Browserify
14269        module.exports = factory;
14270    } else {
14271        // Browser globals
14272        factory(jQuery);
14273    }
14274})(function ($) {
14275
14276    var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
14277        toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
14278        slice = Array.prototype.slice,
14279        nullLowestDeltaTimeout,
14280        lowestDelta;
14281
14282    if ($.event.fixHooks) {
14283        for (var i = toFix.length; i;) {
14284            $.event.fixHooks[toFix[--i]] = $.event.mouseHooks;
14285        }
14286    }
14287
14288    var special = $.event.special.mousewheel = {
14289        version: '3.1.12',
14290
14291        setup: function () {
14292            if (this.addEventListener) {
14293                for (var i = toBind.length; i;) {
14294                    this.addEventListener(toBind[--i], handler, false);
14295                }
14296            } else {
14297                this.onmousewheel = handler;
14298            }
14299            // Store the line height and page height for this particular element
14300            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
14301            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
14302        },
14303
14304        teardown: function () {
14305            if (this.removeEventListener) {
14306                for (var i = toBind.length; i;) {
14307                    this.removeEventListener(toBind[--i], handler, false);
14308                }
14309            } else {
14310                this.onmousewheel = null;
14311            }
14312            // Clean up the data we added to the element
14313            $.removeData(this, 'mousewheel-line-height');
14314            $.removeData(this, 'mousewheel-page-height');
14315        },
14316
14317        getLineHeight: function (elem) {
14318            var $elem = $(elem),
14319                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
14320            if (!$parent.length) {
14321                $parent = $('body');
14322            }
14323            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
14324        },
14325
14326        getPageHeight: function (elem) {
14327            return $(elem).height();
14328        },
14329
14330        settings: {
14331            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
14332            normalizeOffset: true // calls getBoundingClientRect for each event
14333        }
14334    };
14335
14336    $.fn.extend({
14337        mousewheel: function (fn) {
14338            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
14339        },
14340
14341        unmousewheel: function (fn) {
14342            return this.unbind('mousewheel', fn);
14343        }
14344    });
14345
14346    function handler(event) {
14347        var orgEvent = event || window.event,
14348            args = slice.call(arguments, 1),
14349            delta = 0,
14350            deltaX = 0,
14351            deltaY = 0,
14352            absDelta = 0,
14353            offsetX = 0,
14354            offsetY = 0;
14355        event = $.event.fix(orgEvent);
14356        event.type = 'mousewheel';
14357
14358        // Old school scrollwheel delta
14359        if ('detail' in orgEvent) {
14360            deltaY = orgEvent.detail * -1;
14361        }
14362        if ('wheelDelta' in orgEvent) {
14363            deltaY = orgEvent.wheelDelta;
14364        }
14365        if ('wheelDeltaY' in orgEvent) {
14366            deltaY = orgEvent.wheelDeltaY;
14367        }
14368        if ('wheelDeltaX' in orgEvent) {
14369            deltaX = orgEvent.wheelDeltaX * -1;
14370        }
14371
14372        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
14373        if ('axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) {
14374            deltaX = deltaY * -1;
14375            deltaY = 0;
14376        }
14377
14378        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
14379        delta = deltaY === 0 ? deltaX : deltaY;
14380
14381        // New school wheel delta (wheel event)
14382        if ('deltaY' in orgEvent) {
14383            deltaY = orgEvent.deltaY * -1;
14384            delta = deltaY;
14385        }
14386        if ('deltaX' in orgEvent) {
14387            deltaX = orgEvent.deltaX;
14388            if (deltaY === 0) {
14389                delta = deltaX * -1;
14390            }
14391        }
14392
14393        // No change actually happened, no reason to go any further
14394        if (deltaY === 0 && deltaX === 0) {
14395            return;
14396        }
14397
14398        // Need to convert lines and pages to pixels if we aren't already in pixels
14399        // There are three delta modes:
14400        //   * deltaMode 0 is by pixels, nothing to do
14401        //   * deltaMode 1 is by lines
14402        //   * deltaMode 2 is by pages
14403        if (orgEvent.deltaMode === 1) {
14404            var lineHeight = $.data(this, 'mousewheel-line-height');
14405            delta *= lineHeight;
14406            deltaY *= lineHeight;
14407            deltaX *= lineHeight;
14408        } else if (orgEvent.deltaMode === 2) {
14409            var pageHeight = $.data(this, 'mousewheel-page-height');
14410            delta *= pageHeight;
14411            deltaY *= pageHeight;
14412            deltaX *= pageHeight;
14413        }
14414
14415        // Store lowest absolute delta to normalize the delta values
14416        absDelta = Math.max(Math.abs(deltaY), Math.abs(deltaX));
14417
14418        if (!lowestDelta || absDelta < lowestDelta) {
14419            lowestDelta = absDelta;
14420
14421            // Adjust older deltas if necessary
14422            if (shouldAdjustOldDeltas(orgEvent, absDelta)) {
14423                lowestDelta /= 40;
14424            }
14425        }
14426
14427        // Adjust older deltas if necessary
14428        if (shouldAdjustOldDeltas(orgEvent, absDelta)) {
14429            // Divide all the things by 40!
14430            delta /= 40;
14431            deltaX /= 40;
14432            deltaY /= 40;
14433        }
14434
14435        // Get a whole, normalized value for the deltas
14436        delta = Math[delta >= 1 ? 'floor' : 'ceil'](delta / lowestDelta);
14437        deltaX = Math[deltaX >= 1 ? 'floor' : 'ceil'](deltaX / lowestDelta);
14438        deltaY = Math[deltaY >= 1 ? 'floor' : 'ceil'](deltaY / lowestDelta);
14439
14440        // Normalise offsetX and offsetY properties
14441        if (special.settings.normalizeOffset && this.getBoundingClientRect) {
14442            var boundingRect = this.getBoundingClientRect();
14443            offsetX = event.clientX - boundingRect.left;
14444            offsetY = event.clientY - boundingRect.top;
14445        }
14446
14447        // Add information to the event object
14448        event.deltaX = deltaX;
14449        event.deltaY = deltaY;
14450        event.deltaFactor = lowestDelta;
14451        event.offsetX = offsetX;
14452        event.offsetY = offsetY;
14453        // Go ahead and set deltaMode to 0 since we converted to pixels
14454        // Although this is a little odd since we overwrite the deltaX/Y
14455        // properties with normalized deltas.
14456        event.deltaMode = 0;
14457
14458        // Add event and delta to the front of the arguments
14459        args.unshift(event, delta, deltaX, deltaY);
14460
14461        // Clearout lowestDelta after sometime to better
14462        // handle multiple device types that give different
14463        // a different lowestDelta
14464        // Ex: trackpad = 3 and mouse wheel = 120
14465        if (nullLowestDeltaTimeout) {
14466            clearTimeout(nullLowestDeltaTimeout);
14467        }
14468        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
14469
14470        return ($.event.dispatch || $.event.handle).apply(this, args);
14471    }
14472
14473    function nullLowestDelta() {
14474        lowestDelta = null;
14475    }
14476
14477    function shouldAdjustOldDeltas(orgEvent, absDelta) {
14478        // If this is an older event and the delta is divisable by 120,
14479        // then we are assuming that the browser is treating this as an
14480        // older mouse wheel event and that we should divide the deltas
14481        // by 40 to try and get a more usable deltaFactor.
14482        // Side note, this actually impacts the reported scroll distance
14483        // in older browsers and can cause scrolling to be slower than native.
14484        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
14485        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
14486    }
14487});
14488
14489/***/ }),
14490/* 33 */,
14491/* 34 */,
14492/* 35 */
14493/***/ (function(module, __webpack_exports__, __webpack_require__) {
14494
14495"use strict";
14496Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
14497/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
14498/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
14499/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jquery_history__ = __webpack_require__(30);
14500/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jquery_history___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_jquery_history__);
14501/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_jquery_cookie__ = __webpack_require__(31);
14502/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_jquery_cookie___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_jquery_cookie__);
14503/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jqWheel__ = __webpack_require__(32);
14504/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jqWheel___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_jqWheel__);
14505/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_iscroll__ = __webpack_require__(36);
14506/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_iscroll___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_iscroll__);
14507/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_slick__ = __webpack_require__(27);
14508/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_slick___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_slick__);
14509/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__lib_slick_slick_css__ = __webpack_require__(28);
14510/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__lib_slick_slick_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6__lib_slick_slick_css__);
14511/* eslint no-loop-func: 0 */
14512/* eslint no-unused-vars: 0 */
14513/* eslint prefer-destructuring: ["off", {VariableDeclarator: {object: false}}] */
14514/* eslint no-lonely-if: "off" */
14515/* eslint max-len: ["off", { "code": 200 }] */
14516/* eslint no-undef: "off" */
14517/* eslint func-names: ["error", "never"] */
14518/* eslint consistent-return: "off" */
14519/* eslint no-restricted-globals: ["off", "screen"] */
14520/**
14521 * ------------------------------------------------------------------
14522 * 首页互动
14523 * ------------------------------------------------------------------
14524 *
14525 * @date     2018-01-05
14526 * @author   沈元(原),telliex<[email protected]>(改)
14527 */
14528
14529/**
14530 * ------------------------------------------------------------------
14531 * 首页互动
14532 * ------------------------------------------------------------------
14533 *
14534 * isMobileDevice 用來判斷桌機0 手機1 桌機縮成手機狀態2
14535
14536 */
14537
14538
14539
14540
14541
14542
14543
14544
14545// import '../lib/slick/slick-theme.css';
14546// import 'jqMobile';
14547
14548$(() => {
14549  // 設定元件
14550  const $window = $(window);
14551  let windowHeight = 0; // 视窗高度
14552  let windoWidth = 0; // 视窗宽度
14553  let isMobileDevice = 0; // 是否为手持装置
14554  let isFirstScreenLoaded = 0; // 第一屏是否已载入
14555  let isScreenMove = 0; // screen 切换中
14556  let isScreenInMove = 0; // 第二屏互动是否滑动中
14557  let popIndexOfScreen = 0; // 第二屏 pop  index
14558  let curVideoIndex = 0; // 当前 video index
14559  let isvideorun = 0;
14560  let videofunc; // video 轮播
14561  let isvidover = 0;
14562  let isPopBlockShowed = 0;
14563  let currentScreen = 0; // 当前屏
14564  let tempopen = 0;
14565  let orientation = ''; // 一开始进页面时装置的方向 portrait or landscape
14566  let orientationStatus = false; // 是否因为装置转向触发
14567  // let scrollTimer; // window scroll timmer
14568  let resizeTimer; // window resize timmer
14569  const itemNavList = $('#headerForMobile .main-nav-list');
14570
14571  $('#headerForDesktop').hide();
14572  $('#headerForMobile').hide();
14573	$('#home-menu').hide();
14574	$('#home-step').hide();
14575  // $('#firstScreenBGViaDesktop').css('opacity', 0);
14576  // $('#firstScreenBGViaMobile').css('opacity', 0);
14577  // $('#indexcut1content').css('opacity', 0);
14578
14579  $('#footer').hide();
14580
14581  //   function tap(element, callBack) {
14582  //     // 触摸开始的时间
14583  //     let startTime = 0;
14584  //     // 定义touchmove是否触发
14585  //     let ismove = false;
14586  //     const maxTime = 250;
14587  //     let target;
14588  //     element.on('touchstart', (e) => {
14589  //             startTime = Date.now();
14590  //             ismove = false;
14591  //             target = e;
14592  //             return false;
14593  //         });
14594
14595  //     element.on('touchmove', (e) => {
14596  //             //触发就赋值为true
14597  //             ismove = true;
14598  //             return false;
14599  //         });
14600
14601  //     element.on('touchend', function (e) {
14602  //       // 判断是否是touchmove是否触发
14603  //       if (ismove) {
14604  //         return;
14605  //       }
14606
14607  //       // 判断是否为长按
14608  //       if ((Date.now() - startTime) > maxTime) {
14609  //         return;
14610  //       }
14611
14612  //       // 如果能够到这里
14613  //       callBack($(this));
14614  //       return false;
14615  //     });
14616  //   }
14617
14618  /*
14619      | RWD 规则
14620      */
14621  function checkViewport(viewportF) {
14622    if (viewportF >= 1360) {
14623      return 'desktop';
14624    } else if (viewportF >= 960 && viewportF < 1360) {
14625      return 'desktop';
14626    } else if (viewportF >= 768 && viewportF < 960) {
14627      return 'mobile';
14628    }
14629    return 'mobile';
14630  }
14631  /*
14632      | 当前画面宽度
14633       */
14634  function viewport() {
14635    let e = window;
14636    let a = 'inner';
14637    if (!('innerWidth' in window)) {
14638      a = 'client';
14639      e = document.documentElement || document.body;
14640    }
14641    return e[`${a}Width`];
14642  }
14643
14644  /*
14645      | Screen3 Video 标题及 icon 图示更换
14646      */
14647  function videoone() {
14648    const temp = `text${curVideoIndex}`;
14649    $('.indexcut3-title').html($('.indexcut3-title').data(temp));
14650    $('.cut3video').hide();
14651    $('.cut3video').eq(curVideoIndex).fadeIn(300);
14652
14653    const video = $(`#video${curVideoIndex}`).get(0);
14654    if (video.readyState === 4) {
14655      // alert("AA");
14656      video.currentTime = 0;
14657      video.play();
14658    }
14659    // $(".cut3video").eq(curVideoIndex).currentTime = 0;
14660    for (let b = 0; b < $('.indexcut3click').length; b += 1) {
14661      if (b === curVideoIndex) {
14662        $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}x.png`);
14663      } else {
14664        $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}.png`);
14665      }
14666    }
14667  }
14668  /*
14669      | Screen3 图片替换
14670      */
14671  function changcut3img() {
14672    for (let b = 0; b < $('.indexcut3click').length; b += 1) {
14673      if (b === curVideoIndex) {
14674        $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}x.png`);
14675      } else if (isMobileDevice === 0) {
14676        $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}.png`);
14677      } else {
14678        $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}b.png`);
14679      }
14680    }
14681  }
14682  /*
14683      | Screen3 Video 轮播
14684      */
14685  function runvideos() {
14686    // 导入按钮图片
14687    changcut3img();
14688    if (isMobileDevice === 0) {
14689      $('.indexcut3mc').hide();
14690      if (isvideorun === 0) {
14691        isvideorun = 1;
14692        videoone();
14693        videofunc = setInterval(() => {
14694          if (isvidover === 0) {
14695            curVideoIndex += 1;
14696            if (curVideoIndex >= $('.cut3video').length) {
14697              curVideoIndex = 0;
14698            }
14699          }
14700          videoone();
14701        }, 3300);
14702      }
14703    } else {
14704      $('.cut3video').hide();
14705      if (isvideorun === 1) {
14706        clearInterval(videofunc);
14707        isvideorun = 0;
14708      }
14709      $('.indexcut3mc').hide();
14710      $('.indexcut3mc').eq(curVideoIndex).show();
14711    }
14712  }
14713  /*
14714      | 切换 Screen FN ,用于卷动时换屏
14715      */
14716  function scrollSlide(direction) {
14717    // 若選單遮罩出現的情況下切換屏,及收回選單遮罩
14718    if ($('body').hasClass('screen-mask')) {
14719      itemNavList.slideToggle();
14720      $('#headerForMobile .panel-btn-icon').toggleClass('status-close');
14721      $('body').toggleClass('screen-mask');
14722    }
14723
14724    if (isFirstScreenLoaded === 1) {
14725      // 等首頁讀完
14726      const fNum = $('.fullcutwrap').length;
14727      let nextScreen;
14728
14729      if (direction === 'U') {
14730        nextScreen = currentScreen - 1;
14731      } else {
14732        nextScreen = currentScreen + 1;
14733      }
14734
14735      if (nextScreen < 0) {
14736        nextScreen = 0;
14737      } else if (nextScreen >= fNum) {
14738        nextScreen = fNum - 1;
14739      }
14740
14741      if (nextScreen === currentScreen) {
14742
14743        // ..
14744      } else {
14745        $('#bodywrap').animate({ top: -windowHeight * nextScreen }, 500);
14746        if (nextScreen === 0) {
14747          if ($('#headerForMobile').css('display') === 'block') {
14748            $('#headerForMobile').fadeOut(600);
14749          }
14750          if (checkViewport(viewport()) === 'mobile') {
14751            // ..
14752          } else {
14753            $('#headerForDesktop').fadeIn(600);
14754          }
14755        } else {
14756          if (checkViewport(viewport()) === 'mobile') {
14757            $('#headerForMobile').fadeIn(600);
14758          }
14759          if ($('#headerForDesktop').css('display') === 'block') {
14760            $('#headerForDesktop').fadeOut(600);
14761          }
14762        }
14763        currentScreen = nextScreen;
14764        if (currentScreen === 0) {
14765          // 停止 Screen3 video 轮播
14766          clearInterval(videofunc);
14767          isvideorun = 0;
14768        } else if (currentScreen === 1) {
14769          // 停止 Screen3 video 轮播
14770          clearInterval(videofunc);
14771          isvideorun = 0;
14772        } else if (currentScreen === 2) {
14773          // 启动 Screen3 video
14774          runvideos();
14775        }
14776      }
14777			const homeIndex = nextScreen+1;
14778			$('#home-step ul li').removeClass('active');
14779			$('#home-step ul li:nth-child('+homeIndex+')').addClass('active');
14780			if (checkViewport(viewport()) === 'mobile') {
14781				if (homeIndex === 4) {
14782					$('#home-menu').hide();
14783				} else {
14784					if (homeIndex > 1) {
14785						$('#home-menu').addClass('home-menu-oth');
14786					} else {
14787						$('#home-menu').removeClass('home-menu-oth');
14788					}
14789					$('#home-menu').show();
14790				}
14791			}
14792    }
14793  }
14794
14795  /*
14796      | Screen1 Start,第一屏进入
14797      */
14798  function firstScreenStart() {
14799		console.log('first');
14800    // 第一屏物件初始化隐藏
14801    $('#indexcut1content').css('margin-top', -20).css('opacity', 0);
14802    $('#indexstartclick').css('opacity', 0);
14803		$('#home-step').css('opacity', 0);
14804		$('#home-menu').css('opacity', 0);
14805    $('#firstScreenBGViaDesktop').css('opacity', 0);
14806    $('#firstScreenBGViaMobile').css('opacity', 0);
14807    $('#indexpreload').css('width', 0).css('height', 0);
14808    $('#headerForDesktop').css('opacity', 0);
14809
14810    const tepimgp = new Image();
14811    tepimgp.onload = function () {
14812      $('#indexpreload').stop().animate({
14813        width: 124, height: 124, 'margin-top': -62, 'margin-left': -62, opacity: 1
14814      }, 500);
14815      let ximglist;
14816      let it;
14817      let il;
14818      let iw;
14819      let ih;
14820      let neww;
14821      let newh;
14822
14823      if (isMobileDevice === 1) {
14824        // 移动手持装置
14825        ximglist = ['/img/cut1bg.jpg', 'img/indexcut11.png', 'img/indexcut21.jpg', 'img/indexcut22.jpg', 'img/indexcut23.jpg', 'img/indexcut24.jpg', 'img/indexcut21b.jpg', 'img/indexcut22b.jpg', 'img/indexcut23b.jpg', 'img/indexcut24b.jpg'];
14826        for (let i = 0; i < $('#firstScreenBGViaDesktop .image img').size(); i += 1) {
14827          ximglist.push($('#firstScreenBGViaDesktop .image img')[i].src);
14828        }
14829        for (let i = 0; i < $('#firstScreenBGViaMobile .image img').size(); i += 1) {
14830          ximglist.push($('#firstScreenBGViaMobile .image img')[i].src);
14831        }
14832      } else {
14833        // 'img/cut1bg.jpg', 'img/cut1bgm.jpg'
14834        ximglist = ['/img/cut1bg.jpg', '/img/cut1bgm.jpg', 'img/indexcut11.png', 'img/indexcut21.jpg', 'img/indexcut22.jpg', 'img/indexcut23.jpg', 'img/indexcut24.jpg', 'img/indexcut21b.jpg', 'img/indexcut22b.jpg', 'img/indexcut23b.jpg', 'img/indexcut24b.jpg'];
14835        for (let i = 0; i < $('#firstScreenBGViaDesktop .image img').size(); i += 1) {
14836          ximglist.push($('#firstScreenBGViaDesktop .image img')[i].src);
14837        }
14838      }
14839      let imgLoadedNum = ximglist.length;
14840      const imgArrayNum = ximglist.length;
14841      const tepimg = [];
14842
14843      for (let a = 0; a < imgArrayNum; a += 1) {
14844        tepimg[a] = new Image();
14845        tepimg[a].onload = function () {
14846          imgLoadedNum -= 1;
14847        };
14848        tepimg[a].src = ximglist[a];
14849      }
14850
14851      // 侦听图片是否载完
14852      const chkload = setInterval(() => {
14853        if (imgLoadedNum <= 0) {
14854          // 图片载完进行后续工作
14855          clearInterval(chkload);
14856
14857          $('#indexpreload').fadeOut(2000);
14858
14859          $('#headerForDesktop').stop().delay(2000).animate({ opacity: 1 }, 500);
14860
14861          // 第一屏背景图淡入
14862          if (checkViewport(viewport()) === 'mobile') {
14863            // 手持装置
14864            $('#firstScreenBGViaDesktop').css('z-index', '-999');
14865            $('#firstScreenBGViaMobile').css('z-index', '1');
14866
14867            it = parseInt($('#firstScreenBGViaMobile').css('top'), 10);
14868            il = parseInt($('#firstScreenBGViaMobile').css('left'), 10);
14869            iw = $('#firstScreenBGViaMobile').width();
14870            ih = $('#firstScreenBGViaMobile').height();
14871            neww = iw * 1.1;
14872            newh = ih * 1.1;
14873            it -= (newh - ih) / 2;
14874            il -= (neww - iw) / 2;
14875            $('#firstScreenBGViaMobile').stop(true, true).delay(2000).animate({ opacity: 1 }, 500);
14876          } else {
14877            // 桌机装置
14878            $('#firstScreenBGViaDesktop').css('z-index', '1');
14879            $('#firstScreenBGViaMobile').css('z-index', '-999');
14880
14881            it = parseInt($('#firstScreenBGViaDesktop').css('top'), 10);
14882            il = parseInt($('#firstScreenBGViaDesktop').css('left'), 10);
14883            iw = $('#firstScreenBGViaDesktop').width();
14884            ih = $('#firstScreenBGViaDesktop').height();
14885            neww = iw * 1.1;
14886            newh = ih * 1.1;
14887            it -= (newh - ih) / 2;
14888            il -= (neww - iw) / 2;
14889            $('#firstScreenBGViaDesktop').stop(true, true).delay(2000).animate({ opacity: 1 }, 500);
14890          }
14891          // 第一屏文字淡入
14892          $('#indexcut1content').stop().delay(3500).animate({ 'margin-top': 0, opacity: 1 }, 1500);
14893          // 第一屏箭头淡入
14894          $('#indexstartclick').stop().delay(4000).animate({ opacity: 1 }, 1500);
14895          $('#indexstartclick').addClass('arrow-animation');
14896					$('#home-step').stop().delay(4000).animate({ opacity: 1 }, 1500);
14897					$('#home-menu').stop().delay(4000).animate({ opacity: 1 }, 1500);
14898
14899          isFirstScreenLoaded = 1;
14900        }
14901      }, 500);
14902    };
14903
14904    tepimgp.src = 'img/loading.gif';
14905
14906    if (isMobileDevice === 1) {
14907      // $('.fadeM').slick('unslick');
14908      // $('.fadeM').unslick();
14909      $('.fadeM').slick({
14910        pauseOnFocus: true,
14911        autoplay: true,
14912        autoplaySpeed: 5000,
14913        dots: false,
14914        infinite: true,
14915        speed: 1000,
14916        arrows: false,
14917        fade: true,
14918        cssEase: 'linear'
14919      });
14920
14921      $('.fadeM').on('afterChange', () => {
14922        const currentSlide = $('.fadeM').slick('slickCurrentSlide');
14923        $('#bannerToURL').attr('href', $('.fadeM').find('img').eq(currentSlide).attr('data-url'));
14924      });
14925
14926      // tap($("#indexstartclick"), function() {
14927      //     scrollSlide("D");
14928      //     return false;
14929      // })
14930      // 点击向下按钮往下移动到第2屏
14931      $('#indexstartclick').on('click', () => {
14932        scrollSlide('D');
14933        return false;
14934      });
14935    } else {
14936      $('.fadeD').slick({
14937        pauseOnFocus: true,
14938        autoplay: true,
14939        adaptiveHeight: true,
14940        autoplaySpeed: 5000,
14941        dots: false,
14942        infinite: true,
14943        speed: 1000,
14944        arrows: false,
14945        fade: true,
14946        cssEase: 'linear'
14947      });
14948
14949      $('.fadeD').on('afterChange', () => {
14950        const currentSlide = $('.fadeD').slick('slickCurrentSlide');
14951        $('#bannerToURL').attr('href', $('.fadeD').find('img').eq(currentSlide).attr('data-url'));
14952      });
14953
14954      $('.fadeD').on('destroy', () => {});
14955      // 点击向下按钮往下移动到第2屏
14956      $('#indexstartclick').on('click', () => {
14957        scrollSlide('D');
14958        return false;
14959      });
14960    }
14961  }
14962  /*
14963      | Screen2 点点动画
14964      */
14965  function showpopicon() {
14966    $('#index2icon span').removeClass('on');
14967    $('#index2icon span').eq(popIndexOfScreen).addClass('on');
14968    $('#index2icon').show();
14969    isScreenInMove = 0;
14970  }
14971
14972  /*
14973      | Screen2 與 slide 动画
14974       */
14975  function inSlide(x) {
14976    if (x === popIndexOfScreen) {
14977      // ..
14978    } else if (x > popIndexOfScreen) {
14979      // 活动前定位
14980      $('.indexcut2item').eq(x).children('.hidetext').css('left', '100%').css('z-index', '9999').show();
14981      $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').css('z-index', '9998');
14982      // 开始滑动
14983      $('.indexcut2item').eq(x).children('.hidetext').animate({ left: 0 }, 500, () => {
14984        $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').hide();
14985        popIndexOfScreen = x;
14986        showpopicon();
14987      });
14988    } else {
14989      // 动画往右滑
14990      // 活动前定位
14991      $('.indexcut2item').eq(x).children('.hidetext').css('left', '-100%').css('z-index', '9999').show();
14992      $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').css('z-index', '9998');
14993      // 开始滑动
14994      $('.indexcut2item').eq(x).children('.hidetext').animate({ left: 0 }, 500, () => {
14995        $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').hide();
14996        popIndexOfScreen = x;
14997        showpopicon();
14998      });
14999    }
15000  }
15001  /*
15002      | Screen2 Start,第二屏进入
15003      */
15004  function secondScreenStart() {
15005    if (isMobileDevice === 0) {
15006      // 桌机装置
15007      // 事件初始化
15008      $('.indexcut2item').off('click');
15009      $('.indexcut2item .hidetext .closeclick').off('click');
15010      $('#index2icon span').off('click');
15011
15012      $('.indexcut2item').on('mouseenter', function () {
15013        const index = $('.indexcut2item').index($(this));
15014        for (let i = 0; i < 4; i += 1) {
15015          const moreon = 0;
15016          if (i === index) {
15017            $('.indexcut2item').eq(i).children('.itembg').stop().fadeIn(300);
15018            if (moreon === 1) {
15019              $('.indexcut2item').eq(i).children('.hidetext').stop().delay(500).fadeIn(500);
15020            } else {
15021              $('.indexcut2item').eq(i).children('.destext').stop().delay(500).fadeIn(500);
15022            }
15023            $('.indexcut2item').eq(i).children('.titletext').stop().hide(); // .fadeOut(200);
15024            $('.indexcut2item').eq(i).stop().animate({ width: '54.5%' }, 300);
15025          } else {
15026            $('.indexcut2item').eq(i).children('.titletext').stop().show();
15027            $('.indexcut2item').eq(i).stop().animate({ width: '14.5%' }, 300);
15028          }
15029        }
15030
15031        $(this).find('.destext .more').click(function () {
15032          // moreon = 1;
15033          $(this).parents('.destext').stop().fadeOut(500);
15034          $(this).parents('.destext').siblings('.hidetext').stop().fadeIn(500);
15035        });
15036        $('.indexcut2item .hidetext .more').click(function () {
15037          // moreon = 0;
15038          $(this).parents('.hidetext').stop().fadeOut(500);
15039          $(this).parents('.hidetext').siblings('.destext').stop().fadeIn(500);
15040        });
15041      });
15042
15043      $('.indexcut2item').on('mouseleave', () => {
15044        $('.indexcut2item .titletext').stop().show();
15045        $('.indexcut2item').children('.itembg').stop().hide();
15046        $('.indexcut2item .destext').stop().hide();
15047        $('.indexcut2item .hidetext').stop().hide();
15048        $('.indexcut2item').stop().animate({ width: '24.5%' }, 500);
15049      });
15050    } else if (isMobileDevice === 1) {
15051      // 手持装置
15052      // tap($(".indexcut2item"), function(e) {
15053
15054
15055      //     // 手持装置才会出现
15056      //     if (isMobileDevice > 0 && isPopBlockShowed == 0) {
15057
15058
15059      //         popIndexOfScreen = $(".indexcut2item").index(e);
15060
15061      //         showpopicon();
15062      //         if (e.find(".hidetext").css("display") == "block") {
15063
15064      //         } else {
15065
15066      //             e.find(".hidetext").fadeIn();
15067
15068      //         }
15069      //         isPopBlockShowed = 1;
15070      //     }
15071      //     return false;
15072
15073
15074      // });
15075
15076      // tap($(".indexcut2item .hidetext .closeclick"), function(e) {
15077
15078      //     if (isMobileDevice > 0) {
15079
15080      //         e.parents(".hidetext").fadeOut();
15081      //         $("#index2icon").hide();
15082      //         $("#index2icon span").removeClass("on");
15083      //         isPopBlockShowed = 0;
15084
15085      //     }
15086      //     return false;
15087      // });
15088      // tap($("#index2icon span"), function(e) {
15089      //     if (isScreenInMove == 0) {
15090      //         $("#index2icon").hide();
15091      //         let index = $("#index2icon span").index(e);
15092      //         isScreenInMove = 1;
15093      //         inSlide(index);
15094
15095
15096      //     }
15097      //     return false;
15098      // });
15099
15100      $('.indexcut2item').on('click', function () {
15101        // 手持装置才会出现
15102        if (isMobileDevice > 0 && isPopBlockShowed === 0) {
15103          isPopBlockShowed = 1;
15104          popIndexOfScreen = $('.indexcut2item').index($(this));
15105          showpopicon();
15106          if ($(this).children('.hidetext').css('display') === 'block') {
15107            // ..
15108          } else {
15109            $(this).children('.hidetext').fadeIn();
15110          }
15111        }
15112        return false;
15113      });
15114
15115      $('.indexcut2item .hidetext .closeclick').on('click', function () {
15116        if (isMobileDevice > 0) {
15117          $(this).parents('.hidetext').fadeOut();
15118          $('#index2icon').hide();
15119          $('#index2icon span').removeClass('on');
15120          isPopBlockShowed = 0;
15121        }
15122        return false;
15123      });
15124      $('#index2icon span').on('click', function () {
15125        if (isScreenInMove === 0) {
15126          $('#index2icon').hide();
15127          const index = $('#index2icon span').index($(this));
15128          isScreenInMove = 1;
15129          inSlide(index);
15130        }
15131        return false;
15132      });
15133    } else {
15134      // 桌機裝置縮小到手持裝置大小
15135      // 事件初始化
15136      $('.indexcut2item').off('mouseenter');
15137      $('.indexcut2item').off('mouseleave');
15138
15139      $('.indexcut2item').on('click', function () {
15140        // 手持装置才会出现
15141        if (isMobileDevice > 0 && isPopBlockShowed === 0) {
15142          isPopBlockShowed = 1;
15143          popIndexOfScreen = $('.indexcut2item').index($(this));
15144          showpopicon();
15145          if ($(this).children('.hidetext').css('display') === 'block') {
15146            // ..
15147          } else {
15148            $(this).children('.hidetext').fadeIn();
15149          }
15150        }
15151        return false;
15152      });
15153
15154      $('.indexcut2item .hidetext .closeclick').on('click', function () {
15155        if (isMobileDevice > 0) {
15156          $(this).parents('.hidetext').fadeOut();
15157          $('#index2icon').hide();
15158          $('#index2icon span').removeClass('on');
15159          isPopBlockShowed = 0;
15160        }
15161        return false;
15162      });
15163      $('#index2icon span').on('click', function () {
15164        if (isScreenInMove === 0) {
15165          $('#index2icon').hide();
15166          const index = $('#index2icon span').index($(this));
15167          isScreenInMove = 1;
15168          inSlide(index);
15169        }
15170        return false;
15171      });
15172    }
15173  }
15174
15175  /*
15176      | Screen3 Start
15177      */
15178  function thirdScreenViaPad() {
15179    let lastY;
15180    let lastX;
15181    $('#headerForMobile').hide(600);
15182		$('home-menu').hide(600);
15183
15184    $('.indexcut3click').mouseenter(function () {
15185      isvidover = 1;
15186      if (isvideorun === 1) {
15187        clearInterval(videofunc);
15188        isvideorun = 0;
15189      }
15190      curVideoIndex = $(this).data('val');
15191      runvideos();
15192    });
15193    $('.indexcut3click').mouseleave(() => {
15194      isvidover = 0;
15195    });
15196
15197    if (isMobileDevice === 0) {//  桌機
15198
15199    } else if (isMobileDevice === 1) {
15200      // 手持裝置
15201      $('body').bind('touchstart', e => {
15202        // 判断默认行为是否可以被禁用
15203        // if (e.cancelable) {
15204        //     // 判断默认行为是否已经被禁用
15205        //     if (!e.defaultPrevented) {
15206        //         e.preventDefault();
15207        //     }
15208        // }
15209
15210        if (isPopBlockShowed === 0) {
15211          const currentY = e.originalEvent.touches[0].clientY;
15212          const currentX = e.originalEvent.touches[0].clientX;
15213          lastY = currentY;
15214          lastX = currentX;
15215        } else {
15216          const currentX = e.originalEvent.touches[0].clientX;
15217          lastX = currentX;
15218        }
15219      });
15220
15221      $('body').bind('touchend', e => {
15222        // 判断默认行为是否可以被禁用
15223        // if (e.cancelable) {
15224        //     // 判断默认行为是否已经被禁用
15225        //     if (!e.defaultPrevented) {
15226        //         e.preventDefault();
15227        //     }
15228        // }
15229
15230        if (isPopBlockShowed === 0) {
15231          const currentY = e.originalEvent.changedTouches[0].clientY;
15232          const currentX = e.originalEvent.changedTouches[0].clientX;
15233          if (Math.abs(currentX - lastX) > Math.abs(currentY - lastY) && parseInt($('.fullcutwrap').eq(2).css('top'), 10) === 0) {
15234            // 正在第三頁
15235            if (currentX > lastX) {
15236              isvidover = 1;
15237              if (isvideorun === 1) {
15238                clearInterval(videofunc);
15239                isvideorun = 0;
15240              }
15241              curVideoIndex -= 1;
15242              if (curVideoIndex < 0) {
15243                curVideoIndex = $('.indexcut3mc').length - 1;
15244              } else if (curVideoIndex >= $('.indexcut3mc').length) {
15245                curVideoIndex = 0;
15246              }
15247              runvideos();
15248            } else {
15249              isvidover = 1;
15250              if (isvideorun === 1) {
15251                clearInterval(videofunc);
15252                isvideorun = 0;
15253              }
15254              curVideoIndex += 1;
15255              if (curVideoIndex < 0) {
15256                curVideoIndex = $('.indexcut3mc').length - 1;
15257              } else if (curVideoIndex >= $('.indexcut3mc').length) {
15258                curVideoIndex = 0;
15259              }
15260              runvideos();
15261            }
15262          } else if (currentY > lastY && currentY - lastY > 20 && isScreenMove === 0) {
15263            isScreenMove = 1;
15264            scrollSlide('U');
15265            setTimeout(() => {
15266              isScreenMove = 0;
15267            }, 1500);
15268          } else if (currentY < lastY && lastY - currentY > 20 && isScreenMove === 0) {
15269            isScreenMove = 1;
15270            scrollSlide('D');
15271            setTimeout(() => {
15272              isScreenMove = 0;
15273            }, 1500);
15274          }
15275        } else {
15276          // 检测第二屏向左或向右
15277          const currentX = e.originalEvent.changedTouches[0].clientX;
15278          if (currentX > lastX && currentX - lastX > 20 && isScreenInMove === 0) {
15279            // 向右滑 && 距离超过20 && 手执装置
15280            isScreenInMove = 1; // 互动中
15281            inSlide(popIndexOfScreen - 1);
15282            setTimeout(() => {
15283              isScreenInMove = 0;
15284            }, 800); // 互动结束
15285          } else if (currentX < lastX && lastX - currentX > 20 && isScreenInMove === 0) {
15286            // 向左滑 && 距离超过20 && 手执装置
15287            isScreenInMove = 1; // 互动中
15288            inSlide(popIndexOfScreen + 1);
15289            setTimeout(() => {
15290              isScreenInMove = 0;
15291            }, 800); // 互动结束
15292          }
15293        }
15294      });
15295
15296      // tap($(".indexcut3clickm"), function(e) {
15297
15298      //     isvidover = 1;
15299      //     if (isvideorun == 1) {
15300      //         clearInterval(videofunc);
15301      //         isvideorun = 0;
15302      //     }
15303      //     if (tempopen == 0) {
15304      //         tempopen = 1;
15305      //         curVideoIndex = curVideoIndex + parseInt(e.data("val"));
15306      //         if (curVideoIndex < 0) {
15307      //             curVideoIndex = $(".indexcut3mc").length - 1;
15308      //         } else if (curVideoIndex >= $(".indexcut3mc").length) {
15309      //             curVideoIndex = 0;
15310      //         }
15311      //         runvideos();
15312      //         setTimeout(function() { tempopen = 0; }, 300);
15313      //     }
15314      // });
15315
15316      // tap($(".indexcut3click"), function(e) {
15317
15318
15319      //     isvidover = 1;
15320      //     if (isvideorun == 1) {
15321      //         clearInterval(videofunc);
15322      //         isvideorun = 0;
15323      //     }
15324      //     curVideoIndex = e.data("val");
15325      //     runvideos();
15326      // });
15327
15328      $('.indexcut3clickm').on('click', function () {
15329        isvidover = 1;
15330        if (isvideorun === 1) {
15331          clearInterval(videofunc);
15332          isvideorun = 0;
15333        }
15334        if (tempopen === 0) {
15335          tempopen = 1;
15336          curVideoIndex += parseInt($(this).data('val'), 10);
15337          if (curVideoIndex < 0) {
15338            curVideoIndex = $('.indexcut3mc').length - 1;
15339          } else if (curVideoIndex >= $('.indexcut3mc').length) {
15340            curVideoIndex = 0;
15341          }
15342          runvideos();
15343          setTimeout(() => {
15344            tempopen = 0;
15345          }, 300);
15346        }
15347      });
15348
15349      $('.indexcut3click').on('click', function () {
15350        isvidover = 1;
15351        if (isvideorun === 1) {
15352          clearInterval(videofunc);
15353          isvideorun = 0;
15354        }
15355        curVideoIndex = $(this).data('val');
15356        runvideos();
15357      });
15358    } else {
15359      // 桌機縮小到手持尺寸
15360      $('.indexcut3clickm').on('click', function () {
15361        isvidover = 1;
15362        if (isvideorun === 1) {
15363          clearInterval(videofunc);
15364          isvideorun = 0;
15365        }
15366        if (tempopen === 0) {
15367          tempopen = 1;
15368          curVideoIndex += parseInt($(this).data('val'), 10);
15369          if (curVideoIndex < 0) {
15370            curVideoIndex = $('.indexcut3mc').length - 1;
15371          } else if (curVideoIndex >= $('.indexcut3mc').length) {
15372            curVideoIndex = 0;
15373          }
15374          runvideos();
15375          setTimeout(() => {
15376            tempopen = 0;
15377          }, 300);
15378        }
15379      });
15380
15381      $('.indexcut3click').on('click', function () {
15382        isvidover = 1;
15383        if (isvideorun === 1) {
15384          clearInterval(videofunc);
15385          isvideorun = 0;
15386        }
15387        curVideoIndex = $(this).data('val');
15388        runvideos();
15389      });
15390    }
15391  }
15392
15393  /*
15394      | 画框架
15395      */
15396  function setSize() {
15397    windowHeight = $window.height();
15398    windoWidth = $window.width();
15399
15400    // 改手機板
15401    if (checkViewport(viewport()) === 'mobile' && isMobileDevice === 0) {
15402      isMobileDevice = 2;
15403      $('#footer').addClass('fullcutwrap');
15404    } else if (checkViewport(viewport()) === 'desktop' && isMobileDevice === 2) {
15405      $('#footer').removeClass('fullcutwrap');
15406      isMobileDevice = 0;
15407    } else if (isMobileDevice === 1) {
15408      $('#footer').addClass('fullcutwrap');
15409    } else {
15410      $('#footer').removeClass('fullcutwrap');
15411    }
15412
15413    $('html,body').css({
15414      position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', overflow: 'hidden'
15415    });
15416    $('#bodywrap').css({
15417      position: 'absolute', height: windowHeight * $('.fullcutwrap').length, width: '100%', top: 0, left: 0
15418    });
15419    $('.fullcutwrap').css('height', windowHeight).css('width', '100%');
15420
15421    $('#bannerToURL').css({
15422      height: windowHeight, width: '100%', position: 'absolute'
15423    });
15424
15425    // $(".fullcutwrap").css("position","fixed").css("height",windowHeight).css("left",0).css("width","100%").css("top",windowHeight);
15426    // $(".fullcutwrap").eq(0).css("top",0);
15427    currentScreen = 0;
15428
15429    if (isMobileDevice === 1) {
15430      // 這裡移除所有的影片
15431      $('.cut3video').attr('src', '');
15432    }
15433
15434    // 计算框架大小比例
15435    let bgFullRate;
15436    if (checkViewport(viewport()) === 'mobile' && $('#firstScreenBGViaMobile').length >= 1) {
15437      bgFullRate = 750 / 1200; // 圖片長寬
15438    } else {
15439      bgFullRate = 1440 / 760; // 圖片長寬
15440    }
15441
15442    // 首頁圖片的滿版及位置
15443    let percent;
15444    if (windoWidth / windowHeight > bgFullRate) {
15445      // window寬
15446      percent = -parseInt(100 * ((1 - bgFullRate / (windoWidth / windowHeight)) / 2), 10);
15447      $('.fullBg').css({ width: '100%', height: 'auto', left: '0' });
15448
15449      // $('.fullbg').css('width', '100%').css('height', 'auto').css('left', '0')
15450      //   .css('top', `${ percent }% `);
15451    } else {
15452      percent = -parseInt(100 * ((1 - windoWidth / windowHeight / bgFullRate) / 2), 10);
15453      $('.fullBg').css({
15454        height: '100%', width: bgFullRate * windowHeight, top: '0', marginLeft: -(bgFullRate * windowHeight - windoWidth) / 2
15455      });
15456      // $('.fullbg').css('height', '100%').css('width', bgFullRate * windowHeight).css('top', '0')
15457      //   .css('left', `${ percent }% `);
15458    }
15459
15460    // 主選單是否要顯示
15461    if (checkViewport(viewport()) === 'mobile') {
15462      $('#headerForDesktop').hide();
15463      $('#headerForMobile').show();
15464			$('#home-menu').show();
15465			$('#home-step').show();
15466    } else {
15467      $('#headerForDesktop').show();
15468      $('#headerForMobile').hide();
15469			$('#home-menu').hide();
15470			$('#home-step').hide();
15471    }
15472
15473    const scrolled = $(window).scrollTop();
15474    if (scrolled < windowHeight && $('.fullcutwrap').length > 2) {
15475      // 首頁
15476      $('#headerForMobile').hide(); // 這個一開始都不顯示
15477    }
15478  }
15479
15480  /*
15481      | 推荐升级提示区块
15482      */
15483  function checkIE() {
15484    // IE 6 7 8 9 10 推荐升级
15485    if (navigator.userAgent.indexOf('MSIE') > 0) {
15486      if (navigator.userAgent.indexOf('MSIE 6.0') > 0 || navigator.userAgent.indexOf('MSIE 7.0') > 0 || navigator.userAgent.indexOf('MSIE 8.0') > 0 || navigator.userAgent.indexOf('MSIE 9.0') > 0 || navigator.userAgent.indexOf('MSIE 10.0') > 0) {
15487        const hasCookie = $.cookie('shinho_cookie');
15488        if (hasCookie) {
15489          // ..
15490        } else {
15491          $('body').append('<section id="isNSupport">您好,<br/><br/>我们侦测到您目前使用的浏览器版本,可能会有无法执行网站的部分功能,与无法正常浏览内容的情形!<br/>为让您有更好的阅览与使用体验,建议您可以:<br/>1.更新<a href="https://www.microsoft.com/zh-hk/download/Internet-Explorer-11-for-Windows-7-details.aspx" target="_blank">IE</a>浏览器版本 <br/>2.使用 <a href="https://www.google.com/chrome/browser/desktop/" target="_blank">Chrome</a> 或 <a href="https://moztw.org/firefox/download/latest-osx.html" target="_blank">Firefox</a> 浏览器开启网站<i class="icon icon-close"></i></section>');
15492          $('body').on('click', '#isNSupport', () => {
15493            $('#isNSupport').remove();
15494            $.cookie('shinho_cookie', true, { path: '/', expires: 1 });
15495          });
15496        }
15497      }
15498    }
15499  }
15500
15501  /*
15502      | 判断手机方向
15503      */
15504  function getOrt() {
15505    const elem = document.documentElement;
15506    return elem.clientWidth / Math.max(elem.clientHeight, 320) < 1.1 ? 'portrait' : 'landscape';
15507  }
15508
15509  /*
15510    | 初始化
15511    */
15512  function init() {
15513    // 卷轴滚动切换屏
15514    $window.on('DOMMouseScroll mousewheel', event => {
15515      if (isScreenMove === 0 && isPopBlockShowed === 0) {
15516        isScreenMove = 1;
15517        if (event.originalEvent.wheelDelta / 120 > 0) {
15518          scrollSlide('U');
15519        } else {
15520          scrollSlide('D');
15521        }
15522        setTimeout(() => {
15523          isScreenMove = 0;
15524        }, 1500); // 卷动 1.5 才换屏
15525      }
15526    });
15527    $('#iscrollwrap1').on('mouseover', () => {
15528      isScreenMove = 1;
15529    });
15530    $('#iscrollwrap2').on('mouseover', () => {
15531      isScreenMove = 1;
15532    });
15533    $('#iscrollwrap3').on('mouseover', () => {
15534      isScreenMove = 1;
15535    });
15536    $('#iscrollwrap4').on('mouseover', () => {
15537      isScreenMove = 1;
15538    });
15539    $('#iscrollwrap1').on('mouseout', () => {
15540      isScreenMove = 0;
15541    });
15542    $('#iscrollwrap2').on('mouseout', () => {
15543      isScreenMove = 0;
15544    });
15545    $('#iscrollwrap3').on('mouseout', () => {
15546      isScreenMove = 0;
15547    });
15548    $('#iscrollwrap4').on('mouseout', () => {
15549      isScreenMove = 0;
15550    });
15551
15552    // 處理页面卷动
15553    // $window.scroll((event) => {
15554    // window.clearTimeout(scrollTimer);
15555    // scrollTimer = window.setTimeout(function() {}, 500)
15556
15557    // });
15558
15559    // 處理使用者變換尺寸 , 触发 orientationchange 后一定会触发 resize
15560    $window.resize(event => {
15561      window.clearTimeout(resizeTimer);
15562
15563      resizeTimer = window.setTimeout(() => {
15564        if (isMobileDevice === 1) {
15565          $('.fadeM').slick('unslick');
15566        } else {
15567          $('.fadeD').slick('unslick');
15568        }
15569        if (orientationStatus === false) {
15570          $('#bodywrap').show();
15571
15572          if (currentScreen === 0) {
15573            setSize();
15574          } else if (currentScreen === 1) {
15575            setSize();
15576            currentScreen = -1;
15577            scrollSlide('UP');
15578          } else if (currentScreen === 2) {
15579            setSize();
15580            currentScreen = -1;
15581            scrollSlide('UP');
15582          } else {
15583            setSize();
15584            currentScreen = -1;
15585            scrollSlide('UP');
15586          }
15587          firstScreenStart();
15588          secondScreenStart();
15589          thirdScreenViaPad();
15590        } else {
15591          orientationStatus = false;
15592        }
15593      }, 500);
15594    });
15595
15596    // 手持装置转向侦听
15597    $(window).bind('orientationchange', event => {
15598      orientationStatus = true; // 由转向产生的不希望触发 resize
15599
15600      if (screen.orientation.angle === 0) {
15601        // 转为 portrait
15602        // 若一开始是 landscape 则转为 portrait 时对页面进行 resize 动作,同时将画面初始设为 portrait ,即不再对转向进行 resize.
15603        if (orientation === 'landscape') {
15604          $('#bodywrap').hide();
15605          orientationStatus = false;
15606          orientation = 'portrait';
15607        } else {
15608          // 若一开始是 portrait 不进行任何动作
15609        }
15610      } else {// 转为 landscape
15611          // 转为 landscape 不进行任何动作
15612        }
15613    });
15614
15615    if (isMobileDevice === 1) {
15616      // tap($("#headerForMobile .main-nav-toggle-btn"), function() {
15617      //     itemNavList.slideToggle();
15618      //     $("#headerForMobile .panel-btn-icon").toggleClass("status-close");
15619      //     $("body").toggleClass("screen-mask");
15620      //     return false;
15621      // });
15622      $('#headerForMobile .main-nav-toggle-btn').on('click', () => {
15623        itemNavList.slideToggle();
15624        $('#headerForMobile .panel-btn-icon').toggleClass('status-close');
15625        $('body').toggleClass('screen-mask');
15626
15627        return false;
15628      });
15629    } else {
15630      $('#headerForMobile .main-nav-toggle-btn').on('click', () => {
15631        itemNavList.slideToggle();
15632        $('#headerForMobile .panel-btn-icon').toggleClass('status-close');
15633        $('body').toggleClass('screen-mask');
15634
15635        // 若選單遮罩出現的情況下切換屏,及收回選單遮罩
15636        if ($('body').hasClass('screen-mask')) {
15637          $('#indexcut3select').css('z-index', 0);
15638          $('indexcut3mobwrap');
15639        } else {
15640          $('#indexcut3select').attr('style', '');
15641        }
15642
15643        return false;
15644      });
15645    }
15646    // ---- // 第一屏
15647    firstScreenStart();
15648    // ---- // 第二屏
15649    secondScreenStart();
15650    // ---- // 第三屏
15651    thirdScreenViaPad();
15652
15653    $('#footer').show();
15654  }
15655
15656  function loading() {
15657    const preLoader = $('#pre-loader');
15658    preLoader.addClass('fadeout'); // 使用渐隐的方法淡出loading page
15659    preLoader.delay(2000).fadeOut();
15660  }
15661  /*
15662    | 初始化前设定
15663    */
15664  function setting() {
15665    // 提醒区块低阶浏览器下载新型浏览器
15666    checkIE();
15667    // 判断手持装置或是桌机
15668    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
15669      isMobileDevice = 1;
15670    } else {
15671      isMobileDevice = 0;
15672    }
15673
15674    // 判断一进画面的装置方向
15675    if (checkViewport(viewport()) === 'mobile') {
15676      orientation = getOrt();
15677    } else {
15678      orientation = '';
15679    }
15680    // 设定框架
15681    setSize();
15682    // 初始化
15683    init();
15684  }
15685  /*
15686    | 處理页面 loaded 后
15687    */
15688  $window.load(event => {
15689    // loading();
15690    setting();
15691  });
15692
15693  $('body').on('load', () => {
15694    const myScroll = new __WEBPACK_IMPORTED_MODULE_4_iscroll___default.a('.iscroll', {
15695      scrollbars: true,
15696      mouseWheel: true,
15697      interactiveScrollbars: true,
15698      shrinkScrollbars: 'scale',
15699      fadeScrollbars: true
15700    });
15701  });
15702  // 图片破损时更换成垫档图
15703  document.addEventListener('error', () => {
15704    $('#firstScreenBGViaDesktop .image img').error(function () {
15705      $(this).attr('src', '/img/backupimage_1440x760.png');
15706    });
15707
15708    $('#firstScreenBGViaMobile .image img').error(function () {
15709      $(this).attr('src', '/img/backupimage_750x1200.png');
15710    });
15711  }, true);
15712});
15713/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(0)))
15714
15715/***/ }),
15716/* 36 */
15717/***/ (function(module, exports, __webpack_require__) {
15718
15719var __WEBPACK_AMD_DEFINE_RESULT__;/*! iScroll v5.2.0 ~ (c) 2008-2016 Matteo Spinelli ~ http://cubiq.org/license */
15720(function (window, document, Math) {
15721	var rAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
15722		window.setTimeout(callback, 1000 / 60);
15723	};
15724
15725	var utils = function () {
15726		var me = {};
15727
15728		var _elementStyle = document.createElement('div').style;
15729		var _vendor = function () {
15730			var vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'],
15731			    transform,
15732			    i = 0,
15733			    l = vendors.length;
15734
15735			for (; i < l; i++) {
15736				transform = vendors[i] + 'ransform';
15737				if (transform in _elementStyle) return vendors[i].substr(0, vendors[i].length - 1);
15738			}
15739
15740			return false;
15741		}();
15742
15743		function _prefixStyle(style) {
15744			if (_vendor === false) return false;
15745			if (_vendor === '') return style;
15746			return _vendor + style.charAt(0).toUpperCase() + style.substr(1);
15747		}
15748
15749		me.getTime = Date.now || function getTime() {
15750			return new Date().getTime();
15751		};
15752
15753		me.extend = function (target, obj) {
15754			for (var i in obj) {
15755				target[i] = obj[i];
15756			}
15757		};
15758
15759		me.addEvent = function (el, type, fn, capture) {
15760			el.addEventListener(type, fn, !!capture);
15761		};
15762
15763		me.removeEvent = function (el, type, fn, capture) {
15764			el.removeEventListener(type, fn, !!capture);
15765		};
15766
15767		me.prefixPointerEvent = function (pointerEvent) {
15768			return window.MSPointerEvent ? 'MSPointer' + pointerEvent.charAt(7).toUpperCase() + pointerEvent.substr(8) : pointerEvent;
15769		};
15770
15771		me.momentum = function (current, start, time, lowerMargin, wrapperSize, deceleration) {
15772			var distance = current - start,
15773			    speed = Math.abs(distance) / time,
15774			    destination,
15775			    duration;
15776
15777			deceleration = deceleration === undefined ? 0.0006 : deceleration;
15778
15779			destination = current + speed * speed / (2 * deceleration) * (distance < 0 ? -1 : 1);
15780			duration = speed / deceleration;
15781
15782			if (destination < lowerMargin) {
15783				destination = wrapperSize ? lowerMargin - wrapperSize / 2.5 * (speed / 8) : lowerMargin;
15784				distance = Math.abs(destination - current);
15785				duration = distance / speed;
15786			} else if (destination > 0) {
15787				destination = wrapperSize ? wrapperSize / 2.5 * (speed / 8) : 0;
15788				distance = Math.abs(current) + destination;
15789				duration = distance / speed;
15790			}
15791
15792			return {
15793				destination: Math.round(destination),
15794				duration: duration
15795			};
15796		};
15797
15798		var _transform = _prefixStyle('transform');
15799
15800		me.extend(me, {
15801			hasTransform: _transform !== false,
15802			hasPerspective: _prefixStyle('perspective') in _elementStyle,
15803			hasTouch: 'ontouchstart' in window,
15804			hasPointer: !!(window.PointerEvent || window.MSPointerEvent), // IE10 is prefixed
15805			hasTransition: _prefixStyle('transition') in _elementStyle
15806		});
15807
15808		/*
15809  This should find all Android browsers lower than build 535.19 (both stock browser and webview)
15810  - galaxy S2 is ok
15811     - 2.3.6 : `AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1`
15812     - 4.0.4 : `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30`
15813    - galaxy S3 is badAndroid (stock brower, webview)
15814      `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30`
15815    - galaxy S4 is badAndroid (stock brower, webview)
15816      `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30`
15817    - galaxy S5 is OK
15818      `AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 (Chrome/)`
15819    - galaxy S6 is OK
15820      `AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 (Chrome/)`
15821   */
15822		me.isBadAndroid = function () {
15823			var appVersion = window.navigator.appVersion;
15824			// Android browser is not a chrome browser.
15825			if (/Android/.test(appVersion) && !/Chrome\/\d/.test(appVersion)) {
15826				var safariVersion = appVersion.match(/Safari\/(\d+.\d)/);
15827				if (safariVersion && typeof safariVersion === "object" && safariVersion.length >= 2) {
15828					return parseFloat(safariVersion[1]) < 535.19;
15829				} else {
15830					return true;
15831				}
15832			} else {
15833				return false;
15834			}
15835		}();
15836
15837		me.extend(me.style = {}, {
15838			transform: _transform,
15839			transitionTimingFunction: _prefixStyle('transitionTimingFunction'),
15840			transitionDuration: _prefixStyle('transitionDuration'),
15841			transitionDelay: _prefixStyle('transitionDelay'),
15842			transformOrigin: _prefixStyle('transformOrigin')
15843		});
15844
15845		me.hasClass = function (e, c) {
15846			var re = new RegExp("(^|\\s)" + c + "(\\s|$)");
15847			return re.test(e.className);
15848		};
15849
15850		me.addClass = function (e, c) {
15851			if (me.hasClass(e, c)) {
15852				return;
15853			}
15854
15855			var newclass = e.className.split(' ');
15856			newclass.push(c);
15857			e.className = newclass.join(' ');
15858		};
15859
15860		me.removeClass = function (e, c) {
15861			if (!me.hasClass(e, c)) {
15862				return;
15863			}
15864
15865			var re = new RegExp("(^|\\s)" + c + "(\\s|$)", 'g');
15866			e.className = e.className.replace(re, ' ');
15867		};
15868
15869		me.offset = function (el) {
15870			var left = -el.offsetLeft,
15871			    top = -el.offsetTop;
15872
15873			// jshint -W084
15874			while (el = el.offsetParent) {
15875				left -= el.offsetLeft;
15876				top -= el.offsetTop;
15877			}
15878			// jshint +W084
15879
15880			return {
15881				left: left,
15882				top: top
15883			};
15884		};
15885
15886		me.preventDefaultException = function (el, exceptions) {
15887			for (var i in exceptions) {
15888				if (exceptions[i].test(el[i])) {
15889					return true;
15890				}
15891			}
15892
15893			return false;
15894		};
15895
15896		me.extend(me.eventType = {}, {
15897			touchstart: 1,
15898			touchmove: 1,
15899			touchend: 1,
15900
15901			mousedown: 2,
15902			mousemove: 2,
15903			mouseup: 2,
15904
15905			pointerdown: 3,
15906			pointermove: 3,
15907			pointerup: 3,
15908
15909			MSPointerDown: 3,
15910			MSPointerMove: 3,
15911			MSPointerUp: 3
15912		});
15913
15914		me.extend(me.ease = {}, {
15915			quadratic: {
15916				style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',
15917				fn: function (k) {
15918					return k * (2 - k);
15919				}
15920			},
15921			circular: {
15922				style: 'cubic-bezier(0.1, 0.57, 0.1, 1)', // Not properly "circular" but this looks better, it should be (0.075, 0.82, 0.165, 1)
15923				fn: function (k) {
15924					return Math.sqrt(1 - --k * k);
15925				}
15926			},
15927			back: {
15928				style: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',
15929				fn: function (k) {
15930					var b = 4;
15931					return (k = k - 1) * k * ((b + 1) * k + b) + 1;
15932				}
15933			},
15934			bounce: {
15935				style: '',
15936				fn: function (k) {
15937					if ((k /= 1) < 1 / 2.75) {
15938						return 7.5625 * k * k;
15939					} else if (k < 2 / 2.75) {
15940						return 7.5625 * (k -= 1.5 / 2.75) * k + 0.75;
15941					} else if (k < 2.5 / 2.75) {
15942						return 7.5625 * (k -= 2.25 / 2.75) * k + 0.9375;
15943					} else {
15944						return 7.5625 * (k -= 2.625 / 2.75) * k + 0.984375;
15945					}
15946				}
15947			},
15948			elastic: {
15949				style: '',
15950				fn: function (k) {
15951					var f = 0.22,
15952					    e = 0.4;
15953
15954					if (k === 0) {
15955						return 0;
15956					}
15957					if (k == 1) {
15958						return 1;
15959					}
15960
15961					return e * Math.pow(2, -10 * k) * Math.sin((k - f / 4) * (2 * Math.PI) / f) + 1;
15962				}
15963			}
15964		});
15965
15966		me.tap = function (e, eventName) {
15967			var ev = document.createEvent('Event');
15968			ev.initEvent(eventName, true, true);
15969			ev.pageX = e.pageX;
15970			ev.pageY = e.pageY;
15971			e.target.dispatchEvent(ev);
15972		};
15973
15974		me.click = function (e) {
15975			var target = e.target,
15976			    ev;
15977
15978			if (!/(SELECT|INPUT|TEXTAREA)/i.test(target.tagName)) {
15979				ev = document.createEvent('MouseEvents');
15980				ev.initMouseEvent('click', true, true, e.view, 1, target.screenX, target.screenY, target.clientX, target.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 0, null);
15981
15982				ev._constructed = true;
15983				target.dispatchEvent(ev);
15984			}
15985		};
15986
15987		return me;
15988	}();
15989	function IScroll(el, options) {
15990		this.wrapper = typeof el == 'string' ? document.querySelector(el) : el;
15991		this.scroller = this.wrapper.children[0];
15992		this.scrollerStyle = this.scroller.style; // cache style for better performance
15993
15994		this.options = {
15995
15996			resizeScrollbars: true,
15997
15998			mouseWheelSpeed: 20,
15999
16000			snapThreshold: 0.334,
16001
16002			// INSERT POINT: OPTIONS
16003			disablePointer: !utils.hasPointer,
16004			disableTouch: utils.hasPointer || !utils.hasTouch,
16005			disableMouse: utils.hasPointer || utils.hasTouch,
16006			startX: 0,
16007			startY: 0,
16008			scrollY: true,
16009			directionLockThreshold: 5,
16010			momentum: true,
16011
16012			bounce: true,
16013			bounceTime: 600,
16014			bounceEasing: '',
16015
16016			preventDefault: true,
16017			preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|
vendor: 4,191 bytes, lines 16017-16168
16017SELECT)$/ },
16018
16019			HWCompositing: true,
16020			useTransition: true,
16021			useTransform: true,
16022			bindToWrapper: typeof window.onmousedown === "undefined"
16023		};
16024
16025		for (var i in options) {
16026			this.options[i] = options[i];
16027		}
16028
16029		// Normalize options
16030		this.translateZ = this.options.HWCompositing && utils.hasPerspective ? ' translateZ(0)' : '';
16031
16032		this.options.useTransition = utils.hasTransition && this.options.useTransition;
16033		this.options.useTransform = utils.hasTransform && this.options.useTransform;
16034
16035		this.options.eventPassthrough = this.options.eventPassthrough === true ? 'vertical' : this.options.eventPassthrough;
16036		this.options.preventDefault = !this.options.eventPassthrough && this.options.preventDefault;
16037
16038		// If you want eventPassthrough I have to lock one of the axes
16039		this.options.scrollY = this.options.eventPassthrough == 'vertical' ? false : this.options.scrollY;
16040		this.options.scrollX = this.options.eventPassthrough == 'horizontal' ? false : this.options.scrollX;
16041
16042		// With eventPassthrough we also need lockDirection mechanism
16043		this.options.freeScroll = this.options.freeScroll && !this.options.eventPassthrough;
16044		this.options.directionLockThreshold = this.options.eventPassthrough ? 0 : this.options.directionLockThreshold;
16045
16046		this.options.bounceEasing = typeof this.options.bounceEasing == 'string' ? utils.ease[this.options.bounceEasing] || utils.ease.circular : this.options.bounceEasing;
16047
16048		this.options.resizePolling = this.options.resizePolling === undefined ? 60 : this.options.resizePolling;
16049
16050		if (this.options.tap === true) {
16051			this.options.tap = 'tap';
16052		}
16053
16054		if (this.options.shrinkScrollbars == 'scale') {
16055			this.options.useTransition = false;
16056		}
16057
16058		this.options.invertWheelDirection = this.options.invertWheelDirection ? -1 : 1;
16059
16060		// INSERT POINT: NORMALIZATION
16061
16062		// Some defaults
16063		this.x = 0;
16064		this.y = 0;
16065		this.directionX = 0;
16066		this.directionY = 0;
16067		this._events = {};
16068
16069		// INSERT POINT: DEFAULTS
16070
16071		this._init();
16072		this.refresh();
16073
16074		this.scrollTo(this.options.startX, this.options.startY);
16075		this.enable();
16076	}
16077
16078	IScroll.prototype = {
16079		version: '5.2.0',
16080
16081		_init: function () {
16082			this._initEvents();
16083
16084			if (this.options.scrollbars || this.options.indicators) {
16085				this._initIndicators();
16086			}
16087
16088			if (this.options.mouseWheel) {
16089				this._initWheel();
16090			}
16091
16092			if (this.options.snap) {
16093				this._initSnap();
16094			}
16095
16096			if (this.options.keyBindings) {
16097				this._initKeys();
16098			}
16099
16100			// INSERT POINT: _init
16101		},
16102
16103		destroy: function () {
16104			this._initEvents(true);
16105			clearTimeout(this.resizeTimeout);
16106			this.resizeTimeout = null;
16107			this._execEvent('destroy');
16108		},
16109
16110		_transitionEnd: function (e) {
16111			if (e.target != this.scroller || !this.isInTransition) {
16112				return;
16113			}
16114
16115			this._transitionTime();
16116			if (!this.resetPosition(this.options.bounceTime)) {
16117				this.isInTransition = false;
16118				this._execEvent('scrollEnd');
16119			}
16120		},
16121
16122		_start: function (e) {
16123			// React to left mouse button only
16124			if (utils.eventType[e.type] != 1) {
16125				// for button property
16126				// http://unixpapa.com/js/mouse.html
16127				var button;
16128				if (!e.which) {
16129					/* IE case */
16130					button = e.button < 2 ? 0 : e.button == 4 ? 1 : 2;
16131				} else {
16132					/* All others */
16133					button = e.button;
16134				}
16135				if (button !== 0) {
16136					return;
16137				}
16138			}
16139
16140			if (!this.enabled || this.initiated && utils.eventType[e.type] !== this.initiated) {
16141				return;
16142			}
16143
16144			if (this.options.preventDefault && !utils.isBadAndroid && !utils.preventDefaultException(e.target, this.options.preventDefaultException)) {
16145				e.preventDefault();
16146			}
16147
16148			var point = e.touches ? e.touches[0] : e,
16149			    pos;
16150
16151			this.initiated = utils.eventType[e.type];
16152			this.moved = false;
16153			this.distX = 0;
16154			this.distY = 0;
16155			this.directionX = 0;
16156			this.directionY = 0;
16157			this.directionLocked = 0;
16158
16159			this.startTime = utils.getTime();
16160
16161			if (this.options.useTransition && this.isInTransition) {
16162				this._transitionTime();
16163				this.isInTransition = false;
16164				pos = this.getComputedPosition();
16165				this._translate(Math.round(pos.x), Math.round(pos.y));
16166				this._execEvent('scrollEnd');
16167			} else if (!this.options.useTransition && this.isAnimating) {
16168				this.isAnimating = false;
vendor: 4,429 bytes, lines 16169-16333
16169				this._execEvent('scrollEnd');
16170			}
16171
16172			this.startX = this.x;
16173			this.startY = this.y;
16174			this.absStartX = this.x;
16175			this.absStartY = this.y;
16176			this.pointX = point.pageX;
16177			this.pointY = point.pageY;
16178
16179			this._execEvent('beforeScrollStart');
16180		},
16181
16182		_move: function (e) {
16183			if (!this.enabled || utils.eventType[e.type] !== this.initiated) {
16184				return;
16185			}
16186
16187			if (this.options.preventDefault) {
16188				// increases performance on Android? TODO: check!
16189				e.preventDefault();
16190			}
16191
16192			var point = e.touches ? e.touches[0] : e,
16193			    deltaX = point.pageX - this.pointX,
16194			    deltaY = point.pageY - this.pointY,
16195			    timestamp = utils.getTime(),
16196			    newX,
16197			    newY,
16198			    absDistX,
16199			    absDistY;
16200
16201			this.pointX = point.pageX;
16202			this.pointY = point.pageY;
16203
16204			this.distX += deltaX;
16205			this.distY += deltaY;
16206			absDistX = Math.abs(this.distX);
16207			absDistY = Math.abs(this.distY);
16208
16209			// We need to move at least 10 pixels for the scrolling to initiate
16210			if (timestamp - this.endTime > 300 && absDistX < 10 && absDistY < 10) {
16211				return;
16212			}
16213
16214			// If you are scrolling in one direction lock the other
16215			if (!this.directionLocked && !this.options.freeScroll) {
16216				if (absDistX > absDistY + this.options.directionLockThreshold) {
16217					this.directionLocked = 'h'; // lock horizontally
16218				} else if (absDistY >= absDistX + this.options.directionLockThreshold) {
16219					this.directionLocked = 'v'; // lock vertically
16220				} else {
16221					this.directionLocked = 'n'; // no lock
16222				}
16223			}
16224
16225			if (this.directionLocked == 'h') {
16226				if (this.options.eventPassthrough == 'vertical') {
16227					e.preventDefault();
16228				} else if (this.options.eventPassthrough == 'horizontal') {
16229					this.initiated = false;
16230					return;
16231				}
16232
16233				deltaY = 0;
16234			} else if (this.directionLocked == 'v') {
16235				if (this.options.eventPassthrough == 'horizontal') {
16236					e.preventDefault();
16237				} else if (this.options.eventPassthrough == 'vertical') {
16238					this.initiated = false;
16239					return;
16240				}
16241
16242				deltaX = 0;
16243			}
16244
16245			deltaX = this.hasHorizontalScroll ? deltaX : 0;
16246			deltaY = this.hasVerticalScroll ? deltaY : 0;
16247
16248			newX = this.x + deltaX;
16249			newY = this.y + deltaY;
16250
16251			// Slow down if outside of the boundaries
16252			if (newX > 0 || newX < this.maxScrollX) {
16253				newX = this.options.bounce ? this.x + deltaX / 3 : newX > 0 ? 0 : this.maxScrollX;
16254			}
16255			if (newY > 0 || newY < this.maxScrollY) {
16256				newY = this.options.bounce ? this.y + deltaY / 3 : newY > 0 ? 0 : this.maxScrollY;
16257			}
16258
16259			this.directionX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;
16260			this.directionY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;
16261
16262			if (!this.moved) {
16263				this._execEvent('scrollStart');
16264			}
16265
16266			this.moved = true;
16267
16268			this._translate(newX, newY);
16269
16270			/* REPLACE START: _move */
16271
16272			if (timestamp - this.startTime > 300) {
16273				this.startTime = timestamp;
16274				this.startX = this.x;
16275				this.startY = this.y;
16276			}
16277
16278			/* REPLACE END: _move */
16279		},
16280
16281		_end: function (e) {
16282			if (!this.enabled || utils.eventType[e.type] !== this.initiated) {
16283				return;
16284			}
16285
16286			if (this.options.preventDefault && !utils.preventDefaultException(e.target, this.options.preventDefaultException)) {
16287				e.preventDefault();
16288			}
16289
16290			var point = e.changedTouches ? e.changedTouches[0] : e,
16291			    momentumX,
16292			    momentumY,
16293			    duration = utils.getTime() - this.startTime,
16294			    newX = Math.round(this.x),
16295			    newY = Math.round(this.y),
16296			    distanceX = Math.abs(newX - this.startX),
16297			    distanceY = Math.abs(newY - this.startY),
16298			    time = 0,
16299			    easing = '';
16300
16301			this.isInTransition = 0;
16302			this.initiated = 0;
16303			this.endTime = utils.getTime();
16304
16305			// reset if we are outside of the boundaries
16306			if (this.resetPosition(this.options.bounceTime)) {
16307				return;
16308			}
16309
16310			this.scrollTo(newX, newY); // ensures that the last position is rounded
16311
16312			// we scrolled less than 10 pixels
16313			if (!this.moved) {
16314				if (this.options.tap) {
16315					utils.tap(e, this.options.tap);
16316				}
16317
16318				if (this.options.click) {
16319					utils.click(e);
16320				}
16321
16322				this._execEvent('scrollCancel');
16323				return;
16324			}
16325
16326			if (this._events.flick && duration < 200 && distanceX < 100 && distanceY < 100) {
16327				this._execEvent('flick');
16328				return;
16329			}
16330
16331			// start momentum animation if needed
16332			if (this.options.momentum && duration < 300) {
16333				momentumX = this.hasHorizontalScroll ? utils.momentum(this.x, this.startX, duration, this.maxScrollX, this.options.bounce ? this.wrapperW
vendor: 11,716 bytes, lines 16333-16792
16333idth : 0, this.options.deceleration) : { destination: newX, duration: 0 };
16334				momentumY = this.hasVerticalScroll ? utils.momentum(this.y, this.startY, duration, this.maxScrollY, this.options.bounce ? this.wrapperHeight : 0, this.options.deceleration) : { destination: newY, duration: 0 };
16335				newX = momentumX.destination;
16336				newY = momentumY.destination;
16337				time = Math.max(momentumX.duration, momentumY.duration);
16338				this.isInTransition = 1;
16339			}
16340
16341			if (this.options.snap) {
16342				var snap = this._nearestSnap(newX, newY);
16343				this.currentPage = snap;
16344				time = this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(newX - snap.x), 1000), Math.min(Math.abs(newY - snap.y), 1000)), 300);
16345				newX = snap.x;
16346				newY = snap.y;
16347
16348				this.directionX = 0;
16349				this.directionY = 0;
16350				easing = this.options.bounceEasing;
16351			}
16352
16353			// INSERT POINT: _end
16354
16355			if (newX != this.x || newY != this.y) {
16356				// change easing function when scroller goes out of the boundaries
16357				if (newX > 0 || newX < this.maxScrollX || newY > 0 || newY < this.maxScrollY) {
16358					easing = utils.ease.quadratic;
16359				}
16360
16361				this.scrollTo(newX, newY, time, easing);
16362				return;
16363			}
16364
16365			this._execEvent('scrollEnd');
16366		},
16367
16368		_resize: function () {
16369			var that = this;
16370
16371			clearTimeout(this.resizeTimeout);
16372
16373			this.resizeTimeout = setTimeout(function () {
16374				that.refresh();
16375			}, this.options.resizePolling);
16376		},
16377
16378		resetPosition: function (time) {
16379			var x = this.x,
16380			    y = this.y;
16381
16382			time = time || 0;
16383
16384			if (!this.hasHorizontalScroll || this.x > 0) {
16385				x = 0;
16386			} else if (this.x < this.maxScrollX) {
16387				x = this.maxScrollX;
16388			}
16389
16390			if (!this.hasVerticalScroll || this.y > 0) {
16391				y = 0;
16392			} else if (this.y < this.maxScrollY) {
16393				y = this.maxScrollY;
16394			}
16395
16396			if (x == this.x && y == this.y) {
16397				return false;
16398			}
16399
16400			this.scrollTo(x, y, time, this.options.bounceEasing);
16401
16402			return true;
16403		},
16404
16405		disable: function () {
16406			this.enabled = false;
16407		},
16408
16409		enable: function () {
16410			this.enabled = true;
16411		},
16412
16413		refresh: function () {
16414			var rf = this.wrapper.offsetHeight; // Force reflow
16415
16416			this.wrapperWidth = this.wrapper.clientWidth;
16417			this.wrapperHeight = this.wrapper.clientHeight;
16418
16419			/* REPLACE START: refresh */
16420
16421			this.scrollerWidth = this.scroller.offsetWidth;
16422			this.scrollerHeight = this.scroller.offsetHeight;
16423
16424			this.maxScrollX = this.wrapperWidth - this.scrollerWidth;
16425			this.maxScrollY = this.wrapperHeight - this.scrollerHeight;
16426
16427			/* REPLACE END: refresh */
16428
16429			this.hasHorizontalScroll = this.options.scrollX && this.maxScrollX < 0;
16430			this.hasVerticalScroll = this.options.scrollY && this.maxScrollY < 0;
16431
16432			if (!this.hasHorizontalScroll) {
16433				this.maxScrollX = 0;
16434				this.scrollerWidth = this.wrapperWidth;
16435			}
16436
16437			if (!this.hasVerticalScroll) {
16438				this.maxScrollY = 0;
16439				this.scrollerHeight = this.wrapperHeight;
16440			}
16441
16442			this.endTime = 0;
16443			this.directionX = 0;
16444			this.directionY = 0;
16445
16446			this.wrapperOffset = utils.offset(this.wrapper);
16447
16448			this._execEvent('refresh');
16449
16450			this.resetPosition();
16451
16452			// INSERT POINT: _refresh
16453		},
16454
16455		on: function (type, fn) {
16456			if (!this._events[type]) {
16457				this._events[type] = [];
16458			}
16459
16460			this._events[type].push(fn);
16461		},
16462
16463		off: function (type, fn) {
16464			if (!this._events[type]) {
16465				return;
16466			}
16467
16468			var index = this._events[type].indexOf(fn);
16469
16470			if (index > -1) {
16471				this._events[type].splice(index, 1);
16472			}
16473		},
16474
16475		_execEvent: function (type) {
16476			if (!this._events[type]) {
16477				return;
16478			}
16479
16480			var i = 0,
16481			    l = this._events[type].length;
16482
16483			if (!l) {
16484				return;
16485			}
16486
16487			for (; i < l; i++) {
16488				this._events[type][i].apply(this, [].slice.call(arguments, 1));
16489			}
16490		},
16491
16492		scrollBy: function (x, y, time, easing) {
16493			x = this.x + x;
16494			y = this.y + y;
16495			time = time || 0;
16496
16497			this.scrollTo(x, y, time, easing);
16498		},
16499
16500		scrollTo: function (x, y, time, easing) {
16501			easing = easing || utils.ease.circular;
16502
16503			this.isInTransition = this.options.useTransition && time > 0;
16504			var transitionType = this.options.useTransition && easing.style;
16505			if (!time || transitionType) {
16506				if (transitionType) {
16507					this._transitionTimingFunction(easing.style);
16508					this._transitionTime(time);
16509				}
16510				this._translate(x, y);
16511			} else {
16512				this._animate(x, y, time, easing.fn);
16513			}
16514		},
16515
16516		scrollToElement: function (el, time, offsetX, offsetY, easing) {
16517			el = el.nodeType ? el : this.scroller.querySelector(el);
16518
16519			if (!el) {
16520				return;
16521			}
16522
16523			var pos = utils.offset(el);
16524
16525			pos.left -= this.wrapperOffset.left;
16526			pos.top -= this.wrapperOffset.top;
16527
16528			// if offsetX/Y are true we center the element to the screen
16529			if (offsetX === true) {
16530				offsetX = Math.round(el.offsetWidth / 2 - this.wrapper.offsetWidth / 2);
16531			}
16532			if (offsetY === true) {
16533				offsetY = Math.round(el.offsetHeight / 2 - this.wrapper.offsetHeight / 2);
16534			}
16535
16536			pos.left -= offsetX || 0;
16537			pos.top -= offsetY || 0;
16538
16539			pos.left = pos.left > 0 ? 0 : pos.left < this.maxScrollX ? this.maxScrollX : pos.left;
16540			pos.top = pos.top > 0 ? 0 : pos.top < this.maxScrollY ? this.maxScrollY : pos.top;
16541
16542			time = time === undefined || time === null || time === 'auto' ? Math.max(Math.abs(this.x - pos.left), Math.abs(this.y - pos.top)) : time;
16543
16544			this.scrollTo(pos.left, pos.top, time, easing);
16545		},
16546
16547		_transitionTime: function (time) {
16548			time = time || 0;
16549
16550			var durationProp = utils.style.transitionDuration;
16551			this.scrollerStyle[durationProp] = time + 'ms';
16552
16553			if (!time && utils.isBadAndroid) {
16554				this.scrollerStyle[durationProp] = '0.0001ms';
16555				// remove 0.0001ms
16556				var self = this;
16557				rAF(function () {
16558					if (self.scrollerStyle[durationProp] === '0.0001ms') {
16559						self.scrollerStyle[durationProp] = '0s';
16560					}
16561				});
16562			}
16563
16564			if (this.indicators) {
16565				for (var i = this.indicators.length; i--;) {
16566					this.indicators[i].transitionTime(time);
16567				}
16568			}
16569
16570			// INSERT POINT: _transitionTime
16571		},
16572
16573		_transitionTimingFunction: function (easing) {
16574			this.scrollerStyle[utils.style.transitionTimingFunction] = easing;
16575
16576			if (this.indicators) {
16577				for (var i = this.indicators.length; i--;) {
16578					this.indicators[i].transitionTimingFunction(easing);
16579				}
16580			}
16581
16582			// INSERT POINT: _transitionTimingFunction
16583		},
16584
16585		_translate: function (x, y) {
16586			if (this.options.useTransform) {
16587
16588				/* REPLACE START: _translate */
16589
16590				this.scrollerStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.translateZ;
16591
16592				/* REPLACE END: _translate */
16593			} else {
16594				x = Math.round(x);
16595				y = Math.round(y);
16596				this.scrollerStyle.left = x + 'px';
16597				this.scrollerStyle.top = y + 'px';
16598			}
16599
16600			this.x = x;
16601			this.y = y;
16602
16603			if (this.indicators) {
16604				for (var i = this.indicators.length; i--;) {
16605					this.indicators[i].updatePosition();
16606				}
16607			}
16608
16609			// INSERT POINT: _translate
16610		},
16611
16612		_initEvents: function (remove) {
16613			var eventType = remove ? utils.removeEvent : utils.addEvent,
16614			    target = this.options.bindToWrapper ? this.wrapper : window;
16615
16616			eventType(window, 'orientationchange', this);
16617			eventType(window, 'resize', this);
16618
16619			if (this.options.click) {
16620				eventType(this.wrapper, 'click', this, true);
16621			}
16622
16623			if (!this.options.disableMouse) {
16624				eventType(this.wrapper, 'mousedown', this);
16625				eventType(target, 'mousemove', this);
16626				eventType(target, 'mousecancel', this);
16627				eventType(target, 'mouseup', this);
16628			}
16629
16630			if (utils.hasPointer && !this.options.disablePointer) {
16631				eventType(this.wrapper, utils.prefixPointerEvent('pointerdown'), this);
16632				eventType(target, utils.prefixPointerEvent('pointermove'), this);
16633				eventType(target, utils.prefixPointerEvent('pointercancel'), this);
16634				eventType(target, utils.prefixPointerEvent('pointerup'), this);
16635			}
16636
16637			if (utils.hasTouch && !this.options.disableTouch) {
16638				eventType(this.wrapper, 'touchstart', this);
16639				eventType(target, 'touchmove', this);
16640				eventType(target, 'touchcancel', this);
16641				eventType(target, 'touchend', this);
16642			}
16643
16644			eventType(this.scroller, 'transitionend', this);
16645			eventType(this.scroller, 'webkitTransitionEnd', this);
16646			eventType(this.scroller, 'oTransitionEnd', this);
16647			eventType(this.scroller, 'MSTransitionEnd', this);
16648		},
16649
16650		getComputedPosition: function () {
16651			var matrix = window.getComputedStyle(this.scroller, null),
16652			    x,
16653			    y;
16654
16655			if (this.options.useTransform) {
16656				matrix = matrix[utils.style.transform].split(')')[0].split(', ');
16657				x = +(matrix[12] || matrix[4]);
16658				y = +(matrix[13] || matrix[5]);
16659			} else {
16660				x = +matrix.left.replace(/[^-\d.]/g, '');
16661				y = +matrix.top.replace(/[^-\d.]/g, '');
16662			}
16663
16664			return { x: x, y: y };
16665		},
16666		_initIndicators: function () {
16667			var interactive = this.options.interactiveScrollbars,
16668			    customStyle = typeof this.options.scrollbars != 'string',
16669			    indicators = [],
16670			    indicator;
16671
16672			var that = this;
16673
16674			this.indicators = [];
16675
16676			if (this.options.scrollbars) {
16677				// Vertical scrollbar
16678				if (this.options.scrollY) {
16679					indicator = {
16680						el: createDefaultScrollbar('v', interactive, this.options.scrollbars),
16681						interactive: interactive,
16682						defaultScrollbars: true,
16683						customStyle: customStyle,
16684						resize: this.options.resizeScrollbars,
16685						shrink: this.options.shrinkScrollbars,
16686						fade: this.options.fadeScrollbars,
16687						listenX: false
16688					};
16689
16690					this.wrapper.appendChild(indicator.el);
16691					indicators.push(indicator);
16692				}
16693
16694				// Horizontal scrollbar
16695				if (this.options.scrollX) {
16696					indicator = {
16697						el: createDefaultScrollbar('h', interactive, this.options.scrollbars),
16698						interactive: interactive,
16699						defaultScrollbars: true,
16700						customStyle: customStyle,
16701						resize: this.options.resizeScrollbars,
16702						shrink: this.options.shrinkScrollbars,
16703						fade: this.options.fadeScrollbars,
16704						listenY: false
16705					};
16706
16707					this.wrapper.appendChild(indicator.el);
16708					indicators.push(indicator);
16709				}
16710			}
16711
16712			if (this.options.indicators) {
16713				// TODO: check concat compatibility
16714				indicators = indicators.concat(this.options.indicators);
16715			}
16716
16717			for (var i = indicators.length; i--;) {
16718				this.indicators.push(new Indicator(this, indicators[i]));
16719			}
16720
16721			// TODO: check if we can use array.map (wide compatibility and performance issues)
16722			function _indicatorsMap(fn) {
16723				if (that.indicators) {
16724					for (var i = that.indicators.length; i--;) {
16725						fn.call(that.indicators[i]);
16726					}
16727				}
16728			}
16729
16730			if (this.options.fadeScrollbars) {
16731				this.on('scrollEnd', function () {
16732					_indicatorsMap(function () {
16733						this.fade();
16734					});
16735				});
16736
16737				this.on('scrollCancel', function () {
16738					_indicatorsMap(function () {
16739						this.fade();
16740					});
16741				});
16742
16743				this.on('scrollStart', function () {
16744					_indicatorsMap(function () {
16745						this.fade(1);
16746					});
16747				});
16748
16749				this.on('beforeScrollStart', function () {
16750					_indicatorsMap(function () {
16751						this.fade(1, true);
16752					});
16753				});
16754			}
16755
16756			this.on('refresh', function () {
16757				_indicatorsMap(function () {
16758					this.refresh();
16759				});
16760			});
16761
16762			this.on('destroy', function () {
16763				_indicatorsMap(function () {
16764					this.destroy();
16765				});
16766
16767				delete this.indicators;
16768			});
16769		},
16770
16771		_initWheel: function () {
16772			utils.addEvent(this.wrapper, 'wheel', this);
16773			utils.addEvent(this.wrapper, 'mousewheel', this);
16774			utils.addEvent(this.wrapper, 'DOMMouseScroll', this);
16775
16776			this.on('destroy', function () {
16777				clearTimeout(this.wheelTimeout);
16778				this.wheelTimeout = null;
16779				utils.removeEvent(this.wrapper, 'wheel', this);
16780				utils.removeEvent(this.wrapper, 'mousewheel', this);
16781				utils.removeEvent(this.wrapper, 'DOMMouseScroll', this);
16782			});
16783		},
16784
16785		_wheel: function (e) {
16786			if (!this.enabled) {
16787				return;
16788			}
16789
16790			e.preventDefault();
16791
16792			var wheelDeltaX,
vendor: 11,445 bytes, lines 16793-17285
16793			    wheelDeltaY,
16794			    newX,
16795			    newY,
16796			    that = this;
16797
16798			if (this.wheelTimeout === undefined) {
16799				that._execEvent('scrollStart');
16800			}
16801
16802			// Execute the scrollEnd event after 400ms the wheel stopped scrolling
16803			clearTimeout(this.wheelTimeout);
16804			this.wheelTimeout = setTimeout(function () {
16805				if (!that.options.snap) {
16806					that._execEvent('scrollEnd');
16807				}
16808				that.wheelTimeout = undefined;
16809			}, 400);
16810
16811			if ('deltaX' in e) {
16812				if (e.deltaMode === 1) {
16813					wheelDeltaX = -e.deltaX * this.options.mouseWheelSpeed;
16814					wheelDeltaY = -e.deltaY * this.options.mouseWheelSpeed;
16815				} else {
16816					wheelDeltaX = -e.deltaX;
16817					wheelDeltaY = -e.deltaY;
16818				}
16819			} else if ('wheelDeltaX' in e) {
16820				wheelDeltaX = e.wheelDeltaX / 120 * this.options.mouseWheelSpeed;
16821				wheelDeltaY = e.wheelDeltaY / 120 * this.options.mouseWheelSpeed;
16822			} else if ('wheelDelta' in e) {
16823				wheelDeltaX = wheelDeltaY = e.wheelDelta / 120 * this.options.mouseWheelSpeed;
16824			} else if ('detail' in e) {
16825				wheelDeltaX = wheelDeltaY = -e.detail / 3 * this.options.mouseWheelSpeed;
16826			} else {
16827				return;
16828			}
16829
16830			wheelDeltaX *= this.options.invertWheelDirection;
16831			wheelDeltaY *= this.options.invertWheelDirection;
16832
16833			if (!this.hasVerticalScroll) {
16834				wheelDeltaX = wheelDeltaY;
16835				wheelDeltaY = 0;
16836			}
16837
16838			if (this.options.snap) {
16839				newX = this.currentPage.pageX;
16840				newY = this.currentPage.pageY;
16841
16842				if (wheelDeltaX > 0) {
16843					newX--;
16844				} else if (wheelDeltaX < 0) {
16845					newX++;
16846				}
16847
16848				if (wheelDeltaY > 0) {
16849					newY--;
16850				} else if (wheelDeltaY < 0) {
16851					newY++;
16852				}
16853
16854				this.goToPage(newX, newY);
16855
16856				return;
16857			}
16858
16859			newX = this.x + Math.round(this.hasHorizontalScroll ? wheelDeltaX : 0);
16860			newY = this.y + Math.round(this.hasVerticalScroll ? wheelDeltaY : 0);
16861
16862			this.directionX = wheelDeltaX > 0 ? -1 : wheelDeltaX < 0 ? 1 : 0;
16863			this.directionY = wheelDeltaY > 0 ? -1 : wheelDeltaY < 0 ? 1 : 0;
16864
16865			if (newX > 0) {
16866				newX = 0;
16867			} else if (newX < this.maxScrollX) {
16868				newX = this.maxScrollX;
16869			}
16870
16871			if (newY > 0) {
16872				newY = 0;
16873			} else if (newY < this.maxScrollY) {
16874				newY = this.maxScrollY;
16875			}
16876
16877			this.scrollTo(newX, newY, 0);
16878
16879			// INSERT POINT: _wheel
16880		},
16881
16882		_initSnap: function () {
16883			this.currentPage = {};
16884
16885			if (typeof this.options.snap == 'string') {
16886				this.options.snap = this.scroller.querySelectorAll(this.options.snap);
16887			}
16888
16889			this.on('refresh', function () {
16890				var i = 0,
16891				    l,
16892				    m = 0,
16893				    n,
16894				    cx,
16895				    cy,
16896				    x = 0,
16897				    y,
16898				    stepX = this.options.snapStepX || this.wrapperWidth,
16899				    stepY = this.options.snapStepY || this.wrapperHeight,
16900				    el;
16901
16902				this.pages = [];
16903
16904				if (!this.wrapperWidth || !this.wrapperHeight || !this.scrollerWidth || !this.scrollerHeight) {
16905					return;
16906				}
16907
16908				if (this.options.snap === true) {
16909					cx = Math.round(stepX / 2);
16910					cy = Math.round(stepY / 2);
16911
16912					while (x > -this.scrollerWidth) {
16913						this.pages[i] = [];
16914						l = 0;
16915						y = 0;
16916
16917						while (y > -this.scrollerHeight) {
16918							this.pages[i][l] = {
16919								x: Math.max(x, this.maxScrollX),
16920								y: Math.max(y, this.maxScrollY),
16921								width: stepX,
16922								height: stepY,
16923								cx: x - cx,
16924								cy: y - cy
16925							};
16926
16927							y -= stepY;
16928							l++;
16929						}
16930
16931						x -= stepX;
16932						i++;
16933					}
16934				} else {
16935					el = this.options.snap;
16936					l = el.length;
16937					n = -1;
16938
16939					for (; i < l; i++) {
16940						if (i === 0 || el[i].offsetLeft <= el[i - 1].offsetLeft) {
16941							m = 0;
16942							n++;
16943						}
16944
16945						if (!this.pages[m]) {
16946							this.pages[m] = [];
16947						}
16948
16949						x = Math.max(-el[i].offsetLeft, this.maxScrollX);
16950						y = Math.max(-el[i].offsetTop, this.maxScrollY);
16951						cx = x - Math.round(el[i].offsetWidth / 2);
16952						cy = y - Math.round(el[i].offsetHeight / 2);
16953
16954						this.pages[m][n] = {
16955							x: x,
16956							y: y,
16957							width: el[i].offsetWidth,
16958							height: el[i].offsetHeight,
16959							cx: cx,
16960							cy: cy
16961						};
16962
16963						if (x > this.maxScrollX) {
16964							m++;
16965						}
16966					}
16967				}
16968
16969				this.goToPage(this.currentPage.pageX || 0, this.currentPage.pageY || 0, 0);
16970
16971				// Update snap threshold if needed
16972				if (this.options.snapThreshold % 1 === 0) {
16973					this.snapThresholdX = this.options.snapThreshold;
16974					this.snapThresholdY = this.options.snapThreshold;
16975				} else {
16976					this.snapThresholdX = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width * this.options.snapThreshold);
16977					this.snapThresholdY = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height * this.options.snapThreshold);
16978				}
16979			});
16980
16981			this.on('flick', function () {
16982				var time = this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(this.x - this.startX), 1000), Math.min(Math.abs(this.y - this.startY), 1000)), 300);
16983
16984				this.goToPage(this.currentPage.pageX + this.directionX, this.currentPage.pageY + this.directionY, time);
16985			});
16986		},
16987
16988		_nearestSnap: function (x, y) {
16989			if (!this.pages.length) {
16990				return { x: 0, y: 0, pageX: 0, pageY: 0 };
16991			}
16992
16993			var i = 0,
16994			    l = this.pages.length,
16995			    m = 0;
16996
16997			// Check if we exceeded the snap threshold
16998			if (Math.abs(x - this.absStartX) < this.snapThresholdX && Math.abs(y - this.absStartY) < this.snapThresholdY) {
16999				return this.currentPage;
17000			}
17001
17002			if (x > 0) {
17003				x = 0;
17004			} else if (x < this.maxScrollX) {
17005				x = this.maxScrollX;
17006			}
17007
17008			if (y > 0) {
17009				y = 0;
17010			} else if (y < this.maxScrollY) {
17011				y = this.maxScrollY;
17012			}
17013
17014			for (; i < l; i++) {
17015				if (x >= this.pages[i][0].cx) {
17016					x = this.pages[i][0].x;
17017					break;
17018				}
17019			}
17020
17021			l = this.pages[i].length;
17022
17023			for (; m < l; m++) {
17024				if (y >= this.pages[0][m].cy) {
17025					y = this.pages[0][m].y;
17026					break;
17027				}
17028			}
17029
17030			if (i == this.currentPage.pageX) {
17031				i += this.directionX;
17032
17033				if (i < 0) {
17034					i = 0;
17035				} else if (i >= this.pages.length) {
17036					i = this.pages.length - 1;
17037				}
17038
17039				x = this.pages[i][0].x;
17040			}
17041
17042			if (m == this.currentPage.pageY) {
17043				m += this.directionY;
17044
17045				if (m < 0) {
17046					m = 0;
17047				} else if (m >= this.pages[0].length) {
17048					m = this.pages[0].length - 1;
17049				}
17050
17051				y = this.pages[0][m].y;
17052			}
17053
17054			return {
17055				x: x,
17056				y: y,
17057				pageX: i,
17058				pageY: m
17059			};
17060		},
17061
17062		goToPage: function (x, y, time, easing) {
17063			easing = easing || this.options.bounceEasing;
17064
17065			if (x >= this.pages.length) {
17066				x = this.pages.length - 1;
17067			} else if (x < 0) {
17068				x = 0;
17069			}
17070
17071			if (y >= this.pages[x].length) {
17072				y = this.pages[x].length - 1;
17073			} else if (y < 0) {
17074				y = 0;
17075			}
17076
17077			var posX = this.pages[x][y].x,
17078			    posY = this.pages[x][y].y;
17079
17080			time = time === undefined ? this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(posX - this.x), 1000), Math.min(Math.abs(posY - this.y), 1000)), 300) : time;
17081
17082			this.currentPage = {
17083				x: posX,
17084				y: posY,
17085				pageX: x,
17086				pageY: y
17087			};
17088
17089			this.scrollTo(posX, posY, time, easing);
17090		},
17091
17092		next: function (time, easing) {
17093			var x = this.currentPage.pageX,
17094			    y = this.currentPage.pageY;
17095
17096			x++;
17097
17098			if (x >= this.pages.length && this.hasVerticalScroll) {
17099				x = 0;
17100				y++;
17101			}
17102
17103			this.goToPage(x, y, time, easing);
17104		},
17105
17106		prev: function (time, easing) {
17107			var x = this.currentPage.pageX,
17108			    y = this.currentPage.pageY;
17109
17110			x--;
17111
17112			if (x < 0 && this.hasVerticalScroll) {
17113				x = 0;
17114				y--;
17115			}
17116
17117			this.goToPage(x, y, time, easing);
17118		},
17119
17120		_initKeys: function (e) {
17121			// default key bindings
17122			var keys = {
17123				pageUp: 33,
17124				pageDown: 34,
17125				end: 35,
17126				home: 36,
17127				left: 37,
17128				up: 38,
17129				right: 39,
17130				down: 40
17131			};
17132			var i;
17133
17134			// if you give me characters I give you keycode
17135			if (typeof this.options.keyBindings == 'object') {
17136				for (i in this.options.keyBindings) {
17137					if (typeof this.options.keyBindings[i] == 'string') {
17138						this.options.keyBindings[i] = this.options.keyBindings[i].toUpperCase().charCodeAt(0);
17139					}
17140				}
17141			} else {
17142				this.options.keyBindings = {};
17143			}
17144
17145			for (i in keys) {
17146				this.options.keyBindings[i] = this.options.keyBindings[i] || keys[i];
17147			}
17148
17149			utils.addEvent(window, 'keydown', this);
17150
17151			this.on('destroy', function () {
17152				utils.removeEvent(window, 'keydown', this);
17153			});
17154		},
17155
17156		_key: function (e) {
17157			if (!this.enabled) {
17158				return;
17159			}
17160
17161			var snap = this.options.snap,
17162			    // we are using this alot, better to cache it
17163			newX = snap ? this.currentPage.pageX : this.x,
17164			    newY = snap ? this.currentPage.pageY : this.y,
17165			    now = utils.getTime(),
17166			    prevTime = this.keyTime || 0,
17167			    acceleration = 0.250,
17168			    pos;
17169
17170			if (this.options.useTransition && this.isInTransition) {
17171				pos = this.getComputedPosition();
17172
17173				this._translate(Math.round(pos.x), Math.round(pos.y));
17174				this.isInTransition = false;
17175			}
17176
17177			this.keyAcceleration = now - prevTime < 200 ? Math.min(this.keyAcceleration + acceleration, 50) : 0;
17178
17179			switch (e.keyCode) {
17180				case this.options.keyBindings.pageUp:
17181					if (this.hasHorizontalScroll && !this.hasVerticalScroll) {
17182						newX += snap ? 1 : this.wrapperWidth;
17183					} else {
17184						newY += snap ? 1 : this.wrapperHeight;
17185					}
17186					break;
17187				case this.options.keyBindings.pageDown:
17188					if (this.hasHorizontalScroll && !this.hasVerticalScroll) {
17189						newX -= snap ? 1 : this.wrapperWidth;
17190					} else {
17191						newY -= snap ? 1 : this.wrapperHeight;
17192					}
17193					break;
17194				case this.options.keyBindings.end:
17195					newX = snap ? this.pages.length - 1 : this.maxScrollX;
17196					newY = snap ? this.pages[0].length - 1 : this.maxScrollY;
17197					break;
17198				case this.options.keyBindings.home:
17199					newX = 0;
17200					newY = 0;
17201					break;
17202				case this.options.keyBindings.left:
17203					newX += snap ? -1 : 5 + this.keyAcceleration >> 0;
17204					break;
17205				case this.options.keyBindings.up:
17206					newY += snap ? 1 : 5 + this.keyAcceleration >> 0;
17207					break;
17208				case this.options.keyBindings.right:
17209					newX -= snap ? -1 : 5 + this.keyAcceleration >> 0;
17210					break;
17211				case this.options.keyBindings.down:
17212					newY -= snap ? 1 : 5 + this.keyAcceleration >> 0;
17213					break;
17214				default:
17215					return;
17216			}
17217
17218			if (snap) {
17219				this.goToPage(newX, newY);
17220				return;
17221			}
17222
17223			if (newX > 0) {
17224				newX = 0;
17225				this.keyAcceleration = 0;
17226			} else if (newX < this.maxScrollX) {
17227				newX = this.maxScrollX;
17228				this.keyAcceleration = 0;
17229			}
17230
17231			if (newY > 0) {
17232				newY = 0;
17233				this.keyAcceleration = 0;
17234			} else if (newY < this.maxScrollY) {
17235				newY = this.maxScrollY;
17236				this.keyAcceleration = 0;
17237			}
17238
17239			this.scrollTo(newX, newY, 0);
17240
17241			this.keyTime = now;
17242		},
17243
17244		_animate: function (destX, destY, duration, easingFn) {
17245			var that = this,
17246			    startX = this.x,
17247			    startY = this.y,
17248			    startTime = utils.getTime(),
17249			    destTime = startTime + duration;
17250
17251			function step() {
17252				var now = utils.getTime(),
17253				    newX,
17254				    newY,
17255				    easing;
17256
17257				if (now >= destTime) {
17258					that.isAnimating = false;
17259					that._translate(destX, destY);
17260
17261					if (!that.resetPosition(that.options.bounceTime)) {
17262						that._execEvent('scrollEnd');
17263					}
17264
17265					return;
17266				}
17267
17268				now = (now - startTime) / duration;
17269				easing = easingFn(now);
17270				newX = (destX - startX) * easing + startX;
17271				newY = (destY - startY) * easing + startY;
17272				that._translate(newX, newY);
17273
17274				if (that.isAnimating) {
17275					rAF(step);
17276				}
17277			}
17278
17279			this.isAnimating = true;
17280			step();
17281		},
17282		handleEvent: function (e) {
17283			switch (e.type) {
17284				case 'touchstart':
17285				case 'pointerdown':
vendor: 9,265 bytes, lines 17286-17630
17286				case 'MSPointerDown':
17287				case 'mousedown':
17288					this._start(e);
17289					break;
17290				case 'touchmove':
17291				case 'pointermove':
17292				case 'MSPointerMove':
17293				case 'mousemove':
17294					this._move(e);
17295					break;
17296				case 'touchend':
17297				case 'pointerup':
17298				case 'MSPointerUp':
17299				case 'mouseup':
17300				case 'touchcancel':
17301				case 'pointercancel':
17302				case 'MSPointerCancel':
17303				case 'mousecancel':
17304					this._end(e);
17305					break;
17306				case 'orientationchange':
17307				case 'resize':
17308					this._resize();
17309					break;
17310				case 'transitionend':
17311				case 'webkitTransitionEnd':
17312				case 'oTransitionEnd':
17313				case 'MSTransitionEnd':
17314					this._transitionEnd(e);
17315					break;
17316				case 'wheel':
17317				case 'DOMMouseScroll':
17318				case 'mousewheel':
17319					this._wheel(e);
17320					break;
17321				case 'keydown':
17322					this._key(e);
17323					break;
17324				case 'click':
17325					if (this.enabled && !e._constructed) {
17326						e.preventDefault();
17327						e.stopPropagation();
17328					}
17329					break;
17330			}
17331		}
17332	};
17333	function createDefaultScrollbar(direction, interactive, type) {
17334		var scrollbar = document.createElement('div'),
17335		    indicator = document.createElement('div');
17336
17337		if (type === true) {
17338			scrollbar.style.cssText = 'position:absolute;z-index:9999';
17339			indicator.style.cssText = '-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px';
17340		}
17341
17342		indicator.className = 'iScrollIndicator';
17343
17344		if (direction == 'h') {
17345			if (type === true) {
17346				scrollbar.style.cssText += ';height:7px;left:2px;right:2px;bottom:0';
17347				indicator.style.height = '100%';
17348			}
17349			scrollbar.className = 'iScrollHorizontalScrollbar';
17350		} else {
17351			if (type === true) {
17352				scrollbar.style.cssText += ';width:7px;bottom:2px;top:2px;right:1px';
17353				indicator.style.width = '100%';
17354			}
17355			scrollbar.className = 'iScrollVerticalScrollbar';
17356		}
17357
17358		scrollbar.style.cssText += ';overflow:hidden';
17359
17360		if (!interactive) {
17361			scrollbar.style.pointerEvents = 'none';
17362		}
17363
17364		scrollbar.appendChild(indicator);
17365
17366		return scrollbar;
17367	}
17368
17369	function Indicator(scroller, options) {
17370		this.wrapper = typeof options.el == 'string' ? document.querySelector(options.el) : options.el;
17371		this.wrapperStyle = this.wrapper.style;
17372		this.indicator = this.wrapper.children[0];
17373		this.indicatorStyle = this.indicator.style;
17374		this.scroller = scroller;
17375
17376		this.options = {
17377			listenX: true,
17378			listenY: true,
17379			interactive: false,
17380			resize: true,
17381			defaultScrollbars: false,
17382			shrink: false,
17383			fade: false,
17384			speedRatioX: 0,
17385			speedRatioY: 0
17386		};
17387
17388		for (var i in options) {
17389			this.options[i] = options[i];
17390		}
17391
17392		this.sizeRatioX = 1;
17393		this.sizeRatioY = 1;
17394		this.maxPosX = 0;
17395		this.maxPosY = 0;
17396
17397		if (this.options.interactive) {
17398			if (!this.options.disableTouch) {
17399				utils.addEvent(this.indicator, 'touchstart', this);
17400				utils.addEvent(window, 'touchend', this);
17401			}
17402			if (!this.options.disablePointer) {
17403				utils.addEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this);
17404				utils.addEvent(window, utils.prefixPointerEvent('pointerup'), this);
17405			}
17406			if (!this.options.disableMouse) {
17407				utils.addEvent(this.indicator, 'mousedown', this);
17408				utils.addEvent(window, 'mouseup', this);
17409			}
17410		}
17411
17412		if (this.options.fade) {
17413			this.wrapperStyle[utils.style.transform] = this.scroller.translateZ;
17414			var durationProp = utils.style.transitionDuration;
17415			this.wrapperStyle[durationProp] = utils.isBadAndroid ? '0.0001ms' : '0ms';
17416			// remove 0.0001ms
17417			var self = this;
17418			if (utils.isBadAndroid) {
17419				rAF(function () {
17420					if (self.wrapperStyle[durationProp] === '0.0001ms') {
17421						self.wrapperStyle[durationProp] = '0s';
17422					}
17423				});
17424			}
17425			this.wrapperStyle.opacity = '0';
17426		}
17427	}
17428
17429	Indicator.prototype = {
17430		handleEvent: function (e) {
17431			switch (e.type) {
17432				case 'touchstart':
17433				case 'pointerdown':
17434				case 'MSPointerDown':
17435				case 'mousedown':
17436					this._start(e);
17437					break;
17438				case 'touchmove':
17439				case 'pointermove':
17440				case 'MSPointerMove':
17441				case 'mousemove':
17442					this._move(e);
17443					break;
17444				case 'touchend':
17445				case 'pointerup':
17446				case 'MSPointerUp':
17447				case 'mouseup':
17448				case 'touchcancel':
17449				case 'pointercancel':
17450				case 'MSPointerCancel':
17451				case 'mousecancel':
17452					this._end(e);
17453					break;
17454			}
17455		},
17456
17457		destroy: function () {
17458			if (this.options.fadeScrollbars) {
17459				clearTimeout(this.fadeTimeout);
17460				this.fadeTimeout = null;
17461			}
17462			if (this.options.interactive) {
17463				utils.removeEvent(this.indicator, 'touchstart', this);
17464				utils.removeEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this);
17465				utils.removeEvent(this.indicator, 'mousedown', this);
17466
17467				utils.removeEvent(window, 'touchmove', this);
17468				utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this);
17469				utils.removeEvent(window, 'mousemove', this);
17470
17471				utils.removeEvent(window, 'touchend', this);
17472				utils.removeEvent(window, utils.prefixPointerEvent('pointerup'), this);
17473				utils.removeEvent(window, 'mouseup', this);
17474			}
17475
17476			if (this.options.defaultScrollbars) {
17477				this.wrapper.parentNode.removeChild(this.wrapper);
17478			}
17479		},
17480
17481		_start: function (e) {
17482			var point = e.touches ? e.touches[0] : e;
17483
17484			e.preventDefault();
17485			e.stopPropagation();
17486
17487			this.transitionTime();
17488
17489			this.initiated = true;
17490			this.moved = false;
17491			this.lastPointX = point.pageX;
17492			this.lastPointY = point.pageY;
17493
17494			this.startTime = utils.getTime();
17495
17496			if (!this.options.disableTouch) {
17497				utils.addEvent(window, 'touchmove', this);
17498			}
17499			if (!this.options.disablePointer) {
17500				utils.addEvent(window, utils.prefixPointerEvent('pointermove'), this);
17501			}
17502			if (!this.options.disableMouse) {
17503				utils.addEvent(window, 'mousemove', this);
17504			}
17505
17506			this.scroller._execEvent('beforeScrollStart');
17507		},
17508
17509		_move: function (e) {
17510			var point = e.touches ? e.touches[0] : e,
17511			    deltaX,
17512			    deltaY,
17513			    newX,
17514			    newY,
17515			    timestamp = utils.getTime();
17516
17517			if (!this.moved) {
17518				this.scroller._execEvent('scrollStart');
17519			}
17520
17521			this.moved = true;
17522
17523			deltaX = point.pageX - this.lastPointX;
17524			this.lastPointX = point.pageX;
17525
17526			deltaY = point.pageY - this.lastPointY;
17527			this.lastPointY = point.pageY;
17528
17529			newX = this.x + deltaX;
17530			newY = this.y + deltaY;
17531
17532			this._pos(newX, newY);
17533
17534			// INSERT POINT: indicator._move
17535
17536			e.preventDefault();
17537			e.stopPropagation();
17538		},
17539
17540		_end: function (e) {
17541			if (!this.initiated) {
17542				return;
17543			}
17544
17545			this.initiated = false;
17546
17547			e.preventDefault();
17548			e.stopPropagation();
17549
17550			utils.removeEvent(window, 'touchmove', this);
17551			utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this);
17552			utils.removeEvent(window, 'mousemove', this);
17553
17554			if (this.scroller.options.snap) {
17555				var snap = this.scroller._nearestSnap(this.scroller.x, this.scroller.y);
17556
17557				var time = this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(this.scroller.x - snap.x), 1000), Math.min(Math.abs(this.scroller.y - snap.y), 1000)), 300);
17558
17559				if (this.scroller.x != snap.x || this.scroller.y != snap.y) {
17560					this.scroller.directionX = 0;
17561					this.scroller.directionY = 0;
17562					this.scroller.currentPage = snap;
17563					this.scroller.scrollTo(snap.x, snap.y, time, this.scroller.options.bounceEasing);
17564				}
17565			}
17566
17567			if (this.moved) {
17568				this.scroller._execEvent('scrollEnd');
17569			}
17570		},
17571
17572		transitionTime: function (time) {
17573			time = time || 0;
17574			var durationProp = utils.style.transitionDuration;
17575			this.indicatorStyle[durationProp] = time + 'ms';
17576
17577			if (!time && utils.isBadAndroid) {
17578				this.indicatorStyle[durationProp] = '0.0001ms';
17579				// remove 0.0001ms
17580				var self = this;
17581				rAF(function () {
17582					if (self.indicatorStyle[durationProp] === '0.0001ms') {
17583						self.indicatorStyle[durationProp] = '0s';
17584					}
17585				});
17586			}
17587		},
17588
17589		transitionTimingFunction: function (easing) {
17590			this.indicatorStyle[utils.style.transitionTimingFunction] = easing;
17591		},
17592
17593		refresh: function () {
17594			this.transitionTime();
17595
17596			if (this.options.listenX && !this.options.listenY) {
17597				this.indicatorStyle.display = this.scroller.hasHorizontalScroll ? 'block' : 'none';
17598			} else if (this.options.listenY && !this.options.listenX) {
17599				this.indicatorStyle.display = this.scroller.hasVerticalScroll ? 'block' : 'none';
17600			} else {
17601				this.indicatorStyle.display = this.scroller.hasHorizontalScroll || this.scroller.hasVerticalScroll ? 'block' : 'none';
17602			}
17603
17604			if (this.scroller.hasHorizontalScroll && this.scroller.hasVerticalScroll) {
17605				utils.addClass(this.wrapper, 'iScrollBothScrollbars');
17606				utils.removeClass(this.wrapper, 'iScrollLoneScrollbar');
17607
17608				if (this.options.defaultScrollbars && this.options.customStyle) {
17609					if (this.options.listenX) {
17610						this.wrapper.style.right = '8px';
17611					} else {
17612						this.wrapper.style.bottom = '8px';
17613					}
17614				}
17615			} else {
17616				utils.removeClass(this.wrapper, 'iScrollBothScrollbars');
17617				utils.addClass(this.wrapper, 'iScrollLoneScrollbar');
17618
17619				if (this.options.defaultScrollbars && this.options.customStyle) {
17620					if (this.options.listenX) {
17621						this.wrapper.style.right = '2px';
17622					} else {
17623						this.wrapper.style.bottom = '2px';
17624					}
17625				}
17626			}
17627
17628			var r = this.wrapper.offsetHeight; // force refresh
17629
17630			if (this.options.listenX) {
vendor: 4,299 bytes, lines 17631-17760
17631				this.wrapperWidth = this.wrapper.clientWidth;
17632				if (this.options.resize) {
17633					this.indicatorWidth = Math.max(Math.round(this.wrapperWidth * this.wrapperWidth / (this.scroller.scrollerWidth || this.wrapperWidth || 1)), 8);
17634					this.indicatorStyle.width = this.indicatorWidth + 'px';
17635				} else {
17636					this.indicatorWidth = this.indicator.clientWidth;
17637				}
17638
17639				this.maxPosX = this.wrapperWidth - this.indicatorWidth;
17640
17641				if (this.options.shrink == 'clip') {
17642					this.minBoundaryX = -this.indicatorWidth + 8;
17643					this.maxBoundaryX = this.wrapperWidth - 8;
17644				} else {
17645					this.minBoundaryX = 0;
17646					this.maxBoundaryX = this.maxPosX;
17647				}
17648
17649				this.sizeRatioX = this.options.speedRatioX || this.scroller.maxScrollX && this.maxPosX / this.scroller.maxScrollX;
17650			}
17651
17652			if (this.options.listenY) {
17653				this.wrapperHeight = this.wrapper.clientHeight;
17654				if (this.options.resize) {
17655					this.indicatorHeight = Math.max(Math.round(this.wrapperHeight * this.wrapperHeight / (this.scroller.scrollerHeight || this.wrapperHeight || 1)), 8);
17656					this.indicatorStyle.height = this.indicatorHeight + 'px';
17657				} else {
17658					this.indicatorHeight = this.indicator.clientHeight;
17659				}
17660
17661				this.maxPosY = this.wrapperHeight - this.indicatorHeight;
17662
17663				if (this.options.shrink == 'clip') {
17664					this.minBoundaryY = -this.indicatorHeight + 8;
17665					this.maxBoundaryY = this.wrapperHeight - 8;
17666				} else {
17667					this.minBoundaryY = 0;
17668					this.maxBoundaryY = this.maxPosY;
17669				}
17670
17671				this.maxPosY = this.wrapperHeight - this.indicatorHeight;
17672				this.sizeRatioY = this.options.speedRatioY || this.scroller.maxScrollY && this.maxPosY / this.scroller.maxScrollY;
17673			}
17674
17675			this.updatePosition();
17676		},
17677
17678		updatePosition: function () {
17679			var x = this.options.listenX && Math.round(this.sizeRatioX * this.scroller.x) || 0,
17680			    y = this.options.listenY && Math.round(this.sizeRatioY * this.scroller.y) || 0;
17681
17682			if (!this.options.ignoreBoundaries) {
17683				if (x < this.minBoundaryX) {
17684					if (this.options.shrink == 'scale') {
17685						this.width = Math.max(this.indicatorWidth + x, 8);
17686						this.indicatorStyle.width = this.width + 'px';
17687					}
17688					x = this.minBoundaryX;
17689				} else if (x > this.maxBoundaryX) {
17690					if (this.options.shrink == 'scale') {
17691						this.width = Math.max(this.indicatorWidth - (x - this.maxPosX), 8);
17692						this.indicatorStyle.width = this.width + 'px';
17693						x = this.maxPosX + this.indicatorWidth - this.width;
17694					} else {
17695						x = this.maxBoundaryX;
17696					}
17697				} else if (this.options.shrink == 'scale' && this.width != this.indicatorWidth) {
17698					this.width = this.indicatorWidth;
17699					this.indicatorStyle.width = this.width + 'px';
17700				}
17701
17702				if (y < this.minBoundaryY) {
17703					if (this.options.shrink == 'scale') {
17704						this.height = Math.max(this.indicatorHeight + y * 3, 8);
17705						this.indicatorStyle.height = this.height + 'px';
17706					}
17707					y = this.minBoundaryY;
17708				} else if (y > this.maxBoundaryY) {
17709					if (this.options.shrink == 'scale') {
17710						this.height = Math.max(this.indicatorHeight - (y - this.maxPosY) * 3, 8);
17711						this.indicatorStyle.height = this.height + 'px';
17712						y = this.maxPosY + this.indicatorHeight - this.height;
17713					} else {
17714						y = this.maxBoundaryY;
17715					}
17716				} else if (this.options.shrink == 'scale' && this.height != this.indicatorHeight) {
17717					this.height = this.indicatorHeight;
17718					this.indicatorStyle.height = this.height + 'px';
17719				}
17720			}
17721
17722			this.x = x;
17723			this.y = y;
17724
17725			if (this.scroller.options.useTransform) {
17726				this.indicatorStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.scroller.translateZ;
17727			} else {
17728				this.indicatorStyle.left = x + 'px';
17729				this.indicatorStyle.top = y + 'px';
17730			}
17731		},
17732
17733		_pos: function (x, y) {
17734			if (x < 0) {
17735				x = 0;
17736			} else if (x > this.maxPosX) {
17737				x = this.maxPosX;
17738			}
17739
17740			if (y < 0) {
17741				y = 0;
17742			} else if (y > this.maxPosY) {
17743				y = this.maxPosY;
17744			}
17745
17746			x = this.options.listenX ? Math.round(x / this.sizeRatioX) : this.scroller.x;
17747			y = this.options.listenY ? Math.round(y / this.sizeRatioY) : this.scroller.y;
17748
17749			this.scroller.scrollTo(x, y);
17750		},
17751
17752		fade: function (val, hold) {
17753			if (hold && !this.visible) {
17754				return;
17755			}
17756
17757			clearTimeout(this.fadeTimeout);
17758			this.fadeTimeout = null;
17759
17760			var time = val ? 250 : 500,
17761			    delay = val ? 0 : 300;
17762
17763			val = val ? '1' : '0';
17764
17765			this.wrapperStyle[utils.style.transitionDuration] = time + 'ms';
17766
17767			this.fadeTimeout = setTimeout(function (val) {
17768				this.wrapperStyle.opacity = val;
17769				this.visible = +val;
17770			}.bind(this, val), delay);
17771		}
17772	};
17773
17774	IScroll.utils = utils;
17775
17776	if (typeof module != 'undefined' && module.exports) {
17777		module.exports = IScroll;
17778	} else if (true) {
17779		!(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
17780			return IScroll;
17781		}).call(exports, __webpack_require__, exports, module),
17782				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
17783	} else {
17784		window.IScroll = IScroll;
17785	}
17786})(window, document, Math);
17787
17788/***/ })
17789/******/ ]);
17790//# sourceMappingURL=../../src/map/lyt-cn-face.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.