HEX
Server: LiteSpeed
System: Linux osault1.hostarmada.net 4.18.0-553.123.2.lve.el8.x86_64 #1 SMP Thu May 7 23:17:13 UTC 2026 x86_64
User: tucom (1048)
PHP: 8.4.24
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.6/site-packages/soupsieve/__pycache__/css_parser.cpython-36.pyc
3

	LBj#��@s*dZddlZddlmZddlmZddlmZddlmZ	ddlm
Z
ddlZdd	lm
Z
mZmZmZmZmZmZmZmZmZd
Zddd
ddddddddddddddddddd d!d"hZd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2hZd3d4d5d6d7d8d9d:hZd$d)d;hZd<d=d>d?d@dAhZeeBeBeBeBZdBZdCje�Z dDZ!dEje e!dF�Z"dGje dH�Z#dIje edJ�Z$dKje#dL�Z%dMje"dH�Z&dNjee%dO�Z'dPje"e'dQ�Z(dRje%dS�Z)dTje%dS�Z*dUje%dS�Z+dVje"e%e(dW�Z,dXje"e%dY�Z-dZje"e%dY�Z.d[je%dS�Z/d\je"dH�Z0d]je-�Z1d^je%dS�Z2d_je.e"e!e e&d`�Z3daje.e"e&db�Z4dcje.e"e'dd�Z5deje.e"df�Z6dgje e"dh�Z7dcje.e"e'dd�Z8ej9dije"dH�ej:�Z;ej9djje edJ�ej:�Z<ej9dkje"dH�ej:�Z=ej9dlje"e'dQ�ej>�Z?ej9e �Z@ej9dmje"��ZAej9dnje"��ZBej9doje/�ej>�ZCdpZDdqZEdZFdrZGdsZHdtZIduZJdvZKdwZLdxZMdyZNdzZOd{ZPd|ZQeeQd}�eRe
e	jSe
e	jTeUejVd~�dd���ZWdd��d�d��ZXe
e	jTeeReeRe	jYffd��d�d��ZZd�eRe[eRd��d�d��Z\eReRd��d�d��Z]Gd�d��d��Z^Gd�d��d�e^�Z_Gd�d��d��Z`Gd�d��d��Zaead��jbeFeJBd��Zcead��jbeFeJBd��Zdead��jbeFeJBeIBd��Zeead��jbeFeJBeKBd��Zfead��jbeFeJBd��Zgead��jbeFeJBd��Zhead��jbeFeJBd��Ziead��jbeFeJBd��Zjead��jbeFeJBeOBd��Zkead��jbeFd��Zlead��jbeFeJBd��Zmead��jbeFeJBd��Znead��jbeFeMBeJBd��Zoead��jbeFeNBeJBd��ZpdS)�zCSS selector parser.�N)�	lru_cache�)�util)�	css_match)�	css_types)�SelectorSyntaxError)
�Optional�Dict�Match�Tuple�Type�Any�List�Union�Iterator�casti��z	:any-linkz:emptyz:first-childz:first-of-typez	:in-rangez
:out-of-rangez:last-childz
:last-of-typez:linkz:only-childz
:only-of-typez:rootz:checkedz:defaultz	:disabledz:enabledz:indeterminatez	:optionalz:placeholder-shownz
:read-onlyz:read-writez	:requiredz:scopez:definedz:activez:currentz:focusz:focus-visiblez
:focus-withinz:futurez:hostz:hoverz:local-linkz:pastz:pausedz:playingz:targetz:target-withinz
:user-invalidz:visitedz	:containsz:-soup-containsz:-soup-contains-ownz:hasz:isz:matchesz:notz:wherez
:host-contextz:dirz:langz
:nth-childz:nth-last-childz:nth-last-of-typez:nth-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z(?:[ \t]|{})z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:{ws}|{comments}))�ws�commentsz*(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$)))rz/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))r�nlz�
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})*)
)�escz>(?:[-+])?(?:[0-9]+n?|n)(?:(?<=n){ws}*(?:[-+]){ws}*(?:[0-9]+))?zT
(?:"(?:\\(?:.|{nl})|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|{nl})|[^\\'\r\n\f]+)*?'|{ident}+)
)r�identzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}+(?P<case>[is]))?)?{ws}*\]
)r�valuez	\#{ident})rz	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)rr�attrz$(?P<name>:{ident})(?P<open>\({ws}*)?)rrz#(?P<name>:{ident})(?P<open>\({ws}*)z(?P<name>:(?=--){ident})z{ws}*\)z:{}z	@P{ident}z}
(?P<pseudo_nth_child>{name}
(?P<nth_child>{nth}|even|odd))(?:{wsc}*\)|(?P<of>{comments}*{ws}{wsc}*of{comments}*{ws}{wsc}*))
)�name�wscrr�nthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)rrrz7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))rrrz{name}(?P<dir>ltr|rtl){ws}*\))rrz0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)rrz0(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$))z9(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$)|(\\{nl}))zL(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n){ws}*(?P<s2>[-+]){ws}*(?P<b>[0-9]+))?z-(?:(?P<value>{value})|(?P<split>{ws}*,{ws}*))z^{}*z{}*$z^{}$�,� ����� �@��iii�)�maxsize)�pattern�
namespaces�custom�flags�returncCs(t|�}tj|t|||d�j�|||�S)zCached CSS compile.)r)r*)�process_custom�cm�	SoupSieve�	CSSParser�process_selectors)r'r(r)r*�custom_selectors�r2�9/tmp/pip-build-44150kxb/soupsieve/soupsieve/css_parser.py�_cached_css_compile�s	
r4)r+cCstj�dS)zPurge the cache.N)r4�cache_clearr2r2r2r3�_purge_cache�sr6)r)r+cCsni}|dk	rjx\|j�D]P\}}tj|�}tj|�dkrDtdj|���||krZtdj|���||t|�<qW|S)zProcess custom.Nz5The name '{}' is not a valid custom pseudo-class namez4The custom selector '{}' has already been registered)	�itemsr�lower�	RE_CUSTOM�matchr�format�KeyError�css_unescape)r)r1�keyrrr2r2r3r,�s
r,F)�content�stringr+cCs(tttd�dd�}|stntj||�S)zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    )�mr+cSsn|jd�r8t|jd�dd�d�}|dkr.t}t|�}n2|jd�rV|jd�dd�}n|jd�rfd}nd}|S)	z(Replace with the appropriate substitute.rNr!rr�u��)�group�int�UNICODE_REPLACEMENT_CHAR�chr)rA�	codepointrr2r2r3�replaces



zcss_unescape.<locals>.replace)r
�str�
RE_CSS_ESC�RE_CSS_STR_ESC�sub)r?r@rIr2r2r3r=�sr=)rr+cCs�g}t|�}|dko|ddk}|dkr@|r@|jdj|���nF�xBt|�D�]4\}}t|�}|dkrr|jd�qLd|ko�dkns�|dkr�|jdj|��qL|dks�|r�|dkr�d	|ko�d
knr�|jdj|��qL|dk�sf|d
k�sfd	|k�o
d
kn�sfd	|k�o&d
kn�sfd|k�oBdkn�sfd|k�o^dkn�rr|j|�qL|jdj|��qLWdj|�S)zEscape identifier.r�-rz\{}u���z\{:x} �0�9�-�_r$�A�Z�a�zrC)rSrT)�len�appendr;�	enumerate�ord�join)rr@�lengthZ
start_dash�index�crHr2r2r3�escapes$ ,0Trac@sLeZdZdZeedd�dd�Zed�dd�Zeeeee	ed	�d
d�Z
dS)�SelectorPatternzSelector pattern.N)rr'r+cCs&||_tj|tjtjBtjB�|_dS)zInitialize.N)r�re�compile�I�X�U�
re_pattern)�selfrr'r2r2r3�__init__4szSelectorPattern.__init__)r+cCs|jS)z	Get name.)r)rir2r2r3�get_name:szSelectorPattern.get_name)�selectorr_r*r+cCs|jj||�S)zMatch the selector.)rhr:)rirlr_r*r2r2r3r:?szSelectorPattern.match)�__name__�
__module__�__qualname__�__doc__rJrjrkrErr
r:r2r2r2r3rb1srbc@sjeZdZdZeeeeedfeeefdfdd�dd�Zed�dd	�Z	ee
e
eeed
�dd�Z
dS)
�SpecialPseudoPatternzSelector pattern..N)�patternsr+cCspi|_xB|D]:}|d}|d||d�}x|dD]}||j|<q4WqWd|_tjttjtjBtjB�|_dS)zInitialize.rrBrrN)	rr�matched_namercrd�PAT_PSEUDO_CLASS_SPECIALrerfrg�re_pseudo_name)rirr�prr'�pseudor2r2r3rjHs
zSpecialPseudoPattern.__init__)r+cCs|jdkrdS|jj�S)z	Get name.NrC)rsrk)rir2r2r3rkUszSpecialPseudoPattern.get_name)rlr_r*r+cCsVd}|jj||�}|rRtjt|jd���}|jj|�}|rR|j|||�}|rR||_|S)zMatch the selector.Nr)	rur:rr8r=rDrr�getrs)rirlr_r*rwrArr'r2r2r3r:ZszSpecialPseudoPattern.match)rmrnrorprrJrrbrjrkrErr
r:r2r2r2r3rqEs0
rqc@sbeZdZdZedd�dd�Zedejd�dd�Z	e
ejejfd	�d
d�Z
ed	�dd
�ZeZdS)�	_Selectorz�
    Intermediate selector class.

    This stores selector data for a compound selector as we are acquiring them.
    Once we are done collecting the data for a compound selector, we freeze
    the data in an object that can be pickled and hashed.
    N)�kwargsr+cKs�|jdd�|_|jdg�|_|jdg�|_|jdg�|_|jdg�|_|jdg�|_|jdg�|_|jd	d�|_|jd
g�|_	|jdg�|_
|jdd
�|_|jdd�|_dS)zInitialize.�tagN�ids�classes�
attributesr�	selectors�	relations�rel_type�contains�langr*r�no_matchF)
rxr{r|r}r~rrr�r�r�r�r*r�)rirzr2r2r3rjssz_Selector.__init__)r�r+cCs<|r0|d}|jj|dd��tj|j�g�Stj�SdS)zFreeze relation.rrN)r��extend�ct�SelectorList�freeze)rir��selr2r2r3�_freeze_relations�s
z_Selector._freeze_relations)r+cCsh|jrtj�Stj|jt|j�t|j�t|j�t|j	�t|j
�|j|j�|j
t|j�t|j�|j�SdS)zFreeze self.N)r�r��SelectorNull�Selectorr{�tupler|r}r~rrr�r�r�r�r�r*)rir2r2r3r��s
z_Selector.freezec
Cs8dj|j|j|j|j|j|j|j|j|j	|j
|j|j�S)zString representation.z�_Selector(tag={!r}, ids={!r}, classes={!r}, attributes={!r}, nth={!r}, selectors={!r}, relations={!r}, rel_type={!r}, contains={!r}, lang={!r}, flags={!r}, no_match={!r}))
r;r{r|r}r~rrr�r�r�r�r*r�)rir2r2r3�__str__�sz_Selector.__str__)rmrnrorpr
rjrr�r�r�rr�r�r�rJr��__repr__r2r2r2r3ryjs
ryc
@s�eZdZdZede�eddFeefddGeefd
dHe	efd
dIe
efddJeeff�ede�ede
�ede�ede�ede�ede�ede�ede�ede�fZdKeeeeeeejffedd�dd�Zeeee e d�d d!�Z!eeee e d�d"d#�Z"eeee e d�d$d%�Z#eeee e$e%eeefe e%e e fd&�d'd(�Z&eeee e$e%eeefe d)�d*d+�Z'eee e$e%eeefee d,�d-d.�Z(eeee e)eeee%e eefd/�d0d1�Z*eeee e)ee)ee e ee%e efd2�	d3d4�Z+eeee e d�d5d6�Z,eeee e d�d7d8�Z-eeee e d�d9d:�Z.eeee e d�d;d<�Z/dLe$e%eeefeeejd=�d>d?�Z0ee$e%eeefd@�dAdB�Z1dMeeejdC�dDdE�Z2dS)Nr/zParse CSS selectors.�pseudo_close�pseudo_contains�	:contains�:-soup-contains�:-soup-contains-own�pseudo_nth_child�
:nth-child�:nth-last-child�pseudo_nth_type�:nth-of-type�:nth-last-of-type�pseudo_lang�:lang�
pseudo_dir�:dir�pseudo_class_custom�pseudo_class�pseudo_element�at_rule�id�classr{�	attribute�combineNr)rlr)r*r+cCs8|jdd�|_||_|jtj@|_|dkr.in||_dS)zInitialize.�u�N)rIr'r*r�DEBUG�debugr))rirlr)r*r2r2r3rj�szCSSParser.__init__)r�rA�has_selectorr+cCs`d}|jd�}|jd�r(tj|jd��nd}|jd�rLt|jd�dd��nd}t|jd��}d}	d}
d}|r�|d	kr|tjnd
tjB}n&tj|�dkr�tjtjB}d}	ntj}|r�|jd
�jd�r�t|jd
�dd�d�}nt|jd
��}|s�d}
n�|jd��rtjdtj	|�|�}
n�|jd��r<tjdtj	|�|�}
n�|jd��r`tjdtj	|�|�}
n�|jd��r�|�s�t
j|��r�dntj	|�}tjd||�}
nJ|jd��r�tjdtj	|�|�}
n&tjdtj	|�|�}
|jd��r�d}|	�r|
�rtj|
j�}
t
j|||
|
�}|�rLt�}|jj|�t
j|j�gdd�}|jj|�n|jj|�d}|S) z8Create attribute selector from the returned regex match.F�cmp�caseNZattr_nsrrC�	attr_name�ir�typeTr�"�'�^z^%s.*�$z.*?%s$�*z.*?%s.*�~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*�|z^%s(?:-.*)?$z^%s$�!���)r�r�r�)rDrr8r=rcre�DOTALL�
startswithrdra�RE_WS�searchr'r�ZSelectorAttributeryr~rZr�r�r)rir�rAr�Zinverse�opr��nsrZis_typeZpattern2rr*r'Zsel_attrZsub_selZnot_listr2r2r3�parse_attribute_selector�sZ
$"z"CSSParser.parse_attribute_selectorcCsH|jd�r t|jd�dd��nd}t|jd��}tj||�|_d}|S)z#Parse tag pattern from regex match.Ztag_nsNrZtag_nameTr�)rDr=r��SelectorTagr{)rir�rAr��prefixr{r2r2r3�parse_tag_pattern s
$zCSSParser.parse_tag_patterncCs�tjt|jd���}|jj|�}|dkrJtdj||jd��|j	|jd���t
|tj�s�|j|=t
||j|jd�jtd�}||j|<|jj|�d}|S)z�
        Parse custom pseudo class alias.

        Compile custom selectors as we need them. When compiling a custom selector,
        set it to `None` in the dictionary so we can avoid an infinite loop.
        rNz3Undefined custom selector '{}' found at position {}r)r)r*)r*T)rr8r=rDr)rxrr;�endr'�
isinstancer�r�r/r*r0�
FLG_PSEUDOrrZ)rir�rAr�rwrlr2r2r3�parse_pseudo_class_custom)s 
z#CSSParser.parse_pseudo_class_custom)r�rAr��	iselector�is_htmlr+c	Cs�d}tjt|jd���}|jd�r&d}|rN|tkrN|j|||||jd��}�n�|oZ|tk�r`|dkrz|jt	j
O_�n�|dkr�|jt	jO_d}�n�|dkr�|jt	jO_�n�|d	kr�|jt	j
O_�n�|d!kr�|jjt��np|dk�r|jjt��nV|d
k�r|jjt��n<|dk�r8|jjt��n"|dk�rR|jjt��n|dk�rl|jjt��n�|dk�r�|jjt��n�|dk�r�|jjt��n�|dk�r�|jjt��n�|dk�r�|jjt��n�|dk�r�|jjt��nl|dk�r|jjt��nR|dk�r"|jjt��n8|dk�rP|jjt	jdddddt	j����n
|dk�r||jjt	jdddddt	j���n�|dk�r�|jjt	jdddddt	j���n�|dk�r�|jjt	jdddddt	j���n�|dk�r|jj t	jdddddt	j��t	jdddddt	j��g�nB|dk�rZ|jj t	jdddddt	j��t	jdddddt	j��g�d}n�|�r�|t!k�r�|j"||jd�t#t$B�d|_%d}nR|�r�|t&k�r�d|_%d}n4|t'k�r�t(dj)|�|j*|j+d���nt,d j)|���||fS)"zParse pseudo class.Fr�openTrz:rootz:definedz:scopez:empty�:link�	:any-linkz:checkedz:defaultz:indeterminatez	:disabledz:enabledz	:requiredz	:optionalz
:read-onlyz:read-writez	:in-rangez
:out-of-rangez:placeholder-shownz:first-childrz:last-childz:first-of-typez
:last-of-typez:only-childz
:only-of-typez$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)r�r�)-rr8r=rD�PSEUDO_COMPLEX�parse_pseudo_openr��
PSEUDO_SIMPLEr*r�ZSEL_ROOTZSEL_DEFINEDZ	SEL_SCOPEZ	SEL_EMPTYrrZ�CSS_LINK�CSS_CHECKED�CSS_DEFAULT�CSS_INDETERMINATE�CSS_DISABLED�CSS_ENABLED�CSS_REQUIRED�CSS_OPTIONAL�
CSS_READ_ONLY�CSS_READ_WRITE�CSS_IN_RANGE�CSS_OUT_OF_RANGE�CSS_PLACEHOLDER_SHOWNr�SelectorNthr�r��PSEUDO_COMPLEX_NO_MATCH�parse_selectorsr��FLG_OPENr��PSEUDO_SIMPLE_NO_MATCH�PSEUDO_SUPPORTEDrr;r'�start�NotImplementedError)rir�rAr�r�r�Zcomplex_pseudorwr2r2r3�parse_pseudo_classEs�














