HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/__pycache__/boto_rds.cpython-310.pyc
o

�N�g���
@sbdZddlZddlZddlZddlmmZddlZddl	m
Z
e�e�Z
z$ddlZddlZddlmZe�d��ej�e�d��ej�dZWneyUdZYnwid	d
ef�ddef�d
def�ddef�ddef�ddef�ddef�ddef�ddef�ddef�ddef�dd ef�d!d"ef�d#d$ef�d%d&ef�d'd(ef�d)d*ef�id+d,ef�d-d.ef�d/d0ef�d1d2ef�d3d4ef�d5d6ef�d7d8ef�d9d:ef�d;d<ef�d=d>ef�d?d@ef�dAdBef�dCdDef�dEdFef�dGdHef�dIdJef�dKdLef��dMefdNefdOefdPefdQefdRefdSefdTefdU��ZdVdW�ZdXdY�Zd�dZd[�Z	d�d\d]�Z	d�d^d_�Z	d�d`da�Z 																																					d�dbdc�Z!																	d�ddde�Z"					d�dfdg�Z#					d�dhdi�Z$					d�djdk�Z%	l					d�dmdn�Z&d�dodp�Z'			q				d�drds�Z(			t				d�dudv�Z)d�dwdx�Z*									yd�dzd{�Z+d�d|d}�Z,d�d~d�Z-d�d�d��Z.							d�d�d��Z/							d�d�d��Z0																																								d�d�d��Z1d�d��Z2dS)�a�
Connection module for Amazon RDS

.. versionadded:: 2015.8.0

:configuration: This module accepts explicit rds credentials but can also
    utilize IAM roles assigned to the instance through Instance Profiles.
    Dynamic credentials are then automatically obtained from AWS API and no
    further configuration is necessary. More Information available at:

    .. code-block:: text

        http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

    If IAM roles are not used you need to specify them either in a pillar or
    in the minion's config file:

    .. code-block:: yaml

        rds.keyid: GKTADJGHEIQSXMKKRBJ08H
        rds.key: askdjghsdfjkghWupUjasdflkdfklgjsdfjajkghs

    A region may also be specified in the configuration:

    .. code-block:: yaml

        rds.region: us-east-1

    If a region is not specified, the default is us-east-1.

    It's also possible to specify key, keyid and region via a profile, either
    as a passed in dict, or as a string to pull from pillars or minion config:

    .. code-block:: yaml

        myprofile:
            keyid: GKTADJGHEIQSXMKKRBJ08H
            key: askdjghsdfjkghWupUjasdflkdfklgjsdfjajkghs
            region: us-east-1

:depends: boto3
�N)�SaltInvocationError)�ClientError�boto�boto3TF�allocated_storage�AllocatedStorage�allow_major_version_upgradeZAllowMajorVersionUpgrade�apply_immediatelyZApplyImmediately�auto_minor_version_upgrade�AutoMinorVersionUpgrade�availability_zone�AvailabilityZone�backup_retention_period�BackupRetentionPeriod�ca_certificate_identifier�CACertificateIdentifier�character_set_name�CharacterSetName�copy_tags_to_snapshot�CopyTagsToSnapshot�db_cluster_identifier�DBClusterIdentifier�db_instance_class�DBInstanceClass�db_name�DBName�db_parameter_group_name�DBParameterGroupName�db_port_numberZDBPortNumber�db_security_groupsZDBSecurityGroups�db_subnet_group_name�DBSubnetGroupName�domainZDomain�domain_iam_role_nameZDomainIAMRoleName�engine�Engine�engine_version�
EngineVersion�iops�Iops�
kms_key_id�KmsKeyId�
license_model�LicenseModel�master_user_passwordZMasterUserPassword�master_usernameZMasterUsername�monitoring_interval�MonitoringInterval�monitoring_role_arn�MonitoringRoleArn�multi_azZMultiAZ�name�DBInstanceIdentifier�new_db_instance_identifierZNewDBInstanceIdentifier�option_group_name�OptionGroupName�port�Port�preferred_backup_window�PreferredBackupWindow�preferred_maintenance_window�PreferredMaintenanceWindow�
PromotionTier�PubliclyAccessible�StorageEncrypted�StorageType�Tags�TdeCredentialArnZTdeCredentialPasswordZVpcSecurityGroupIds)�promotion_tier�publicly_accessible�storage_encrypted�storage_type�tags�tde_credential_arn�tde_credential_password�vpc_security_group_idscCstjjjdd�S)zg
    Only load if boto libraries exist and if boto libraries are greater than
    a given version.
    z1.3.1)Z	boto3_ver)�salt�utilsZversionsZcheck_boto_reqs�rPrP�I/opt/saltstack/salt/lib/python3.10/site-packages/salt/modules/boto_rds.py�__virtual__{srRcCstrtdtd�dSdS)Nzboto3.assign_funcs�rds)�HAS_BOTO�	__utils__�__name__)�optsrPrPrQ�__init__�s�rXc	
