HEX
Server: LiteSpeed
System: Linux php-prod-1.spaceapp.ru 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64
User: sport3497 (1034)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/local/CyberCP/lib64/python3.10/site-packages/soupsieve/__pycache__/css_parser.cpython-310.pyc
o

�hw��@shdZddlmZddlZddlmZddlmZddlmZ	ddlm
Zdd	lmZddl
Z
dd
lmZmZmZmZdZhd�Zhd
�Zhd�Zhd�Zhd�ZeeBeBeBeBZdZde�d�ZdZde�de�d�Zde�d�Zde�de�d�Zde�de�d�Z de�de�d �Z!d!e�d"e�d#e �d$�Z"de�d%e�d&e"�d'e�d(e�d)�Z#d*e ��Z$d+e ��Z%d,e �d-e �d.�Z&d/e�d0e �d1e �de#��Z'd2e �d3e�d4�Z(d2e �d3e�d5�Z)d6e �d�Z*d7Z+e�d8�Z,d9e(��Z-d:e ��Z.d;e)�d<e!�d=e�d>e�d?e�e�d@e�d?e�e�dA�Z/dBe)�dCe!�dDe�dE�Z0e)�dFe"�de�dGe�d?e"�dHe�d8�Z1e)�dIe�d8�Z2e�dJe�dKe�d?�Z3e)�dFe"�de�dGe�d?e"�dHe�d8�Z4e�5dLe�dM�ej6�Z7e�5dLe�dNe�d�ej6�Z8e�5dOe�dPe�dQ�ej6�Z9e�5dRe"�dSe�dGe�dT�ej:�Z;e�5e�Z<e�5dUe�d?��Z=e�5e�dV��Z>e�5dUe*�dW�ej:�Z?dXZ@dYZAdZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLddZMeeMde�d�dpdq��ZNd�dsdt�ZOd�dvdw�ZPd�d�d|d}�ZQd�dd��ZRGd�d��d��ZSGd�d��d�eS�ZTGd�d��d��ZUGd�d��d��ZVeVd��jWeBeFBd��ZXeVd��jWeBeFBd��ZYeVd��jWeBeFBeEBd��ZZeVd��jWeBeFBeGBd��Z[eVd��jWeBeFBd��Z\eVd��jWeBeFBd��Z]eVd��jWeBeFBd��Z^eVd��jWeBeFBd��Z_eVd��jWeBeFBeKBd��Z`eVd��jWeBd��ZaeVd��jWeBeFBd��ZbeVd��jWeBeFBd��ZceVd��jWeBeIBeFBd��ZdeVd��jWeBeJBeFBd��ZeeVd��jWeBeFBd��ZfeVd��jWeBeFBd��ZgdS)�zCSS selector parser.�)�annotationsN)�	lru_cache�)�util)�	css_match)�	css_types)�SelectorSyntaxError)�Match�Any�Iterator�casti��>�:link�:open�:root�:empty�:muted�:scope�:checked�:default�:defined�:enabled�	:any-link�	:disabled�	:in-range�	:optional�	:required�
:read-only�:last-child�:only-child�:read-write�:first-child�
:last-of-type�
:only-of-type�
:out-of-range�:first-of-type�:indeterminate�:placeholder-shown>�:past�:focus�:hover�:active�:future�:paused�:target�:playing�:seeking�:stalled�:visited�	:autofill�
:buffering�:fullscreen�:local-link�
:focus-within�
:popover-open�
:user-invalid�:focus-visible�:target-within�:volume-locked�:picture-in-picture�:host�:current>�:matches�:is�:has�:not�:where�	:contains�:-soup-contains�:-soup-contains-own>�
:host-contextr=r>>�:dir�:lang�
:nth-child�:nth-of-type�:nth-last-child�:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|�)z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:�|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z8
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z>)+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z
*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|z)|[^\\'\r\n\f]+)*?'|z+)z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?z*\]z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)�&z*\)�:z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>�*z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*?(?P<relation>[,+>~]|z(?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n)z
*(?P<s2>[-+])z*(?P<b>[0-9]+))?z
(?:(?P<value>z)|(?P<split>z*))�^z*$�$�,� ����� �@��iii�)�maxsize�pattern�str�
namespaces�ct.Namespaces | None�custom�ct.CustomSelectors | None�flags�int�return�cm.SoupSievecCs(t|�}t�|t|||d���|||�S)zCached CSS compile.�rdrf)�process_custom�cm�	SoupSieve�	CSSParser�process_selectors)r`rbrdrf�custom_selectors�rq�G/usr/local/CyberCP/lib/python3.10/site-packages/soupsieve/css_parser.py�_cached_css_compile�s	��rs�NonecCst��dS)zPurge the cache.N)rs�cache_clearrqrqrqrr�_purge_cache�srv� dict[str, str | ct.SelectorList]cCsni}|dur5|��D]*\}}t�|�}t�|�dur"td|�d���||vr.td|�d���||t|�<q
|S)zProcess custom.Nz
The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)�itemsr�lower�	RE_CUSTOM�matchr�KeyError�css_unescape)rdrp�key�value�namerqrqrrrk�s
rkF�content�string�boolcCsddd�}|s	tnt�||�S)	zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    �m�
Match[str]rhracSst|�d�rt|�d�dd�d�}|dkrt}t|�}|S|�d�r-|�d�dd�}|S|�d�r6d}|Sd}|S)	z(Replace with the appropriate substitute.rNrZrrW����)�grouprg�UNICODE_REPLACEMENT_CHAR�chr)r��	codepointrrqrqrr�replace�s

