+
    }i#>                       a  R9 tI0 t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
Ht ^ RIHtHt ^ RIHt ^ RIHtHtHtHtHtHtHt ^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ R	I H t  ^ R
I!H"t" ^ RI#H$t$H%t% ^RI&H't' ^RI(H)t)H*t*H+t+H,t,H-t- ]]]P\                  ]3,          t/] ^ k RRRRRRRRRRRRRRRRRRRR/
t0] ^k RRRRRR/t1] ^k ]P                  ]19  d   ],! R]P                   R24      h]1]P                  ,          t2] ^k ]! ]! R 4      4      t3] ^k ]! ]Ph                  Pk                  ]64      4      Pn                  t8] ^k RRR.RRR.R. R:O/t9] ^k RR!RR"RR#/t:R$ t;]]	 ! R% R&4      4       4       t<]<P{                  4       w  t>t? ! R' R(4      t@ ! R) R*]@4      tAR+ R, ltBR;R- R. lltCR/ R0 ltDR1 R2 ltER<R3 R4 lltFR=R5 R6 lltGR7 R8 ltHR# )>    N)	dataclass)total_ordering)BufferedWriterBytesIO)Path)AnyDictListLiteralOptionalTupleUnion)ZipFile)user_cache_dir)tqdm)	TypeAlias)CLoaderload)CONSTRAINTS)CamoufoxNotInstalledMissingReleaseUnsupportedArchitectureUnsupportedOSUnsupportedVersionamd64x86_64x86i686i386arm64aarch64armv5larmv6larmv7ldarwinmaclinuxlinwin32winzOS  is not supportedcamoufoxzcamoufox.exez../MacOS/camoufoxzcamoufox-binc                  :    \         P                  ! V / VBR R/B  R# )boldTN)clicksecho)aks   *,a/Users/ahmad/.openclaw/workspace/my-crawler/.venv/lib/python3.14/site-packages/camoufox/pkgman.pyrprintr4   H   s    	KK#a#d#    c                      a  ] tR t^Lt o RtRtV 3R lR lt]V 3R lR l4       tV 3R lR lt	V 3R	 lR
 lt
V 3R lR lt]RV 3R lR ll4       t]V 3R lR l4       t]V 3R lR l4       tV 3R ltRtV tR# )Versionz`
A version string that can be compared to other version strings.
Stores versions up to 5 parts.
Nc                   < V ^8  d   QhRR/#    returnN )format__classdict__s   "r3   __annotate__Version.__annotate__W   s     
 
t 
r5   c           
         \        . R  V P                  P                  R4       4       OR \        ^V P                  P	                  R4      ,
          4       4       O4      V n        R# )c              3      "   T F>  qP                  4       '       d   \        V4      M\        V^ ,          4      R,
          x  K@  	  R# 5i)r   i   N)isdigitintord).0xs   & r3   	<genexpr>(Version.__post_init__.<locals>.<genexpr>[   s0     _G^!IIKK#a&S1Y-==G^s   AA.c              3   &   "   T F  p^ x  K	  	  R# 5i)r   Nr<   )rF   _s   & r3   rH   rI   \   s     @?!?s   N)tuplereleasesplitrangecount
