projects/genea/out/js/spectrum-1.8.1/docs/jquery-2.1.0.js
1.
/*!
2.
 * jQuery JavaScript Library v2.1.0
3.
 * http://jquery.com/
4.
 *
5.
 * Includes Sizzle.js
6.
 * http://sizzlejs.com/
7.
 *
8.
 * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
9.
 * Released under the MIT license
10.
 * http://jquery.org/license
11.
 *
12.
 * Date: 2014-01-23T21:10Z
13.
 */
14.
 
15.
(function( global, factory ) {
16.
 
17.
  if ( typeof module === "object" && typeof module.exports === "object" ) {
18.
    // For CommonJS and CommonJS-like environments where a proper window is present,
19.
    // execute the factory and get jQuery
20.
    // For environments that do not inherently posses a window with a document
21.
    // (such as Node.js), expose a jQuery-making factory as module.exports
22.
    // This accentuates the need for the creation of a real window
23.
    // e.g. var jQuery = require("jquery")(window);
24.
    // See ticket #14549 for more info
25.
    module.exports = global.document ?
26.
      factory( global, true ) :
27.
      function( w ) {
28.
        if ( !w.document ) {
29.
          throw new Error( "jQuery requires a window with a document" );
30.
        }
31.
        return factory( w );
32.
      };
33.
  } else {
34.
    factory( global );
35.
  }
36.
 
37.
// Pass this if window is not defined yet
38.
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
39.
 
40.
// Can't do this because several apps including ASP.NET trace
41.
// the stack via arguments.caller.callee and Firefox dies if
42.
// you try to trace through "use strict" call chains. (#13335)
43.
// Support: Firefox 18+
44.
//
45.
 
46.
var arr = [];
47.
 
48.
var slice = arr.slice;
49.
 
50.
var concat = arr.concat;
51.
 
52.
var push = arr.push;
53.
 
54.
var indexOf = arr.indexOf;
55.
 
56.
var class2type = {};
57.
 
58.
var toString = class2type.toString;
59.
 
60.
var hasOwn = class2type.hasOwnProperty;
61.
 
62.
var trim = "".trim;
63.
 
64.
var support = {};
65.
 
66.
 
67.
 
68.
var
69.
  // Use the correct document accordingly with window argument (sandbox)
70.
  document = window.document,
71.
 
72.
  version = "2.1.0",
73.
 
74.
  // Define a local copy of jQuery
75.
  jQuery = function( selector, context ) {
76.
    // The jQuery object is actually just the init constructor 'enhanced'
77.
    // Need init if jQuery is called (just allow error to be thrown if not included)
78.
    return new jQuery.fn.init( selector, context );
79.
  },
80.
 
81.
  // Matches dashed string for camelizing
82.
  rmsPrefix = /^-ms-/,
83.
  rdashAlpha = /-([\da-z])/gi,
84.
 
85.
  // Used by jQuery.camelCase as callback to replace()
86.
  fcamelCase = function( all, letter ) {
87.
    return letter.toUpperCase();
88.
  };
89.
 
90.
jQuery.fn = jQuery.prototype = {
91.
  // The current version of jQuery being used
92.
  jquery: version,
93.
 
94.
  constructor: jQuery,
95.
 
96.
  // Start with an empty selector
97.
  selector: "",
98.
 
99.
  // The default length of a jQuery object is 0
100.
  length: 0,
101.
 
102.
  toArray: function() {
103.
    return slice.call( this );
104.
  },
105.
 
106.
  // Get the Nth element in the matched element set OR
107.
  // Get the whole matched element set as a clean array
108.
  get: function( num ) {
109.
    return num != null ?
110.
 
111.
      // Return a 'clean' array
112.
      ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
113.
 
114.
      // Return just the object
115.
      slice.call( this );
116.
  },
117.
 
118.
  // Take an array of elements and push it onto the stack
119.
  // (returning the new matched element set)
120.
  pushStack: function( elems ) {
121.
 
122.
    // Build a new jQuery matched element set
123.
    var ret = jQuery.merge( this.constructor(), elems );
124.
 
125.
    // Add the old object onto the stack (as a reference)
126.
    ret.prevObject = this;
127.
    ret.context = this.context;
128.
 
129.
    // Return the newly-formed element set
130.
    return ret;
131.
  },
132.
 
133.
  // Execute a callback for every element in the matched set.
134.
  // (You can seed the arguments with an array of args, but this is
135.
  // only used internally.)
136.
  each: function( callback, args ) {
137.
    return jQuery.each( this, callback, args );
138.
  },
139.
 
140.
  map: function( callback ) {
141.
    return this.pushStack( jQuery.map(this, function( elem, i ) {
142.
      return callback.call( elem, i, elem );
143.
    }));
144.
  },
145.
 
146.
  slice: function() {
147.
    return this.pushStack( slice.apply( this, arguments ) );
148.
  },
149.
 
150.
  first: function() {
151.
    return this.eq( 0 );
152.
  },
153.
 
154.
  last: function() {
155.
    return this.eq( -1 );
156.
  },
157.
 
158.
  eq: function( i ) {
159.
    var len = this.length,
160.
      j = +i + ( i < 0 ? len : 0 );
161.
    return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
162.
  },
163.
 
164.
  end: function() {
165.
    return this.prevObject || this.constructor(null);
166.
  },
167.
 
168.
  // For internal use only.
169.
  // Behaves like an Array's method, not like a jQuery method.
170.
  push: push,
171.
  sort: arr.sort,
172.
  splice: arr.splice
173.
};
174.
 
175.
jQuery.extend = jQuery.fn.extend = function() {
176.
  var options, name, src, copy, copyIsArray, clone,
177.
    target = arguments[0] || {},
178.
    i = 1,
179.
    length = arguments.length,
180.
    deep = false;
181.
 
182.
  // Handle a deep copy situation
183.
  if ( typeof target === "boolean" ) {
184.
    deep = target;
185.
 
186.
    // skip the boolean and the target
187.
    target = arguments[ i ] || {};
188.
    i++;
189.
  }
190.
 
191.
  // Handle case when target is a string or something (possible in deep copy)
192.
  if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
193.
    target = {};
194.
  }
195.
 
196.
  // extend jQuery itself if only one argument is passed
197.
  if ( i === length ) {
198.
    target = this;
199.
    i--;
200.
  }
201.
 
202.
  for ( ; i < length; i++ ) {
203.
    // Only deal with non-null/undefined values
204.
    if ( (options = arguments[ i ]) != null ) {
205.
      // Extend the base object
206.
      for ( name in options ) {
207.
        src = target[ name ];
208.
        copy = options[ name ];
209.
 
210.
        // Prevent never-ending loop
211.
        if ( target === copy ) {
212.
          continue;
213.
        }
214.
 
215.
        // Recurse if we're merging plain objects or arrays
216.
        if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
217.
          if ( copyIsArray ) {
218.
            copyIsArray = false;
219.
            clone = src && jQuery.isArray(src) ? src : [];
220.
 
221.
          } else {
222.
            clone = src && jQuery.isPlainObject(src) ? src : {};
223.
          }
224.
 
225.
          // Never move original objects, clone them
226.
          target[ name ] = jQuery.extend( deep, clone, copy );
227.
 
228.
        // Don't bring in undefined values
229.
        } else if ( copy !== undefined ) {
230.
          target[ name ] = copy;
231.
        }
232.
      }
233.
    }
234.
  }
235.
 
236.
  // Return the modified object
237.
  return target;
238.
};
239.
 
240.
jQuery.extend({
241.
  // Unique for each copy of jQuery on the page
242.
  expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
243.
 
244.
  // Assume jQuery is ready without the ready module
245.
  isReady: true,
246.
 
247.
  error: function( msg ) {
248.
    throw new Error( msg );
249.
  },
250.
 
251.
  noop: function() {},
252.
 
253.
  // See test/unit/core.js for details concerning isFunction.
254.
  // Since version 1.3, DOM methods and functions like alert
255.
  // aren't supported. They return false on IE (#2968).
256.
  isFunction: function( obj ) {
257.
    return jQuery.type(obj) === "function";
258.
  },
259.
 
260.
  isArray: Array.isArray,
261.
 
262.
  isWindow: function( obj ) {
263.
    return obj != null && obj === obj.window;
264.
  },
265.
 
266.
  isNumeric: function( obj ) {
267.
    // parseFloat NaNs numeric-cast false positives (null|true|false|"")
268.
    // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
269.
    // subtraction forces infinities to NaN
270.
    return obj - parseFloat( obj ) >= 0;
271.
  },
272.
 
273.
  isPlainObject: function( obj ) {
274.
    // Not plain objects:
275.
    // - Any object or value whose internal [[Class]] property is not "[object Object]"
276.
    // - DOM nodes
277.
    // - window
278.
    if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
279.
      return false;
280.
    }
281.
 
282.
    // Support: Firefox <20
283.
    // The try/catch suppresses exceptions thrown when attempting to access
284.
    // the "constructor" property of certain host objects, ie. |window.location|
285.
    // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
286.
    try {
287.
      if ( obj.constructor &&
288.
          !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
289.
        return false;
290.
      }
291.
    } catch ( e ) {
292.
      return false;
293.
    }
294.
 
295.
    // If the function hasn't returned already, we're confident that
296.
    // |obj| is a plain object, created by {} or constructed with new Object
297.
    return true;
298.
  },
299.
 
300.
  isEmptyObject: function( obj ) {
301.
    var name;
302.
    for ( name in obj ) {
303.
      return false;
304.
    }
305.
    return true;
306.
  },
307.
 
308.
  type: function( obj ) {
309.
    if ( obj == null ) {
310.
      return obj + "";
311.
    }
312.
    // Support: Android < 4.0, iOS < 6 (functionish RegExp)
313.
    return typeof obj === "object" || typeof obj === "function" ?
314.
      class2type[ toString.call(obj) ] || "object" :
315.
      typeof obj;
316.
  },
317.
 
318.
  // Evaluates a script in a global context
319.
  globalEval: function( code ) {
320.
    var script,
321.
      indirect = eval;
322.
 
323.
    code = jQuery.trim( code );
324.
 
325.
    if ( code ) {
326.
      // If the code includes a valid, prologue position
327.
      // strict mode pragma, execute code by injecting a
328.
      // script tag into the document.
329.
      if ( code.indexOf("use strict") === 1 ) {
330.
        script = document.createElement("script");
331.
        script.text = code;
332.
        document.head.appendChild( script ).parentNode.removeChild( script );
333.
      } else {
334.
      // Otherwise, avoid the DOM node creation, insertion
335.
      // and removal by using an indirect global eval
336.
        indirect( code );
337.
      }
338.
    }
339.
  },
340.
 
341.
  // Convert dashed to camelCase; used by the css and data modules
342.
  // Microsoft forgot to hump their vendor prefix (#9572)
343.
  camelCase: function( string ) {
344.
    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
345.
  },
346.
 
347.
  nodeName: function( elem, name ) {
348.
    return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
349.
  },
350.
 
351.
  // args is for internal usage only
352.
  each: function( obj, callback, args ) {
353.
    var value,
354.
      i = 0,
355.
      length = obj.length,
356.
      isArray = isArraylike( obj );
357.
 
358.
    if ( args ) {
359.
      if ( isArray ) {
360.
        for ( ; i < length; i++ ) {
361.
          value = callback.apply( obj[ i ], args );
362.
 
363.
          if ( value === false ) {
364.
            break;
365.
          }
366.
        }
367.
      } else {
368.
        for ( i in obj ) {
369.
          value = callback.apply( obj[ i ], args );
370.
 
371.
          if ( value === false ) {
372.
            break;
373.
          }
374.
        }
375.
      }
376.
 
377.
    // A special, fast, case for the most common use of each
378.
    } else {
379.
      if ( isArray ) {
380.
        for ( ; i < length; i++ ) {
381.
          value = callback.call( obj[ i ], i, obj[ i ] );
382.
 
383.
          if ( value === false ) {
384.
            break;
385.
          }
386.
        }
387.
      } else {
388.
        for ( i in obj ) {
389.
          value = callback.call( obj[ i ], i, obj[ i ] );
390.
 
391.
          if ( value === false ) {
392.
            break;
393.
          }
394.
        }
395.
      }
396.
    }
397.
 
398.
    return obj;
399.
  },
400.
 
401.
  trim: function( text ) {
402.
    return text == null ? "" : trim.call( text );
403.
  },
404.
 
405.
  // results is for internal usage only
406.
  makeArray: function( arr, results ) {
407.
    var ret = results || [];
408.
 
409.
    if ( arr != null ) {
410.
      if ( isArraylike( Object(arr) ) ) {
411.
        jQuery.merge( ret,
412.
          typeof arr === "string" ?
413.
          [ arr ] : arr
414.
        );
415.
      } else {
416.
        push.call( ret, arr );
417.
      }
418.
    }
419.
 
420.
    return ret;
421.
  },
422.
 
423.
  inArray: function( elem, arr, i ) {
424.
    return arr == null ? -1 : indexOf.call( arr, elem, i );
425.
  },
426.
 
427.
  merge: function( first, second ) {
428.
    var len = +second.length,
429.
      j = 0,
430.
      i = first.length;
431.
 
432.
    for ( ; j < len; j++ ) {
433.
      first[ i++ ] = second[ j ];
434.
    }
435.
 
436.
    first.length = i;
437.
 
438.
    return first;
439.
  },
440.
 
441.
  grep: function( elems, callback, invert ) {
442.
    var callbackInverse,
443.
      matches = [],
444.
      i = 0,
445.
      length = elems.length,
446.
      callbackExpect = !invert;
447.
 
448.
    // Go through the array, only saving the items
449.
    // that pass the validator function
450.
    for ( ; i < length; i++ ) {
451.
      callbackInverse = !callback( elems[ i ], i );
452.
      if ( callbackInverse !== callbackExpect ) {
453.
        matches.push( elems[ i ] );
454.
      }
455.
    }
456.
 
457.
    return matches;
458.
  },
459.
 
460.
  // arg is for internal usage only
461.
  map: function( elems, callback, arg ) {
462.
    var value,
463.
      i = 0,
464.
      length = elems.length,
465.
      isArray = isArraylike( elems ),
466.
      ret = [];
467.
 
468.
    // Go through the array, translating each of the items to their new values
469.
    if ( isArray ) {
470.
      for ( ; i < length; i++ ) {
471.
        value = callback( elems[ i ], i, arg );
472.
 
473.
        if ( value != null ) {
474.
          ret.push( value );
475.
        }
476.
      }
477.
 
478.
    // Go through every key on the object,
479.
    } else {
480.
      for ( i in elems ) {
481.
        value = callback( elems[ i ], i, arg );
482.
 
483.
        if ( value != null ) {
484.
          ret.push( value );
485.
        }
486.
      }
487.
    }
488.
 
489.
    // Flatten any nested arrays
490.
    return concat.apply( [], ret );
491.
  },
492.
 
493.
  // A global GUID counter for objects
494.
  guid: 1,
495.
 
496.
  // Bind a function to a context, optionally partially applying any
497.
  // arguments.
498.
  proxy: function( fn, context ) {
499.
    var tmp, args, proxy;
500.
 
501.
    if ( typeof context === "string" ) {
502.
      tmp = fn[ context ];
503.
      context = fn;
504.
      fn = tmp;
505.
    }
506.
 
507.
    // Quick check to determine if target is callable, in the spec
508.
    // this throws a TypeError, but we will just return undefined.
509.
    if ( !jQuery.isFunction( fn ) ) {
510.
      return undefined;
511.
    }
512.
 
513.
    // Simulated bind
514.
    args = slice.call( arguments, 2 );
515.
    proxy = function() {
516.
      return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
517.
    };
518.
 
519.
    // Set the guid of unique handler to the same of original handler, so it can be removed
520.
    proxy.guid = fn.guid = fn.guid || jQuery.guid++;
521.
 
522.
    return proxy;
523.
  },
524.
 
525.
  now: Date.now,
526.
 
527.
  // jQuery.support is not used in Core but other projects attach their
528.
  // properties to it so it needs to exist.
529.
  support: support
530.
});
531.
 
532.
// Populate the class2type map
533.
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
534.
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
535.
});
536.
 
537.
function isArraylike( obj ) {
538.
  var length = obj.length,
539.
    type = jQuery.type( obj );
540.
 
541.
  if ( type === "function" || jQuery.isWindow( obj ) ) {
542.
    return false;
543.
  }
544.
 
545.
  if ( obj.nodeType === 1 && length ) {
546.
    return true;
547.
  }
548.
 
549.
  return type === "array" || length === 0 ||
550.
    typeof length === "number" && length > 0 && ( length - 1 ) in obj;
551.
}
552.
var Sizzle =
553.
/*!
554.
 * Sizzle CSS Selector Engine v1.10.16
555.
 * http://sizzlejs.com/
556.
 *
557.
 * Copyright 2013 jQuery Foundation, Inc. and other contributors
558.
 * Released under the MIT license
559.
 * http://jquery.org/license
560.
 *
561.
 * Date: 2014-01-13
562.
 */
563.
(function( window ) {
564.
 
565.
var i,
566.
  support,
567.
  Expr,
568.
  getText,
569.
  isXML,
570.
  compile,
571.
  outermostContext,
572.
  sortInput,
573.
  hasDuplicate,
574.
 
575.
  // Local document vars
576.
  setDocument,
577.
  document,
578.
  docElem,
579.
  documentIsHTML,
580.
  rbuggyQSA,
581.
  rbuggyMatches,
582.
  matches,
583.
  contains,
584.
 
585.
  // Instance-specific data
586.
  expando = "sizzle" + -(new Date()),
587.
  preferredDoc = window.document,
588.
  dirruns = 0,
589.
  done = 0,
590.
  classCache = createCache(),
591.
  tokenCache = createCache(),
592.
  compilerCache = createCache(),
593.
  sortOrder = function( a, b ) {
594.
    if ( a === b ) {
595.
      hasDuplicate = true;
596.
    }
597.
    return 0;
598.
  },
599.
 
600.
  // General-purpose constants
601.
  strundefined = typeof undefined,
602.
  MAX_NEGATIVE = 1 << 31,
603.
 
604.
  // Instance methods
605.
  hasOwn = ({}).hasOwnProperty,
606.
  arr = [],
607.
  pop = arr.pop,
608.
  push_native = arr.push,
609.
  push = arr.push,
610.
  slice = arr.slice,
611.
  // Use a stripped-down indexOf if we can't use a native one
612.
  indexOf = arr.indexOf || function( elem ) {
613.
    var i = 0,
614.
      len = this.length;
615.
    for ( ; i < len; i++ ) {
616.
      if ( this[i] === elem ) {
617.
        return i;
618.
      }
619.
    }
620.
    return -1;
621.
  },
622.
 
623.
  booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
624.
 
625.
  // Regular expressions
626.
 
627.
  // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
628.
  whitespace = "[\\x20\\t\\r\\n\\f]",
629.
  // http://www.w3.org/TR/css3-syntax/#characters
630.
  characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
631.
 
632.
  // Loosely modeled on CSS identifier characters
633.
  // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
634.
  // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
635.
  identifier = characterEncoding.replace( "w", "w#" ),
636.
 
637.
  // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
638.
  attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
639.
    "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
640.
 
641.
  // Prefer arguments quoted,
642.
  //   then not containing pseudos/brackets,
643.
  //   then attribute selectors/non-parenthetical expressions,
644.
  //   then anything else
645.
  // These preferences are here to reduce the number of selectors
646.
  //   needing tokenize in the PSEUDO preFilter
647.
  pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
648.
 
649.
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
650.
  rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
651.
 
652.
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
653.
  rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
654.
 
655.
  rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
656.
 
657.
  rpseudo = new RegExp( pseudos ),
658.
  ridentifier = new RegExp( "^" + identifier + "$" ),
659.
 
660.
  matchExpr = {
661.
    "ID": new RegExp( "^#(" + characterEncoding + ")" ),
662.
    "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
663.
    "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
664.
    "ATTR": new RegExp( "^" + attributes ),
665.
    "PSEUDO": new RegExp( "^" + pseudos ),
666.
    "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
667.
      "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
668.
      "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
669.
    "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
670.
    // For use in libraries implementing .is()
671.
    // We use this for POS matching in `select`
672.
    "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
673.
      whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
674.
  },
675.
 
676.
  rinputs = /^(?:input|select|textarea|button)$/i,
677.
  rheader = /^h\d$/i,
678.
 
679.
  rnative = /^[^{]+\{\s*\[native \w/,
680.
 
681.
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
682.
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
683.
 
684.
  rsibling = /[+~]/,
685.
  rescape = /'|\\/g,
686.
 
687.
  // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
688.
  runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
689.
  funescape = function( _, escaped, escapedWhitespace ) {
690.
    var high = "0x" + escaped - 0x10000;
691.
    // NaN means non-codepoint
692.
    // Support: Firefox
693.
    // Workaround erroneous numeric interpretation of +"0x"
694.
    return high !== high || escapedWhitespace ?
695.
      escaped :
696.
      high < 0 ?
697.
        // BMP codepoint
698.
        String.fromCharCode( high + 0x10000 ) :
699.
        // Supplemental Plane codepoint (surrogate pair)
700.
        String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
701.
  };
702.
 
703.
// Optimize for push.apply( _, NodeList )
704.
try {
705.
  push.apply(
706.
    (arr = slice.call( preferredDoc.childNodes )),
707.
    preferredDoc.childNodes
708.
  );
709.
  // Support: Android<4.0
710.
  // Detect silently failing push.apply
711.
  arr[ preferredDoc.childNodes.length ].nodeType;
712.
} catch ( e ) {
713.
  push = { apply: arr.length ?
714.
 
715.
    // Leverage slice if possible
716.
    function( target, els ) {
717.
      push_native.apply( target, slice.call(els) );
718.
    } :
719.
 
720.
    // Support: IE<9
721.
    // Otherwise append directly
722.
    function( target, els ) {
723.
      var j = target.length,
724.
        i = 0;
725.
      // Can't trust NodeList.length
726.
      while ( (target[j++] = els[i++]) ) {}
727.
      target.length = j - 1;
728.
    }
729.
  };
730.
}
731.
 
732.
function Sizzle( selector, context, results, seed ) {
733.
  var match, elem, m, nodeType,
734.
    // QSA vars
735.
    i, groups, old, nid, newContext, newSelector;
736.
 
737.
  if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
738.
    setDocument( context );
739.
  }
740.
 
741.
  context = context || document;
742.
  results = results || [];
743.
 
744.
  if ( !selector || typeof selector !== "string" ) {
745.
    return results;
746.
  }
747.
 
748.
  if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
749.
    return [];
750.
  }
751.
 
752.
  if ( documentIsHTML && !seed ) {
753.
 
754.
    // Shortcuts
755.
    if ( (match = rquickExpr.exec( selector )) ) {
756.
      // Speed-up: Sizzle("#ID")
757.
      if ( (m = match[1]) ) {
758.
        if ( nodeType === 9 ) {
759.
          elem = context.getElementById( m );
760.
          // Check parentNode to catch when Blackberry 4.6 returns
761.
          // nodes that are no longer in the document (jQuery #6963)
762.
          if ( elem && elem.parentNode ) {
763.
            // Handle the case where IE, Opera, and Webkit return items
764.
            // by name instead of ID
765.
            if ( elem.id === m ) {
766.
              results.push( elem );
767.
              return results;
768.
            }
769.
          } else {
770.
            return results;
771.
          }
772.
        } else {
773.
          // Context is not a document
774.
          if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
775.
            contains( context, elem ) && elem.id === m ) {
776.
            results.push( elem );
777.
            return results;
778.
          }
779.
        }
780.
 
781.
      // Speed-up: Sizzle("TAG")
782.
      } else if ( match[2] ) {
783.
        push.apply( results, context.getElementsByTagName( selector ) );
784.
        return results;
785.
 
786.
      // Speed-up: Sizzle(".CLASS")
787.
      } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
788.
        push.apply( results, context.getElementsByClassName( m ) );
789.
        return results;
790.
      }
791.
    }
792.
 
793.
    // QSA path
794.
    if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
795.
      nid = old = expando;
796.
      newContext = context;
797.
      newSelector = nodeType === 9 && selector;
798.
 
799.
      // qSA works strangely on Element-rooted queries
800.
      // We can work around this by specifying an extra ID on the root
801.
      // and working up from there (Thanks to Andrew Dupont for the technique)
802.
      // IE 8 doesn't work on object elements
803.
      if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
804.
        groups = tokenize( selector );
805.
 
806.
        if ( (old = context.getAttribute("id")) ) {
807.
          nid = old.replace( rescape, "\\$&" );
808.
        } else {
809.
          context.setAttribute( "id", nid );
810.
        }
811.
        nid = "[id='" + nid + "'] ";
812.
 
813.
        i = groups.length;
814.
        while ( i-- ) {
815.
          groups[i] = nid + toSelector( groups[i] );
816.
        }
817.
        newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
818.
        newSelector = groups.join(",");
819.
      }
820.
 
821.
      if ( newSelector ) {
822.
        try {
823.
          push.apply( results,
824.
            newContext.querySelectorAll( newSelector )
825.
          );
826.
          return results;
827.
        } catch(qsaError) {
828.
        } finally {
829.
          if ( !old ) {
830.
            context.removeAttribute("id");
831.
          }
832.
        }
833.
      }
834.
    }
835.
  }
836.
 
837.
  // All others
838.
  return select( selector.replace( rtrim, "$1" ), context, results, seed );
839.
}
840.
 
841.
/**
842.
 * Create key-value caches of limited size
843.
 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
844.
 *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
845.
 *  deleting the oldest entry
846.
 */
847.
function createCache() {
848.
  var keys = [];
849.
 
850.
  function cache( key, value ) {
851.
    // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
852.
    if ( keys.push( key + " " ) > Expr.cacheLength ) {
853.
      // Only keep the most recent entries
854.
      delete cache[ keys.shift() ];
855.
    }
856.
    return (cache[ key + " " ] = value);
857.
  }
858.
  return cache;
859.
}
860.
 
861.
/**
862.
 * Mark a function for special use by Sizzle
863.
 * @param {Function} fn The function to mark
864.
 */
865.
function markFunction( fn ) {
866.
  fn[ expando ] = true;
867.
  return fn;
868.
}
869.
 
870.
/**
871.
 * Support testing using an element
872.
 * @param {Function} fn Passed the created div and expects a boolean result
873.
 */
874.
function assert( fn ) {
875.
  var div = document.createElement("div");
876.
 
877.
  try {
878.
    return !!fn( div );
879.
  } catch (e) {
880.
    return false;
881.
  } finally {
882.
    // Remove from its parent by default
883.
    if ( div.parentNode ) {
884.
      div.parentNode.removeChild( div );
885.
    }
886.
    // release memory in IE
887.
    div = null;
888.
  }
889.
}
890.
 
891.
/**
892.
 * Adds the same handler for all of the specified attrs
893.
 * @param {String} attrs Pipe-separated list of attributes
894.
 * @param {Function} handler The method that will be applied
895.
 */
896.
function addHandle( attrs, handler ) {
897.
  var arr = attrs.split("|"),
898.
    i = attrs.length;
899.
 
900.
  while ( i-- ) {
901.
    Expr.attrHandle[ arr[i] ] = handler;
902.
  }
903.
}
904.
 
905.
/**
906.
 * Checks document order of two siblings
907.
 * @param {Element} a
908.
 * @param {Element} b
909.
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
910.
 */
911.
function siblingCheck( a, b ) {
912.
  var cur = b && a,
913.
    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
914.
      ( ~b.sourceIndex || MAX_NEGATIVE ) -
915.
      ( ~a.sourceIndex || MAX_NEGATIVE );
916.
 
917.
  // Use IE sourceIndex if available on both nodes
918.
  if ( diff ) {
919.
    return diff;
920.
  }
921.
 
922.
  // Check if b follows a
923.
  if ( cur ) {
924.
    while ( (cur = cur.nextSibling) ) {
925.
      if ( cur === b ) {
926.
        return -1;
927.
      }
928.
    }
929.
  }
930.
 
931.
  return a ? 1 : -1;
932.
}
933.
 
934.
/**
935.
 * Returns a function to use in pseudos for input types
936.
 * @param {String} type
937.
 */
938.
function createInputPseudo( type ) {
939.
  return function( elem ) {
940.
    var name = elem.nodeName.toLowerCase();
941.
    return name === "input" && elem.type === type;
942.
  };
943.
}
944.
 
945.
/**
946.
 * Returns a function to use in pseudos for buttons
947.
 * @param {String} type
948.
 */
949.
function createButtonPseudo( type ) {
950.
  return function( elem ) {
951.
    var name = elem.nodeName.toLowerCase();
952.
    return (name === "input" || name === "button") && elem.type === type;
953.
  };
954.
}
955.
 
956.
/**
957.
 * Returns a function to use in pseudos for positionals
958.
 * @param {Function} fn
959.
 */
960.
function createPositionalPseudo( fn ) {
961.
  return markFunction(function( argument ) {
962.
    argument = +argument;
963.
    return markFunction(function( seed, matches ) {
964.
      var j,
965.
        matchIndexes = fn( [], seed.length, argument ),
966.
        i = matchIndexes.length;
967.
 
968.
      // Match elements found at the specified indexes
969.
      while ( i-- ) {
970.
        if ( seed[ (j = matchIndexes[i]) ] ) {
971.
          seed[j] = !(matches[j] = seed[j]);
972.
        }
973.
      }
974.
    });
975.
  });
976.
}
977.
 
978.
/**
979.
 * Checks a node for validity as a Sizzle context
980.
 * @param {Element|Object=} context
981.
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
982.
 */
983.
function testContext( context ) {
984.
  return context && typeof context.getElementsByTagName !== strundefined && context;
985.
}
986.
 
987.
// Expose support vars for convenience
988.
support = Sizzle.support = {};
989.
 
990.
/**
991.
 * Detects XML nodes
992.
 * @param {Element|Object} elem An element or a document
993.
 * @returns {Boolean} True iff elem is a non-HTML XML node
994.
 */
995.
isXML = Sizzle.isXML = function( elem ) {
996.
  // documentElement is verified for cases where it doesn't yet exist
997.
  // (such as loading iframes in IE - #4833)
998.
  var documentElement = elem && (elem.ownerDocument || elem).documentElement;
999.
  return documentElement ? documentElement.nodeName !== "HTML" : false;
1000.
};
1001.
 
1002.
/**
1003.
 * Sets document-related variables once based on the current document
1004.
 * @param {Element|Object} [doc] An element or document object to use to set the document
1005.
 * @returns {Object} Returns the current document
1006.
 */
1007.
setDocument = Sizzle.setDocument = function( node ) {
1008.
  var hasCompare,
1009.
    doc = node ? node.ownerDocument || node : preferredDoc,
1010.
    parent = doc.defaultView;
1011.
 
1012.
  // If no document and documentElement is available, return
1013.
  if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1014.
    return document;
1015.
  }
1016.
 
1017.
  // Set our document
1018.
  document = doc;
1019.
  docElem = doc.documentElement;
1020.
 
1021.
  // Support tests
1022.
  documentIsHTML = !isXML( doc );
1023.
 
1024.
  // Support: IE>8
1025.
  // If iframe document is assigned to "document" variable and if iframe has been reloaded,
1026.
  // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1027.
  // IE6-8 do not support the defaultView property so parent will be undefined
1028.
  if ( parent && parent !== parent.top ) {
1029.
    // IE11 does not have attachEvent, so all must suffer
1030.
    if ( parent.addEventListener ) {
1031.
      parent.addEventListener( "unload", function() {
1032.
        setDocument();
1033.
      }, false );
1034.
    } else if ( parent.attachEvent ) {
1035.
      parent.attachEvent( "onunload", function() {
1036.
        setDocument();
1037.
      });
1038.
    }
1039.
  }
1040.
 
1041.
  /* Attributes
1042.
  ---------------------------------------------------------------------- */
1043.
 
1044.
  // Support: IE<8
1045.
  // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
1046.
  support.attributes = assert(function( div ) {
1047.
    div.className = "i";
1048.
    return !div.getAttribute("className");
1049.
  });
1050.
 
1051.
  /* getElement(s)By*
1052.
  ---------------------------------------------------------------------- */
1053.
 
1054.
  // Check if getElementsByTagName("*") returns only elements
1055.
  support.getElementsByTagName = assert(function( div ) {
1056.
    div.appendChild( doc.createComment("") );
1057.
    return !div.getElementsByTagName("*").length;
1058.
  });
1059.
 
1060.
  // Check if getElementsByClassName can be trusted
1061.
  support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
1062.
    div.innerHTML = "<div class='a'></div><div class='a i'></div>";
1063.
 
1064.
    // Support: Safari<4
1065.
    // Catch class over-caching
1066.
    div.firstChild.className = "i";
1067.
    // Support: Opera<10
1068.
    // Catch gEBCN failure to find non-leading classes
1069.
    return div.getElementsByClassName("i").length === 2;
1070.
  });
1071.
 
1072.
  // Support: IE<10
1073.
  // Check if getElementById returns elements by name
1074.
  // The broken getElementById methods don't pick up programatically-set names,
1075.
  // so use a roundabout getElementsByName test
1076.
  support.getById = assert(function( div ) {
1077.
    docElem.appendChild( div ).id = expando;
1078.
    return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1079.
  });
1080.
 
1081.
  // ID find and filter
1082.
  if ( support.getById ) {
1083.
    Expr.find["ID"] = function( id, context ) {
1084.
      if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
1085.
        var m = context.getElementById( id );
1086.
        // Check parentNode to catch when Blackberry 4.6 returns
1087.
        // nodes that are no longer in the document #6963
1088.
        return m && m.parentNode ? [m] : [];
1089.
      }
1090.
    };
1091.
    Expr.filter["ID"] = function( id ) {
1092.
      var attrId = id.replace( runescape, funescape );
1093.
      return function( elem ) {
1094.
        return elem.getAttribute("id") === attrId;
1095.
      };
1096.
    };
1097.
  } else {
1098.
    // Support: IE6/7
1099.
    // getElementById is not reliable as a find shortcut
1100.
    delete Expr.find["ID"];
1101.
 
1102.
    Expr.filter["ID"] =  function( id ) {
1103.
      var attrId = id.replace( runescape, funescape );
1104.
      return function( elem ) {
1105.
        var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
1106.
        return node && node.value === attrId;
1107.
      };
1108.
    };
1109.
  }
1110.
 
1111.
  // Tag
1112.
  Expr.find["TAG"] = support.getElementsByTagName ?
1113.
    function( tag, context ) {
1114.
      if ( typeof context.getElementsByTagName !== strundefined ) {
1115.
        return context.getElementsByTagName( tag );
1116.
      }
1117.
    } :
1118.
    function( tag, context ) {
1119.
      var elem,
1120.
        tmp = [],
1121.
        i = 0,
1122.
        results = context.getElementsByTagName( tag );
1123.
 
1124.
      // Filter out possible comments
1125.
      if ( tag === "*" ) {
1126.
        while ( (elem = results[i++]) ) {
1127.
          if ( elem.nodeType === 1 ) {
1128.
            tmp.push( elem );
1129.
          }
1130.
        }
1131.
 
1132.
        return tmp;
1133.
      }
1134.
      return results;
1135.
    };
1136.
 
1137.
  // Class
1138.
  Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1139.
    if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
1140.
      return context.getElementsByClassName( className );
1141.
    }
1142.
  };
1143.
 
1144.
  /* QSA/matchesSelector
1145.
  ---------------------------------------------------------------------- */
1146.
 
1147.
  // QSA and matchesSelector support
1148.
 
1149.
  // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1150.
  rbuggyMatches = [];
1151.
 
1152.
  // qSa(:focus) reports false when true (Chrome 21)
1153.
  // We allow this because of a bug in IE8/9 that throws an error
1154.
  // whenever `document.activeElement` is accessed on an iframe
1155.
  // So, we allow :focus to pass through QSA all the time to avoid the IE error
1156.
  // See http://bugs.jquery.com/ticket/13378
1157.
  rbuggyQSA = [];
1158.
 
1159.
  if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1160.
    // Build QSA regex
1161.
    // Regex strategy adopted from Diego Perini
1162.
    assert(function( div ) {
1163.
      // Select is set to empty string on purpose
1164.
      // This is to test IE's treatment of not explicitly
1165.
      // setting a boolean content attribute,
1166.
      // since its presence should be enough
1167.
      // http://bugs.jquery.com/ticket/12359
1168.
      div.innerHTML = "<select t=''><option selected=''></option></select>";
1169.
 
1170.
      // Support: IE8, Opera 10-12
1171.
      // Nothing should be selected when empty strings follow ^= or $= or *=
1172.
      if ( div.querySelectorAll("[t^='']").length ) {
1173.
        rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1174.
      }
1175.
 
1176.
      // Support: IE8
1177.
      // Boolean attributes and "value" are not treated correctly
1178.
      if ( !div.querySelectorAll("[selected]").length ) {
1179.
        rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1180.
      }
1181.
 
1182.
      // Webkit/Opera - :checked should return selected option elements
1183.
      // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1184.
      // IE8 throws error here and will not see later tests
1185.
      if ( !div.querySelectorAll(":checked").length ) {
1186.
        rbuggyQSA.push(":checked");
1187.
      }
1188.
    });
1189.
 
1190.
    assert(function( div ) {
1191.
      // Support: Windows 8 Native Apps
1192.
      // The type and name attributes are restricted during .innerHTML assignment
1193.
      var input = doc.createElement("input");
1194.
      input.setAttribute( "type", "hidden" );
1195.
      div.appendChild( input ).setAttribute( "name", "D" );
1196.
 
1197.
      // Support: IE8
1198.
      // Enforce case-sensitivity of name attribute
1199.
      if ( div.querySelectorAll("[name=d]").length ) {
1200.
        rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1201.
      }
1202.
 
1203.
      // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1204.
      // IE8 throws error here and will not see later tests
1205.
      if ( !div.querySelectorAll(":enabled").length ) {
1206.
        rbuggyQSA.push( ":enabled", ":disabled" );
1207.
      }
1208.
 
1209.
      // Opera 10-11 does not throw on post-comma invalid pseudos
1210.
      div.querySelectorAll("*,:x");
1211.
      rbuggyQSA.push(",.*:");
1212.
    });