�
��zcss_unescape.<locals>.replaceN)r�r�rhra)�
RE_CSS_ESC�RE_CSS_STR_ESC�sub)r�r�r�rqrqrrr}�s
r}�identcCsrg}t|�}|dko|ddk}|dkr|r|�d|���n�t|�D]�\}}t|�}|dkr5|�d�q#d|kr?dksDn|dkrO|�d|d�d	��q#|dksY|rp|dkrpd
|krcdkrpnn|�d|d�d	��q#|dvs�|d
ks�d
|kr�dks�nd
|kr�dks�nd|kr�dks�nd|kr�dkr�nn|�|�q#|�d|���q#d�|�S)zEscape identifier.r�-r�\r����xrV�0�9)�-�_r]�A�Z�a�zr�)�len�append�	enumerate�ord�join)r�r��length�
start_dash�index�cr�rqrqrr�escapes$,&D
r�c@s.eZdZdZddd�Zdd	d
�Zddd�ZdS)�SelectorPattern�Selector pattern.r�rar`rhrtcCs&||_t�|tjtjBtjB�|_dS)�Initialize.N)r��re�compile�I�X�U�
re_pattern)�selfr�r`rqrqrr�__init__2s zSelectorPattern.__init__cCs|jS)�	Get name.)r��r�rqrqrr�get_name8szSelectorPattern.get_name�selectorr�rgrf�Match[str] | NonecCs|j�||�S)�Match the selector.)r�r{)r�r�r�rfrqrqrrr{=szSelectorPattern.matchN)r�rar`rarhrt�rhra�r�rar�rgrfrgrhr���__name__�
__module__�__qualname__�__doc__r�r�r{rqrqrqrrr�/s


r�c@s.eZdZdZddd�Zdd	d
�Zddd�ZdS)�SpecialPseudoPatternr��patterns�Ctuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rhrtcCshi|_|D]}|d}|d||d�}|dD]}||j|<qqd|_t�ttjtjBtjB�|_dS)r�rr�rWrN)	r��matched_namer�r��PAT_PSEUDO_CLASS_SPECIALr�r�r��re_pseudo_name)r�r��pr�r`�pseudorqrqrrr�Fs� zSpecialPseudoPattern.__init__racCs|jdurdS|j��S)r�Nr�)r�r�r�rqrqrrr�SszSpecialPseudoPattern.get_namer�r�rgrfr�cCsVd}|j�||�}|r)t�t|�d���}|j�|�}|r)|�|||�}|r)||_|S)r�Nr�)	r�r{rryr}r�r��getr�)r�r�r�rfr�r�r�r`rqrqrrr{XszSpecialPseudoPattern.matchN)r�r�rhrtr�r�r�rqrqrqrrr�Cs



r�c@s<eZdZdZddd�Zddd�Zddd�Zddd�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.
    �kwargsr
rhrtcKs�|�dd�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�d	d�|_|�d
g�|_	|�dg�|_
|�dd
�|_|�dd�|_dS)r��tagN�ids�classes�
attributes�nth�	selectors�	relations�rel_type�contains�langrfr�no_matchF)
r�r�r�r�r�r�r�r�r�r�r�rfr�)r�r�rqrqrrr�qsz_Selector.__init__r��list[_Selector]�ct.SelectorListcCs8|r|d}|j�|dd��t�|��g�St��S)zFreeze relation.rrN)r��extend�ct�SelectorList�freeze)r�r��selrqrqrr�_freeze_relations�s
z_Selector._freeze_relations�ct.Selector | ct.SelectorNullc
Csd|jrt��St�|jt|j�t|j�t|j�t|j	�t|j
�|�|j�|j
t|j�t|j�|j�S)zFreeze self.)r�r��SelectorNull�Selectorr��tupler�r�r�r�r�r�r�r�r�r�rfr�rqrqrrr��s
�z_Selector.freezeracCsfd|j�d|j�d|j�d|j�d|j�d|j�d|j�d|j�d	|j�d
|j	�d|j
�d|j�d
�S)zString representation.z_Selector(tag=z, ids=z
, classes=z
, attributes=z, nth=z, selectors=z, relations=z, rel_type=z, contains=z, lang=z, flags=z, no_match=rN)r�r�r�r�r�r�r�r�r�r�rfr�r�rqrqrr�__str__�s$"���������z_Selector.__str__N)r�r
rhrt)r�r�rhr�)rhr�r�)	r�r�r�r�r�r�r�r��__repr__rqrqrqrrr�hs





r�c@sReZdZdZede�eddeefddeefdde	efd	d
e
efddeeff�ed
e�ede
�ede�ede�ede�ede�ede�ede�ede�ede�fZ		dWdXd!d"�ZdYd)d*�ZdYd+d,�ZdYd-d.�ZdZd3d4�Zd[d5d6�Zd\d9d:�Zd]d?d@�Zd^dEdF�ZdYdGdH�Z dYdIdJ�Z!dYdKdL�Z"dYdMdN�Z#		d_d`dPdQ�Z$dadSdT�Z%d_dbdUdV�Z&dS)crnzParse CSS selectors.�pseudo_close�pseudo_contains)rDrErF�pseudo_nth_child)rJrL�pseudo_nth_type)rKrM�pseudo_lang)rI�
pseudo_dir)rH�pseudo_class_custom�pseudo_class�pseudo_element�amp�at_rule�id�classr��	attribute�combineNrr�rard�'dict[str, str | ct.SelectorList] | NonerfrgrhrtcCs>|�dd�|_||_|jtj@|_|duri|_dS||_dS)r��r�N)r�r`rfr�DEBUG�debugrd)r�r�rdrfrqrqrrr��szCSSParser.__init__r�r�r�r��has_selectorr�cCsPd}|�d�}|�d�rt�|�d��nd}|�d�r&t|�d�dd��nd}t|�d��}d}	d}
d}|rD|d	kr>tjnd
tjB}nt�|�dkrTtjtjB}d}	ntj}|ru|�d
��d�rnt|�d
�dd�d�}nt|�d
��}|szd}
nr|�d�r�t�dt�	|�|�}
na|�d�r�t�dt�	|�|�}
nP|�d�r�t�dt�	|�|�}
n?|�d�r�|r�t
�|�r�dnt�	|�}t�d||�}
n#|�d�r�t�dt�	|�|�}
nt�dt�	|�|�}
|�d�r�d}|	r�|
r�t�|
j�}
t
�|||
|
�}|�rt�}|j�|�t
�|��gdd�}|j�|�d}|S|j�|�d}|S)z8Create attribute selector from the returned regex match.F�cmp�caseN�attr_ns���r��	attr_name�ir�typeTr��"�'rrSz^%s.*rTz.*?%s$rRz.*?%s.*�~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rOz^%s(?:-.*)?$z^%s$�!)r�rryr}r�r��DOTALL�
startswithr�r��RE_WS�searchr`r��SelectorAttributer�r�r�r�r�r�)r�r�r�r��inverse�opr��ns�attr�is_type�pattern2rrfr`�sel_attr�sub_sel�not_listrqrqrr�parse_attribute_selector�s^
$





