
    Vh]                         d dl mZmZmZ eZdZdZdZd dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZmZ d d	lmZ  G d
 de      Zd Zedk(  r e        yy)    )absolute_importdivisionprint_functiona8,  
module: gitlab_project
short_description: Creates/updates/deletes GitLab Projects
description:
  - When the project does not exist in GitLab, it will be created.
  - When the project does exist and O(state=absent), the project will be deleted.
  - When changes are made to the project, the project will be updated.
author:
  - Werner Dijkerman (@dj-wasabi)
  - Guillaume Martinez (@Lunik)
requirements:
  - python-gitlab python module
extends_documentation_fragment:
  - community.general.auth_basic
  - community.general.gitlab
  - community.general.attributes

attributes:
  check_mode:
    support: full
  diff_mode:
    support: none

options:
  allow_merge_on_skipped_pipeline:
    description:
      - Allow merge when skipped pipelines exist.
    type: bool
    version_added: "3.4.0"
  avatar_path:
    description:
      - Absolute path image to configure avatar. File size should not exceed 200 kb.
      - This option is only used on creation, not for updates.
    type: path
    version_added: "4.2.0"
  build_timeout:
    description:
      - Maximum number of seconds a CI job can run.
      - If not specified on creation, GitLab will impose a default value.
    type: int
    version_added: "10.6.0"
  builds_access_level:
    description:
      - V(private) means that repository CI/CD is allowed only to project members.
      - V(disabled) means that repository CI/CD is disabled.
      - V(enabled) means that repository CI/CD is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.2.0"
  ci_config_path:
    description:
      - Custom path to the CI configuration file for this project.
    type: str
    version_added: "3.7.0"
  container_expiration_policy:
    description:
      - Project cleanup policy for its container registry.
    type: dict
    suboptions:
      cadence:
        description:
          - How often cleanup should be run.
        type: str
        choices: ["1d", "7d", "14d", "1month", "3month"]
      enabled:
        description:
          - Enable the cleanup policy.
        type: bool
      keep_n:
        description:
          - Number of tags kept per image name.
          - V(0) clears the field.
        type: int
        choices: [0, 1, 5, 10, 25, 50, 100]
      older_than:
        description:
          - Destroy tags older than this.
          - V(0d) clears the field.
        type: str
        choices: ["0d", "7d", "14d", "30d", "90d"]
      name_regex:
        description:
          - Destroy tags matching this regular expression.
        type: str
      name_regex_keep:
        description:
          - Keep tags matching this regular expression.
        type: str
    version_added: "9.3.0"
  container_registry_access_level:
    description:
      - V(private) means that container registry is allowed only to project members.
      - V(disabled) means that container registry is disabled.
      - V(enabled) means that container registry is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.2.0"
  default_branch:
    description:
      - The default branch name for this project.
      - For project creation, this option requires O(initialize_with_readme=true).
      - For project update, the branch must exist.
      - Supports project's default branch update since community.general 8.0.0.
    type: str
    version_added: "4.2.0"
  description:
    description:
      - An description for the project.
    type: str
  environments_access_level:
    description:
      - V(private) means that deployment to environment is allowed only to project members.
      - V(disabled) means that deployment to environment is disabled.
      - V(enabled) means that deployment to environment is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.4.0"
  feature_flags_access_level:
    description:
      - V(private) means that feature rollout is allowed only to project members.
      - V(disabled) means that feature rollout is disabled.
      - V(enabled) means that feature rollout is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.4.0"
  forking_access_level:
    description:
      - V(private) means that repository forks is allowed only to project members.
      - V(disabled) means that repository forks are disabled.
      - V(enabled) means that repository forks are enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.2.0"
  group:
    description:
      - ID or the full path of the group of which this projects belongs to.
    type: str
  import_url:
    description:
      - Git repository which will be imported into gitlab.
      - GitLab server needs read access to this git repository.
    required: false
    type: str
  infrastructure_access_level:
    description:
      - V(private) means that configuring infrastructure is allowed only to project members.
      - V(disabled) means that configuring infrastructure is disabled.
      - V(enabled) means that configuring infrastructure is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.4.0"
  initialize_with_readme:
    description:
      - Will initialize the project with a default C(README.md).
      - Is only used when the project is created, and ignored otherwise.
    type: bool
    default: false
    version_added: "4.0.0"
  issues_access_level:
    description:
      - V(private) means that accessing issues tab is allowed only to project members.
      - V(disabled) means that accessing issues tab is disabled.
      - V(enabled) means that accessing issues tab is enabled.
      - O(issues_access_level) and O(issues_enabled) are mutually exclusive.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "9.4.0"
  issues_enabled:
    description:
      - Whether you want to create issues or not.
      - O(issues_access_level) and O(issues_enabled) are mutually exclusive.
    type: bool
    default: true
  lfs_enabled:
    description:
      - Enable Git large file systems to manages large files such as audio, video, and graphics files.
    type: bool
    required: false
    default: false
    version_added: "2.0.0"
  merge_method:
    description:
      - What requirements are placed upon merges.
      - Possible values are V(merge), V(rebase_merge) merge commit with semi-linear history, V(ff) fast-forward merges only.
    type: str
    choices: ["ff", "merge", "rebase_merge"]
    default: merge
    version_added: "1.0.0"
  merge_requests_enabled:
    description:
      - If merge requests can be made or not.
    type: bool
    default: true
  model_registry_access_level:
    description:
      - V(private) means that accessing model registry tab is allowed only to project members.
      - V(disabled) means that accessing model registry tab is disabled.
      - V(enabled) means that accessing model registry tab is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "9.3.0"
  monitor_access_level:
    description:
      - V(private) means that monitoring health is allowed only to project members.
      - V(disabled) means that monitoring health is disabled.
      - V(enabled) means that monitoring health is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.4.0"
  name:
    description:
      - The name of the project.
    required: true
    type: str
  only_allow_merge_if_all_discussions_are_resolved:
    description:
      - All discussions on a merge request (MR) have to be resolved.
    type: bool
    version_added: "3.4.0"
  only_allow_merge_if_pipeline_succeeds:
    description:
      - Only allow merges if pipeline succeeded.
    type: bool
    version_added: "3.4.0"
  packages_enabled:
    description:
      - Enable GitLab package repository.
    type: bool
    version_added: "3.4.0"
  pages_access_level:
    description:
      - V(private) means that accessing pages tab is allowed only to project members.
      - V(disabled) means that accessing pages tab is disabled.
      - V(enabled) means that accessing pages tab is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "9.3.0"
  path:
    description:
      - The path of the project you want to create, this will be server_url/<group>/path.
      - If not supplied, name will be used.
    type: str
  releases_access_level:
    description:
      - V(private) means that accessing release is allowed only to project members.
      - V(disabled) means that accessing release is disabled.
      - V(enabled) means that accessing release is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.4.0"
  remove_source_branch_after_merge:
    description:
      - Remove the source branch after merge.
    type: bool
    version_added: "3.4.0"
  repository_access_level:
    description:
      - V(private) means that accessing repository is allowed only to project members.
      - V(disabled) means that accessing repository is disabled.
      - V(enabled) means that accessing repository is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "9.3.0"
  security_and_compliance_access_level:
    description:
      - V(private) means that accessing security and complicance tab is allowed only to project members.
      - V(disabled) means that accessing security and complicance tab is disabled.
      - V(enabled) means that accessing security and complicance tab is enabled.
    type: str
    choices: ["private", "disabled", "enabled"]
    version_added: "6.4.0"
  service_desk_enabled:
    description:
      - Enable Service Desk.
    type: bool
    version_added: "9.3.0"
  shared_runners_enabled:
    description:
      - Enable shared runners for this project.
    type: bool
    version_added: "3.7.0"
  snippets_enabled:
    description:
      - If creating snippets should be available or not.
    type: bool
    default: true
  squash_option:
    description:
      - Squash commits when merging.
    type: str
    choices: ["never", "always", "default_off", "default_on"]
    version_added: "3.4.0"
  state:
    description:
      - Create or delete project.
      - Possible values are present and absent.
    default: present
    type: str
    choices: ["present", "absent"]
  topics:
    description:
      - A topic or list of topics to be assigned to a project.
      - It is compatible with old GitLab server releases (versions before 14, correspond to C(tag_list)).
    type: list
    elements: str
    version_added: "6.6.0"
  username:
    description:
      - Used to create a personal project under a user's name.
    type: str
    version_added: "3.3.0"
  visibility:
    description:
      - V(private) Project access must be granted explicitly for each user.
      - V(internal) The project can be cloned by any logged in user.
      - V(public) The project can be cloned without any authentication.
    default: private
    type: str
    choices: ["private", "internal", "public"]
    aliases:
      - visibility_level
  wiki_enabled:
    description:
      - If an wiki for this project should be available or not.
    type: bool
    default: true