sorted_relselfs   &r3   __post_init__Version.__post_init__W   sV    _t||GYGYZ]G^_@U1t||'9'9#'>#>?@
r5   c                    < V ^8  d   QhRS[ /# r:   r;   str)r=   r>   s   "r3   r?   r@   a   s     0 0S 0r5   c                8    V P                    R V P                   2# )-)versionrN   rS   s   &r3   full_stringVersion.full_string`   s    ,,q//r5   c                    < V ^8  d   QhRS[ /# rX   bool)r=   r>   s   "r3   r?   r@   d   s     3 3t 3r5   c                4    V P                   VP                   8H  # NrR   rT   others   &&r3   __eq__Version.__eq__d   s    %"2"222r5   c                    < V ^8  d   QhRS[ /# rX   ra   )r=   r>   s   "r3   r?   r@   g   s     2 2t 2r5   c                4    V P                   VP                   8  # rd   re   rf   s   &&r3   __lt__Version.__lt__g   s    !1!111r5   c                    < V ^8  d   QhRS[ /# rX   ra   )r=   r>   s   "r3   r?   r@   j   s     1 1d 1r5   c                >    \         T u;8*  ;'       d
    \        8  # u # rd   )VERSION_MINVERSION_MAXrS   s   &r3   is_supportedVersion.is_supportedj   s    d00[0000r5   c                4   < V ^8  d   QhRS[ S[,          RR/# )r:   pathr;   r7   )r   r   )r=   r>   s   "r3   r?   r@   n   s     + + +) +r5   c                \   T ;'       g    \         R,          p\        P                  P                  V4      '       g   \	        RV R24      h\        VR4      ;_uu_ 4       p\        P                  ! VP                  4       4      p\        R/ VB uuRRR4       #   + '       g   i     R# ; i)z&
Get the version from the given path.
version.jsonz!Version information not found at ). Please run `camoufox fetch` to install.rbNr<   )
INSTALL_DIRosru   existsFileNotFoundErroropenorjsonloadsreadr7   )ru   version_pathfversion_datas   &   r3   	from_pathVersion.from_pathm   s    
 ++~=ww~~l++#3L> B: :  ,%%!<<1L*\* &%%%s    /BB+	c                &   < V ^8  d   QhRS[ RS[/# )r:   ru   r;   )r   rb   )r=   r>   s   "r3   r?   r@   }   s     6 6 6 6r5   c                :    \         P                  V 4      \        8  # )z6
Check if the version at the given path is supported.
)r7   r   rp   )ru   s   &r3   is_supported_pathVersion.is_supported_path|   s    
   &+55r5   c                .   < V ^8  d   QhRS[ R,          /# )r:   r;   )r7   r7   )r   )r=   r>   s   "r3   r?   r@      s     b b% 45 br5   c                 j    \        \        P                  R 7      \        \        P                  R 7      3# ))rN   )r7   r   MIN_VERSIONMAX_VERSIONr<   r5   r3   build_minmaxVersion.build_minmax   s#    {667I`I`9aaar5   c                B   < V ^8  d   Qh/ S[ ;R&   S[S[ ,          ;R&   # )r:   rN   r]   )rZ   r   )r=   r>   s   "r3   r?   r@   L   s"      L  c]! r5   re   rd   )__name__
__module____qualname____firstlineno____doc__r]   rU   propertyr^   rh   rl   rr   staticmethodr   r   r   __annotate_func____static_attributes____classdictcell__r>   s   @r3   r7   r7   L   s      "G
 
 0 03 32 21 1 + + + 6 6 b bq  r5   r7   c                   l   a  ] tR t^t o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltR
t	V t
R# )GitHubDownloaderz2
Manages fetching and installing GitHub releases.
c                $   < V ^8  d   QhRS[ RR/# )r:   github_repor;   NrY   )r=   r>   s   "r3   r?   GitHubDownloader.__annotate__   s     N NC ND Nr5   c                (    Wn         R V R2V n        R# )zhttps://api.github.com/repos/z	/releasesN)r   api_url)rT   r   s   &&r3   __init__GitHubDownloader.__init__   s    &6{m9Mr5   c                &   < V ^8  d   QhRS[ RS[/# r:   assetr;   )r	   r   )r=   r>   s   "r3   r?   r      s     
1 
1 
1# 
1r5   c                $    VP                  R4      # )z
Compare the asset to determine if it's the desired asset.

Args:
    asset: Asset information from GitHub API

Returns:
    Any: Data to be returned if this is the desired asset, or None/False if not
browser_download_url)get)rT   r   s   &&r3   check_assetGitHubDownloader.check_asset   s     yy/00r5   c                   < V ^8  d   QhRR/# r9   r<   )r=   r>   s   "r3   r?   r      s     W WT Wr5   c                4    \        RV P                   R24      h):
Raise a MissingRelease exception if no release is found.
z"Could not find a release asset in rJ   )r   r   rS   s   &r3   missing_asset_error$GitHubDownloader.missing_asset_error   s!     A$BRBRASSTUVVr5   c                    < V ^8  d   QhRS[ /# rX   )r   )r=   r>   s   "r3   r?   r      s     # #3 #r5   c                   \         P                  ! V P                  ^R7      pVP                  4        VP	                  4       pV F2  pVR,           F"  pV P                  V4      ;p'       g   K  Vu u # 	  K4  	  V P                  4        R# )zr
Fetch the latest release from the GitHub API.
Gets the first asset that returns a truthy value from check_asset.
)timeoutassetsN)requestsr   r   raise_for_statusjsonr   r   )rT   respreleasesrN   r   datas   &     r3   	get_assetGitHubDownloader.get_asset   sw    
 ||DLL"599;G **++E22422K +  
 	  "r5   )r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   s   @r3   r   r      s6     N N
