
     h|                     0   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ  G d d	      Z G d
 d      Z G d d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    N)BytesIOreadableseekable)FULL_OBJECT_CHECKSUM_ARGS)IN_MEMORY_UPLOAD_TAG)CompleteMultipartUploadTaskCreateMultipartUploadTaskSubmissionTaskTask)ChunksizeAdjusterDeferredOpenFileget_callbacksget_filtered_dictc                   &    e Zd ZddZd Zd Zd Zy)AggregatedProgressCallbackc                 .    || _         || _        d| _        y)a  Aggregates progress updates for every provided progress callback

        :type callbacks: A list of functions that accepts bytes_transferred
            as a single argument
        :param callbacks: The callbacks to invoke when threshold is reached

        :type threshold: int
        :param threshold: The progress threshold in which to take the
            aggregated progress and invoke the progress callback with that
            aggregated progress total
        r   N)
_callbacks
_threshold_bytes_seen)self	callbacks	thresholds      m/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/s3transfer/upload.py__init__z#AggregatedProgressCallback.__init__"   s     $#    c                     | xj                   |z  c_         | j                   | j                  k\  r| j                          y y N)r   r   _trigger_callbacks)r   bytes_transferreds     r   __call__z#AggregatedProgressCallback.__call__2   s7    --t.##% /r   c                 D    | j                   dkD  r| j                          yy)z@Flushes out any progress that has not been sent to its callbacksr   N)r   r   r   s    r   flushz AggregatedProgressCallback.flush7   s!    a##%  r   c                 Z    | j                   D ]  } || j                          d| _        y )N)r    r   )r   r   )r   callbacks     r   r   z-AggregatedProgressCallback._trigger_callbacks<   s+     	9Ht'7'78	9r   N)i   )__name__
__module____qualname__r   r!   r$   r    r   r   r   r   !   s     &
&
r   r   c                   >    e Zd ZdZd Zd
dZddZd Zd Zd Z	d	 Z
y)InterruptReadera  Wrapper that can interrupt reading using an error

    It uses a transfer coordinator to propagate an error if it notices
    that a read is being made while the file is being read from.

    :type fileobj: file-like obj
    :param fileobj: The file-like object to read from

    :type transfer_coordinator: s3transfer.futures.TransferCoordinator
    :param transfer_coordinator: The transfer coordinator to use if the
        reader needs to be interrupted.
    c                      || _         || _        y r   )_fileobj_transfer_coordinator)r   fileobjtransfer_coordinators      r   r   zInterruptReader.__init__P   s    %9"r   Nc                     | j                   j                  r| j                   j                  | j                  j                  |      S r   )r/   	exceptionr.   read)r   amounts     r   r4   zInterruptReader.readT   s:     %%//,,666}}!!&))r   c                 <    | j                   j                  ||       y r   )r.   seek)r   wherewhences      r   r7   zInterruptReader.seek^   s    5&)r   c                 6    | j                   j                         S r   )r.   tellr#   s    r   r;   zInterruptReader.tella   s    }}!!##r   c                 8    | j                   j                          y r   )r.   closer#   s    r   r=   zInterruptReader.closed   s    r   c                     | S r   r*   r#   s    r   	__enter__zInterruptReader.__enter__g   s    r   c                 $    | j                          y r   )r=   )r   argskwargss      r   __exit__zInterruptReader.__exit__j   s    