C�`t||||d�}z
|j|d�}dt|�iWSty/}zdtd|�iWYd}~Sd}~ww)z�
    Check to see if an RDS exists.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.exists myrds region=us-east-1
    ��region�key�keyid�profile�r6�exists�error�boto3.get_errorN)�	_get_conn�describe_db_instances�boolrrU�	r5rJr[r\r]r^�connrS�erPrPrQr`�s
��r`c	
CrY)z�
    Check to see if an RDS option group exists.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.option_group_exists myoptiongr region=us-east-1
    rZ�r9r`rarbN)rcZdescribe_option_groupsrerrUrfrPrPrQ�option_group_exists�s��rjc

Cs�t||||d�}z|j|d�}t|�dd�WStyA}zi}	|jdddkr-d|	d	<td
|�|	d<|	WYd}~Sd}~ww)z�
    Check to see if an RDS parameter group exists.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.parameter_group_exists myparametergroup                 region=us-east-1
    rZ�rN)r`ra�Error�CodeZDBParameterGroupNotFoundFr`rbra)rc�describe_db_parameter_groupsrer�responserU)
r5rJr[r\r]r^rgrSrhZresprPrPrQ�parameter_group_exists�s
��rpc	
Cs�zt||||d�}|sdt|�iWS|j|d�}dt|�iWStyG}zd|jvr5ddiWYd}~Sdtd|�iWYd}~Sd}~ww)	z�
    Check to see if an RDS subnet group exists.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.subnet_group_exists my-param-group                 region=us-east-1
    rZr`�r!ZDBSubnetGroupNotFoundFaultFNrarb)rcre�describe_db_subnet_groupsr�messagerUrfrPrPrQ�subnet_group_exists�s

��rtc+9
Cs|std��|std��|std��|std��|std��|
r&|r&td��|r7gd�}+||+vr7td|+����|	rLtd	|	|&|(|)|*d
�},|rJ||,n|,}z�t|&|(|)|*d�}-|-s^dt|-�iWSi}.tt���}/tt����}0t|�}|0�	|/�D]}1t�|1}2|2d
ur�t|1}3|3d|2�|.|3d<qvdd�|.�
�D�}.|-jd!i|.��}4|4s�ddiWS|s�dd|�d�d�WS	d}5t||5|&|(|)|*d�}6|6r�|6d}7n	dd�
|�d�WS|7|kr�dd�
||7�d�WSt�d�t�d|7�q�t�y}8zdtd |8�iWYd
}8~8Sd
}8~8ww)"z�
    Create an RDS Instance

    CLI example to create an RDS Instance::

        salt myminion boto_rds.create myrds 10 db.t2.micro MySQL sqlusr sqlpassw
    zallocated_storage is requiredzdb_instance_class is requiredzengine is requiredzmaster_username is requiredz master_user_password is requiredz@availability_zone and multi_az are mutually exclusive arguments.)Z	availableZ	modifyingz
backing-upzwait_status can be one of: z"boto_secgroup.convert_to_group_ids)�groupsr[r\r]r^rZ�resultsN�rcSsi|]\}}|dur||�qS)NrP)�.0�k�vrPrPrQ�
<dictcomp>Iszcreate.<locals>.<dictcomp>�createdFT�
RDS instance z	 created.�r|rszDBInstances[*].DBInstanceStatus)r5�jmespathr[r\r]r^zARDS instance {} should have been created but now I can't find it.)r|raz+RDS instance {} created (current status {})�
z'Instance status after 10 seconds is: %srarbrP)r�__salt__rcre�set�boto3_param_map�keys�locals�_tag_doc�intersection�itemsZcreate_db_instancerd�format�time�sleep�log�inforrU)9r5rrr$r/r.rrrMZvpc_security_groupsrr r>rrr<r:r4r&r
r,r(r8rrGZwait_statusrJrrIrKrLrHr*r"rr0r2r#r[rFr\r]r^Z
wait_statiZv_tmprg�kwargs�boto_paramsr�Z	param_key�val�mappedrSr�status�statrhrPrPrQ�create�s�4���
�

��
���
���r�cCsxtstd��td||	||||�}|�d�s!t|�d|�d�d�Std||	||||�}|�d�r<t|�d|�d�d�Szet||||d	�}i}d
D]}t�|dur[tt�|�||<qIdD]}t�|durptt�|�||<q^d
D]}t�|dur�tt�|�||<qst	|	�}|j
d|||||||
|d�|��}dt|�iWSty�}zdtd|�iWYd}~Sd}~ww)z�
    Create an RDS read replica

    CLI example to create an RDS  read replica::

        salt myminion boto_rds.create_read_replica replicaname source_name
    z#backup_retention_period is required�boto_rds.existsr`zRDS instance source z does not exists.�r`rszRDS replica instance z already exists.rZ)r9r3N)r1r)r;)rr)r6ZSourceDBInstanceIdentifierrr
rArDr!rCrarbrP)
rrr��getrercr��str�intr�Zcreate_db_instance_read_replicarrU)r5Zsource_namerrr:r
r(r8rGrJr rIrr0r2r[r\r]r^�resrgr��taglistZrds_replicarhrPrPrQ�create_read_replicaxsZ

�

�����	���r�c	
Cs�td||||||�}	|	�d�rdt|	�iSz&t||||d�}
|
s(dt|
�iWSt|�}|
j|||||d�}dt|�iWStyV}
zdtd|
�iWYd}
~
Sd}
~
ww)	z�
    Create an RDS option group

    CLI example to create an RDS option group::

        salt myminion boto_rds.create_option_group my-opt-group mysql 5.6                 "group description"
    zboto_rds.option_group_existsr`rZrv)r9Z
