
    BhVc                        d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlm Z m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZCmDZDmEZE  e<e;e#      Z# e<e;e$      Z$ G d d ej                        ZG G d! d"e      ZH G d# d$e      ZI G d% d&      ZJ G d' d(eJe.      ZK G d) d*eJe-      ZL G d+ d,eJe-      ZM G d- d.e-      ZN G d/ d0e-      ZO G d1 d2e-      ZPy3)4    )Mockpatch)formsapps)Apps)ImproperlyConfigured)	ModelForm)TemplateSyntaxError)override_settings)reverse)	smart_str)gettext)app_registration)create_page)cms_page_wizardcms_subpage_wizard)MODAL_HTML_REDIRECTTEMPLATE_INHERITANCE_MAGIC)CreateCMSPageFormCreateCMSSubPageForm)PageUserSettings)wizard)sample_wizard)CMSTestCaseTransactionCMSTestCase)get_object_edit_urlget_object_preview_url)get_current_site)get_cms_setting)setup_cms_apps)admin_reverse)WizardStep2BaseFormstep2_form_factory)get_entries	get_entry)Wizard)AlreadyRegisteredExceptionentry_choiceswizard_pool)	mixin_clsentry_form_classc                       e Zd Zy)
WizardFormN__name__
__module____qualname__     F/home/dcms/DCMS/lib/python3.12/site-packages/cms/tests/test_wizards.pyr/   r/   3   s    r5   r/   c                        e Zd Z G d d      Zy)ModelWizardFormc                       e Zd ZeZg Zy)ModelWizardForm.MetaN)r1   r2   r3   r   modelexcluder4   r5   r6   Metar:   8   s    r5   r=   Nr1   r2   r3   r=   r4   r5   r6   r8   r8   7   s     r5   r8   c                        e Zd Z G d d      Zy)BadModelFormc                       e Zd Zy)BadModelForm.MetaNr0   r4   r5   r6   r=   rB   >   s    r5   r=   Nr>   r4   r5   r6   r@   r@   =   s     r5   r@   c                   6     e Zd ZdZdZd Ze fd       Z xZS )WizardTestMixinNc                 8   t        |      }t        |      }t        t        ||            }t        |      t        |      k  st        |      t        |      k  r| j                  d       t	        |      D ]"  \  }\  }}||k7  s| j                  d|        $ y )Nz"Sequence lengths are not the same.zSequences differ at index )listziplenfail	enumerate)selfseq_aseq_bzippedidxabs          r6   assertSequencesEqualz$WizardTestMixin.assertSequencesEqualF   s    UUc%'(v;U#s6{SZ'?II:;$V, 	>KC!QAv		6se<=	>r5   c                 N   t         |           dt        _         G d dt              } |t        d      dt        t        d      | _         G d d	t              } |t        d
      dt              | _
         G d dt              } |t        d      dt        d      | _        y )NTc                       e Zd Zy).WizardTestMixin.setUpClass.<locals>.PageWizardNr0   r4   r5   r6   
PageWizardrU   W       r5   rV   r   d   my_template.html)titleweightformr;   template_namec                       e Zd Zy)2WizardTestMixin.setUpClass.<locals>.SettingsWizardNr0   r4   r5   r6   SettingsWizardr_   c   rW   r5   r`   r      )rZ   r[   r\   c                       e Zd Zy)5WizardTestMixin.setUpClass.<locals>.PageContentWizardNr0   r4   r5   r6   PageContentWizardrc   m   rW   r5   rd   )rZ   r[   r\   r]   )super
setUpClassr+   _discoveredr(   _r/   r   page_wizardr8   user_settings_wizardr@   title_wizard)clsrV   r`   rd   	__class__s       r6   rf   zWizardTestMixin.setUpClassP   s     #'	 	 %F),
	V 	 $2N# $
 	 	
 -F),	
r5   )	r1   r2   r3   ri   rk   rR   classmethodrf   __classcell__)rm   s   @r6   rD   rD   B   s&    KL> &
 &