1213.
  }
1214.
 
1215.
  if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
1216.
    docElem.mozMatchesSelector ||
1217.
    docElem.oMatchesSelector ||
1218.
    docElem.msMatchesSelector) )) ) {
1219.
 
1220.
    assert(function( div ) {
1221.
      // Check to see if it's possible to do matchesSelector
1222.
      // on a disconnected node (IE 9)
1223.
      support.disconnectedMatch = matches.call( div, "div" );
1224.
 
1225.
      // This should fail with an exception
1226.
      // Gecko does not error, returns false instead
1227.
      matches.call( div, "[s!='']:x" );
1228.
      rbuggyMatches.push( "!=", pseudos );
1229.
    });
1230.
  }
1231.
 
1232.
  rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1233.
  rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1234.
 
1235.
  /* Contains
1236.
  ---------------------------------------------------------------------- */
1237.
  hasCompare = rnative.test( docElem.compareDocumentPosition );
1238.
 
1239.
  // Element contains another
1240.
  // Purposefully does not implement inclusive descendent
1241.
  // As in, an element does not contain itself
1242.
  contains = hasCompare || rnative.test( docElem.contains ) ?
1243.
    function( a, b ) {
1244.
      var adown = a.nodeType === 9 ? a.documentElement : a,
1245.
        bup = b && b.parentNode;
1246.
      return a === bup || !!( bup && bup.nodeType === 1 && (
1247.
        adown.contains ?
1248.
          adown.contains( bup ) :
1249.
          a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1250.
      ));
1251.
    } :
1252.
    function( a, b ) {
1253.
      if ( b ) {
1254.
        while ( (b = b.parentNode) ) {
1255.
          if ( b === a ) {
1256.
            return true;
1257.
          }
1258.
        }
1259.
      }
1260.
      return false;
1261.
    };
1262.
 
1263.
  /* Sorting
1264.
  ---------------------------------------------------------------------- */
1265.
 
1266.
  // Document order sorting
1267.
  sortOrder = hasCompare ?
1268.
  function( a, b ) {
1269.
 
1270.
    // Flag for duplicate removal
1271.
    if ( a === b ) {
1272.
      hasDuplicate = true;
1273.
      return 0;
1274.
    }
1275.
 
1276.
    // Sort on method existence if only one input has compareDocumentPosition
1277.
    var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1278.
    if ( compare ) {
1279.
      return compare;
1280.
    }
1281.
 
1282.
    // Calculate position if both inputs belong to the same document
1283.
    compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1284.
      a.compareDocumentPosition( b ) :
1285.
 
1286.
      // Otherwise we know they are disconnected
1287.
      1;
1288.
 
1289.
    // Disconnected nodes
1290.
    if ( compare & 1 ||
1291.
      (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1292.
 
1293.
      // Choose the first element that is related to our preferred document
1294.
      if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1295.
        return -1;
1296.
      }
1297.
      if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1298.
        return 1;
1299.
      }
1300.
 
1301.
      // Maintain original order
1302.
      return sortInput ?
1303.
        ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1304.
        0;
1305.
    }
1306.
 
1307.
    return compare & 4 ? -1 : 1;
1308.
  } :
1309.
  function( a, b ) {
1310.
    // Exit early if the nodes are identical
1311.
    if ( a === b ) {
1312.
      hasDuplicate = true;
1313.
      return 0;
1314.
    }
1315.
 
1316.
    var cur,
1317.
      i = 0,
1318.
      aup = a.parentNode,
1319.
      bup = b.parentNode,
1320.
      ap = [ a ],
1321.
      bp = [ b ];
1322.
 
1323.
    // Parentless nodes are either documents or disconnected
1324.
    if ( !aup || !bup ) {
1325.
      return a === doc ? -1 :
1326.
        b === doc ? 1 :
1327.
        aup ? -1 :
1328.
        bup ? 1 :
1329.
        sortInput ?
1330.
        ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1331.
        0;
1332.
 
1333.
    // If the nodes are siblings, we can do a quick check
1334.
    } else if ( aup === bup ) {
1335.
      return siblingCheck( a, b );
1336.
    }
1337.
 
1338.
    // Otherwise we need full lists of their ancestors for comparison
1339.
    cur = a;
1340.
    while ( (cur = cur.parentNode) ) {
1341.
      ap.unshift( cur );
1342.
    }
1343.
    cur = b;
1344.
    while ( (cur = cur.parentNode) ) {
1345.
      bp.unshift( cur );
1346.
    }
1347.
 
1348.
    // Walk down the tree looking for a discrepancy
1349.
    while ( ap[i] === bp[i] ) {
1350.
      i++;
1351.
    }
1352.
 
1353.
    return i ?
1354.
      // Do a sibling check if the nodes have a common ancestor
1355.
      siblingCheck( ap[i], bp[i] ) :
1356.
 
1357.
      // Otherwise nodes in our document sort first
1358.
      ap[i] === preferredDoc ? -1 :
1359.
      bp[i] === preferredDoc ? 1 :
1360.
      0;
1361.
  };
1362.
 
1363.
  return doc;
1364.
};
1365.
 
1366.
Sizzle.matches = function( expr, elements ) {
1367.
  return Sizzle( expr, null, null, elements );
1368.
};
1369.
 
1370.
Sizzle.matchesSelector = function( elem, expr ) {
1371.
  // Set document vars if needed
1372.
  if ( ( elem.ownerDocument || elem ) !== document ) {
1373.
    setDocument( elem );
1374.
  }
1375.
 
1376.
  // Make sure that attribute selectors are quoted
1377.
  expr = expr.replace( rattributeQuotes, "='$1']" );
1378.
 
1379.
  if ( support.matchesSelector && documentIsHTML &&
1380.
    ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1381.
    ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1382.
 
1383.
    try {
1384.
      var ret = matches.call( elem, expr );
1385.
 
1386.
      // IE 9's matchesSelector returns false on disconnected nodes
1387.
      if ( ret || support.disconnectedMatch ||
1388.
          // As well, disconnected nodes are said to be in a document
1389.
          // fragment in IE 9
1390.
          elem.document && elem.document.nodeType !== 11 ) {
1391.
        return ret;
1392.
      }
1393.
    } catch(e) {}
1394.
  }
1395.
 
1396.
  return Sizzle( expr, document, null, [elem] ).length > 0;
1397.
};
1398.
 
1399.
Sizzle.contains = function( context, elem ) {
1400.
  // Set document vars if needed
1401.
  if ( ( context.ownerDocument || context ) !== document ) {
1402.
    setDocument( context );
1403.
  }
1404.
  return contains( context, elem );
1405.
};
1406.
 
1407.
Sizzle.attr = function( elem, name ) {
1408.
  // Set document vars if needed
1409.
  if ( ( elem.ownerDocument || elem ) !== document ) {
1410.
    setDocument( elem );
1411.
  }
1412.
 
1413.
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1414.
    // Don't get fooled by Object.prototype properties (jQuery #13807)
1415.
    val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1416.
      fn( elem, name, !documentIsHTML ) :
1417.
      undefined;
1418.
 
1419.
  return val !== undefined ?
1420.
    val :
1421.
    support.attributes || !documentIsHTML ?
1422.
      elem.getAttribute( name ) :
1423.
      (val = elem.getAttributeNode(name)) && val.specified ?
1424.
        val.value :
1425.
        null;
1426.
};
1427.
 
1428.
Sizzle.error = function( msg ) {
1429.
  throw new Error( "Syntax error, unrecognized expression: " + msg );
1430.
};
1431.
 
1432.
/**
1433.
 * Document sorting and removing duplicates
1434.
 * @param {ArrayLike} results
1435.
 */
1436.
Sizzle.uniqueSort = function( results ) {
1437.
  var elem,
1438.
    duplicates = [],
1439.
    j = 0,
1440.
    i = 0;
1441.
 
1442.
  // Unless we *know* we can detect duplicates, assume their presence
1443.
  hasDuplicate = !support.detectDuplicates;
1444.
  sortInput = !support.sortStable && results.slice( 0 );
1445.
  results.sort( sortOrder );
1446.
 
1447.
  if ( hasDuplicate ) {
1448.
    while ( (elem = results[i++]) ) {
1449.
      if ( elem === results[ i ] ) {
1450.
        j = duplicates.push( i );
1451.
      }
1452.
    }
1453.
    while ( j-- ) {
1454.
      results.splice( duplicates[ j ], 1 );
1455.
    }
1456.
  }
1457.
 
1458.
  // Clear input after sorting to release objects
1459.
  // See https://github.com/jquery/sizzle/pull/225
1460.
  sortInput = null;
1461.
 
1462.
  return results;
1463.
};
1464.
 
1465.
/**
1466.
 * Utility function for retrieving the text value of an array of DOM nodes
1467.
 * @param {Array|Element} elem
1468.
 */
1469.
getText = Sizzle.getText = function( elem ) {
1470.
  var node,
1471.
    ret = "",
1472.
    i = 0,
1473.
    nodeType = elem.nodeType;
1474.
 
1475.
  if ( !nodeType ) {
1476.
    // If no nodeType, this is expected to be an array
1477.
    while ( (node = elem[i++]) ) {
1478.
      // Do not traverse comment nodes
1479.
      ret += getText( node );
1480.
    }
1481.
  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1482.
    // Use textContent for elements
1483.
    // innerText usage removed for consistency of new lines (jQuery #11153)
1484.
    if ( typeof elem.textContent === "string" ) {
1485.
      return elem.textContent;
1486.
    } else {
1487.
      // Traverse its children
1488.
      for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1489.
        ret += getText( elem );
1490.
      }
1491.
    }
1492.
  } else if ( nodeType === 3 || nodeType === 4 ) {
1493.
    return elem.nodeValue;
1494.
  }
1495.
  // Do not include comment or processing instruction nodes
1496.
 
1497.
  return ret;
1498.
};
1499.
 
1500.
Expr = Sizzle.selectors = {
1501.
 
1502.
  // Can be adjusted by the user
1503.
  cacheLength: 50,
1504.
 
1505.
  createPseudo: markFunction,
1506.
 
1507.
  match: matchExpr,
1508.
 
1509.
  attrHandle: {},
1510.
 
1511.
  find: {},
1512.
 
1513.
  relative: {
1514.
    ">": { dir: "parentNode", first: true },
1515.
    " ": { dir: "parentNode" },
1516.
    "+": { dir: "previousSibling", first: true },
1517.
    "~": { dir: "previousSibling" }
1518.
  },
1519.
 
1520.
  preFilter: {
1521.
    "ATTR": function( match ) {
1522.
      match[1] = match[1].replace( runescape, funescape );
1523.
 
1524.
      // Move the given value to match[3] whether quoted or unquoted
1525.
      match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
1526.
 
1527.
      if ( match[2] === "~=" ) {
1528.
        match[3] = " " + match[3] + " ";
1529.
      }
1530.
 
1531.
      return match.slice( 0, 4 );
1532.
    },
1533.
 
1534.
    "CHILD": function( match ) {
1535.
      /* matches from matchExpr["CHILD"]
1536.
        1 type (only|nth|...)
1537.
        2 what (child|of-type)
1538.
        3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1539.
        4 xn-component of xn+y argument ([+-]?\d*n|)
1540.
        5 sign of xn-component
1541.
        6 x of xn-component
1542.
        7 sign of y-component
1543.
        8 y of y-component
1544.
      */
1545.
      match[1] = match[1].toLowerCase();
1546.
 
1547.
      if ( match[1].slice( 0, 3 ) === "nth" ) {
1548.
        // nth-* requires argument
1549.
        if ( !match[3] ) {
1550.
          Sizzle.error( match[0] );
1551.
        }
1552.
 
1553.
        // numeric x and y parameters for Expr.filter.CHILD
1554.
        // remember that false/true cast respectively to 0/1
1555.
        match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1556.
        match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1557.
 
1558.
      // other types prohibit arguments
1559.
      } else if ( match[3] ) {
1560.
        Sizzle.error( match[0] );
1561.
      }
1562.
 
1563.
      return match;
1564.
    },
1565.
 
1566.
    "PSEUDO": function( match ) {
1567.
      var excess,
1568.
        unquoted = !match[5] && match[2];
1569.
 
1570.
      if ( matchExpr["CHILD"].test( match[0] ) ) {
1571.
        return null;
1572.
      }
1573.
 
1574.
      // Accept quoted arguments as-is
1575.
      if ( match[3] && match[4] !== undefined ) {
1576.
        match[2] = match[4];
1577.
 
1578.
      // Strip excess characters from unquoted arguments
1579.
      } else if ( unquoted && rpseudo.test( unquoted ) &&
1580.
        // Get excess from tokenize (recursively)
1581.
        (excess = tokenize( unquoted, true )) &&
1582.
        // advance to the next closing parenthesis
1583.
        (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1584.
 
1585.
        // excess is a negative index
1586.
        match[0] = match[0].slice( 0, excess );
1587.
        match[2] = unquoted.slice( 0, excess );
1588.
      }
1589.
 
1590.
      // Return only captures needed by the pseudo filter method (type and argument)
1591.
      return match.slice( 0, 3 );
1592.
    }
1593.
  },
1594.
 
1595.
  filter: {
1596.
 
1597.
    "TAG": function( nodeNameSelector ) {
1598.
      var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1599.
      return nodeNameSelector === "*" ?
1600.
        function() { return true; } :
1601.
        function( elem ) {
1602.
          return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1603.
        };
1604.
    },
1605.
 
1606.
    "CLASS": function( className ) {
1607.
      var pattern = classCache[ className + " " ];
1608.
 
1609.
      return pattern ||
1610.
        (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1611.
        classCache( className, function( elem ) {
1612.
          return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
1613.
        });
1614.
    },
1615.
 
1616.
    "ATTR": function( name, operator, check ) {
1617.
      return function( elem ) {
1618.
        var result = Sizzle.attr( elem, name );
1619.
 
1620.
        if ( result == null ) {
1621.
          return operator === "!=";
1622.
        }
1623.
        if ( !operator ) {
1624.
          return true;
1625.
        }
1626.
 
1627.
        result += "";
1628.
 
1629.
        return operator === "=" ? result === check :
1630.
          operator === "!=" ? result !== check :
1631.
          operator === "^=" ? check && result.indexOf( check ) === 0 :
1632.
          operator === "*=" ? check && result.indexOf( check ) > -1 :
1633.
          operator === "$=" ? check && result.slice( -check.length ) === check :
1634.
          operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
1635.
          operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1636.
          false;
1637.
      };
1638.
    },
1639.
 
1640.
    "CHILD": function( type, what, argument, first, last ) {
1641.
      var simple = type.slice( 0, 3 ) !== "nth",
1642.
        forward = type.slice( -4 ) !== "last",
1643.
        ofType = what === "of-type";
1644.
 
1645.
      return first === 1 && last === 0 ?
1646.
 
1647.
        // Shortcut for :nth-*(n)
1648.
        function( elem ) {
1649.
          return !!elem.parentNode;
1650.
        } :
1651.
 
1652.
        function( elem, context, xml ) {
1653.
          var cache, outerCache, node, diff, nodeIndex, start,
1654.
            dir = simple !== forward ? "nextSibling" : "previousSibling",
1655.
            parent = elem.parentNode,
1656.
            name = ofType && elem.nodeName.toLowerCase(),
1657.
            useCache = !xml && !ofType;
1658.
 
1659.
          if ( parent ) {
1660.
 
1661.
            // :(first|last|only)-(child|of-type)
1662.
            if ( simple ) {
1663.
              while ( dir ) {
1664.
                node = elem;
1665.
                while ( (node = node[ dir ]) ) {
1666.
                  if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
1667.
                    return false;
1668.
                  }
1669.
                }
1670.
                // Reverse direction for :only-* (if we haven't yet done so)
1671.
                start = dir = type === "only" && !start && "nextSibling";
1672.
              }
1673.
              return true;
1674.
            }
1675.
 
1676.
            start = [ forward ? parent.firstChild : parent.lastChild ];
1677.
 
1678.
            // non-xml :nth-child(...) stores cache data on `parent`
1679.
            if ( forward && useCache ) {
1680.
              // Seek `elem` from a previously-cached index
1681.
              outerCache = parent[ expando ] || (parent[ expando ] = {});
1682.
              cache = outerCache[ type ] || [];
1683.
              nodeIndex = cache[0] === dirruns && cache[1];
1684.
              diff = cache[0] === dirruns && cache[2];
1685.
              node = nodeIndex && parent.childNodes[ nodeIndex ];
1686.
 
1687.
              while ( (node = ++nodeIndex && node && node[ dir ] ||
1688.
 
1689.
                // Fallback to seeking `elem` from the start
1690.
                (diff = nodeIndex = 0) || start.pop()) ) {
1691.
 
1692.
                // When found, cache indexes on `parent` and break
1693.
                if ( node.nodeType === 1 && ++diff && node === elem ) {
1694.
                  outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1695.
                  break;
1696.
                }
1697.
              }
1698.
 
1699.
            // Use previously-cached element index if available
1700.
            } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
1701.
              diff = cache[1];
1702.
 
1703.
            // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
1704.
            } else {
1705.
              // Use the same loop as above to seek `elem` from the start
1706.
              while ( (node = ++nodeIndex && node && node[ dir ] ||
1707.
                (diff = nodeIndex = 0) || start.pop()) ) {
1708.
 
1709.
                if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
1710.
                  // Cache the index of each encountered element
1711.
                  if ( useCache ) {
1712.
                    (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
1713.
                  }
1714.
 
1715.
                  if ( node === elem ) {
1716.
                    break;
1717.
                  }
1718.
                }
1719.
              }
1720.
            }
1721.
 
1722.
            // Incorporate the offset, then check against cycle size
1723.
            diff -= last;
1724.
            return diff === first || ( diff % first === 0 && diff / first >= 0 );
1725.
          }
1726.
        };
1727.
    },
1728.
 
1729.
    "PSEUDO": function( pseudo, argument ) {
1730.
      // pseudo-class names are case-insensitive
1731.
      // http://www.w3.org/TR/selectors/#pseudo-classes
1732.
      // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1733.
      // Remember that setFilters inherits from pseudos
1734.
      var args,
1735.
        fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1736.
          Sizzle.error( "unsupported pseudo: " + pseudo );
1737.
 
1738.
      // The user may use createPseudo to indicate that
1739.
      // arguments are needed to create the filter function
1740.
      // just as Sizzle does
1741.
      if ( fn[ expando ] ) {
1742.
        return fn( argument );
1743.
      }
1744.
 
1745.
      // But maintain support for old signatures
1746.
      if ( fn.length > 1 ) {
1747.
        args = [ pseudo, pseudo, "", argument ];
1748.
        return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1749.
          markFunction(function( seed, matches ) {
1750.
            var idx,
1751.
              matched = fn( seed, argument ),
1752.
              i = matched.length;
1753.
            while ( i-- ) {
1754.
              idx = indexOf.call( seed, matched[i] );
1755.
              seed[ idx ] = !( matches[ idx ] = matched[i] );
1756.
            }
1757.
          }) :
1758.
          function( elem ) {
1759.
            return fn( elem, 0, args );
1760.
          };
1761.
      }
1762.
 
1763.
      return fn;
1764.
    }
1765.
  },
1766.
 
1767.
  pseudos: {
1768.
    // Potentially complex pseudos
1769.
    "not": markFunction(function( selector ) {
1770.
      // Trim the selector passed to compile
1771.
      // to avoid treating leading and trailing
1772.
      // spaces as combinators
1773.
      var input = [],
1774.
        results = [],
1775.
        matcher = compile( selector.replace( rtrim, "$1" ) );
1776.
 
1777.
      return matcher[ expando ] ?
1778.
        markFunction(function( seed, matches, context, xml ) {
1779.
          var elem,
1780.
            unmatched = matcher( seed, null, xml, [] ),
1781.
            i = seed.length;
1782.
 
1783.
          // Match elements unmatched by `matcher`
1784.
          while ( i-- ) {
1785.
            if ( (elem = unmatched[i]) ) {
1786.
              seed[i] = !(matches[i] = elem);
1787.
            }
1788.
          }
1789.
        }) :
1790.
        function( elem, context, xml ) {
1791.
          input[0] = elem;
1792.
          matcher( input, null, xml, results );
1793.
          return !results.pop();
1794.
        };
1795.
    }),
1796.
 
1797.
    "has": markFunction(function( selector ) {
1798.
      return function( elem ) {
1799.
        return Sizzle( selector, elem ).length > 0;
1800.
      };
1801.
    }),
1802.
 
1803.
    "contains": markFunction(function( text ) {
1804.
      return function( elem ) {
1805.
        return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1806.
      };
1807.
    }),
1808.
 
1809.
    // "Whether an element is represented by a :lang() selector
1810.
    // is based solely on the element's language value
1811.
    // being equal to the identifier C,
1812.
    // or beginning with the identifier C immediately followed by "-".
1813.
    // The matching of C against the element's language value is performed case-insensitively.
1814.
    // The identifier C does not have to be a valid language name."
1815.
    // http://www.w3.org/TR/selectors/#lang-pseudo
1816.
    "lang": markFunction( function( lang ) {
1817.
      // lang value must be a valid identifier
1818.
      if ( !ridentifier.test(lang || "") ) {
1819.
        Sizzle.error( "unsupported lang: " + lang );
1820.
      }
1821.
      lang = lang.replace( runescape, funescape ).toLowerCase();
1822.
      return function( elem ) {
1823.
        var elemLang;
1824.
        do {
1825.
          if ( (elemLang = documentIsHTML ?
1826.
            elem.lang :
1827.
            elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1828.
 
1829.
            elemLang = elemLang.toLowerCase();
1830.
            return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1831.
          }
1832.
        } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1833.
        return false;
1834.
      };
1835.
    }),
1836.
 
1837.
    // Miscellaneous
1838.
    "target": function( elem ) {
1839.
      var hash = window.location && window.location.hash;
1840.
      return hash && hash.slice( 1 ) === elem.id;
1841.
    },
1842.
 
1843.
    "root": function( elem ) {
1844.
      return elem === docElem;
1845.
    },
1846.
 
1847.
    "focus": function( elem ) {
1848.
      return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1849.
    },
1850.
 
1851.
    // Boolean properties
1852.
    "enabled": function( elem ) {
1853.
      return elem.disabled === false;
1854.
    },
1855.
 
1856.
    "disabled": function( elem ) {
1857.
      return elem.disabled === true;
1858.
    },
1859.
 
1860.
    "checked": function( elem ) {
1861.
      // In CSS3, :checked should return both checked and selected elements
1862.
      // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1863.
      var nodeName = elem.nodeName.toLowerCase();
1864.
      return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1865.
    },
1866.
 
1867.
    "selected": function( elem ) {
1868.
      // Accessing this property makes selected-by-default
1869.
      // options in Safari work properly
1870.
      if ( elem.parentNode ) {
1871.
        elem.parentNode.selectedIndex;
1872.
      }
1873.
 
1874.
      return elem.selected === true;
1875.
    },
1876.
 
1877.
    // Contents
1878.
    "empty": function( elem ) {
1879.
      // http://www.w3.org/TR/selectors/#empty-pseudo
1880.
      // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1881.
      //   but not by others (comment: 8; processing instruction: 7; etc.)
1882.
      // nodeType < 6 works because attributes (2) do not appear as children
1883.
      for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1884.
        if ( elem.nodeType < 6 ) {
1885.
          return false;
1886.
        }
1887.
      }
1888.
      return true;
1889.
    },
1890.
 
1891.
    "parent": function( elem ) {
1892.
      return !Expr.pseudos["empty"]( elem );
1893.
    },
1894.
 
1895.
    // Element/input types
1896.
    "header": function( elem ) {
1897.
      return rheader.test( elem.nodeName );
1898.
    },
1899.
 
1900.
    "input": function( elem ) {
1901.
      return rinputs.test( elem.nodeName );
1902.
    },
1903.
 
1904.
    "button": function( elem ) {
1905.
      var name = elem.nodeName.toLowerCase();
1906.
      return name === "input" && elem.type === "button" || name === "button";
1907.
    },
1908.
 
1909.
    "text": function( elem ) {
1910.
      var attr;
1911.
      return elem.nodeName.toLowerCase() === "input" &&
1912.
        elem.type === "text" &&
1913.
 
1914.
        // Support: IE<8
1915.
        // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1916.
        ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1917.
    },
1918.
 
1919.
    // Position-in-collection
1920.
    "first": createPositionalPseudo(function() {
1921.
      return [ 0 ];
1922.
    }),
1923.
 
1924.
    "last": createPositionalPseudo(function( matchIndexes, length ) {
1925.
      return [ length - 1 ];
1926.
    }),
1927.
 
1928.
    "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1929.
      return [ argument < 0 ? argument + length : argument ];
1930.
    }),
1931.
 
1932.
    "even": createPositionalPseudo(function( matchIndexes, length ) {
1933.
      var i = 0;
1934.
      for ( ; i < length; i += 2 ) {
1935.
        matchIndexes.push( i );
1936.
      }
1937.
      return matchIndexes;
1938.
    }),
1939.
 
1940.
    "odd": createPositionalPseudo(function( matchIndexes, length ) {
1941.
      var i = 1;
1942.
      for ( ; i < length; i += 2 ) {
1943.
        matchIndexes.push( i );
1944.
      }
1945.
      return matchIndexes;
1946.
    }),
1947.
 
1948.
    "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1949.
      var i = argument < 0 ? argument + length : argument;
1950.
      for ( ; --i >= 0; ) {
1951.
        matchIndexes.push( i );
1952.
      }
1953.
      return matchIndexes;
1954.
    }),
1955.
 
1956.
    "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1957.
      var i = argument < 0 ? argument + length : argument;
1958.
      for ( ; ++i < length; ) {
1959.
        matchIndexes.push( i );
1960.
      }
1961.
      return matchIndexes;
1962.
    })
1963.
  }
1964.
};
1965.
 
1966.
Expr.pseudos["nth"] = Expr.pseudos["eq"];
1967.
 
1968.
// Add button/input type pseudos
1969.
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
1970.
  Expr.pseudos[ i ] = createInputPseudo( i );
1971.
}
1972.
for ( i in { submit: true, reset: true } ) {
1973.
  Expr.pseudos[ i ] = createButtonPseudo( i );
1974.
}
1975.
 
1976.
// Easy API for creating new setFilters
1977.
function setFilters() {}
1978.
setFilters.prototype = Expr.filters = Expr.pseudos;
1979.
Expr.setFilters = new setFilters();
1980.
 
1981.
function tokenize( selector, parseOnly ) {
1982.
  var matched, match, tokens, type,
1983.
    soFar, groups, preFilters,
1984.
    cached = tokenCache[ selector + " " ];
1985.
 
1986.
  if ( cached ) {
1987.
    return parseOnly ? 0 : cached.slice( 0 );
1988.
  }
1989.
 
1990.
  soFar = selector;
1991.
  groups = [];
1992.
  preFilters = Expr.preFilter;
1993.
 
1994.
  while ( soFar ) {
1995.
 
1996.
    // Comma and first run
1997.
    if ( !matched || (match = rcomma.exec( soFar )) ) {
1998.
      if ( match ) {
1999.
        // Don't consume trailing commas as valid
2000.
        soFar = soFar.slice( match[0].length ) || soFar;
2001.
      }
2002.
      groups.push( (tokens = []) );
2003.
    }
2004.
 
2005.
    matched = false;
2006.
 
2007.
    // Combinators
2008.
    if ( (match = rcombinators.exec( soFar )) ) {
2009.
      matched = match.shift();
2010.
      tokens.push({
2011.
        value: matched,
2012.
        // Cast descendant combinators to space
2013.
        type: match[0].replace( rtrim, " " )
2014.
      });
2015.
      soFar = soFar.slice( matched.length );
2016.
    }
2017.
 
2018.
    // Filters
2019.
    for ( type in Expr.filter ) {
2020.
      if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2021.
        (match = preFilters[ type ]( match ))) ) {
2022.
        matched = match.shift();
2023.
        tokens.push({
2024.
          value: matched,
2025.
          type: type,
2026.
          matches: match
2027.
        });
2028.
        soFar = soFar.slice( matched.length );
2029.
      }
2030.
    }
2031.
 
2032.
    if ( !matched ) {
2033.
      break;
2034.
    }
2035.
  }
2036.
 
2037.
  // Return the length of the invalid excess
2038.
  // if we're just parsing
2039.
  // Otherwise, throw an error or return tokens
2040.
  return parseOnly ?
2041.
    soFar.length :
2042.
    soFar ?
2043.
      Sizzle.error( selector ) :
2044.
      // Cache the tokens
2045.
      tokenCache( selector, groups ).slice( 0 );
2046.
}
2047.
 
2048.
function toSelector( tokens ) {
2049.
  var i = 0,
2050.
    len = tokens.length,
2051.
    selector = "";
2052.
  for ( ; i < len; i++ ) {
2053.
    selector += tokens[i].value;
2054.
  }
2055.
  return selector;
2056.
}
2057.
 
2058.
function addCombinator( matcher, combinator, base ) {
2059.
  var dir = combinator.dir,
2060.
    checkNonElements = base && dir === "parentNode",
2061.
    doneName = done++;
2062.
 
2063.
  return combinator.first ?
2064.
    // Check against closest ancestor/preceding element
2065.
    function( elem, context, xml ) {
2066.
      while ( (elem = elem[ dir ]) ) {
2067.
        if ( elem.nodeType === 1 || checkNonElements ) {
2068.
          return matcher( elem, context, xml );
2069.
        }
2070.
      }
2071.
    } :
2072.
 
2073.
    // Check against all ancestor/preceding elements
2074.
    function( elem, context, xml ) {
2075.
      var oldCache, outerCache,
2076.
        newCache = [ dirruns, doneName ];
2077.
 
2078.
      // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2079.
      if ( xml ) {
2080.
        while ( (elem = elem[ dir ]) ) {
2081.
          if ( elem.nodeType === 1 || checkNonElements ) {
2082.
            if ( matcher( elem, context, xml ) ) {
2083.
              return true;
2084.
            }
2085.
          }
2086.
        }
2087.
      } else {
2088.
        while ( (elem = elem[ dir ]) ) {
2089.
          if ( elem.nodeType === 1 || checkNonElements ) {
2090.
            outerCache = elem[ expando ] || (elem[ expando ] = {});
2091.
            if ( (oldCache = outerCache[ dir ]) &&
2092.
              oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2093.
 
2094.
              // Assign to newCache so results back-propagate to previous elements
2095.
              return (newCache[ 2 ] = oldCache[ 2 ]);
2096.
            } else {
2097.
              // Reuse newcache so results back-propagate to previous elements
2098.
              outerCache[ dir ] = newCache;
2099.
 
2100.
              // A match means we're done; a fail means we have to keep checking
2101.
              if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2102.
                return true;
2103.
              }
2104.
            }
2105.
          }
2106.
        }
2107.
      }
2108.
    };
2109.
}
2110.
 
2111.
function elementMatcher( matchers ) {
2112.
  return matchers.length > 1 ?
2113.
    function( elem, context, xml ) {
2114.
      var i = matchers.length;
2115.
      while ( i-- ) {
2116.
        if ( !matchers[i]( elem, context, xml ) ) {
2117.
          return false;
2118.
        }
2119.
      }
2120.
      return true;
2121.
    } :
2122.
    matchers[0];
2123.
}
2124.
 
2125.
function condense( unmatched, map, filter, context, xml ) {
2126.
  var elem,
2127.
    newUnmatched = [],
2128.
    i = 0,
2129.
    len = unmatched.length,
2130.
    mapped = map != null;
2131.
 
2132.
  for ( ; i < len; i++ ) {
2133.
    if ( (elem = unmatched[i]) ) {
2134.
      if ( !filter || filter( elem, context, xml ) ) {
2135.
        newUnmatched.push( elem );
2136.
        if ( mapped ) {
2137.
          map.push( i );
2138.
        }
2139.
      }
2140.
    }
2141.
  }
2142.
 
2143.
  return newUnmatched;
2144.
}
2145.
 
2146.
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2147.
  if ( postFilter && !postFilter[ expando ] ) {
2148.
    postFilter = setMatcher( postFilter );
2149.
  }
2150.
  if ( postFinder && !postFinder[ expando ] ) {
2151.
    postFinder = setMatcher( postFinder, postSelector );
2152.
  }
2153.
  return markFunction(function( seed, results, context, xml ) {
2154.
    var temp, i, elem,
2155.
      preMap = [],
2156.
      postMap = [],
2157.
      preexisting = results.length,
2158.
 
2159.
      // Get initial elements from seed or context
2160.
      elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2161.
 
2162.
      // Prefilter to get matcher input, preserving a map for seed-results synchronization
2163.
      matcherIn = preFilter && ( seed || !selector ) ?
2164.
        condense( elems, preMap, preFilter, context, xml ) :
2165.
        elems,
2166.
 
2167.
      matcherOut = matcher ?
2168.
        // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2169.
        postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2170.
 
2171.
          // ...intermediate processing is necessary
2172.
          [] :
2173.
 
2174.
          // ...otherwise use results directly
2175.
          results :
2176.
        matcherIn;
2177.
 
2178.
    // Find primary matches
2179.
    if ( matcher ) {
2180.
      matcher( matcherIn, matcherOut, context, xml );
2181.
    }
2182.
 
2183.
    // Apply postFilter
2184.
    if ( postFilter ) {
2185.
      temp = condense( matcherOut, postMap );
2186.
      postFilter( temp, [], context, xml );
2187.
 
2188.
      // Un-match failing elements by moving them back to matcherIn
2189.
      i = temp.length;
2190.
      while ( i-- ) {
2191.
        if ( (elem = temp[i]) ) {
2192.
          matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2193.
        }
2194.
      }
2195.
    }
2196.
 
2197.
    if ( seed ) {
2198.
      if ( postFinder || preFilter ) {
2199.
        if ( postFinder ) {
2200.
          // Get the final matcherOut by condensing this intermediate into postFinder contexts
2201.
          temp = [];
2202.
          i = matcherOut.length;
2203.
          while ( i-- ) {
2204.
            if ( (elem = matcherOut[i]) ) {
2205.
              // Restore matcherIn since elem is not yet a final match
2206.
              temp.push( (matcherIn[i] = elem) );
2207.
            }
2208.
          }
2209.
          postFinder( null, (matcherOut = []), temp, xml );
2210.
        }
2211.
 
2212.
        // Move matched elements from seed to results to keep them synchronized
2213.
        i = matcherOut.length;
2214.
        while ( i-- ) {
2215.
          if ( (elem = matcherOut[i]) &&
2216.
            (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
2217.
 
2218.
            seed[temp] = !(results[temp] = elem);
2219.
          }
2220.
        }
2221.
      }
2222.
 
2223.
    // Add elements to results, through postFinder if defined
2224.
    } else {
2225.
      matcherOut = condense(
2226.
        matcherOut === results ?
2227.
          matcherOut.splice( preexisting, matcherOut.length ) :
2228.
          matcherOut
2229.
      );
2230.
      if ( postFinder ) {
2231.
        postFinder( null, results, matcherOut, xml );
2232.
      } else {
2233.
        push.apply( results, matcherOut );
2234.
      }
2235.
    }
2236.
  });
2237.
}
2238.
 
2239.
function matcherFromTokens( tokens ) {
2240.
  var checkContext, matcher, j,
2241.
    len = tokens.length,
2242.
    leadingRelative = Expr.relative[ tokens[0].type ],
2243.
    implicitRelative = leadingRelative || Expr.relative[" "],
2244.
    i = leadingRelative ? 1 : 0,
2245.
 
2246.
    // The foundational matcher ensures that elements are reachable from top-level context(s)
2247.
    matchContext = addCombinator( function( elem ) {
2248.
      return elem === checkContext;
2249.
    }, implicitRelative, true ),
2250.
    matchAnyContext = addCombinator( function( elem ) {
2251.
      return indexOf.call( checkContext, elem ) > -1;
2252.
    }, implicitRelative, true ),
2253.
    matchers = [ function( elem, context, xml ) {
2254.
      return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2255.
        (checkContext = context).nodeType ?
2256.
          matchContext( elem, context, xml ) :
2257.
          matchAnyContext( elem, context, xml ) );
2258.
    } ];
2259.
 
2260.
  for ( ; i < len; i++ ) {
2261.
    if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2262.
      matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2263.
    } else {
2264.
      matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2265.
 
2266.
      // Return special upon seeing a positional matcher
2267.
      if ( matcher[ expando ] ) {
2268.
        // Find the next relative operator (if any) for proper handling
2269.
        j = ++i;
2270.
        for ( ; j < len; j++ ) {
2271.
          if ( Expr.relative[ tokens[j].type ] ) {
2272.
            break;
2273.
          }
2274.
        }
2275.
        return setMatcher(
2276.
          i > 1 && elementMatcher( matchers ),
2277.
          i > 1 && toSelector(
2278.
            // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2279.
            tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2280.
          ).replace( rtrim, "$1" ),
2281.
          matcher,
2282.
          i < j && matcherFromTokens( tokens.slice( i, j ) ),
2283.
          j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2284.
          j < len && toSelector( tokens )
2285.
        );
2286.
      }
2287.
      matchers.push( matcher );
2288.
    }
2289.
  }
2290.
 
2291.
  return elementMatcher( matchers );
2292.
}
2293.
 
2294.
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2295.
  var bySet = setMatchers.length > 0,
2296.
    byElement = elementMatchers.length > 0,