$
"
"
"


zCSSParser.parse_pseudo_class)r�rAr�r�r+cCs.|j�}|jd�rd}nd}tjt|d��|d<tj|jd|��}|dkr\d}d}	d	}
n�|d
krrd}d}	d	}
n�ttttj	|��}|j
d�r�|j
d�d
kr�d
nd}|j
d�}
|
jd�}
|
jd�r�|d7}n|
r�||
dd�7}n||
7}|j
d��r|j
d�d
k�rd
nd}|j
d��r,||j
d�7}nd}t
|d�}t
|d�}	|d}|dk�r�|j
d��r||j||jd�ttB�}nt}|dk�r�|jjtj||
|	dd|��n&|dk�r&|jjtj||
|	dd	|��nV|dk�r�|jjtj||
|	d	dtj���n*|dk�r&|jjtj||
|	d	d	tj���d	}|S)zParse `nth` pseudo.r�Z_child�_typerrZevenrrTZoddr�s1rNrC�a�n�1N�s2�b�0�
Zofz
:nth-childFz:nth-last-childz:nth-of-typez:nth-last-of-typer�)�	groupdictrxrr8r=rr
rJ�RE_NTHr:rD�endswithr�rEr�r�r�r��CSS_NTH_OF_S_DEFAULTrrZr�r�r�)rir�rAr�r�ZmdictZpostfixr?r�r��varZ	nth_partsZ_s1r�Z_s2Z
pseudo_selZnth_selr2r2r3�parse_pseudo_nth�sX	
 