r5   rD   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestWizardBasec                     | j                         }| j                  | j                  j                  |             | j	                         }| j                  | j                  j                  |             y N)"get_staff_user_with_no_permissionsassertFalseri   user_has_add_permissionget_superuser
assertTrue)rK   users     r6   test_user_has_add_permissionz+TestWizardBase.test_user_has_add_permission|   s\    668))AA$GH !!#((@@FGr5   c                 T   | j                         }t        dt        dt        |      d d      }|j	                  d      }| j                  | j                  j                  |d      |       |j	                         }| j                  | j                  j                  |      |       y )NSample PageenTrZ   templatelanguage
created_byparentin_navigationr   )rw   r   r   r   get_absolute_urlassertEqualri   get_success_url)rK   ry   pageurls       r6   test_get_success_urlz#TestWizardBase.test_get_success_url   s    !!#/ 
 ##T#2))994 : !"%	' ##%))99$?Er5   c                 v   | j                         }t        dt        dt        |      d d      }t	        j
                  d      j                  }t        j                  |dt        |i      5  | j                  j                  |d      }| j                  |t        |d             d d d        y # 1 sw Y   y xY w)Nr|   r}   Tr~   cmstoolbar_enabled_modelsr   )rw   r   r   r   r   get_app_configcms_extensionr   objectr   ri   r   r   r   )rK   ry   r   	extensionr   s        r6   test_get_edit_urlz TestWizardBase.test_get_edit_url   s    !!#/ 
 ''.<<	\\)%=d|L 	?""22t 3 %C(=?	? 	? 	?s   +;B//B8c                    t        t        d      dt        t        dd      }| j	                         }t        dt        dt        |      d d	      }t        j                  d
      j                  }t        j                  |dt        |i      5  |j                  |d      }| j                  |t        |d             d d d        y # 1 sw Y   y xY w)Nr   rX   rY   F)rZ   r[   r\   r;   r]   edit_mode_on_successr|   r}   Tr~   r   r   r   )r(   rh   r/   r   rw   r   r   r   r   r   r   r   r   r   r   r   )rK   wizard_preview_modery   r   r   r   s         r6   test_get_preview_urlz#TestWizardBase.test_get_preview_url   s    $F),!&
 !!#/ 
 ''.<<	\\)%=d|L 	B%55t 6 %C+D4@B	B 	B 	Bs   1CCc                 D   | j                  | j                  j                         t               | j                  | j                  j                         t
               | j                  t              5  | j                  j                          d d d        y # 1 sw Y   y xY wrs   )	r   ri   	get_modelr   rj   r   assertRaisesr	   rk   rK   s    r6   test_get_modelzTestWizardBase.test_get_model   sv    ))335t<22<<>M34 	*'')	* 	* 	*s   2BBc                 l   t        d      }| j                  dddd      }| j                  j                  |      }| j	                  |j
                  d       | j                  |      5  | j                  j                  |      }| j	                  |j
                  d       d d d        y # 1 sw Y   y xY w)Nzadmin:cms_wizard_createzstaff-activeTF)is_staffis_superuser	is_activei  ra   )r   _create_userclientgetr   status_codelogin_user_context)rK   endpointstaff_activeresponses       r6   test_endpoint_auth_requiredz*TestWizardBase.test_endpoint_auth_required   s    45(($UZfj(k;;??8,--s3$$\2 	8{{x0HX1137	8 	8 	8s   )8B**B3N)	r1   r2   r3   rz   r   r   r   r   r   r4   r5   r6   rq   rq   z   s#    HF$?&B8*	8r5   rq   c                   X    e Zd Zd Zd Zd Zd Zd Zd Zd Z	 e
