| define( [ | 
 | 	"./core", | 
 | 	"./core/toType", | 
 | 	"./var/rcheckableType", | 
 | 	"./var/isFunction", | 
 | 	"./core/init", | 
 | 	"./traversing", // filter | 
 | 	"./attributes/prop" | 
 | ], function( jQuery, toType, rcheckableType, isFunction ) { | 
 |  | 
 | "use strict"; | 
 |  | 
 | var | 
 | 	rbracket = /\[\]$/, | 
 | 	rCRLF = /\r?\n/g, | 
 | 	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, | 
 | 	rsubmittable = /^(?:input|select|textarea|keygen)/i; | 
 |  | 
 | function buildParams( prefix, obj, traditional, add ) { | 
 | 	var name; | 
 |  | 
 | 	if ( Array.isArray( obj ) ) { | 
 |  | 
 | 		// Serialize array item. | 
 | 		jQuery.each( obj, function( i, v ) { | 
 | 			if ( traditional || rbracket.test( prefix ) ) { | 
 |  | 
 | 				// Treat each array item as a scalar. | 
 | 				add( prefix, v ); | 
 |  | 
 | 			} else { | 
 |  | 
 | 				// Item is non-scalar (array or object), encode its numeric index. | 
 | 				buildParams( | 
 | 					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", | 
 | 					v, | 
 | 					traditional, | 
 | 					add | 
 | 				); | 
 | 			} | 
 | 		} ); | 
 |  | 
 | 	} else if ( !traditional && toType( obj ) === "object" ) { | 
 |  | 
 | 		// Serialize object item. | 
 | 		for ( name in obj ) { | 
 | 			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); | 
 | 		} | 
 |  | 
 | 	} else { | 
 |  | 
 | 		// Serialize scalar item. | 
 | 		add( prefix, obj ); | 
 | 	} | 
 | } | 
 |  | 
 | // Serialize an array of form elements or a set of | 
 | // key/values into a query string | 
 | jQuery.param = function( a, traditional ) { | 
 | 	var prefix, | 
 | 		s = [], | 
 | 		add = function( key, valueOrFunction ) { | 
 |  | 
 | 			// If value is a function, invoke it and use its return value | 
 | 			var value = isFunction( valueOrFunction ) ? | 
 | 				valueOrFunction() : | 
 | 				valueOrFunction; | 
 |  | 
 | 			s[ s.length ] = encodeURIComponent( key ) + "=" + | 
 | 				encodeURIComponent( value == null ? "" : value ); | 
 | 		}; | 
 |  | 
 | 	if ( a == null ) { | 
 | 		return ""; | 
 | 	} | 
 |  | 
 | 	// If an array was passed in, assume that it is an array of form elements. | 
 | 	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { | 
 |  | 
 | 		// Serialize the form elements | 
 | 		jQuery.each( a, function() { | 
 | 			add( this.name, this.value ); | 
 | 		} ); | 
 |  | 
 | 	} else { | 
 |  | 
 | 		// If traditional, encode the "old" way (the way 1.3.2 or older | 
 | 		// did it), otherwise encode params recursively. | 
 | 		for ( prefix in a ) { | 
 | 			buildParams( prefix, a[ prefix ], traditional, add ); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Return the resulting serialization | 
 | 	return s.join( "&" ); | 
 | }; | 
 |  | 
 | jQuery.fn.extend( { | 
 | 	serialize: function() { | 
 | 		return jQuery.param( this.serializeArray() ); | 
 | 	}, | 
 | 	serializeArray: function() { | 
 | 		return this.map( function() { | 
 |  | 
 | 			// Can add propHook for "elements" to filter or add form elements | 
 | 			var elements = jQuery.prop( this, "elements" ); | 
 | 			return elements ? jQuery.makeArray( elements ) : this; | 
 | 		} ).filter( function() { | 
 | 			var type = this.type; | 
 |  | 
 | 			// Use .is( ":disabled" ) so that fieldset[disabled] works | 
 | 			return this.name && !jQuery( this ).is( ":disabled" ) && | 
 | 				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && | 
 | 				( this.checked || !rcheckableType.test( type ) ); | 
 | 		} ).map( function( _i, elem ) { | 
 | 			var val = jQuery( this ).val(); | 
 |  | 
 | 			if ( val == null ) { | 
 | 				return null; | 
 | 			} | 
 |  | 
 | 			if ( Array.isArray( val ) ) { | 
 | 				return jQuery.map( val, function( val ) { | 
 | 					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; | 
 | 				} ); | 
 | 			} | 
 |  | 
 | 			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; | 
 | 		} ).get(); | 
 | 	} | 
 | } ); | 
 |  | 
 | return jQuery; | 
 | } ); |