r   r   )r   )r'   r(   r)   __doc__r   r4   r7   r;   r=   r?   rC   r*   r   r   r,   r,   B   s*    :**$r   r,   c                   X    e Zd ZdZddZed        Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)UploadInputManageraJ  Base manager class for handling various types of files for uploads

    This class is typically used for the UploadSubmissionTask class to help
    determine the following:

        * How to determine the size of the file
        * How to determine if a multipart upload is required
        * How to retrieve the body for a PutObject
        * How to retrieve the bodies for a set of UploadParts

    The answers/implementations differ for the various types of file inputs
    that may be accepted. All implementations must subclass and override
    public methods from this class.
    Nc                 .    || _         || _        || _        y r   )_osutilr/   _bandwidth_limiter)r   osutilr1   bandwidth_limiters       r   r   zUploadInputManager.__init__~   s    %9""3r   c                     t        d      )a  Determines if the source for the upload is compatible with manager

        :param upload_source: The source for which the upload will pull data
            from.

        :returns: True if the manager can handle the type of source specified
            otherwise returns False.
        zmust implement _is_compatible()NotImplementedErrorclsupload_sources     r   is_compatiblez UploadInputManager.is_compatible   s     ""CDDr   c                     t        d      )a  Whether the body it provides are stored in-memory

        :type operation_name: str
        :param operation_name: The name of the client operation that the body
            is being used for. Valid operation_names are ``put_object`` and
            ``upload_part``.

        :rtype: boolean
        :returns: True if the body returned by the manager will be stored in
            memory. False if the manager will not directly store the body in
            memory.
        z%must implement store_body_in_memory()rM   r   operation_names     r   stores_body_in_memoryz(UploadInputManager.stores_body_in_memory   s     ""IJJr   c                     t        d      )zProvides the transfer size of an upload

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request
        z&must implement provide_transfer_size()rM   r   transfer_futures     r   provide_transfer_sizez(UploadInputManager.provide_transfer_size   s     ""JKKr   c                     t        d      )a  Determines where a multipart upload is required

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type config: s3transfer.manager.TransferConfig
        :param config: The config associated to the transfer manager

        :rtype: boolean
        :returns: True, if the upload should be multipart based on
            configuration and size. False, otherwise.
        z*must implement requires_multipart_upload()rM   r   rY   configs      r   requires_multipart_uploadz,UploadInputManager.requires_multipart_upload   s     ""NOOr   c                     t        d      )a  Returns the body to use for PutObject

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type config: s3transfer.manager.TransferConfig
        :param config: The config associated to the transfer manager

        :rtype: s3transfer.utils.ReadFileChunk
        :returns: A ReadFileChunk including all progress callbacks
            associated with the transfer future.
        z$must implement get_put_object_body()rM   rX   s     r   get_put_object_bodyz&UploadInputManager.get_put_object_body   s     ""HIIr   c                     t        d      )a  Yields the part number and body to use for each UploadPart

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type chunksize: int
        :param chunksize: The chunksize to use for this upload.

        :rtype: int, s3transfer.utils.ReadFileChunk
        :returns: Yields the part number and the ReadFileChunk including all
            progress callbacks associated with the transfer future for that
            specific yielded part.
        z)must implement yield_upload_part_bodies()rM   )r   rY   	chunksizes      r   yield_upload_part_bodiesz+UploadInputManager.yield_upload_part_bodies   s     ""MNNr   c                     t        || j                        }| j                  r(| j                  j                  || j                  d      }|S )NF)enabled)r,   r/   rI   get_bandwith_limited_stream)r   r0   s     r   _wrap_fileobjz UploadInputManager._wrap_fileobj   sM    !'4+E+EF""--II33U J G r   c                 :    t        |d      }|rt        |      gS g S )Nprogress)r   r   )r   rY   r   s      r   _get_progress_callbacksz*UploadInputManager._get_progress_callbacks   s&    !/:>	 .y9::	r   c                 @    |D cg c]  }|j                    c}S c c}w r   )r$   )r   aggregated_progress_callbacksr&   s      r   _get_close_callbacksz'UploadInputManager._get_close_callbacks   s    /LM8MMMs   r   )r'   r(   r)   rD   r   classmethodrR   rV   rZ   r^   r`   rc   rg   rj   rm   r*   r   r   rF   rF   n   sP    4
 	E 	EKLPJO Nr   rF   c                   V    e Zd ZdZed        Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zy)UploadFilenameInputManagerzUpload utility for filenamesc                 "    t        |t              S r   )
isinstancestrrO   s     r   rR   z(UploadFilenameInputManager.is_compatible   s    ---r   c                      y)NFr*   rT   s     r   rV   z0UploadFilenameInputManager.stores_body_in_memory   s    r   c                     |j                   j                  | j                  j                  |j                   j                  j
                               y r   )metarZ   rH   get_file_size	call_argsr0   rX   s     r   rZ   z0UploadFilenameInputManager.provide_transfer_size   s:    22LL&&';';'E'E'M'MN	