d      d	        Zd
 Zy)TestWizardPoolc                    t        j                  d      j                  }t        |d      r|`t        j                         D cg c]$  }t        |j                  d      r|j                  & }}|D ]  }|j                  |        t
        j                  j                          t
        j                  j                          y c c}w )Nr   wizardscms_wizards)r   r   r   hasattrr   r   get_cms_config_apps
cms_configconfigure_wizardsget_cms_extension_appscache_clear)rK   r   appconfigs_with_wizardsconfigs        r6   tearDownzTestWizardPool.tearDown   s     ''.<<	9i(!&6&J&J&L 
"s~~}5 NN 
  
 + 	0F''/	0 	//;;=,,88: 
s   )Cc                     ddl m} | j                   |j                  d      j                  j
                         t        j                  t              }| j                  |       y)zn
        Test for backwards compatibility of is_registered when checking
        a registered wizard.
        r   r   r   N)	django.appsr   rx   r   r   r   r+   is_registeredr   )rK   r   r   s      r6   (test_is_registered_for_registered_wizardz7TestWizardPool.test_is_registered_for_registered_wizard   sI    
 	%+++E2@@HHI#11/B&r5   c                 d    t        j                  | j                        }| j                  |       y)zq
        Test for backwards compatibility of is_registered when checking
        an unregistered wizard.
        N)r+   r   ri   ru   )rK   r   s     r6   *test_is_registered_for_unregistered_wizardz9TestWizardPool.test_is_registered_for_unregistered_wizard   s(    
 $11$2B2BC'r5   c                     t        j                  t              }t        j                  d      j
                  j                  }| j                  t        j                  |       | j                  |       y)z|
        Test for backwards compatibility of the unregister method.
        Removes a wizard from the wizards dict.
        r   N)
r+   
unregisterr   r   r   r   r   assertNotInidrx   )rK   was_unregisteredregistered_wizardss      r6   !test_unregister_registered_wizardz0TestWizardPool.test_unregister_registered_wizard   sV    
 '11/B!007EEMM++-?@()r5   c                 d    t        j                  | j                        }| j                  |       y)zw
        Test for backwards compatibility of the unregister method.
        Returns False if wizard not found.
        N)r+   r   ri   ru   )rK   r   s     r6   #test_unregister_unregistered_wizardz2TestWizardPool.test_unregister_unregistered_wizard  s*    
 '11$2B2BC)*r5   c                     | j                  t              5  t        j                  t               ddd       y# 1 sw Y   yxY w)z
        Test for backwards compatibility of the register method.
        Raises AlreadyRegisteredException if the wizard is already
        registered.
        N)r   r)   r+   registerr   r   s    r6   'test_register_already_registered_wizardz6TestWizardPool.test_register_already_registered_wizard  s6     9: 	2  1	2 	2 	2s	   9Ac                     t        j                  | j                         t        j                  d      j
                  j                  }| j                  | j                  j                  |       y)zw
        Test for backwards compatibility of the register method.
        Adds the wizard to the wizards dict.
        r   N)	r+   r   ri   r   r   r   r   assertInr   )rK   r   s     r6   !test_register_unregistered_wizardz0TestWizardPool.test_register_unregistered_wizard  sP    
 	T--.!007EEMMd&&))+=>r5   z!cms.wizards.wizard_pool.get_entryc                 V    t        j                  t               |j                          y)z
        Test for backwards compatibility of wizard_pool.get_entry.
        Checking we use the new get_entry under the hood.
        N)r+   r'   r   assert_called_once)rK   mocked_get_entrys     r6   test_get_entryzTestWizardPool.test_get_entry"  s     	o.++-r5   c                    g d}t        |      }t        j                  j                          t        j                  j                          t        d|      5  t        d|      5  t                ddd       ddd       |j                  d      }t        j                  t        t        j                  t        t        j                  t        i}| j                  |j                  j                  |       y# 1 sw Y   xY w# 1 sw Y   xY w)z
        Integration-like test checking that if you register your wizard
        by adding wizard_pool.register(wizard) to cms_wizards.py it will
        correctly register the wizard. This ensures backwards
        compatibility.
        )r   	treebeardz(cms.test_utils.project.backwards_wizards)installed_appszcms.app_registration.appszcms.wizards.wizard_pool.appsNr   )r   r   r   r   r   r   r"   r   r   r   r   r   assertDictEqualr   r   )rK   INSTALLED_APPSmocked_appscms_appexpected_wizardss        r6   !test_old_registration_still_worksz0TestWizardPool.test_old_registration_still_works+  s    

 .9 	//;;=,,88:
 .< 	!5{C ! !	! ,,U3!!#5IIv

 	W22::<LM! !	! 	!s$   D&C71D7D 	<DDN)r1   r2   r3   r   r   r   r   r   r   r   r   r   r   r4   r5   r6   r   r      sE    ;"	'(*+2? ./. 0.(Nr5   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestPageWizardc                 ^    | j                  t        t              t        j                         y rs   )r   strr   rZ   r   s    r6   test_strzTestPageWizard.test_strX  s    _-/D/DEr5   c                    | j                  dt        t                     | j                  dt        j                   t        t                     | j                  t	        t        t                    t        t                     y )Nzcms.cms_wizards.CMSPageWizardzid=)r   reprr   r   hexr   s    r6   	test_reprzTestPageWizard.test_repr[  sT    5tO7LMO../0$2GHc"_-._0EFr5   c                 F   t               }| j                         }| j                  |      5  | j                         }d d d        t	        dt
        d      }ddd d}t        |||d      }| j                  |j                                |j                         }| j                  |j                  d       | j                  |j                  |       | j                  |j                  d      d       | j                  |j                  d      d	       y # 1 sw Y   xY w)
NParentr}   )rZ   r   r   ChildchildrZ   slug	page_typedatawizard_pagewizard_sitewizard_languagewizard_request   zparent/child)r    rw   r   get_requestr   r   r   rx   is_validsaver   depthr   	get_titleget_path)rK   site	superuserrequestparent_pager   r\   
child_pages           r6   test_wizard_create_child_pagez,TestPageWizard.test_wizard_create_child_page`  s
   !&&(	$$Y/ 	)&&(G	)!/
 

 $# "
 	(YY[
))1-**K8--d3W=,,T2NC3	) 	)s   DD c                    t               }| j                         }| j                  |      5  | j                         }d d d        ddd d}t	        |d |d      }| j                  |j                                | j                  t        j                  j                  t              j                                | j                  dg      5  | j                  t        |j                          | j                  t        j                  j                  t              j                                d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Npage 1page_1r   r}   r   )pagecontent_set__template)zcol_invalid.htmlnotvalid)CMS_TEMPLATES)r    rw   r   r   r   rx   r   ru   r   objectsfilterr   existssettingsr   r   r   rK   r   r   r   r   r\   s         r6   test_wizard_create_atomicz(TestPageWizard.test_wizard_create_atomic  s(     !&&(	$$Y/ 	)&&(G	) 

 ! "
 	(,,Ga,biikl]]*J)K]L 	q1499= T\\00Ke0fmmop		q 	q%	) 	)$	q 	qs   D9A"E9EEc                    t               }| j                         }| j                  |      5  | j                         }ddd       t	        d      }|j                  d       |ddd}t        di |5  t        ddd      }d	}d
