
    Cx                     x   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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r"Sr#Sr$Sr%Sr&Sr'Sr(Sr)Sr*\RV                  RX                  \RZ                  " S \R\                  R^                  S\R\                  R`                  S\R\                  Rb                  S05      \RV                  Rd                  \RZ                  " S \R\                  R^                  S \R\                  R`                  S!\R\                  Rb                  S"05      0r3S#r4S$ r5S% r6S& r7S' r8S7S( jr9\RV                  RX                  4S) jr:/ S*Qr;S+ r< S8S, jr=S- r>S. r?S/ r@S0rAS1rBS2 rC\R                  \R                  " \R                  R                  5       " S3 S4\R                  5      5       5       rI\R                  \R                  " \R                  R                  5       " S5 S6\I5      5       5       rKg)9z-Command to install on-premise Transfer agent.    )absolute_import)division)unicode_literalsN)agent_pools_util)apis)arg_parsers)base)agents_util)
creds_util)log)
properties)	gce_cache)universe_descriptor)	platforms)clienta  
Specify the number of agents to install on your current machine.
System requirements: 8 GB of memory and 4 CPUs per agent.

Note: If the 'id-prefix' flag is specified, Transfer Service increments a number
value after each prefix. Example: prefix1, prefix2, etc.
a  
Specify the path to the service account's credentials file.

No input required if authenticating with your user account credentials,
which Transfer Service will look for in your system.

Note that the credentials location will be mounted to the agent container.
a  
If you want to grant agents access to specific parts of your filesystem
instead of the entire filesystem, specify which directory paths to
mount to the agent container. Multiple paths must be separated by
commas with no spaces (e.g.,
--mount-directories=/system/path/to/dir1,/path/to/dir2). When mounting
specific directories, gcloud transfer will also mount a directory for
logs (either /tmp or what you've specified for --logs-directory) and
your Google credentials file for agent authentication.

It is strongly recommended that you use this flag. If this flag isn't specified,
gcloud transfer will mount your entire filesystem to the agent container and
give the agent root access.
a"  
Specify the network to connect the container to. This flag maps directly
to the `--network` flag in the underlying '{container_managers} run' command.

If binding directly to the host's network is an option, then setting this value
to 'host' can dramatically improve transfer performance.
zP
Could not find project ID. Try adding the project flag: --project=[project-id]
a}  
Specify the HTTP URL and port of a proxy server if you want to use a forward
proxy. For example, to use the URL 'example.com' and port '8080' specify
'http://www.example.com:8080/'

Ensure that you specify the HTTP URL and not an HTTPS URL to avoid
double-wrapping requests in TLS encryption. Double-wrapped requests prevent the
proxy server from sending valid outbound requests.
zm
Credentials file not found at {creds_file_path}.

{fix_suggestion}.

Afterwards, re-run {executed_command}.
a  
To confirm your agents are connected, go to the following link in your browser,
and check that agent status is 'Connected' (it can take a moment for the status
to update and may require a page refresh):

https://console.cloud.google.com/transfer/on-premises/agent-pools/pool/{pool}/agents?project={project}

If your agent does not appear in the pool, check its local logs by running
"{logs_command}". The container ID is the string of random
characters printed by step [2/3]. The container ID can also be found by running
"{list_command}".
a  
Allow the agent to work with S3-compatible sources. This flag blocks the
agent's ability to work with other source types (e.g., file systems).

