HEX
Server: Apache
System: Linux srv1.prosuiteplus.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: prosuiteplus (1001)
PHP: 8.3.20
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/soupsieve/__pycache__/css_parser.cpython-38.pyc
U

$��]��@s�dZddlmZddlZddlmZddlmZddlmZ	ddlm
Z
d	Zd
ddd
ddddddddddddddddddd d!hZd"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1hZ
d2d3d4d5d6d7hZd#d(d8hZd9d:d;d<d=d>hZee
BeBeBeBZd?Zd@�e�ZdAZdBjeedC�ZdDjedE�ZdFjeedG�ZdHjedI�ZdJjedE�ZdKjeedL�ZdMjeedN�ZdOjedP�ZdQjedP�ZdRjedP�ZdSjeeedT�Z dUjeedV�Z!dWjeedV�Z"dXjedP�Z#dYjedE�Z$dZ�e!�Z%d[jedP�Z&d\je"eeeed]�Z'd^je"eed_�Z(d`je"eeda�Z)dbje"edc�Z*ddjeede�Z+d`je"eeda�Z,e�-dfjedE�ej.�Z/e�-dgjeedG�ej.�Z0e�-dhjedE�ej.�Z1e�-dijeedN�ej2�Z3e�-e�Z4e�-dj�e��Z5e�-dk�e��Z6e�-dl�e#�ej2�Z7dmZ8dnZ9dZ:doZ;dpZ<dqZ=drZ>dsZ?dtZ@duZAdvZBdwZCdxZDejEeDdy�dzd{��ZFd|d}�ZGd~d�ZHd�d�d��ZId�d��ZJGd�d��d�eK�ZLGd�d��d�eL�ZMGd�d��d�eK�ZNGd�d��d�eK�ZOeOd��jPe:e>Bd��ZQeOd��jPe:e>Bd��ZReOd��jPe:e>Be=Bd��ZSeOd��jPe:e>Be?Bd��ZTeOd��jPe:e>Bd��ZUeOd��jPe:e>Bd��ZVeOd��jPe:e>Bd��ZWeOd��jPe:e>Bd��ZXeOd��jPe:e>BeCBd��ZYeOd��jPe:d��ZZeOd��jPe:e>Bd��Z[eOd��jPe:e>Bd��Z\eOd��jPe:eABe>Bd��Z]eOd��jPe:eBBe>Bd��Z^dS)�zCSS selector parser.�)�unicode_literalsN�)�util)�	css_match)�	css_types)�SelectorSyntaxErrori���	:any-link�:empty�:first-child�:first-of-type�	:in-range�
:out-of-range�:last-child�
:last-of-type�:link�:only-child�
:only-of-type�:root�:checked�:default�	:disabled�:enabled�:indeterminate�	:optional�:placeholder-shown�
:read-only�:read-write�	:required�:scope�:definedz:activez:currentz:focusz:focus-visiblez
:focus-withinz:futurez:hostz:hoverz:local-linkz:pastz:pausedz:playingz:targetz:target-withinz
:user-invalidz:visited�	:contains�:hasz:isz:matches�:notz:wherez
:host-context�:dir�:lang�
:nth-child�:nth-last-child�:nth-last-of-type�: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]|$)))r)z/(?:\\(?:[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})*)
)Zescz>(?:[-+])?(?:[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})r,z	\.{ident}z$(?:(?:{ident}|\*)?\|)?(?:{ident}|\*)z7\[{ws}*(?P<ns_attr>(?:(?:{ident}|\*)?\|)?{ident}){attr})r)r,�attrz$(?P<name>:{ident})(?P<open>\({ws}*)?)r)r,z#(?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�wscr*r)�nthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)r/r)r1z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))r/r)r-z{name}(?P<dir>ltr|rtl){ws}*\))r/r)z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)r)r0z0(?:(\\[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^{}$�,� ����� �@��ii�)�maxsizecCs(t|�}t�|t|||d���|||�S)zCached CSS compile.��custom�flags)�process_custom�cmZ	SoupSieve�	CSSParser�process_selectors)�patternZ
namespacesr>r?�custom_selectors�rF�6/usr/lib/python3/dist-packages/soupsieve/css_parser.py�_cached_css_compile�s�rHcCst��dS)zPurge the cache.N)rH�cache_clearrFrFrFrG�_purge_cache�srJcCsji}|dk	rf|��D]P\}}t�|�}t�|�dkrBtd�|���||krXtd�|���||t|�<q|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>rE�keyr-r/rFrFrGr@�s
r@FcCsdd�}|stnt�||�S)zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    cSsp|�d�r:t|�d�dd�d�}|dkr.t}t�|�}n2|�d�rX|�d�dd�}n|�d�rhd}nd}|S)	z(Replace with the appropriate substitute.rNr7rr4����)�group�int�UNICODE_REPLACEMENT_CHARrZuchr)�m�	codepointr-rFrFrG�replace�s