2297.
    superMatcher = function( seed, context, xml, results, outermost ) {
2298.
      var elem, j, matcher,
2299.
        matchedCount = 0,
2300.
        i = "0",
2301.
        unmatched = seed && [],
2302.
        setMatched = [],
2303.
        contextBackup = outermostContext,
2304.
        // We must always have either seed elements or outermost context
2305.
        elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2306.
        // Use integer dirruns iff this is the outermost matcher
2307.
        dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2308.
        len = elems.length;
2309.
 
2310.
      if ( outermost ) {
2311.
        outermostContext = context !== document && context;
2312.
      }
2313.
 
2314.
      // Add elements passing elementMatchers directly to results
2315.
      // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2316.
      // Support: IE<9, Safari
2317.
      // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2318.
      for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2319.
        if ( byElement && elem ) {
2320.
          j = 0;
2321.
          while ( (matcher = elementMatchers[j++]) ) {
2322.
            if ( matcher( elem, context, xml ) ) {
2323.
              results.push( elem );
2324.
              break;
2325.
            }
2326.
          }
2327.
          if ( outermost ) {
2328.
            dirruns = dirrunsUnique;
2329.
          }
2330.
        }
2331.
 
2332.
        // Track unmatched elements for set filters
2333.
        if ( bySet ) {
2334.
          // They will have gone through all possible matchers
2335.
          if ( (elem = !matcher && elem) ) {
2336.
            matchedCount--;
2337.
          }
2338.
 
2339.
          // Lengthen the array for every element, matched or not
2340.
          if ( seed ) {
2341.
            unmatched.push( elem );
2342.
          }
2343.
        }
2344.
      }
2345.
 
2346.
      // Apply set filters to unmatched elements
2347.
      matchedCount += i;
2348.
      if ( bySet && i !== matchedCount ) {
2349.
        j = 0;
2350.
        while ( (matcher = setMatchers[j++]) ) {
2351.
          matcher( unmatched, setMatched, context, xml );
2352.
        }
2353.
 
2354.
        if ( seed ) {
2355.
          // Reintegrate element matches to eliminate the need for sorting
2356.
          if ( matchedCount > 0 ) {
2357.
            while ( i-- ) {
2358.
              if ( !(unmatched[i] || setMatched[i]) ) {
2359.
                setMatched[i] = pop.call( results );
2360.
              }
2361.
            }
2362.
          }
2363.
 
2364.
          // Discard index placeholder values to get only actual matches
2365.
          setMatched = condense( setMatched );
2366.
        }
2367.
 
2368.
        // Add matches to results
2369.
        push.apply( results, setMatched );
2370.
 
2371.
        // Seedless set matches succeeding multiple successful matchers stipulate sorting
2372.
        if ( outermost && !seed && setMatched.length > 0 &&
2373.
          ( matchedCount + setMatchers.length ) > 1 ) {
2374.
 
2375.
          Sizzle.uniqueSort( results );
2376.
        }
2377.
      }
2378.
 
2379.
      // Override manipulation of globals by nested matchers
2380.
      if ( outermost ) {
2381.
        dirruns = dirrunsUnique;
2382.
        outermostContext = contextBackup;
2383.
      }
2384.
 
2385.
      return unmatched;
2386.
    };
2387.
 
2388.
  return bySet ?
2389.
    markFunction( superMatcher ) :
2390.
    superMatcher;
2391.
}
2392.
 
2393.
compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
2394.
  var i,
2395.
    setMatchers = [],
2396.
    elementMatchers = [],
2397.
    cached = compilerCache[ selector + " " ];
2398.
 
2399.
  if ( !cached ) {
2400.
    // Generate a function of recursive functions that can be used to check each element
2401.
    if ( !group ) {
2402.
      group = tokenize( selector );
2403.
    }
2404.
    i = group.length;
2405.
    while ( i-- ) {
2406.
      cached = matcherFromTokens( group[i] );
2407.
      if ( cached[ expando ] ) {
2408.
        setMatchers.push( cached );
2409.
      } else {
2410.
        elementMatchers.push( cached );
2411.
      }
2412.
    }
2413.
 
2414.
    // Cache the compiled function
2415.
    cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2416.
  }
2417.
  return cached;
2418.
};
2419.
 
2420.
function multipleContexts( selector, contexts, results ) {
2421.
  var i = 0,
2422.
    len = contexts.length;
2423.
  for ( ; i < len; i++ ) {
2424.
    Sizzle( selector, contexts[i], results );
2425.
  }
2426.
  return results;
2427.
}
2428.
 
2429.
function select( selector, context, results, seed ) {
2430.
  var i, tokens, token, type, find,
2431.
    match = tokenize( selector );
2432.
 
2433.
  if ( !seed ) {
2434.
    // Try to minimize operations if there is only one group
2435.
    if ( match.length === 1 ) {
2436.
 
2437.
      // Take a shortcut and set the context if the root selector is an ID
2438.
      tokens = match[0] = match[0].slice( 0 );
2439.
      if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2440.
          support.getById && context.nodeType === 9 && documentIsHTML &&
2441.
          Expr.relative[ tokens[1].type ] ) {
2442.
 
2443.
        context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2444.
        if ( !context ) {
2445.
          return results;
2446.
        }
2447.
        selector = selector.slice( tokens.shift().value.length );
2448.
      }
2449.
 
2450.
      // Fetch a seed set for right-to-left matching
2451.
      i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2452.
      while ( i-- ) {
2453.
        token = tokens[i];
2454.
 
2455.
        // Abort if we hit a combinator
2456.
        if ( Expr.relative[ (type = token.type) ] ) {
2457.
          break;
2458.
        }
2459.
        if ( (find = Expr.find[ type ]) ) {
2460.
          // Search, expanding context for leading sibling combinators
2461.
          if ( (seed = find(
2462.
            token.matches[0].replace( runescape, funescape ),
2463.
            rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2464.
          )) ) {
2465.
 
2466.
            // If seed is empty or no tokens remain, we can return early
2467.
            tokens.splice( i, 1 );
2468.
            selector = seed.length && toSelector( tokens );
2469.
            if ( !selector ) {
2470.
              push.apply( results, seed );
2471.
              return results;
2472.
            }
2473.
 
2474.
            break;
2475.
          }
2476.
        }
2477.
      }
2478.
    }
2479.
  }
2480.
 
2481.
  // Compile and execute a filtering function
2482.
  // Provide `match` to avoid retokenization if we modified the selector above
2483.
  compile( selector, match )(
2484.
    seed,
2485.
    context,
2486.
    !documentIsHTML,
2487.
    results,
2488.
    rsibling.test( selector ) && testContext( context.parentNode ) || context
2489.
  );
2490.
  return results;
2491.
}
2492.
 
2493.
// One-time assignments
2494.
 
2495.
// Sort stability
2496.
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2497.
 
2498.
// Support: Chrome<14
2499.
// Always assume duplicates if they aren't passed to the comparison function
2500.
support.detectDuplicates = !!hasDuplicate;
2501.
 
2502.
// Initialize against the default document
2503.
setDocument();
2504.
 
2505.
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2506.
// Detached nodes confoundingly follow *each other*
2507.
support.sortDetached = assert(function( div1 ) {
2508.
  // Should return 1, but returns 4 (following)
2509.
  return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2510.
});
2511.
 
2512.
// Support: IE<8
2513.
// Prevent attribute/property "interpolation"
2514.
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2515.
if ( !assert(function( div ) {
2516.
  div.innerHTML = "<a href='#'></a>";
2517.
  return div.firstChild.getAttribute("href") === "#" ;
2518.
}) ) {
2519.
  addHandle( "type|href|height|width", function( elem, name, isXML ) {
2520.
    if ( !isXML ) {
2521.
      return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2522.
    }
2523.
  });
2524.
}
2525.
 
2526.
// Support: IE<9
2527.
// Use defaultValue in place of getAttribute("value")
2528.
if ( !support.attributes || !assert(function( div ) {
2529.
  div.innerHTML = "<input/>";
2530.
  div.firstChild.setAttribute( "value", "" );
2531.
  return div.firstChild.getAttribute( "value" ) === "";
2532.
}) ) {
2533.
  addHandle( "value", function( elem, name, isXML ) {
2534.
    if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2535.
      return elem.defaultValue;
2536.
    }
2537.
  });
2538.
}
2539.
 
2540.
// Support: IE<9
2541.
// Use getAttributeNode to fetch booleans when getAttribute lies
2542.
if ( !assert(function( div ) {
2543.
  return div.getAttribute("disabled") == null;
2544.
}) ) {
2545.
  addHandle( booleans, function( elem, name, isXML ) {
2546.
    var val;
2547.
    if ( !isXML ) {
2548.
      return elem[ name ] === true ? name.toLowerCase() :
2549.
          (val = elem.getAttributeNode( name )) && val.specified ?
2550.
          val.value :
2551.
        null;
2552.
    }
2553.
  });
2554.
}
2555.
 
2556.
return Sizzle;
2557.
 
2558.
})( window );
2559.
 
2560.
 
2561.
 
2562.
jQuery.find = Sizzle;
2563.
jQuery.expr = Sizzle.selectors;
2564.
jQuery.expr[":"] = jQuery.expr.pseudos;
2565.
jQuery.unique = Sizzle.uniqueSort;
2566.
jQuery.text = Sizzle.getText;
2567.
jQuery.isXMLDoc = Sizzle.isXML;
2568.
jQuery.contains = Sizzle.contains;
2569.
 
2570.
 
2571.
 
2572.
var rneedsContext = jQuery.expr.match.needsContext;
2573.
 
2574.
var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
2575.
 
2576.
 
2577.
 
2578.
var risSimple = /^.[^:#\[\.,]*$/;
2579.
 
2580.
// Implement the identical functionality for filter and not
2581.
function winnow( elements, qualifier, not ) {
2582.
  if ( jQuery.isFunction( qualifier ) ) {
2583.
    return jQuery.grep( elements, function( elem, i ) {
2584.
      /* jshint -W018 */
2585.
      return !!qualifier.call( elem, i, elem ) !== not;
2586.
    });
2587.
 
2588.
  }
2589.
 
2590.
  if ( qualifier.nodeType ) {
2591.
    return jQuery.grep( elements, function( elem ) {
2592.
      return ( elem === qualifier ) !== not;
2593.
    });
2594.
 
2595.
  }
2596.
 
2597.
  if ( typeof qualifier === "string" ) {
2598.
    if ( risSimple.test( qualifier ) ) {
2599.
      return jQuery.filter( qualifier, elements, not );
2600.
    }
2601.
 
2602.
    qualifier = jQuery.filter( qualifier, elements );
2603.
  }
2604.
 
2605.
  return jQuery.grep( elements, function( elem ) {
2606.
    return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
2607.
  });
2608.
}
2609.
 
2610.
jQuery.filter = function( expr, elems, not ) {
2611.
  var elem = elems[ 0 ];
2612.
 
2613.
  if ( not ) {
2614.
    expr = ":not(" + expr + ")";
2615.
  }
2616.
 
2617.
  return elems.length === 1 && elem.nodeType === 1 ?
2618.
    jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
2619.
    jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2620.
      return elem.nodeType === 1;
2621.
    }));
2622.
};
2623.
 
2624.
jQuery.fn.extend({
2625.
  find: function( selector ) {
2626.
    var i,
2627.
      len = this.length,
2628.
      ret = [],
2629.
      self = this;
2630.
 
2631.
    if ( typeof selector !== "string" ) {
2632.
      return this.pushStack( jQuery( selector ).filter(function() {
2633.
        for ( i = 0; i < len; i++ ) {
2634.
          if ( jQuery.contains( self[ i ], this ) ) {
2635.
            return true;
2636.
          }
2637.
        }
2638.
      }) );
2639.
    }
2640.
 
2641.
    for ( i = 0; i < len; i++ ) {
2642.
      jQuery.find( selector, self[ i ], ret );
2643.
    }
2644.
 
2645.
    // Needed because $( selector, context ) becomes $( context ).find( selector )
2646.
    ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
2647.
    ret.selector = this.selector ? this.selector + " " + selector : selector;
2648.
    return ret;
2649.
  },
2650.
  filter: function( selector ) {
2651.
    return this.pushStack( winnow(this, selector || [], false) );
2652.
  },
2653.
  not: function( selector ) {
2654.
    return this.pushStack( winnow(this, selector || [], true) );
2655.
  },
2656.
  is: function( selector ) {
2657.
    return !!winnow(
2658.
      this,
2659.
 
2660.
      // If this is a positional/relative selector, check membership in the returned set
2661.
      // so $("p:first").is("p:last") won't return true for a doc with two "p".
2662.
      typeof selector === "string" && rneedsContext.test( selector ) ?
2663.
        jQuery( selector ) :
2664.
        selector || [],
2665.
      false
2666.
    ).length;
2667.
  }
2668.
});
2669.
 
2670.
 
2671.
// Initialize a jQuery object
2672.
 
2673.
 
2674.
// A central reference to the root jQuery(document)
2675.
var rootjQuery,
2676.
 
2677.
  // A simple way to check for HTML strings
2678.
  // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2679.
  // Strict HTML recognition (#11290: must start with <)
2680.
  rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2681.
 
2682.
  init = jQuery.fn.init = function( selector, context ) {
2683.
    var match, elem;
2684.
 
2685.
    // HANDLE: $(""), $(null), $(undefined), $(false)
2686.
    if ( !selector ) {
2687.
      return this;
2688.
    }
2689.
 
2690.
    // Handle HTML strings
2691.
    if ( typeof selector === "string" ) {
2692.
      if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
2693.
        // Assume that strings that start and end with <> are HTML and skip the regex check
2694.
        match = [ null, selector, null ];
2695.
 
2696.
      } else {
2697.
        match = rquickExpr.exec( selector );
2698.
      }
2699.
 
2700.
      // Match html or make sure no context is specified for #id
2701.
      if ( match && (match[1] || !context) ) {
2702.
 
2703.
        // HANDLE: $(html) -> $(array)
2704.
        if ( match[1] ) {
2705.
          context = context instanceof jQuery ? context[0] : context;
2706.
 
2707.
          // scripts is true for back-compat
2708.
          // Intentionally let the error be thrown if parseHTML is not present
2709.
          jQuery.merge( this, jQuery.parseHTML(
2710.
            match[1],
2711.
            context && context.nodeType ? context.ownerDocument || context : document,
2712.
            true
2713.
          ) );
2714.
 
2715.
          // HANDLE: $(html, props)
2716.
          if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
2717.
            for ( match in context ) {
2718.
              // Properties of context are called as methods if possible
2719.
              if ( jQuery.isFunction( this[ match ] ) ) {
2720.
                this[ match ]( context[ match ] );
2721.
 
2722.
              // ...and otherwise set as attributes
2723.
              } else {
2724.
                this.attr( match, context[ match ] );
2725.
              }
2726.
            }
2727.
          }
2728.
 
2729.
          return this;
2730.
 
2731.
        // HANDLE: $(#id)
2732.
        } else {
2733.
          elem = document.getElementById( match[2] );
2734.
 
2735.
          // Check parentNode to catch when Blackberry 4.6 returns
2736.
          // nodes that are no longer in the document #6963
2737.
          if ( elem && elem.parentNode ) {
2738.
            // Inject the element directly into the jQuery object
2739.
            this.length = 1;
2740.
            this[0] = elem;
2741.
          }
2742.
 
2743.
          this.context = document;
2744.
          this.selector = selector;
2745.
          return this;
2746.
        }
2747.
 
2748.
      // HANDLE: $(expr, $(...))
2749.
      } else if ( !context || context.jquery ) {
2750.
        return ( context || rootjQuery ).find( selector );
2751.
 
2752.
      // HANDLE: $(expr, context)
2753.
      // (which is just equivalent to: $(context).find(expr)
2754.
      } else {
2755.
        return this.constructor( context ).find( selector );
2756.
      }
2757.
 
2758.
    // HANDLE: $(DOMElement)
2759.
    } else if ( selector.nodeType ) {
2760.
      this.context = this[0] = selector;
2761.
      this.length = 1;
2762.
      return this;
2763.
 
2764.
    // HANDLE: $(function)
2765.
    // Shortcut for document ready
2766.
    } else if ( jQuery.isFunction( selector ) ) {
2767.
      return typeof rootjQuery.ready !== "undefined" ?
2768.
        rootjQuery.ready( selector ) :
2769.
        // Execute immediately if ready is not present
2770.
        selector( jQuery );
2771.
    }
2772.
 
2773.
    if ( selector.selector !== undefined ) {
2774.
      this.selector = selector.selector;
2775.
      this.context = selector.context;
2776.
    }
2777.
 
2778.
    return jQuery.makeArray( selector, this );
2779.
  };
2780.
 
2781.
// Give the init function the jQuery prototype for later instantiation
2782.
init.prototype = jQuery.fn;
2783.
 
2784.
// Initialize central reference
2785.
rootjQuery = jQuery( document );
2786.
 
2787.
 
2788.
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2789.
  // methods guaranteed to produce a unique set when starting from a unique set
2790.
  guaranteedUnique = {
2791.
    children: true,
2792.
    contents: true,
2793.
    next: true,
2794.
    prev: true
2795.
  };
2796.
 
2797.
jQuery.extend({
2798.
  dir: function( elem, dir, until ) {
2799.
    var matched = [],
2800.
      truncate = until !== undefined;
2801.
 
2802.
    while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
2803.
      if ( elem.nodeType === 1 ) {
2804.
        if ( truncate && jQuery( elem ).is( until ) ) {
2805.
          break;
2806.
        }
2807.
        matched.push( elem );
2808.
      }
2809.
    }
2810.
    return matched;
2811.
  },
2812.
 
2813.
  sibling: function( n, elem ) {
2814.
    var matched = [];
2815.
 
2816.
    for ( ; n; n = n.nextSibling ) {
2817.
      if ( n.nodeType === 1 && n !== elem ) {
2818.
        matched.push( n );
2819.
      }
2820.
    }
2821.
 
2822.
    return matched;
2823.
  }
2824.
});
2825.
 
2826.
jQuery.fn.extend({
2827.
  has: function( target ) {
2828.
    var targets = jQuery( target, this ),
2829.
      l = targets.length;
2830.
 
2831.
    return this.filter(function() {
2832.
      var i = 0;
2833.
      for ( ; i < l; i++ ) {
2834.
        if ( jQuery.contains( this, targets[i] ) ) {
2835.
          return true;
2836.
        }
2837.
      }
2838.
    });
2839.
  },
2840.
 
2841.
  closest: function( selectors, context ) {
2842.
    var cur,
2843.
      i = 0,
2844.
      l = this.length,
2845.
      matched = [],
2846.
      pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
2847.
        jQuery( selectors, context || this.context ) :
2848.
        0;
2849.
 
2850.
    for ( ; i < l; i++ ) {
2851.
      for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
2852.
        // Always skip document fragments
2853.
        if ( cur.nodeType < 11 && (pos ?
2854.
          pos.index(cur) > -1 :
2855.
 
2856.
          // Don't pass non-elements to Sizzle
2857.
          cur.nodeType === 1 &&
2858.
            jQuery.find.matchesSelector(cur, selectors)) ) {
2859.
 
2860.
          matched.push( cur );
2861.
          break;
2862.
        }
2863.
      }
2864.
    }
2865.
 
2866.
    return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
2867.
  },
2868.
 
2869.
  // Determine the position of an element within
2870.
  // the matched set of elements
2871.
  index: function( elem ) {
2872.
 
2873.
    // No argument, return index in parent
2874.
    if ( !elem ) {
2875.
      return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
2876.
    }
2877.
 
2878.
    // index in selector
2879.
    if ( typeof elem === "string" ) {
2880.
      return indexOf.call( jQuery( elem ), this[ 0 ] );
2881.
    }
2882.
 
2883.
    // Locate the position of the desired element
2884.
    return indexOf.call( this,
2885.
 
2886.
      // If it receives a jQuery object, the first element is used
2887.
      elem.jquery ? elem[ 0 ] : elem
2888.
    );
2889.
  },
2890.
 
2891.
  add: function( selector, context ) {
2892.
    return this.pushStack(
2893.
      jQuery.unique(
2894.
        jQuery.merge( this.get(), jQuery( selector, context ) )
2895.
      )
2896.
    );
2897.
  },
2898.
 
2899.
  addBack: function( selector ) {
2900.
    return this.add( selector == null ?
2901.
      this.prevObject : this.prevObject.filter(selector)
2902.
    );
2903.
  }
2904.
});
2905.
 
2906.
function sibling( cur, dir ) {
2907.
  while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
2908.
  return cur;
2909.
}
2910.
 
2911.
jQuery.each({
2912.
  parent: function( elem ) {
2913.
    var parent = elem.parentNode;
2914.
    return parent && parent.nodeType !== 11 ? parent : null;
2915.
  },
2916.
  parents: function( elem ) {
2917.
    return jQuery.dir( elem, "parentNode" );
2918.
  },
2919.
  parentsUntil: function( elem, i, until ) {
2920.
    return jQuery.dir( elem, "parentNode", until );
2921.
  },
2922.
  next: function( elem ) {
2923.
    return sibling( elem, "nextSibling" );
2924.
  },
2925.
  prev: function( elem ) {
2926.
    return sibling( elem, "previousSibling" );
2927.
  },
2928.
  nextAll: function( elem ) {
2929.
    return jQuery.dir( elem, "nextSibling" );
2930.
  },
2931.
  prevAll: function( elem ) {
2932.
    return jQuery.dir( elem, "previousSibling" );
2933.
  },
2934.
  nextUntil: function( elem, i, until ) {
2935.
    return jQuery.dir( elem, "nextSibling", until );
2936.
  },
2937.
  prevUntil: function( elem, i, until ) {
2938.
    return jQuery.dir( elem, "previousSibling", until );
2939.
  },
2940.
  siblings: function( elem ) {
2941.
    return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
2942.
  },
2943.
  children: function( elem ) {
2944.
    return jQuery.sibling( elem.firstChild );
2945.
  },
2946.
  contents: function( elem ) {
2947.
    return elem.contentDocument || jQuery.merge( [], elem.childNodes );
2948.
  }
2949.
}, function( name, fn ) {
2950.
  jQuery.fn[ name ] = function( until, selector ) {
2951.
    var matched = jQuery.map( this, fn, until );
2952.
 
2953.
    if ( name.slice( -5 ) !== "Until" ) {
2954.
      selector = until;
2955.
    }
2956.
 
2957.
    if ( selector && typeof selector === "string" ) {
2958.
      matched = jQuery.filter( selector, matched );
2959.
    }
2960.
 
2961.
    if ( this.length > 1 ) {
2962.
      // Remove duplicates
2963.
      if ( !guaranteedUnique[ name ] ) {
2964.
        jQuery.unique( matched );
2965.
      }
2966.
 
2967.
      // Reverse order for parents* and prev-derivatives
2968.
      if ( rparentsprev.test( name ) ) {
2969.
        matched.reverse();
2970.
      }
2971.
    }
2972.
 
2973.
    return this.pushStack( matched );
2974.
  };
2975.
});
2976.
var rnotwhite = (/\S+/g);
2977.
 
2978.
 
2979.
 
2980.
// String to Object options format cache
2981.
var optionsCache = {};
2982.
 
2983.
// Convert String-formatted options into Object-formatted ones and store in cache
2984.
function createOptions( options ) {
2985.
  var object = optionsCache[ options ] = {};
2986.
  jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
2987.
    object[ flag ] = true;
2988.
  });
2989.
  return object;
2990.
}
2991.
 
2992.
/*
2993.
 * Create a callback list using the following parameters:
2994.
 *
2995.
 *  options: an optional list of space-separated options that will change how
2996.
 *      the callback list behaves or a more traditional option object
2997.
 *
2998.
 * By default a callback list will act like an event callback list and can be
2999.
 * "fired" multiple times.
3000.
 *
3001.
 * Possible options:
3002.
 *
3003.
 *  once:     will ensure the callback list can only be fired once (like a Deferred)
3004.
 *
3005.
 *  memory:     will keep track of previous values and will call any callback added
3006.
 *          after the list has been fired right away with the latest "memorized"
3007.
 *          values (like a Deferred)
3008.
 *
3009.
 *  unique:     will ensure a callback can only be added once (no duplicate in the list)
3010.
 *
3011.
 *  stopOnFalse:  interrupt callings when a callback returns false
3012.
 *
3013.
 */
3014.
jQuery.Callbacks = function( options ) {
3015.
 
3016.
  // Convert options from String-formatted to Object-formatted if needed
3017.
  // (we check in cache first)
3018.
  options = typeof options === "string" ?
3019.
    ( optionsCache[ options ] || createOptions( options ) ) :
3020.
    jQuery.extend( {}, options );
3021.
 
3022.
  var // Last fire value (for non-forgettable lists)
3023.
    memory,
3024.
    // Flag to know if list was already fired
3025.
    fired,
3026.
    // Flag to know if list is currently firing
3027.
    firing,
3028.
    // First callback to fire (used internally by add and fireWith)
3029.
    firingStart,
3030.
    // End of the loop when firing
3031.
    firingLength,
3032.
    // Index of currently firing callback (modified by remove if needed)
3033.
    firingIndex,
3034.
    // Actual callback list
3035.
    list = [],
3036.
    // Stack of fire calls for repeatable lists
3037.
    stack = !options.once && [],
3038.
    // Fire callbacks
3039.
    fire = function( data ) {
3040.
      memory = options.memory && data;
3041.
      fired = true;
3042.
      firingIndex = firingStart || 0;
3043.
      firingStart = 0;
3044.
      firingLength = list.length;
3045.
      firing = true;
3046.
      for ( ; list && firingIndex < firingLength; firingIndex++ ) {
3047.
        if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3048.
          memory = false; // To prevent further calls using add
3049.
          break;
3050.
        }
3051.
      }
3052.
      firing = false;
3053.
      if ( list ) {
3054.
        if ( stack ) {
3055.
          if ( stack.length ) {
3056.
            fire( stack.shift() );
3057.
          }
3058.
        } else if ( memory ) {
3059.
          list = [];
3060.
        } else {
3061.
          self.disable();
3062.
        }
3063.
      }
3064.
    },
3065.
    // Actual Callbacks object
3066.
    self = {
3067.
      // Add a callback or a collection of callbacks to the list
3068.
      add: function() {
3069.
        if ( list ) {
3070.
          // First, we save the current length
3071.
          var start = list.length;
3072.
          (function add( args ) {
3073.
            jQuery.each( args, function( _, arg ) {
3074.
              var type = jQuery.type( arg );
3075.
              if ( type === "function" ) {
3076.
                if ( !options.unique || !self.has( arg ) ) {
3077.
                  list.push( arg );
3078.
                }
3079.
              } else if ( arg && arg.length && type !== "string" ) {
3080.
                // Inspect recursively
3081.
                add( arg );
3082.
              }
3083.
            });
3084.
          })( arguments );
3085.
          // Do we need to add the callbacks to the
3086.
          // current firing batch?
3087.
          if ( firing ) {
3088.
            firingLength = list.length;
3089.
          // With memory, if we're not firing then
3090.
          // we should call right away
3091.
          } else if ( memory ) {
3092.
            firingStart = start;
3093.
            fire( memory );
3094.
          }
3095.
        }
3096.
        return this;
3097.
      },
3098.
      // Remove a callback from the list
3099.
      remove: function() {
3100.
        if ( list ) {
3101.
          jQuery.each( arguments, function( _, arg ) {
3102.
            var index;
3103.
            while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3104.
              list.splice( index, 1 );
3105.
              // Handle firing indexes
3106.
              if ( firing ) {
3107.
                if ( index <= firingLength ) {
3108.
                  firingLength--;
3109.
                }
3110.
                if ( index <= firingIndex ) {
3111.
                  firingIndex--;
3112.
                }
3113.
              }
3114.
            }
3115.
          });
3116.
        }
3117.
        return this;
3118.
      },
3119.
      // Check if a given callback is in the list.
3120.
      // If no argument is given, return whether or not list has callbacks attached.
3121.
      has: function( fn ) {
3122.
        return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
3123.
      },
3124.
      // Remove all callbacks from the list
3125.
      empty: function() {
3126.
        list = [];
3127.
        firingLength = 0;
3128.
        return this;
3129.
      },
3130.
      // Have the list do nothing anymore
3131.
      disable: function() {
3132.
        list = stack = memory = undefined;
3133.
        return this;
3134.
      },
3135.
      // Is it disabled?
3136.
      disabled: function() {
3137.
        return !list;
3138.
      },
3139.
      // Lock the list in its current state
3140.
      lock: function() {
3141.
        stack = undefined;
3142.
        if ( !memory ) {
3143.
          self.disable();
3144.
        }
3145.
        return this;
3146.
      },
3147.
      // Is it locked?
3148.
      locked: function() {
3149.
        return !stack;
3150.
      },
3151.
      // Call all callbacks with the given context and arguments
3152.
      fireWith: function( context, args ) {
3153.
        if ( list && ( !fired || stack ) ) {
3154.
          args = args || [];
3155.
          args = [ context, args.slice ? args.slice() : args ];
3156.
          if ( firing ) {
3157.
            stack.push( args );
3158.
          } else {
3159.
            fire( args );
3160.
          }
3161.
        }
3162.
        return this;
3163.
      },
3164.
      // Call all the callbacks with the given arguments
3165.
      fire: function() {
3166.
        self.fireWith( this, arguments );
3167.
        return this;
3168.
      },
3169.
      // To know if the callbacks have already been called at least once
3170.
      fired: function() {
3171.
        return !!fired;
3172.
      }
3173.
    };
3174.
 
3175.
  return self;
3176.
};
3177.
 
3178.
 
3179.
jQuery.extend({
3180.
 
3181.
  Deferred: function( func ) {
3182.
    var tuples = [
3183.
        // action, add listener, listener list, final state
3184.
        [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3185.
        [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3186.
        [ "notify", "progress", jQuery.Callbacks("memory") ]
3187.
      ],
3188.
      state = "pending",
3189.
      promise = {
3190.
        state: function() {
3191.
          return state;
3192.
        },
3193.
        always: function() {
3194.
          deferred.done( arguments ).fail( arguments );
3195.
          return this;
3196.
        },
3197.
        then: function( /* fnDone, fnFail, fnProgress */ ) {
3198.
          var fns = arguments;
3199.
          return jQuery.Deferred(function( newDefer ) {
3200.
            jQuery.each( tuples, function( i, tuple ) {
3201.
              var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3202.
              // deferred[ done | fail | progress ] for forwarding actions to newDefer
3203.
              deferred[ tuple[1] ](function() {
3204.
                var returned = fn && fn.apply( this, arguments );
3205.
                if ( returned && jQuery.isFunction( returned.promise ) ) {
3206.
                  returned.promise()
3207.
                    .done( newDefer.resolve )
3208.
                    .fail( newDefer.reject )
3209.
                    .progress( newDefer.notify );
3210.
                } else {
3211.
                  newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3212.
                }
3213.
              });
3214.
            });
3215.
            fns = null;
3216.
          }).promise();
3217.
        },
3218.
        // Get a promise for this deferred
3219.
        // If obj is provided, the promise aspect is added to the object
3220.
        promise: function( obj ) {
3221.
          return obj != null ? jQuery.extend( obj, promise ) : promise;
3222.
        }
3223.
      },
3224.
      deferred = {};
3225.
 
3226.
    // Keep pipe for back-compat
3227.
    promise.pipe = promise.then;
3228.
 
3229.
    // Add list-specific methods
3230.
    jQuery.each( tuples, function( i, tuple ) {
3231.
      var list = tuple[ 2 ],
3232.
        stateString = tuple[ 3 ];
3233.
 
3234.
      // promise[ done | fail | progress ] = list.add
3235.
      promise[ tuple[1] ] = list.add;
3236.
 
3237.
      // Handle state
3238.
      if ( stateString ) {
3239.
        list.add(function() {
3240.
          // state = [ resolved | rejected ]
3241.
          state = stateString;
3242.
 
3243.
        // [ reject_list | resolve_list ].disable; progress_list.lock
3244.
        }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3245.
      }
3246.
 
3247.
      // deferred[ resolve | reject | notify ]
3248.
      deferred[ tuple[0] ] = function() {
3249.
        deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
3250.
        return this;
3251.
      };
3252.
      deferred[ tuple[0] + "With" ] = list.fireWith;
3253.
    });
3254.
 
3255.
    // Make the deferred a promise
3256.
    promise.promise( deferred );
3257.
 
3258.
    // Call given func if any
3259.
    if ( func ) {
3260.
      func.call( deferred, deferred );
3261.
    }
3262.
 
3263.
    // All done!
3264.
    return deferred;
3265.
  },
3266.
 
3267.
  // Deferred helper
3268.
  when: function( subordinate /* , ..., subordinateN */ ) {
3269.
    var i = 0,
3270.
      resolveValues = slice.call( arguments ),
3271.
      length = resolveValues.length,
3272.
 
3273.
      // the count of uncompleted subordinates
3274.
      remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3275.
 
3276.
      // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3277.
      deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3278.
 
3279.
      // Update function for both resolve and progress values
3280.
      updateFunc = function( i, contexts, values ) {
3281.
        return function( value ) {
3282.
          contexts[ i ] = this;
3283.
          values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3284.
          if ( values === progressValues ) {
3285.
            deferred.notifyWith( contexts, values );
3286.
          } else if ( !( --remaining ) ) {
3287.
            deferred.resolveWith( contexts, values );
3288.
          }
3289.
        };
3290.
      },
3291.
 
3292.
      progressValues, progressContexts, resolveContexts;
3293.
 
3294.
    // add listeners to Deferred subordinates; treat others as resolved
3295.
    if ( length > 1 ) {
3296.
      progressValues = new Array( length );
3297.
      progressContexts = new Array( length );
3298.
      resolveContexts = new Array( length );
3299.
      for ( ; i < length; i++ ) {
3300.
        if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3301.
          resolveValues[ i ].promise()
3302.
            .done( updateFunc( i, resolveContexts, resolveValues ) )
3303.
            .fail( deferred.reject )
3304.
            .progress( updateFunc( i, progressContexts, progressValues ) );
3305.
        } else {
3306.
          --remaining;
3307.
        }
3308.
      }
3309.
    }
3310.
 
3311.
    // if we're not waiting on anything, resolve the master
3312.
    if ( !remaining ) {
3313.
      deferred.resolveWith( resolveContexts, resolveValues );
3314.
    }
3315.
 
3316.
    return deferred.promise();
3317.
  }
3318.
});
3319.
 
3320.
 
3321.
// The deferred used on DOM ready
3322.
var readyList;
3323.
 
3324.
jQuery.fn.ready = function( fn ) {
3325.
  // Add the callback
3326.
  jQuery.ready.promise().done( fn );
3327.
 
3328.
  return this;
3329.
};
3330.
 
3331.
jQuery.extend({
3332.
  // Is the DOM ready to be used? Set to true once it occurs.
3333.
  isReady: false,
3334.
 
3335.
  // A counter to track how many items to wait for before
3336.
  // the ready event fires. See #6781
3337.
  readyWait: 1,
3338.
 
3339.
  // Hold (or release) the ready event
3340.
  holdReady: function( hold ) {
3341.
    if ( hold ) {
3342.
      jQuery.readyWait++;
3343.
    } else {
3344.
      jQuery.ready( true );
3345.
    }
3346.
  },
3347.
 
3348.
  // Handle when the DOM is ready
3349.
  ready: function( wait ) {
3350.
 
3351.
    // Abort if there are pending holds or we're already ready
3352.
    if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3353.
      return;
3354.
    }
3355.
 
3356.
    // Remember that the DOM is ready
3357.
    jQuery.isReady = true;
3358.
 
3359.
    // If a normal DOM Ready event fired, decrement, and wait if need be
3360.
    if ( wait !== true && --jQuery.readyWait > 0 ) {
3361.
      return;
3362.
    }
3363.
 
3364.
    // If there are functions bound, to execute
3365.
    readyList.resolveWith( document, [ jQuery ] );
3366.
 
3367.
    // Trigger any bound ready events
3368.
    if ( jQuery.fn.trigger ) {
3369.
      jQuery( document ).trigger("ready").off("ready");
3370.
    }
3371.
  }
3372.
});
3373.
 
3374.
/**
3375.
 * The ready event handler and self cleanup method
3376.
 */
3377.
function completed() {
3378.
  document.removeEventListener( "DOMContentLoaded", completed, false );
3379.
  window.removeEventListener( "load", completed, false );
3380.
  jQuery.ready();
3381.
}
3382.
 
3383.
jQuery.ready.promise = function( obj ) {
3384.
  if ( !readyList ) {
3385.
 
3386.
    readyList = jQuery.Deferred();
3387.
 
3388.
    // Catch cases where $(document).ready() is called after the browser event has already occurred.
3389.
    // we once tried to use readyState "interactive" here, but it caused issues like the one
3390.
    // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
3391.
    if ( document.readyState === "complete" ) {
3392.
      // Handle it asynchronously to allow scripts the opportunity to delay ready
3393.
      setTimeout( jQuery.ready );
3394.
 
3395.
    } else {
3396.
 
3397.
      // Use the handy event callback
3398.
      document.addEventListener( "DOMContentLoaded", completed, false );
3399.
 
3400.
      // A fallback to window.onload, that will always work
3401.
      window.addEventListener( "load", completed, false );
3402.
    }
3403.
  }
3404.
  return readyList.promise( obj );
3405.
};
3406.
 
3407.
// Kick off the DOM ready check even if the user does not
3408.
jQuery.ready.promise();
3409.
 
3410.
 
3411.
 
3412.
 
3413.
// Multifunctional method to get and set values of a collection
3414.
// The value/s can optionally be executed if it's a function
3415.
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3416.
  var i = 0,
3417.
    len = elems.length,
3418.
    bulk = key == null;
3419.
 
3420.
  // Sets many values
3421.
  if ( jQuery.type( key ) === "object" ) {
3422.
    chainable = true;
3423.
    for ( i in key ) {
3424.
      jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
3425.
    }
3426.
 
3427.
  // Sets one value
3428.
  } else if ( value !== undefined ) {
3429.
    chainable = true;
3430.
 
3431.
    if ( !jQuery.isFunction( value ) ) {
3432.
      raw = true;
3433.
    }
3434.
 
3435.
    if ( bulk ) {
3436.
      // Bulk operations run against the entire set
3437.
      if ( raw ) {
3438.
        fn.call( elems, value );
3439.
        fn = null;
3440.
 
3441.
      // ...except when executing function values
3442.
      } else {
3443.
        bulk = fn;
3444.
        fn = function( elem, key, value ) {
3445.
          return bulk.call( jQuery( elem ), value );
3446.
        };
3447.
      }
3448.
    }
3449.
 
3450.
    if ( fn ) {
3451.
      for ( ; i < len; i++ ) {
3452.
        fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
3453.
      }
3454.
    }
3455.
  }
3456.
 
3457.
  return chainable ?
3458.
    elems :
3459.
 
3460.
    // Gets
3461.
    bulk ?
3462.
      fn.call( elems ) :
3463.
      len ? fn( elems[0], key ) : emptyGet;
3464.
};
3465.
 