$





"
 zCSSParser.parse_pseudo_nth)r�rr�r�r_r+cCs^ttB}|dkr|tO}n&|dkr0|ttBO}n|dkr@|tO}|jj|j|||��d}|S)z"Parse pseudo with opening bracket.z:notz:has�:where�:isT)r�r�)r�r��FLG_NOT�FLG_RELATIVE�FLG_FORGIVErrZr�)rir�rr�r�r_r*r2r2r3r��s

zCSSParser.parse_pseudo_open)r�rAr�rr�r_r+cCs�|jd�j�}|st}|tkrT|s(d|_||_|djj|�dt}|jt��nH|rp||_|d	jj|�n$|dd�tkr�t	dj
|�|j|��d|}t�}d}|||fS)
zParse combinator tokens.�relationTr�:Nz'The multiple combinators at position {}Fr�r�)rD�strip�
WS_COMBINATOR�COMMA_COMBINATORr�r�r�rZryrr;r')rir�rAr�rr�r_�
combinatorr2r2r3�parse_has_combinator�s,zCSSParser.parse_has_combinator)	r�rAr�rr��	is_pseudo�
is_forgiver_r+c	
Cs�|jd�j�}	|	st}	|sb|s(|	tkr>tdj|	|�|j|��|	tkr�d|_|dd�=|j|�nl|	tkr�|j	r�|r�t
jdd�|_	|jj
|�|j|�|dd�=n&|jj
|�|	|_|dd�=|j|�t�}d}||fS)zParse combinator tokens.r�zBThe combinator '{}' at position {}, must have a selector before itTNr�F)rDr�r�r�rr;r'r�rZr{r�r�r�r�r�ry)
rir�rAr�rr�rrr_r�r2r2r3�parse_combinator,s4