zcss_unescape.<locals>.replace)�
RE_CSS_ESC�RE_CSS_STR_ESC�sub)�content�stringr[rFrFrGrQ�srQcCs�g}t|�}|dko|ddk}|dkr@|r@|�d�|���n:t|�D�].\}}t�|�}|dkrp|�d�qHd|kr�dks�n|dkr�|�d�|��qH|dks�|r�|dkr�d	|kr�d
kr�nn|�d�|��qH|dk�s\|dk�s\d	|k�r
d
k�s\nd	|k�r$d
k�s\nd
|k�r>dk�s\nd|k�rXdk�rhnn|�|�qH|�d�|��qHd�|�S)zEscape identifier.r�-rz\{}rT��z\{:x} �0�9)�-�_r:�A�Z�a�zrU)�len�appendrO�	enumeraterZuord�join)r,r`ZlengthZ
start_dash�index�crZrFrFrG�escapesP
,���
�
�
�
�
�
�
�rrc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�SelectorPattern�Selector pattern.cCs&||_t�|tjtjBtjB�|_dS)�Initialize.N)r/�re�compile�I�X�U�
re_pattern)�selfr/rDrFrFrG�__init__$szSelectorPattern.__init__cCs|jS�z	Get name.)r/�r|rFrFrG�get_name*szSelectorPattern.get_namecCsdS�zEnabled.TrF�r|r?rFrFrG�enabled/szSelectorPattern.enabledcCs|j�||�S)�Match the selector.)r{rN)r|�selectorrprFrFrGrN4szSelectorPattern.matchN��__name__�
__module__�__qualname__�__doc__r}r�r�rNrFrFrFrGrs!s
rsc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�SpecialPseudoPatternrtcCsdi|_|D]2}|d}t||d�}|dD]}||j|<q,q
d|_t�ttjtjBtjB�|_	dS)rurr4rN)
�patternsrs�matched_namervrw�PAT_PSEUDO_CLASS_SPECIALrxryrz�re_pseudo_name)r|r��pr/rD�pseudorFrFrGr}=szSpecialPseudoPattern.__init__cCs
|j��Sr~)r�r�rrFrFrGr�JszSpecialPseudoPattern.get_namecCsdSr�rFr�rFrFrGr�OszSpecialPseudoPattern.enabledcCsTd}|j�||�}|rPt�t|�d���}|j�|�}|rP|�||�}|rP||_|S)r�Nr/)	r�rNrrLrQrVr��getr�)r|r�rpr�rYr/rDrFrFrGrNTszSpecialPseudoPattern.matchNr�rFrFrFrGr�:s

r�c@s4eZdZdZdd�Zdd�Zdd�Zdd	�ZeZd
S)�	_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.
    cKs�|�dd�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�d	d�|_|�d
g�|_	|�dg�|_
|�dd
�|_|�dd�|_dS)ru�tagN�ids�classes�
attributesr1�	selectors�	relations�rel_type�contains�langr?r�no_matchF)
r�r�r�r�r�r1r�r�r�r�r�r?r�)r|�kwargsrFrFrGr}msz_Selector.__init__cCs<|r0|d}|j�|dd��t�|��g�St��SdS)zFreeze relation.rrN)r��extend�ct�SelectorList�freeze)r|r��selrFrFrG�_freeze_relations}s
z_Selector._freeze_relationsc
Csh|jrt��St�|jt|j�t|j�t|j�t|j	�t|j
�|�|j�|j
t|j�t|j�|j�SdS)zFreeze self.N)r�r�ZSelectorNullZSelectorr��tupler�r�r�r1r�r�r�r�r�r�r?rrFrFrGr��s
�z_Selector.freezecCs8d�|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}))
rOr�r�r�r�r1r�r�r�r�r�r?r�rrFrFrG�__str__�s��z_Selector.__str__N)	r�r�r�r�r}r�r�r��__repr__rFrFrFrGr�ds
r�c
@seZdZdZede�eddefddefdde	fd	d
e
fddeff�ed
e�ede
�ede�ede�ede�ede�ede�ede�ede�fZd8dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z d.d/�Z!d0d1�Z"d9d2d3�Z#d4d5�Z$d:d6d7�Z%dS);rBzParse CSS selectors.�pseudo_close�pseudo_contains)r �pseudo_nth_child)r%r&�pseudo_nth_type)r(r'�pseudo_lang)r$�
pseudo_dir)r#�pseudo_class_custom�pseudo_class�pseudo_element�at_rule�id�classr��	attribute�combineNrcCs8|�dd�|_||_|jtj@|_|dkr.in||_dS)ru�rTN)r[rDr?r�DEBUG�debugr>)r|r�r>r?rFrFrGr}�szCSSParser.__init__cCsdd}|�d�}|�d�r(t�|�d��nd}dd�|�d��d�D�}d	}d}	d}
t|�d
krp|d}|d
}n|d}|r�|dkr�tjnd}nt�|�d
kr�tj}d}	nd}|r�|�d��d�r�t|�d�d
d�d�}
q�t|�d��}
nd}
|s�d}n�|�d��rt�	dt�
|
�|�}n�|�d��rBt�	dt�
|
�|�}n�|�d��rft�	dt�
|
�|�}n�|�d��r�|
�r�t�|
��r�dnt�
|
�}
t�	d|
|�}nJ|�d��r�t�	dt�
|
�|�}n&t�	dt�
|
�|�}|�d��r�d}|	�r|�rt�	|j
�}
t�||||
�}|�rPt�}|j�|�t�|��gdd�}|j�|�n|j�|�d}|S)z8Create attribute selector from the returned regex match.FZcmp�caseNcSsg|]}t|��qSrF�rQ)�.0�arFrFrG�
<listcomp>�sz6CSSParser.parse_attribute_selector.<locals>.<listcomp>Zns_attr�|rUrr�i�typeTr-��"�'����^z^%s.*�$z.*?%s$�*z.*?%s.*�~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*z^%s(?:-.*)?$z^%s$�!)rVrrL�splitrlrvrx�
startswithrQrwrr�RE_WS�searchrDr�ZSelectorAttributer�r�rmr�r�r�)r|r�rY�has_selectorZinverse�opr��parts�nsZis_typeZpattern2r.r?r-rDZsel_attrZsub_selZnot_listrFrFrG�parse_attribute_selector�sb

 z"CSSParser.parse_attribute_selectorcCsZdd�|�d��d�D�}t|�dkr8|d}|d}n|d}d}t�||�|_d}|S)z#Parse tag pattern from regex match.cSsg|]}t|��qSrFr�)r��xrFrFrGr�sz/CSSParser.parse_tag_pattern.<locals>.<listcomp>rr�rNT)rVr�rlr��SelectorTagr�)r|r�rYr�r��prefixr�rFrFrG�parse_tag_patterns
zCSSParser.parse_tag_patterncCs�t�t|�d���}|j�|�}|dkrJtd�||�d��|j	|�d���t
|tj�s�d|j|<t
||j|jd�jtd�}||j|<|j�|�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.
        r/Nz2Undefined custom selector '{}' found at postion {}rr=�r?T)rrLrQrVr>r�rrO�endrD�
isinstancer�r�rBr?rC�
FLG_PSEUDOr�rm)r|r�rYr�r�r�rFrFrG�parse_pseudo_class_custom"s*�
��
z#CSSParser.parse_pseudo_class_customcCs�d}t�t|�d���}|�d�r&d}|rN|tkrN|�|||||�d��}�n�|�s`|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�|j�t��np|dk�r|j�t��nV|dk�r|j�t��n<|d
k�r8|j�t��n"|dk�rR|j�t��n|dk�rl|j�t��n�|dk�r�|j�t��n�|dk�r�|j�t��n�|dk�r�|j�t��n�|dk�r�|j�t��n�|dk�r�|j�t��nl|dk�r|j�t��nR|dk�r"|j�t��n8|dk�rP|j�t	�dddddt	�����n
|dk�r||j�t	�dddddt	����n�|dk�r�|j�t	�dddddt	����n�|dk�r�|j�t	�dddddt	����n�|dk�r|j� t	�dddddt	���t	�dddddt	���g�nB|dk�rZ|j� t	�dddddt	���t	�dddddt	���g�d}n�|�r�|t!k�r�|�"||�d�t#t$B�d|_%d}nP|�s�|t&k�r�d|_%d}n4|t'k�r�t(d�)|�|j*|�+d���nt,d�)|���||fS) zParse pseudo class.Fr/�openTrrrrr	)rrrrrrrrrrrrr
rr
rrrrrrz$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-rrLrQrV�PSEUDO_COMPLEX�parse_pseudo_openr��
PSEUDO_SIMPLEr?r�ZSEL_ROOTZSEL_DEFINEDZ	SEL_SCOPEZ	SEL_EMPTYr�rm�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_SHOWNr1�SelectorNthr�r��PSEUDO_COMPLEX_NO_MATCH�parse_selectorsr��FLG_OPENr��PSEUDO_SIMPLE_NO_MATCH�PSEUDO_SUPPORTEDrrOrD�start�NotImplementedError)r|r�rYr��	iselector�is_htmlZcomplex_pseudor�rFrFrG�parse_pseudo_class>s�













$
"
"
"
��
��
��zCSSParser.parse_pseudo_classcCs |��}|�d�rd}nd}t�t|d��|d<t�|�d|��}|dkr\d}d}	d	}
n�|d
krrd}d}	d	}
n�t�|�}|�d�r�|�d�d
kr�d
nd}|�d�}|�d�}
|�	d�r�|d7}n|
r�||dd�7}n||7}|�d�r�|�d�d
kr�d
nd}	|�d��r|	|�d�7}	nd}	t
|d�}t
|	d�}	|d}
|dk�r�|�d��rn|�||�d�t
tB�}nt}|
dk�r�|j�t�||
|	dd|��n&|
dk�r|j�t�||
|	dd	|��nV|
dk�r�|j�t�||
|	d	dt����n*|
dk�r|j�t�||
|	d	d	t����d	}|S)zParse `nth` pseudo.r�Z_childZ_typer/r1Zevenr4rTZoddr�s1rarUr��n�1Nr��s2�b�0�
Zofr%Fr&r(r')�	groupdictr�rrLrQ�RE_NTHrNrV�endswithr�rWr�r�r�r��CSS_NTH_OF_S_DEFAULTr1rmr�r�r�)r|r�rYr�r�ZmdictZpostfixr_r�r��varZ	nth_partsr�Z
pseudo_selZnth_selrFrFrG�parse_pseudo_nth�sX

 



 





"
 zCSSParser.parse_pseudo_nthcCsFttB}|dkr|tO}|dkr(|tO}|j�|�|||��d}|S)z"Parse pseudo with opening bracket.r"r!T)r�r��FLG_NOT�FLG_RELATIVEr�rmr�)r|r�r/r�r�rpr?rFrFrGr��szCSSParser.parse_pseudo_opencCs�|�d���}|st}|tkrd|s8td�||�|j|��||_|dj�	|�dt}|�	t