3466.
 
3467.
/**
3468.
 * Determines whether an object can have data
3469.
 */
3470.
jQuery.acceptData = function( owner ) {
3471.
  // Accepts only:
3472.
  //  - Node
3473.
  //    - Node.ELEMENT_NODE
3474.
  //    - Node.DOCUMENT_NODE
3475.
  //  - Object
3476.
  //    - Any
3477.
  /* jshint -W018 */
3478.
  return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
3479.
};
3480.
 
3481.
 
3482.
function Data() {
3483.
  // Support: Android < 4,
3484.
  // Old WebKit does not have Object.preventExtensions/freeze method,
3485.
  // return new empty object instead with no [[set]] accessor
3486.
  Object.defineProperty( this.cache = {}, 0, {
3487.
    get: function() {
3488.
      return {};
3489.
    }
3490.
  });
3491.
 
3492.
  this.expando = jQuery.expando + Math.random();
3493.
}
3494.
 
3495.
Data.uid = 1;
3496.
Data.accepts = jQuery.acceptData;
3497.
 
3498.
Data.prototype = {
3499.
  key: function( owner ) {
3500.
    // We can accept data for non-element nodes in modern browsers,
3501.
    // but we should not, see #8335.
3502.
    // Always return the key for a frozen object.
3503.
    if ( !Data.accepts( owner ) ) {
3504.
      return 0;
3505.
    }
3506.
 
3507.
    var descriptor = {},
3508.
      // Check if the owner object already has a cache key
3509.
      unlock = owner[ this.expando ];
3510.
 
3511.
    // If not, create one
3512.
    if ( !unlock ) {
3513.
      unlock = Data.uid++;
3514.
 
3515.
      // Secure it in a non-enumerable, non-writable property
3516.
      try {
3517.
        descriptor[ this.expando ] = { value: unlock };
3518.
        Object.defineProperties( owner, descriptor );
3519.
 
3520.
      // Support: Android < 4
3521.
      // Fallback to a less secure definition
3522.
      } catch ( e ) {
3523.
        descriptor[ this.expando ] = unlock;
3524.
        jQuery.extend( owner, descriptor );
3525.
      }
3526.
    }
3527.
 
3528.
    // Ensure the cache object
3529.
    if ( !this.cache[ unlock ] ) {
3530.
      this.cache[ unlock ] = {};
3531.
    }
3532.
 
3533.
    return unlock;
3534.
  },
3535.
  set: function( owner, data, value ) {
3536.
    var prop,
3537.
      // There may be an unlock assigned to this node,
3538.
      // if there is no entry for this "owner", create one inline
3539.
      // and set the unlock as though an owner entry had always existed
3540.
      unlock = this.key( owner ),
3541.
      cache = this.cache[ unlock ];
3542.
 
3543.
    // Handle: [ owner, key, value ] args
3544.
    if ( typeof data === "string" ) {
3545.
      cache[ data ] = value;
3546.
 
3547.
    // Handle: [ owner, { properties } ] args
3548.
    } else {
3549.
      // Fresh assignments by object are shallow copied
3550.
      if ( jQuery.isEmptyObject( cache ) ) {
3551.
        jQuery.extend( this.cache[ unlock ], data );
3552.
      // Otherwise, copy the properties one-by-one to the cache object
3553.
      } else {
3554.
        for ( prop in data ) {
3555.
          cache[ prop ] = data[ prop ];
3556.
        }
3557.
      }
3558.
    }
3559.
    return cache;
3560.
  },
3561.
  get: function( owner, key ) {
3562.
    // Either a valid cache is found, or will be created.
3563.
    // New caches will be created and the unlock returned,
3564.
    // allowing direct access to the newly created
3565.
    // empty data object. A valid owner object must be provided.
3566.
    var cache = this.cache[ this.key( owner ) ];
3567.
 
3568.
    return key === undefined ?
3569.
      cache : cache[ key ];
3570.
  },
3571.
  access: function( owner, key, value ) {
3572.
    var stored;
3573.
    // In cases where either:
3574.
    //
3575.
    //   1. No key was specified
3576.
    //   2. A string key was specified, but no value provided
3577.
    //
3578.
    // Take the "read" path and allow the get method to determine
3579.
    // which value to return, respectively either:
3580.
    //
3581.
    //   1. The entire cache object
3582.
    //   2. The data stored at the key
3583.
    //
3584.
    if ( key === undefined ||
3585.
        ((key && typeof key === "string") && value === undefined) ) {
3586.
 
3587.
      stored = this.get( owner, key );
3588.
 
3589.
      return stored !== undefined ?
3590.
        stored : this.get( owner, jQuery.camelCase(key) );
3591.
    }
3592.
 
3593.
    // [*]When the key is not a string, or both a key and value
3594.
    // are specified, set or extend (existing objects) with either:
3595.
    //
3596.
    //   1. An object of properties
3597.
    //   2. A key and value
3598.
    //
3599.
    this.set( owner, key, value );
3600.
 
3601.
    // Since the "set" path can have two possible entry points
3602.
    // return the expected data based on which path was taken[*]
3603.
    return value !== undefined ? value : key;
3604.
  },
3605.
  remove: function( owner, key ) {
3606.
    var i, name, camel,
3607.
      unlock = this.key( owner ),
3608.
      cache = this.cache[ unlock ];
3609.
 
3610.
    if ( key === undefined ) {
3611.
      this.cache[ unlock ] = {};
3612.
 
3613.
    } else {
3614.
      // Support array or space separated string of keys
3615.
      if ( jQuery.isArray( key ) ) {
3616.
        // If "name" is an array of keys...
3617.
        // When data is initially created, via ("key", "val") signature,
3618.
        // keys will be converted to camelCase.
3619.
        // Since there is no way to tell _how_ a key was added, remove
3620.
        // both plain key and camelCase key. #12786
3621.
        // This will only penalize the array argument path.
3622.
        name = key.concat( key.map( jQuery.camelCase ) );
3623.
      } else {
3624.
        camel = jQuery.camelCase( key );
3625.
        // Try the string as a key before any manipulation
3626.
        if ( key in cache ) {
3627.
          name = [ key, camel ];
3628.
        } else {
3629.
          // If a key with the spaces exists, use it.
3630.
          // Otherwise, create an array by matching non-whitespace
3631.
          name = camel;
3632.
          name = name in cache ?
3633.
            [ name ] : ( name.match( rnotwhite ) || [] );
3634.
        }
3635.
      }
3636.
 
3637.
      i = name.length;
3638.
      while ( i-- ) {
3639.
        delete cache[ name[ i ] ];
3640.
      }
3641.
    }
3642.
  },
3643.
  hasData: function( owner ) {
3644.
    return !jQuery.isEmptyObject(
3645.
      this.cache[ owner[ this.expando ] ] || {}
3646.
    );
3647.
  },
3648.
  discard: function( owner ) {
3649.
    if ( owner[ this.expando ] ) {
3650.
      delete this.cache[ owner[ this.expando ] ];
3651.
    }
3652.
  }
3653.
};
3654.
var data_priv = new Data();
3655.
 
3656.
var data_user = new Data();
3657.
 
3658.
 
3659.
 
3660.
/*
3661.
  Implementation Summary
3662.
 
3663.
  1. Enforce API surface and semantic compatibility with 1.9.x branch
3664.
  2. Improve the module's maintainability by reducing the storage
3665.
    paths to a single mechanism.
3666.
  3. Use the same single mechanism to support "private" and "user" data.
3667.
  4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
3668.
  5. Avoid exposing implementation details on user objects (eg. expando properties)
3669.
  6. Provide a clear path for implementation upgrade to WeakMap in 2014
3670.
*/
3671.
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3672.
  rmultiDash = /([A-Z])/g;
3673.
 
3674.
function dataAttr( elem, key, data ) {
3675.
  var name;
3676.
 
3677.
  // If nothing was found internally, try to fetch any
3678.
  // data from the HTML5 data-* attribute
3679.
  if ( data === undefined && elem.nodeType === 1 ) {
3680.
    name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3681.
    data = elem.getAttribute( name );
3682.
 
3683.
    if ( typeof data === "string" ) {
3684.
      try {
3685.
        data = data === "true" ? true :
3686.
          data === "false" ? false :
3687.
          data === "null" ? null :
3688.
          // Only convert to a number if it doesn't change the string
3689.
          +data + "" === data ? +data :
3690.
          rbrace.test( data ) ? jQuery.parseJSON( data ) :
3691.
          data;
3692.
      } catch( e ) {}
3693.
 
3694.
      // Make sure we set the data so it isn't changed later
3695.
      data_user.set( elem, key, data );
3696.
    } else {
3697.
      data = undefined;
3698.
    }
3699.
  }
3700.
  return data;
3701.
}
3702.
 
3703.
jQuery.extend({
3704.
  hasData: function( elem ) {
3705.
    return data_user.hasData( elem ) || data_priv.hasData( elem );
3706.
  },
3707.
 
3708.
  data: function( elem, name, data ) {
3709.
    return data_user.access( elem, name, data );
3710.
  },
3711.
 
3712.
  removeData: function( elem, name ) {
3713.
    data_user.remove( elem, name );
3714.
  },
3715.
 
3716.
  // TODO: Now that all calls to _data and _removeData have been replaced
3717.
  // with direct calls to data_priv methods, these can be deprecated.
3718.
  _data: function( elem, name, data ) {
3719.
    return data_priv.access( elem, name, data );
3720.
  },
3721.
 
3722.
  _removeData: function( elem, name ) {
3723.
    data_priv.remove( elem, name );
3724.
  }
3725.
});
3726.
 
3727.
jQuery.fn.extend({
3728.
  data: function( key, value ) {
3729.
    var i, name, data,
3730.
      elem = this[ 0 ],
3731.
      attrs = elem && elem.attributes;
3732.
 
3733.
    // Gets all values
3734.
    if ( key === undefined ) {
3735.
      if ( this.length ) {
3736.
        data = data_user.get( elem );
3737.
 
3738.
        if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
3739.
          i = attrs.length;
3740.
          while ( i-- ) {
3741.
            name = attrs[ i ].name;
3742.
 
3743.
            if ( name.indexOf( "data-" ) === 0 ) {
3744.
              name = jQuery.camelCase( name.slice(5) );
3745.
              dataAttr( elem, name, data[ name ] );
3746.
            }
3747.
          }
3748.
          data_priv.set( elem, "hasDataAttrs", true );
3749.
        }
3750.
      }
3751.
 
3752.
      return data;
3753.
    }
3754.
 
3755.
    // Sets multiple values
3756.
    if ( typeof key === "object" ) {
3757.
      return this.each(function() {
3758.
        data_user.set( this, key );
3759.
      });
3760.
    }
3761.
 
3762.
    return access( this, function( value ) {
3763.
      var data,
3764.
        camelKey = jQuery.camelCase( key );
3765.
 
3766.
      // The calling jQuery object (element matches) is not empty
3767.
      // (and therefore has an element appears at this[ 0 ]) and the
3768.
      // `value` parameter was not undefined. An empty jQuery object
3769.
      // will result in `undefined` for elem = this[ 0 ] which will
3770.
      // throw an exception if an attempt to read a data cache is made.
3771.
      if ( elem && value === undefined ) {
3772.
        // Attempt to get data from the cache
3773.
        // with the key as-is
3774.
        data = data_user.get( elem, key );
3775.
        if ( data !== undefined ) {
3776.
          return data;
3777.
        }
3778.
 
3779.
        // Attempt to get data from the cache
3780.
        // with the key camelized
3781.
        data = data_user.get( elem, camelKey );
3782.
        if ( data !== undefined ) {
3783.
          return data;
3784.
        }
3785.
 
3786.
        // Attempt to "discover" the data in
3787.
        // HTML5 custom data-* attrs
3788.
        data = dataAttr( elem, camelKey, undefined );
3789.
        if ( data !== undefined ) {
3790.
          return data;
3791.
        }
3792.
 
3793.
        // We tried really hard, but the data doesn't exist.
3794.
        return;
3795.
      }
3796.
 
3797.
      // Set the data...
3798.
      this.each(function() {
3799.
        // First, attempt to store a copy or reference of any
3800.
        // data that might've been store with a camelCased key.
3801.
        var data = data_user.get( this, camelKey );
3802.
 
3803.
        // For HTML5 data-* attribute interop, we have to
3804.
        // store property names with dashes in a camelCase form.
3805.
        // This might not apply to all properties...*
3806.
        data_user.set( this, camelKey, value );
3807.
 
3808.
        // *... In the case of properties that might _actually_
3809.
        // have dashes, we need to also store a copy of that
3810.
        // unchanged property.
3811.
        if ( key.indexOf("-") !== -1 && data !== undefined ) {
3812.
          data_user.set( this, key, value );
3813.
        }
3814.
      });
3815.
    }, null, value, arguments.length > 1, null, true );
3816.
  },
3817.
 
3818.
  removeData: function( key ) {
3819.
    return this.each(function() {
3820.
      data_user.remove( this, key );
3821.
    });
3822.
  }
3823.
});
3824.
 
3825.
 
3826.
jQuery.extend({
3827.
  queue: function( elem, type, data ) {
3828.
    var queue;
3829.
 
3830.
    if ( elem ) {
3831.
      type = ( type || "fx" ) + "queue";
3832.
      queue = data_priv.get( elem, type );
3833.
 
3834.
      // Speed up dequeue by getting out quickly if this is just a lookup
3835.
      if ( data ) {
3836.
        if ( !queue || jQuery.isArray( data ) ) {
3837.
          queue = data_priv.access( elem, type, jQuery.makeArray(data) );
3838.
        } else {
3839.
          queue.push( data );
3840.
        }
3841.
      }
3842.
      return queue || [];
3843.
    }
3844.
  },
3845.
 
3846.
  dequeue: function( elem, type ) {
3847.
    type = type || "fx";
3848.
 
3849.
    var queue = jQuery.queue( elem, type ),
3850.
      startLength = queue.length,
3851.
      fn = queue.shift(),
3852.
      hooks = jQuery._queueHooks( elem, type ),
3853.
      next = function() {
3854.
        jQuery.dequeue( elem, type );
3855.
      };
3856.
 
3857.
    // If the fx queue is dequeued, always remove the progress sentinel
3858.
    if ( fn === "inprogress" ) {
3859.
      fn = queue.shift();
3860.
      startLength--;
3861.
    }
3862.
 
3863.
    if ( fn ) {
3864.
 
3865.
      // Add a progress sentinel to prevent the fx queue from being
3866.
      // automatically dequeued
3867.
      if ( type === "fx" ) {
3868.
        queue.unshift( "inprogress" );
3869.
      }
3870.
 
3871.
      // clear up the last queue stop function
3872.
      delete hooks.stop;
3873.
      fn.call( elem, next, hooks );
3874.
    }
3875.
 
3876.
    if ( !startLength && hooks ) {
3877.
      hooks.empty.fire();
3878.
    }
3879.
  },
3880.
 
3881.
  // not intended for public consumption - generates a queueHooks object, or returns the current one
3882.
  _queueHooks: function( elem, type ) {
3883.
    var key = type + "queueHooks";
3884.
    return data_priv.get( elem, key ) || data_priv.access( elem, key, {
3885.
      empty: jQuery.Callbacks("once memory").add(function() {
3886.
        data_priv.remove( elem, [ type + "queue", key ] );
3887.
      })
3888.
    });
3889.
  }
3890.
});
3891.
 
3892.
jQuery.fn.extend({
3893.
  queue: function( type, data ) {
3894.
    var setter = 2;
3895.
 
3896.
    if ( typeof type !== "string" ) {
3897.
      data = type;
3898.
      type = "fx";
3899.
      setter--;
3900.
    }
3901.
 
3902.
    if ( arguments.length < setter ) {
3903.
      return jQuery.queue( this[0], type );
3904.
    }
3905.
 
3906.
    return data === undefined ?
3907.
      this :
3908.
      this.each(function() {
3909.
        var queue = jQuery.queue( this, type, data );
3910.
 
3911.
        // ensure a hooks for this queue
3912.
        jQuery._queueHooks( this, type );
3913.
 
3914.
        if ( type === "fx" && queue[0] !== "inprogress" ) {
3915.
          jQuery.dequeue( this, type );
3916.
        }
3917.
      });
3918.
  },
3919.
  dequeue: function( type ) {
3920.
    return this.each(function() {
3921.
      jQuery.dequeue( this, type );
3922.
    });
3923.
  },
3924.
  clearQueue: function( type ) {
3925.
    return this.queue( type || "fx", [] );
3926.
  },
3927.
  // Get a promise resolved when queues of a certain type
3928.
  // are emptied (fx is the type by default)
3929.
  promise: function( type, obj ) {
3930.
    var tmp,
3931.
      count = 1,
3932.
      defer = jQuery.Deferred(),
3933.
      elements = this,
3934.
      i = this.length,
3935.
      resolve = function() {
3936.
        if ( !( --count ) ) {
3937.
          defer.resolveWith( elements, [ elements ] );
3938.
        }
3939.
      };
3940.
 
3941.
    if ( typeof type !== "string" ) {
3942.
      obj = type;
3943.
      type = undefined;
3944.
    }
3945.
    type = type || "fx";
3946.
 
3947.
    while ( i-- ) {
3948.
      tmp = data_priv.get( elements[ i ], type + "queueHooks" );
3949.
      if ( tmp && tmp.empty ) {
3950.
        count++;
3951.
        tmp.empty.add( resolve );
3952.
      }
3953.
    }
3954.
    resolve();
3955.
    return defer.promise( obj );
3956.
  }
3957.
});
3958.
var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
3959.
 
3960.
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
3961.
 
3962.
var isHidden = function( elem, el ) {
3963.
    // isHidden might be called from jQuery#filter function;
3964.
    // in that case, element will be second argument
3965.
    elem = el || elem;
3966.
    return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
3967.
  };
3968.
 
3969.
var rcheckableType = (/^(?:checkbox|radio)$/i);
3970.
 
3971.
 
3972.
 
3973.
(function() {
3974.
  var fragment = document.createDocumentFragment(),
3975.
    div = fragment.appendChild( document.createElement( "div" ) );
3976.
 
3977.
  // #11217 - WebKit loses check when the name is after the checked attribute
3978.
  div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
3979.
 
3980.
  // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
3981.
  // old WebKit doesn't clone checked state correctly in fragments
3982.
  support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
3983.
 
3984.
  // Make sure textarea (and checkbox) defaultValue is properly cloned
3985.
  // Support: IE9-IE11+
3986.
  div.innerHTML = "<textarea>x</textarea>";
3987.
  support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
3988.
})();
3989.
var strundefined = typeof undefined;
3990.
 
3991.
 
3992.
 
3993.
support.focusinBubbles = "onfocusin" in window;
3994.
 
3995.
 
3996.
var
3997.
  rkeyEvent = /^key/,
3998.
  rmouseEvent = /^(?:mouse|contextmenu)|click/,
3999.
  rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4000.
  rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4001.
 
4002.
function returnTrue() {
4003.
  return true;
4004.
}
4005.
 
4006.
function returnFalse() {
4007.
  return false;
4008.
}
4009.
 
4010.
function safeActiveElement() {
4011.
  try {
4012.
    return document.activeElement;
4013.
  } catch ( err ) { }
4014.
}
4015.
 
4016.
/*
4017.
 * Helper functions for managing events -- not part of the public interface.
4018.
 * Props to Dean Edwards' addEvent library for many of the ideas.
4019.
 */
4020.
jQuery.event = {
4021.
 
4022.
  global: {},
4023.
 
4024.
  add: function( elem, types, handler, data, selector ) {
4025.
 
4026.
    var handleObjIn, eventHandle, tmp,
4027.
      events, t, handleObj,
4028.
      special, handlers, type, namespaces, origType,
4029.
      elemData = data_priv.get( elem );
4030.
 
4031.
    // Don't attach events to noData or text/comment nodes (but allow plain objects)
4032.
    if ( !elemData ) {
4033.
      return;
4034.
    }
4035.
 
4036.
    // Caller can pass in an object of custom data in lieu of the handler
4037.
    if ( handler.handler ) {
4038.
      handleObjIn = handler;
4039.
      handler = handleObjIn.handler;
4040.
      selector = handleObjIn.selector;
4041.
    }
4042.
 
4043.
    // Make sure that the handler has a unique ID, used to find/remove it later
4044.
    if ( !handler.guid ) {
4045.
      handler.guid = jQuery.guid++;
4046.
    }
4047.
 
4048.
    // Init the element's event structure and main handler, if this is the first
4049.
    if ( !(events = elemData.events) ) {
4050.
      events = elemData.events = {};
4051.
    }
4052.
    if ( !(eventHandle = elemData.handle) ) {
4053.
      eventHandle = elemData.handle = function( e ) {
4054.
        // Discard the second event of a jQuery.event.trigger() and
4055.
        // when an event is called after a page has unloaded
4056.
        return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
4057.
          jQuery.event.dispatch.apply( elem, arguments ) : undefined;
4058.
      };
4059.
    }
4060.
 
4061.
    // Handle multiple events separated by a space
4062.
    types = ( types || "" ).match( rnotwhite ) || [ "" ];
4063.
    t = types.length;
4064.
    while ( t-- ) {
4065.
      tmp = rtypenamespace.exec( types[t] ) || [];
4066.
      type = origType = tmp[1];
4067.
      namespaces = ( tmp[2] || "" ).split( "." ).sort();
4068.
 
4069.
      // There *must* be a type, no attaching namespace-only handlers
4070.
      if ( !type ) {
4071.
        continue;
4072.
      }
4073.
 
4074.
      // If event changes its type, use the special event handlers for the changed type
4075.
      special = jQuery.event.special[ type ] || {};
4076.
 
4077.
      // If selector defined, determine special event api type, otherwise given type
4078.
      type = ( selector ? special.delegateType : special.bindType ) || type;
4079.
 
4080.
      // Update special based on newly reset type
4081.
      special = jQuery.event.special[ type ] || {};
4082.
 
4083.
      // handleObj is passed to all event handlers
4084.
      handleObj = jQuery.extend({
4085.
        type: type,
4086.
        origType: origType,
4087.
        data: data,
4088.
        handler: handler,
4089.
        guid: handler.guid,
4090.
        selector: selector,
4091.
        needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4092.
        namespace: namespaces.join(".")
4093.
      }, handleObjIn );
4094.
 
4095.
      // Init the event handler queue if we're the first
4096.
      if ( !(handlers = events[ type ]) ) {
4097.
        handlers = events[ type ] = [];
4098.
        handlers.delegateCount = 0;
4099.
 
4100.
        // Only use addEventListener if the special events handler returns false
4101.
        if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4102.
          if ( elem.addEventListener ) {
4103.
            elem.addEventListener( type, eventHandle, false );
4104.
          }
4105.
        }
4106.
      }
4107.
 
4108.
      if ( special.add ) {
4109.
        special.add.call( elem, handleObj );
4110.
 
4111.
        if ( !handleObj.handler.guid ) {
4112.
          handleObj.handler.guid = handler.guid;
4113.
        }
4114.
      }
4115.
 
4116.
      // Add to the element's handler list, delegates in front
4117.
      if ( selector ) {
4118.
        handlers.splice( handlers.delegateCount++, 0, handleObj );
4119.
      } else {
4120.
        handlers.push( handleObj );
4121.
      }
4122.
 
4123.
      // Keep track of which events have ever been used, for event optimization
4124.
      jQuery.event.global[ type ] = true;
4125.
    }
4126.
 
4127.
  },
4128.
 
4129.
  // Detach an event or set of events from an element
4130.
  remove: function( elem, types, handler, selector, mappedTypes ) {
4131.
 
4132.
    var j, origCount, tmp,
4133.
      events, t, handleObj,
4134.
      special, handlers, type, namespaces, origType,
4135.
      elemData = data_priv.hasData( elem ) && data_priv.get( elem );
4136.
 
4137.
    if ( !elemData || !(events = elemData.events) ) {
4138.
      return;
4139.
    }
4140.
 
4141.
    // Once for each type.namespace in types; type may be omitted
4142.
    types = ( types || "" ).match( rnotwhite ) || [ "" ];
4143.
    t = types.length;
4144.
    while ( t-- ) {
4145.
      tmp = rtypenamespace.exec( types[t] ) || [];
4146.
      type = origType = tmp[1];
4147.
      namespaces = ( tmp[2] || "" ).split( "." ).sort();
4148.
 
4149.
      // Unbind all events (on this namespace, if provided) for the element
4150.
      if ( !type ) {
4151.
        for ( type in events ) {
4152.
          jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
4153.
        }
4154.
        continue;
4155.
      }
4156.
 
4157.
      special = jQuery.event.special[ type ] || {};
4158.
      type = ( selector ? special.delegateType : special.bindType ) || type;
4159.
      handlers = events[ type ] || [];
4160.
      tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
4161.
 
4162.
      // Remove matching events
4163.
      origCount = j = handlers.length;
4164.
      while ( j-- ) {
4165.
        handleObj = handlers[ j ];
4166.
 
4167.
        if ( ( mappedTypes || origType === handleObj.origType ) &&
4168.
          ( !handler || handler.guid === handleObj.guid ) &&
4169.
          ( !tmp || tmp.test( handleObj.namespace ) ) &&
4170.
          ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4171.
          handlers.splice( j, 1 );
4172.
 
4173.
          if ( handleObj.selector ) {
4174.
            handlers.delegateCount--;
4175.
          }
4176.
          if ( special.remove ) {
4177.
            special.remove.call( elem, handleObj );
4178.
          }
4179.
        }
4180.
      }
4181.
 
4182.
      // Remove generic event handler if we removed something and no more handlers exist
4183.
      // (avoids potential for endless recursion during removal of special event handlers)
4184.
      if ( origCount && !handlers.length ) {
4185.
        if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
4186.
          jQuery.removeEvent( elem, type, elemData.handle );
4187.
        }
4188.
 
4189.
        delete events[ type ];
4190.
      }
4191.
    }
4192.
 
4193.
    // Remove the expando if it's no longer used
4194.
    if ( jQuery.isEmptyObject( events ) ) {
4195.
      delete elemData.handle;
4196.
      data_priv.remove( elem, "events" );
4197.
    }
4198.
  },
4199.
 
4200.
  trigger: function( event, data, elem, onlyHandlers ) {
4201.
 
4202.
    var i, cur, tmp, bubbleType, ontype, handle, special,
4203.
      eventPath = [ elem || document ],
4204.
      type = hasOwn.call( event, "type" ) ? event.type : event,
4205.
      namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
4206.
 
4207.
    cur = tmp = elem = elem || document;
4208.
 
4209.
    // Don't do events on text and comment nodes
4210.
    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
4211.
      return;
4212.
    }
4213.
 
4214.
    // focus/blur morphs to focusin/out; ensure we're not firing them right now
4215.
    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4216.
      return;
4217.
    }
4218.
 
4219.
    if ( type.indexOf(".") >= 0 ) {
4220.
      // Namespaced trigger; create a regexp to match event type in handle()
4221.
      namespaces = type.split(".");
4222.
      type = namespaces.shift();
4223.
      namespaces.sort();
4224.
    }
4225.
    ontype = type.indexOf(":") < 0 && "on" + type;
4226.
 
4227.
    // Caller can pass in a jQuery.Event object, Object, or just an event type string
4228.
    event = event[ jQuery.expando ] ?
4229.
      event :
4230.
      new jQuery.Event( type, typeof event === "object" && event );
4231.
 
4232.
    // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4233.
    event.isTrigger = onlyHandlers ? 2 : 3;
4234.
    event.namespace = namespaces.join(".");
4235.
    event.namespace_re = event.namespace ?
4236.
      new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4237.
      null;
4238.
 
4239.
    // Clean up the event in case it is being reused
4240.
    event.result = undefined;
4241.
    if ( !event.target ) {
4242.
      event.target = elem;
4243.
    }
4244.
 
4245.
    // Clone any incoming data and prepend the event, creating the handler arg list
4246.
    data = data == null ?
4247.
      [ event ] :
4248.
      jQuery.makeArray( data, [ event ] );
4249.
 
4250.
    // Allow special events to draw outside the lines
4251.
    special = jQuery.event.special[ type ] || {};
4252.
    if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
4253.
      return;
4254.
    }
4255.
 
4256.
    // Determine event propagation path in advance, per W3C events spec (#9951)
4257.
    // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4258.
    if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4259.
 
4260.
      bubbleType = special.delegateType || type;
4261.
      if ( !rfocusMorph.test( bubbleType + type ) ) {
4262.
        cur = cur.parentNode;
4263.
      }
4264.
      for ( ; cur; cur = cur.parentNode ) {
4265.
        eventPath.push( cur );
4266.
        tmp = cur;
4267.
      }
4268.
 
4269.
      // Only add window if we got to document (e.g., not plain obj or detached DOM)
4270.
      if ( tmp === (elem.ownerDocument || document) ) {
4271.
        eventPath.push( tmp.defaultView || tmp.parentWindow || window );
4272.
      }
4273.
    }
4274.
 
4275.
    // Fire handlers on the event path
4276.
    i = 0;
4277.
    while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4278.
 
4279.
      event.type = i > 1 ?
4280.
        bubbleType :
4281.
        special.bindType || type;
4282.
 
4283.
      // jQuery handler
4284.
      handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
4285.
      if ( handle ) {
4286.
        handle.apply( cur, data );
4287.
      }
4288.
 
4289.
      // Native handler
4290.
      handle = ontype && cur[ ontype ];
4291.
      if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
4292.
        event.result = handle.apply( cur, data );
4293.
        if ( event.result === false ) {
4294.
          event.preventDefault();
4295.
        }
4296.
      }
4297.
    }
4298.
    event.type = type;
4299.
 
4300.
    // If nobody prevented the default action, do it now
4301.
    if ( !onlyHandlers && !event.isDefaultPrevented() ) {
4302.
 
4303.
      if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
4304.
        jQuery.acceptData( elem ) ) {
4305.
 
4306.
        // Call a native DOM method on the target with the same name name as the event.
4307.
        // Don't do default actions on window, that's where global variables be (#6170)
4308.
        if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
4309.
 
4310.
          // Don't re-trigger an onFOO event when we call its FOO() method
4311.
          tmp = elem[ ontype ];
4312.
 
4313.
          if ( tmp ) {
4314.
            elem[ ontype ] = null;
4315.
          }
4316.
 
4317.
          // Prevent re-triggering of the same event, since we already bubbled it above
4318.
          jQuery.event.triggered = type;
4319.
          elem[ type ]();
4320.
          jQuery.event.triggered = undefined;
4321.
 
4322.
          if ( tmp ) {
4323.
            elem[ ontype ] = tmp;
4324.
          }
4325.
        }
4326.
      }
4327.
    }
4328.
 
4329.
    return event.result;
4330.
  },
4331.
 
4332.
  dispatch: function( event ) {
4333.
 
4334.
    // Make a writable jQuery.Event from the native event object
4335.
    event = jQuery.event.fix( event );
4336.
 
4337.
    var i, j, ret, matched, handleObj,
4338.
      handlerQueue = [],
4339.
      args = slice.call( arguments ),
4340.
      handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
4341.
      special = jQuery.event.special[ event.type ] || {};
4342.
 
4343.
    // Use the fix-ed jQuery.Event rather than the (read-only) native event
4344.
    args[0] = event;
4345.
    event.delegateTarget = this;
4346.
 
4347.
    // Call the preDispatch hook for the mapped type, and let it bail if desired
4348.
    if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
4349.
      return;
4350.
    }
4351.
 
4352.
    // Determine handlers
4353.
    handlerQueue = jQuery.event.handlers.call( this, event, handlers );
4354.
 
4355.
    // Run delegates first; they may want to stop propagation beneath us
4356.
    i = 0;
4357.
    while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
4358.
      event.currentTarget = matched.elem;
4359.
 
4360.
      j = 0;
4361.
      while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
4362.
 
4363.
        // Triggered event must either 1) have no namespace, or
4364.
        // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
4365.
        if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
4366.
 
4367.
          event.handleObj = handleObj;
4368.
          event.data = handleObj.data;
4369.
 
4370.
          ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
4371.
              .apply( matched.elem, args );
4372.
 
4373.
          if ( ret !== undefined ) {
4374.
            if ( (event.result = ret) === false ) {
4375.
              event.preventDefault();
4376.
              event.stopPropagation();
4377.
            }
4378.
          }
4379.
        }
4380.
      }
4381.
    }
4382.
 
4383.
    // Call the postDispatch hook for the mapped type
4384.
    if ( special.postDispatch ) {
4385.
      special.postDispatch.call( this, event );
4386.
    }
4387.
 
4388.
    return event.result;
4389.
  },
4390.
 
4391.
  handlers: function( event, handlers ) {
4392.
    var i, matches, sel, handleObj,
4393.
      handlerQueue = [],
4394.
      delegateCount = handlers.delegateCount,
4395.
      cur = event.target;
4396.
 
4397.
    // Find delegate handlers
4398.
    // Black-hole SVG <use> instance trees (#13180)
4399.
    // Avoid non-left-click bubbling in Firefox (#3861)
4400.
    if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
4401.
 
4402.
      for ( ; cur !== this; cur = cur.parentNode || this ) {
4403.
 
4404.
        // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
4405.
        if ( cur.disabled !== true || event.type !== "click" ) {
4406.
          matches = [];
4407.
          for ( i = 0; i < delegateCount; i++ ) {
4408.
            handleObj = handlers[ i ];
4409.
 
4410.
            // Don't conflict with Object.prototype properties (#13203)
4411.
            sel = handleObj.selector + " ";
4412.
 
4413.
            if ( matches[ sel ] === undefined ) {
4414.
              matches[ sel ] = handleObj.needsContext ?
4415.
                jQuery( sel, this ).index( cur ) >= 0 :
4416.
                jQuery.find( sel, this, null, [ cur ] ).length;
4417.
            }
4418.
            if ( matches[ sel ] ) {
4419.
              matches.push( handleObj );
4420.
            }
4421.
          }
4422.
          if ( matches.length ) {
4423.
            handlerQueue.push({ elem: cur, handlers: matches });
4424.
          }
4425.
        }
4426.
      }
4427.
    }
4428.
 
4429.
    // Add the remaining (directly-bound) handlers
4430.
    if ( delegateCount < handlers.length ) {
4431.
      handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
4432.
    }
4433.
 
4434.
    return handlerQueue;
4435.
  },
4436.
 
4437.
  // Includes some event props shared by KeyEvent and MouseEvent
4438.
  props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
4439.
 
4440.
  fixHooks: {},
4441.
 
4442.
  keyHooks: {
4443.
    props: "char charCode key keyCode".split(" "),
4444.
    filter: function( event, original ) {
4445.
 
4446.
      // Add which for key events
4447.
      if ( event.which == null ) {
4448.
        event.which = original.charCode != null ? original.charCode : original.keyCode;
4449.
      }
4450.
 
4451.
      return event;
4452.
    }
4453.
  },
4454.
 
4455.
  mouseHooks: {
4456.
    props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
4457.
    filter: function( event, original ) {
4458.
      var eventDoc, doc, body,
4459.
        button = original.button;
4460.
 
4461.
      // Calculate pageX/Y if missing and clientX/Y available
4462.
      if ( event.pageX == null && original.clientX != null ) {
4463.
        eventDoc = event.target.ownerDocument || document;
4464.
        doc = eventDoc.documentElement;
4465.
        body = eventDoc.body;
4466.
 
4467.
        event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
4468.
        event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
4469.
      }
4470.
 
4471.
      // Add which for click: 1 === left; 2 === middle; 3 === right
4472.
      // Note: button is not normalized, so don't use it
4473.
      if ( !event.which && button !== undefined ) {
4474.
        event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
4475.
      }
4476.
 
4477.
      return event;
4478.
    }
4479.
  },
4480.
 
4481.
  fix: function( event ) {
4482.
    if ( event[ jQuery.expando ] ) {
4483.
      return event;
4484.
    }
4485.
 
4486.
    // Create a writable copy of the event object and normalize some properties
4487.
    var i, prop, copy,
4488.
      type = event.type,
4489.
      originalEvent = event,
4490.
      fixHook = this.fixHooks[ type ];
4491.
 
4492.
    if ( !fixHook ) {
4493.
      this.fixHooks[ type ] = fixHook =
4494.
        rmouseEvent.test( type ) ? this.mouseHooks :
4495.
        rkeyEvent.test( type ) ? this.keyHooks :
4496.
        {};
4497.
    }
4498.
    copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
4499.
 
4500.
    event = new jQuery.Event( originalEvent );
4501.
 
4502.
    i = copy.length;
4503.
    while ( i-- ) {
4504.
      prop = copy[ i ];
4505.
      event[ prop ] = originalEvent[ prop ];
4506.
    }
4507.
 
4508.
    // Support: Cordova 2.5 (WebKit) (#13255)
4509.
    // All events should have a target; Cordova deviceready doesn't
4510.
    if ( !event.target ) {
4511.
      event.target = document;
4512.
    }
4513.
 
4514.
    // Support: Safari 6.0+, Chrome < 28
4515.
    // Target should not be a text node (#504, #13143)
4516.
    if ( event.target.nodeType === 3 ) {
4517.
      event.target = event.target.parentNode;
4518.
    }
4519.
 
4520.
    return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
4521.
  },
4522.
 
4523.
  special: {
4524.
    load: {
4525.
      // Prevent triggered image.load events from bubbling to window.load
4526.
      noBubble: true
4527.
    },
4528.
    focus: {
4529.
      // Fire native event if possible so blur/focus sequence is correct
4530.
      trigger: function() {
4531.
        if ( this !== safeActiveElement() && this.focus ) {
4532.
          this.focus();
4533.
          return false;
4534.
        }
4535.
      },
4536.
      delegateType: "focusin"
4537.
    },
4538.
    blur: {
4539.
      trigger: function() {
4540.
        if ( this === safeActiveElement() && this.blur ) {
4541.
          this.blur();
4542.
          return false;
4543.
        }
4544.
      },
4545.
      delegateType: "focusout"
4546.
    },
4547.
    click: {
4548.
      // For checkbox, fire native event so checked state will be right
4549.
      trigger: function() {
4550.
        if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
4551.
          this.click();
4552.
          return false;
4553.
        }
4554.
      },
4555.
 
4556.
      // For cross-browser consistency, don't fire native .click() on links
4557.
      _default: function( event ) {
4558.
        return jQuery.nodeName( event.target, "a" );
4559.
      }
4560.
    },