1 
1W W# #r5   r   c                   r  a a ] tR t^t oRtV3R lV 3R lltV3R lR ltV3R lR lt]V3R lR	 l4       t	V3R
 lR lt
]V3R lR l4       tV3R lR lt]V3R lR l4       tV3R lR ltV3R lR lt]V3R lR l4       t]V3R lR l4       t]V3R lR l4       t]V3R lR l4       tRtVtV ;t# )CamoufoxFetcherzA
Handles fetching and installing the latest version of Camoufox.
c                   < V ^8  d   QhRR/# r9   r<   )r=   r>   s   "r3   r?   CamoufoxFetcher.__annotate__   s     	 	$ 	r5   c                   < \         SV `  R 4       V P                  4       V n        RV n        \
        P                  ! R\         RV P                   R24      V n        V P                  4        R# )zdaijro/camoufoxNz)camoufox-(?P<version>.+)-(?P<release>.+)-z\.z\.zip)
superr   get_platform_archarch_version_objrecompileOS_NAMEpatternfetch_latest)rT   	__class__s   &r3   r   CamoufoxFetcher.__init__   s]    *+**,	/3#%::8	DII;eT$
 	r5   c                L   < V ^8  d   QhRS[ RS[S[S[S[3,          ,          /# r   )r	   r   r   r7   rZ   )r=   r>   s   "r3   r?   r      s)     6 6 6(5#3F*G 6r5   c                    V P                   P                  VR,          4      pV'       g   R# \        VR,          VR,          R7      pVP                  4       '       g   R# W1R,          3# )z
Finds the latest release from a GitHub releases API response that
supports the Camoufox version constraints, the OS, and architecture.

Returns:
    Optional[Tuple[Version, str]]: The version and URL of a release
nameNrN   r]   )rN   r]   r   )r   matchr7   rr   )rT   r   r   r]   s   &&  r3   r   CamoufoxFetcher.check_asset   s]     ""5=1 %	"2E)<LM##%% 4555r5   c                   < V ^8  d   QhRR/# r9   r<   )r=   r>   s   "r3   r?   r      s     
 
T 
r5   c           	     n    \        R\         RV P                   R\        P                  ! 4        R24      h)r   zNo matching release found for  z in the supported range: (z$). Please update the Python library.)r   r   r   r   as_rangerS   s   &r3   r   #CamoufoxFetcher.missing_asset_error   sA     ,WIQtyyk B!!,!5!5!7 8 900
 	
r5   c                    < V ^8  d   QhRS[ /# rX   rY   )r=   r>   s   "r3   r?   r      s      s r5   c                     \         P                  ! 4       P                  4       p V \        9  d   \	        RV  R24      h\        V ,          pV\
        \        ,          9  d   \	        RV R\         24      hV# )z
Get the current platform and architecture information.

Returns:
    str: The architecture of the current platform

Raises:
    UnsupportedArchitecture: If the current architecture is not supported
zArchitecture r+   z is not supported for )platformmachinelowerARCH_MAPr   OS_ARCH_MATRIXr   )	plat_archr   s     r3   r   !CamoufoxFetcher.get_platform_arch   sq     $$&,,.	H$)M)DU*VWW	" ~g..)M$?UV]U^*_``r5   c                   < V ^8  d   QhRR/# r9   r<   )r=   r>   s   "r3   r?   r     s     4 4d 4r5   c                D    V P                  4       pVw  V n        V n        R# )a  
Fetch the URL of the latest camoufox release for the current platform.
Sets the version, release, and url properties.

Raises:
    requests.RequestException: If there's an error fetching release data
    ValueError: If no matching release is found for the current platform