��nH|r�||_|dj�	|�n$|dd�tkr�td�|�|j|��d|}t
�}d}|||fS)	�Parse combinator tokens.�relation�AThe combinator '{}' at postion {}, must have a selector before itr��:rNz'The multiple combinators at position {}F)rV�strip�
WS_COMBINATOR�COMMA_COMBINATORrrOrDr�r�rmr�)r|r�rYr�r�r�rp�
combinatorrFrFrG�parse_has_combinator�s6
��zCSSParser.parse_has_combinatorc	Cs�|�d���}|st}|s0td�||�|j|��|tkrr|jsP|sPt�	dd�|_|j
�|�|�|�|dd�=n&|j
�|�||_
|dd�=|�|�t�}d}||fS)rrr	r�NF)rVrrrrOrDr
r�r�r�r�r�rmr�r�)	r|r�rYr�r�r��	is_pseudorprrFrFrG�parse_combinators,
�



zCSSParser.parse_combinatorcCsN|�d�}|�d�r.|j�t|dd���n|j�t|dd���d}|S)zParse HTML classes and ids.r�.rNT)rVr�r�rmrQr�)r|r�rYr�r�rFrFrG�parse_class_id&s

zCSSParser.parse_class_idcCs�|�d�}g}t�|�D]J}|�d�r(q|�d�}|�d�rPt|dd�d�}nt|�}|�|�q|j�t�t	|���d}|S)zParse contains.�valuesr�r-)r�r�rr�T)
rV�	RE_VALUES�finditerr�rQrmr�r�ZSelectorContainsr��r|r�rYr�rr��tokenr-rFrFrG�parse_pseudo_contains1s



zCSSParser.parse_pseudo_containscCs~|�d�}g}t�|�D]J}|�d�r(q|�d�}|�d�rPt|dd�d�}nt|�}|�|�q|j�t�|��d}|S)zParse pseudo language.rr�r-r�rr�T)	rVrrr�rQrmr�r�ZSelectorLangrrFrFrG�parse_pseudo_langCs