aW  
- name: Create GitLab Project
  community.general.gitlab_project:
    api_url: https://gitlab.example.com/
    api_token: "{{ api_token }}"
    name: my_first_project
    group: "10481470"

- name: Delete GitLab Project
  community.general.gitlab_project:
    api_url: https://gitlab.example.com/
    api_token: "{{ access_token }}"
    name: my_first_project
    state: absent
  delegate_to: localhost

- name: Create GitLab Project in group Ansible
  community.general.gitlab_project:
    api_url: https://gitlab.example.com/
    validate_certs: true
    api_username: dj-wasabi
    api_password: "MySecretPassword"
    name: my_first_project
    group: ansible
    issues_enabled: false
    merge_method: rebase_merge
    wiki_enabled: true
    snippets_enabled: true
    import_url: http://git.example.com/example/lab.git
    initialize_with_readme: true
    state: present
  delegate_to: localhost

- name: get the initial root password
  ansible.builtin.shell: |
    grep 'Password:' /etc/gitlab/initial_root_password | sed -e 's/Password\: \(.*\)/\1/'
  register: initial_root_password

- name: Create a GitLab Project using a username/password via oauth_token
  community.general.gitlab_project:
    api_url: https://gitlab.example.com/
    api_username: root
    api_password: "{{ initial_root_password }}"
    name: my_second_project
    group: "10481470"