N)r   r   _url)rT   release_datas   & r3   r   CamoufoxFetcher.fetch_latest  s!     ~~' (4$49r5   c                ,   < V ^8  d   QhRS[ RS[RS[ /# )r:   fileurlr;   )DownloadBufferrZ   )r=   r>   s   "r3   r?   r     s"     ' 'N ' ' 'r5   c                6    \        RV 24       \        WR7      # )z
Download a file from the given URL and return it as BytesIO.

Args:
    file (DownloadBuffer): The buffer to download to
    url (str): The URL to download the file from

Returns:
    DownloadBuffer: The downloaded file content as a BytesIO object
zDownloading package: )buffer)r4   webdl)r   r   s   &&r3   download_fileCamoufoxFetcher.download_file  s     	&se,-S&&r5   c                $   < V ^8  d   QhRS[ RR/# )r:   zip_filer;   N)r   )r=   r>   s   "r3   r?   r     s     * *N *t *r5   c                \    \        R\         24       \        V\        \        4      4       R# )z
Extract the contents of a zip file to the installation directory.

Args:
    zip_file (DownloadBuffer): The zip file content as a BytesIO object
zExtracting Camoufox: N)r4   rz   unziprZ   )rT   r   s   &&r3   extract_zipCamoufoxFetcher.extract_zip  s#     	&{m45hK()r5   c                    < V ^8  d   QhRS[ /# rX   ra   )r=   r>   s   "r3   r?   r   )  s      T r5   c                     \         P                  4       '       d/   \        R\          24       \        P                  ! \         4       R# R# )z 
Clean up the old installation.
zCleaning up cache: TF)rz   r|   r4   shutilrmtreer<   r5   r3   cleanupCamoufoxFetcher.cleanup(  s5    
 (67MM+&r5   c                   < V ^8  d   QhRR/# r9   r<   )r=   r>   s   "r3   r?   r   3  s     V VT Vr5   c           
         \        \        R,          R4      ;_uu_ 4       pVP                  \        P                  ! RV P
                  RV P                  /4      4       RRR4       R#   + '       g   i     R# ; i)z6
Set the version in the INSTALL_DIR/version.json file
rw   wbr]   rN   N)r~   rz   writer   dumpsr]   rN   )rT   r   s   & r3   set_versionCamoufoxFetcher.set_version3  sM     +.55GGFLL)T\\9dll!STU 6555s   >A((A9	c                   < V ^8  d   QhRR/# r9   r<   )r=   r>   s   "r3   r?   r   :  s       r5   c                Z   V P                  4         \        P                  RRR7       \        P                  ! 4       ;_uu_ 4       pV P                  WP                  4       V P                  V4       V P                  4        RRR4       \        R8w  d;   \        P                  ! R\        P                  ! \        \        4      4       24       \        RRR7       R#   + '       g   i     Ld; i  \          d.   p\        R	\        T4       24       T P                  4        h Rp?ii ; i)
z
Download and install the latest version of camoufox.

Raises:
    Exception: If any error occurs during the installation process
T)parentsexist_okNr*   zchmod -R 755 z!
Camoufox successfully installed.yellow)fgzError installing Camoufox: )r   rz   mkdirtempfileNamedTemporaryFiler   r   r   r  r   r{   systemshlexquoterZ   r4   	Exception)rT   	temp_filees   &  r3   installCamoufoxFetcher.install:  s     		dT: ,,..)""9hh7  +  " / %		M%++c+6F*G)HIJ7HE /.  	0Q9:LLN	s0   4C2 =CAC2 C/	*C2 2D*=(D%%D*c                    < V ^8  d   QhRS[ /# rX   rY   )r=   r>   s   "r3   r?   r   X  s      S r5   c                L    V P                   f   \        R4      hV P                   # )z
Url of the fetched latest version of camoufox.

Returns:
    str: The version of the installed camoufox

Raises:
    ValueError: If the version is not available (fetch_latest not ran)