zCSSParser.parse_combinatorcCsN|jd�}|jd�r.|jjt|dd���n|jjt|dd���d}|S)zParse HTML classes and ids.r�.rNT)rDr�r}rZr=r|)rir�rAr�rlr2r2r3�parse_class_id\s

zCSSParser.parse_class_idc
Cs�tjt|jd���}|dkr(tjdt�|dk}t|jd��}g}xXtj|�D]J}|jd�r^qN|jd�}	|	j	d�r�t|	d
d
�d�}	nt|	�}	|j
|	�qNW|jj
tj
||��d}|S)zParse contains.rz	:containsz\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.z:-soup-contains-own�values�splitrr�r�rT)r�r�r�)rr8r=rD�warnings�warn�
FutureWarning�	RE_VALUES�finditerr�rZr�r�ZSelectorContains)
rir�rAr�rwZcontains_ownrrr�tokenrr2r2r3�parse_pseudo_containsgs&


zCSSParser.parse_pseudo_containscCs�|jd�}g}xXtj|�D]J}|jd�r*q|jd�}|jd�rRt|dd	�d�}nt|�}|j|�qW|jjtj|��d}|S)
zParse pseudo language.rrrr�r�rT)r�r�r�)	rDr
rr�r=rZr�r�ZSelectorLang)rir�rAr�rrrrrr2r2r3�parse_pseudo_lang�s