a  
msg:
  description: Success or failure message.
  returned: always
  type: str
  sample: "Success"

result:
  description: JSON-parsed response from the server.
  returned: always
  type: dict

error:
  description: The error message returned by the GitLab API.
  returned: failed
  type: str
  sample: "400: path is already in use"

project:
  description: API object.
  returned: always
  type: dict
)basic_auth_argument_spec)AnsibleModule)	to_native)auth_argument_spec
find_groupfind_projectgitlab_authenticationgitlab)LooseVersionc                   @    e Zd Zd Z	 d Z	 d Z	 d Z	 d Zd Z	 d Z	y)	GitLabProjectc                 .    || _         || _        d | _        y N)_module_gitlabproject_object)selfmodulegitlab_instances      t/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/modules/gitlab_project.py__init__zGitLabProject.__init__  s    &"    c                 B   d}i d|d   d|d   d|d   d|d   d|d   d|d   d|d   d	|d	   d
|d
   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   i d|d   d|d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d |d    d!|d!   d"|d"   }t        | j                  j                         d#         t        d$      k  r	|d%   |d&<   n|d%   |d%<   | j                  |d'   r|d(   s|j	                  d)*       |j                  |d+   |d,   d-       |d(   r|d(   |d(<   |d'   r|d'   |d'<   | j                  |      }| j                  ||      }|d.   r	 t        |d.   d/      |_	        d1}n,|d'   r|d'   |d'<   | j                  | j                  |      \  }}|| _        |rH| j                  j                  r | j                  j                  d1d2|z  3       	 |j!                          y1y# t        $ r9}| j                  j	                  d0j                  |d.   |      *       Y d }~d }~ww xY w# t"        $ r)}| j                  j	                  d4|z  *       Y d }~y1d }~ww xY w)5NFallow_merge_on_skipped_pipelinebuilds_access_levelbuild_timeoutci_config_pathcontainer_expiration_policycontainer_registry_access_leveldescriptionenvironments_access_levelfeature_flags_access_levelforking_access_levelinfrastructure_access_levelissues_access_levelissues_enabledlfs_enabledmerge_methodmerge_requests_enabledmodel_registry_access_levelmonitor_access_levelname0only_allow_merge_if_all_discussions_are_resolved%only_allow_merge_if_pipeline_succeedspackages_enabledpages_access_levelreleases_access_level remove_source_branch_after_mergerepository_access_level$security_and_compliance_access_levelservice_desk_enabledshared_runners_enabledsnippets_enabledsquash_option