r   c                 H    |j                   j                  |j                  k\  S r   )rv   sizemultipart_thresholdr\   s      r   r^   z4UploadFilenameInputManager.requires_multipart_upload   s    ##((F,F,FFFr   c                     | j                  |      \  }}| j                  |      }| j                  |      }| j                  |      }|j                  j
                  }| j                  j                  |||||      S )Nr0   
chunk_sizefull_file_sizer   close_callbacks)&_get_put_object_fileobj_with_full_sizerg   rj   rm   rv   rz   rH   #open_file_chunk_reader_from_fileobj)r   rY   r0   	full_sizer   r   rz   s          r   r`   z.UploadFilenameInputManager.get_put_object_body   s    !HH
 $$W-00A	33I>##(( ||??$+ @ 
 	
r   c              #     K   |j                   j                  }| j                  ||      }t        d|dz         D ]  }| j	                  |      }| j                  |      }||dz
  z  }| j                  |j                   j                  j                  |||      \  }	}
| j                  |	      }	| j                  j                  |	||
||      }||f  y w)N   )
start_byte	part_sizer   r}   )rv   rz   _get_num_partsrangerj   rm   '_get_upload_part_fileobj_with_full_sizerx   r0   rg   rH   r   )r   rY   rb   r   	num_partspart_numberr   r   r   r0   r   read_file_chunks               r   rc   z3UploadFilenameInputManager.yield_upload_part_bodies  s     (--22''C	 IM2 	/K44_EI"77	BO"kAo6J "&!M!M$$..66%#-	 "N "GY ((1G #llNN$(# / O O ..5	/s   CCc                 J    t        ||| j                  j                        }|S )N)open_function)r   rH   open)r   r0   r   s      r   _get_deferred_open_filez2UploadFilenameInputManager._get_deferred_open_file2  s$    "Zt||/@/@
 r   c                     |j                   j                  j                  }|j                   j                  }| j	                  |d      |fS )Nr   )rv   rx   r0   rz   r   r   rY   r0   rz   s       r   r   zAUploadFilenameInputManager._get_put_object_fileobj_with_full_size8  sB    !&&0088##((++GQ7==r   c                 >    |d   }|d   }| j                  ||      |fS )Nr   r   )r   )r   r0   rB   r   r   s        r   r   zBUploadFilenameInputManager._get_upload_part_fileobj_with_full_size=  s/    L)
+,	++GZ@)KKr   c                 ~    t        t        j                  |j                  j                  t        |      z              S r   )intmathceilrv   rz   float)r   rY   r   s      r   r   z)UploadFilenameInputManager._get_num_partsB  s,    499_1166y9IIJKKr   N)r'   r(   r)   rD   rn   rR   rV   rZ   r^   r`   rc   r   r   r   r   r*   r   r   rp   rp      sG    &. .

G
0/>>
L
Lr   rp   c                   8    e Zd ZdZed        Zd Zd Zd Zd Z	y)UploadSeekableInputManagerz&Upload utility for an open file objectc                 2    t        |      xr t        |      S r   r   rO   s     r   rR   z(UploadSeekableInputManager.is_compatibleI  s    &B8M+BBr   c                     |dk(  ryy)N
put_objectFTr*   rT   s     r   rV   z0UploadSeekableInputManager.stores_body_in_memoryM  s    \)r   c                    |j                   j                  j                  }|j                         }|j	                  dd       |j                         }|j	                  |       |j                   j                  ||z
         y )Nr      )rv   rx   r0   r;   r7   rZ   )r   rY   r0   start_positionend_positions        r   rZ   z0UploadSeekableInputManager.provide_transfer_sizeS  sg    !&&0088 !Q||~^$22>)	