dd|d}t        |||d      }	| j                  |	j                                |	j                         }| j                  |      5  |j                  d      }
d| d}d| d}| j                  j                  |
      }| j                  ||d       | j!                  ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)zm
        Tests that the PageWizard respects the
        CMS_PAGE_WIZARD_CONTENT_PLACEHOLDER setting.
        N	TEMPLATESpage_wizard.htmlr  r  zsub-contentr   CMS_PAGE_WIZARD_DEFAULT_TEMPLATE#CMS_PAGE_WIZARD_CONTENT_PLACEHOLDERwizard homer}   z<p>sub-content content.</p>r   r   rZ   r   r   contentr   z<div class="sub-content">z</div>z<div class="content">ra   r   r4   )r    rw   r   r   r!   appendr   r   r   rx   r   r   r   r   r   assertContainsassertNotContains)rK   r   r   r   	templatesr  r   r  r   r\   r   expected
unexpectedr   s                 r6   'test_wizard_content_placeholder_settingz6TestPageWizard.test_wizard_content_placeholder_setting  s   
  !&&(	$$Y/ 	)&&(G	)#K0	 	CD '0B3@
 ** 	N}.@$GD3G! !"	D %   $&D OODMMO,99;D((3 N++D16wivF4WIVD
;;??3/##HhC#H&&x&MN'	N 	N	) 	)BN N'	N 	Ns1   E2A'E$A!E:E$EE!	E$$E-c                    t               }| j                         }| j                  |      5  | j                         }ddd       t	        d      }|j                  d       |ddd}t        di |5  t        ddd      }d	}d
dd|d}t        |||d      }	| j                  |	j                                |	j                         }| j                  |      5  |j                  d      }
| j                  j                  |
      }| j                  ||d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z
        Tests that the PageWizard won't respect a 'bad' setting such as
        targeting a static-placeholder. In this case, will just fail to
        add the content (without error).
        Nr
  r  r  footerr  r  r}   z<p>footer content.</p>r   r   r  r   ra   r  r4   )r    rw   r   r   r!   r  r   r   r   rx   r   r   r   r   r   r  )rK   r   r   r   r  r  r   r  r   r\   r   r   s               r6   +test_wizard_content_placeholder_bad_settingz:TestPageWizard.test_wizard_content_placeholder_bad_setting  sd     !&&(	$$Y/ 	)&&(G	)#K0	 	CD '0B3;	
 ** 	K}.@$GD.G! !"	D %   $&D OODMMO,99;D((3 K++D1;;??3/&&xc&JK'	K 	K	) 	)DK K'	K 	Ks1   D+2A'EAD7E+D47E 	<EEc                    t               }| j                         }| j                  |      5  | j                         }d d d        ddd d}t	        |d |d      }| j                  |j                                y # 1 sw Y   ?xY w)N r   r}   r   )r    rw   r   r   r   ru   r   r  s         r6   "test_create_page_with_empty_fieldsz1TestPageWizard.test_create_page_with_empty_fields  s    !&&(	$$Y/ 	)&&(G	) 

 ! "
 	)	) 	)s   A;;Bc                 :   t               }| j                         }| j                  |      5  | j                         }d d d        ddd d}t	        dddd       t        |d |d      }| j                  |j                                | j                  |j                         j                         j                  d             t        |d |d|      }| j                  |j                                | j                  |j                         j                         j                  d	             d|d
