
                         ~   S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKJ	r	  SSKJ
r
  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJ
r  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK r Sr!\RD                  " 5       r#S r$SS jr%S r& " S S\	RN                  5      r(g)z.Implementation of CloudApi for s3 using boto3.    )absolute_import)division)unicode_literalsN)	cloud_api)errors)headers_util)request_config_factory)xml_metadata_field_converters)xml_metadata_util)storage_url)resource_reference)resource_util)s3_resource_reference)download_util)
exceptions)log)
properties)retry)scaled_integerl        c                     U R                   R                  S0 5      R                  S5      S:X  a%  [        R                  " SR	                  U5      5      eg )NResponseMetadataHTTPStatusCodei  z{} not found: 404.)responsegetr   NotFoundErrorformat)errorresource_names     3lib/googlecloudsdk/api_lib/storage/s3_xml/client.py_raise_if_not_found_errorr    4   sM    
^^*B/334DEL 

3::=I
JJ M    c                     [         R                  " [        R                  R                  S[         R
                  4/U S9$ )a  Decorator that catches botocore ClientErrors and raises XmlApiErrors.

Args:
  format_str (str): A googlecloudsdk.api_lib.storage.errors.S3ErrorPayload
    format string. Note that any properties that are accessed here are on the
    S3ErrorPayload object, not the object returned from botocore.

Returns:
  A decorator that catches botocore.exceptions.ClientError and returns an
    XmlApiError with a formatted error message.
N
format_str)r   !catch_error_raise_cloud_api_errorbotocorer   ClientErrorXmlApiErrorr#   s    r   &_catch_client_error_raise_s3_api_errorr)   ;   s9     
	1	1''v/A/ABC
 r!   c                     [        U R                  =(       aP    U R                  R                  =(       d3    U R                  R                  =(       d    U R                  R                  5      $ )zBChecks if RequestConfig has ACL setting aside from predefined ACL.)boolresource_argsacl_grants_to_addacl_grants_to_removeacl_file_path)request_configs    r   _modifies_full_acl_policyr1   N   sT    	"" 

&
&
8
8 8))>>8))77
 r!   c                      \ rS rSrSr\R                  R                  1rSr	Sr
\R                  R                  rS rS rSS jr\" 5       SS j5       r\" 5       S 5       rS\R*                  R,                  S	4S
 jr\R*                  R,                  4S jrS r\R*                  R,                  4S jr\" 5           SS j5       r\" 5       S 5       rS rS r\" 5       SS	\R>                  R@                  SSS4S j5       r!\" 5           SS j5       r"SSSSSS\RF                  RH                  S4S jr%\" 5          SS j5       r&S r'S r(\" 5       SSSS\RR                  RT                  4S j5       r+Sr,g) S3XmlClient[   zS3 XML Client.Nc                     [         R                  R                  R                  R	                  5       U l        U R                  5       U l        g N)r   VALUESstorages3_endpoint_urlGetendpoint_urlcreate_clientclient)selfs    r   __init__S3XmlClient.__init__f   s5    "))11AAEEGD$$&DKr!   c                     A[         R                  " 5       nUR                  5        H   u  pEUR                  R	                  XE5        M"     g r6   )r   get_additional_header_dictitemsheaders