r   c                 V    |j                  |d         }t        |      t        |      fS )Nr   )r4   r   len)r   r0   rB   datas       r   r   zBUploadSeekableInputManager._get_upload_part_fileobj_with_full_size`  s,     ||F;/0 t}c$i''r   c                     |j                   j                  j                  }|j                         |j                   j                  z   }||fS r   )rv   rx   r0   r;   rz   r   s       r   r   zAUploadSeekableInputManager._get_put_object_fileobj_with_full_sizeo  sA    !&&0088 ||~ 4 4 9 99}r   N)
r'   r(   r)   rD   rn   rR   rV   rZ   r   r   r*   r   r   r   r   F  s-    0C C
(r   r   c                   `     e Zd ZdZd fd	Zed        Zd Zd Zd Z	d Z
d Zdd	Zd
 Z xZS )UploadNonSeekableInputManagerz7Upload utility for a file-like object that cannot seek.c                 6    t         |   |||       d| _        y )Nr   )superr   _initial_data)r   rJ   r1   rK   	__class__s       r   r   z&UploadNonSeekableInputManager.__init__z  s    !57HI r   c                     t        |      S r   )r   rO   s     r   rR   z+UploadNonSeekableInputManager.is_compatible~  s    &&r   c                      y)NTr*   rT   s     r   rV   z3UploadNonSeekableInputManager.stores_body_in_memory  s    r   c                      y r   r*   rX   s     r   rZ   z3UploadNonSeekableInputManager.provide_transfer_size  s     	r   c                 0   |j                   j                  #|j                   j                  |j                  k\  S |j                   j                  j                  }|j                  }| j                  ||d      | _        t        | j                        |k  ryy)NFT)rv   rz   r{   rx   r0   _readr   r   )r   rY   r]   r0   r   s        r   r^   z7UploadNonSeekableInputManager.requires_multipart_upload  s    $$0"'',,0J0JJJ "&&0088..	!ZZEBt!!"Y.r   c                     | j                  |      }| j                  |      }|j                  j                  j                  }| j                  | j                  |j                         z   ||      }d | _        |S r   )rj   rm   rv   rx   r0   
_wrap_datar   r4   )r   rY   r   r   r0   bodys         r   r`   z1UploadNonSeekableInputManager.get_put_object_body  sn    00A	33I>!&&0088/O
 "r   c              #      K   |j                   j                  j                  }d}	 | j                  |      }| j	                  |      }|dz  }| j                  ||      }|sy | j                  |||      }d }||f Xw)Nr   r   )rv   rx   r0   rj   rm   r   r   )	r   rY   rb   file_objectr   r   r   part_contentpart_objects	            r   rc   z6UploadNonSeekableInputManager.yield_upload_part_bodies  s     %**44<< 44_EI"77	BO1K::k9=L//iK
  L{** s   A<A>c                 T   t        | j                        dk(  r|j                  |      S |t        | j                        k  r'| j                  d| }|r| j                  |d | _        |S |t        | j                        z
  }| j                  |j                  |      z   }|rd| _        |S )a=  
        Reads a specific amount of data from a stream and returns it. If there
        is any data in initial_data, that will be popped out first.

        :type fileobj: A file-like object that implements read
        :param fileobj: The stream to read from.

        :type amount: int
        :param amount: The number of bytes to read from the stream.

        :type truncate: bool
        :param truncate: Whether or not to truncate initial_data after
            reading from it.

        :return: Generator which generates part bodies from the initial data.
        r   Nr   )r   r   r4   )r   r0   r5   truncater   amount_to_reads         r   r   z#UploadNonSeekableInputManager._read  s    $ t!!"a'<<'' S++,,%%gv.D %)%7%7%@"K
  #d&8&8"99!!GLL$@@ !$Dr   c                     | j                  t        |            }| j                  j                  |t	        |      t	        |      ||      S )a  
        Wraps data with the interrupt reader and the file chunk reader.

        :type data: bytes
        :param data: The data to wrap.

        :type callbacks: list
        :param callbacks: The callbacks associated with the transfer future.

        :type close_callbacks: list
        :param close_callbacks: The callbacks to be called when closing the
            wrapper for the data.

        :return: Fully wrapped data.
        r}   )rg   r   rH   r   r   )r   r   r   r   r0   s        r   r   z(UploadNonSeekableInputManager._wrap_data  sL      $$WT]3||??4yt9+ @ 
 	
r   r   )T)r'   r(   r)   rD   r   rn   rR   rV   rZ   r^   r`   rc   r   r   __classcell__)r   s   @r   r   r   w  sC    A! ' '
"+((T
r   r   c                   t    e Zd ZdZddgZedgz   Zg dZg dez   Zd Z		 ddZ
d	 Zd
 Zd Zd Zd Zd Zd Zy)UploadSubmissionTaskz.Task for submitting tasks to execute an uploadChecksumTypeMpuObjectSize)ChecksumAlgorithmSSECustomerKeySSECustomerAlgorithmSSECustomerKeyMD5RequestPayerExpectedBucketOwner)r   r   r   r   r   r   r   c                     t         t        t        g}|j                  j                  j
                  }|D ]  }|j                  |      s|c S  t        d| dt        |       d      )ao  Retrieves a class for managing input for an upload based on file type

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future for the request

        :rtype: class of UploadInputManager
        :returns: The appropriate class to use for managing a specific type of
            input for uploads.
        zInput z
 of type: z is not supported.)	rp   r   r   rv   rx   r0   rR   RuntimeErrortype)r   rY   upload_manager_resolver_chainr0   upload_manager_clss        r   _get_upload_input_manager_clsz2UploadSubmissionTask._get_upload_input_manager_cls  sx     '&))