zCSSParser.parse_pseudo_langcCs6tj|jd��dkrtjntj}|j|O_d}|S)zParse pseudo direction.�dirZltrT)rr8rDr�ZSEL_DIR_LTRZSEL_DIR_RTLr*)rir�rAr�rr2r2r3�parse_pseudo_dir�s zCSSParser.parse_pseudo_dir)r�r_r*r+cCs8t�}g}d}d}g}dt}	t|t@�}
t|t@�}t|t@�}t|t@�}
t|t@�}t|t@�}t|t	@�}t|t
@�}t|t@�}t|t@�}t|t
@�}|j�r6|r�td�|
r�td�|r�td�|
r�td�|r�td�|r�td�|r�td	�|�rtd
�|�rtd�|�r(td�|�r6td
�|�rH|jt���yF�x>t|�\}}|dk�r~tdj|jd�����n|dk�r�|j|||�}�n�|dk�r�|j|||||�\}}�n�|dk�r�tdj|jd�����n�|dk�r�|j|||�}�n�|d+k�r|j||||�}�nd|dk�r6|j|||�}�nH|dk�rV|j|||�}d}�n(|dk�r�|�s�|�s�tdj|jd��|j|jd���d|_|
�r�d}Pn tdj|jd��|j|jd���n�|dk�r|�r�|j|||||	|�\}}}	n|j||||||||�\}}nr|dk�r&|j |||�}nX|d k�rf|�rVtd!j|jd��|j|jd���|j!|||�}n|d,k�r~|j"|||�}|j#d�}�qPWWnt$k
�r�YnX|
�r�|�r�td$j|�|j|��|�r0|j%�r�|�r�t&j'd%d&�|_%|�r|	|_(|d-j)j|�n |j)j*|�|d&d&�=|j|�n||�r�|�r~|�r�|d.j(d&k�r�|	d(k�r�|	|_(d|_|d/j)j|�d}n.|�s�|�r�d|_|d&d&�=|j|�d}|�s�tdj|�|j|��|�r�t&j+|d0_,|�r�t&j-|d1_,|�r�t&j.|d2_,|�rt&j/|d3_,|�r t&j0|d4_,t&j1d)d*�|D�|
|�S)5zParse selectors.Fr�z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: Truer�zAt-rules found at position {}rr�r�r�z#Pseudo-element found at position {}r�r�r�r�r�Tr�z"Expected a selector at position {}z+Unmatched pseudo-class close at position {}r�r�r{z5Tag name found at position {} instead of at the startr�r�z$Unclosed pseudo-class at position {}r�Nrz: cSsg|]}|j��qSr2)r�)�.0�sr2r2r3�
<listcomp>Ysz-CSSParser.parse_selectors.<locals>.<listcomp>)r�r�)r�r�r�r�r�r�r�r�r�r�)2ryr��boolr�r�r�r��FLG_HTML�FLG_DEFAULT�FLG_INDETERMINATE�FLG_IN_RANGE�FLG_OUT_OF_RANGE�FLG_PLACEHOLDER_SHOWNr�r��printrZ�nextr�r;r�r�r�r
r�rrrr'r�r�rr�r�rr��
StopIterationr{r�r�r�r�r�ZSEL_DEFAULTr*ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr�)rir�r_r*r�rr��closedr�r�Zis_openrZis_relative�is_notr�Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownrr>rAr2r2r3r��s	













 