EngineNameZMajorEngineVersionZOptionGroupDescriptionrDrarbN)r�r�rercr��create_option_grouprrU)r5Zengine_nameZmajor_engine_versionZoption_group_descriptionrJr[r\r]r^r�rgr�rSrhrPrPrQr��s,�
���r�c

Cs�td||||||�}|�d�rdt|�iSz4t||||d�}	|	s(dt|	�iWSt|�}
|	j||||
d�}|s@dd|��d�WSt|�d	|��d
�WStyd}zdtd|�iWYd
}~Sd
}~ww)z�
    Create an RDS parameter group

    CLI example to create an RDS parameter group::

        salt myminion boto_rds.create_parameter_group my-param-group mysql5.6                 "group description"
    �boto_rds.parameter_group_existsr`rZrv)rZDBParameterGroupFamily�DescriptionrDFz%Failed to create RDS parameter group r~zCreated RDS parameter group r�rarbN)r�r�rercr�Zcreate_db_parameter_grouprrU)
r5Zdb_parameter_group_family�descriptionrJr[r\r]r^r�rgr�rSrhrPrPrQ�create_parameter_group�s6�
�����r�c

Cs�td||||||�}|�d�rdt|�iSz%t||||d�}	|	s(dt|	�iWSt|�}
|	j||||
d�}dt|�iWStyU}zdtd|�iWYd	}~Sd	}~ww)
z�
    Create an RDS subnet group

    CLI example to create an RDS subnet group::

        salt myminion boto_rds.create_subnet_group my-subnet-group             "group description" '[subnet-12345678, subnet-87654321]'             region=us-east-1
    zboto_rds.subnet_group_existsr`rZrv)r!ZDBSubnetGroupDescriptionZ	SubnetIdsrDr|rarbN)r�r�rercr�Zcreate_db_subnet_grouprrU)