When using this flag, you must provide source credentials either as
environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` or
as default credentials in your system's configuration files.

To provide credentials as environment variables, run:

```
AWS_ACCESS_KEY_ID="id" AWS_SECRET_ACCESS_KEY="secret" gcloud transfer agents install --s3-compatible-mode
```
c                      g)N'https://docs.docker.com/engine/install/ r       &lib/surface/transfer/agents/install.py<lambda>r      s    9r   r   z^https://docs.docker.com/engine/install/binaries/#install-server-and-client-binaries-on-windowszQhttps://docs.docker.com/engine/install/binaries/#install-client-binaries-on-macosc                      g)Nz$https://podman.io/docs/installation/r   r   r   r   r   r      s    6r   z8https://podman.io/docs/installation/#installing-on-linuxz,https://podman.io/docs/installation/#windowsz*https://podman.io/docs/installation/#macosa  
The agent runs inside a {container_manager} container, so you'll need
to install {container_manager} before finishing agent installation.

See the installation instructions at
{installation_guide_url} and re-run
'{executed_command}' after {container_manager} installation.
c                 @    U (       a  SOSnU UR                    SU S3$ )aY  Returns the container command for the given subcommand and container manager.

Args:
  use_sudo (bool): Whether to use sudo in the command.
  container_manager (agents_util.ContainerManager): The container manager.
  subcommand (str): The subcommand to run.

Returns:
  str: The container command for the given subcommand and container manager.
zsudo  z container z [container ID])value)use_sudocontainer_manager
subcommandsudo_prefixs       r   _get_container_subcommandr       s4     $+	'--. /

_&r   c                     U c  g[         R                  R                  [         R                  R                  U 5      5      $ )zConverts relative and symbolic paths to absolute paths.

Args:
  path (str|None): The path to expand. If None, returns None.

Returns:
  str|None: The absolute path or None if path is None.
N)ospathabspath
expanduserr#   s    r   _expand_pathr'      s.     
\	++D1	22r   c                  @    SR                  [        R                  5      $ )z}Returns the run command. Does not include environment variables.

Returns:
  str: The command that was executed by the user.
 )joinsysargvr   r   r   _get_executed_commandr-      s     
#((	r   c                 l    [         R                  " SR                  SR                  U 5      5      5        g)zoLogs the command used to create the agent.

Args:
  command (list[str]): The command used to create the agent.
zCreated agent with command:
{}r)   N)r   infoformatr*   )commands    r   _log_created_agentr2      s%     ((,33CHHW4EFGr   c                    U (       aY  [        U 5      n[        R                  R                  U5      (       d(  Sn[	        [
        R                  UU[        5       S95      eU$ [        R                  " 5       n[        R                  R                  U5      (       a  U$ [        R                  " SS9(       a  gSn[	        [
        R                  UU[        5       S95      e)zEnsures agent will be able to authenticate and returns creds.

Args:
  creds_file_supplied_by_user (str): The path to the credentials file.

Returns:
  str: The path to the credentials file.

Raises:
  OSError: If the credentials file is not found.
z:Check for typos and ensure a creds file exists at the path)creds_file_pathfix_suggestionexecuted_commandF)	check_ageNzRTo generate a credentials file, please run `gcloud auth application-default login`)r'   r"   r#   existsOSErrorMISSING_CREDENTIALS_ERROR_TEXTr0   r-   oauth2_client_get_well_known_filer   GetOnGCE)creds_file_supplied_by_userr4   r5   s      r   %_authenticate_and_get_creds_file_pathr?      s     !"#>?O77>>/**
F 
(
/
/-+46 0 89 9
 !668/WW^^O$$%(?.$++)'02 , 4	5 5r   c                    U R                   n[        R                  " U5      (       a  g[        R                  " SR                  UR                  5       5      5        [        U [        R                  " 5       [        5       S9n[        U5      e)zChecks for binary identified by container_manager is in system PATH.

Args:
  container_manager (agents_util.ContainerManager): The container manager.

Raises:
  OSError: If the binary is not found.
Nz[2/3] {} not found)r   
current_osr6   )r   shutilwhichr   errorr0   title._get_help_text_for_container_manager_not_foundr   OperatingSystemr-   r9   )r   r1   help_strs      r   (_check_if_container_manager_is_installedrI     sm     ##'\\'
 )) ''89;)**,,.(
 	r   )	)enable_multipart--enable-multipart)hdfs_data_transfer_protection--hdfs-data-transfer-protection)hdfs_namenode_uri--hdfs-namenode-uri)hdfs_username--hdfs-username)kerberos_config_file--kerberos-config-file)kerberos_keytab_file--kerberos-keytab-file)kerberos_service_principal--kerberos-service-principal)kerberos_user_principal--kerberos-user-principal)!max_concurrent_small_file_uploadsz--entirefile-fr-parallelismc                     [          H6  u  p#[        XS5      nUc  M  UR                  SR                  X45      5        M8     g)zAdds user flags values directly to Docker/Podman command.

Args:
  user_args (argparse.Namespace): The user arguments.
  container_args (list[str]): The container arguments.
Nz{}={})_ADD_IF_PRESENT_PAIRSgetattrappendr0   )	user_argscontainer_argsuser_argcontainer_flag
user_values        r   '_add_container_flag_if_user_arg_presentrd   7  s:     #8hd3JGNN>FG #8r   c                 	   / nU(       a  UR                  S5        [        R                  R                  U 5      nUR	                  UR
                  SSSR                  U R                  5      SS/5        [        R                  " 5       u  pgU(       a1  UR                  S5        UR                  SR                  U5      5        U(       a1  UR                  S5        UR                  S	R                  U5      5        U R                  (       a*  UR                  S
R                  U R                  5      5        [        U5      n[        U R                  5      n	[        R                  R                  [        R                   5      n
[        R                   nU R"                  (       + =(       d#    XR"                  ;   =(       d    XR"                  ;   nU(       a  UR                  S5        OuSR                  U	5      /nUb  UR                  SR                  US95        U R"                   H!  nUR                  SR                  US95        M#     UR	                  U5        U R$                  (       a;  UR                  S5        UR                  SR                  U R$                  5      5        Sn[&        R(                  " 5       (       d2  [*        R,                  " 5       nSUR.                   SUR0                   S3nU S3SR                  U R2                  5      SR                  [4        R6                  " 5       5      SR                  U	5      SR                  U5      /nUb   UR                  SR                  U5      5        U(       a  UR                  S5        U R8                  (       aI  U R:                  b  U R8                  S-   nOU R8                  nUR                  SR                  U5      5        [=        U S S5      nU(       a   UR                  S!R                  U5      5        [?        U U5        U R@                  (       a  UR                  S"5        [&        R(                  " 5       (       dR  [&        RB                  RD                  RF                  RI                  5       nUR                  S#R                  U5      5        UU-   $ )$aG  Returns container run command from user arguments and generated values.

When `elevate_privileges` is True, the command will be run with sudo and
SELinux will be disabled by passing appropriate security-opt flags. This is
needed for running the agent in a container that is not owned by the user.

Args:
  args (argparse.Namespace): The user arguments.
  project (str): The project to use for the agent.
  creds_file_path (str): The path to the credentials file.
  elevate_privileges (bool): Whether to use sudo and disable SELinux.

Returns:
  list[str]: The container run command.
sudorunz--ulimitz
memlock={}z--rmz-dz--envzAWS_ACCESS_KEY_ID={}zAWS_SECRET_ACCESS_KEY={}z--network={}z-v=/:/transfer_rootz
-v={}:/tmpNz&-v={creds_file_path}:{creds_file_path})r4   z-v={path}:{path}r&   zHTTPS_PROXY={}zgcr.io/zdocker./z/cloud-ingest/zcloud-ingest/tsop-agent:latestz--agent-pool={}z--hostname={}z--log-dir={}z--project-id={}z--creds-file={}z--enable-mount-directory0z--agent-id-prefix={}gcs_api_endpointz--gcs-api-endpoint={}z--enable-s3z--universe-domain={})%r^   r
   ContainerManager	from_argsextendr   r0   memlock_limitr   get_default_aws_credsnetworkr'   logs_directoryr"   r#   r$   sepmount_directoriesproxyr   IsDefaultUniverser   GetUniverseDomainDescriptorartifact_registry_domainproject_prefixpoolsocketgethostname	id_prefixcountr]   rd   s3_compatible_modeVALUEScoreuniverse_domainGet)argsprojectr4   elevate_privilegesbase_container_commandr   aws_access_keyaws_secret_keyexpanded_creds_file_pathexpanded_logs_directory_pathroot_with_driveroot_without_drivemount_entire_filesystemmount_flagsr#   docker_uri_prefixuniverse_descriptor_obj
agent_argsagent_id_prefixrj   r   s                        r   _get_container_run_commandr   D  s    $ !!&)!22<<TB$,,-
!  $.#C#C#E .!!'*!!"8"?"?"OP!!'*!!")).9 
\\!!."7"7"EF)/:!-d.A.A!BGGOOBFF+/vv

 
   6	22	26	55	5 
 !!"78 	89K  +
2
9
96 : 8 &&+222=> ' !!+.	ZZ!!'*!!"2"9"9$**"EF  		%	%	'	'1MMO
)BBC
#223>	C  
9:tyy)V//1289w'* )'../GHI01	^^zz,oo,33ODET#5t<-445EFG)$
;	m$ 
	%	%	'	' '',,<<@@BO,33ODE	*	,,r   c                     [        XU5      n[        R                  " USS9nUR                  S:X  a  [	        U5        U$ [
        R                  R                  U 5      n[        R                  R                  SR                  UR                  R                  5       5      5        [        XUSS9n[        R                  " USS9nUR                  S:X  a  [	        U5        U$ SR                  U5      n[        SU 35      e)	aM  Generates, executes, and returns agent install and run command.

Args:
  args (argparse.Namespace): The user arguments.
  project (str): The project to use for the agent.
  creds_file_path (str): The path to the credentials file.

Returns:
  list[str]: The container run command.

Raises:
  OSError: If the command fails to execute.
Fcheckr   z2
Could not execute {} command. Trying with "sudo".T)r   r)   zError executing command:
)r   
subprocessrg   
returncoder2   r
   rk   rl   r   statusPrintr0   r   rE   r*   r9   )	r   r   r4   container_run_commandcompleted_processr   )elevated_privileges_container_run_commandelevated_prev_completed_processcommand_strs	            r   _execute_container_commandr     s     5
_ !nn%:%H!!Q&,-  !22<<TB**;BB

!
!
'
'
)
 /I
_/+ %/NN/u%! %//14@A44./+,[M:;;r   c                 >   Sn[        U5       H  u  pEUR                  S5      (       d  M  Un  O   [        SU 5       H]  n[        R                  " U5      nU(       a  SR                  U[        U5      5      Xs'   [        R                  " USS9  [        U5        M_     g)zCreates multiple identical agents.

Args:
  agent_count (int): The number of agents to create.
  agent_id_prefix (str): The prefix to add to the agent ID.
  container_command (list[str]): The container command to execute.
z--agent-id-prefix=   z--agent-id-prefix={}{}Tr   N)
	enumerate
startswithrangecopydeepcopyr0   strr   rg   r2   )agent_countr   container_commandidx_agent_prefixidxtokenr}   container_command_copys           r   _create_additional_agentsr     s     /0jc,-- 1
 Q$e!]]+<= #
)
)/3u:
F . NN)6-. %r   c                     U [         ;  a  [        SU  35      e[         U    U   n[        R                  U R                  R                  5       UUS9$ )a  Returns the help text for when the container manager is not found.

Args:
  container_manager (agents_util.ContainerManager): The container manager.
  current_os (platforms.OperatingSystem): The current operating system.
  executed_command (str): The command that was executed.

Returns:
  str: The help text for when the container manager is not found.

Raises:
  ValueError: If the container manager is not supported.
z!Container manager not supported: )r   installation_guide_urlr6   ),CONTAINER_MANAGER_INSTALLATION_GUIDE_URL_MAP
ValueError%CONTAINER_MANAGER_NOT_FOUND_HELP_TEXTr0   r   rE   )r   rA   r6   r   s       r   rF   rF     sm      JJ
89J8KL
MM H 
/	5	5)//5573' 
6 
 r   z    Install Transfer Service agents to enable you to transfer data to or from
    POSIX filesystems, such as on-premises filesystems. Agents are installed
    locally on your machine and run inside {container_managers} containers.
a|      To create an agent pool for your agent, see the
    `gcloud transfer agent-pools create` command.

    To install an agent that authenticates with your user account credentials
    and has default agent parameters, run:

      $ {command} --pool=AGENT_POOL

    You will be prompted to run a command to generate a credentials file if
    one does not already exist.

    To install an agent that authenticates with a service account with
    credentials stored at '/example/path.json', run:

      $ {command} --creds-file=/example/path.json --pool=AGENT_POOL

    To install an agent using service account impersonation, run:

      $ {command} --creds-file=/example/path.json --pool=CUSTOM_AGENT_POOL --impersonate-service-account=impersonated-account@project-id.iam.gserviceaccount.com

    Note : The `--impersonate-service-account` flag only applies to the API
    calls made by gcloud during the agent installation and authorization process.
    The impersonated credentials are not passed to the transfer agent's runtime
    environment. The agent itself does not support impersonation and will use
    the credentials provided via the `--creds-file` flag or the default gcloud
    authenticated account for all of its operations. To grant the agent permissions,
    you must provide a service account key with the required direct roles
    (e.g., Storage Transfer Agent, Storage Object User)
c                     U [         R                  R                  :H  nU(       a  SOSn[        R	                  US9nU[
        S.$ )zReturns the detailed help dictionary for the install command based on the release track.

Args:
  release_track (base.ReleaseTrack): The release track.

Returns:
  dict[str, str]: The detailed help dictionary for the install command.
zDocker or PodmanDockercontainer_managers)DESCRIPTIONEXAMPLES)r	   ReleaseTrackALPHAINSTALL_CMD_DESCRIPTION_TEXTr0   INSTALL_CMD_EXAMPLES_TEXT)release_trackis_alphar   description_texts       r   _get_detailed_help_textr   I  sP     d//555(-5)8188+ 9  &+
 r   c                       \ rS rSrSr\" \R                  R                  5      r	\
\R                  R                  4S j5       rS rSrg)Installi]   Install Transfer Service agents.c                 v   U R                  SSSS9  U R                  S[        [        S9  U R                  S[        S9  U[        R
                  R                  :X  a"  U R                  S	S
[        R                  SS9S9  U R                  S[        R                  SS9  U R                  SSS9  U R                  SSSS9  U R                  SS[        SS9  U R                  S[        R                  " 5       S[        S9  U R                  S[        S9  U R                  SS [        S9  U R                  S!S"S#9nUR                  S$S%S9  UR                  S&S'S9  UR                  S(/ S)QS*S+9  U R                  S,S"S#9nUR                  S-S.S9  UR                  S/S0S9  UR                  S1S2S9  UR                  S3S4S9  g5)6zAdd arguments for the install command.

Args:
  parser (argparse.ArgumentParser): The argument parser for the command.
  release_track (base.ReleaseTrack): The release track.
z--poolTzThe agent pool to associate with the newly installed agent. When creating transfer jobs, the agent pool parameter will determine which agents are activated.)requiredhelpz--counttyper   z--creds-filer   z--docker-networkrp   dockerr   destr   rK   a  Split up files and transfer the resulting chunks in parallel before merging them at the destination. Can be used make transfers of large files faster as long as the network and disk speed are not limiting factors. If unset, agent decides when to use the feature.)actionr   z--id-prefixzEAn optional prefix to add to the agent ID to help identify the agent.z--logs-directoryz/tmpzSpecify the absolute path to the directory you want to store transfer logs in. If not specified, gcloud transfer will mount your /tmp directory for logs.)defaultr   z--memlock-limiti zSet the agent container's memlock limit. A value of 64000000 (default) or higher is required to ensure that agent versions 1.14 or later have enough locked memory to be able to start.)r   r   r   z--mount-directorieszMOUNT-DIRECTORIES)r   metavarr   z--proxyz--s3-compatible-mode
store_trueHDFSF)category	sort_argsrO   a  A URI representing an HDFS cluster including a schema, namenode, and port. Examples: "rpc://my-namenode:8020", "http://my-namenode:9870".

Use "http" or "https" for WebHDFS. If no schema is provided, the CLI assumes native "rpc". If no port is provided, the default is 8020 for RPC, 9870 for HTTP, and 9871 for HTTPS. For example, the input "my-namenode" becomes "rpc://my-namenode:8020".rQ   z<Username for connecting to an HDFS cluster with simple auth.rM   )authentication	integrityprivacyzClient-side quality of protection setting for Kerberized clusters. Client-side QOP value cannot be more restrictive than the server-side QOP value.)choicesr   KerberosrS   zPath to Kerberos config file.rU   zfPath to a Keytab file containing the user principal specified with the --kerberos-user-principal flag.rY   zTKerberos user principal to use when connecting to an HDFS cluster via Kerberos auth.rW   zKerberos service principal to use, of the form "<primary>/<instance>". Realm is mapped from your Kerberos config. Any supplied realm is ignored. If not passed in, it will default to "hdfs/<namenode_fqdn>" (fqdn = fully qualified domain name).N)add_argumentintCOUNT_FLAG_HELP_TEXTCREDS_FILE_FLAG_HELP_TEXTr	   r   GANETWORK_HELP_TEXTr0   r   StoreTrueFalseActionArgListMOUNT_DIRECTORIES_HELP_TEXTPROXY_FLAG_HELP_TEXTS3_COMPATIBLE_HELP_TEXT	add_group)parserr   
hdfs_groupkerberos_groups       r   ArgsInstall.Argsd  sx    '  ( 	2FG
-FG )),,,
 ''8'D  
 //N  O    $  % H	  I   "#(	   	(<=
$  &
 !! " J )   K   ):&	   %% & N  'F     8    #"    &   	r   c                    UR                   b  UR                   S:  a  [        S5      e[        R                  R                  R
                  R                  5       nU(       d  [        [        5      e[        R                  " SS5      n[        R                  " UR                  5      R                  UR                  R                  R                   :w  a  [        SUR                  -   5      e[#        UR$                  5      n[&        R(                  R+                  S5        [,        R.                  R1                  U5      n[3        U5        [&        R(                  R+                  SR5                  UR6                  R9                  5       5      5        [;        XU5      nUR                   b!  [=        UR                   UR>                  U5        [&        R(                  R+                  S	5        US
   S:H  n[&        R(                  R+                  [@        R5                  UR                  U[C        UUS5      [C        UUS5      S95        g)zVInstalls the agent.

Args:
  args (argparse.Namespace): The arguments to the command.
Nr   z&Agent count must be greater than zero.transferv1zAgent pool not found: u   [1/3] Credentials found ✓u   [2/3] {} found ✓u&   [3/3] Agent installation complete! ✓r   rf   logslist)ry   r   logs_commandlist_command)"r}   r   r   r   r   r   r   MISSING_PROJECT_ERROR_TEXTr   GetMessagesModuler   api_getry   state	AgentPoolStateValueValuesEnumCREATEDr?   
creds_filer   r   r   r
   rk   rl   rI   r0   r   rE   r   r   r|   &CHECK_AGENT_CONNECTED_HELP_TEXT_FORMATr    )selfr   r   messagesr4   r   r   r   s           r   RunInstall.Run  s    zz$**q.?@@$$,,002G122%%j$7H  +11//77	8/$));<<;DOOLOJJ23
 $44>>tD,->?JJ)001B1H1H1N1N1PQR2 zz

DNN<MNJJ=> !#v-HJJ.552!
 3! 	6 	
r   r   N)__name__
__module____qualname____firstlineno____doc__r   r	   r   r   detailed_helpstaticmethodr   r   __static_attributes__r   r   r   r   r   ]  sF     ))$*;*;*>*>?-!%!2!2!5!5 x xt7r   r   c                   `    \ rS rSrSr\" \R                  R                  5      r	\
S 5       rSrg)InstallAlphai  r   c           	         [         R                  U [        R                  R                  S9  U R                  S[        SS9  U R                  S[        [        R                   Vs/ s H  oR                  PM     sn5      [        R                  R                  R                  SS9  U R                  SS	[        R                  S
S9S9  U R                  SSS9  gs  snf )zwAdd arguments for the install command.