visibilitywiki_enabledr   14topicstag_listdefault_branchinitialize_with_readmezCParam default_branch needs param initialize_with_readme set to truemsgpath
import_url)rE   rF   avatar_pathrbzCannot open {0}: {1}T.Successfully created or updated the project %schangedrD   zFailed to update project: %s )r   r   versionr   	fail_jsonupdateget_options_with_valuecreate_projectopenavatarIOErrorr   formatupdate_project
check_mode	exit_jsonsave	Exception)	r   r   project_name	namespaceoptionsrK   project_optionsprojectes	            r   create_or_update_projectz&GitLabProject.create_or_update_project  sf   "
-w7X/Y"
!7+@#A"
 W_5"
 g&67	"

 *73P+Q"
 .w7X/Y"
 7=1"
 (1L)M"
 )'2N*O"
 #G,B$C"
 *73P+Q"
 "7+@#A"
 g&67"
 7=1"
 GN3"
  %g.F&G!"
" *73P+Q#"
$ #G,B$C%"
& L'"
( ?Hz@{)"
* 4W=d5e+"
, (: ;-"
. !'*>"?/"
0 $W-D%E1"
2 /8Z0[3"
4 &w/H'I5"
6 3G<b4c7"
8 #G,B$C9"
: %g.F&G;"
< (: ;="
> W_5?"
@ ',/A"
B GN3C"
L ,,.q12\$5GG*1(*;OJ'(/(9OH% &'(9Q1R  %j k""%l3$  /0<CD\<] 89+,8?@P8QO$45"99/JO)))_EG }%i%)'-*@$%GGN G'(4;<L4M 01#2243F3FXGW%||&&&&t9ilx9x&yP '  iLL**/E/L/LWUbMcef/g*hhi   P&&+JQ+N&OOPs0   H' I, '	I)0/I$$I),	J5JJc                 \   | j                   j                  ry|j                  |d<   d|v r|d   |d<   	 | j                  j                  j                  |      }|S # t        j                  j                  $ r3}| j                   j                  dt        |      z         Y d }~S d }~ww xY w)NTnamespace_idr!   &container_expiration_policy_attributeszFailed to create project: %s rC   )r   rV   idr   projectscreater   
exceptionsGitlabCreateErrorrM   r   )r   r[   	argumentsr^   r_   s        r   rP   zGitLabProject.create_project  s    <<""$-LL	.!(I5BKLiBjI>?	Wll++229=G  !!33 	WLL""'FST'U"VV	Ws   %A B+8(B&&B+c                 ^    |j                         D ci c]  \  }}|	|| }}}|S c c}}w r   )items)r   ri   kvret_argumentss        r   rO   z$GitLabProject.get_options_with_value  s4    *3//*;M$!Qq}AMM Ns   
))c                   	 d}|j                         D ]  \  }}|	t        ||d       |k7  s|dk(  rt        ||i       	|j                         D ci c]  \  }}|	|| }}}|j                  d      dk(  rd |d<   |j                  d      dk(  rd |d<   t        	fd|j                         D              rt	        |d|       nt	        |||       d	} ||fS c c}}w )
NFr!   
older_than0dkeep_nr   c              3   L   K   | ]  \  }}j                  |      |k(    y wr   )get).0keyvalueold_vals      r   	<genexpr>z/GitLabProject.update_project.<locals>.<genexpr>4  s#     ]ZS%w{{3/58]s   !$rc   T)rk   getattrrt   allsetattr)
r   r^   ri   rK   arg_key	arg_valuerv   rw   	final_valrx   s
            @r   rU   zGitLabProject.update_project%  s    "+//"3 	#GY$7GT2i?"??")'7B"?BK//BS$iJCW\WhS%Z$i	$i$==6$>6:Il3$==2a726Ih/]9??K\]]$)QS\])<"G#	#& !! %js   