4561.
 
4562.
    beforeunload: {
4563.
      postDispatch: function( event ) {
4564.
 
4565.
        // Support: Firefox 20+
4566.
        // Firefox doesn't alert if the returnValue field is not set.
4567.
        if ( event.result !== undefined ) {
4568.
          event.originalEvent.returnValue = event.result;
4569.
        }
4570.
      }
4571.
    }
4572.
  },
4573.
 
4574.
  simulate: function( type, elem, event, bubble ) {
4575.
    // Piggyback on a donor event to simulate a different one.
4576.
    // Fake originalEvent to avoid donor's stopPropagation, but if the
4577.
    // simulated event prevents default then we do the same on the donor.
4578.
    var e = jQuery.extend(
4579.
      new jQuery.Event(),
4580.
      event,
4581.
      {
4582.
        type: type,
4583.
        isSimulated: true,
4584.
        originalEvent: {}
4585.
      }
4586.
    );
4587.
    if ( bubble ) {
4588.
      jQuery.event.trigger( e, null, elem );
4589.
    } else {
4590.
      jQuery.event.dispatch.call( elem, e );
4591.
    }
4592.
    if ( e.isDefaultPrevented() ) {
4593.
      event.preventDefault();
4594.
    }
4595.
  }
4596.
};
4597.
 
4598.
jQuery.removeEvent = function( elem, type, handle ) {
4599.
  if ( elem.removeEventListener ) {
4600.
    elem.removeEventListener( type, handle, false );
4601.
  }
4602.
};
4603.
 
4604.
jQuery.Event = function( src, props ) {
4605.
  // Allow instantiation without the 'new' keyword
4606.
  if ( !(this instanceof jQuery.Event) ) {
4607.
    return new jQuery.Event( src, props );
4608.
  }
4609.
 
4610.
  // Event object
4611.
  if ( src && src.type ) {
4612.
    this.originalEvent = src;
4613.
    this.type = src.type;
4614.
 
4615.
    // Events bubbling up the document may have been marked as prevented
4616.
    // by a handler lower down the tree; reflect the correct value.
4617.
    this.isDefaultPrevented = src.defaultPrevented ||
4618.
        // Support: Android < 4.0
4619.
        src.defaultPrevented === undefined &&
4620.
        src.getPreventDefault && src.getPreventDefault() ?
4621.
      returnTrue :
4622.
      returnFalse;
4623.
 
4624.
  // Event type
4625.
  } else {
4626.
    this.type = src;
4627.
  }
4628.
 
4629.
  // Put explicitly provided properties onto the event object
4630.
  if ( props ) {
4631.
    jQuery.extend( this, props );
4632.
  }
4633.
 
4634.
  // Create a timestamp if incoming event doesn't have one
4635.
  this.timeStamp = src && src.timeStamp || jQuery.now();
4636.
 
4637.
  // Mark it as fixed
4638.
  this[ jQuery.expando ] = true;
4639.
};
4640.
 
4641.
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
4642.
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
4643.
jQuery.Event.prototype = {
4644.
  isDefaultPrevented: returnFalse,
4645.
  isPropagationStopped: returnFalse,
4646.
  isImmediatePropagationStopped: returnFalse,
4647.
 
4648.
  preventDefault: function() {
4649.
    var e = this.originalEvent;
4650.
 
4651.
    this.isDefaultPrevented = returnTrue;
4652.
 
4653.
    if ( e && e.preventDefault ) {
4654.
      e.preventDefault();
4655.
    }
4656.
  },
4657.
  stopPropagation: function() {
4658.
    var e = this.originalEvent;
4659.
 
4660.
    this.isPropagationStopped = returnTrue;
4661.
 
4662.
    if ( e && e.stopPropagation ) {
4663.
      e.stopPropagation();
4664.
    }
4665.
  },
4666.
  stopImmediatePropagation: function() {
4667.
    this.isImmediatePropagationStopped = returnTrue;
4668.
    this.stopPropagation();
4669.
  }
4670.
};
4671.
 
4672.
// Create mouseenter/leave events using mouseover/out and event-time checks
4673.
// Support: Chrome 15+
4674.
jQuery.each({
4675.
  mouseenter: "mouseover",
4676.
  mouseleave: "mouseout"
4677.
}, function( orig, fix ) {
4678.
  jQuery.event.special[ orig ] = {
4679.
    delegateType: fix,
4680.
    bindType: fix,
4681.
 
4682.
    handle: function( event ) {
4683.
      var ret,
4684.
        target = this,
4685.
        related = event.relatedTarget,
4686.
        handleObj = event.handleObj;
4687.
 
4688.
      // For mousenter/leave call the handler if related is outside the target.
4689.
      // NB: No relatedTarget if the mouse left/entered the browser window
4690.
      if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
4691.
        event.type = handleObj.origType;
4692.
        ret = handleObj.handler.apply( this, arguments );
4693.
        event.type = fix;
4694.
      }
4695.
      return ret;
4696.
    }
4697.
  };
4698.
});
4699.
 
4700.
// Create "bubbling" focus and blur events
4701.
// Support: Firefox, Chrome, Safari
4702.
if ( !support.focusinBubbles ) {
4703.
  jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
4704.
 
4705.
    // Attach a single capturing handler on the document while someone wants focusin/focusout
4706.
    var handler = function( event ) {
4707.
        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
4708.
      };
4709.
 
4710.
    jQuery.event.special[ fix ] = {
4711.
      setup: function() {
4712.
        var doc = this.ownerDocument || this,
4713.
          attaches = data_priv.access( doc, fix );
4714.
 
4715.
        if ( !attaches ) {
4716.
          doc.addEventListener( orig, handler, true );
4717.
        }
4718.
        data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
4719.
      },
4720.
      teardown: function() {
4721.
        var doc = this.ownerDocument || this,
4722.
          attaches = data_priv.access( doc, fix ) - 1;
4723.
 
4724.
        if ( !attaches ) {
4725.
          doc.removeEventListener( orig, handler, true );
4726.
          data_priv.remove( doc, fix );
4727.
 
4728.
        } else {
4729.
          data_priv.access( doc, fix, attaches );
4730.
        }
4731.
      }
4732.
    };
4733.
  });
4734.
}
4735.
 
4736.
jQuery.fn.extend({
4737.
 
4738.
  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
4739.
    var origFn, type;
4740.
 
4741.
    // Types can be a map of types/handlers
4742.
    if ( typeof types === "object" ) {
4743.
      // ( types-Object, selector, data )
4744.
      if ( typeof selector !== "string" ) {
4745.
        // ( types-Object, data )
4746.
        data = data || selector;
4747.
        selector = undefined;
4748.
      }
4749.
      for ( type in types ) {
4750.
        this.on( type, selector, data, types[ type ], one );
4751.
      }
4752.
      return this;
4753.
    }
4754.
 
4755.
    if ( data == null && fn == null ) {
4756.
      // ( types, fn )
4757.
      fn = selector;
4758.
      data = selector = undefined;
4759.
    } else if ( fn == null ) {
4760.
      if ( typeof selector === "string" ) {
4761.
        // ( types, selector, fn )
4762.
        fn = data;
4763.
        data = undefined;
4764.
      } else {
4765.
        // ( types, data, fn )
4766.
        fn = data;
4767.
        data = selector;
4768.
        selector = undefined;
4769.
      }
4770.
    }
4771.
    if ( fn === false ) {
4772.
      fn = returnFalse;
4773.
    } else if ( !fn ) {
4774.
      return this;
4775.
    }
4776.
 
4777.
    if ( one === 1 ) {
4778.
      origFn = fn;
4779.
      fn = function( event ) {
4780.
        // Can use an empty set, since event contains the info
4781.
        jQuery().off( event );
4782.
        return origFn.apply( this, arguments );
4783.
      };
4784.
      // Use same guid so caller can remove using origFn
4785.
      fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4786.
    }
4787.
    return this.each( function() {
4788.
      jQuery.event.add( this, types, fn, data, selector );
4789.
    });
4790.
  },
4791.
  one: function( types, selector, data, fn ) {
4792.
    return this.on( types, selector, data, fn, 1 );
4793.
  },
4794.
  off: function( types, selector, fn ) {
4795.
    var handleObj, type;
4796.
    if ( types && types.preventDefault && types.handleObj ) {
4797.
      // ( event )  dispatched jQuery.Event
4798.
      handleObj = types.handleObj;
4799.
      jQuery( types.delegateTarget ).off(
4800.
        handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
4801.
        handleObj.selector,
4802.
        handleObj.handler
4803.
      );
4804.
      return this;
4805.
    }
4806.
    if ( typeof types === "object" ) {
4807.
      // ( types-object [, selector] )
4808.
      for ( type in types ) {
4809.
        this.off( type, selector, types[ type ] );
4810.
      }
4811.
      return this;
4812.
    }
4813.
    if ( selector === false || typeof selector === "function" ) {
4814.
      // ( types [, fn] )
4815.
      fn = selector;
4816.
      selector = undefined;
4817.
    }
4818.
    if ( fn === false ) {
4819.
      fn = returnFalse;
4820.
    }
4821.
    return this.each(function() {
4822.
      jQuery.event.remove( this, types, fn, selector );
4823.
    });
4824.
  },
4825.
 
4826.
  trigger: function( type, data ) {
4827.
    return this.each(function() {
4828.
      jQuery.event.trigger( type, data, this );
4829.
    });
4830.
  },
4831.
  triggerHandler: function( type, data ) {
4832.
    var elem = this[0];
4833.
    if ( elem ) {
4834.
      return jQuery.event.trigger( type, data, elem, true );
4835.
    }
4836.
  }
4837.
});
4838.
 
4839.
 
4840.
var
4841.
  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
4842.
  rtagName = /<([\w:]+)/,
4843.
  rhtml = /<|&#?\w+;/,
4844.
  rnoInnerhtml = /<(?:script|style|link)/i,
4845.
  // checked="checked" or checked
4846.
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
4847.
  rscriptType = /^$|\/(?:java|ecma)script/i,
4848.
  rscriptTypeMasked = /^true\/(.*)/,
4849.
  rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
4850.
 
4851.
  // We have to close these tags to support XHTML (#13200)
4852.
  wrapMap = {
4853.
 
4854.
    // Support: IE 9
4855.
    option: [ 1, "<select multiple='multiple'>", "</select>" ],
4856.
 
4857.
    thead: [ 1, "<table>", "</table>" ],
4858.
    col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4859.
    tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4860.
    td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4861.
 
4862.
    _default: [ 0, "", "" ]
4863.
  };
4864.
 
4865.
// Support: IE 9
4866.
wrapMap.optgroup = wrapMap.option;
4867.
 
4868.
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4869.
wrapMap.th = wrapMap.td;
4870.
 
4871.
// Support: 1.x compatibility
4872.
// Manipulating tables requires a tbody
4873.
function manipulationTarget( elem, content ) {
4874.
  return jQuery.nodeName( elem, "table" ) &&
4875.
    jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
4876.
 
4877.
    elem.getElementsByTagName("tbody")[0] ||
4878.
      elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
4879.
    elem;
4880.
}
4881.
 
4882.
// Replace/restore the type attribute of script elements for safe DOM manipulation
4883.
function disableScript( elem ) {
4884.
  elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
4885.
  return elem;
4886.
}
4887.
function restoreScript( elem ) {
4888.
  var match = rscriptTypeMasked.exec( elem.type );
4889.
 
4890.
  if ( match ) {
4891.
    elem.type = match[ 1 ];
4892.
  } else {
4893.
    elem.removeAttribute("type");
4894.
  }
4895.
 
4896.
  return elem;
4897.
}
4898.
 
4899.
// Mark scripts as having already been evaluated
4900.
function setGlobalEval( elems, refElements ) {
4901.
  var i = 0,
4902.
    l = elems.length;
4903.
 
4904.
  for ( ; i < l; i++ ) {
4905.
    data_priv.set(
4906.
      elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
4907.
    );
4908.
  }
4909.
}
4910.
 
4911.
function cloneCopyEvent( src, dest ) {
4912.
  var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
4913.
 
4914.
  if ( dest.nodeType !== 1 ) {
4915.
    return;
4916.
  }
4917.
 
4918.
  // 1. Copy private data: events, handlers, etc.
4919.
  if ( data_priv.hasData( src ) ) {
4920.
    pdataOld = data_priv.access( src );
4921.
    pdataCur = data_priv.set( dest, pdataOld );
4922.
    events = pdataOld.events;
4923.
 
4924.
    if ( events ) {
4925.
      delete pdataCur.handle;
4926.
      pdataCur.events = {};
4927.
 
4928.
      for ( type in events ) {
4929.
        for ( i = 0, l = events[ type ].length; i < l; i++ ) {
4930.
          jQuery.event.add( dest, type, events[ type ][ i ] );
4931.
        }
4932.
      }
4933.
    }
4934.
  }
4935.
 
4936.
  // 2. Copy user data
4937.
  if ( data_user.hasData( src ) ) {
4938.
    udataOld = data_user.access( src );
4939.
    udataCur = jQuery.extend( {}, udataOld );
4940.
 
4941.
    data_user.set( dest, udataCur );
4942.
  }
4943.
}
4944.
 
4945.
function getAll( context, tag ) {
4946.
  var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
4947.
      context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
4948.
      [];
4949.
 
4950.
  return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
4951.
    jQuery.merge( [ context ], ret ) :
4952.
    ret;
4953.
}
4954.
 
4955.
// Support: IE >= 9
4956.
function fixInput( src, dest ) {
4957.
  var nodeName = dest.nodeName.toLowerCase();
4958.
 
4959.
  // Fails to persist the checked state of a cloned checkbox or radio button.
4960.
  if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
4961.
    dest.checked = src.checked;
4962.
 
4963.
  // Fails to return the selected option to the default selected state when cloning options
4964.
  } else if ( nodeName === "input" || nodeName === "textarea" ) {
4965.
    dest.defaultValue = src.defaultValue;
4966.
  }
4967.
}
4968.
 
4969.
jQuery.extend({
4970.
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
4971.
    var i, l, srcElements, destElements,
4972.
      clone = elem.cloneNode( true ),
4973.
      inPage = jQuery.contains( elem.ownerDocument, elem );
4974.
 
4975.
    // Support: IE >= 9
4976.
    // Fix Cloning issues
4977.
    if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
4978.
        !jQuery.isXMLDoc( elem ) ) {
4979.
 
4980.
      // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
4981.
      destElements = getAll( clone );
4982.
      srcElements = getAll( elem );
4983.
 
4984.
      for ( i = 0, l = srcElements.length; i < l; i++ ) {
4985.
        fixInput( srcElements[ i ], destElements[ i ] );
4986.
      }
4987.
    }
4988.
 
4989.
    // Copy the events from the original to the clone
4990.
    if ( dataAndEvents ) {
4991.
      if ( deepDataAndEvents ) {
4992.
        srcElements = srcElements || getAll( elem );
4993.
        destElements = destElements || getAll( clone );
4994.
 
4995.
        for ( i = 0, l = srcElements.length; i < l; i++ ) {
4996.
          cloneCopyEvent( srcElements[ i ], destElements[ i ] );
4997.
        }
4998.
      } else {
4999.
        cloneCopyEvent( elem, clone );
5000.
      }
5001.
    }
5002.
 
5003.
    // Preserve script evaluation history
5004.
    destElements = getAll( clone, "script" );
5005.
    if ( destElements.length > 0 ) {
5006.
      setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5007.
    }
5008.
 
5009.
    // Return the cloned set
5010.
    return clone;
5011.
  },
5012.
 
5013.
  buildFragment: function( elems, context, scripts, selection ) {
5014.
    var elem, tmp, tag, wrap, contains, j,
5015.
      fragment = context.createDocumentFragment(),
5016.
      nodes = [],
5017.
      i = 0,
5018.
      l = elems.length;
5019.
 
5020.
    for ( ; i < l; i++ ) {
5021.
      elem = elems[ i ];
5022.
 
5023.
      if ( elem || elem === 0 ) {
5024.
 
5025.
        // Add nodes directly
5026.
        if ( jQuery.type( elem ) === "object" ) {
5027.
          // Support: QtWebKit
5028.
          // jQuery.merge because push.apply(_, arraylike) throws
5029.
          jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5030.
 
5031.
        // Convert non-html into a text node
5032.
        } else if ( !rhtml.test( elem ) ) {
5033.
          nodes.push( context.createTextNode( elem ) );
5034.
 
5035.
        // Convert html into DOM nodes
5036.
        } else {
5037.
          tmp = tmp || fragment.appendChild( context.createElement("div") );
5038.
 
5039.
          // Deserialize a standard representation
5040.
          tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
5041.
          wrap = wrapMap[ tag ] || wrapMap._default;
5042.
          tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
5043.
 
5044.
          // Descend through wrappers to the right content
5045.
          j = wrap[ 0 ];
5046.
          while ( j-- ) {
5047.
            tmp = tmp.lastChild;
5048.
          }
5049.
 
5050.
          // Support: QtWebKit
5051.
          // jQuery.merge because push.apply(_, arraylike) throws
5052.
          jQuery.merge( nodes, tmp.childNodes );
5053.
 
5054.
          // Remember the top-level container
5055.
          tmp = fragment.firstChild;
5056.
 
5057.
          // Fixes #12346
5058.
          // Support: Webkit, IE
5059.
          tmp.textContent = "";
5060.
        }
5061.
      }
5062.
    }
5063.
 
5064.
    // Remove wrapper from fragment
5065.
    fragment.textContent = "";
5066.
 
5067.
    i = 0;
5068.
    while ( (elem = nodes[ i++ ]) ) {
5069.
 
5070.
      // #4087 - If origin and destination elements are the same, and this is
5071.
      // that element, do not do anything
5072.
      if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
5073.
        continue;
5074.
      }
5075.
 
5076.
      contains = jQuery.contains( elem.ownerDocument, elem );
5077.
 
5078.
      // Append to fragment
5079.
      tmp = getAll( fragment.appendChild( elem ), "script" );
5080.
 
5081.
      // Preserve script evaluation history
5082.
      if ( contains ) {
5083.
        setGlobalEval( tmp );
5084.
      }
5085.
 
5086.
      // Capture executables
5087.
      if ( scripts ) {
5088.
        j = 0;
5089.
        while ( (elem = tmp[ j++ ]) ) {
5090.
          if ( rscriptType.test( elem.type || "" ) ) {
5091.
            scripts.push( elem );
5092.
          }
5093.
        }
5094.
      }
5095.
    }
5096.
 
5097.
    return fragment;
5098.
  },
5099.
 
5100.
  cleanData: function( elems ) {
5101.
    var data, elem, events, type, key, j,
5102.
      special = jQuery.event.special,
5103.
      i = 0;
5104.
 
5105.
    for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
5106.
      if ( jQuery.acceptData( elem ) ) {
5107.
        key = elem[ data_priv.expando ];
5108.
 
5109.
        if ( key && (data = data_priv.cache[ key ]) ) {
5110.
          events = Object.keys( data.events || {} );
5111.
          if ( events.length ) {
5112.
            for ( j = 0; (type = events[j]) !== undefined; j++ ) {
5113.
              if ( special[ type ] ) {
5114.
                jQuery.event.remove( elem, type );
5115.
 
5116.
              // This is a shortcut to avoid jQuery.event.remove's overhead
5117.
              } else {
5118.
                jQuery.removeEvent( elem, type, data.handle );
5119.
              }
5120.
            }
5121.
          }
5122.
          if ( data_priv.cache[ key ] ) {
5123.
            // Discard any remaining `private` data
5124.
            delete data_priv.cache[ key ];
5125.
          }
5126.
        }
5127.
      }
5128.
      // Discard any remaining `user` data
5129.
      delete data_user.cache[ elem[ data_user.expando ] ];
5130.
    }
5131.
  }
5132.
});
5133.
 
5134.
jQuery.fn.extend({
5135.
  text: function( value ) {
5136.
    return access( this, function( value ) {
5137.
      return value === undefined ?
5138.
        jQuery.text( this ) :
5139.
        this.empty().each(function() {
5140.
          if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5141.
            this.textContent = value;
5142.
          }
5143.
        });
5144.
    }, null, value, arguments.length );
5145.
  },
5146.
 
5147.
  append: function() {
5148.
    return this.domManip( arguments, function( elem ) {
5149.
      if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5150.
        var target = manipulationTarget( this, elem );
5151.
        target.appendChild( elem );
5152.
      }
5153.
    });
5154.
  },
5155.
 
5156.
  prepend: function() {
5157.
    return this.domManip( arguments, function( elem ) {
5158.
      if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5159.
        var target = manipulationTarget( this, elem );
5160.
        target.insertBefore( elem, target.firstChild );
5161.
      }
5162.
    });
5163.
  },
5164.
 
5165.
  before: function() {
5166.
    return this.domManip( arguments, function( elem ) {
5167.
      if ( this.parentNode ) {
5168.
        this.parentNode.insertBefore( elem, this );
5169.
      }
5170.
    });
5171.
  },
5172.
 
5173.
  after: function() {
5174.
    return this.domManip( arguments, function( elem ) {
5175.
      if ( this.parentNode ) {
5176.
        this.parentNode.insertBefore( elem, this.nextSibling );
5177.
      }
5178.
    });
5179.
  },
5180.
 
5181.
  remove: function( selector, keepData /* Internal Use Only */ ) {
5182.
    var elem,
5183.
      elems = selector ? jQuery.filter( selector, this ) : this,
5184.
      i = 0;
5185.
 
5186.
    for ( ; (elem = elems[i]) != null; i++ ) {
5187.
      if ( !keepData && elem.nodeType === 1 ) {
5188.
        jQuery.cleanData( getAll( elem ) );
5189.
      }
5190.
 
5191.
      if ( elem.parentNode ) {
5192.
        if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5193.
          setGlobalEval( getAll( elem, "script" ) );
5194.
        }
5195.
        elem.parentNode.removeChild( elem );
5196.
      }
5197.
    }
5198.
 
5199.
    return this;
5200.
  },
5201.
 
5202.
  empty: function() {
5203.
    var elem,
5204.
      i = 0;
5205.
 
5206.
    for ( ; (elem = this[i]) != null; i++ ) {
5207.
      if ( elem.nodeType === 1 ) {
5208.
 
5209.
        // Prevent memory leaks
5210.
        jQuery.cleanData( getAll( elem, false ) );
5211.
 
5212.
        // Remove any remaining nodes
5213.
        elem.textContent = "";
5214.
      }
5215.
    }
5216.
 
5217.
    return this;
5218.
  },
5219.
 
5220.
  clone: function( dataAndEvents, deepDataAndEvents ) {
5221.
    dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5222.
    deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5223.
 
5224.
    return this.map(function() {
5225.
      return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5226.
    });
5227.
  },
5228.
 
5229.
  html: function( value ) {
5230.
    return access( this, function( value ) {
5231.
      var elem = this[ 0 ] || {},
5232.
        i = 0,
5233.
        l = this.length;
5234.
 
5235.
      if ( value === undefined && elem.nodeType === 1 ) {
5236.
        return elem.innerHTML;
5237.
      }
5238.
 
5239.
      // See if we can take a shortcut and just use innerHTML
5240.
      if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5241.
        !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
5242.
 
5243.
        value = value.replace( rxhtmlTag, "<$1></$2>" );
5244.
 
5245.
        try {
5246.
          for ( ; i < l; i++ ) {
5247.
            elem = this[ i ] || {};
5248.
 
5249.
            // Remove element nodes and prevent memory leaks
5250.
            if ( elem.nodeType === 1 ) {
5251.
              jQuery.cleanData( getAll( elem, false ) );
5252.
              elem.innerHTML = value;
5253.
            }
5254.
          }
5255.
 
5256.
          elem = 0;
5257.
 
5258.
        // If using innerHTML throws an exception, use the fallback method
5259.
        } catch( e ) {}
5260.
      }
5261.
 
5262.
      if ( elem ) {
5263.
        this.empty().append( value );
5264.
      }
5265.
    }, null, value, arguments.length );
5266.
  },
5267.
 
5268.
  replaceWith: function() {
5269.
    var arg = arguments[ 0 ];
5270.
 
5271.
    // Make the changes, replacing each context element with the new content
5272.
    this.domManip( arguments, function( elem ) {
5273.
      arg = this.parentNode;
5274.
 
5275.
      jQuery.cleanData( getAll( this ) );
5276.
 
5277.
      if ( arg ) {
5278.
        arg.replaceChild( elem, this );
5279.
      }
5280.
    });
5281.
 
5282.
    // Force removal if there was no new content (e.g., from empty arguments)
5283.
    return arg && (arg.length || arg.nodeType) ? this : this.remove();
5284.
  },
5285.
 
5286.
  detach: function( selector ) {
5287.
    return this.remove( selector, true );
5288.
  },
5289.
 
5290.
  domManip: function( args, callback ) {
5291.
 
5292.
    // Flatten any nested arrays
5293.
    args = concat.apply( [], args );
5294.
 
5295.
    var fragment, first, scripts, hasScripts, node, doc,
5296.
      i = 0,
5297.
      l = this.length,
5298.
      set = this,
5299.
      iNoClone = l - 1,
5300.
      value = args[ 0 ],
5301.
      isFunction = jQuery.isFunction( value );
5302.
 
5303.
    // We can't cloneNode fragments that contain checked, in WebKit
5304.
    if ( isFunction ||
5305.
        ( l > 1 && typeof value === "string" &&
5306.
          !support.checkClone && rchecked.test( value ) ) ) {
5307.
      return this.each(function( index ) {
5308.
        var self = set.eq( index );
5309.
        if ( isFunction ) {
5310.
          args[ 0 ] = value.call( this, index, self.html() );
5311.
        }
5312.
        self.domManip( args, callback );
5313.
      });
5314.
    }
5315.
 
5316.
    if ( l ) {
5317.
      fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
5318.
      first = fragment.firstChild;
5319.
 
5320.
      if ( fragment.childNodes.length === 1 ) {
5321.
        fragment = first;
5322.
      }
5323.
 
5324.
      if ( first ) {
5325.
        scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5326.
        hasScripts = scripts.length;
5327.
 
5328.
        // Use the original fragment for the last item instead of the first because it can end up
5329.
        // being emptied incorrectly in certain situations (#8070).
5330.
        for ( ; i < l; i++ ) {
5331.
          node = fragment;
5332.
 
5333.
          if ( i !== iNoClone ) {
5334.
            node = jQuery.clone( node, true, true );
5335.
 
5336.
            // Keep references to cloned scripts for later restoration
5337.
            if ( hasScripts ) {
5338.
              // Support: QtWebKit
5339.
              // jQuery.merge because push.apply(_, arraylike) throws
5340.
              jQuery.merge( scripts, getAll( node, "script" ) );
5341.
            }
5342.
          }
5343.
 
5344.
          callback.call( this[ i ], node, i );
5345.
        }
5346.
 
5347.
        if ( hasScripts ) {
5348.
          doc = scripts[ scripts.length - 1 ].ownerDocument;
5349.
 
5350.
          // Reenable scripts
5351.
          jQuery.map( scripts, restoreScript );
5352.
 
5353.
          // Evaluate executable scripts on first document insertion
5354.
          for ( i = 0; i < hasScripts; i++ ) {
5355.
            node = scripts[ i ];
5356.
            if ( rscriptType.test( node.type || "" ) &&
5357.
              !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
5358.
 
5359.
              if ( node.src ) {
5360.
                // Optional AJAX dependency, but won't run scripts if not present
5361.
                if ( jQuery._evalUrl ) {
5362.
                  jQuery._evalUrl( node.src );
5363.
                }
5364.
              } else {
5365.
                jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
5366.
              }
5367.
            }
5368.
          }
5369.
        }
5370.
      }
5371.
    }
5372.
 
5373.
    return this;
5374.
  }
5375.
});
5376.
 
5377.
jQuery.each({
5378.
  appendTo: "append",
5379.
  prependTo: "prepend",
5380.
  insertBefore: "before",
5381.
  insertAfter: "after",
5382.
  replaceAll: "replaceWith"
5383.
}, function( name, original ) {
5384.
  jQuery.fn[ name ] = function( selector ) {
5385.
    var elems,
5386.
      ret = [],
5387.
      insert = jQuery( selector ),
5388.
      last = insert.length - 1,
5389.
      i = 0;
5390.
 
5391.
    for ( ; i <= last; i++ ) {
5392.
      elems = i === last ? this : this.clone( true );
5393.
      jQuery( insert[ i ] )[ original ]( elems );
5394.
 
5395.
      // Support: QtWebKit
5396.
      // .get() because push.apply(_, arraylike) throws
5397.
      push.apply( ret, elems.get() );
5398.
    }
5399.
 
5400.
    return this.pushStack( ret );
5401.
  };
5402.
});
5403.
 
5404.
 
5405.
var iframe,
5406.
  elemdisplay = {};
5407.
 
5408.
/**
5409.
 * Retrieve the actual display of a element
5410.
 * @param {String} name nodeName of the element
5411.
 * @param {Object} doc Document object
5412.
 */
5413.
// Called only from within defaultDisplay
5414.
function actualDisplay( name, doc ) {
5415.
  var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
5416.
 
5417.
    // getDefaultComputedStyle might be reliably used only on attached element
5418.
    display = window.getDefaultComputedStyle ?
5419.
 
5420.
      // Use of this method is a temporary fix (more like optmization) until something better comes along,
5421.
      // since it was removed from specification and supported only in FF
5422.
      window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" );
5423.
 
5424.
  // We don't have any data stored on the element,
5425.
  // so use "detach" method as fast way to get rid of the element
5426.
  elem.detach();
5427.
 
5428.
  return display;
5429.
}
5430.
 
5431.
/**
5432.
 * Try to determine the default display value of an element
5433.
 * @param {String} nodeName
5434.
 */
5435.
function defaultDisplay( nodeName ) {
5436.
  var doc = document,
5437.
    display = elemdisplay[ nodeName ];
5438.
 
5439.
  if ( !display ) {
5440.
    display = actualDisplay( nodeName, doc );
5441.
 
5442.
    // If the simple way fails, read from inside an iframe
5443.
    if ( display === "none" || !display ) {
5444.
 
5445.
      // Use the already-created iframe if possible
5446.
      iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
5447.
 
5448.
      // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
5449.
      doc = iframe[ 0 ].contentDocument;
5450.
 
5451.
      // Support: IE
5452.
      doc.write();
5453.
      doc.close();
5454.
 
5455.
      display = actualDisplay( nodeName, doc );
5456.
      iframe.detach();
5457.
    }
5458.
 
5459.
    // Store the correct default display
5460.
    elemdisplay[ nodeName ] = display;
5461.
  }
5462.
 
5463.
  return display;
5464.
}
5465.
var rmargin = (/^margin/);
5466.
 
5467.
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
5468.
 
5469.
var getStyles = function( elem ) {
5470.
    return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
5471.
  };
5472.
 
5473.
 
5474.
 
5475.
function curCSS( elem, name, computed ) {
5476.
  var width, minWidth, maxWidth, ret,
5477.
    style = elem.style;
5478.
 
5479.
  computed = computed || getStyles( elem );
5480.
 
5481.
  // Support: IE9
5482.
  // getPropertyValue is only needed for .css('filter') in IE9, see #12537
5483.
  if ( computed ) {
5484.
    ret = computed.getPropertyValue( name ) || computed[ name ];
5485.
  }
5486.
 
5487.
  if ( computed ) {
5488.
 
5489.
    if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
5490.
      ret = jQuery.style( elem, name );
5491.
    }
5492.
 
5493.
    // Support: iOS < 6
5494.
    // A tribute to the "awesome hack by Dean Edwards"
5495.
    // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
5496.
    // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
5497.
    if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
5498.
 
5499.
      // Remember the original values
5500.
      width = style.width;
5501.
      minWidth = style.minWidth;
5502.
      maxWidth = style.maxWidth;
5503.
 
5504.
      // Put in the new values to get a computed value out
5505.
      style.minWidth = style.maxWidth = style.width = ret;
5506.
      ret = computed.width;
5507.
 
5508.
      // Revert the changed values
5509.
      style.width = width;
5510.
      style.minWidth = minWidth;
5511.
      style.maxWidth = maxWidth;
5512.
    }
5513.
  }
5514.
 
5515.
  return ret !== undefined ?
5516.
    // Support: IE
5517.
    // IE returns zIndex value as an integer.
5518.
    ret + "" :
5519.
    ret;
5520.
}
5521.
 
5522.
 
5523.
function addGetHookIf( conditionFn, hookFn ) {
5524.
  // Define the hook, we'll check on the first run if it's really needed.
5525.
  return {
5526.
    get: function() {
5527.
      if ( conditionFn() ) {
5528.
        // Hook not needed (or it's not possible to use it due to missing dependency),
5529.
        // remove it.
5530.
        // Since there are no other hooks for marginRight, remove the whole object.
5531.
        delete this.get;
5532.
        return;
5533.
      }
5534.
 
5535.
      // Hook needed; redefine it so that the support test is not executed again.
5536.
 
5537.
      return (this.get = hookFn).apply( this, arguments );
5538.
    }
5539.
  };
5540.
}
5541.
 
5542.
 
5543.
(function() {
5544.
  var pixelPositionVal, boxSizingReliableVal,
5545.
    // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
5546.
    divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;" +
5547.
      "-moz-box-sizing:content-box;box-sizing:content-box",
5548.
    docElem = document.documentElement,
5549.
    container = document.createElement( "div" ),
5550.
    div = document.createElement( "div" );
5551.
 
5552.
  div.style.backgroundClip = "content-box";
5553.
  div.cloneNode( true ).style.backgroundClip = "";
5554.
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
5555.
 
5556.
  container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;" +
5557.
    "margin-top:1px";
5558.
  container.appendChild( div );
5559.
 
5560.
  // Executing both pixelPosition & boxSizingReliable tests require only one layout
5561.
  // so they're executed at the same time to save the second computation.
5562.
  function computePixelPositionAndBoxSizingReliable() {
5563.
    // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).
5564.
    div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
5565.
      "box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;" +
5566.
      "position:absolute;top:1%";
5567.
    docElem.appendChild( container );
5568.
 
5569.
    var divStyle = window.getComputedStyle( div, null );
5570.
    pixelPositionVal = divStyle.top !== "1%";
5571.
    boxSizingReliableVal = divStyle.width === "4px";
5572.
 
5573.
    docElem.removeChild( container );
5574.
  }
5575.
 
5576.
  // Use window.getComputedStyle because jsdom on node.js will break without it.
5577.
  if ( window.getComputedStyle ) {
5578.
    jQuery.extend(support, {
5579.
      pixelPosition: function() {
5580.
        // This test is executed only once but we still do memoizing
5581.
        // since we can use the boxSizingReliable pre-computing.
5582.
        // No need to check if the test was already performed, though.
5583.
        computePixelPositionAndBoxSizingReliable();
5584.
        return pixelPositionVal;
5585.
      },
5586.
      boxSizingReliable: function() {
5587.
        if ( boxSizingReliableVal == null ) {
5588.
          computePixelPositionAndBoxSizingReliable();
5589.
        }
5590.
        return boxSizingReliableVal;
5591.
      },
5592.
      reliableMarginRight: function() {
5593.
        // Support: Android 2.3
5594.
        // Check if div with explicit width and no margin-right incorrectly
5595.
        // gets computed margin-right based on width of container. (#3333)
5596.
        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
5597.
        // This support function is only executed once so no memoizing is needed.
5598.
        var ret,
5599.
          marginDiv = div.appendChild( document.createElement( "div" ) );
5600.
        marginDiv.style.cssText = div.style.cssText = divReset;
5601.
        marginDiv.style.marginRight = marginDiv.style.width = "0";
5602.
        div.style.width = "1px";
5603.
        docElem.appendChild( container );
5604.
 
5605.
        ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
5606.
 
5607.
        docElem.removeChild( container );
5608.
 
5609.
        // Clean up the div for other support tests.
5610.
        div.innerHTML = "";
5611.
 
5612.
        return ret;
5613.
      }
5614.
    });
5615.
  }
5616.
})();
5617.
 
5618.
 
5619.
// A method for quickly swapping in/out CSS properties to get correct calculations.
5620.
jQuery.swap = function( elem, options, callback, args ) {
5621.
  var ret, name,
5622.
    old = {};
5623.
 
5624.
  // Remember the old values, and insert the new ones
5625.
  for ( name in options ) {
5626.
    old[ name ] = elem.style[ name ];
5627.
    elem.style[ name ] = options[ name ];
5628.
  }
5629.
 
5630.
  ret = callback.apply( elem, args || [] );
5631.
 
5632.
  // Revert the old values
5633.
  for ( name in options ) {
5634.
    elem.style[ name ] = old[ name ];
5635.
  }
5636.
 
5637.
  return ret;
5638.
};
5639.
 
5640.
 
5641.
var
5642.
  // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
5643.
  // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
5644.
  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
5645.
  rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
5646.
  rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
5647.
 
5648.
  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
5649.
  cssNormalTransform = {
5650.
    letterSpacing: 0,
5651.
    fontWeight: 400
5652.
  },
5653.
 
5654.
  cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
5655.
 
5656.
// return a css property mapped to a potentially vendor prefixed property
5657.
function vendorPropName( style, name ) {
5658.
 
5659.
  // shortcut for names that are not vendor prefixed
5660.
  if ( name in style ) {
5661.
    return name;
5662.
  }
5663.
 
5664.
  // check for vendor prefixed names
5665.
  var capName = name[0].toUpperCase() + name.slice(1),
5666.
    origName = name,
5667.
    i = cssPrefixes.length;
5668.
 
5669.
  while ( i-- ) {
5670.
    name = cssPrefixes[ i ] + capName;
5671.
    if ( name in style ) {
5672.
      return name;
5673.
    }
5674.
  }
5675.
 
5676.
  return origName;
5677.
}
5678.
 