<   t        |d |d|      }| j                  |j                                | j                  |j                         j                         j                  d             t        |d |d|      }| j                  |j                                | j                  |j                         j                         j                  d             y # 1 sw Y   xY w)Nr   r   nav_playground.htmlr}   )r   r   r   zpage-2)r   zpage-3r   zpage-2-2zpage-2-3)r    rw   r   r   r   r   rx   r   r   get_urlsr  r  s         r6   #test_create_page_with_existing_slugz2TestPageWizard.test_create_page_with_existing_slug  s   !&&(	$$Y/ 	)&&(G	) 

 	!		
 ! "
 	(		,,.5585DE ! "
 	(		,,.5585DE  V ! "
 	(		,,.55:5FG ! "
 	(		,,.55:5FGw	) 	)s   HHN)r1   r2   r3   r   r   r   r  r  r  r   r$  r4   r5   r6   r   r   V  s4    FG
D>qB/Nb.K`*(?Hr5   r   c                       e Zd Zd Zy)TestPageWizardSubmissionc                    ddl m} t        ddd      } |       d   j                  }t	        d      }d|d|j
                  d}d	d
ddd}| j                  | j                               5  | j                  j                  ||d      }| j                  |j                  d       | j                  j                  ||      }d d d        t        t        j                  j                  |j
                        j!                         j#                  d      d      }| j%                  t'        j(                  |             y # 1 sw Y   xY w)Nr   )r&   homer"  r}   cms_wizard_create0)wizard_create_view-current_stepz0-entryz
0-languagez0-page1zmy test pagezmy-test-pager  )r+  z1-titlez1-slugz	1-contentT)followra   )pk)r   )cms.wizards.helpersr&   r   r   r#   r.  r   rw   r   postr   r   r   r   r  r<   lastget_content_objr  r   format)	rK   r&   r   entry_idr   
data_step1
data_step2r   edit_endpoints	            r6   test_page_wizard_submissionz4TestPageWizardSubmission.test_page_wizard_submissionX  s,   36#8$?=#&& !45/2gg	

 03%$	

 $$T%7%7%9: 	>{{''*T'JHX1137{{''*=H	>
 ,LL  DGG ,113CCDI
 	H&9&@&@]&ST	> 	>s   *AEE
N)r1   r2   r3   r8  r4   r5   r6   r&  r&  W  s    Ur5   r&  c                       e Zd Zd Zd Zd Zy)TestWizardHelpersc                 |    t         j                  j                          t         j                  j                          y rs   )r   r   r   r   r   s    r6   setUpzTestWizardHelpers.setUpy  s(    
 	//;;=,,88:r5   c                 ^    t         t        t        g}t               }| j	                  ||       y)zd
        The get_entries function returns the registered wizards
        ordered by weight.
        N)r   r   r   r&   assertListEqual)rK   r  entriess      r6   !test_get_entries_orders_by_weightz3TestWizardHelpers.test_get_entries_orders_by_weight  s(     $]4FG-Wh/r5   c                 b    t        t        j                        }| j                  |t               y)za
        The get_entry function returns the wizard when a wizard id is
        supplied.
        N)r'   r   r   r   )rK   entrys     r6   #test_get_entry_returns_wizard_by_idz5TestWizardHelpers.test_get_entry_returns_wizard_by_id  s$    
 -**+.r5   N)r1   r2   r3   r<  r@  rC  r4   r5   r6   r:  r:  w  s    ;0"/r5   r:  c                   T    e Zd Zd Z ej
                  ed ed            d        Zy)TestEntryChoicesc                 \   | j                         }t        ddd      }t        ||      D cg c]  }| }}t        j                  t        j
                  ft        j                  t        j
                  ft        j                  t        j
                  fg}| j                  ||       yc c}w )zR
        The entry_choices function returns the wizards ordered by weight
        r(  r"  r}   N)	rw   r   r*   r   r   rZ   r   r   r>  rK   ry   r   optionwizard_choicesr  s         r6   (test_generates_choices_in_weighted_orderz9TestEntryChoices.test_generates_choices_in_weighted_order  s     !!#6#8$?/<T4/HIV&II!6!67}223""$6$<$<=

 	^X6 Js   	B)rv   F)return_valuec                    | j                         }t        ddd      }t        ||      D cg c]  }| }}t        j                  t        j
                  ft        j                  t        j
                  fg}| j                  ||       yc c}w )zo
        The entry_choices function only returns the wizards that the
        user has permissions for
        r(  r"  r}   N)rw   r   r*   r   r   rZ   r   r>  rG  s         r6   :test_doesnt_generate_choice_if_user_doesnt_have_permissionzKTestEntryChoices.test_doesnt_generate_choice_if_user_doesnt_have_permission  s     !!#6#8$?/<T4/HIV&II }223""$6$<$<=

 	^X6 Js   	B
N)	r1   r2   r3   rJ  r   r   r   r   rM  r4   r5   r6   rE  rE    s4    7 U\\2% 7	7r5   rE  N)Qunittest.mockr   r   djangor   r   r   django.apps.registryr   django.core.exceptionsr	   django.forms.modelsr
   django.templater   django.test.utilsr   django.urlsr   django.utils.encodingr   django.utils.translationr   rh   r   r   cms.apir   cms.cms_wizardsr   r   cms.constantsr   r   cms.forms.wizardsr   r   
cms.modelsr   r   0cms.test_utils.project.backwards_wizards.wizardsr   ,cms.test_utils.project.sampleapp.cms_wizardsr   cms.test_utils.testcasesr   r   cms.toolbar.utilsr   r   	cms.utilsr    cms.utils.confr!   cms.utils.setupr"   cms.utils.urlutilsr#   cms.wizards.formsr$   r%   r/  r&   r'   cms.wizards.wizard_baser(   cms.wizards.wizard_poolr)   r*   r+   Formr/   r8   r@   rD   rq   r   r   r&  r:  rE  r4   r5   r6   <module>ri     s    %   % 7 ) / /  + 1    ? I E ) C F H ' * * , E 6 *  '!& 
 *!) 	 	i 9 
5
 5
p[8_&< [8|{N_k {N|~H_k ~HBU{ U@!/ !/H!7{ !7r5   