a )g'@sdZddlmZmZmZeZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZmZddl m!Z!ddl"m#Z#dd l$m%Z%dd l&m'Z'zdd l(m)Z*Wn&e+y*Gd d d Z*dZ,Yn0dZ,zddl-m.Z.ddl/m0Z0Wne+yddZ1Yn0dZ1ej2r4ddl3m4Z4ej5dZ6ej5dZ7ej5dddddddddddd d!d"e7fZ8ej9e8ej:e;eej9e6e>fZ?ej9e7ej:ed?d?eZGd@dAdAZdBdCZdDdEZdFdGZdHdIZdJdKZdLdMZdNdOZdPdQZdRdSZdTdUZedVdWZeddXdYZdZd[Zd\d]Zdd_d`ZdadbZdcddZdedfZdgdhZdidjZdkdlZdmdnZdodpZdqdrZdsdtZdudvZdwdxZdydzZdd{d|Zd}d~ZddZddZddZdddZddZdS)z)Installed collections management package.)absolute_importdivisionprint_functionN) namedtuple)contextmanager) dataclassfields)sha256)BytesIO) distribution)chain) Requirementc@s eZdZdS)PkgReqN)__name__ __module__ __qualname__rrF/usr/lib/python3.9/site-packages/ansible/galaxy/collection/__init__.pyr%srFT)Manifest)DistlibException)ConcreteArtifactsManagercollection_infofile_manifest_fileformatnameftype chksum_type chksum_sha256r namespacerversionauthorsreadmetags descriptionlicense license_file dependencies repository documentationhomepageissuesfilesr) AnsibleError) GalaxyAPI) _consume_file_download_file_get_json_from_installed_dir_get_meta_from_src_dir_tarfile_extract)MultiGalaxyAPIProxy)run_gpg_verifyparse_gpg_errorsget_signature_from_source GPG_ERROR_MAP)$build_collection_dependency_resolver)(CollectionDependencyResolutionImpossible)CollectionDependencyInconsistentCandidate)RESOLVELIB_VERSIONRESOLVELIB_LOWERBOUNDRESOLVELIB_UPPERBOUND) Candidater _is_installed_collection_dir)meets_requirements)get_all_plugin_loaders) raise_from)to_bytes to_nativeto_text) is_sequence) yaml_dump)AnsibleCollectionRef)Display) secure_hash secure_hash_s)Sentinelz MANIFEST.jsonModifiedContentfilenameexpected installedz0^(?P\+)?(?:(?P\d+)|(?Pall))$cs:eZdZUdZeeed<dZeed<fddZ Z S)ManifestControlN directivesFomit_default_directivescs6t|D](}t||jdurt|j|qdSN) dc_fieldsgetattrrsuper __setattr__type)selfZfield __class__rr __post_init__s zManifestControl.__post_init__) rrrrWliststr__annotations__rXboolrb __classcell__rrr`rrVs  rVc@s6eZdZd ddZddZddZd d Zd d ZdS)CollectionSignatureErrorNFcCs"||_||_||_||_d|_dSrY)reasonsstdoutrcignore_reason_wrapper)r_rirjrkrlrrr__init__s z!CollectionSignatureError.__init__cCsd|d|jd|jS)NzUnexpected error for 'z<': GnuPG signature verification failed with the return code z and output )rkrjr_collection_namerrr_report_unexpecteds z+CollectionSignatureError._report_unexpectedcCs d|d|jd}||S)N#Signature verification failed for 'z' (return code z):)rk_format_reasons)r_rpheaderrrr_report_expectedsz)CollectionSignatureError._report_expectedcs<jdurtjddd_fddjD}dd|S)Nz * z )initial_indentsubsequent_indentcsg|]}dj|qS) )joinrmwrap).0reasonr_rr sz.rx)rmtextwrapZ TextWrapperriry)r_Zwrapped_reasonsrr}rrss  z(CollectionSignatureError._format_reasonscCs|jr||S||SrY)rirurqrorrrreports zCollectionSignatureError.report)NNNF)rrrrnrqrursrrrrrrhs  rhc@seZdZddZdS)CollectionVerifyResultcCs||_d|_dS)NT)rpsuccessrorrrrnszCollectionVerifyResult.__init__N)rrrrnrrrrrsrc Cs t|j}t|jdd}tdj|dtdjt|jdg}|du}tt |}tt |}|s|j |j krdj|j|j |j d } t| d |_ |St jt|ddt} t|j} |r|jdurd d |jd D| } n|s|jrt|j| } |jdu} | s&| r&tdn<| rbt|j| | |j|j|jsRd |_ |Std||rr|t} nt| r|jr|t} n\|jr|jn|j|}tdjt|dtt|}tt|}|t} t |t| |tdj| d|t}|d}|d}|d|d}t ||||||}t!}t j|dt j|dh}|dD]}|d}|ddkr|"t j|t|dd|d|d}t |||||ddkr`|"t j|t|ddq`t #|D]\}}}|D]N}t j||}t|t$|dddd}||vr|%t&|ddd q|D]N}t j||}t|t$|dddd}||vrN|%t&|d!d"d qNq|rd |_ td#jt|jd$|D],}td%|j't(d&|j)|j*fqn"|rd'nd(}td)j||d*|S)+a5Verify integrity of the locally installed collection. :param local_collection: Collection being checked. :param remote_collection: Upstream collection (optional, if None, only verify local artifact) :param artifacts_manager: Artifacts manager. :return: a collection verify result object. surrogate_or_stricterrorszVerifying '{coll!s}'.collz(Installed collection found at '{path!s}'pathNzX{local_fqcn!s} has the version '{local_ver!s}' but is being compared to '{remote_ver!s}')Z local_fqcnZ local_verZ remote_verFcSsg|] }|dqS) signaturer)r{inforrrr~z+verify_local_collection.. signatureszThe GnuPG keyring used for collection signature verification was not configured but signatures were provided by the Galaxy server. Configure a keyring for ansible-galaxy to verify the origin of the collection. Skipping signature verification.z>GnuPG signature verification succeeded, verifying contents of z&Remote collection cached as '{path!s}'z#MANIFEST.json hash: {manifest_hash}) manifest_hashrrz chksum_%sr MANIFEST.json FILES.jsonr.rfiledirrPzthe file does not existzthe file existsrRzthe directory does not existzthe directory existszECollection {fqcn!s} contains modified content in the following files:fqcnz %sz Expected: %s Found: %sz+are internally consistent with its manifestzmatch the remote collectionz=Successfully verified that checksums for '{coll!s}' {what!s}.)rwhat)+rrrFsrcdisplayrrH functoolspartialr3_get_file_hashverrosrryMANIFEST_FILENAMErcrZ source_infokeyringwarningverify_file_signatures#required_successful_signature_countignore_signature_errorsvvvvis_concrete_artifactget_artifact_pathget_galaxy_artifact_pathvvv_get_json_from_tar_file_get_tar_file_hash_verify_file_hashsetaddwalklenappendrQrSvrTrU)local_collectionremote_collectionartifacts_managerresultb_collection_pathZmodified_contentZverify_local_onlyZget_json_from_validation_sourceZget_hash_from_validation_sourceerr manifest_filerZkeyring_configuredrZb_temp_tar_pathmanifestZfile_manifest_dataZfile_manifest_filename expected_hash file_manifestZcollection_dirsZcollection_filesZ manifest_datarrootdirsr. full_pathrZcontent_changerrrrverify_local_collections                    rc Cs\d}g}tt|}|dp"d} |d} |d} | durDt| } |D]} t| dd} zt|| ||WnFty} z.| jrWYd} ~ qH| | |WYd} ~ qHd} ~ 00|d7}| rqH|| krHqqH| r|sd}t d |d nN| r| }|ssz&install_collections..c3s6|].}|jr(fdd|Dn|fVqdS)c3s|]}t|VqdSrY)r from_dir_path)r{Zsub_collrrr sz0install_collections...N)Z is_subdirsZ"get_direct_collection_dependenciesr)r{Z install_reqrrrrs  z&install_collections..cSsh|] }|jqSrr)r{reqrrrrrcs4h|],}D]"}|j|jkr t|j|jr |q qSr)rrCr)r{rZexs)existing_collectionsrrrszxNothing to do. All requested collections are already installed. If you want to reinstall them, consider using `--force`.Ncsh|]}|jvr|qSrrr)requested_requirements_namesrrrs cSs$h|]}t|j|j|j|jdqSrY)rArrrr^rrrrrszProcess install dependency maprz#Starting collection install processzEncountered {coll!s}, skipping.rz*'{coll!s}' is already installed, skipping.a The GnuPG keyring used for collection signature verification was not configured but signatures were provided by the Galaxy server to verify authenticity. Configure a keyring for ansible-galaxy to use or disable signature verification. Skipping signature verification.galaxyzeFailed to install collection {coll!s} but skipping due to --ignore-errors being set. Error: {error!s})rr)find_existing_collectionsrr from_iterablerrrrrrrrrHrrr^Zwith_signatures_repopulatedinstallr/)rrr ignore_errorsrrZ force_depsrrrZdisable_gpg_verifyrZunsatisfied_requirementsZ"existing_non_requested_collectionsZpreferred_requirementsZpreferred_collectionsZdependency_mapZkeyring_existsrrrr)rr r rinstall_collectionss   $     rcCs.|d\}}}t|r|Std|dS)zValidates the collection name as an input from the user or a requirements file fit the requirements. :param name: The input name with optional range specifier split by ':'. :return: The input value, required for argparse validation. :zInvalid collection name '%s', name must be in the format .. Please make sure namespace and collection name contains characters from [a-zA-Z0-9_] only.N) partitionrKZis_valid_collection_namer/)r collectiondummyrrrvalidate_collection_names  rcCs&tj|ddkr"tj|dS|S)zEnsure a given path ends with 'ansible_collections' :param collection_path: The path that should end in 'ansible_collections' :return: collection_path ending in 'ansible_collections' if it does not already. rPZansible_collections)rrrry)rrrrvalidate_collection_path'src Cs2g}t||}t|D]}z|jr@tdj|jddd|j} |D]} ttj | |j |j dd} tj | s|qNt| sd|j} qNt| |} dd |jpgD} t| j| j| j| jt| d } qqNt| d|rd }n|| }|d d |jpgDt|j|jd kr&|jn| jd dt|}z |jd usL|sV||WnPty}z6dj|d}|j|krtdj|dWYd }~n d }~00t| ||}||Wqty }z.|rtdj|t|dnWYd }~qd }~00qWd n1s$0Y|S)aMVerify the integrity of locally installed collections. :param collections: The collections to check. :param search_paths: Locations for the local collection lookup. :param apis: A list of GalaxyAPIs to query when searching for a collection. :param ignore_errors: Whether to ignore any errors when verifying the collection. :param local_verify_only: When True, skip downloads and only verify local manifests. :param artifacts_manager: Artifacts manager. :return: list of CollectionVerifyResult objects describing the results of each collection verification zM'{coll_type!s}' type is not supported. The format namespace.name is expected.)Z coll_type)messagez>Collection %s is not installed in any of the collection paths.rrzCollection %s does not have a MANIFEST.json. A MANIFEST.json is expected if the collection has been built and installed via ansible-galaxycSsg|]}t|tqSrr9rr{sourcerrrr~msz&verify_collections..)rNcSsg|]}t|tqSrrrrrrr~s*r z4Failed to find collection {coll.fqcn!s}:{coll.ver!s}rzHFailed to find remote collection '{coll!s}' on any of the galaxy serverszdFailed to verify collection '{coll!s}' but skipping due to --ignore-errors being set. Error: {err!s})rr)r6rrr/rr^rrFrrryr rrrBrArZsignature_sourcesrr frozensetZget_signaturesextendrZget_collection_version_metadatarrrrrrH)rZ search_pathsrrZlocal_verify_onlyrresultsZ api_proxyrZ default_err search_pathZ b_search_pathrZsupplemental_signaturesrreZexpected_error_msgrrrrrverify_collections4s            :r!c cs<tjttjddd}z|VWt|n t|0dS)Nrr)r)tempfileZmkdtemprFCZDEFAULT_LOCAL_TMPrrmtree) b_temp_pathrrr_tempdirsr&ccstj}|durtjn|}|dur.t||s.progressc@seZdZddZddZdS)z(_display_progress..DisplayThreadcSs ||_dSrY)r2)r_r2rrrrnsz1_display_progress..DisplayThread.__init__csfdd}|S)Ncsj||fdSrY)r2Zput)r6r7attrr_rr call_displayszJ_display_progress..DisplayThread.__getattr__..call_displayr)r_r;r<rr:r __getattr__sz4_display_progress..DisplayThread.__getattr__N)rrrrnr=rrrr DisplayThreadsr>)targetr6T)r#ZGALAXY_DISPLAY_PROGRESSsysrjisattyrobjectr1ZQueuer,Threaddaemonstartr*ry Exception)rZconfig_displayZ display_wheelr9r>Z old_displayr2r3rrrrs2     rcCsttjt||dd}tj|s,d}n4t|dd}t|}Wdn1sV0Y||kr||t |||ddS)NrrrbrrR) rFrrryrHisfilerr1rrQ)b_pathrSrZ error_queueZ b_file_path actual_hashZ file_objectrrrrs &rcCsddddtdgtdS)N.rrr-MANIFEST_FORMATrrrr_make_manifests rNr c Cs&d|d|d|r|ndd||dtiS)NrrrZchksum_rrL)rrrchksumrrr _make_entry"s   rPcCs8|r|turtd|tur*t||||St||||S)Nz4"build_ignore" and "manifest" are mutually exclusive)rOr/_build_files_manifest_distlib_build_files_manifest_walk)rr rignore_patternsmanifest_controlrrrr,s rc Cs~ts td|duri}ztfi|}Wn2ty\}ztd|WYd}~n d}~00t|js|td|jjjt|j t std|j jj|j r|jstdg}|j r| |jn| gdt ddt D}t|D].}|d vrqq|tjvr|d |d q| d d g| |j| d|d|dddgtdttd|dt|dd} t| } |D]|} z| | Wnfty} ztd| WYd} ~ n.)modulesZ module_utilszrecursive-include plugins/z **.yml **.yamlz7recursive-include plugins/modules **.ps1 **.yml **.yamlz;recursive-include plugins/module_utils **.ps1 **.psm1 **.csz8exclude galaxy.yml galaxy.yaml MANIFEST.json FILES.json -z -*.tar.gzz!recursive-exclude tests/output **zglobal-exclude /.* /__pycache__zManifest Directives:rxz rrzInvalid manifest directive: z-Unknown error processing manifest directive: T)Zwantdirsrrr Z hash_funcrrOr.)$ HAS_DISTLIBr/rV TypeErrorrIrWrar isinstancerXrfrrrDsortedr#ZDOCUMENTABLE_PLUGINSrrrrindentryrHrZprocess_directiverrFrNrrrelpathrrPrMr )rr rrTZcontrolexrWZpluginsZpluginrmZ directiver rZabs_pathrel_pathZmanifest_entryrrrrQ<s$           "(  rQc sfddddddddtd ||g d d |D7tgd tfd d||S)Nrrs galaxy.ymls galaxy.yaml.gits*.pycs*.retrys tests/outputz{0}-{1}-*.tar.gzcSsg|] }t|qSr)rFr{prrrr~rz._build_files_manifest_walk..)sCVSs.bzrs.hgrfs.svns __pycache__s.toxc s^t|D]Ltj|}||kr*dn|t|dd}tj|tdd}tj|r tfddDstfddDrt dt|q tj |rtj |}t ||st d t|q d t|d tj |sX||q tfd dDr6t dt|q d t|d dt|tddq dS)NrrPrrc3s|]}|kVqdSrYr)r{rI)b_itemrrrrz<_build_files_manifest_walk.._walk..c3s|]}t|VqdSrYfnmatchr{Z b_pattern b_rel_pathrrrrz"Skipping '%s' for collection buildzLSkipping '%s' as it is a symbolic link to a directory outside the collectionr.rc3s|]}t|VqdSrYrjrlrmrrrrrr r[r\)rlistdirrryrrHranyrrislinkrealpath_is_child_pathrrrPrMr )rIZb_top_level_dirZ b_abs_pathZb_rel_base_dirre b_link_target_walkZ b_ignore_dirsZb_ignore_patternsr)rirnrrvs@       z)_build_files_manifest_walk.._walk)rFrrrN)rr rrSrrurrRs   ) rRc KsB|||||||| d|pd|| | | | dddddtdtd}|S)Nr&)r rr!r"r#r$r%r&r'r(r)r*r+r, FILES.jsonrr rrrL)r rr!r"r#r$r%r'r(r)r*r+r,r7rrrrrs0rc Cs8ttj|dddd}t|td|dd<ttj|dddd}t}tj|tj |}t j |dd D}t |fd |ffD]F\} } t | } t | } t| | _tt| _d | _|j| | d q|d D]} | ddkrqt| ddd}tj|t|dd}dd}tj|rtj|}t||rtjj|tj|d}t |} t j| _t|dd| _|| } |j| dq|jttj||d|dqWdn1s0Yt !t|t|d|dd|ddf}t"|}t##d||f|WdS1s*0YdS)z:Build a tar.gz collection artifact from the manifest data.Trarrr[rrzw:gzrrw)tarinfoZfileobjr.rrKcSsJ|jtjkr.|jtj@}|s$|r(dnd|_d|_|_d|_ |_ |S)Nryr) r^tarfileSYMTYPErstatS_IXUSRruidgidunamegname)rzexisting_is_execrrr reset_stat!s     z)_build_collection_tar..reset_stat)rE)rzF)Zarcname recursivefilterN%s.%srr zCreated collection for %s at %s)$rFjsondumpsrNr r&rrryrr}rrr ZTarInforsizerr.mtimerZaddfilerGrqrrrsrbdirnamer~r^linknamerrrrHr)rZ b_tar_pathrrfiles_manifest_jsoncollection_manifest_jsonr%Zb_tar_filepathZtar_filerbb_ioZtar_info file_inforSrrrtrnrpZtar_pathrrrrsT          (  rc Cstj|ddttj|dddd}t|td|dd <ttj|dddd}t|fd |ffD]\}}tj |t|dd}t |d D} t |} t | | Wd n1s0YWd n1s0Yt|d q^g} t|ddddD]} | ddkrqtj |t| ddd} tj |t| ddd}t| jtj@}|rfdnd }tj| rd}| | t||n t | |t||qt|}|S)z|Build a collection directory from the manifest data. This should follow the same pattern as _build_collection_tar. r{rTrxrrr[rrrwrNryr.cSs|dS)Nrr)xrrr[rz'_build_collection_dir..)keyrrK)rmakedirsrFrrrNr rrryrr r copyfileobjchmodr`rst_moderrrmkdircopyfilerH)rrrrrrrrrIZfile_objrZbase_directoriesrZsrc_fileZ dest_filerrrrrr_build_collection_dirGs2H  rc cst|dd}t|D]}tj||}tj|r6qt|D]}tj||}tj|s`q@zt||}Wn2t y}zt t ||WYd}~n d}~00t djt|t|jd|Vq@qdS)zLocate all collections under a given path. :param path: Collection dirs layout search path. :param artifacts_manager: Artifacts manager. rrNz1Found installed collection {coll!s} at '{path!s}'r)rFrrorryrHrrAZfrom_dir_path_as_unknown ValueErrorrEr/rrrrHr) rrrIZ b_namespaceb_namespace_pathZ b_collectionrrZval_errrrrr qs&   $r cCs|jr |jn|j|}tj||j|j}t|dd}t dj t ||dtj |rdt ||jrzt||||nsz$install_artifact..Nrrrwr.rrKrrr)r)r}rZ getmembers_ansible_normalized_cache_extract_tar_filerrrryrHr getmemberr5rloadsread_extract_tar_dirrFrr$rrormdir)Zb_coll_targz_pathrr%rrrrcollection_tarrZfiles_member_objrZ files_objr.r file_namerrrrrs8  4  2    rcCsv||}d|vr"g|d<t|d<tfi|}t||d|d|d|d}t||||}tdj||ddS)aInstall the collection from source control into given dir. Generates the Ansible collection artifact data from a galaxy.yml and installs the artifact to a directory. This should follow the same pattern as build_collection, but instead of creating an artifact, install it. :param collection: Collection to be installed. :param b_collection_path: Collection dirs layout path. :param b_collection_output_path: The installation directory for the \ collection artifact. :param artifacts_manager: Artifacts manager. :raises AnsibleError: If no collection metadata found. rrr rz+Created collection for {coll!s} at {path!s}rN)Zget_direct_collection_metarOrrrrr)rrZb_collection_output_pathrrrrZcollection_output_pathrrrrs(  rc Cst|ddtjj}z|j|}WntyBtd|Yn0tj|t |dd}tj |}ztj |ddWn2t y}z|j t jkrWYd}~n d}~00|jtjkrt |jdd}t|||dstdt||ft||ntj|st|ddS) z- Extracts a directory from a collection tar. rrz&Unable to extract '%s' from collectionr{rN link_name]Cannot extract symlink '%s' in collection: path points to location outside of collection '%s')rGrrrrrKeyErrorr/ryrFrrOSErrorerrnoZEEXISTr^r}r~rrssymlinkrr)tarrb_dest tar_memberZ b_dir_path b_parent_pathr  b_link_pathrrrrCs*     rc Cst||\}}|jtjkr(t|}n8tj|dd}t||}Wdn1sV0Y|r||krtdt|ddt|j ft j t j |t|dd} t j | } t| |stdt|ddt j | st j| dd |jtjkr:t|jdd} t| || d s,td t|| ft | | nTtt|j dd| |t|dd}d } t|jtj@r| d O} t | | Wdn1s0YdS)z( Extracts a file from a collection tar. F)rdeleteNz4Checksum mismatch for '%s' inside collection at '%s'rrzSCannot extract tar entry '%s' as it will be placed outside the collection directoryr{rrrryI)_get_tar_file_memberr^r}r~r1r"ZNamedTemporaryFiler/rGrrrabspathryrFrrsrrrrrmoverrS_IMODErrr) rrSrr%rrtar_objrJZ tmpfile_objZb_dest_filepathZ b_parent_dirrZnew_moderrrrbs<  (      rcCsNt|dd}z||}Wn(tyBtdt|j|fYn0t||S)Nrrz?Collection tar at '%s' does not contain the expected file '%s'.)rGrrr/rr5)rrSZ n_filenamememberrrrrs  rc Csd}tj|ddh}t||>\}}d}||}|rN|t|7}||}q2Wdn1sb0YWdn1s0Yt|S)Nr|rri)r}rrrrHrr)rIrSZ file_contentsrrrbufsizedatarrrrs  Hrc Csvtj|ddT}t||*\}}t|WdWdS1sJ0YWdn1sh0YdS)Nrr)r}rrr1)rIrSrrrrrrrsrcCsLtj|t|dd}t|d}t|WdS1s>0YdS)NrrrG)rrryrFrr1)rIrSfilepathfprrrrs rcCspt|dd}|rFtj|sFtjt|dd}tjtj||}t|dd}||kpn||ttjjS)z> Checks that path is a path within the parent_path specified. rr) rFrrisabsrrry startswithr)r parent_pathrrIZ b_link_dirrrrrrss   rsc  stts tdtstdd} zz td} Wnty<Yn 0tfdd| jpRgDd} W| durttkrzt ksntdt j dtj n$| j tj std | j | j n`| durttkrt ksntdt j dtj n&| j tj std | j | j 0t||||| ||||d } z| j|d d jWSty} z>d d| jD} ttd| }ttd|| WYd} ~ nd} ~ 0ty<} zdd| jD}dj| j|sdndjd|ddg}| jD]} |dj| dqttd|| WYd} ~ n.z#ansible-galaxy requires resolvelib=zansible-galaxy requires ) rrZuser_requirementsrZ with_depsZwith_pre_releasesrrri)Z max_roundscss6|].}dj|j|jdurdn dj|jddVqdS)z+* {req.fqcn!s}:{req.ver!s} ({dep_origin!s})Ndirect requestdependency of {parent!s}parentrZ dep_origin)rZ requirementr)r{Zreq_infrrrrs)z_Failed to resolve the requested dependencies map. Could not satisfy the following requirements:rxcSsg|]}|durt|qSrY)rdrgrrrr~sz*_resolve_depenency_map..zFailed to resolve the requested dependencies map. Got the candidate {req.fqcn!s}:{req.ver!s} ({dep_origin!s}) which didn't satisfy all of the following requirements:rrz, rrz* {req.fqcn!s}:{req.ver!s})r) HAS_RESOLVELIBr/ HAS_PACKAGINGr rFrZrequiresr?r>r@ZvstringZ specifiercontainsrr;resolvemappingr<Zcausesrcr rEryr=Z criterionZ iter_parentr candidateZiter_requirementrrrG)Zrequested_requirementsrrrrrrrrrZdistZcollection_dep_resolverZdep_excZconflict_causesZerror_msg_linesparentsexcrrrrs          r)N)r N)N)N)__doc__Z __future__rrrr^Z __metaclass__rrkrrrr1rrrr@r}r"rr,r.typingr3rr contextlibrZ dataclassesrrrZZhashlibr ior importlib.metadatar itertoolsr Zpackaging.requirementsr r ImportErrorrZdistlib.manifestrZdistlibrr] TYPE_CHECKINGZ3ansible.galaxy.collection.concrete_artifact_managerrLiteralZManifestKeysTypeZFileMetaKeysTypeZCollectionInfoKeysTypeDictUnionrrdListZManifestValueTypeZCollectionManifestTypeZFileManifestEntryTypeZFilesManifestTypeZansible.constantsZ constantsr#Zansible.errorsr/Zansible.galaxy.apir0r1r2r3r4r5Z*ansible.galaxy.collection.galaxy_api_proxyr6Zansible.galaxy.collection.gpgr7r8r9r:Z$ansible.galaxy.dependency_resolutionr;Z+ansible.galaxy.dependency_resolution.errorsr<r=Z.ansible.galaxy.dependency_resolution.providersr>r?r@rZ0ansible.galaxy.dependency_resolution.dataclassesrArBZ/ansible.galaxy.dependency_resolution.versioningrCZansible.plugins.loaderrDZansible.module_utils.sixrEZansible.module_utils._textrFrGrHZ'ansible.module_utils.common.collectionsrIZ ansible.module_utils.common.yamlrJZansible.utils.collection_loaderrKZansible.utils.displayrLZansible.utils.hashingrMrNZansible.utils.sentinelrOrrMrrQrrVrFrhrrrrrrrrrrr!r&rrrNrPrrQrRrrrr rrrrrrrrrrrrsrrrrrs            .$               ),2 /j%   C  bC F* 0 8) -