5679.
function setPositiveNumber( elem, value, subtract ) {
5680.
  var matches = rnumsplit.exec( value );
5681.
  return matches ?
5682.
    // Guard against undefined "subtract", e.g., when used as in cssHooks
5683.
    Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
5684.
    value;
5685.
}
5686.
 
5687.
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
5688.
  var i = extra === ( isBorderBox ? "border" : "content" ) ?
5689.
    // If we already have the right measurement, avoid augmentation
5690.
    4 :
5691.
    // Otherwise initialize for horizontal or vertical properties
5692.
    name === "width" ? 1 : 0,
5693.
 
5694.
    val = 0;
5695.
 
5696.
  for ( ; i < 4; i += 2 ) {
5697.
    // both box models exclude margin, so add it if we want it
5698.
    if ( extra === "margin" ) {
5699.
      val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
5700.
    }
5701.
 
5702.
    if ( isBorderBox ) {
5703.
      // border-box includes padding, so remove it if we want content
5704.
      if ( extra === "content" ) {
5705.
        val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
5706.
      }
5707.
 
5708.
      // at this point, extra isn't border nor margin, so remove border
5709.
      if ( extra !== "margin" ) {
5710.
        val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
5711.
      }
5712.
    } else {
5713.
      // at this point, extra isn't content, so add padding
5714.
      val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
5715.
 
5716.
      // at this point, extra isn't content nor padding, so add border
5717.
      if ( extra !== "padding" ) {
5718.
        val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
5719.
      }
5720.
    }
5721.
  }
5722.
 
5723.
  return val;
5724.
}
5725.
 
5726.
function getWidthOrHeight( elem, name, extra ) {
5727.
 
5728.
  // Start with offset property, which is equivalent to the border-box value
5729.
  var valueIsBorderBox = true,
5730.
    val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
5731.
    styles = getStyles( elem ),
5732.
    isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
5733.
 
5734.
  // some non-html elements return undefined for offsetWidth, so check for null/undefined
5735.
  // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
5736.
  // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
5737.
  if ( val <= 0 || val == null ) {
5738.
    // Fall back to computed then uncomputed css if necessary
5739.
    val = curCSS( elem, name, styles );
5740.
    if ( val < 0 || val == null ) {
5741.
      val = elem.style[ name ];
5742.
    }
5743.
 
5744.
    // Computed unit is not pixels. Stop here and return.
5745.
    if ( rnumnonpx.test(val) ) {
5746.
      return val;
5747.
    }
5748.
 
5749.
    // we need the check for style in case a browser which returns unreliable values
5750.
    // for getComputedStyle silently falls back to the reliable elem.style
5751.
    valueIsBorderBox = isBorderBox &&
5752.
      ( support.boxSizingReliable() || val === elem.style[ name ] );
5753.
 
5754.
    // Normalize "", auto, and prepare for extra
5755.
    val = parseFloat( val ) || 0;
5756.
  }
5757.
 
5758.
  // use the active box-sizing model to add/subtract irrelevant styles
5759.
  return ( val +
5760.
    augmentWidthOrHeight(
5761.
      elem,
5762.
      name,
5763.
      extra || ( isBorderBox ? "border" : "content" ),
5764.
      valueIsBorderBox,
5765.
      styles
5766.
    )
5767.
  ) + "px";
5768.
}
5769.
 
5770.
function showHide( elements, show ) {
5771.
  var display, elem, hidden,
5772.
    values = [],
5773.
    index = 0,
5774.
    length = elements.length;
5775.
 
5776.
  for ( ; index < length; index++ ) {
5777.
    elem = elements[ index ];
5778.
    if ( !elem.style ) {
5779.
      continue;
5780.
    }
5781.
 
5782.
    values[ index ] = data_priv.get( elem, "olddisplay" );
5783.
    display = elem.style.display;
5784.
    if ( show ) {
5785.
      // Reset the inline display of this element to learn if it is
5786.
      // being hidden by cascaded rules or not
5787.
      if ( !values[ index ] && display === "none" ) {
5788.
        elem.style.display = "";
5789.
      }
5790.
 
5791.
      // Set elements which have been overridden with display: none
5792.
      // in a stylesheet to whatever the default browser style is
5793.
      // for such an element
5794.
      if ( elem.style.display === "" && isHidden( elem ) ) {
5795.
        values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
5796.
      }
5797.
    } else {
5798.
 
5799.
      if ( !values[ index ] ) {
5800.
        hidden = isHidden( elem );
5801.
 
5802.
        if ( display && display !== "none" || !hidden ) {
5803.
          data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );
5804.
        }
5805.
      }
5806.
    }
5807.
  }
5808.
 
5809.
  // Set the display of most of the elements in a second loop
5810.
  // to avoid the constant reflow
5811.
  for ( index = 0; index < length; index++ ) {
5812.
    elem = elements[ index ];
5813.
    if ( !elem.style ) {
5814.
      continue;
5815.
    }
5816.
    if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
5817.
      elem.style.display = show ? values[ index ] || "" : "none";
5818.
    }
5819.
  }
5820.
 
5821.
  return elements;
5822.
}
5823.
 
5824.
jQuery.extend({
5825.
  // Add in style property hooks for overriding the default
5826.
  // behavior of getting and setting a style property
5827.
  cssHooks: {
5828.
    opacity: {
5829.
      get: function( elem, computed ) {
5830.
        if ( computed ) {
5831.
          // We should always get a number back from opacity
5832.
          var ret = curCSS( elem, "opacity" );
5833.
          return ret === "" ? "1" : ret;
5834.
        }
5835.
      }
5836.
    }
5837.
  },
5838.
 
5839.
  // Don't automatically add "px" to these possibly-unitless properties
5840.
  cssNumber: {
5841.
    "columnCount": true,
5842.
    "fillOpacity": true,
5843.
    "fontWeight": true,
5844.
    "lineHeight": true,
5845.
    "opacity": true,
5846.
    "order": true,
5847.
    "orphans": true,
5848.
    "widows": true,
5849.
    "zIndex": true,
5850.
    "zoom": true
5851.
  },
5852.
 
5853.
  // Add in properties whose names you wish to fix before
5854.
  // setting or getting the value
5855.
  cssProps: {
5856.
    // normalize float css property
5857.
    "float": "cssFloat"
5858.
  },
5859.
 
5860.
  // Get and set the style property on a DOM Node
5861.
  style: function( elem, name, value, extra ) {
5862.
    // Don't set styles on text and comment nodes
5863.
    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
5864.
      return;
5865.
    }
5866.
 
5867.
    // Make sure that we're working with the right name
5868.
    var ret, type, hooks,
5869.
      origName = jQuery.camelCase( name ),
5870.
      style = elem.style;
5871.
 
5872.
    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
5873.
 
5874.
    // gets hook for the prefixed version
5875.
    // followed by the unprefixed version
5876.
    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
5877.
 
5878.
    // Check if we're setting a value
5879.
    if ( value !== undefined ) {
5880.
      type = typeof value;
5881.
 
5882.
      // convert relative number strings (+= or -=) to relative numbers. #7345
5883.
      if ( type === "string" && (ret = rrelNum.exec( value )) ) {
5884.
        value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
5885.
        // Fixes bug #9237
5886.
        type = "number";
5887.
      }
5888.
 
5889.
      // Make sure that null and NaN values aren't set. See: #7116
5890.
      if ( value == null || value !== value ) {
5891.
        return;
5892.
      }
5893.
 
5894.
      // If a number was passed in, add 'px' to the (except for certain CSS properties)
5895.
      if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
5896.
        value += "px";
5897.
      }
5898.
 
5899.
      // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
5900.
      // but it would mean to define eight (for every problematic property) identical functions
5901.
      if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
5902.
        style[ name ] = "inherit";
5903.
      }
5904.
 
5905.
      // If a hook was provided, use that value, otherwise just set the specified value
5906.
      if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
5907.
        // Support: Chrome, Safari
5908.
        // Setting style to blank string required to delete "style: x !important;"
5909.
        style[ name ] = "";
5910.
        style[ name ] = value;
5911.
      }
5912.
 
5913.
    } else {
5914.
      // If a hook was provided get the non-computed value from there
5915.
      if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
5916.
        return ret;
5917.
      }
5918.
 
5919.
      // Otherwise just get the value from the style object
5920.
      return style[ name ];
5921.
    }
5922.
  },
5923.
 
5924.
  css: function( elem, name, extra, styles ) {
5925.
    var val, num, hooks,
5926.
      origName = jQuery.camelCase( name );
5927.
 
5928.
    // Make sure that we're working with the right name
5929.
    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
5930.
 
5931.
    // gets hook for the prefixed version
5932.
    // followed by the unprefixed version
5933.
    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
5934.
 
5935.
    // If a hook was provided get the computed value from there
5936.
    if ( hooks && "get" in hooks ) {
5937.
      val = hooks.get( elem, true, extra );
5938.
    }
5939.
 
5940.
    // Otherwise, if a way to get the computed value exists, use that
5941.
    if ( val === undefined ) {
5942.
      val = curCSS( elem, name, styles );
5943.
    }
5944.
 
5945.
    //convert "normal" to computed value
5946.
    if ( val === "normal" && name in cssNormalTransform ) {
5947.
      val = cssNormalTransform[ name ];
5948.
    }
5949.
 
5950.
    // Return, converting to number if forced or a qualifier was provided and val looks numeric
5951.
    if ( extra === "" || extra ) {
5952.
      num = parseFloat( val );
5953.
      return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
5954.
    }
5955.
    return val;
5956.
  }
5957.
});
5958.
 
5959.
jQuery.each([ "height", "width" ], function( i, name ) {
5960.
  jQuery.cssHooks[ name ] = {
5961.
    get: function( elem, computed, extra ) {
5962.
      if ( computed ) {
5963.
        // certain elements can have dimension info if we invisibly show them
5964.
        // however, it must have a current display style that would benefit from this
5965.
        return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
5966.
          jQuery.swap( elem, cssShow, function() {
5967.
            return getWidthOrHeight( elem, name, extra );
5968.
          }) :
5969.
          getWidthOrHeight( elem, name, extra );
5970.
      }
5971.
    },
5972.
 
5973.
    set: function( elem, value, extra ) {
5974.
      var styles = extra && getStyles( elem );
5975.
      return setPositiveNumber( elem, value, extra ?
5976.
        augmentWidthOrHeight(
5977.
          elem,
5978.
          name,
5979.
          extra,
5980.
          jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
5981.
          styles
5982.
        ) : 0
5983.
      );
5984.
    }
5985.
  };
5986.
});
5987.
 
5988.
// Support: Android 2.3
5989.
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
5990.
  function( elem, computed ) {
5991.
    if ( computed ) {
5992.
      // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
5993.
      // Work around by temporarily setting element display to inline-block
5994.
      return jQuery.swap( elem, { "display": "inline-block" },
5995.
        curCSS, [ elem, "marginRight" ] );
5996.
    }
5997.
  }
5998.
);
5999.
 
6000.
// These hooks are used by animate to expand properties
6001.
jQuery.each({
6002.
  margin: "",
6003.
  padding: "",
6004.
  border: "Width"
6005.
}, function( prefix, suffix ) {
6006.
  jQuery.cssHooks[ prefix + suffix ] = {
6007.
    expand: function( value ) {
6008.
      var i = 0,
6009.
        expanded = {},
6010.
 
6011.
        // assumes a single number if not a string
6012.
        parts = typeof value === "string" ? value.split(" ") : [ value ];
6013.
 
6014.
      for ( ; i < 4; i++ ) {
6015.
        expanded[ prefix + cssExpand[ i ] + suffix ] =
6016.
          parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6017.
      }
6018.
 
6019.
      return expanded;
6020.
    }
6021.
  };
6022.
 
6023.
  if ( !rmargin.test( prefix ) ) {
6024.
    jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6025.
  }
6026.
});
6027.
 
6028.
jQuery.fn.extend({
6029.
  css: function( name, value ) {
6030.
    return access( this, function( elem, name, value ) {
6031.
      var styles, len,
6032.
        map = {},
6033.
        i = 0;
6034.
 
6035.
      if ( jQuery.isArray( name ) ) {
6036.
        styles = getStyles( elem );
6037.
        len = name.length;
6038.
 
6039.
        for ( ; i < len; i++ ) {
6040.
          map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6041.
        }
6042.
 
6043.
        return map;
6044.
      }
6045.
 
6046.
      return value !== undefined ?
6047.
        jQuery.style( elem, name, value ) :
6048.
        jQuery.css( elem, name );
6049.
    }, name, value, arguments.length > 1 );
6050.
  },
6051.
  show: function() {
6052.
    return showHide( this, true );
6053.
  },
6054.
  hide: function() {
6055.
    return showHide( this );
6056.
  },
6057.
  toggle: function( state ) {
6058.
    if ( typeof state === "boolean" ) {
6059.
      return state ? this.show() : this.hide();
6060.
    }
6061.
 
6062.
    return this.each(function() {
6063.
      if ( isHidden( this ) ) {
6064.
        jQuery( this ).show();
6065.
      } else {
6066.
        jQuery( this ).hide();
6067.
      }
6068.
    });
6069.
  }
6070.
});
6071.
 
6072.
 
6073.
function Tween( elem, options, prop, end, easing ) {
6074.
  return new Tween.prototype.init( elem, options, prop, end, easing );
6075.
}
6076.
jQuery.Tween = Tween;
6077.
 
6078.
Tween.prototype = {
6079.
  constructor: Tween,
6080.
  init: function( elem, options, prop, end, easing, unit ) {
6081.
    this.elem = elem;
6082.
    this.prop = prop;
6083.
    this.easing = easing || "swing";
6084.
    this.options = options;
6085.
    this.start = this.now = this.cur();
6086.
    this.end = end;
6087.
    this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6088.
  },
6089.
  cur: function() {
6090.
    var hooks = Tween.propHooks[ this.prop ];
6091.
 
6092.
    return hooks && hooks.get ?
6093.
      hooks.get( this ) :
6094.
      Tween.propHooks._default.get( this );
6095.
  },
6096.
  run: function( percent ) {
6097.
    var eased,
6098.
      hooks = Tween.propHooks[ this.prop ];
6099.
 
6100.
    if ( this.options.duration ) {
6101.
      this.pos = eased = jQuery.easing[ this.easing ](
6102.
        percent, this.options.duration * percent, 0, 1, this.options.duration
6103.
      );
6104.
    } else {
6105.
      this.pos = eased = percent;
6106.
    }
6107.
    this.now = ( this.end - this.start ) * eased + this.start;
6108.
 
6109.
    if ( this.options.step ) {
6110.
      this.options.step.call( this.elem, this.now, this );
6111.
    }
6112.
 
6113.
    if ( hooks && hooks.set ) {
6114.
      hooks.set( this );
6115.
    } else {
6116.
      Tween.propHooks._default.set( this );
6117.
    }
6118.
    return this;
6119.
  }
6120.
};
6121.
 
6122.
Tween.prototype.init.prototype = Tween.prototype;
6123.
 
6124.
Tween.propHooks = {
6125.
  _default: {
6126.
    get: function( tween ) {
6127.
      var result;
6128.
 
6129.
      if ( tween.elem[ tween.prop ] != null &&
6130.
        (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
6131.
        return tween.elem[ tween.prop ];
6132.
      }
6133.
 
6134.
      // passing an empty string as a 3rd parameter to .css will automatically
6135.
      // attempt a parseFloat and fallback to a string if the parse fails
6136.
      // so, simple values such as "10px" are parsed to Float.
6137.
      // complex values such as "rotate(1rad)" are returned as is.
6138.
      result = jQuery.css( tween.elem, tween.prop, "" );
6139.
      // Empty strings, null, undefined and "auto" are converted to 0.
6140.
      return !result || result === "auto" ? 0 : result;
6141.
    },
6142.
    set: function( tween ) {
6143.
      // use step hook for back compat - use cssHook if its there - use .style if its
6144.
      // available and use plain properties where available
6145.
      if ( jQuery.fx.step[ tween.prop ] ) {
6146.
        jQuery.fx.step[ tween.prop ]( tween );
6147.
      } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
6148.
        jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6149.
      } else {
6150.
        tween.elem[ tween.prop ] = tween.now;
6151.
      }
6152.
    }
6153.
  }
6154.
};
6155.
 
6156.
// Support: IE9
6157.
// Panic based approach to setting things on disconnected nodes
6158.
 
6159.
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6160.
  set: function( tween ) {
6161.
    if ( tween.elem.nodeType && tween.elem.parentNode ) {
6162.
      tween.elem[ tween.prop ] = tween.now;
6163.
    }
6164.
  }
6165.
};
6166.
 
6167.
jQuery.easing = {
6168.
  linear: function( p ) {
6169.
    return p;
6170.
  },
6171.
  swing: function( p ) {
6172.
    return 0.5 - Math.cos( p * Math.PI ) / 2;
6173.
  }
6174.
};
6175.
 
6176.
jQuery.fx = Tween.prototype.init;
6177.
 
6178.
// Back Compat <1.8 extension point
6179.
jQuery.fx.step = {};
6180.
 
6181.
 
6182.
 
6183.
 
6184.
var
6185.
  fxNow, timerId,
6186.
  rfxtypes = /^(?:toggle|show|hide)$/,
6187.
  rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
6188.
  rrun = /queueHooks$/,
6189.
  animationPrefilters = [ defaultPrefilter ],
6190.
  tweeners = {
6191.
    "*": [ function( prop, value ) {
6192.
      var tween = this.createTween( prop, value ),
6193.
        target = tween.cur(),
6194.
        parts = rfxnum.exec( value ),
6195.
        unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
6196.
 
6197.
        // Starting value computation is required for potential unit mismatches
6198.
        start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
6199.
          rfxnum.exec( jQuery.css( tween.elem, prop ) ),
6200.
        scale = 1,
6201.
        maxIterations = 20;
6202.
 
6203.
      if ( start && start[ 3 ] !== unit ) {
6204.
        // Trust units reported by jQuery.css
6205.
        unit = unit || start[ 3 ];
6206.
 
6207.
        // Make sure we update the tween properties later on
6208.
        parts = parts || [];
6209.
 
6210.
        // Iteratively approximate from a nonzero starting point
6211.
        start = +target || 1;
6212.
 
6213.
        do {
6214.
          // If previous iteration zeroed out, double until we get *something*
6215.
          // Use a string for doubling factor so we don't accidentally see scale as unchanged below
6216.
          scale = scale || ".5";
6217.
 
6218.
          // Adjust and apply
6219.
          start = start / scale;
6220.
          jQuery.style( tween.elem, prop, start + unit );
6221.
 
6222.
        // Update scale, tolerating zero or NaN from tween.cur()
6223.
        // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
6224.
        } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
6225.
      }
6226.
 
6227.
      // Update tween properties
6228.
      if ( parts ) {
6229.
        start = tween.start = +start || +target || 0;
6230.
        tween.unit = unit;
6231.
        // If a +=/-= token was provided, we're doing a relative animation
6232.
        tween.end = parts[ 1 ] ?
6233.
          start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
6234.
          +parts[ 2 ];
6235.
      }
6236.
 
6237.
      return tween;
6238.
    } ]
6239.
  };
6240.
 
6241.
// Animations created synchronously will run synchronously
6242.
function createFxNow() {
6243.
  setTimeout(function() {
6244.
    fxNow = undefined;
6245.
  });
6246.
  return ( fxNow = jQuery.now() );
6247.
}
6248.
 
6249.
// Generate parameters to create a standard animation
6250.
function genFx( type, includeWidth ) {
6251.
  var which,
6252.
    i = 0,
6253.
    attrs = { height: type };
6254.
 
6255.
  // if we include width, step value is 1 to do all cssExpand values,
6256.
  // if we don't include width, step value is 2 to skip over Left and Right
6257.
  includeWidth = includeWidth ? 1 : 0;
6258.
  for ( ; i < 4 ; i += 2 - includeWidth ) {
6259.
    which = cssExpand[ i ];
6260.
    attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
6261.
  }
6262.
 
6263.
  if ( includeWidth ) {
6264.
    attrs.opacity = attrs.width = type;
6265.
  }
6266.
 
6267.
  return attrs;
6268.
}
6269.
 
6270.
function createTween( value, prop, animation ) {
6271.
  var tween,
6272.
    collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
6273.
    index = 0,
6274.
    length = collection.length;
6275.
  for ( ; index < length; index++ ) {
6276.
    if ( (tween = collection[ index ].call( animation, prop, value )) ) {
6277.
 
6278.
      // we're done with this property
6279.
      return tween;
6280.
    }
6281.
  }
6282.
}
6283.
 
6284.
function defaultPrefilter( elem, props, opts ) {
6285.
  /* jshint validthis: true */
6286.
  var prop, value, toggle, tween, hooks, oldfire, display,
6287.
    anim = this,
6288.
    orig = {},
6289.
    style = elem.style,
6290.
    hidden = elem.nodeType && isHidden( elem ),
6291.
    dataShow = data_priv.get( elem, "fxshow" );
6292.
 
6293.
  // handle queue: false promises
6294.
  if ( !opts.queue ) {
6295.
    hooks = jQuery._queueHooks( elem, "fx" );
6296.
    if ( hooks.unqueued == null ) {
6297.
      hooks.unqueued = 0;
6298.
      oldfire = hooks.empty.fire;
6299.
      hooks.empty.fire = function() {
6300.
        if ( !hooks.unqueued ) {
6301.
          oldfire();
6302.
        }
6303.
      };
6304.
    }
6305.
    hooks.unqueued++;
6306.
 
6307.
    anim.always(function() {
6308.
      // doing this makes sure that the complete handler will be called
6309.
      // before this completes
6310.
      anim.always(function() {
6311.
        hooks.unqueued--;
6312.
        if ( !jQuery.queue( elem, "fx" ).length ) {
6313.
          hooks.empty.fire();
6314.
        }
6315.
      });
6316.
    });
6317.
  }
6318.
 
6319.
  // height/width overflow pass
6320.
  if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
6321.
    // Make sure that nothing sneaks out
6322.
    // Record all 3 overflow attributes because IE9-10 do not
6323.
    // change the overflow attribute when overflowX and
6324.
    // overflowY are set to the same value
6325.
    opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6326.
 
6327.
    // Set display property to inline-block for height/width
6328.
    // animations on inline elements that are having width/height animated
6329.
    display = jQuery.css( elem, "display" );
6330.
    // Get default display if display is currently "none"
6331.
    if ( display === "none" ) {
6332.
      display = defaultDisplay( elem.nodeName );
6333.
    }
6334.
    if ( display === "inline" &&
6335.
        jQuery.css( elem, "float" ) === "none" ) {
6336.
 
6337.
      style.display = "inline-block";
6338.
    }
6339.
  }
6340.
 
6341.
  if ( opts.overflow ) {
6342.
    style.overflow = "hidden";
6343.
    anim.always(function() {
6344.
      style.overflow = opts.overflow[ 0 ];
6345.
      style.overflowX = opts.overflow[ 1 ];
6346.
      style.overflowY = opts.overflow[ 2 ];
6347.
    });
6348.
  }
6349.
 
6350.
  // show/hide pass
6351.
  for ( prop in props ) {
6352.
    value = props[ prop ];
6353.
    if ( rfxtypes.exec( value ) ) {
6354.
      delete props[ prop ];
6355.
      toggle = toggle || value === "toggle";
6356.
      if ( value === ( hidden ? "hide" : "show" ) ) {
6357.
 
6358.
        // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
6359.
        if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
6360.
          hidden = true;
6361.
        } else {
6362.
          continue;
6363.
        }
6364.
      }
6365.
      orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
6366.
    }
6367.
  }
6368.
 
6369.
  if ( !jQuery.isEmptyObject( orig ) ) {
6370.
    if ( dataShow ) {
6371.
      if ( "hidden" in dataShow ) {
6372.
        hidden = dataShow.hidden;
6373.
      }
6374.
    } else {
6375.
      dataShow = data_priv.access( elem, "fxshow", {} );
6376.
    }
6377.
 
6378.
    // store state if its toggle - enables .stop().toggle() to "reverse"
6379.
    if ( toggle ) {
6380.
      dataShow.hidden = !hidden;
6381.
    }
6382.
    if ( hidden ) {
6383.
      jQuery( elem ).show();
6384.
    } else {
6385.
      anim.done(function() {
6386.
        jQuery( elem ).hide();
6387.
      });
6388.
    }
6389.
    anim.done(function() {
6390.
      var prop;
6391.
 
6392.
      data_priv.remove( elem, "fxshow" );
6393.
      for ( prop in orig ) {
6394.
        jQuery.style( elem, prop, orig[ prop ] );
6395.
      }
6396.
    });
6397.
    for ( prop in orig ) {
6398.
      tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
6399.
 
6400.
      if ( !( prop in dataShow ) ) {
6401.
        dataShow[ prop ] = tween.start;
6402.
        if ( hidden ) {
6403.
          tween.end = tween.start;
6404.
          tween.start = prop === "width" || prop === "height" ? 1 : 0;
6405.
        }
6406.
      }
6407.
    }
6408.
  }
6409.
}
6410.
 
6411.
function propFilter( props, specialEasing ) {
6412.
  var index, name, easing, value, hooks;
6413.
 
6414.
  // camelCase, specialEasing and expand cssHook pass
6415.
  for ( index in props ) {
6416.
    name = jQuery.camelCase( index );
6417.
    easing = specialEasing[ name ];
6418.
    value = props[ index ];
6419.
    if ( jQuery.isArray( value ) ) {
6420.
      easing = value[ 1 ];
6421.
      value = props[ index ] = value[ 0 ];
6422.
    }
6423.
 
6424.
    if ( index !== name ) {
6425.
      props[ name ] = value;
6426.
      delete props[ index ];
6427.
    }
6428.
 
6429.
    hooks = jQuery.cssHooks[ name ];
6430.
    if ( hooks && "expand" in hooks ) {
6431.
      value = hooks.expand( value );
6432.
      delete props[ name ];
6433.
 
6434.
      // not quite $.extend, this wont overwrite keys already present.
6435.
      // also - reusing 'index' from above because we have the correct "name"
6436.
      for ( index in value ) {
6437.
        if ( !( index in props ) ) {
6438.
          props[ index ] = value[ index ];
6439.
          specialEasing[ index ] = easing;
6440.
        }
6441.
      }
6442.
    } else {
6443.
      specialEasing[ name ] = easing;
6444.
    }
6445.
  }
6446.
}
6447.
 
6448.
function Animation( elem, properties, options ) {
6449.
  var result,
6450.
    stopped,
6451.
    index = 0,
6452.
    length = animationPrefilters.length,
6453.
    deferred = jQuery.Deferred().always( function() {
6454.
      // don't match elem in the :animated selector
6455.
      delete tick.elem;
6456.
    }),
6457.
    tick = function() {
6458.
      if ( stopped ) {
6459.
        return false;
6460.
      }
6461.
      var currentTime = fxNow || createFxNow(),
6462.
        remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
6463.
        // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
6464.
        temp = remaining / animation.duration || 0,
6465.
        percent = 1 - temp,
6466.
        index = 0,
6467.
        length = animation.tweens.length;
6468.
 
6469.
      for ( ; index < length ; index++ ) {
6470.
        animation.tweens[ index ].run( percent );
6471.
      }
6472.
 
6473.
      deferred.notifyWith( elem, [ animation, percent, remaining ]);
6474.
 
6475.
      if ( percent < 1 && length ) {
6476.
        return remaining;
6477.
      } else {
6478.
        deferred.resolveWith( elem, [ animation ] );
6479.
        return false;
6480.
      }
6481.
    },
6482.
    animation = deferred.promise({
6483.
      elem: elem,
6484.
      props: jQuery.extend( {}, properties ),
6485.
      opts: jQuery.extend( true, { specialEasing: {} }, options ),
6486.
      originalProperties: properties,
6487.
      originalOptions: options,
6488.
      startTime: fxNow || createFxNow(),
6489.
      duration: options.duration,
6490.
      tweens: [],
6491.
      createTween: function( prop, end ) {
6492.
        var tween = jQuery.Tween( elem, animation.opts, prop, end,
6493.
            animation.opts.specialEasing[ prop ] || animation.opts.easing );
6494.
        animation.tweens.push( tween );
6495.
        return tween;
6496.
      },
6497.
      stop: function( gotoEnd ) {
6498.
        var index = 0,
6499.
          // if we are going to the end, we want to run all the tweens
6500.
          // otherwise we skip this part
6501.
          length = gotoEnd ? animation.tweens.length : 0;
6502.
        if ( stopped ) {
6503.
          return this;
6504.
        }
6505.
        stopped = true;
6506.
        for ( ; index < length ; index++ ) {
6507.
          animation.tweens[ index ].run( 1 );
6508.
        }
6509.
 
6510.
        // resolve when we played the last frame
6511.
        // otherwise, reject
6512.
        if ( gotoEnd ) {
6513.
          deferred.resolveWith( elem, [ animation, gotoEnd ] );
6514.
        } else {
6515.
          deferred.rejectWith( elem, [ animation, gotoEnd ] );
6516.
        }
6517.
        return this;
6518.
      }
6519.
    }),
6520.
    props = animation.props;
6521.
 
6522.
  propFilter( props, animation.opts.specialEasing );
6523.
 
6524.
  for ( ; index < length ; index++ ) {
6525.
    result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
6526.
    if ( result ) {
6527.
      return result;
6528.
    }
6529.
  }
6530.
 
6531.
  jQuery.map( props, createTween, animation );
6532.
 
6533.
  if ( jQuery.isFunction( animation.opts.start ) ) {
6534.
    animation.opts.start.call( elem, animation );
6535.
  }
6536.
 
6537.
  jQuery.fx.timer(
6538.
    jQuery.extend( tick, {
6539.
      elem: elem,
6540.
      anim: animation,
6541.
      queue: animation.opts.queue
6542.
    })
6543.
  );
6544.
 
6545.
  // attach callbacks from options
6546.
  return animation.progress( animation.opts.progress )
6547.
    .done( animation.opts.done, animation.opts.complete )
6548.
    .fail( animation.opts.fail )
6549.
    .always( animation.opts.always );
6550.
}
6551.
 
6552.
jQuery.Animation = jQuery.extend( Animation, {
6553.
 
6554.
  tweener: function( props, callback ) {
6555.
    if ( jQuery.isFunction( props ) ) {
6556.
      callback = props;
6557.
      props = [ "*" ];
6558.
    } else {
6559.
      props = props.split(" ");
6560.
    }
6561.
 
6562.
    var prop,
6563.
      index = 0,
6564.
      length = props.length;
6565.
 
6566.
    for ( ; index < length ; index++ ) {
6567.
      prop = props[ index ];
6568.
      tweeners[ prop ] = tweeners[ prop ] || [];
6569.
      tweeners[ prop ].unshift( callback );
6570.
    }
6571.
  },
6572.
 
6573.
  prefilter: function( callback, prepend ) {
6574.
    if ( prepend ) {
6575.
      animationPrefilters.unshift( callback );
6576.
    } else {
6577.
      animationPrefilters.push( callback );
6578.
    }
6579.
  }
6580.
});
6581.
 
6582.
jQuery.speed = function( speed, easing, fn ) {
6583.
  var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
6584.
    complete: fn || !fn && easing ||
6585.
      jQuery.isFunction( speed ) && speed,
6586.
    duration: speed,
6587.
    easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
6588.
  };
6589.
 
6590.
  opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
6591.
    opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
6592.
 
6593.
  // normalize opt.queue - true/undefined/null -> "fx"
6594.
  if ( opt.queue == null || opt.queue === true ) {
6595.
    opt.queue = "fx";
6596.
  }
6597.
 
6598.
  // Queueing
6599.
  opt.old = opt.complete;
6600.
 
6601.
  opt.complete = function() {
6602.
    if ( jQuery.isFunction( opt.old ) ) {
6603.
      opt.old.call( this );
6604.
    }
6605.
 
6606.
    if ( opt.queue ) {
6607.
      jQuery.dequeue( this, opt.queue );
6608.
    }
6609.
  };
6610.
 
6611.
  return opt;
6612.
};
6613.
 
6614.
jQuery.fn.extend({
6615.
  fadeTo: function( speed, to, easing, callback ) {
6616.
 
6617.
    // show any hidden elements after setting opacity to 0
6618.
    return this.filter( isHidden ).css( "opacity", 0 ).show()
6619.
 
6620.
      // animate to the value specified
6621.
      .end().animate({ opacity: to }, speed, easing, callback );
6622.
  },
6623.
  animate: function( prop, speed, easing, callback ) {
6624.
    var empty = jQuery.isEmptyObject( prop ),
6625.
      optall = jQuery.speed( speed, easing, callback ),
6626.
      doAnimation = function() {
6627.
        // Operate on a copy of prop so per-property easing won't be lost
6628.
        var anim = Animation( this, jQuery.extend( {}, prop ), optall );
6629.
 
6630.
        // Empty animations, or finishing resolves immediately
6631.
        if ( empty || data_priv.get( this, "finish" ) ) {
6632.
          anim.stop( true );
6633.
        }
6634.
      };
6635.
      doAnimation.finish = doAnimation;
6636.
 
6637.
    return empty || optall.queue === false ?
6638.
      this.each( doAnimation ) :
6639.
      this.queue( optall.queue, doAnimation );
6640.
  },
6641.
  stop: function( type, clearQueue, gotoEnd ) {
6642.
    var stopQueue = function( hooks ) {
6643.
      var stop = hooks.stop;
6644.
      delete hooks.stop;
6645.
      stop( gotoEnd );
6646.
    };
6647.
 
6648.
    if ( typeof type !== "string" ) {
6649.
      gotoEnd = clearQueue;
6650.
      clearQueue = type;
6651.
      type = undefined;
6652.
    }
6653.
    if ( clearQueue && type !== false ) {
6654.
      this.queue( type || "fx", [] );
6655.
    }
6656.
 
6657.
    return this.each(function() {
6658.
      var dequeue = true,
6659.
        index = type != null && type + "queueHooks",
6660.
        timers = jQuery.timers,
6661.
        data = data_priv.get( this );
6662.
 
6663.
      if ( index ) {
6664.
        if ( data[ index ] && data[ index ].stop ) {
6665.
          stopQueue( data[ index ] );
6666.
        }
6667.
      } else {
6668.
        for ( index in data ) {
6669.
          if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
6670.
            stopQueue( data[ index ] );
6671.
          }
6672.
        }
6673.
      }
6674.
 
6675.
      for ( index = timers.length; index--; ) {
6676.
        if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
6677.
          timers[ index ].anim.stop( gotoEnd );
6678.
          dequeue = false;
6679.
          timers.splice( index, 1 );
6680.
        }
6681.
      }
6682.
 
6683.
      // start the next in the queue if the last step wasn't forced
6684.
      // timers currently will call their complete callbacks, which will dequeue
6685.
      // but only if they were gotoEnd
6686.
      if ( dequeue || !gotoEnd ) {
6687.
        jQuery.dequeue( this, type );
6688.
      }
6689.
    });
6690.
  },
6691.
  finish: function( type ) {
6692.
    if ( type !== false ) {
6693.
      type = type || "fx";
6694.
    }
6695.
    return this.each(function() {
6696.
      var index,
6697.
        data = data_priv.get( this ),
6698.
        queue = data[ type + "queue" ],
6699.
        hooks = data[ type + "queueHooks" ],
6700.
        timers = jQuery.timers,
6701.
        length = queue ? queue.length : 0;
6702.
 
6703.
      // enable finishing flag on private data
6704.
      data.finish = true;
6705.
 
6706.
      // empty the queue first
6707.
      jQuery.queue( this, type, [] );
6708.
 
6709.
      if ( hooks && hooks.stop ) {
6710.
        hooks.stop.call( this, true );
6711.
      }
6712.
 
6713.
      // look for any active animations, and finish them
6714.
      for ( index = timers.length; index--; ) {
6715.
        if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
6716.
          timers[ index ].anim.stop( true );
6717.
          timers.splice( index, 1 );
6718.
        }
6719.
      }
6720.
 
6721.
      // look for any animations in the old queue and finish them
6722.
      for ( index = 0; index < length; index++ ) {
6723.
        if ( queue[ index ] && queue[ index ].finish ) {
6724.
          queue[ index ].finish.call( this );
6725.
        }
6726.
      }
6727.
 
6728.
      // turn off finishing flag
6729.
      delete data.finish;
6730.
    });
6731.
  }
6732.
});
6733.
 
6734.
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
6735.
  var cssFn = jQuery.fn[ name ];
6736.
  jQuery.fn[ name ] = function( speed, easing, callback ) {
6737.
    return speed == null || typeof speed === "boolean" ?
6738.
      cssFn.apply( this, arguments ) :
6739.
      this.animate( genFx( name, true ), speed, easing, callback );
6740.
  };
6741.
});
6742.
 
6743.
// Generate shortcuts for custom animations
6744.
jQuery.each({
6745.
  slideDown: genFx("show"),
6746.
  slideUp: genFx("hide"),
6747.
  slideToggle: genFx("toggle"),
6748.
  fadeIn: { opacity: "show" },
6749.
  fadeOut: { opacity: "hide" },
6750.
  fadeToggle: { opacity: "toggle" }
6751.
}, function( name, props ) {
6752.
  jQuery.fn[ name ] = function( speed, easing, callback ) {
6753.
    return this.animate( props, speed, easing, callback );
6754.
  };
6755.
});
6756.
 
6757.
jQuery.timers = [];
6758.
jQuery.fx.tick = function() {
6759.
  var timer,
6760.
    i = 0,
6761.
    timers = jQuery.timers;
6762.
 
6763.
  fxNow = jQuery.now();
6764.
 
6765.
  for ( ; i < timers.length; i++ ) {
6766.
    timer = timers[ i ];
6767.
    // Checks the timer has not already been removed
6768.
    if ( !timer() && timers[ i ] === timer ) {
6769.
      timers.splice( i--, 1 );
6770.
    }
6771.
  }
6772.
 
6773.
  if ( !timers.length ) {
6774.
    jQuery.fx.stop();
6775.
  }
6776.
  fxNow = undefined;
6777.
};
6778.
 