CCc                 h    | j                   j                  ry| j                  }|j                         S )NT)r   rV   r   delete)r   r^   s     r   delete_projectzGitLabProject.delete_project=  s*    <<""%%~~r   c                 d    t        | j                  |j                  dz   |z         }|r|| _        yy)N/TF)r   r   	full_pathr   )r   r[   rE   r^   s       r   exists_projectzGitLabProject.exists_projectI  s3    t||Y-@-@3-F-MN")Dr   N)
__name__
__module____qualname__r   r`   rP   rO   rU   r   r    r   r   r   r     s@    #

Tl"0 r   r   c                  0   t               } | j                  t                      | j                  t        d_i dt        d      dt        d      dt        dg d	      d
t        d      dt        d      dt        dd t        t        dg d	      t        d      t        dg d	      t        dg d	      t        d      t        d                  dt        dg d	      dt        d      dt        d      dt        dg d	      dt        dg d	      dt        dg d	      dt        d      dt        d      dt        dg d	      dt        dd      d t        dg d	      d!t        dd"      d#t        dd$      d%t        dd&g d'(      d)t        dd"      d*t        dg d	      d+t        dg d	      d,t        dd"-      d.t        d      d/t        d      d0t        d      d1t        dg d	      dt        d      d2t        dg d	      d3t        d      d4t        dg d	      d5t        dg d	      d6t        d      d7t        d      d8t        d"d$      d9t        dg d:	      d;t        dd<d=d<g(      d>t        d?d@      dAt        d      dBt        ddCg dDdEgF      dGt        dd"             t	        | dHdIgdHdJgdHdKgdIdJgdIdKgddAgd d!ggdHdLggg dMgd"N      }t        |      }|j                  d   }|j                  d   }|j                  d   }|j                  d
   }|j                  d   }|j                  d   }|j                  d   }	|j                  d   }
|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d   }|j                  d    }|j                  d!   }|j                  d#   }|j                  d%   }|j                  d)   }|j                  d*   }|j                  d+   }|j                  d.   }|j                  d/   }|j                  d0   }|j                  d1   }|j                  d   }|j                  d,   }|j                  d   }|j                  d2   } |j                  d3   }!|j                  d4   }"|j                  d5   }#|j                  d6   }$|j                  d7   }%|j                  d8   }&|j                  d9   }'|j                  d;   }(|j                  d>   })|j                  dA   }*|j                  dB   }+|j                  dG   },||j                  dOdP      }t        ||      }-d }.d }/|r0t        ||      }0|0|j                  dQ|z  R       |0j                  }/nc|*r!|j                  j                  |*dS      dT   }.n4|j                  j                  |j                  j                  dS      dT   }.|.j                  }/|/s|j                  dUR       	 |j                  j!                  |/      }.|.s|j                  dWR       |-j+                  |.|      }2|(d=k(  r;|2r&|-j-                          |j/                  d"dX|z  Y       |j/                  ddZY       |(d<k(  r|-j1                  |||.i d|d|d|d
|d|d|d|	d|
d|d|d|d|d|d|d|d |d!|i d#|d%|d)|d*|d+|d.|d/|d0|d1|d|d2| d3|!d4|"d5|#d6|$d7|%d8|&|'|)|+|,d[      r+|j/                  d"d\|z  |-j2                  j4                  ]       |j/                  dd^|z  |-j2                  j4                  ]       y y # t"        j$                  j&                  $ r)}1|j                  dVt)        |1      z  R       Y d }1~1d }1~1ww xY w)`Nr   bool)typerG   rE   r   str)privatedisabledenabled)r   choicesr   intr    r!   dict)1d7d14d1month3month)r         
      2   d   )rq   r   r   30d90d)cadencer   rr   rp   