add_header)r>   requestkwargsrD   keyvalues         r   "_add_additional_headers_to_request.S3XmlClient._add_additional_headers_to_requestj   s7    557Gmmo
oo  , &r!   c           
         [         R                  R                  R                  R	                  5       nU(       a  SnOSn[
           [        R                  " [        R                  R                  R                  U R                  U R                  UU R                  US9nUR                  R                   R#                  SU R$                  5        UsSSS5        $ ! , (       d  f       g= f)zCreates the Boto3 client.

Args:
  resource_location: (string) The name of the region associated with the
    client.

Returns:
  A boto3 client.
FN)aws_access_key_idaws_secret_access_keyregion_namer;   verifyzbefore-sign.s3.*)r   r7   authdisable_ssl_validationGetBoolBOTO3_CLIENT_LOCKboto3r=   r   ProviderPrefixS3rI   access_key_idaccess_key_secretr;   metaeventsregister_firstrJ   )r>   resource_locationrR   
verify_sslr=   s        r   r<   S3XmlClient.create_clientp   s     	55==? j j	||

$
$
'
'
-
- .. $ 6 6'((f kk''
dEE  
		s   BC
C(c                 N   AUR                   nUR                  (       a(  U R                  UR                  5      nUR                  nO4U R                  n[        R
                  R                  5       R                  nU(       a'  UR                  UR                  R                  SU0S9nO#UR                  UR                  R                  S9nUR                  (       d  UR                  (       dw  UR                  (       df  UR                  (       dU  UR                  (       dD  UR                   (       d3  UR"                  (       d"  UR$                  (       d  UR&                  (       a  U R)                  X5      $ UR+                  S5      n[,        R.                  " UR                  UUS9$ )See super class.LocationConstraint)BucketCreateBucketConfigurationrc   Location)locationmetadata)r,   rg   r<   r=   rU   sessionSessionrO   create_bucketr   bucket_namecors_file_pathlabels_file_pathlifecycle_file_path
log_bucketlog_object_prefixrequester_pays
versioningweb_error_pageweb_main_page_suffixpatch_bucketr   r   S3BucketResource)	r>   bucket_resourcer0   fields_scoper,   r=   location_constraintrh   backend_locations	            r   rk   S3XmlClient.create_bucket   sG    	"00M!!-"8"89f)22{{f!MM113??%% ,,88%9;N$O & Qh %% ,,88 & :h 	$$(F(F))]-E-E''=+G+G  M$@$@**??||J/ 11##! r!   c                 6    AU R                   R                  US9$ )ra   re   )r=   delete_bucket)r>   rl   r0   s      r   r~   S3XmlClient.delete_bucket   s     	;;$$K$88r!   Fc           	         SU0n UR                  U R                  R                  US95        U[        R                  R                  L a!  [        R                  " U R                  XQ5      $ SU R                  R                  S4SU R                  R                   S4SU R                  R"                  S	4S
U R                  R$                  S4SU R                  R&                  S4SU R                  R(                  S	4SU R                  R*                  S	44 H)  u  pxn	 U" US9n
U	(       a  U
R-                  U5      OU
XW'   M+     U[        R                  R.                  L a   U R                  R1                  US9US'   [        R                  " U R                  XQ5      $ ! [        R                  R
                   a/  n[        Xa5        [        R                  " U5      US'    SnAGNSnAff = f! [        R                  R
                   a$  n[        R                  " U5      XW'    SnAGM  SnAff = f! [        R                  R
                   a#  n[        R                  " U5      US'    SnANSnAff = f)ra   Namere   rb   N	CORSRulesT!ServerSideEncryptionConfigurationLifecycleConfigurationFLoggingEnabledPayer
VersioningWebsiteACL)updater=   get_bucket_locationr&   r   r'   r    r   r(   r   FieldsScopeSHORTr   %get_bucket_resource_from_xml_responseschemeget_bucket_corsget_bucket_encryption"get_bucket_lifecycle_configurationget_bucket_loggingget_bucket_request_paymentget_bucket_versioningget_bucket_websiter   FULLget_bucket_acl)r>   rl   
generationry   soft_deletedrh   r   rH   api_callresult_has_key
api_results              r   
get_bucketS3XmlClient.get_bucket   s)    $HAoodkk55 6   y,,222DD
++x  
dkk1148	,dkk.O.O			!		7	7	@	4;;994@	$++88$?	t{{88%@	DKK22E:
*%~2[1
/=
s+:
*& y,,1114++44K4H BBX I ** A3'-'9'9%'@h#$A4   ,, 2**512   ,, 4 ,,U34sG   (F "G.!H3 G+<$G&&G+.H0H++H03I4I//I4c              #   <  #     U R                   R                  5       nUS    H  nU[        R                  R                  :X  a  U R                  US   U5      v   M:  [        R                  " [        R                  " [        R                  R                  US   5      [        R                  " US   5      UUS   S.S9v   M     g! [        R                  R                    a4  n["        R$                  " [&        R(                  " U5      5         SnAgSnAff = f7f)ra   Bucketsr   CreationDateOwner)rc   r   )creation_timerh   N)r=   list_bucketsr   r   r   r   r   rw   r   CloudUrlrV   rW   r   convert_datetime_object_to_utcr&   r   r'   core_exceptionsreraiser   r(   )r>   ry   r   bucketr   s        r   r   S3XmlClient.list_buckets   s     9))+hY'&900555v=
=%66"";#=#=#@#@#)&>3)HH(* ##G, 	 ( ** 9f007889s/   DCC DD%*DDDDc                 0   UR                   R                  US'    U" S0 UD6  g ! [        R                  R                   aS  n[        XAR                   R                  5        [        R                  " [        R                  " U5      5         S nAg S nAff = f)Nrc    )
r   rl   r&   r   r'   r    r   r   r   r(   )r>   rx   patch_functionpatch_kwargsr   s        r   _make_patch_requestS3XmlClient._make_patch_request  sr    ,88DDL+$|$** +'B'B'N'NO	ii""5)**+s   $ BA	BBc           	         UR                   n[        U5      (       d  UR                  (       a  0 n[        U5      (       a|  [        USS5      (       a$  [        R
                  " UR                  5      US'   OFU R                  R                  UR                  R                  S9n[        R                  " Xb5      US'   UR                  (       a  UR                  US'   U R                  XR                  R                  U5        UR                  (       aG  U R                  UU R                  R                   S[        R"                  " UR                  5      05        UR$                  (       aG  U R                  UU R                  R&                  S[        R(                  " UR$                  5      05        UR*                  (       aG  U R                  UU R                  R,                  S[        R.                  " UR*                  5      05        UR0                  (       d  UR2                  (       aR  U R                  UU R                  R4                  S	[        R6                  " UR0                  UR2                  5      05        UR8                  (       aG  U R                  UU R                  R:                  S
[        R<                  " UR8                  5      05        UR>                  (       aG  U R                  UU R                  R@                  S[        RB                  " UR>                  5      05        URD                  (       d  URF                  (       aR  U R                  UU R                  RH                  S[        RJ                  " URD                  URF                  5      05        U RM                  UR                  R                  US9$ )ra   r/   NAccessControlPolicyre   r   CORSConfigurationTaggingr   BucketLoggingStatusRequestPaymentConfigurationVersioningConfigurationWebsiteConfiguration)ry   )'r,   r1   predefined_acl_stringgetattrr
   process_acl_filer/   r=   r   r   rl   r   ,get_acl_policy_with_added_and_removed_grantsr   put_bucket_aclrm   put_bucket_corsprocess_corsrn   put_bucket_taggingprocess_labelsro   "put_bucket_lifecycle_configurationprocess_lifecyclerp   rq   put_bucket_loggingprocess_loggingrr   put_bucket_request_paymentprocess_requester_paysrs   put_bucket_versioningprocess_versioningrt   ru   put_bucket_websiteprocess_websiter   )r>   rx   r0   ry   r,   put_acl_kwargsexisting_acl_dicts          r   rv   S3XmlClient.patch_bucket  s)   
 #00M 00,,n	">	2	2=/488+<<-- .
/ #kk88$00<< 9 >
  LL# .
/ 
	-	- . D Du
0J0J-/ ##


++
%
%!#@#M#M..$ %%


++
(
(6EE00 ((


++
8
8&/AA#77
 =#B#B


++
(
(#/??#..0O0O
 ##


++
0
0+/FF#22
 


++
+
+'/BB#..
 ##}'I'I


++
(
($/??#22#88 ??##//l  L Lr!   c                    [        U5      (       a  [        UR                  SS5      nU(       a  [        R                  " U5      n	OXU R
                  R                  UR                  R                  UR                  R                  S9n
[        R                  " X5      n	UR                  R                  UR                  R                  U	S.nU R
                  R                  " S0 UD6  OSn	UR                  R                  UR                  R                  S.nUR                  R                  (       a  UR                  R                  US'   UR                  R                  UR                  R                  US.nU(       aF  SUS'   [        R                  " [        R                  " UR                  UR                  5      U5        OA[        R                   " UUUS	9(       a&  SUS'   [        R"                  " UR                  U5        [        R$                  " XUS
9  U R
                  R&                  " S0 UD6nU(       a  U" UR(                  5        [        R*                  " U R,                  UUS   US   U	S9$ )ra   r/   Nrc   Key)rc   r   r   	VersionId)rc   r   
CopySourceREPLACEMetadataDirective)attributes_resourceknown_posix)posix_to_setrc   r   )acl_dictr   )r1   r   r,   r
   r   r=   get_object_aclr   rl   r   r   r   put_object_aclr   copy_object_metadatarh   0is_user_metadata_field_present_in_request_configcopy_user_metadata_fields/update_object_metadata_dict_from_request_configcopy_objectsize%get_object_resource_from_xml_responser   )r>   source_resourcedestination_resourcer0   r   progress_callbackshould_deep_copy_metadatar   r/   r   r   r   source_kwargscopy_kwargscopy_responses                  r   r   S3XmlClient.copy_object  s6    !00n::O"$m	0AA-P KK66'33??$00>> 7 @ JJ! 	 )44@@%11??!)n
 kk  2>2h.::FF+77EEGM""--#2#>#>#I#ImK  '22>>#//==#K !)2k%&,,

0
0"++&&  
	K	K
1"

 ,5'(33$$k	
 EE, KK++:k:M,,-BBHE r!   c                     AUR                   UR                  S.nUR                  (       a  UR                  US'   U R                  R                  " S0 UD6$ )ra   r   r   r   )rl   r   r   r=   delete_object)r>   
object_urlr0   delete_object_kwargss       r   r   S3XmlClient.delete_object  sX     	 (('' *4*?*?;';;$$<';<<r!   c                    UR                   UR                  S.nUc  SR                  U5      US'   OSR                  XV5      US'   UR                  b  [	        UR                  5      US'   U R
                  R                  " S0 UD6nUn	US   R                  [        R                  " [        R                  R                  R                  R                  5       5      5       H[  n
UR                  U
5        UR!                  5        H  nUR#                  U
5        M     U	[%        U
5      -  n	U(       d  MS  U" U	5        M]     UR'                  S5      $ )	Nr   z	bytes={}-Rangezbytes={}-{}r   BodyContentEncodingr   )r   namer   r   strr=   
get_objectiter_chunksr   ParseIntegerr   r7   r8   download_chunk_sizer:   writevaluesr   lenr   )r>   cloud_resourcedownload_stream	digestersr   
start_byteend_byteget_object_argsr   processed_byteschunkhash_objects               r   _download_objectS3XmlClient._download_object  s6    !''""O !,!3!3J!?og!.!5!5j!Kog  ,%()B)B%Cok"{{%%88H O&!--##%%99==?	AB E""))++5! , U#o		/*B <<)**r!   c                   ^ ^^^^^
 XVS.m
UUUUU
U 4S jnUU
4S jn[         R                  " [        R                  R                  R
                  R                  5       [        R                  R                  R                  R                  5       S-  [        R                  R                  R                  R                  5       S9n	U	R                  U[        R                  R                  R                  R                  5       S-  US9$ )N)r  r  c            	      <   > TR                  T TTTTS   TS   5      $ )Nr  r  )r  )r   r   r   r   progress_stater>   s   r   _call_download_objectES3XmlClient._download_object_resumable.<locals>._call_download_object  s3     ""
/96G

&z(BD Dr!   c                   > [         R                  R                   H`  n[        X5      (       d  M  TR	                  5       nUTS   :  a  UTS'   SUl        [        R                  " SR                  XPU5      5          g   g)Nr  r   z=Retrying download from byte {} after exception: {}. Trace: {}TF)	
s3transferutilsS3_RETRYABLE_DOWNLOAD_ERRORS
isinstancetellretrialr   debugr   )exc_type	exc_valueexc_tracebackstateretryable_error_typer  r   r  s         r    _should_retry_resumable_downloadPS3XmlClient._download_object_resumable.<locals>._should_retry_resumable_download  sx    ","2"2"O"O
i66&++-*.66+5N<(EM
)) !!'
m!LN #P r!   i  )max_retrialswait_ceiling_msexponential_sleep_multiplier)sleep_msshould_retry_if)r   Retryerr   r7   r8   max_retriesGetIntmax_retry_delayr  RetryOnExceptionbase_retry_delay)r>   r   r   r   r   r  r  r  r  retryerr  s   `````     @r   _download_object_resumable&S3XmlClient._download_object_resumable  s     %/END D mm&&..::AAC"))11AAHHJ %%BBIIKNG ##""**;;BBDtK8 $ : :r!   r   c
                     AA[         R                  " X5      (       a  gUb  Un
O0 n
U[        R                  R                  :X  a  U R                  XXX5      nU$ U R                  XXX5      nU$ )ra   N)r   (return_and_report_if_nothing_to_downloadr   DownloadStrategy	RESUMABLEr)  r  )r>   r   r   r0   r   do_not_decompressdownload_strategyr   r  r  digesters_dictcontent_encodings               r   download_objectS3XmlClient.download_object(  s     	)==   nnI66@@@88
>
  	 ..
>
  r!   c           
         AAXS.nUb  XGS'    U R                   R                  " S0 UD6nU[        R                  R                  L a3   U R                   R                  " S0 UD6n
U
R                  SS5        XS'   U(       aO  U[        R                  R$                  La2   U R                   R&                  " S0 UD6nUR)                  SS5      US'   [0        R2                  " U R4                  XU5      $ ! [        R                  R                   aK  n	[        U	[        R                  " [        R                  R                  UX$5      R                  5        U	eSn	A	ff = f! [        R                  R                   a$  n[         R"                  " U5      US'    SnAGN!SnAff = f! [*         a!  n[,        R.                  " SU5         SnANSnAff = f)	ra   r   Nr   r   r   TagSetz$Failed to get object tags, error: %sr   )r=   head_objectr&   r   r'   r    r   r   rV   rW   
url_stringr   r   r   r   popr   r(   r   get_object_taggingr   	Exceptionr   warningr   r   r   )r>   rl   object_namer0   r   ry   r   rF   object_dicteacl_responser   tags_responses                r   get_object_metadataS3XmlClient.get_object_metadataJ  s    	$9G 'kKK++6g6k y,,1117{{11<G<+T2)E I,A,A,G,GG	66AA - 1 1(D AH BB[{ 9 ** 



{99<<k*88B
D g   ,, 7#//6E7  
 	:EBsH   C3 	2E  1F$ 3EAEEF!=FF!$
G.G

GTc
              #     #    AAAA	U[         R                  R                  :X  a  Sn
SnOSn
Sn U R                  R	                  U
5      nUR                  UUb  UOSUb  UOSS9nU GH  nUR                  U/ 5       H  nU[         R                  R                  L ag  U R                  UUS   [        R                  " [        R                  " [        R                  R                  S	95      UR                  S
5      US9v   M  [         R"                  " U R$                  X5      v   M     UR                  S/ 5       H'  n[         R&                  " U R$                  UU5      v   M)     GM     g! [(        R*                  R,                   a4  n[.        R0                  " [2        R4                  " U5      5         SnAgSnAff = f7f)ra   list_object_versionsVersionslist_objects_v2ContentsN )rc   Prefix	Delimiterr   r   r   )rl   r=  r0   r   ry   CommonPrefixes)r   ObjectStateLIVE_AND_NONCURRENTr=   get_paginatorpaginater   r   r   rB  r	   get_request_configr   r   rV   rW   r   r   r   %get_prefix_resource_from_xml_responser&   r   r'   r   r   r   r(   )r>   rl   prefix	delimiterry   halt_on_empty_responseinclude_folders_as_prefixesnext_page_tokenobject_statelist_filterapi_method_nameobjects_key	paginatorpage_iteratorpager>  prefix_dictr   s                     r   list_objectsS3XmlClient.list_objects  s     	#y,,@@@.ok)ok9++++O<i((!-2!*!6IB ) @m  $88K4KY22777
 **''.5HH((0J0J0M0MN P&??;7) + + + $II[  5"  88$4b9K!GGkk;  :%  , ** 9f007889s/   ,GD>E. -G.G *F;6G;G  Gc                 J    AU R                  XUS9nU R                  UUUUSS9$ )ra   )r   T)r   r   r0   r   r   )rB  r   )	r>   rl   r=  object_resourcer0   ry   r   r   r   s	            r   patch_object_metadata!S3XmlClient.patch_object_metadata  sH     	..Z / 9O',%!"&   r!   c           
         UR                   R                  nUR                   R                  n[        R                  " [
        R                  R                  R                  R                  5       5      n[        R                  " [
        R                  R                  R                  R                  5       5      nU R                  R                  U[        R                  R                  R!                  SUUS9UUUS9  U R#                  XE[$        R&                  " [         R(                  " [         R*                  R,                  S95      5      $ )a  Uploads the data using boto3's managed transfer utility.

Calls the upload_fileobj method which performs multi-threaded multipart
upload automatically. Performs slightly better than put_object API method.
However, upload_fileobj cannot perform data intergrity checks and we have
to use put_object method in such cases.

Args:
  source_stream (a file-like object): A file-like object to upload. At a
    minimum, it must implement the read method, and must return bytes.
  destination_resource (resource_reference.ObjectResource|UnknownResource):
    Represents the metadata for the destination object.
  extra_args (dict): Extra arguments that may be passed to the client
    operation.

Returns:
  resource_reference.ObjectResource with uploaded object's metadata.
F)use_threadsmultipart_chunksizemultipart_threshold)FileobjConfigrc   r   	ExtraArgsrL  )r   rl   r   r   r   r   r7   r8   ri  r:   rj  r=   upload_fileobjrU   s3transferTransferConfigrB  r	   rR  r   rV   rW   )r>   source_streamr   
extra_argsrl   r=  ri  rj  s           r   &_upload_using_managed_transfer_utility2S3XmlClient._upload_using_managed_transfer_utility  s   ( '22>>K&22@@K(55!!5599;=(55!!5599;=KK xx  // 3 3 0 5   
 ##11  (B(B(E(EF	HI Ir!   c                 N   UR                   R                  UR                   R                  US.nUR                  U5        U R                  R
                  " S0 UD6n[        R                  " U R                  UUR                   R                  UR                   R                  5      $ )a  Uploads the source stream using the put_object API method.

Args:
  source_stream (a seekable file-like object): The stream of bytes to be
    uploaded.
  destination_resource (resource_reference.ObjectResource|UnknownResource):
    Represents the metadata for the destination object.
  extra_args (dict): Extra arguments that may be passed to the client
    operation.

Returns:
  resource_reference.ObjectResource with uploaded object's metadata.
)rc   r   r   r   )	r   rl   r   r   r=   
put_objectr   r   r   )r>   rr  r   rs  rG   r   s         r   _upload_using_put_object$S3XmlClient._upload_using_put_object  s      '22>>#//==F
 MM*{{%%//HBB((44((66	 r!   c	                    AAU[         R                  R                  :X  a/  [        R                  " SR                  UR                  5      5      e0 n	[        U[        R                  5      (       a   UR                  (       a  UR                  U	S'   [        R                  " U	UUUS9  [        UR                  SS5      n
U
(       Ga
  U[         R                  R                  L a  [         R"                  " S5        OU[         R                  R$                  L a  UR                  R&                  [(        :  aH  [         R*                  " SU
5        [         R"                  " S[(        UR                  R&                  5        OBUR                  R&                  b  UR                  R&                  U	S	'   U R-                  UX)5      $ U	R/                  S
5        U R1                  XU	5      $ )ra   zInvalid upload strategy: {}.Metadata)r   r   md5_hashNz9S3 does not support MD5 validation for streaming uploads.zThe MD5 hash %s will be ignoredzZS3 does not support MD5 validation for the entire object if size > %d bytes. File size: %dContentLength
ContentMD5)r   UploadStrategyr.  command_errorsErrorr   rI   r  r   ObjectResourcecustom_fieldsr   r   r   r,   	STREAMINGr   r<  SIMPLEr   MAX_PUT_OBJECT_SIZEr  rx  r9  rt  )r>   rr  r   r0   r   serialization_datar   tracker_callbackupload_strategyrs  r|  s              r   upload_objectS3XmlClient.upload_object  s    	,)22<<<  
(
/
/0E0E
FH H
 J/#5#D#DEE		&	&!0!>!>
:EE+!	 ~33ZFH 
I44>>	>OP i66==='',,/BB
))5x
@
++01D**//1
 ))..:*8*F*F*K*KJ'..}/CQ Q nn\"
 66Z9 9r!   )r=   r;   r6   )NNFN)NNNF)NNN)-__name__
__module____qualname____firstlineno____doc__r   
CapabilityCLIENT_SIDE_HASH_VALIDATIONcapabilitiesrX   rY   r   rV   rW   r   r?   rJ   r<   r)   rk   r~   r   NO_ACLr   r   r   rv   r   r   r  r)  r-  ONE_SHOTr3  rB  rN  LIVEra  re  rt  rx  r  r  r  __static_attributes__r   r!   r   r3   r3   [   s    66, -%%((&'- D *+ ,@ *+9 ,9 ((//5n '0&;&;&B&B 9(+ !* 5 5 < <zLx *+  %O ,Ob *+
= ,
=+8#:J *+
 !%(-(1(B(B(K(K(,!"# ,B *+
 2 ,2n !"&((--69p *+  ,,(IT: *+ ..55A9 ,A9r!   r3   r6   ))r  
__future__r   r   r   	threadingrU   r&   googlecloudsdk.api_lib.storager   r   r   r	   r
   r   "googlecloudsdk.command_lib.storager  r   ,googlecloudsdk.command_lib.storage.resourcesr   r   r   +googlecloudsdk.command_lib.storage.tasks.cpr   googlecloudsdk.corer   r   r   r   googlecloudsdk.core.utilr   r   r  r  LockrT   r    r)   r1   CloudApir3   r   r!   r   <module>r     s    5 '  '    4 1 7 A H < G : K F N E = # * * 3  $ NN$ K&	|9)$$ |9r!   