�z"CSSParser.parse_attribute_selectorcCsH|�d�rt|�d�dd��nd}t|�d��}t�||�|_d}|S)z#Parse tag pattern from regex match.�tag_nsNr��tag_nameT)r�r}r��SelectorTagr�)r�r�r�r��prefixr�rqrqrr�parse_tag_patterns
$zCSSParser.parse_tag_patterncCs�t�t|�d���}|j�|�}|dur'td|�d|�d���|j|�d���t	|t
j�sC|j|=t||j|j
d�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�NzUndefined custom selector 'z' found at position rrj�rfT)rryr}r�rdr�r�endr`�
isinstancer�r�rnrfro�
FLG_PSEUDOr�r�)r�r�r�r�r�r�rqrqrr�parse_pseudo_class_custom's&�
��
z#CSSParser.parse_pseudo_class_custom�	iselector� Iterator[tuple[str, Match[str]]]�is_html�tuple[bool, bool]cCsd}t�t|�d���}|�d�rd}|r)|tvr)|�|||||�d��}||fS|�s�|tv�r�|dkr?|jt	j
O_�nu|dkrO|jt	jO_d}�ne|dkr]|jt	jO_�nW|d	krk|jt	j
O_�nI|d
vrw|j�t��n=|dkr�|j�t��n1|dkr�|j�t��n%|d
kr�|j�t��n|dkr�|j�t��n
|dkr�|j�t��n|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dk�r|j�t�n�|dk�r
|j�t�n�|dk�r|j�t�n�|dk�r/|j�t	� dddddt	�!���n�|dk�rE|j�t	� dddddt	�!���no|dk�r[|j�t	� dddddt	�!���nY|dk�rq|j�t	� dddddt	�!���nC|dk�r�|j�"t	� dddddt	�!��t	� dddddt	�!��g�n!|dk�r�|j�"t	� dddddt	�!��t	� dddddt	�!��g�d}||fS|�r�|t#v�r�|�$||�d�t%t&B�d|_'d}||fS|�s�|t(v�r�d|_'d}||fS|t)v�r�t*d |�d!�|j+|�,d���t*d!|�d"�|j+|�,d���)#zParse pseudo class.Fr��openTrrrrr)r
rrrr%rrrrrrrrrr#r&r rrr$r!rr"z!Invalid syntax for pseudo class 'rz�' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)-rryr}r��PSEUDO_COMPLEX�parse_pseudo_openr�
PSEUDO_SIMPLErfr��SEL_ROOT�SEL_DEFINED�	SEL_SCOPE�	SEL_EMPTYr�r��CSS_LINK�CSS_CHECKED�CSS_DEFAULT�CSS_INDETERMINATE�CSS_DISABLED�CSS_ENABLED�CSS_REQUIRED�	CSS_MUTED�CSS_OPEN�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`�start)r�r�r�r�rr �complex_pseudor�rqrqrr�parse_pseudo_classCs�

U�



"
"
"
"
��
����
�
�
�zCSSParser.parse_pseudo_classcCs0|��}|�d�rd}nd}t�t|d��|d<t�|�d|��}|dkr.d}d}	d	}
nq|d
kr9d}d}	d	}
nftttt�	|��}|�
d�rQ|�
d�d
krQd
nd}|�
d�}
|
�d�}
|
�d�rg|d7}n|
rr||
dd�7}n||
7}|�
d�r�|�
d�d
kr�d
nd}|�
d�r�||�
d�7}nd}t
|d�}t
|d�}	|d}|dkr�|�
d�r�|�||�d�ttB�}nt}|dkr�|j�t�||
|	dd|��d	}|S|dkr�|j�t�||
|	dd	|��d	}|S|dkr�|j�t�||
|	d	dt����d	}|S|dk�r|j�t�||
|	d	d	t����d	}|S)zParse `nth` pseudo.r��_child�_typer�r��evenrWrT�oddr�s1r�r��a�n�1Nr��s2�b�0�
�ofrJFrLrKrM)�	groupdictr�rryr}rr	ra�RE_NTHr{r��endswithrrgr;rrr<�CSS_NTH_OF_S_DEFAULTr�r�r�r9r�)r�r�r�r�r�mdict�postfixr�rFrJ�var�	nth_parts�_s1rG�_s2�
pseudo_sel�nth_selrqrqrr�parse_pseudo_nth�sd	
 



 



�� 
� zCSSParser.parse_pseudo_nthr�r�cCsZttB}|dkr
|tO}n|dkr|tO}n|dvr|tO}|j�|�|||��d}|S)z"Parse pseudo with opening bracket.rBrA)rCr@T)rr<�FLG_NOT�FLG_RELATIVE�FLG_FORGIVEr�r�r;)r�r�r�r�rr�rfrqrqrrr$�s


