
    W'FgT                         S SK r S SKrS SKrS SKJr  SSKJr  SSKJr  S r	 " S S5      r
 " S	 S
\5      r\" 5       r " S S5      r " S S\5      r " S S\5      r " S S\5      rg)    N)	Libosinfo   )xmlutil)logc                     [        [        R                  S5      (       d   [        R                  R                  U S 5      $ [        R                  R	                  U S S5      $ )Ncreate_from_location_with_flagsr   )hasattrr   Mediacreate_from_locationr   )locations    */usr/share/virt-manager/virtinst/osdict.py_media_create_from_locationr      sK    9??$EFF33$  	  ??::8T1MM    c                   *    \ rS rSrSrS rS rS rSrg)_OsinfoIter   zL
Helper to turn osinfo style get_length/get_nth lists into python
iterables
c                     SU l         Xl        SU l        U R                  (       a#  U R                  R                  5       S-
  U l        g g )Nr   r   )currentlistobjhigh
get_length)selfr   s     r   __init___OsinfoIter.__init__#   s:    	<<//1A5DI r   c                     U $ N r   s    r   __iter___OsinfoIter.__iter__*   s    r   c                     U R                   U R                  :  a  [        eU R                  R	                  U R                   5      nU =R                   S-  sl         U$ )Nr   )r   r   StopIterationr   get_nth)r   rets     r   __next___OsinfoIter.__next__,   sC    <<$))#ll""4<<0
r   )r   r   r   N)	__name__
__module____qualname____firstlineno____doc__r   r    r&   __static_attributes__r   r   r   r   r      s    6r   r   c                   x    \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	SS jr
SS jrS	 rS
 rSS jrSrg)_OSDB4   z 
Entry point for the public API
c                      S U l         S U l        g r   )_OSDB__os_loader_OSDB__os_genericr   s    r   r   _OSDB.__init__8   s     r   c                     U R                   (       dR  [        R                  " 5       nUR                  SS5        UR                  S[	        S5      5        [        U5      U l         U R                   $ )Nzshort-idgenericnamez0Generic or unknown OS. Usage is not recommended.)r3   r   Os	set_param_
_OsVariantr   os     r   _os_generic_OSDB._os_generic@   sT      AKK
I.KKHIK *1D   r   c                     U R                   (       d+  [        R                  " 5       nUR                  5         Xl         U R                   $ r   )r2   r   Loaderprocess_default_path)r   loaders     r   
_os_loader_OSDB._os_loaderK   s7    %%'F'')%r   c                 6    U R                   R                  5       $ r   )rD   get_dbr   s    r   _os_db_OSDB._os_dbT   s    %%''r   c                     U R                   R                  U5      nUc  U(       a  [        [        S5      U-  5      eg [	        U5      $ )NzUnknown libosinfo ID '%s')rH   get_os
ValueErrorr:   r;   )r   full_idraise_errorosobjs       r   lookup_os_by_full_id_OSDB.lookup_os_by_full_id\   sB    ""7+= #>!?'!IJJ%  r   c                    XR                   R                  :X  a  U R                   $ [        R                  " 5       nUR	                  [        R
                  U5        U R                  R                  5       R                  U5      R                  5       n[        U5      S:X  a  U(       a  [        [        S5      U-  5      eg [        US   5      $ )Nr   z;Unknown OS name '%s'. See `--osinfo list` for valid values.)r>   r7   r   Filteradd_constraintPRODUCT_PROP_SHORT_IDrH   get_os_listnew_filteredget_elementslenrL   r:   r;   )r   keyrN   fltoslists        r   	lookup_os_OSDB.lookup_osd   s    ""'''### 9::	 ((*77<IIKv;!  $K "LNQ"R S S&)$$r   c                     [        U5      nU R
                  R                  U5      (       d  g UR                  5       R                  5       [        U5      4$ ! [         a*  n[        R                  " S[	        U5      5         S nAg S nAff = f)Nz)Error creating libosinfo media object: %s)
r   	Exceptionr   debugstrrH   identify_mediarK   get_short_id_OsMedia)r   r   mediaes       r   guess_os_by_iso_OSDB.guess_os_by_isos   sq    	/9E
 {{))%00||~**,huo==  	IIA3q6J	s   A 
B! BBc                    UR                  S5      (       a  SU-   n[        R                  " 5       (       a  UR                  S5      (       d  g  [        R                  R                  US 5      n[        U R                  S5      (       aJ  U R                  R                  U5      (       d  g UR                  5       R                  5       [        U5      4$ U R                  R!                  U5      u  pEU(       d  g UR                  5       [        U5      4$ ! [         a+  n[        R                  " SU[        U5      5         S nAg S nAff = f)N/zfile://zfile:z9Error creating libosinfo tree object for location=%s : %sidentify_tree)
startswithr   in_testsuiter   Treer   r`   r   ra   rb   r	   rH   rl   rK   rd   _OsTreeguess_os_from_tree)r   r   treerg   rO   treeobjs         r   guess_os_by_tree_OSDB.guess_os_by_tree~   s	   s## 8+H!!(*=*=g*F*F 	>>66xFD 4;;00;;,,T22;;=--/>>![[;;DANE%%')999  	II #$,c!f6	s    D 
E!EEc                    ^^ U R                   R                  5       R                  5        Vs/ s H  n[        U5      PM     nnUR	                  U R
                  5        S mUU4S jn[        [        X4S95      $ s  snf )zE
List all OSes in the DB, sorting by the passes _OsVariant attribute
c                 h    U R                  5       (       a  [        U 5      S-  $ U R                  5       $ )Nr   )isdigitintlower)texts    r   to_int_OSDB.list_os.<locals>.to_int   s%    '+||~~CING4::<Gr   c                    > [        U T5      n[        R                  " SU5       Vs/ s H  nT" U5      PM     sn$ s  snf )Nz([0-9]+))getattrresplit)objvalcsortkeyr|   s      r   alphanum_key#_OSDB.list_os.<locals>.alphanum_key   s8    #w'C')xx
C'@A'@!F1I'@AAAs   <)rZ   )rH   rV   rX   r;   appendr>   listsorted)r   r   osentr\   r   r|   s    `   @r   list_os_OSDB.list_os   su    
 ++))+88:<: ).*U#: 	 <d&&'	H	B F6455<s   A;)__os_generic__os_loaderN)Fr7   )r(   r)   r*   r+   r,   r   propertyr>   rD   rH   rP   r]   rh   rt   r   r-   r   r   r   r/   r/   4   sa    ! ! !     ( (!%	>:66r   r/   c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)_OsResources   c                 \    U R                  U5      U l        U R                  U5      U l        g r   )_convert_to_dict_minimum_recommendedr   minimumrecommendeds      r   r   _OsResources.__init__   s'    --g6 11+>r   c                     0 n[        U5       HP  n0 nUR                  5       US'   UR                  5       US'   UR                  5       US'   XBUR	                  5       '   MR     U$ )zf
Convert an OsResources object to a dictionary for easier
lookups. Layout is: {arch: {strkey: value}}
ramn-cpusstorage)r   get_ram
get_n_cpusget_storageget_architecture)r   	resourcesr%   rvalss        r   r   _OsResources._convert_to_dict   sb    
 Y'AD))+DK\\^DNmmoDO(,""$% ( 
r   c                 r    US4 H/  nUR                  U0 5      R                  US5      nUS:w  d  M-  Us  $    g )Nallr   )get)r   r   rZ   arch	checkarchr   s         r   _get_key_OsResources._get_key   s9    I--	2.223;Cby
 'r   c                 \    U R                  U R                  X5      nU(       a	  US:  a  U$ g g )Nr   )r   r   r   rZ   r   r   s       r   _get_minimum_key_OsResources._get_minimum_key   s+    mmDMM3537J 3r   c                     U R                  U R                  X5      nU(       a  US:  a  U$ U R                  X5      nU(       a  [        R                  " SX5        US-  $ g )Nr   z=No recommended value found for key='%s', using minimum=%s * 2   )r   r   r   r   ra   r   s       r   _get_recommended_key!_OsResources._get_recommended_key   s[    mmD--s937J ##C.II +,/67Nr   c                 &    U R                  SU5      $ Nr   )r   r   r   s     r   get_minimum_ram_OsResources.get_minimum_ram   s    $$UD11r   c                 &    U R                  SU5      $ r   r   r   s     r   get_recommended_ram _OsResources.get_recommended_ram   s    ((55r   c                 &    U R                  SU5      $ )Nr   r   r   s     r   get_recommended_ncpus"_OsResources.get_recommended_ncpus   s    ((488r   c                 &    U R                  SU5      $ )Nr   r   r   s     r   get_recommended_storage$_OsResources.get_recommended_storage   s    ((D99r   )r   r   N)r(   r)   r*   r+   r   r   r   r   r   r   r   r   r   r-   r   r   r   r   r      s/    ?
269:r   r   c                   4   \ rS rSrS rS r  S*S jrS rS+S jrS r	S	 r
S
 rS rS rS rS rS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS,S jrS rS rS rS rS rS r S  r!S,S! jr"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S)r*g)-r;      c                    Xl         U R                   R                  5       /U l        [        U R                   S5      (       a  U R                   R	                  5       U l        U R                  S   U l        [        [        [        U R                  5      5      5      U l	        U R                   R                  5       U l        U R                   R                  5       U l        U R                   R                  5       U l        U R                   R!                  5       =(       d    SU l        U R                   R%                  5       =(       d    SU l        U R                   R)                  5       U l        U R-                  5       U l        g )Nget_short_id_listr    )_osrd   
_short_idsr	   r   r7   r   r   set	all_names
get_family_familyget_idrM   get_namelabelget_codenamecodename
get_distrodistroget_versionversion_get_eoleolr<   s     r   r   _OsVariant.__init__   s    880023488011"hh88:DOOOA&	fS%9:;xx**,xx(XX&&(
--/52hh))+1rxx++-==?r   c                 T    SU R                   R                  < SU R                  < S3$ )N<z name=>)	__class__r(   r7   r   s    r   __repr___OsVariant.__repr__  s    !%!8!8$))DDr   Nc           	      n  ^ U=(       d    U R                   nUR                  5       U;   a  g/ mU4S jnU(       a=  U" UR                  [        R                  R
                  5      R                  5       5        U(       a=  U" UR                  [        R                  R                  5      R                  5       5        U(       a=  U" UR                  [        R                  R                  5      R                  5       5        T H0  nUR                  5       U;   d  U R                  XUUUS9(       d  M0    g   g)NTc                 J   > U  H  nUT;  d  M  TR                  U5        M     g r   )r   )newlr   
check_lists     r   _extend*_OsVariant._is_related_to.<locals>._extend  s#    j(%%c* r   )rO   check_upgradescheck_derivescheck_clonesF)
r   rd   get_relatedr   ProductRelationshipDERIVES_FROMrX   CLONESUPGRADES_is_related_to)	r   related_os_listrO   r   r   r   r   checkobjr   s	           @r   r   _OsVariant._is_related_to	  s   !?2
	+
 E%%--::<<HLNLE%%--4466BlnFE%%--6688DH #H%%'?:##O#1"/!- $ / /  # r   c                 Z    [        [        U R                  R                  5       5      5      $ r   )r   r   r   get_all_devicesr   s    r   _get_all_devices_OsVariant._get_all_devices)  s    K 8 8 :;<<r   c                    / nU=(       d    / nU R                  5        Hq  nU(       a  UR                  5       U;  a  M   U(       a+  [        R                  " X%R	                  5       5      (       d  MR  UR                  UR                  5       5        Ms     U=(       d    / nU H8  nUR                  5       U;  a  M  UR                  UR                  5       5        M:     U$ r   )r   r   r   match	get_classr   r   )r   devidscls
extra_devsr%   devs         r   _device_filter_OsVariant._device_filter,  s    2((*C#**,f4288C99JJs||~& +  %2
Czz|6)JJs||~& 
 
r   c                    U R                   R                  5       nU R                   R                  5       nU R                   R                  [        R
                  5      =(       d    S nS n[        R                  R                  5       nUb
  XT" U5      :  $ US:X  a  gUb!  U" U5      [        R                  " SS9-   nXV:  $ g)Nc                     U R                  5       < SU R                  5       < 3n[        R                  R                  US5      $ )N-z%Y-%j)get_yearget_day_of_yeardatetimestrptime)glibdatedates     r   _glib_to_datetime._OsVariant._get_eol.<locals>._glib_to_datetimeL  s7    &//183K3K3MND$$--dG<<r   rollingFiB  )days)	r   get_eol_dateget_release_dateget_param_valuer   OS_PROP_RELEASE_STATUSr  today	timedelta)r   r   relrelease_statusr  nowrel5s          r   r   _OsVariant._get_eolC  s    hh##%hh'') 11002 :59 		= %%'?*3/// Y& ?$S)H,>,>H,MMD:r   c                     U R                   $ r   )r   r   s    r   
get_handle_OsVariant.get_handlec  s    xxr   c                      U R                   S:H  $ )Nr6   r   r   s    r   
is_generic_OsVariant.is_genericf  s    yyI%%r   c                 D    [         R                  " SU R                  5      $ )Nzlinux\d\d\d\d)r   r   r7   r   s    r   is_linux_generic_OsVariant.is_linux_generici  s    xx($))44r   c                      U R                   S;   $ )N)win9xwinntwin16)r   r   s    r   
is_windows_OsVariant.is_windowsl  s    ||:::r   c                 P    U R                  5       (       d  U R                  S;   a  gg)N)solaris	localtimeutc)r(  r   r   s    r   	get_clock_OsVariant.get_clocko  s     ?? ;r   c                      U R                  SS9$ )Nnet)r   )r  r   s    r   supported_netmodels_OsVariant.supported_netmodelst  s    ""u"--r   c                 :    SS/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1001zhttp://pcisig.com/pci/1af4/1042r   r   boolr  r   r   r   s      r   supports_virtiodisk_OsVariant.supports_virtiodiskw  (    335D''v'MNNr   c                 :    SS/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1004zhttp://pcisig.com/pci/1af4/1048r5  r6  r8  s      r   supports_virtioscsi_OsVariant.supports_virtioscsi}  r;  r   c                 :    SS/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1000http://pcisig.com/pci/1af4/1041r5  r6  r8  s      r   supports_virtionet_OsVariant.supports_virtionet  r;  r   c                 :    SS/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1005zhttp://pcisig.com/pci/1af4/1044r5  r6  r8  s      r   supports_virtiorng_OsVariant.supports_virtiorng  r;  r   c                 8    S/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1050r5  r6  r8  s      r   supports_virtiogpu_OsVariant.supports_virtiogpu  #    34D''v'MNNr   c                 :    SS/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1002zhttp://pcisig.com/pci/1af4/1045r5  r6  r8  s      r   supports_virtioballoon!_OsVariant.supports_virtioballoon  r;  r   c                 V    SS/nU R                  X!S9(       a  gU R                  S5      $ )Nzhttp://pcisig.com/pci/1af4/1003zhttp://pcisig.com/pci/1af4/1043r5  Tzrhel6.0)r  r   r8  s      r   supports_virtioserial _OsVariant.supports_virtioserial  s6    335fD ""9--r   c                 8    S/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1af4/1052r5  r6  r8  s      r   supports_virtioinput_OsVariant.supports_virtioinput  rI  r   c                 8    S/n[        U R                  X!S95      $ )Nzhttp://pcisig.com/pci/1b36/0004r5  r6  r8  s      r   supports_usb3_OsVariant.supports_usb3  rI  r   c                 8    S/n[        U R                  X!S95      $ )Nr@  r5  r6  r8  s      r   supports_virtio1_OsVariant.supports_virtio1  rI  r   c                     U R                  US9(       a  U R                  US9(       d  gS/n[        U R                  X!S95      $ )N)r   Fzhttp://qemu.org/chipset/x86/q35r5  )rA  rW  r7  r  r8  s      r   supports_chipset_q35_OsVariant.supports_chipset_q35  sH    ##z#:%%%<34D''v'MNNr   c                     [        U R                  S5      (       a(  U R                  R                  5       R                  5       $ / $ )Nget_complete_firmware_list)r	   r   r]  rX   r   s    r   _get_firmware_list_OsVariant._get_firmware_list  s5    4889::88668EEGG	r   c                     U R                  5       nU H?  nUR                  5       U:w  a  M  UR                  5       U:X  d  M/  UR                  5       s  $    U$ r   )r^  r   get_firmware_typeis_supported)r   r7   r   default	firmwaresfirmwares         r   _supports_firmware_type"_OsVariant._supports_firmware_type  sU    ++-	!H((*d2))+t3,,..	 " r   c                     Sn U R                  SUS5      nU R                  SUS5      nU=(       a    U(       + nU$ ! [         a    [        R                  " SSS9   U$ f = f)NFefibiosTz&Error checking osinfo firmware support)exc_info)rf  r`   r   ra   )r   r   r%   supports_efisupports_bioss        r   requires_firmware_efi _OsVariant.requires_firmware_efi  sp    	O77tUKL 88tLM4}#4C 
  	OII>N
	Os   6< AAc                     U R                   R                  5       nU R                   R                  5       n[        X5      $ r   )r   get_minimum_resourcesget_recommended_resourcesr   r   s      r   rr  $_OsVariant.get_recommended_resources  s1    ((002hh88:G11r   c                    [        U R                  S5      (       an  U R                  R                  5       n[        U5       HD  nUR	                  5       nXAR
                  R                  :X  d  US:X  d  M4  UR                  5       s  $    g g )Nget_network_install_resourcesr   )r	   r   ru  r   r   osr   r   )r   guestr   r   r   s        r    get_network_install_required_ram+_OsVariant.get_network_install_required_ram  sh    488<==>>@I +))+88==(DEM99;& , >r   c                     [        U R                  S5      (       a  U R                  R                  5       nUb  U$ U R                  S;   a  gU R                  S;  a  gg)z{
Kernel argument name the distro's installer uses to reference
a network source, possibly bypassing some installer prompts
get_kernel_url_argumentN)caaspslesledslesopensuseinstall)centosrhelfedoraz	inst.repo)r	   r   r{  r   )r   osargs     r   get_kernel_url_arg_OsVariant.get_kernel_url_arg  sZ     488677HH446E  ;;FF;;:: r   c                    [        [        R                  S5      (       d0  U H)  nUR                  5       U:X  d  M  UR	                  5       s  $    g S nUS:X  a  SnOUS:X  a  SnO	U(       d  SnU Hd  nUR                  5       U:w  a  M  UR                  5       nUn[        U5       H*  nX7R                  5       ;   d  M  UR	                  5       s  s  $    Mf     U(       a  UR	                  5       $ g )Nget_os_variantsjeosServerdesktopWorkstation
Everything)r	   r   ro   r   get_urlr  r   r   )r   treelistr   profilerr   fallback_treevariant_listvariants           r   _get_generic_location _OsVariant._get_generic_location  s    y~~'899 ((*d2<<>) ! fG	!#G"GD$$&$.//1L M&|4..00<<>) 5   ((**r   c                 (   [        [        U R                  R                  5       5      5      nU(       d!  [	        [        S5      U R                  -  5      eU R                  X1U5      nU(       a  U$ [	        [        S5      U R                  US.-  5      e)Nz$OS '%s' does not have a URL locationzPOS '%(osname)s' does not have a URL location for the architecture '%(archname)s')osnamearchname)r   r   r   get_tree_listRuntimeErrorr:   r7   r  )r   r   r  r  r   s        r   get_location_OsVariant.get_location  s    DHH$:$:$<=>89DIIEG G --hgFO 4 5yyd345 	5r   c                 Z    [        [        U R                  R                  5       5      5      $ r   )r   r   r   get_install_script_listr   s    r   r  "_OsVariant.get_install_script_list)  s    K @ @ BCDDr   c                     / n[        [        U R                  R                  5       5      5      nU H0  nUS:w  a  UR	                  5       U:w  a  M  UR                  U5        M2     U$ )Nr   )r   r   r   get_device_driversr   r   )r   r   installable_driversdevice_driversdevice_drivers        r   _get_installable_drivers#_OsVariant._get_installable_drivers,  s^     k$((*E*E*GHI+Mu}!?!?!AT!I&&}5	 ,
 #"r   c                     U R                  U5      n/ nU H+  nUR                  5       (       d  M  UR                  U5        M-     U$ r   )r  get_pre_installabler   )r   r   r  pre_inst_driversdrivers        r   _get_pre_installable_drivers'_OsVariant._get_pre_installable_drivers6  sH    ";;DA)F))++ ''/ *  r   c                     / nU H[  nUR                  5       nU HB  n[        R                  R                  UR	                  5       U5      nUR                  U5        MD     M]     U$ r   )	get_filesrv  pathjoinr  r   )r   drivers	locationsr  	filenamesfilenamer   s          r   _get_drivers_location _OsVariant._get_drivers_location>  s\    	F((*I%77<<(;(;(=xH  * & 
 r   c                 F    U R                  U5      nU R                  U5      $ r   )r  r  )r   r   r  s      r   $get_pre_installable_drivers_location/_OsVariant.get_pre_installable_drivers_locationG  s%    <<TB))*:;;r   c                     U R                  U5      n/ nU H(  nU[        [        UR                  5       5      5      -  nM*     U$ r   )r  r   r   get_devices)r   r   r  devicesr  s        r   get_pre_installable_devices&_OsVariant.get_pre_installable_devicesL  sC    33D9FtK(:(:(<=>>G r   c                 2    U R                  U5      (       a  gg)NTF)r  r   s     r   supports_unattended_drivers&_OsVariant.supports_unattended_driversS  s    ,,T22r   )r   r   r   r   r   r   r   rM   r   r7   r   )NTTT)NNNr   )+r(   r)   r*   r+   r   r   r   r   r  r   r  r  r"  r(  r.  r2  r9  r=  rA  rD  rG  rK  rN  rQ  rT  rW  rZ  r^  rf  rn  rr  rx  r  r  r  r  r  r  r  r  r  r  r-   r   r   r   r;   r;      s    #$E 59BF@=.@&5;
.OOOOO
O.O
O
O
O
		2
'*:5*E# <
r   r;   c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)re   iY  c                     Xl         g r   _media)r   osinfo_medias     r   r   _OsMedia.__init__Z  s    "r   c                 6    U R                   R                  5       $ r   )r  get_kernel_pathr   s    r   r  _OsMedia.get_kernel_path]      {{**,,r   c                 6    U R                   R                  5       $ r   )r  get_initrd_pathr   s    r   r  _OsMedia.get_initrd_path_  r  r   c                 6    U R                   R                  5       $ r   )r  supports_installer_scriptr   s    r   r  "_OsMedia.supports_installer_scripta  s    {{4466r   c                     [        [        U R                  R                  5       5      5      nU H  nSUR	                  5       ;   d  M    g   g)NnetinstTF)r   r   r  r  r   )r   variantsr  s      r   
is_netinst_OsMedia.is_netinstd  s?    DKK$?$?$ABCGGNN,,   r   c                 Z    [        [        U R                  R                  5       5      5      $ r   )r   r   r  r  r   s    r   r   _OsMedia.get_install_script_listk  s    K C C EFGGr   c                     U R                   $ r   r  r   s    r   get_osinfo_media_OsMedia.get_osinfo_median  s    {{r   r  N)r(   r)   r*   r+   r   r  r  r  r  r  r  r-   r   r   r   re   re   Y  s&    #--7Hr   re   c                        \ rS rSrS rS rSrg)rp   ir  c                     Xl         g r   _tree)r   osinfo_trees     r   r   _OsTree.__init__s  s     
r   c                     U R                   $ r   r  r   s    r   get_osinfo_tree_OsTree.get_osinfo_treev  s    zzr   r  N)r(   r)   r*   r+   r   r  r-   r   r   r   rp   rp   r  s    !r   rp   )r  rv  r   gi.repositoryr   r   r   loggerr   r   r   objectr/   OSDBr   r;   re   rp   r   r   r   <module>r     ss     	 	 #  N ,s6F s6l w6: 6:zh hVv 2f r   