zCSSParser.parse_selectors)r'r+c	csftj|�}|r|jd�nd}tj|�}|r8|jd�dn
t|�d}|jrXtdj|��x�||k�rPd}xd|j	D]Z}|j
|||j�}|rp|j�}|jr�tdj||j
d�|jd���|jd�}||fVPqpW|dkrZ||}|dkr�dj|�}nN|dk�rd	j|�}n8|d
k�rdj|�}n"|dk�r4d
j|�}ndj||�}t||j|��qZW|j�rbtd�dS)zIterate selector tokens.rrz## PARSING: {!r}Nz#TOKEN: '{}' --> {!r} at position {}�[z+Malformed attribute selector at position {}rz'Malformed class selector at position {}�#z$Malformed id selector at position {}r�z.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)�RE_WS_BEGINr�r��	RE_WS_ENDr�rYr�rr;�
css_tokensr:r*rkrDrr')	rir'rAr_r��vrr`�msgr2r2r3�
selector_iter[s>






zCSSParser.selector_iter)r_r*r+cCs|j|j|j�||�S)zProcess selectors.)r�r'r')rir_r*r2r2r3r0�szCSSParser.process_selectors)r�r�r�)r�r�)r�r�)r�)r�)Nr)rr)rr)3rmrnrorprb�PAT_PSEUDO_CLOSErq�PAT_PSEUDO_CONTAINS�PAT_PSEUDO_NTH_CHILD�PAT_PSEUDO_NTH_TYPE�PAT_PSEUDO_LANG�PAT_PSEUDO_DIR�PAT_PSEUDO_CLASS_CUSTOM�PAT_PSEUDO_CLASS�PAT_PSEUDO_ELEMENT�PAT_AT_RULE�PAT_ID�	PAT_CLASS�PAT_TAG�PAT_ATTR�PAT_COMBINEr$rJrr	rr�r�rErjryr
rr�r�r�rrr�r�r�rr�rrr
rrr�r'r0r2r2r2r3r/�s�


F	Z=*&: )r/zhtml|*:is(a, area)[href])r*z\
    html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
    z�
    :checked,

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|form html|*:is(button, input)[type="submit"]
    aF
    html|input[type="checkbox"][indeterminate],
    html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
    html|progress:not([value]),

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|input[type="radio"][name]:not([name='']):not([checked])
    a�
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
    z|
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
    z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
    html|textarea[placeholder]:not([placeholder=''])
    z*|*a
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    z!
    html|*:not(:read-write)
    z�
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    )F)qrprc�	functoolsrrCrrr-rr�rrZtypingrr	r
rrr
rrrrrFr�r�r�r�ZPSEUDO_SPECIALr��NEWLINEr;ZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPES�
IDENTIFIERZNTHZVALUEZATTRr2r3r4r5r/rtr.r(r0r1r*r+r,r-r6r)rdrerKrLr�rfr
r�r"r#r9r�r�r�r�r�rrrr�rrrr��	_MAXCACHErJZ
NamespacesZCustomSelectorsrEr.r4r6r�r,rr=rarbrqryr/r0r�r�r�r�r�r�r�r�r�r�r�r�r�r�r2r2r2r3�<module>sj0



(%Ed