z:Url is not available. Make sure to run fetch_latest first.)r   
ValueErrorrS   s   &r3   r   CamoufoxFetcher.urlW  s$     99YZZyyr5   c                    < V ^8  d   QhRS[ /# rX   rY   )r=   r>   s   "r3   r?   r   g  s     ) ) )r5   c                    V P                   e   V P                   P                  '       g   \        R4      hV P                   P                  # )z
Version of the fetched latest version of camoufox.

Returns:
    str: The version of the installed camoufox

Raises:
    ValueError: If the version is not available (fetch_latest not ran)
zBVersion is not available. Make sure to run the fetch_latest first.)r   r]   r  rS   s   &r3   r]   CamoufoxFetcher.versionf  s?     $D,=,=,E,E,Eabb  (((r5   c                    < V ^8  d   QhRS[ /# rX   rY   )r=   r>   s   "r3   r?   r   w  s     ) ) )r5   c                `    V P                   f   \        R4      hV P                   P                  # )z
Release of the fetched latest version of camoufox.

Returns:
    str: The release of the installed camoufox

Raises:
    ValueError: If the release information is not available (fetch_latest not ran)
zNRelease information is not available. Make sure to run the installation first.)r   r  rN   rS   s   &r3   rN   CamoufoxFetcher.releasev  s4     $`    (((r5   c                    < V ^8  d   QhRS[ /# rX   rY   )r=   r>   s   "r3   r?   r     s     	- 	- 	-r5   c                `    V P                   f   \        R4      hV P                   P                  # )zt
Fetches the version and release in version-release format

Returns:
    str: The version of the installed camoufox
zBVersion is not available. Make sure to run the installation first.)r   r  r^   rS   s   &r3   verstrCamoufoxFetcher.verstr  s.     $abb  ,,,r5   )r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r]   rN   r   r   r   __classcell__)r   r>   s   @@r3   r   r      s     	 	6 6*
 
  04 4 ' '* *  V V :   ) ) ) )" 	- 	- 	-r5   r   c                $    V ^8  d   QhR\         /# rX   rY   )r=   s   "r3   r?   r?     s     + +# +r5   c                 >    \         P                  4       P                  # )z8
Get the full version string of the installed camoufox.
)r7   r   r^   r<   r5   r3   installed_verstrr%    s     ***r5   c                0    V ^8  d   QhR\         R\        /# )r:   download_if_missingr;   )rb   r   )r=   s   "r3   r?   r?     s      t t r5   c                   \         P                  P                  \        4      '       d!   \         P                  ! \        4      '       g   V '       g   \        R\         24      hMj\         P                  P                  \        4      '       d/   \        P                  4       P                  4       '       d   \        # V '       g   \        R4      h\        4       P                  4        \        4       # )z#
Full path to the camoufox folder.
z!Camoufox executable not found at z Camoufox executable is outdated.)r{   ru   r|   rz   listdirr}   r7   r   rr   r   r   r  camoufox_path)r'  s   &r3   r*  r*    s     77>>+&&bjj.E.E"#&G}$UVV # 
	$	$):):)<)I)I)K)K #$%GHH ?r5   c                0    V ^8  d   QhR\         R\         /# r:   r   r;   rY   )r=   s   "r3   r?   r?     s     ' '3 '3 'r5   c                    \         R8X  dD   \        P                  P                  \	        4       R,          R,          R,          V ,          4      # \        \	        4       V ,          4      # )*
Get the path to the camoufox executable.
r&   zCamoufox.appContents	Resources)r   r{   ru   abspathr*  rZ   )r   s   &r3   get_pathr2    sH     %ww}?*L{Z]aabb}%&&r5   c                $    V ^8  d   QhR\         /# rX   rY   )r=   s   "r3   r?   r?     s     
 
S 
r5   c                     \        \        \        ,          4      p \        P                  P                  V 4      '       g   \        R\        4        R24      hV # )r.  zCamoufox is not installed at rx   )r2  LAUNCH_FILEr   r{   ru   r|   r   r*  )launch_paths    r3   r6  r6    sK     ;w/0K77>>+&&"+MO+<<ef
 	
 r5   c          
          V ^8  d   QhR\         R\        \         ,          R\        \        ,          R\        R\        /# )r:   r   descr   barr;   )rZ   r   r   rb   )r=   s   "r3   r?   r?     sC     ( (	(