zCSSParser.parse_pseudo_langcCs6t�|�d��dkrtjntj}|j|O_d}|S)zParse pseudo direction.�dirZltrT)rrLrVr�ZSEL_DIR_LTRZSEL_DIR_RTLr?)r|r�rYr�r-rFrFrG�parse_pseudo_dirXs zCSSParser.parse_pseudo_dirc	Cs�t�}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@�}|j
�r|r�td�|
r�td�|r�td�|
r�td�|r�td�|r�td�|r�td	�|r�td
�|�rtd�|�rtd�|�r,|�t���z4t|�\}}|d
k�r^td�|�d�����n�|dk�rz|�|||�}�n�|dk�r�|�|||||�\}}�n�|dk�r�td�|�d�����n�|dk�r�|�|||�}�nv|dk�r�|�||||�}�nX|dk�r|�|||�}�n<|dk�r6|�|||�}d}�n|dk�r�|�sftd�|�d��|j|�d���|
�rvd}�q`n td�|�d��|j|�d���n�|dk�r�|�r�|�|||||	|�\}}}	n|�|||||||�\}}nr|dk�r�|�|||�}nX|dk�r:|�r*td�|�d��|j|�d���|�|||�}n|d k�rR|� |||�}|�!d�}�q0Wnt"k
�rxYnX|
�r�|�s�td!�|�|j|��|�r�|j#�s�|�s�t$�%d"d#�|_#|�r�|	|_&|d$j'�|�n |j'�(|�|d#d#�=|�|�ntd%�|�|j|��|�r"t$j)|d$_*|�r4t$j+|d$_*|�rFt$j,|d$_*|�rXt$j-|d$_*|�rjt$j.|d$_*t$�/d&d'�|D�|
|�S)(zParse 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: Truer�zAt-rules found at position {}rr�r�r�z#Psuedo-element found at position {}r�)r�r�r�r�Tr�z!Expected a selector at postion {}z*Unmatched pseudo-class close at postion {}r�r�r�z5Tag name found at position {} instead of at the start)r�r�z$Unclosed pseudo-class at position {}r�Nr�z"Expected a selector at position {}cSsg|]}|���qSrF)r�)r��srFrFrGr��sz-CSSParser.parse_selectors.<locals>.<listcomp>)0r�r�boolr�r�rr�FLG_HTML�FLG_DEFAULT�FLG_INDETERMINATE�FLG_IN_RANGE�FLG_OUT_OF_RANGE�FLG_PLACEHOLDER_SHOWNr��printrm�nextr�rOr�r�r�rrrrrrDrrr�r�rr��
StopIterationr�r�r�r�r�r�ZSEL_DEFAULTr?ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr�)r|r�rpr?r�r�r��closedr�r�Zis_openrZis_relative�is_notr�Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownrRrYrFrFrGr�`s








��
��


�
�
�	zCSSParser.parse_selectorsc		csjt�|�}|r|�d�nd}t�|�}|r8|�d�dn
t|�d}|jrXtd�|��||k�rVd}|j	D]f}|�
|j�s~ql|�||�}|rl|�
�}|jr�td�||�d�|�d���|�d�}||fVq�ql|dkrX||}|dkr�d�|�}nN|dk�rd	�|�}n8|d
k�r$d�|�}n"|dk�r:d
�|�}nd�||�}t||j|��qX|j�rftd�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�rlr�r%rO�
css_tokensr�r?rNr�rVrrD)	r|rDrYrpr��vr/rq�msgrFrFrG�
selector_iter�sB








zCSSParser.selector_itercCs|�|�|j�||�S)zProcess selectors.)r�r1rD)r|rpr?rFrFrGrC#szCSSParser.process_selectors)Nr)rr)rr)&r�r�r�r�rs�PAT_PSEUDO_CLOSEr��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.r}r�r�r�r�rr�rrrrrrr�r1rCrFrFrFrGrB�sJ��	�
JX;
*
+rBzhtml|*:is(a, area, link)[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"]
    aA
    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][name!='']:not([checked])
    a�
    html|*:is(input[type!=hidden], button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input[type!=hidden], button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input[type!=hidden], button, select, textarea, fieldset)
    zw
    html|*:is(input[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])aM
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder][placeholder!='']:is(:not([value]), [value=""]),
    html|textarea[placeholder][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)_r�Z
__future__rrvrUrrrArr�rrXr�r�r�r�ZPSEUDO_SPECIALr��NEWLINErOZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESZ
IDENTIFIERZNTHZVALUEZATTRr<r=r>r?r9r�r8r2r:r;r4r5r6r7r@r3rwrxr\r]rryrr�r,r-rMr
rr�rrr rr!r�r"r#r$�	_MAXCACHE�	lru_cacherHrJr@rQrr�objectrsr�r�rBrCr�r�r�r�r�r�r�r�r�rr�r�r�r�rFrFrFrG�<module>s����
��	
���
�����
�




*E	�����

��
���
�������
��������
��
