     ///
     /// @param    map          The key and value of map to associate with the file content in the `Content-Disposition` HTTP header.
     ///
-    public func addParametersFrom( map map: [String: String!] ) {
+    open func addParametersFrom( map: [String: String?] ) {
         for (key,value) in map {
             parameters[key] = value
         }

    ///
    /// @param    parameter    The parameter to associate with the file content in the `Content-Disposition` HTTP header.
    ///
    public func addHeadersFrom( map map: [String: String!] ) {
        for (key,value) in map {
            headers[key] = value
        }


private let sharedInstance = ButterflyFileUploader()

open class ButterflyFileUploader {
    
    /// The response received from the server, if any.
    open var response: HTTPURLResponse? { return self.startUploading(request: self.request)?.response }
    
    // MARK: - Private instance
    fileprivate var parameters = [String: String]()
    fileprivate var files = [ButterflyFileUploadInfo]()
    fileprivate var headers = [String: String]()
    
    // @discussion Make sure your serverURLString is valid before a further application.
    //             Call `setServerURLString` to replace the default "http://myserver.com/uploadFile" with your own's.
    open var serverURLString: String? = "http://myserver.com/uploadFile"
    
    ///
    /// Set uploader 's server URL
    ///
    /// @param     URL         The server URL.
    ///
    open func setServerURLString( _ URL: String ) {
        serverURLString = URL
    }
    
    open class var sharedUploader: ButterflyFileUploader {
        return sharedInstance;
    }
    