3-( ^$( 
	(
 (r5   c                   \         P                  ! V RR7      pVP                  4        \        VP                  P                  R^ 4      4      pRpVf   \        4       p\        TRV'       d   RMRRVR7      ;_uu_ 4       pVP                  V4       F%  pVP                  V4      p	VP                  V	4       K'  	  RRR4       VP                  ^ 4       V#   + '       g   i     L#; i)	a  
Download a file from the given URL and return it as BytesIO.

Args:
    url (str): The URL to download the file from
    buffer (Optional[BytesIO]): A BytesIO object to store the downloaded file
    bar (bool): Whether to show the progress bar

Returns:
    DownloadBuffer: The downloaded file content as a BytesIO object

Raises:
    requests.RequestException: If there's an error downloading the file
T)streamzcontent-lengthi    NiB{desc}: {percentage:3.0f}%)totalunit
bar_format
unit_scaler8  )r   r   r   rD   headersr   r   iter_contentr   updateseek)
r   r8  r   r9  response
total_size
block_sizeprogress_barr   sizes
   &&&&      r3   r   r     s    ( ||C-HX%%))*:A>?JJ~	4$@
 
 
))*5D<<%D% 6
 KKNM
 
s    ;CC&	c          
      b    V ^8  d   QhR\         R\        R\        \        ,          R\        RR/# )r:   r   extract_pathr8  r9  r;   N)r   rZ   r   rb   )r=   s   "r3   r?   r?     s>     - --- 3-- 
	-
 
-r5   c                    \        V 4      ;_uu_ 4       p\        VP                  4       Y#'       d   RMRR7       F  pVP                  WQ4       K  	  RRR4       R#   + '       g   i     R# ; i)a  
Extract the contents of a zip file to the installation directory.

Args:
    zip_file (BytesIO): The zip file content as a BytesIO object

Raises:
    zipfile.BadZipFile: If the zip file is invalid or corrupted
    OSError: If there's an error creating directories or writing files
Nr=  )r8  r@  )r   r   infolistextract)r   rL  r8  r9  zfmembers   &&&&  r3   r   r     sO      
		bKKMB^
F JJv,
 
			s   >AA-	c                R    V ^8  d   QhR\         R\        \         \        3,          /# r,  )rZ   r	   r   )r=   s   "r3   r?   r?     s"     ' 'C 'DcN 'r5   c                    \        \        V ,          R4      ;_uu_ 4       p\        V\        R7      uuRRR4       #   + '       g   i     R# ; i)z9
Loads a local YAML file and returns it as a dictionary.
r)LoaderN)r~   
LOCAL_DATAr   r   )r   r   s   & r3   	load_yamlrW    s1     
j4	%	%Ag& 
&	%	%	%s	   <A	c                   V ^8  d   Qh/ ^ \         9   d
   \        ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d"   \        \        \        R,          3,          ;R&   ^\         9   d   \        R,          ;R&   ^\         9   d
   \
        ;R&   ^\         9   d
   \
        ;R&   ^\         9   d&   \        \        \        \        ,          3,          ;R&   # )	r:   r   r   OS_MAPr   rz   rV  r   )r&   r*   r(   )__conditional_annotations__r   r	   rZ   r   r   r
   )r=   s   "r3   r?   r?      s    		> [ Z	 Z? 
D $sCx. E 
\ d cS'-../ c] 
f = <$	% <g 
j 5 4T 4k 
l : 9D 9m 
r S$s)^$ s 
r5   )r   r    r   )T)NNT)NT)JrZ  r{   r   r   r  r   sysr
  dataclassesr   	functoolsr   ior   r   pathlibr   typingr   r	   r
   r   r   r   r   zipfiler   r/   r   r   platformdirsr   r   typing_extensionsr   yamlr   r   __version__r   
exceptionsr   r   r   r   r   _TemporaryFileWrapperr   r   rY  r   rz   ru   r1  __file__parentrV  r   r5  r4   r7   r   rp   rq   r   r   r%  r*  r2  r6  r   r   rW  r?   )rZ  s   @r3   <module>rj     s   		  	   
  ! $ &  C C C     '  '  $  "'8+I+I>"YZ Z Xh	8
F
FWwggg  4<UGUT[]b2c c<<v
#cll^+<=
>>(.s||(< <
34 41299
 9 
Hf	Hg	&(  
>		>$ 
7b 7b  7bv #//1 [*# *#ZY-& Y-x+0'
(V-.'r5   