name_regexname_regex_keep)r   defaultr\   r"   rA   r#   r$   r%   r&   grouprF   r'   rB   F)r   r   r(   r)   Tr*   )r   r   r+   merge)r   rebase_mergeff)r   r   r   r,   r-   r.   r/   )r   requiredr0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   )neveralwaysdefault_off
default_onstatepresentabsentr?   list)r   elementsusernamer<   r   )internalr   publicvisibility_level)r   r   r   aliasesr=   api_username	api_tokenapi_oauth_tokenapi_job_tokenapi_password)r   r   r   r   )argument_specmutually_exclusiverequired_togetherrequired_one_ofsupports_check_mode _z0Failed to create project: group %s doesn't existrC   )searchr{   r   zSFailed to find the namespace or group ID which is required to look up the namespacez3Failed to find the namespace for the given user: %sz,Failed to find the namespace for the projectzSuccessfully deleted project %srJ   z!Project deleted or does not exist)r;   r?   r<   r=   rI   )rK   rD   r^   z No need to update the project %sr   )r   rN   r	   r   r   r   paramsreplacer   r
   rM   rd   
namespacesr   userr   rt   r   rg   GitlabGetErrorr   r   r   rW   r`   r   _attrs)3r   r   r   r   rG   r   r   r    r!   r"   rA   r$   r%   r&   group_identifierrF   r'   rB   r(   r)   r*   r+   r,   r-   r.   r0   r1   r2   r3   project_descriptionrZ   project_pathr4   r5   r6   r7   r8   r9   r:   r;   r   r?   r   r<   r=   gitlab_projectr[   rb   r   r_   project_existss3                                                      r   mainr   R  s
   ,.M+-. 2(,&(92f%2 !e5WX2 &	2
 '2 %)fdDe-TUf%U,FG0QR' e,M
 %2 )-%Ac(d2 '2  e$!2" #'E;]"^#2$ $(U<^#_%2& "u6XY'2( )2* U#+2, %)e=_$`-2.  $?/20 !e5WX122 6324 V4526 ug?^_728  $>92: %)e=_$`;2< "u6XY=2> ut,?2@ :>69JA2B /3.?C2D 6*E2F  U4VWG2H uI2J #7YZK2L *.6):M2N !%%9[ \O2P .2uFh-iQ2R "v.S2T  $0U2V d8W2X /_`Y2Z y8Y:OP[2\ %0]2^ 5!_2` UI?`k}j~a2b vt4c2 2h #[)./_-+,/*j!"$45
 ^,
 N
 !#F* ,F3O&,mm4U&V#--.K --(=>MM/2M]]#34N"(--0M"N&,mm4U&V#]]#34N &.I J!'/K!L!==)?@}}W-|,J"(--0M"N#]]+CD --(=>]]#34N--.K==0L#]]+CD"(--0M"N!==)?@7=}}Ew7x4,2MM:a,b)}}%78';< --6==(L==(L"MM*AB'-}}5W'X$$mm,EF+1==9_+`(!==)?@#]]+CD}}%78MM/2MMM'"E]]8$F}}Z(H|,J==0L #++C5"6?;NIL?,<==!SVf!fgxx'2277xU7STUVI'2277?S?S?\?\bg7hijkI ||rsc#..22<@	 KL#229lKN))+T/PS_/_`,OP	226< 'U
-/N'U
;'U
 "#6'U
 ]	'U

 n'U
 *+F'U
 ./N'U
 n'U
 .'U
 ()B'U
 )*D'U
 #$8'U
 *'U
 *+F'U
 %&<'U
  "#6!'U
" n#'U
$ ;%'U
& L''U
( %&<)'U
* *+F+'U
, #$8-'U
. ?@p/'U
0 45Z1'U
2  03'U
4 !"45'U
6 L7'U
8 $%:9'U
: /0P;'U
< &'>='U
> 34X?'U
@ #$8A'U
B %&<C'U
D  0E'U
F +$(M'U
 'R T/_bn/n  yG  yV  yV  y]  y]  ^,NQ],]gu  hE  hE  hL  hL  	MY  ++ cRU^_`Uaabbcs   ._ `,``__main__N)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.apir   ansible.module_utils.basicr   +ansible.module_utils.common.text.convertersr   Aansible_collections.community.general.plugins.module_utils.gitlabr	   r
   r   r   r   Bansible_collections.community.general.plugins.module_utils.versionr   objectr   r   r   r   r   r   <module>r      sq    A @FP
-^
2 > 4 A  \hF hVLM^ zF r   