r5r�Z
subnet_idsrJr[r\r]r^r�rgr�rSrhrPrPrQ�create_subnet_group$s*�
���r��pending-rebootc
Cs0td||||||�}|�d�st|�d|�d�d�Sg}	|��D]6\}}
t��}|�d|i�|�d|i�t|
�turI|�d|
rDd	nd
i�n	|�dt|
�i�|	�	|�q!|	s^ddiSzt
||||d
�}|spdt|�iWS|j||	d�}dt|�iWSty�}
zdt
d|
�iWYd}
~
Sd}
~
ww)a
    Update an RDS parameter group.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.update_parameter_group my-param-group                 parameters='{"back_log":1, "binlog_cache_size":4096}'                 region=us-east-1
    r�r`zRDS parameter group � does not exist.r��
ParameterName�ApplyMethod�ParameterValue�onZoffrvFrZ)r�
ParametersrarbN)r�r�rer��odict�OrderedDict�update�typer��appendrcZmodify_db_parameter_grouprrU)r5�
parametersZapply_methodrJr[r\r]r^r�Z
param_list�value�itemrgrhrPrPrQ�update_parameter_groupOs<�

����r�c

s�td�|||||�}|�d�st|�d��d�d�Sz<t||||d�}|s-dt|�iWS|j�d���fd	d
���dg�D��d���rSd
}d�fdd�|D�iWSddiWStyq}	zdtd|	�iWYd}	~	Sd}	~	wty}ddiYSw)z�
    Return RDS instance details.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.describe myrds

    r�r`r}r�r�rZrvr_csg|]}|�d��kr|�qSr_�r�)rx�i)r5rPrQ�
<listcomp>�s
�zdescribe.<locals>.<listcomp>�DBInstancesr)r6rr%ZDBInstanceStatusrrr=rr
r?ZLatestRestorableTimer'rr-r)rrArCrEZDBInstancePortrrBr+Z
DbiResourceIdrrr1r3r@ZDomainMembershipsrScsi|]}|��|��qSrPr�)rxry)rSrPrQr{�szdescribe.<locals>.<dictcomp>Nrarb)	r�r�rercrd�poprrU�
IndexError)
r5rJr[r\r]r^r�rgr�rhrP)r5rSrQ�describe�s2

�

�� 
��r�r�c

Cs�t||||d�}|�d�}i}	|r|	�d|i�nd|r#|	�d|i�nd|jd
i|	��}
|r4|
�|�n|
}
zdd�|
D�WStyr}z(t|di��d	i��d
�}|dkrgt�	t
d|��WYd}~gSWYd}~gSd}~ww)av
    Return a detailed listing of some, or all, DB Instances visible in the
    current scope.  Arbitrary subelements or subsections of the returned dataset
    can be selected by passing in a valid JMSEPath filter as well.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.describe_db_instances jmespath='DBInstances[*].DBInstanceIdentifier'

    rZrdr6N�FilterscS�g|]}|�qSrPrP�rx�prPrPrQr���z)describe_db_instances.<locals>.<listcomp>rorlrmZDBInstanceNotFoundrbrP)rc�
get_paginatorr��paginate�searchr�getattrr�r�rarU)
r5�filtersrr[r\r]r^rg�pag�args�pitrh�coderPrPrQrd�s(
��
���rd�DBSubnetGroupscCszt||||d�}|�d�}i}	|r|	�d|i�nd|r#|	�d|i�nd|jdi|	��}
|r4|
�|�n|
}
dd�|
D�S)	aO
    Return a detailed listing of some, or all, DB Subnet Groups visible in the
    current scope.  Arbitrary subelements or subsections of the returned dataset
    can be selected by passing in a valid JMSEPath filter as well.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.describe_db_subnet_groups

    rZrrr!Nr�cSr�rPrPr�rPrPrQr�r�z-describe_db_subnet_groups.<locals>.<listcomp>rP)rcr�r�r�r�)r5r�rr[r\r]r^rgr�r�r�rPrPrQrr�s