6779.
jQuery.fx.timer = function( timer ) {
6780.
  jQuery.timers.push( timer );
6781.
  if ( timer() ) {
6782.
    jQuery.fx.start();
6783.
  } else {
6784.
    jQuery.timers.pop();
6785.
  }
6786.
};
6787.
 
6788.
jQuery.fx.interval = 13;
6789.
 
6790.
jQuery.fx.start = function() {
6791.
  if ( !timerId ) {
6792.
    timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
6793.
  }
6794.
};
6795.
 
6796.
jQuery.fx.stop = function() {
6797.
  clearInterval( timerId );
6798.
  timerId = null;
6799.
};
6800.
 
6801.
jQuery.fx.speeds = {
6802.
  slow: 600,
6803.
  fast: 200,
6804.
  // Default speed
6805.
  _default: 400
6806.
};
6807.
 
6808.
 
6809.
// Based off of the plugin by Clint Helfers, with permission.
6810.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
6811.
jQuery.fn.delay = function( time, type ) {
6812.
  time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
6813.
  type = type || "fx";
6814.
 
6815.
  return this.queue( type, function( next, hooks ) {
6816.
    var timeout = setTimeout( next, time );
6817.
    hooks.stop = function() {
6818.
      clearTimeout( timeout );
6819.
    };
6820.
  });
6821.
};
6822.
 
6823.
 
6824.
(function() {
6825.
  var input = document.createElement( "input" ),
6826.
    select = document.createElement( "select" ),
6827.
    opt = select.appendChild( document.createElement( "option" ) );
6828.
 
6829.
  input.type = "checkbox";
6830.
 
6831.
  // Support: iOS 5.1, Android 4.x, Android 2.3
6832.
  // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
6833.
  support.checkOn = input.value !== "";
6834.
 
6835.
  // Must access the parent to make an option select properly
6836.
  // Support: IE9, IE10
6837.
  support.optSelected = opt.selected;
6838.
 
6839.
  // Make sure that the options inside disabled selects aren't marked as disabled
6840.
  // (WebKit marks them as disabled)
6841.
  select.disabled = true;
6842.
  support.optDisabled = !opt.disabled;
6843.
 
6844.
  // Check if an input maintains its value after becoming a radio
6845.
  // Support: IE9, IE10
6846.
  input = document.createElement( "input" );
6847.
  input.value = "t";
6848.
  input.type = "radio";
6849.
  support.radioValue = input.value === "t";
6850.
})();
6851.
 
6852.
 
6853.
var nodeHook, boolHook,
6854.
  attrHandle = jQuery.expr.attrHandle;
6855.
 
6856.
jQuery.fn.extend({
6857.
  attr: function( name, value ) {
6858.
    return access( this, jQuery.attr, name, value, arguments.length > 1 );
6859.
  },
6860.
 
6861.
  removeAttr: function( name ) {
6862.
    return this.each(function() {
6863.
      jQuery.removeAttr( this, name );
6864.
    });
6865.
  }
6866.
});
6867.
 
6868.
jQuery.extend({
6869.
  attr: function( elem, name, value ) {
6870.
    var hooks, ret,
6871.
      nType = elem.nodeType;
6872.
 
6873.
    // don't get/set attributes on text, comment and attribute nodes
6874.
    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
6875.
      return;
6876.
    }
6877.
 
6878.
    // Fallback to prop when attributes are not supported
6879.
    if ( typeof elem.getAttribute === strundefined ) {
6880.
      return jQuery.prop( elem, name, value );
6881.
    }
6882.
 
6883.
    // All attributes are lowercase
6884.
    // Grab necessary hook if one is defined
6885.
    if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
6886.
      name = name.toLowerCase();
6887.
      hooks = jQuery.attrHooks[ name ] ||
6888.
        ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
6889.
    }
6890.
 
6891.
    if ( value !== undefined ) {
6892.
 
6893.
      if ( value === null ) {
6894.
        jQuery.removeAttr( elem, name );
6895.
 
6896.
      } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
6897.
        return ret;
6898.
 
6899.
      } else {
6900.
        elem.setAttribute( name, value + "" );
6901.
        return value;
6902.
      }
6903.
 
6904.
    } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
6905.
      return ret;
6906.
 
6907.
    } else {
6908.
      ret = jQuery.find.attr( elem, name );
6909.
 
6910.
      // Non-existent attributes return null, we normalize to undefined
6911.
      return ret == null ?
6912.
        undefined :
6913.
        ret;
6914.
    }
6915.
  },
6916.
 
6917.
  removeAttr: function( elem, value ) {
6918.
    var name, propName,
6919.
      i = 0,
6920.
      attrNames = value && value.match( rnotwhite );
6921.
 
6922.
    if ( attrNames && elem.nodeType === 1 ) {
6923.
      while ( (name = attrNames[i++]) ) {
6924.
        propName = jQuery.propFix[ name ] || name;
6925.
 
6926.
        // Boolean attributes get special treatment (#10870)
6927.
        if ( jQuery.expr.match.bool.test( name ) ) {
6928.
          // Set corresponding property to false
6929.
          elem[ propName ] = false;
6930.
        }
6931.
 
6932.
        elem.removeAttribute( name );
6933.
      }
6934.
    }
6935.
  },
6936.
 
6937.
  attrHooks: {
6938.
    type: {
6939.
      set: function( elem, value ) {
6940.
        if ( !support.radioValue && value === "radio" &&
6941.
          jQuery.nodeName( elem, "input" ) ) {
6942.
          // Setting the type on a radio button after the value resets the value in IE6-9
6943.
          // Reset value to default in case type is set after value during creation
6944.
          var val = elem.value;
6945.
          elem.setAttribute( "type", value );
6946.
          if ( val ) {
6947.
            elem.value = val;
6948.
          }
6949.
          return value;
6950.
        }
6951.
      }
6952.
    }
6953.
  }
6954.
});
6955.
 
6956.
// Hooks for boolean attributes
6957.
boolHook = {
6958.
  set: function( elem, value, name ) {
6959.
    if ( value === false ) {
6960.
      // Remove boolean attributes when set to false
6961.
      jQuery.removeAttr( elem, name );
6962.
    } else {
6963.
      elem.setAttribute( name, name );
6964.
    }
6965.
    return name;
6966.
  }
6967.
};
6968.
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
6969.
  var getter = attrHandle[ name ] || jQuery.find.attr;
6970.
 
6971.
  attrHandle[ name ] = function( elem, name, isXML ) {
6972.
    var ret, handle;
6973.
    if ( !isXML ) {
6974.
      // Avoid an infinite loop by temporarily removing this function from the getter
6975.
      handle = attrHandle[ name ];
6976.
      attrHandle[ name ] = ret;
6977.
      ret = getter( elem, name, isXML ) != null ?
6978.
        name.toLowerCase() :
6979.
        null;
6980.
      attrHandle[ name ] = handle;
6981.
    }
6982.
    return ret;
6983.
  };
6984.
});
6985.
 
6986.
 
6987.
 
6988.
 
6989.
var rfocusable = /^(?:input|select|textarea|button)$/i;
6990.
 
6991.
jQuery.fn.extend({
6992.
  prop: function( name, value ) {
6993.
    return access( this, jQuery.prop, name, value, arguments.length > 1 );
6994.
  },
6995.
 
6996.
  removeProp: function( name ) {
6997.
    return this.each(function() {
6998.
      delete this[ jQuery.propFix[ name ] || name ];
6999.
    });
7000.
  }
7001.
});
7002.
 
7003.
jQuery.extend({
7004.
  propFix: {
7005.
    "for": "htmlFor",
7006.
    "class": "className"
7007.
  },
7008.
 
7009.
  prop: function( elem, name, value ) {
7010.
    var ret, hooks, notxml,
7011.
      nType = elem.nodeType;
7012.
 
7013.
    // don't get/set properties on text, comment and attribute nodes
7014.
    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
7015.
      return;
7016.
    }
7017.
 
7018.
    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
7019.
 
7020.
    if ( notxml ) {
7021.
      // Fix name and attach hooks
7022.
      name = jQuery.propFix[ name ] || name;
7023.
      hooks = jQuery.propHooks[ name ];
7024.
    }
7025.
 
7026.
    if ( value !== undefined ) {
7027.
      return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
7028.
        ret :
7029.
        ( elem[ name ] = value );
7030.
 
7031.
    } else {
7032.
      return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
7033.
        ret :
7034.
        elem[ name ];
7035.
    }
7036.
  },
7037.
 
7038.
  propHooks: {
7039.
    tabIndex: {
7040.
      get: function( elem ) {
7041.
        return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
7042.
          elem.tabIndex :
7043.
          -1;
7044.
      }
7045.
    }
7046.
  }
7047.
});
7048.
 
7049.
// Support: IE9+
7050.
// Selectedness for an option in an optgroup can be inaccurate
7051.
if ( !support.optSelected ) {
7052.
  jQuery.propHooks.selected = {
7053.
    get: function( elem ) {
7054.
      var parent = elem.parentNode;
7055.
      if ( parent && parent.parentNode ) {
7056.
        parent.parentNode.selectedIndex;
7057.
      }
7058.
      return null;
7059.
    }
7060.
  };
7061.
}
7062.
 
7063.
jQuery.each([
7064.
  "tabIndex",
7065.
  "readOnly",
7066.
  "maxLength",
7067.
  "cellSpacing",
7068.
  "cellPadding",
7069.
  "rowSpan",
7070.
  "colSpan",
7071.
  "useMap",
7072.
  "frameBorder",
7073.
  "contentEditable"
7074.
], function() {
7075.
  jQuery.propFix[ this.toLowerCase() ] = this;
7076.
});
7077.
 
7078.
 
7079.
 
7080.
 
7081.
var rclass = /[\t\r\n\f]/g;
7082.
 
7083.
jQuery.fn.extend({
7084.
  addClass: function( value ) {
7085.
    var classes, elem, cur, clazz, j, finalValue,
7086.
      proceed = typeof value === "string" && value,
7087.
      i = 0,
7088.
      len = this.length;
7089.
 
7090.
    if ( jQuery.isFunction( value ) ) {
7091.
      return this.each(function( j ) {
7092.
        jQuery( this ).addClass( value.call( this, j, this.className ) );
7093.
      });
7094.
    }
7095.
 
7096.
    if ( proceed ) {
7097.
      // The disjunction here is for better compressibility (see removeClass)
7098.
      classes = ( value || "" ).match( rnotwhite ) || [];
7099.
 
7100.
      for ( ; i < len; i++ ) {
7101.
        elem = this[ i ];
7102.
        cur = elem.nodeType === 1 && ( elem.className ?
7103.
          ( " " + elem.className + " " ).replace( rclass, " " ) :
7104.
          " "
7105.
        );
7106.
 
7107.
        if ( cur ) {
7108.
          j = 0;
7109.
          while ( (clazz = classes[j++]) ) {
7110.
            if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
7111.
              cur += clazz + " ";
7112.
            }
7113.
          }
7114.
 
7115.
          // only assign if different to avoid unneeded rendering.
7116.
          finalValue = jQuery.trim( cur );
7117.
          if ( elem.className !== finalValue ) {
7118.
            elem.className = finalValue;
7119.
          }
7120.
        }
7121.
      }
7122.
    }
7123.
 
7124.
    return this;
7125.
  },
7126.
 
7127.
  removeClass: function( value ) {
7128.
    var classes, elem, cur, clazz, j, finalValue,
7129.
      proceed = arguments.length === 0 || typeof value === "string" && value,
7130.
      i = 0,
7131.
      len = this.length;
7132.
 
7133.
    if ( jQuery.isFunction( value ) ) {
7134.
      return this.each(function( j ) {
7135.
        jQuery( this ).removeClass( value.call( this, j, this.className ) );
7136.
      });
7137.
    }
7138.
    if ( proceed ) {
7139.
      classes = ( value || "" ).match( rnotwhite ) || [];
7140.
 
7141.
      for ( ; i < len; i++ ) {
7142.
        elem = this[ i ];
7143.
        // This expression is here for better compressibility (see addClass)
7144.
        cur = elem.nodeType === 1 && ( elem.className ?
7145.
          ( " " + elem.className + " " ).replace( rclass, " " ) :
7146.
          ""
7147.
        );
7148.
 
7149.
        if ( cur ) {
7150.
          j = 0;
7151.
          while ( (clazz = classes[j++]) ) {
7152.
            // Remove *all* instances
7153.
            while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
7154.
              cur = cur.replace( " " + clazz + " ", " " );
7155.
            }
7156.
          }
7157.
 
7158.
          // only assign if different to avoid unneeded rendering.
7159.
          finalValue = value ? jQuery.trim( cur ) : "";
7160.
          if ( elem.className !== finalValue ) {
7161.
            elem.className = finalValue;
7162.
          }
7163.
        }
7164.
      }
7165.
    }
7166.
 
7167.
    return this;
7168.
  },
7169.
 
7170.
  toggleClass: function( value, stateVal ) {
7171.
    var type = typeof value;
7172.
 
7173.
    if ( typeof stateVal === "boolean" && type === "string" ) {
7174.
      return stateVal ? this.addClass( value ) : this.removeClass( value );
7175.
    }
7176.
 
7177.
    if ( jQuery.isFunction( value ) ) {
7178.
      return this.each(function( i ) {
7179.
        jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
7180.
      });
7181.
    }
7182.
 
7183.
    return this.each(function() {
7184.
      if ( type === "string" ) {
7185.
        // toggle individual class names
7186.
        var className,
7187.
          i = 0,
7188.
          self = jQuery( this ),
7189.
          classNames = value.match( rnotwhite ) || [];
7190.
 
7191.
        while ( (className = classNames[ i++ ]) ) {
7192.
          // check each className given, space separated list
7193.
          if ( self.hasClass( className ) ) {
7194.
            self.removeClass( className );
7195.
          } else {
7196.
            self.addClass( className );
7197.
          }
7198.
        }
7199.
 
7200.
      // Toggle whole class name
7201.
      } else if ( type === strundefined || type === "boolean" ) {
7202.
        if ( this.className ) {
7203.
          // store className if set
7204.
          data_priv.set( this, "__className__", this.className );
7205.
        }
7206.
 
7207.
        // If the element has a class name or if we're passed "false",
7208.
        // then remove the whole classname (if there was one, the above saved it).
7209.
        // Otherwise bring back whatever was previously saved (if anything),
7210.
        // falling back to the empty string if nothing was stored.
7211.
        this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
7212.
      }
7213.
    });
7214.
  },
7215.
 
7216.
  hasClass: function( selector ) {
7217.
    var className = " " + selector + " ",
7218.
      i = 0,
7219.
      l = this.length;
7220.
    for ( ; i < l; i++ ) {
7221.
      if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
7222.
        return true;
7223.
      }
7224.
    }
7225.
 
7226.
    return false;
7227.
  }
7228.
});
7229.
 
7230.
 
7231.
 
7232.
 
7233.
var rreturn = /\r/g;
7234.
 
7235.
jQuery.fn.extend({
7236.
  val: function( value ) {
7237.
    var hooks, ret, isFunction,
7238.
      elem = this[0];
7239.
 
7240.
    if ( !arguments.length ) {
7241.
      if ( elem ) {
7242.
        hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
7243.
 
7244.
        if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
7245.
          return ret;
7246.
        }
7247.
 
7248.
        ret = elem.value;
7249.
 
7250.
        return typeof ret === "string" ?
7251.
          // handle most common string cases
7252.
          ret.replace(rreturn, "") :
7253.
          // handle cases where value is null/undef or number
7254.
          ret == null ? "" : ret;
7255.
      }
7256.
 
7257.
      return;
7258.
    }
7259.
 
7260.
    isFunction = jQuery.isFunction( value );
7261.
 
7262.
    return this.each(function( i ) {
7263.
      var val;
7264.
 
7265.
      if ( this.nodeType !== 1 ) {
7266.
        return;
7267.
      }
7268.
 
7269.
      if ( isFunction ) {
7270.
        val = value.call( this, i, jQuery( this ).val() );
7271.
      } else {
7272.
        val = value;
7273.
      }
7274.
 
7275.
      // Treat null/undefined as ""; convert numbers to string
7276.
      if ( val == null ) {
7277.
        val = "";
7278.
 
7279.
      } else if ( typeof val === "number" ) {
7280.
        val += "";
7281.
 
7282.
      } else if ( jQuery.isArray( val ) ) {
7283.
        val = jQuery.map( val, function( value ) {
7284.
          return value == null ? "" : value + "";
7285.
        });
7286.
      }
7287.
 
7288.
      hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
7289.
 
7290.
      // If set returns undefined, fall back to normal setting
7291.
      if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
7292.
        this.value = val;
7293.
      }
7294.
    });
7295.
  }
7296.
});
7297.
 
7298.
jQuery.extend({
7299.
  valHooks: {
7300.
    select: {
7301.
      get: function( elem ) {
7302.
        var value, option,
7303.
          options = elem.options,
7304.
          index = elem.selectedIndex,
7305.
          one = elem.type === "select-one" || index < 0,
7306.
          values = one ? null : [],
7307.
          max = one ? index + 1 : options.length,
7308.
          i = index < 0 ?
7309.
            max :
7310.
            one ? index : 0;
7311.
 
7312.
        // Loop through all the selected options
7313.
        for ( ; i < max; i++ ) {
7314.
          option = options[ i ];
7315.
 
7316.
          // IE6-9 doesn't update selected after form reset (#2551)
7317.
          if ( ( option.selected || i === index ) &&
7318.
              // Don't return options that are disabled or in a disabled optgroup
7319.
              ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
7320.
              ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
7321.
 
7322.
            // Get the specific value for the option
7323.
            value = jQuery( option ).val();
7324.
 
7325.
            // We don't need an array for one selects
7326.
            if ( one ) {
7327.
              return value;
7328.
            }
7329.
 
7330.
            // Multi-Selects return an array
7331.
            values.push( value );
7332.
          }
7333.
        }
7334.
 
7335.
        return values;
7336.
      },
7337.
 
7338.
      set: function( elem, value ) {
7339.
        var optionSet, option,
7340.
          options = elem.options,
7341.
          values = jQuery.makeArray( value ),
7342.
          i = options.length;
7343.
 
7344.
        while ( i-- ) {
7345.
          option = options[ i ];
7346.
          if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
7347.
            optionSet = true;
7348.
          }
7349.
        }
7350.
 
7351.
        // force browsers to behave consistently when non-matching value is set
7352.
        if ( !optionSet ) {
7353.
          elem.selectedIndex = -1;
7354.
        }
7355.
        return values;
7356.
      }
7357.
    }
7358.
  }
7359.
});
7360.
 
7361.
// Radios and checkboxes getter/setter
7362.
jQuery.each([ "radio", "checkbox" ], function() {
7363.
  jQuery.valHooks[ this ] = {
7364.
    set: function( elem, value ) {
7365.
      if ( jQuery.isArray( value ) ) {
7366.
        return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
7367.
      }
7368.
    }
7369.
  };
7370.
  if ( !support.checkOn ) {
7371.
    jQuery.valHooks[ this ].get = function( elem ) {
7372.
      // Support: Webkit
7373.
      // "" is returned instead of "on" if a value isn't specified
7374.
      return elem.getAttribute("value") === null ? "on" : elem.value;
7375.
    };
7376.
  }
7377.
});
7378.
 
7379.
 
7380.
 
7381.
 
7382.
// Return jQuery for attributes-only inclusion
7383.
 
7384.
 
7385.
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7386.
  "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7387.
  "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7388.
 
7389.
  // Handle event binding
7390.
  jQuery.fn[ name ] = function( data, fn ) {
7391.
    return arguments.length > 0 ?
7392.
      this.on( name, null, data, fn ) :
7393.
      this.trigger( name );
7394.
  };
7395.
});
7396.
 
7397.
jQuery.fn.extend({
7398.
  hover: function( fnOver, fnOut ) {
7399.
    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7400.
  },
7401.
 
7402.
  bind: function( types, data, fn ) {
7403.
    return this.on( types, null, data, fn );
7404.
  },
7405.
  unbind: function( types, fn ) {
7406.
    return this.off( types, null, fn );
7407.
  },
7408.
 
7409.
  delegate: function( selector, types, data, fn ) {
7410.
    return this.on( types, selector, data, fn );
7411.
  },
7412.
  undelegate: function( selector, types, fn ) {
7413.
    // ( namespace ) or ( selector, types [, fn] )
7414.
    return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
7415.
  }
7416.
});
7417.
 
7418.
 
7419.
var nonce = jQuery.now();
7420.
 
7421.
var rquery = (/\?/);
7422.
 
7423.
 
7424.
 
7425.
// Support: Android 2.3
7426.
// Workaround failure to string-cast null input
7427.
jQuery.parseJSON = function( data ) {
7428.
  return JSON.parse( data + "" );
7429.
};
7430.
 
7431.
 
7432.
// Cross-browser xml parsing
7433.
jQuery.parseXML = function( data ) {
7434.
  var xml, tmp;
7435.
  if ( !data || typeof data !== "string" ) {
7436.
    return null;
7437.
  }
7438.
 
7439.
  // Support: IE9
7440.
  try {
7441.
    tmp = new DOMParser();
7442.
    xml = tmp.parseFromString( data, "text/xml" );
7443.
  } catch ( e ) {
7444.
    xml = undefined;
7445.
  }
7446.
 
7447.
  if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
7448.
    jQuery.error( "Invalid XML: " + data );
7449.
  }
7450.
  return xml;
7451.
};
7452.
 
7453.
 
7454.
var
7455.
  // Document location
7456.
  ajaxLocParts,
7457.
  ajaxLocation,
7458.
 
7459.
  rhash = /#.*$/,
7460.
  rts = /([?&])_=[^&]*/,
7461.
  rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
7462.
  // #7653, #8125, #8152: local protocol detection
7463.
  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
7464.
  rnoContent = /^(?:GET|HEAD)$/,
7465.
  rprotocol = /^\/\//,
7466.
  rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
7467.
 
7468.
  /* Prefilters
7469.
   * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7470.
   * 2) These are called:
7471.
   *    - BEFORE asking for a transport
7472.
   *    - AFTER param serialization (s.data is a string if s.processData is true)
7473.
   * 3) key is the dataType
7474.
   * 4) the catchall symbol "*" can be used
7475.
   * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7476.
   */
7477.
  prefilters = {},
7478.
 
7479.
  /* Transports bindings
7480.
   * 1) key is the dataType
7481.
   * 2) the catchall symbol "*" can be used
7482.
   * 3) selection will start with transport dataType and THEN go to "*" if needed
7483.
   */
7484.
  transports = {},
7485.
 
7486.
  // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7487.
  allTypes = "*/".concat("*");
7488.
 
7489.
// #8138, IE may throw an exception when accessing
7490.
// a field from window.location if document.domain has been set
7491.
try {
7492.
  ajaxLocation = location.href;
7493.
} catch( e ) {
7494.
  // Use the href attribute of an A element
7495.
  // since IE will modify it given document.location
7496.
  ajaxLocation = document.createElement( "a" );
7497.
  ajaxLocation.href = "";
7498.
  ajaxLocation = ajaxLocation.href;
7499.
}
7500.
 
7501.
// Segment location into parts
7502.
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7503.
 
7504.
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7505.
function addToPrefiltersOrTransports( structure ) {
7506.
 
7507.
  // dataTypeExpression is optional and defaults to "*"
7508.
  return function( dataTypeExpression, func ) {
7509.
 
7510.
    if ( typeof dataTypeExpression !== "string" ) {
7511.
      func = dataTypeExpression;
7512.
      dataTypeExpression = "*";
7513.
    }
7514.
 
7515.
    var dataType,
7516.
      i = 0,
7517.
      dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
7518.
 
7519.
    if ( jQuery.isFunction( func ) ) {
7520.
      // For each dataType in the dataTypeExpression
7521.
      while ( (dataType = dataTypes[i++]) ) {
7522.
        // Prepend if requested
7523.
        if ( dataType[0] === "+" ) {
7524.
          dataType = dataType.slice( 1 ) || "*";
7525.
          (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
7526.
 
7527.
        // Otherwise append
7528.
        } else {
7529.
          (structure[ dataType ] = structure[ dataType ] || []).push( func );
7530.
        }
7531.
      }
7532.
    }
7533.
  };
7534.
}
7535.
 
7536.
// Base inspection function for prefilters and transports
7537.
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
7538.
 
7539.
  var inspected = {},
7540.
    seekingTransport = ( structure === transports );
7541.
 
7542.
  function inspect( dataType ) {
7543.
    var selected;
7544.
    inspected[ dataType ] = true;
7545.
    jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
7546.
      var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
7547.
      if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
7548.
        options.dataTypes.unshift( dataTypeOrTransport );
7549.
        inspect( dataTypeOrTransport );
7550.
        return false;
7551.
      } else if ( seekingTransport ) {
7552.
        return !( selected = dataTypeOrTransport );
7553.
      }
7554.
    });
7555.
    return selected;
7556.
  }
7557.
 
7558.
  return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
7559.
}
7560.
 
7561.
// A special extend for ajax options
7562.
// that takes "flat" options (not to be deep extended)
7563.
// Fixes #9887
7564.
function ajaxExtend( target, src ) {
7565.
  var key, deep,
7566.
    flatOptions = jQuery.ajaxSettings.flatOptions || {};
7567.
 
7568.
  for ( key in src ) {
7569.
    if ( src[ key ] !== undefined ) {
7570.
      ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
7571.
    }
7572.
  }
7573.
  if ( deep ) {
7574.
    jQuery.extend( true, target, deep );
7575.
  }
7576.
 
7577.
  return target;
7578.
}
7579.
 
7580.
/* Handles responses to an ajax request:
7581.
 * - finds the right dataType (mediates between content-type and expected dataType)
7582.
 * - returns the corresponding response
7583.
 */
7584.
function ajaxHandleResponses( s, jqXHR, responses ) {
7585.
 
7586.
  var ct, type, finalDataType, firstDataType,
7587.
    contents = s.contents,
7588.
    dataTypes = s.dataTypes;
7589.
 
7590.
  // Remove auto dataType and get content-type in the process
7591.
  while ( dataTypes[ 0 ] === "*" ) {
7592.
    dataTypes.shift();
7593.
    if ( ct === undefined ) {
7594.
      ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
7595.
    }
7596.
  }
7597.
 
7598.
  // Check if we're dealing with a known content-type
7599.
  if ( ct ) {
7600.
    for ( type in contents ) {
7601.
      if ( contents[ type ] && contents[ type ].test( ct ) ) {
7602.
        dataTypes.unshift( type );
7603.
        break;
7604.
      }
7605.
    }
7606.
  }
7607.
 
7608.
  // Check to see if we have a response for the expected dataType
7609.
  if ( dataTypes[ 0 ] in responses ) {
7610.
    finalDataType = dataTypes[ 0 ];
7611.
  } else {
7612.
    // Try convertible dataTypes
7613.
    for ( type in responses ) {
7614.
      if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7615.
        finalDataType = type;
7616.
        break;
7617.
      }
7618.
      if ( !firstDataType ) {
7619.
        firstDataType = type;
7620.
      }
7621.
    }
7622.
    // Or just use first one
7623.
    finalDataType = finalDataType || firstDataType;
7624.
  }
7625.
 
7626.
  // If we found a dataType
7627.
  // We add the dataType to the list if needed
7628.
  // and return the corresponding response
7629.
  if ( finalDataType ) {
7630.
    if ( finalDataType !== dataTypes[ 0 ] ) {
7631.
      dataTypes.unshift( finalDataType );
7632.
    }
7633.
    return responses[ finalDataType ];
7634.
  }
7635.
}
7636.
 
7637.
/* Chain conversions given the request and the original response
7638.
 * Also sets the responseXXX fields on the jqXHR instance
7639.
 */
7640.
function ajaxConvert( s, response, jqXHR, isSuccess ) {
7641.
  var conv2, current, conv, tmp, prev,
7642.
    converters = {},
7643.
    // Work with a copy of dataTypes in case we need to modify it for conversion
7644.
    dataTypes = s.dataTypes.slice();
7645.
 
7646.
  // Create converters map with lowercased keys
7647.
  if ( dataTypes[ 1 ] ) {
7648.
    for ( conv in s.converters ) {
7649.
      converters[ conv.toLowerCase() ] = s.converters[ conv ];
7650.
    }
7651.
  }
7652.
 
7653.
  current = dataTypes.shift();
7654.
 
7655.
  // Convert to each sequential dataType
7656.
  while ( current ) {
7657.
 
7658.
    if ( s.responseFields[ current ] ) {
7659.
      jqXHR[ s.responseFields[ current ] ] = response;
7660.
    }
7661.
 
7662.
    // Apply the dataFilter if provided
7663.
    if ( !prev && isSuccess && s.dataFilter ) {
7664.
      response = s.dataFilter( response, s.dataType );
7665.
    }
7666.
 
7667.
    prev = current;
7668.
    current = dataTypes.shift();
7669.
 
7670.
    if ( current ) {
7671.
 
7672.
    // There's only work to do if current dataType is non-auto
7673.
      if ( current === "*" ) {
7674.
 
7675.
        current = prev;
7676.
 
7677.
      // Convert response if prev dataType is non-auto and differs from current
7678.
      } else if ( prev !== "*" && prev !== current ) {
7679.
 
7680.
        // Seek a direct converter
7681.
        conv = converters[ prev + " " + current ] || converters[ "* " + current ];
7682.
 
7683.
        // If none found, seek a pair
7684.
        if ( !conv ) {
7685.
          for ( conv2 in converters ) {
7686.
 
7687.
            // If conv2 outputs current
7688.
            tmp = conv2.split( " " );
7689.
            if ( tmp[ 1 ] === current ) {
7690.
 
7691.
              // If prev can be converted to accepted input
7692.
              conv = converters[ prev + " " + tmp[ 0 ] ] ||
7693.
                converters[ "* " + tmp[ 0 ] ];
7694.
              if ( conv ) {
7695.
                // Condense equivalence converters
7696.
                if ( conv === true ) {
7697.
                  conv = converters[ conv2 ];
7698.
 
7699.
                // Otherwise, insert the intermediate dataType
7700.
                } else if ( converters[ conv2 ] !== true ) {
7701.
                  current = tmp[ 0 ];
7702.
                  dataTypes.unshift( tmp[ 1 ] );
7703.
                }
7704.
                break;
7705.
              }
7706.
            }
7707.
          }
7708.
        }
7709.
 
7710.
        // Apply converter (if not an equivalence)
7711.
        if ( conv !== true ) {
7712.
 
7713.
          // Unless errors are allowed to bubble, catch and return them
7714.
          if ( conv && s[ "throws" ] ) {
7715.
            response = conv( response );
7716.
          } else {
7717.
            try {
7718.
              response = conv( response );
7719.
            } catch ( e ) {
7720.
              return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
7721.
            }
7722.
          }
7723.
        }
7724.
      }
7725.
    }
7726.
  }
7727.
 
7728.
  return { state: "success", data: response };
7729.
}
7730.
 