Args:
  parser (argparse.ArgumentParser): The argument parser for the command.
)r   z#--max-concurrent-small-file-uploadszAdjust the maximum number of files less than or equal to 32 MiB large that the agent can upload in parallel. Not recommended for users unfamiliar with Google Cloud's rate limiting.r   z--container-managerz0The container manager to use for running agents.)r   r   r   z	--networkrp   z(docker or podman)r   r   z--gcs-api-endpointzThe API endpoint for Google Cloud Storage. Override to use a regional endpoint, ensuring data remains within designated geographic boundaries.r   N)r   r   r	   r   r   r   r   sortedr
   rk   r   DOCKERr   r0   )r   options     r   r   InstallAlpha.Args   s     LLt'8'8'>'>L?
-?  @ (3(D(DE(Df\\(DE
 ,,3399?   %%9M%N  
 &   Fs   %Cr   N)r  r  r  r  r  r   r	   r   r   r  r  r   r  r   r   r   r
  r
    s/     ))$*;*;*A*AB-% %r   r
  )N)F)Lr  
__future__r   r   r   collectionsr   r"   rB   rz   r   r+   googlecloudsdk.api_lib.transferr   googlecloudsdk.api_lib.utilr   googlecloudsdk.callioper   r	   #googlecloudsdk.command_lib.transferr
   r   googlecloudsdk.corer   r   googlecloudsdk.core.credentialsr   'googlecloudsdk.core.universe_descriptorr   googlecloudsdk.core.utilr   oauth2clientr   r;   r   r   r   r   r   r   r:   r   r   rk   r  defaultdictrG   LINUXWINDOWSMACOSXPODMANr   r   r    r'   r-   r2   r?   rI   r\   rd   r   r   r   rF   r   r   r   UniverseCompatibleReleaseTracksr   r   Commandr   r   r
  r   r   r   <module>r#     sZ   4 &  '   	    
 < , / ( ; : # * 5 G . 0      " * & $   '')@)@9 %%++9%%--p%%,,c
	
	*    '')@)@6 %%++J%%-->%%,,<
	
	*#!0 ,H) %$3H)5Z "22996
 
H 8=u-p'<T/<>   @( D%%(()wdll w * wt D%%++,+7 + - +r   