��rrc
Cs�d}td||||||�}|�d�r]z0t||||d�}|r:|j|d�}	|	r=d|	ddvr@|	dddd	}|WSW|SW|SW|Sty\}
zd
td|
�iWYd}
~
Sd}
~
ww|S)
z�
    Return the endpoint of an RDS instance.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.get_endpoint myrds

    Fr�r`rZr_ZEndpointr�rZAddressrarbN)r�r�rcrdrrU)r5rJr[r\r]r^Zendpointr�rgrSrhrPrPrQ�get_endpoints*
�
�����r��c

Csj|	dkr|sd}	|s|std��z�t||||d�}
|
s"dt|
�iWSi}t�ddur4tt�d�|d<t�d	durDtt�d	�|d
<|
jdd|i|��}|s\t|�d|�d
�d�WSt��}
	td||||||d�}|�d�s~t|�d|�d�d�WSt��|
|	kr�td�	||	���t
�d|	|�t�d�qat
y�}zdtd|�iWYd}~Sd}~ww)z�
    Delete an RDS instance.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.delete myrds skip_final_snapshot=True                 region=us-east-1
    r�i�zaAt least one of the following must be specified: skip_final_snapshot final_db_snapshot_identifierrZ�deleted�skip_final_snapshotNZSkipFinalSnapshot�final_db_snapshot_identifierZFinalDBSnapshotIdentifierr6zDeleted RDS instance �.�r�rsTr�)r5rJr[r\r]r^r`z completely.z@RDS instance {} has not been deleted completely after {} secondsz;Waiting up to %s seconds for RDS instance %s to be deleted.r�rarbrP)rrcrer�r�Zdelete_db_instancer�r�r�r�r�r�r�rrU)r5r�r�r[r\r]r^rJZwait_for_deletion�timeoutrgr�r�Z
start_timerhrPrPrQ�delete2sh��
��

���
���r�c
Cs�z1t||||d�}|sdt|�iWS|j|d�}|s&t|�d|�d�d�WSt|�d|�d�d�WStyK}zdtd	|�iWYd
}~Sd
}~ww)z�
    Delete an RDS option group.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.delete_option_group my-opt-group                 region=us-east-1
    rZr�riz"Failed to delete RDS option group r�r�zDeleted RDS option group rarbN)rcre�delete_option_grouprrU)r5r[r\r]r^rgr�rhrPrPrQr��s 
�
���r�c
C�|z#t||||d�}|sdt|�iWS|j|d�}t|�d|�d�d�WSty=}zdtd|�iWYd	}~Sd	}~ww)
z�
    Delete an RDS parameter group.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.delete_parameter_group my-param-group                 region=us-east-1
    rZrvrkzDeleted RDS parameter group r�r�rarbN)rcreZdelete_db_parameter_grouprrU�r5r[r\r]r^rg�rrhrPrPrQ�delete_parameter_group��
���r�c
Cr�)
z�
    Delete an RDS subnet group.

    CLI Example:

    .. code-block:: bash

        salt myminion boto_rds.delete_subnet_group my-subnet-group                 region=us-east-1
    rZrvrqzDeleted RDS subnet group r�r�rarbN)rcreZdelete_db_subnet_grouprrUr�rPrPrQ�delete_subnet_group�r�r�c