% "&&0088"? 	*!//8))	* WIZW6HI
 	
r   Nc                     | j                  |      || j                  |      }|j                  j                  |j	                  |       |j                  ||      s| j                  ||||||       y| j                  ||||||       y)a  
        :param client: The client associated with the transfer manager

        :type config: s3transfer.manager.TransferConfig
        :param config: The transfer config associated with the transfer
            manager

        :type osutil: s3transfer.utils.OSUtil
        :param osutil: The os utility associated to the transfer manager

        :type request_executor: s3transfer.futures.BoundedExecutor
        :param request_executor: The request executor associated with the
            transfer manager

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future associated with the
            transfer request that tasks are being submitted for
        N)r   r/   rv   rz   rZ   r^   _submit_upload_request_submit_multipart_request)r   clientr]   rJ   request_executorrY   rK   upload_input_managers           r   _submitzUploadSubmissionTask._submit3  s    6 
tAA 

$,,.? A
 $$, 66G $==V
 '' $ ** $r   c                 D   |j                   j                  }| j                  |j                        }| j	                  |d      }	| j
                  j                  |t        | j
                  ||j                  |      |j                  |j                  |dd      |	       y )Nr   )r   r0   bucketkey
extra_argsT)r1   main_kwargsis_finaltag)rv   rx   _extra_put_object_argsr   _get_upload_task_tagr/   submitPutObjectTaskr`   r   r   )
r   r   r]   rJ   r   rY   r   rx   put_object_extra_argsput_object_tags
             r   r   z+UploadSubmissionTask._submit_upload_requestl  s     $((22	 $ ; ;  !

 22 ,

 	""))%)%?%?$3GG'  (..$=="7   	* 	
r   c                 ,   |j                   j                  }t        D ]?  }||j                  v sd|j                  d<   |j	                  dd      |j                  d<   A | j                  |j                        }	| j                  j                  |t        | j                  ||j                  |j                  |	d            }
g }| j                  |j                        }| j                  |d      }|j                   j                  }t               }|j                  |j                   |      }|j#                  ||      }|D ]e  \  }}|j%                  | j                  j                  |t'        | j                  |||j                  |j                  ||d	d
|
i      |             g | j)                  |j                        }| j                  j                  |t+        | j                  ||j                  |j                  |d|
|dd             y )NFULL_OBJECTr   Checksum r   )r   r   r   r   )r1   r   upload_part)r   r0   r   r   r   r   	upload_id)r1   r   pending_main_kwargsr   )r   partsT)r1   r   r   r   )rv   rx   r   r   replace_extra_create_multipart_argsr/   r   r
   r   r   _extra_upload_part_argsr   rz   r   adjust_chunksizemultipart_chunksizerc   appendUploadPartTask_extra_complete_multipart_argsr	   )r   r   r]   rJ   r   rY   r   rx   checksumcreate_multipart_extra_argscreate_multipart_futurepart_futuresextra_part_argsupload_part_tagrz   adjusterrb   part_iteratorr   r0   complete_multipart_extra_argss                        r   r   z.UploadSubmissionTask._submit_multipart_request  s<    $((22	 2 	H9///7D	$$^4<D<L<L=	$$%89	 '+&G&G  '
#
 #'"<"<"C"C%%)%?%?$'..$=="=	#
 66y7K7KL 33 -
 ##(($&--f.H.H$O	,EEY
 %2 	 K**11$"-1-G-G&,'.&/&6&6#,==+6*9% ()@- (! 2 	, )-(K(K  )
% 	""))'%)%?%?$'..$=="?	 "9)% 	
r   c                 .    t        || j                        S r   )r   UPLOAD_PART_ARGSr   r   s     r   r   z,UploadSubmissionTask._extra_upload_part_args  s     !T-B-BCCr   c                 .    t        || j                        S r   )r   COMPLETE_MULTIPART_ARGSr   s     r   r   z3UploadSubmissionTask._extra_complete_multipart_args  s     T-I-IJJr   c                 0    t        || j                        S N)blocklisted_keys)r   CREATE_MULTIPART_BLOCKLISTr   s     r   r   z1UploadSubmissionTask._extra_create_multipart_args  s     )H)H
 	
r   c                 0    t        || j                        S r  )r   PUT_OBJECT_BLOCKLISTr   s     r   r   z+UploadSubmissionTask._extra_put_object_args  s     )B)B
 	
r   c                 8    d }|j                  |      rt        }|S r   )rV   r   )r   r   rU   r   s       r   r   z)UploadSubmissionTask._get_upload_task_tag  s    55nE&C
r   r   )r'   r(   r)   rD   r  r   r  r   r   r   r   r   r   r   r   r   r   r   r*   r   r   r   r     sp    8*O<!:o=N!N 	""
> 7r%
Na
FD
K



r   r   c                       e Zd ZdZd Zy)r   z Task to do a nonmultipart uploadc                 ^    |5 } |j                   d|||d| ddd       y# 1 sw Y   yxY w)aP  
        :param client: The client to use when calling PutObject
        :param fileobj: The file to upload.
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.
        )BucketKeyBodyNr*   )r   )r   r   r0   r   r   r   r   s          r   _mainzPutObjectTask._main  s>      	OFNV4N:N	O 	O 	Os   #,Nr'   r(   r)   rD   r  r*   r   r   r   r     s    *
Or   r   c                       e Zd ZdZd Zy)r   z+Task to upload a part in a multipart uploadc           
          |5 } |j                   d|||||d|}	ddd       	d   }
|
|d}d|v r$|d   j                         }d| }||	v r|	|   ||<   |S # 1 sw Y   =xY w)a  
        :param client: The client to use when calling PutObject
        :param fileobj: The file to upload.
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param upload_id: The id of the upload
        :param part_number: The number representing the part of the multipart
            upload
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.

        :rtype: dict
        :returns: A dictionary representing a part::

            {'Etag': etag_value, 'PartNumber': part_number}

            This value can be appended to a list to be used to complete
            the multipart upload.
        )r
  r  UploadId
PartNumberr  NETag)r  r  r   r   r*   )r   upper)r   r   r0   r   r   r   r   r   r   responseetagpart_metadataalgorithm_namechecksum_members                 r   r  zUploadPartTask._main"  s    ,  	)v)) "& H	 !%[A*,'(;<BBDN ((89O(*19/1Jo.!	 	s   AA!Nr  r*   r   r   r   r     s
    5&r   r   )r   ior   s3transfer.compatr   r   s3transfer.constantsr   s3transfer.futuresr   s3transfer.tasksr	   r
   r   r   s3transfer.utilsr   r   r   r   r   r,   rF   rp   r   r   r   r   r   r*   r   r   <module>r      s      0 : 3   B) )XxN xNvZL!3 ZLz.!; .bG
$6 G
TK> K\OD O )T )r   