7731.
jQuery.extend({
7732.
 
7733.
  // Counter for holding the number of active queries
7734.
  active: 0,
7735.
 
7736.
  // Last-Modified header cache for next request
7737.
  lastModified: {},
7738.
  etag: {},
7739.
 
7740.
  ajaxSettings: {
7741.
    url: ajaxLocation,
7742.
    type: "GET",
7743.
    isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7744.
    global: true,
7745.
    processData: true,
7746.
    async: true,
7747.
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7748.
    /*
7749.
    timeout: 0,
7750.
    data: null,
7751.
    dataType: null,
7752.
    username: null,
7753.
    password: null,
7754.
    cache: null,
7755.
    throws: false,
7756.
    traditional: false,
7757.
    headers: {},
7758.
    */
7759.
 
7760.
    accepts: {
7761.
      "*": allTypes,
7762.
      text: "text/plain",
7763.
      html: "text/html",
7764.
      xml: "application/xml, text/xml",
7765.
      json: "application/json, text/javascript"
7766.
    },
7767.
 
7768.
    contents: {
7769.
      xml: /xml/,
7770.
      html: /html/,
7771.
      json: /json/
7772.
    },
7773.
 
7774.
    responseFields: {
7775.
      xml: "responseXML",
7776.
      text: "responseText",
7777.
      json: "responseJSON"
7778.
    },
7779.
 
7780.
    // Data converters
7781.
    // Keys separate source (or catchall "*") and destination types with a single space
7782.
    converters: {
7783.
 
7784.
      // Convert anything to text
7785.
      "* text": String,
7786.
 
7787.
      // Text to html (true = no transformation)
7788.
      "text html": true,
7789.
 
7790.
      // Evaluate text as a json expression
7791.
      "text json": jQuery.parseJSON,
7792.
 
7793.
      // Parse text as xml
7794.
      "text xml": jQuery.parseXML
7795.
    },
7796.
 
7797.
    // For options that shouldn't be deep extended:
7798.
    // you can add your own custom options here if
7799.
    // and when you create one that shouldn't be
7800.
    // deep extended (see ajaxExtend)
7801.
    flatOptions: {
7802.
      url: true,
7803.
      context: true
7804.
    }
7805.
  },
7806.
 
7807.
  // Creates a full fledged settings object into target
7808.
  // with both ajaxSettings and settings fields.
7809.
  // If target is omitted, writes into ajaxSettings.
7810.
  ajaxSetup: function( target, settings ) {
7811.
    return settings ?
7812.
 
7813.
      // Building a settings object
7814.
      ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
7815.
 
7816.
      // Extending ajaxSettings
7817.
      ajaxExtend( jQuery.ajaxSettings, target );
7818.
  },
7819.
 
7820.
  ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7821.
  ajaxTransport: addToPrefiltersOrTransports( transports ),
7822.
 
7823.
  // Main method
7824.
  ajax: function( url, options ) {
7825.
 
7826.
    // If url is an object, simulate pre-1.5 signature
7827.
    if ( typeof url === "object" ) {
7828.
      options = url;
7829.
      url = undefined;
7830.
    }
7831.
 
7832.
    // Force options to be an object
7833.
    options = options || {};
7834.
 
7835.
    var transport,
7836.
      // URL without anti-cache param
7837.
      cacheURL,
7838.
      // Response headers
7839.
      responseHeadersString,
7840.
      responseHeaders,
7841.
      // timeout handle
7842.
      timeoutTimer,
7843.
      // Cross-domain detection vars
7844.
      parts,
7845.
      // To know if global events are to be dispatched
7846.
      fireGlobals,
7847.
      // Loop variable
7848.
      i,
7849.
      // Create the final options object
7850.
      s = jQuery.ajaxSetup( {}, options ),
7851.
      // Callbacks context
7852.
      callbackContext = s.context || s,
7853.
      // Context for global events is callbackContext if it is a DOM node or jQuery collection
7854.
      globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
7855.
        jQuery( callbackContext ) :
7856.
        jQuery.event,
7857.
      // Deferreds
7858.
      deferred = jQuery.Deferred(),
7859.
      completeDeferred = jQuery.Callbacks("once memory"),
7860.
      // Status-dependent callbacks
7861.
      statusCode = s.statusCode || {},
7862.
      // Headers (they are sent all at once)
7863.
      requestHeaders = {},
7864.
      requestHeadersNames = {},
7865.
      // The jqXHR state
7866.
      state = 0,
7867.
      // Default abort message
7868.
      strAbort = "canceled",
7869.
      // Fake xhr
7870.
      jqXHR = {
7871.
        readyState: 0,
7872.
 
7873.
        // Builds headers hashtable if needed
7874.
        getResponseHeader: function( key ) {
7875.
          var match;
7876.
          if ( state === 2 ) {
7877.
            if ( !responseHeaders ) {
7878.
              responseHeaders = {};
7879.
              while ( (match = rheaders.exec( responseHeadersString )) ) {
7880.
                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7881.
              }
7882.
            }
7883.
            match = responseHeaders[ key.toLowerCase() ];
7884.
          }
7885.
          return match == null ? null : match;
7886.
        },
7887.
 
7888.
        // Raw string
7889.
        getAllResponseHeaders: function() {
7890.
          return state === 2 ? responseHeadersString : null;
7891.
        },
7892.
 
7893.
        // Caches the header
7894.
        setRequestHeader: function( name, value ) {
7895.
          var lname = name.toLowerCase();
7896.
          if ( !state ) {
7897.
            name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7898.
            requestHeaders[ name ] = value;
7899.
          }
7900.
          return this;
7901.
        },
7902.
 
7903.
        // Overrides response content-type header
7904.
        overrideMimeType: function( type ) {
7905.
          if ( !state ) {
7906.
            s.mimeType = type;
7907.
          }
7908.
          return this;
7909.
        },
7910.
 
7911.
        // Status-dependent callbacks
7912.
        statusCode: function( map ) {
7913.
          var code;
7914.
          if ( map ) {
7915.
            if ( state < 2 ) {
7916.
              for ( code in map ) {
7917.
                // Lazy-add the new callback in a way that preserves old ones
7918.
                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
7919.
              }
7920.
            } else {
7921.
              // Execute the appropriate callbacks
7922.
              jqXHR.always( map[ jqXHR.status ] );
7923.
            }
7924.
          }
7925.
          return this;
7926.
        },
7927.
 
7928.
        // Cancel the request
7929.
        abort: function( statusText ) {
7930.
          var finalText = statusText || strAbort;
7931.
          if ( transport ) {
7932.
            transport.abort( finalText );
7933.
          }
7934.
          done( 0, finalText );
7935.
          return this;
7936.
        }
7937.
      };
7938.
 
7939.
    // Attach deferreds
7940.
    deferred.promise( jqXHR ).complete = completeDeferred.add;
7941.
    jqXHR.success = jqXHR.done;
7942.
    jqXHR.error = jqXHR.fail;
7943.
 
7944.
    // Remove hash character (#7531: and string promotion)
7945.
    // Add protocol if not provided (prefilters might expect it)
7946.
    // Handle falsy url in the settings object (#10093: consistency with old signature)
7947.
    // We also use the url parameter if available
7948.
    s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
7949.
      .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7950.
 
7951.
    // Alias method option to type as per ticket #12004
7952.
    s.type = options.method || options.type || s.method || s.type;
7953.
 
7954.
    // Extract dataTypes list
7955.
    s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
7956.
 
7957.
    // A cross-domain request is in order when we have a protocol:host:port mismatch
7958.
    if ( s.crossDomain == null ) {
7959.
      parts = rurl.exec( s.url.toLowerCase() );
7960.
      s.crossDomain = !!( parts &&
7961.
        ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
7962.
          ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
7963.
            ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
7964.
      );
7965.
    }
7966.
 
7967.
    // Convert data if not already a string
7968.
    if ( s.data && s.processData && typeof s.data !== "string" ) {
7969.
      s.data = jQuery.param( s.data, s.traditional );
7970.
    }
7971.
 
7972.
    // Apply prefilters
7973.
    inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7974.
 
7975.
    // If request was aborted inside a prefilter, stop there
7976.
    if ( state === 2 ) {
7977.
      return jqXHR;
7978.
    }
7979.
 
7980.
    // We can fire global events as of now if asked to
7981.
    fireGlobals = s.global;
7982.
 
7983.
    // Watch for a new set of requests
7984.
    if ( fireGlobals && jQuery.active++ === 0 ) {
7985.
      jQuery.event.trigger("ajaxStart");
7986.
    }
7987.
 
7988.
    // Uppercase the type
7989.
    s.type = s.type.toUpperCase();
7990.
 
7991.
    // Determine if request has content
7992.
    s.hasContent = !rnoContent.test( s.type );
7993.
 
7994.
    // Save the URL in case we're toying with the If-Modified-Since
7995.
    // and/or If-None-Match header later on
7996.
    cacheURL = s.url;
7997.
 
7998.
    // More options handling for requests with no content
7999.
    if ( !s.hasContent ) {
8000.
 
8001.
      // If data is available, append data to url
8002.
      if ( s.data ) {
8003.
        cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
8004.
        // #9682: remove data so that it's not used in an eventual retry
8005.
        delete s.data;
8006.
      }
8007.
 
8008.
      // Add anti-cache in url if needed
8009.
      if ( s.cache === false ) {
8010.
        s.url = rts.test( cacheURL ) ?
8011.
 
8012.
          // If there is already a '_' parameter, set its value
8013.
          cacheURL.replace( rts, "$1_=" + nonce++ ) :
8014.
 
8015.
          // Otherwise add one to the end
8016.
          cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
8017.
      }
8018.
    }
8019.
 
8020.
    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8021.
    if ( s.ifModified ) {
8022.
      if ( jQuery.lastModified[ cacheURL ] ) {
8023.
        jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
8024.
      }
8025.
      if ( jQuery.etag[ cacheURL ] ) {
8026.
        jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
8027.
      }
8028.
    }
8029.
 
8030.
    // Set the correct header, if data is being sent
8031.
    if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
8032.
      jqXHR.setRequestHeader( "Content-Type", s.contentType );
8033.
    }
8034.
 
8035.
    // Set the Accepts header for the server, depending on the dataType
8036.
    jqXHR.setRequestHeader(
8037.
      "Accept",
8038.
      s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
8039.
        s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
8040.
        s.accepts[ "*" ]
8041.
    );
8042.
 
8043.
    // Check for headers option
8044.
    for ( i in s.headers ) {
8045.
      jqXHR.setRequestHeader( i, s.headers[ i ] );
8046.
    }
8047.
 
8048.
    // Allow custom headers/mimetypes and early abort
8049.
    if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
8050.
      // Abort if not done already and return
8051.
      return jqXHR.abort();
8052.
    }
8053.
 
8054.
    // aborting is no longer a cancellation
8055.
    strAbort = "abort";
8056.
 
8057.
    // Install callbacks on deferreds
8058.
    for ( i in { success: 1, error: 1, complete: 1 } ) {
8059.
      jqXHR[ i ]( s[ i ] );
8060.
    }
8061.
 
8062.
    // Get transport
8063.
    transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
8064.
 
8065.
    // If no transport, we auto-abort
8066.
    if ( !transport ) {
8067.
      done( -1, "No Transport" );
8068.
    } else {
8069.
      jqXHR.readyState = 1;
8070.
 
8071.
      // Send global event
8072.
      if ( fireGlobals ) {
8073.
        globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
8074.
      }
8075.
      // Timeout
8076.
      if ( s.async && s.timeout > 0 ) {
8077.
        timeoutTimer = setTimeout(function() {
8078.
          jqXHR.abort("timeout");
8079.
        }, s.timeout );
8080.
      }
8081.
 
8082.
      try {
8083.
        state = 1;
8084.
        transport.send( requestHeaders, done );
8085.
      } catch ( e ) {
8086.
        // Propagate exception as error if not done
8087.
        if ( state < 2 ) {
8088.
          done( -1, e );
8089.
        // Simply rethrow otherwise
8090.
        } else {
8091.
          throw e;
8092.
        }
8093.
      }
8094.
    }
8095.
 
8096.
    // Callback for when everything is done
8097.
    function done( status, nativeStatusText, responses, headers ) {
8098.
      var isSuccess, success, error, response, modified,
8099.
        statusText = nativeStatusText;
8100.
 
8101.
      // Called once
8102.
      if ( state === 2 ) {
8103.
        return;
8104.
      }
8105.
 
8106.
      // State is "done" now
8107.
      state = 2;
8108.
 
8109.
      // Clear timeout if it exists
8110.
      if ( timeoutTimer ) {
8111.
        clearTimeout( timeoutTimer );
8112.
      }
8113.
 
8114.
      // Dereference transport for early garbage collection
8115.
      // (no matter how long the jqXHR object will be used)
8116.
      transport = undefined;
8117.
 
8118.
      // Cache response headers
8119.
      responseHeadersString = headers || "";
8120.
 
8121.
      // Set readyState
8122.
      jqXHR.readyState = status > 0 ? 4 : 0;
8123.
 
8124.
      // Determine if successful
8125.
      isSuccess = status >= 200 && status < 300 || status === 304;
8126.
 
8127.
      // Get response data
8128.
      if ( responses ) {
8129.
        response = ajaxHandleResponses( s, jqXHR, responses );
8130.
      }
8131.
 
8132.
      // Convert no matter what (that way responseXXX fields are always set)
8133.
      response = ajaxConvert( s, response, jqXHR, isSuccess );
8134.
 
8135.
      // If successful, handle type chaining
8136.
      if ( isSuccess ) {
8137.
 
8138.
        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8139.
        if ( s.ifModified ) {
8140.
          modified = jqXHR.getResponseHeader("Last-Modified");
8141.
          if ( modified ) {
8142.
            jQuery.lastModified[ cacheURL ] = modified;
8143.
          }
8144.
          modified = jqXHR.getResponseHeader("etag");
8145.
          if ( modified ) {
8146.
            jQuery.etag[ cacheURL ] = modified;
8147.
          }
8148.
        }
8149.
 
8150.
        // if no content
8151.
        if ( status === 204 || s.type === "HEAD" ) {
8152.
          statusText = "nocontent";
8153.
 
8154.
        // if not modified
8155.
        } else if ( status === 304 ) {
8156.
          statusText = "notmodified";
8157.
 
8158.
        // If we have data, let's convert it
8159.
        } else {
8160.
          statusText = response.state;
8161.
          success = response.data;
8162.
          error = response.error;
8163.
          isSuccess = !error;
8164.
        }
8165.
      } else {
8166.
        // We extract error from statusText
8167.
        // then normalize statusText and status for non-aborts
8168.
        error = statusText;
8169.
        if ( status || !statusText ) {
8170.
          statusText = "error";
8171.
          if ( status < 0 ) {
8172.
            status = 0;
8173.
          }
8174.
        }
8175.
      }
8176.
 
8177.
      // Set data for the fake xhr object
8178.
      jqXHR.status = status;
8179.
      jqXHR.statusText = ( nativeStatusText || statusText ) + "";
8180.
 
8181.
      // Success/Error
8182.
      if ( isSuccess ) {
8183.
        deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
8184.
      } else {
8185.
        deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
8186.
      }
8187.
 
8188.
      // Status-dependent callbacks
8189.
      jqXHR.statusCode( statusCode );
8190.
      statusCode = undefined;
8191.
 
8192.
      if ( fireGlobals ) {
8193.
        globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
8194.
          [ jqXHR, s, isSuccess ? success : error ] );
8195.
      }
8196.
 
8197.
      // Complete
8198.
      completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
8199.
 
8200.
      if ( fireGlobals ) {
8201.
        globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
8202.
        // Handle the global AJAX counter
8203.
        if ( !( --jQuery.active ) ) {
8204.
          jQuery.event.trigger("ajaxStop");
8205.
        }
8206.
      }
8207.
    }
8208.
 
8209.
    return jqXHR;
8210.
  },
8211.
 
8212.
  getJSON: function( url, data, callback ) {
8213.
    return jQuery.get( url, data, callback, "json" );
8214.
  },
8215.
 
8216.
  getScript: function( url, callback ) {
8217.
    return jQuery.get( url, undefined, callback, "script" );
8218.
  }
8219.
});
8220.
 
8221.
jQuery.each( [ "get", "post" ], function( i, method ) {
8222.
  jQuery[ method ] = function( url, data, callback, type ) {
8223.
    // shift arguments if data argument was omitted
8224.
    if ( jQuery.isFunction( data ) ) {
8225.
      type = type || callback;
8226.
      callback = data;
8227.
      data = undefined;
8228.
    }
8229.
 
8230.
    return jQuery.ajax({
8231.
      url: url,
8232.
      type: method,
8233.
      dataType: type,
8234.
      data: data,
8235.
      success: callback
8236.
    });
8237.
  };
8238.
});
8239.
 
8240.
// Attach a bunch of functions for handling common AJAX events
8241.
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
8242.
  jQuery.fn[ type ] = function( fn ) {
8243.
    return this.on( type, fn );
8244.
  };
8245.
});
8246.
 
8247.
 
8248.
jQuery._evalUrl = function( url ) {
8249.
  return jQuery.ajax({
8250.
    url: url,
8251.
    type: "GET",
8252.
    dataType: "script",
8253.
    async: false,
8254.
    global: false,
8255.
    "throws": true
8256.
  });
8257.
};
8258.
 
8259.
 
8260.
jQuery.fn.extend({
8261.
  wrapAll: function( html ) {
8262.
    var wrap;
8263.
 
8264.
    if ( jQuery.isFunction( html ) ) {
8265.
      return this.each(function( i ) {
8266.
        jQuery( this ).wrapAll( html.call(this, i) );
8267.
      });
8268.
    }
8269.
 
8270.
    if ( this[ 0 ] ) {
8271.
 
8272.
      // The elements to wrap the target around
8273.
      wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
8274.
 
8275.
      if ( this[ 0 ].parentNode ) {
8276.
        wrap.insertBefore( this[ 0 ] );
8277.
      }
8278.
 
8279.
      wrap.map(function() {
8280.
        var elem = this;
8281.
 
8282.
        while ( elem.firstElementChild ) {
8283.
          elem = elem.firstElementChild;
8284.
        }
8285.
 
8286.
        return elem;
8287.
      }).append( this );
8288.
    }
8289.
 
8290.
    return this;
8291.
  },
8292.
 
8293.
  wrapInner: function( html ) {
8294.
    if ( jQuery.isFunction( html ) ) {
8295.
      return this.each(function( i ) {
8296.
        jQuery( this ).wrapInner( html.call(this, i) );
8297.
      });
8298.
    }
8299.
 
8300.
    return this.each(function() {
8301.
      var self = jQuery( this ),
8302.
        contents = self.contents();
8303.
 
8304.
      if ( contents.length ) {
8305.
        contents.wrapAll( html );
8306.
 
8307.
      } else {
8308.
        self.append( html );
8309.
      }
8310.
    });
8311.
  },
8312.
 
8313.
  wrap: function( html ) {
8314.
    var isFunction = jQuery.isFunction( html );
8315.
 
8316.
    return this.each(function( i ) {
8317.
      jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
8318.
    });
8319.
  },
8320.
 
8321.
  unwrap: function() {
8322.
    return this.parent().each(function() {
8323.
      if ( !jQuery.nodeName( this, "body" ) ) {
8324.
        jQuery( this ).replaceWith( this.childNodes );
8325.
      }
8326.
    }).end();
8327.
  }
8328.
});
8329.
 
8330.
 
8331.
jQuery.expr.filters.hidden = function( elem ) {
8332.
  // Support: Opera <= 12.12
8333.
  // Opera reports offsetWidths and offsetHeights less than zero on some elements
8334.
  return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
8335.
};
8336.
jQuery.expr.filters.visible = function( elem ) {
8337.
  return !jQuery.expr.filters.hidden( elem );
8338.
};
8339.
 
8340.
 
8341.
 
8342.
 
8343.
var r20 = /%20/g,
8344.
  rbracket = /\[\]$/,
8345.
  rCRLF = /\r?\n/g,
8346.
  rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8347.
  rsubmittable = /^(?:input|select|textarea|keygen)/i;
8348.
 
8349.
function buildParams( prefix, obj, traditional, add ) {
8350.
  var name;
8351.
 
8352.
  if ( jQuery.isArray( obj ) ) {
8353.
    // Serialize array item.
8354.
    jQuery.each( obj, function( i, v ) {
8355.
      if ( traditional || rbracket.test( prefix ) ) {
8356.
        // Treat each array item as a scalar.
8357.
        add( prefix, v );
8358.
 
8359.
      } else {
8360.
        // Item is non-scalar (array or object), encode its numeric index.
8361.
        buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
8362.
      }
8363.
    });
8364.
 
8365.
  } else if ( !traditional && jQuery.type( obj ) === "object" ) {
8366.
    // Serialize object item.
8367.
    for ( name in obj ) {
8368.
      buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8369.
    }
8370.
 
8371.
  } else {
8372.
    // Serialize scalar item.
8373.
    add( prefix, obj );
8374.
  }
8375.
}
8376.
 
8377.
// Serialize an array of form elements or a set of
8378.
// key/values into a query string
8379.
jQuery.param = function( a, traditional ) {
8380.
  var prefix,
8381.
    s = [],
8382.
    add = function( key, value ) {
8383.
      // If value is a function, invoke it and return its value
8384.
      value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
8385.
      s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
8386.
    };
8387.
 
8388.
  // Set traditional to true for jQuery <= 1.3.2 behavior.
8389.
  if ( traditional === undefined ) {
8390.
    traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
8391.
  }
8392.
 
8393.
  // If an array was passed in, assume that it is an array of form elements.
8394.
  if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8395.
    // Serialize the form elements
8396.
    jQuery.each( a, function() {
8397.
      add( this.name, this.value );
8398.
    });
8399.
 
8400.
  } else {
8401.
    // If traditional, encode the "old" way (the way 1.3.2 or older
8402.
    // did it), otherwise encode params recursively.
8403.
    for ( prefix in a ) {
8404.
      buildParams( prefix, a[ prefix ], traditional, add );
8405.
    }
8406.
  }
8407.
 
8408.
  // Return the resulting serialization
8409.
  return s.join( "&" ).replace( r20, "+" );
8410.
};
8411.
 
8412.
jQuery.fn.extend({
8413.
  serialize: function() {
8414.
    return jQuery.param( this.serializeArray() );
8415.
  },
8416.
  serializeArray: function() {
8417.
    return this.map(function() {
8418.
      // Can add propHook for "elements" to filter or add form elements
8419.
      var elements = jQuery.prop( this, "elements" );
8420.
      return elements ? jQuery.makeArray( elements ) : this;
8421.
    })
8422.
    .filter(function() {
8423.
      var type = this.type;
8424.
 
8425.
      // Use .is( ":disabled" ) so that fieldset[disabled] works
8426.
      return this.name && !jQuery( this ).is( ":disabled" ) &&
8427.
        rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8428.
        ( this.checked || !rcheckableType.test( type ) );
8429.
    })
8430.
    .map(function( i, elem ) {
8431.
      var val = jQuery( this ).val();
8432.
 
8433.
      return val == null ?
8434.
        null :
8435.
        jQuery.isArray( val ) ?
8436.
          jQuery.map( val, function( val ) {
8437.
            return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8438.
          }) :
8439.
          { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8440.
    }).get();
8441.
  }
8442.
});
8443.
 
8444.
 
8445.
jQuery.ajaxSettings.xhr = function() {
8446.
  try {
8447.
    return new XMLHttpRequest();
8448.
  } catch( e ) {}
8449.
};
8450.
 
8451.
var xhrId = 0,
8452.
  xhrCallbacks = {},
8453.
  xhrSuccessStatus = {
8454.
    // file protocol always yields status code 0, assume 200
8455.
    0: 200,
8456.
    // Support: IE9
8457.
    // #1450: sometimes IE returns 1223 when it should be 204
8458.
    1223: 204
8459.
  },
8460.
  xhrSupported = jQuery.ajaxSettings.xhr();
8461.
 
8462.
// Support: IE9
8463.
// Open requests must be manually aborted on unload (#5280)
8464.
if ( window.ActiveXObject ) {
8465.
  jQuery( window ).on( "unload", function() {
8466.
    for ( var key in xhrCallbacks ) {
8467.
      xhrCallbacks[ key ]();
8468.
    }
8469.
  });
8470.
}
8471.
 
8472.
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
8473.
support.ajax = xhrSupported = !!xhrSupported;
8474.
 
8475.
jQuery.ajaxTransport(function( options ) {
8476.
  var callback;
8477.
 
8478.
  // Cross domain only allowed if supported through XMLHttpRequest
8479.
  if ( support.cors || xhrSupported && !options.crossDomain ) {
8480.
    return {
8481.
      send: function( headers, complete ) {
8482.
        var i,
8483.
          xhr = options.xhr(),
8484.
          id = ++xhrId;
8485.
 
8486.
        xhr.open( options.type, options.url, options.async, options.username, options.password );
8487.
 
8488.
        // Apply custom fields if provided
8489.
        if ( options.xhrFields ) {
8490.
          for ( i in options.xhrFields ) {
8491.
            xhr[ i ] = options.xhrFields[ i ];
8492.
          }
8493.
        }
8494.
 
8495.
        // Override mime type if needed
8496.
        if ( options.mimeType && xhr.overrideMimeType ) {
8497.
          xhr.overrideMimeType( options.mimeType );
8498.
        }
8499.
 
8500.
        // X-Requested-With header
8501.
        // For cross-domain requests, seeing as conditions for a preflight are
8502.
        // akin to a jigsaw puzzle, we simply never set it to be sure.
8503.
        // (it can always be set on a per-request basis or even using ajaxSetup)
8504.
        // For same-domain requests, won't change header if already provided.
8505.
        if ( !options.crossDomain && !headers["X-Requested-With"] ) {
8506.
          headers["X-Requested-With"] = "XMLHttpRequest";
8507.
        }
8508.
 
8509.
        // Set headers
8510.
        for ( i in headers ) {
8511.
          xhr.setRequestHeader( i, headers[ i ] );
8512.
        }
8513.
 
8514.
        // Callback
8515.
        callback = function( type ) {
8516.
          return function() {
8517.
            if ( callback ) {
8518.
              delete xhrCallbacks[ id ];
8519.
              callback = xhr.onload = xhr.onerror = null;
8520.
 
8521.
              if ( type === "abort" ) {
8522.
                xhr.abort();
8523.
              } else if ( type === "error" ) {
8524.
                complete(
8525.
                  // file: protocol always yields status 0; see #8605, #14207
8526.
                  xhr.status,
8527.
                  xhr.statusText
8528.
                );
8529.
              } else {
8530.
                complete(
8531.
                  xhrSuccessStatus[ xhr.status ] || xhr.status,
8532.
                  xhr.statusText,
8533.
                  // Support: IE9
8534.
                  // Accessing binary-data responseText throws an exception
8535.
                  // (#11426)
8536.
                  typeof xhr.responseText === "string" ? {
8537.
                    text: xhr.responseText
8538.
                  } : undefined,
8539.
                  xhr.getAllResponseHeaders()
8540.
                );
8541.
              }
8542.
            }
8543.
          };
8544.
        };
8545.
 
8546.
        // Listen to events
8547.
        xhr.onload = callback();
8548.
        xhr.onerror = callback("error");
8549.
 
8550.
        // Create the abort callback
8551.
        callback = xhrCallbacks[ id ] = callback("abort");
8552.
 
8553.
        // Do send the request
8554.
        // This may raise an exception which is actually
8555.
        // handled in jQuery.ajax (so no try/catch here)
8556.
        xhr.send( options.hasContent && options.data || null );
8557.
      },
8558.
 
8559.
      abort: function() {
8560.
        if ( callback ) {
8561.
          callback();
8562.
        }
8563.
      }
8564.
    };
8565.
  }
8566.
});
8567.
 
8568.
 
8569.
 
8570.
 
8571.
// Install script dataType
8572.
jQuery.ajaxSetup({
8573.
  accepts: {
8574.
    script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8575.
  },
8576.
  contents: {
8577.
    script: /(?:java|ecma)script/
8578.
  },
8579.
  converters: {
8580.
    "text script": function( text ) {
8581.
      jQuery.globalEval( text );
8582.
      return text;
8583.
    }
8584.
  }
8585.
});
8586.
 
8587.
// Handle cache's special case and crossDomain
8588.
jQuery.ajaxPrefilter( "script", function( s ) {
8589.
  if ( s.cache === undefined ) {
8590.
    s.cache = false;
8591.
  }
8592.
  if ( s.crossDomain ) {
8593.
    s.type = "GET";
8594.
  }
8595.
});
8596.
 
8597.
// Bind script tag hack transport
8598.
jQuery.ajaxTransport( "script", function( s ) {
8599.
  // This transport only deals with cross domain requests
8600.
  if ( s.crossDomain ) {
8601.
    var script, callback;
8602.
    return {
8603.
      send: function( _, complete ) {
8604.
        script = jQuery("<script>").prop({
8605.
          async: true,
8606.
          charset: s.scriptCharset,
8607.
          src: s.url
8608.
        }).on(
8609.
          "load error",
8610.
          callback = function( evt ) {
8611.
            script.remove();
8612.
            callback = null;
8613.
            if ( evt ) {
8614.
              complete( evt.type === "error" ? 404 : 200, evt.type );
8615.
            }
8616.
          }
8617.
        );
8618.
        document.head.appendChild( script[ 0 ] );
8619.
      },
8620.
      abort: function() {
8621.
        if ( callback ) {
8622.
          callback();
8623.
        }
8624.
      }
8625.
    };
8626.
  }
8627.
});
8628.
 
8629.
 
8630.
 
8631.
 
8632.
var oldCallbacks = [],
8633.
  rjsonp = /(=)\?(?=&|$)|\?\?/;
8634.
 
8635.
// Default jsonp settings
8636.
jQuery.ajaxSetup({
8637.
  jsonp: "callback",
8638.
  jsonpCallback: function() {
8639.
    var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
8640.
    this[ callback ] = true;
8641.
    return callback;
8642.
  }
8643.
});
8644.
 
8645.
// Detect, normalize options and install callbacks for jsonp requests
8646.
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8647.
 
8648.
  var callbackName, overwritten, responseContainer,
8649.
    jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
8650.
      "url" :
8651.
      typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
8652.
    );
8653.
 
8654.
  // Handle iff the expected data type is "jsonp" or we have a parameter to set
8655.
  if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
8656.
 
8657.
    // Get callback name, remembering preexisting value associated with it
8658.
    callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
8659.
      s.jsonpCallback() :
8660.
      s.jsonpCallback;
8661.
 
8662.
    // Insert callback into url or form data
8663.
    if ( jsonProp ) {
8664.
      s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
8665.
    } else if ( s.jsonp !== false ) {
8666.
      s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
8667.
    }
8668.
 
8669.
    // Use data converter to retrieve json after script execution
8670.
    s.converters["script json"] = function() {
8671.
      if ( !responseContainer ) {
8672.
        jQuery.error( callbackName + " was not called" );
8673.
      }
8674.
      return responseContainer[ 0 ];
8675.
    };
8676.
 
8677.
    // force json dataType
8678.
    s.dataTypes[ 0 ] = "json";
8679.
 
8680.
    // Install callback
8681.
    overwritten = window[ callbackName ];
8682.
    window[ callbackName ] = function() {
8683.
      responseContainer = arguments;
8684.
    };
8685.
 
8686.
    // Clean-up function (fires after converters)
8687.
    jqXHR.always(function() {
8688.
      // Restore preexisting value
8689.
      window[ callbackName ] = overwritten;
8690.
 
8691.
      // Save back as free
8692.
      if ( s[ callbackName ] ) {
8693.
        // make sure that re-using the options doesn't screw things around
8694.
        s.jsonpCallback = originalSettings.jsonpCallback;
8695.
 
8696.
        // save the callback name for future use
8697.
        oldCallbacks.push( callbackName );
8698.
      }
8699.
 
8700.
      // Call if it was a function and we have a response
8701.
      if ( responseContainer && jQuery.isFunction( overwritten ) ) {
8702.
        overwritten( responseContainer[ 0 ] );
8703.
      }
8704.
 
8705.
      responseContainer = overwritten = undefined;
8706.
    });
8707.
 
8708.
    // Delegate to script
8709.
    return "script";
8710.
  }
8711.
});
8712.
 
8713.
 
8714.
 
8715.
 
8716.
// data: string of html
8717.
// context (optional): If specified, the fragment will be created in this context, defaults to document
8718.
// keepScripts (optional): If true, will include scripts passed in the html string
8719.
jQuery.parseHTML = function( data, context, keepScripts ) {
8720.
  if ( !data || typeof data !== "string" ) {
8721.
    return null;
8722.
  }
8723.
  if ( typeof context === "boolean" ) {
8724.
    keepScripts = context;
8725.
    context = false;
8726.
  }
8727.
  context = context || document;
8728.
 
8729.
  var parsed = rsingleTag.exec( data ),
8730.
    scripts = !keepScripts && [];
8731.
 
8732.
  // Single tag
8733.
  if ( parsed ) {
8734.
    return [ context.createElement( parsed[1] ) ];
8735.
  }
8736.
 
8737.
  parsed = jQuery.buildFragment( [ data ], context, scripts );
8738.
 
8739.
  if ( scripts && scripts.length ) {
8740.
    jQuery( scripts ).remove();
8741.
  }
8742.
 
8743.
  return jQuery.merge( [], parsed.childNodes );
8744.
};
8745.
 
8746.
 
8747.
// Keep a copy of the old load method
8748.
var _load = jQuery.fn.load;
8749.
 
8750.
/**
8751.
 * Load a url into a page
8752.
 */
8753.
jQuery.fn.load = function( url, params, callback ) {
8754.
  if ( typeof url !== "string" && _load ) {
8755.
    return _load.apply( this, arguments );
8756.
  }
8757.
 
8758.
  var selector, type, response,
8759.
    self = this,
8760.
    off = url.indexOf(" ");
8761.
 
8762.
  if ( off >= 0 ) {
8763.
    selector = url.slice( off );
8764.
    url = url.slice( 0, off );
8765.
  }
8766.
 
8767.
  // If it's a function
8768.
  if ( jQuery.isFunction( params ) ) {
8769.
 
8770.
    // We assume that it's the callback
8771.
    callback = params;
8772.
    params = undefined;
8773.
 
8774.
  // Otherwise, build a param string
8775.
  } else if ( params && typeof params === "object" ) {
8776.
    type = "POST";
8777.
  }
8778.
 
8779.
  // If we have elements to modify, make the request
8780.
  if ( self.length > 0 ) {
8781.
    jQuery.ajax({
8782.
      url: url,
8783.
 
8784.
      // if "type" variable is undefined, then "GET" method will be used
8785.
      type: type,
8786.
      dataType: "html",
8787.
      data: params
8788.
    }).done(function( responseText ) {
8789.
 
8790.
      // Save response for use in complete callback
8791.
      response = arguments;
8792.
 
8793.
      self.html( selector ?
8794.
 
8795.
        // If a selector was specified, locate the right elements in a dummy div
8796.
        // Exclude scripts to avoid IE 'Permission Denied' errors
8797.
        jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
8798.
 
8799.
        // Otherwise use the full result
8800.
        responseText );
8801.
 
8802.
    }).complete( callback && function( jqXHR, status ) {
8803.
      self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
8804.
    });
8805.
  }
8806.
 
8807.
  return this;
8808.
};
8809.
 
8810.
 
8811.
 
8812.
 
8813.
jQuery.expr.filters.animated = function( elem ) {
8814.
  return jQuery.grep(jQuery.timers, function( fn ) {
8815.
    return elem === fn.elem;
8816.
  }).length;
8817.
};
8818.
 
8819.
 
8820.
 
8821.
 
8822.
var docElem = window.document.documentElement;
8823.
 
8824.
/**
8825.
 * Gets a window from an element
8826.
 */
8827.
function getWindow( elem ) {
8828.
  return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
8829.
}
8830.
 
8831.
jQuery.offset = {
8832.
  setOffset: function( elem, options, i ) {
8833.
    var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
8834.
      position = jQuery.css( elem, "position" ),
8835.
      curElem = jQuery( elem ),
8836.
      props = {};
8837.
 
8838.
    // Set position first, in-case top/left are set even on static elem
8839.
    if ( position === "static" ) {
8840.
      elem.style.position = "relative";
8841.
    }
8842.
 
8843.
    curOffset = curElem.offset();
8844.
    curCSSTop = jQuery.css( elem, "top" );
8845.
    curCSSLeft = jQuery.css( elem, "left" );
8846.
    calculatePosition = ( position === "absolute" || position === "fixed" ) &&
8847.
      ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
8848.
 
8849.
    // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
8850.
    if ( calculatePosition ) {
8851.
      curPosition = curElem.position();
8852.
      curTop = curPosition.top;
8853.
      curLeft = curPosition.left;
8854.
 
8855.
    } else {
8856.
      curTop = parseFloat( curCSSTop ) || 0;
8857.
      curLeft = parseFloat( curCSSLeft ) || 0;
8858.
    }
8859.
 
8860.
    if ( jQuery.isFunction( options ) ) {
8861.
      options = options.call( elem, i, curOffset );
8862.
    }
8863.
 
8864.
    if ( options.top != null ) {
8865.
      props.top = ( options.top - curOffset.top ) + curTop;
8866.
    }
8867.
    if ( options.left != null ) {
8868.
      props.left = ( options.left - curOffset.left ) + curLeft;
8869.
    }
8870.
 
8871.
    if ( "using" in options ) {
8872.
      options.using.call( elem, props );
8873.
 
8874.
    } else {
8875.
      curElem.css( props );
8876.
    }
8877.
  }
8878.
};
8879.
 
8880.
jQuery.fn.extend({
8881.
  offset: function( options ) {
8882.
    if ( arguments.length ) {
8883.
      return options === undefined ?
8884.
        this :
8885.
        this.each(function( i ) {
8886.
          jQuery.offset.setOffset( this, options, i );
8887.
        });
8888.
    }
8889.
 
8890.
    var docElem, win,
8891.
      elem = this[ 0 ],
8892.
      box = { top: 0, left: 0 },
8893.
      doc = elem && elem.ownerDocument;
8894.
 
8895.
    if ( !doc ) {
8896.
      return;
8897.
    }
8898.
 
8899.
    docElem = doc.documentElement;
8900.
 
8901.
    // Make sure it's not a disconnected DOM node
8902.
    if ( !jQuery.contains( docElem, elem ) ) {
8903.
      return box;
8904.
    }
8905.
 
8906.
    // If we don't have gBCR, just use 0,0 rather than error
8907.
    // BlackBerry 5, iOS 3 (original iPhone)
8908.
    if ( typeof elem.getBoundingClientRect !== strundefined ) {
8909.
      box = elem.getBoundingClientRect();
8910.
    }
8911.
    win = getWindow( doc );
8912.
    return {
8913.
      top: box.top + win.pageYOffset - docElem.clientTop,
8914.
      left: box.left + win.pageXOffset - docElem.clientLeft
8915.
    };
8916.
  },
8917.
 
8918.
  position: function() {
8919.
    if ( !this[ 0 ] ) {
8920.
      return;
8921.
    }
8922.
 
8923.
    var offsetParent, offset,
8924.
      elem = this[ 0 ],
8925.
      parentOffset = { top: 0, left: 0 };
8926.
 
8927.
    // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
8928.
    if ( jQuery.css( elem, "position" ) === "fixed" ) {
8929.
      // We assume that getBoundingClientRect is available when computed position is fixed
8930.
      offset = elem.getBoundingClientRect();
8931.
 
8932.
    } else {
8933.
      // Get *real* offsetParent
8934.
      offsetParent = this.offsetParent();
8935.
 
8936.
      // Get correct offsets
8937.
      offset = this.offset();
8938.
      if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
8939.
        parentOffset = offsetParent.offset();
8940.
      }
8941.
 
8942.
      // Add offsetParent borders
8943.
      parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
8944.
      parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
8945.
    }
8946.
 
8947.
    // Subtract parent offsets and element margins
8948.
    return {
8949.
      top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
8950.
      left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
8951.
    };
8952.
  },
8953.
 
8954.
  offsetParent: function() {
8955.
    return this.map(function() {
8956.
      var offsetParent = this.offsetParent || docElem;
8957.
 
8958.
      while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
8959.
        offsetParent = offsetParent.offsetParent;
8960.
      }
8961.
 
8962.
      return offsetParent || docElem;
8963.
    });
8964.
  }
8965.
});
8966.
 
8967.
// Create scrollLeft and scrollTop methods
8968.
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
8969.
  var top = "pageYOffset" === prop;
8970.
 
8971.
  jQuery.fn[ method ] = function( val ) {
8972.
    return access( this, function( elem, method, val ) {
8973.
      var win = getWindow( elem );
8974.
 
8975.
      if ( val === undefined ) {
8976.
        return win ? win[ prop ] : elem[ method ];
8977.
      }
8978.
 
8979.
      if ( win ) {
8980.
        win.scrollTo(
8981.
          !top ? val : window.pageXOffset,
8982.
          top ? val : window.pageYOffset
8983.
        );
8984.
 
8985.
      } else {
8986.
        elem[ method ] = val;
8987.
      }
8988.
    }, method, val, arguments.length, null );
8989.
  };
8990.
});
8991.
 
8992.
// Add the top/left cssHooks using jQuery.fn.position
8993.
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
8994.
// getComputedStyle returns percent when specified for top/left/bottom/right
8995.
// rather than make the css module depend on the offset module, we just check for it here
8996.
jQuery.each( [ "top", "left" ], function( i, prop ) {
8997.
  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
8998.
    function( elem, computed ) {
8999.
      if ( computed ) {
9000.
        computed = curCSS( elem, prop );
9001.
        // if curCSS returns percentage, fallback to offset
9002.
        return rnumnonpx.test( computed ) ?
9003.
          jQuery( elem ).position()[ prop ] + "px" :
9004.
          computed;
9005.
      }
9006.
    }
9007.
  );
9008.
});
9009.
 
9010.
 
9011.
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
9012.
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9013.
  jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
9014.
    // margin is only for outerHeight, outerWidth
9015.
    jQuery.fn[ funcName ] = function( margin, value ) {
9016.
      var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
9017.
        extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
9018.
 
9019.
      return access( this, function( elem, type, value ) {
9020.
        var doc;
9021.
 
9022.
        if ( jQuery.isWindow( elem ) ) {
9023.
          // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
9024.
          // isn't a whole lot we can do. See pull request at this URL for discussion:
9025.
          // https://github.com/jquery/jquery/pull/764
9026.
          return elem.document.documentElement[ "client" + name ];
9027.
        }
9028.
 
9029.
        // Get document width or height
9030.
        if ( elem.nodeType === 9 ) {
9031.
          doc = elem.documentElement;
9032.
 
9033.
          // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
9034.
          // whichever is greatest
9035.
          return Math.max(
9036.
            elem.body[ "scroll" + name ], doc[ "scroll" + name ],
9037.
            elem.body[ "offset" + name ], doc[ "offset" + name ],
9038.
            doc[ "client" + name ]
9039.
          );
9040.
        }
9041.
 
9042.
        return value === undefined ?
9043.
          // Get width or height on the element, requesting but not forcing parseFloat
9044.
          jQuery.css( elem, type, extra ) :
9045.
 
9046.
          // Set width or height on the element
9047.
          jQuery.style( elem, type, value, extra );
9048.
      }, type, chainable ? margin : undefined, chainable, null );
9049.
    };
9050.
  });
9051.
});
9052.
 
9053.
 
9054.
// The number of elements contained in the matched element set
9055.
jQuery.fn.size = function() {
9056.
  return this.length;
9057.
};
9058.
 
9059.
jQuery.fn.andSelf = jQuery.fn.addBack;
9060.
 
9061.
 
9062.
 
9063.
 
9064.
// Register as a named AMD module, since jQuery can be concatenated with other
9065.
// files that may use define, but not via a proper concatenation script that
9066.
// understands anonymous AMD modules. A named AMD is safest and most robust
9067.
// way to register. Lowercase jquery is used because AMD module names are
9068.
// derived from file names, and jQuery is normally delivered in a lowercase
9069.
// file name. Do this after creating the global so that if an AMD module wants
9070.
// to call noConflict to hide this version of jQuery, it will work.
9071.
if ( typeof define === "function" && define.amd ) {
9072.
  define( "jquery", [], function() {
9073.
    return jQuery;
9074.
  });
9075.
}
9076.
 
9077.
 
9078.
 
9079.
 
9080.
var
9081.
  // Map over jQuery in case of overwrite
9082.
  _jQuery = window.jQuery,
9083.
 
9084.
  // Map over the $ in case of overwrite
9085.
  _$ = window.$;
9086.
 
9087.
jQuery.noConflict = function( deep ) {
9088.
  if ( window.$ === jQuery ) {
9089.
    window.$ = _$;
9090.
  }
9091.
 
9092.
  if ( deep && window.jQuery === jQuery ) {
9093.
    window.jQuery = _jQuery;
9094.
  }
9095.
 
9096.
  return jQuery;
9097.
};
9098.
 
9099.
// Expose jQuery and $ identifiers, even in
9100.
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
9101.
// and CommonJS for browser emulators (#13566)
9102.
if ( typeof noGlobal === strundefined ) {
9103.
  window.jQuery = window.$ = jQuery;
9104.
}
9105.
 
9106.
 
9107.
 
9108.
 
9109.
return jQuery;
9110.
 
9111.
}));
9112.