Cstd|d||||d�}|�d�sdt|�iSz\t||||d�}	|	s)dt|	�iWSi}
dD]}t�|dur?tt�|�|
|<q-t�ddurPtt�d�|
d<|	jdd	|i|
��}|sht|�d
|�d�d�WSt|�d
|�d�d�WSty�}zdt	d|�iWYd}~Sd}~ww)z�
    Returns a list of `DBParameterGroup` descriptions.
    CLI example to description of parameter group::

        salt myminion boto_rds.describe_parameter_group parametergroupname            region=us-east-1
    r�N�rJr[r\r]r^r`rZrv)�Markerr��
MaxRecordsrz(Failed to get RDS description for group r�)rvrszGot RDS descrition for group rarbrP)
r�r�rercr�r�r�rnrrU)
r5r�r�r�r[r\r]r^r�rgr�r�rhrPrPrQ�describe_parameter_group�s8�
�
�
���r�c
Csltd|d||||d�}|�d�sdd|�d�d�Sz�t||||d	�}	|	s+dd
d�WSi}
|
�d|i�dD]}t�|durHtt�|�|
|<q6t�d
durYtt�d
�|
d
<|	�d�}|jdi|
��}gd�}
t	�
�}ddi}|D] }|dD]}t	�
�}|
D]	}|�|�||<q�|||�d�<qzqt||d<|WSty�}zdtd|�iWYd}~Sd}~ww)z�
    Returns a list of `DBParameterGroup` parameters.
    CLI example to description of parameters ::

        salt myminion boto_rds.describe_parameters parametergroupname            region=us-east-1
    r�Nr�r`FzParameter group z does not exist)�resultrsrZz'Could not establish a connection to RDSr)r��Sourcer�Zdescribe_db_parameters)
r�r�r�r�Z	ApplyTypeZDataTypeZ
AllowedValuesZ
IsModifieableZMinimumEngineVersionr�r�Tr�r�r�rarbrP)
r�r�rcr�r�r�r�r�r�r�r�rrU)r5r�r�r�r[r\r]r^r�rgr�r�r�r�r��retr�r��dataryrhrPrPrQ�describe_parameters
sN�

���

���r�c)3
Cs>td|d|%|&|'|(d�})|)�d�sdd|�d�d�Szjt|%|&|'|(d	�}*|*s*d
diWSi}+dh},tt���}-tt����}.|.�|-��|,�D]}&t�|&}/|/dur]t|&}0|0d|/�|+|0d
<qD|*j	dd|i|+��}1|1svt
|1�d|�d�d�WSt
|1�d|�d�t|1�d�WSty�}2zdt
d|2�iWYd}2~2Sd}2~2ww)z�
    Modify settings for a DB instance.
    CLI example to description of parameters ::

        salt myminion boto_rds.modify_db_instance db_instance_identifier region=us-east-1
    r�Nr�r`FzRDS db instance r�)�modifiedrsrZr�r5rwrr6z!Failed to modify RDS db instance r�zModified RDS db instance )r�rsrvrarbrP)r�r�rcr�r�r�r�r��
difference�modify_db_instancere�dictrrU)3r5rrr	r
rrrrrrrrrrr r"r#r&r(r*r,r.r0r2r4r7r8r<r>rFrGrHrIrKrLrMr[r\r]r^r�rgr�Zexcludedr�r�r�r�r�rhrPrPrQr�YsD1�

�

�
�
���r�cCsJg}|dur#|��D]\}}t|��d�rq
|�t|�t|�d��q
|S)N�__)ZKeyZValue)r�r��
startswithr�)rJr�ryrzrPrPrQr��sr�)NNNNN)%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNN)r�NNNNN)NNr�NNNN)NNr�NNNN)	NNNNNNNTr�)NNNN)NNNNNNN)(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)3�__doc__�loggingr�Zsalt.utils.compatrNZsalt.utils.odictrOr�Zsalt.utils.versionsZsalt.exceptionsr�	getLoggerrVr�rrZbotocore.exceptionsr�setLevel�CRITICALrT�ImportErrorr�rer��listr�rRrXr`rjrprtr�r�r�r�r�r�r�rdrrr�r�r�r�r�r�r�r�r�rPrPrPrQ�<module>s(1
���������	�
���
������������������� �!�"�#�.

�
�
�"
�
�S
�0
�6
�.
�
:I
�&
�

�
V


�6
�N
�Z