zCSSParser.parse_pseudo_openr�r�r��tuple[bool, _Selector, str]cCs�|�d���}|st}|tkr%||_|dj�|�dt}|�t��n$|r3||_|dj�|�n|dd�tkrEtd|��|j	|��d|}t�}d}|||fS)�Parse combinator tokens.�relationr�rQrNz%The multiple combinators at position F)
r��strip�
WS_COMBINATOR�COMMA_COMBINATORr�r�r�r�rr`)r�r�r�r�r�r�r��
combinatorrqrqrr�parse_has_combinators*�
zCSSParser.parse_has_combinatorr��	is_pseudo�
is_forgive�tuple[bool, _Selector]c	
Cs�|�d���}	|	st}	|s3|r|	tkr!td|	�d|�d�|j|��|	tkr2d|_|dd�=|�|�n4|	tkrT|jsC|sCt	�
dd�|_|j�|�|�|�|dd�=n|j�|�|	|_
|dd�=|�|�t�}d}||fS)	r`razThe combinator 'z' at position z , must have a selector before itTNrRF)r�rbrcrdrr`r�r�r�r�rr�r�r�r�)
r�r�r�r�r�r�rgrhr�rerqrqrr�parse_combinator,s8
�

�



zCSSParser.parse_combinatorcCsT|�d�}|�d�r|j�t|dd���d}|S|j�t|dd���d}|S)zParse HTML classes and ids.r�.rNT)r�rr�r�r}r�)r�r�r�r�r�rqrqrr�parse_class_id\s

�zCSSParser.parse_class_idc
Cs�t�t|�d���}|dkrt�dt�|dk}t|�d��}g}t�|�D]%}|�d�r.q&|�d�}	|	�	d�rBt|	d	d
�d�}	nt|	�}	|�
|	�q&|j�
t�
||��d}|S)zParse contains.r�rDz\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rF�values�splitr)rrrr�T)rryr}r��warnings�warn�
FutureWarning�	RE_VALUES�finditerrr�r�r��SelectorContains)
r�r�r�r�r��contains_ownrmr��tokenrrqrqrr�parse_pseudo_containsgs(�


zCSSParser.parse_pseudo_containscCs~|�d�}g}t�|�D]%}|�d�rq|�d�}|�d�r(t|dd�d�}nt|�}|�|�q|j�t�|��d}|S)zParse pseudo language.rmrnrrrr�T)	r�rrrsrr}r�r�r��SelectorLang)r�r�r�r�rmr�rvrrqrqrr�parse_pseudo_lang�s



zCSSParser.parse_pseudo_langcCs6t�|�d��dkr
tjntj}|j|O_d}|S)zParse pseudo direction.�dir�ltrT)rryr�r��SEL_DIR_LTR�SEL_DIR_RTLrf)r�r�r�r�rrqrqrr�parse_pseudo_dir�s zCSSParser.parse_pseudo_dirr�c
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@�}t|t
@�}|jr�|rZtd�|
r`td�|rftd�|
rltd�|rrtd�|rxtd�|r~td	�|r�td
�|r�td�|r�td�|r�td
�|r�|�t���z	t|�\}}|dkr�td|�d�����|dkr�|jtjO_d}n�|dkr�|�|||�}n�|dkr�|�|||||�\}}n�|dkr�td|�d�����|dkr�|�|||�}n�|dv�r|�||||�}n�|dk�r|�|||�}n�|dk�r$|�|||�}d}n�|dk�rX|�sB|�s?td|�d���|j|�d���d|_|
�rHd}nutd|�d���|j|�d���|dk�r}|�rn|� |||||	|�\}}}	nI|�!||||||||�\}}n:|dk�r�|�"|||�}n-|d k�r�|�r�td!|�d��d"�|j|�d���|�#|||�}n|d#v�r�|�$|||�}|�%d�}q�Wn
t&�y�Ynw|
�r�|�s�td$|��|j|��|�r
|j'�s�|�s�t�(d%d&�|_'|�r�|	|_)|d'j*�|�n)|j*�+|�|d&d&�=|�|�n|�r"|�r|�s"d|_|d&d&�=|�|�d}|�s/td|��|j|��|�r8tj,|d'_|�rAtj-|d'_|�rJtj.|d'_|�rStj/|d'_|�r\tj0|d'_t�1d(d)�|D�|
|�S)*zParse selectors.FrQz    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: TrueTr�zAt-rules found at position rr�r�r�r�z!Pseudo-element found at position r�)r�r�r�r�r�z Expected a selector at position z)Unmatched pseudo-class close at position r�r�r�zTag name found at position z instead of at the start)r�r�z"Unclosed pseudo-class at position rRNr�cSsg|]}|���qSrq)r�)�.0�srqrqrr�
<listcomp>Rsz-CSSParser.parse_selectors.<locals>.<listcomp>)2r�rcr�r<rr]r\�FLG_HTML�FLG_DEFAULT�FLG_INDETERMINATE�FLG_IN_RANGE�FLG_OUT_OF_RANGE�FLG_PLACEHOLDER_SHOWNr^r��printr��next�NotImplementedErrorr?rfr�r(rrArwr[ryr~rr`r�rfrjrrrlr�
StopIterationr�rr�r�r��SEL_DEFAULT�SEL_INDETERMINATE�SEL_IN_RANGE�SEL_OUT_OF_RANGE�SEL_PLACEHOLDER_SHOWNr�)r�rr�rfr�r�r��closedr�r��is_openrg�is_relative�is_notr �
is_default�is_indeterminate�is_in_range�is_out_of_range�is_placeholder_shownrhr~r�rqrqrrr;�s"	



��
�
�

�

�$��


�	zCSSParser.parse_selectorsr`c	
csn�t�|�}|r
|�d�nd}t�|�}|r|�d�dnt|�d}|jr-td|���||kr�d}|jD]2}|�	|||j
�}|rh|��}|jr\td|�d|�d��d|�d����|�d�}||fVnq6|dur�||}|dkr{d	|��}n&|d
kr�d|��}n|dkr�d
|��}n|dkr�d|��}nd|�d|��}t
||j|��||ks1|jr�td�dSdS)zIterate selector tokens.rrz## PARSING: NzTOKEN: 'z' --> z
 at position �[z)Malformed attribute selector at position rkz%Malformed class selector at position �#z"Malformed id selector at position rQz,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)�RE_WS_BEGINrr�	RE_WS_ENDr?r�r�r��
css_tokensr{rfr�r�rr`)	r�r`r�r�r�vr�r��msgrqrqrr�
selector_iterTsF�


&

���zCSSParser.selector_itercCs|�|�|j�||�S)zProcess selectors.)r;r�r`)r�r�rfrqrqrrro}szCSSParser.process_selectors)Nr)r�rardr�rfrgrhrt)r�r�r�r�r�r�rhr�)r�r�r�r�r�r�rrr r�rhr!)
r�r�r�r�r�r�rrrhr�)r�r�r�rar�r�rrr�rgrhr�)r�r�r�r�r�r�r�r�r�rar�rgrhr_)r�r�r�r�r�r�r�r�r�r�rgr�rhr�r�rgrhri)rr)rrr�rgrfrgrhr�)r`rarhr)r�rgrfrgrhr�)'r�r�r�r�r��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_AMP�PAT_AT_RULE�PAT_ID�	PAT_CLASS�PAT_TAG�PAT_ATTR�PAT_COMBINEr�r�rrrrAr[r$rfrjrlrwryr~r;r�rorqrqrqrrrn�s^�



����

F
	

f
A

+
0


�
8)rnzhtml|*:is(a, area)[href]rz\
    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]
    )
    z*
    html|*:is(details, dialog)[open]
    z(
    html|*:is(video, audio)[muted]
    )
r`rarbrcrdrerfrgrhri)rhrt)rdrerhrw)F)r�rar�r�rhra)r�rarhra)hr��
__future__rr��	functoolsrr�rrrlrr�rro�typingr	r
rrr�r%r=r#r:�PSEUDO_SPECIALr>�NEWLINE�WS�COMMENTS�WSC�CSS_ESCAPES�CSS_STRING_ESCAPES�
IDENTIFIER�NTH�VALUE�ATTRr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rPr�rrrr�r�rzrdrcrr\r]r�r�r�r<r�r�r�r^�	_MAXCACHErsrvrkr}r�r�r�r�rnror*r+r,r-r.r/r0r3r8rRr5r4r6r7r2r1rqrqrqrr�<module>sz	��$




������������(("



%D`�����
�����
���������������������
