� L�g���� �dZddlmZddlZddlmZddlmZddlmZ ddlm Z dd lm Z ddl Z dd lmZmZmZmZd Zhd �Zhd �Zhd�Zhd�Zhd�ZeezezezezZdZde�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� Z4ej5dLe�dM�ej6��Z7ej5dLe�dNe�d�ej6��Z8ej5dOe�dPe�dQ�ej6��Z9ej5dRe"�dSe�dGe�dT�ej:��Z;ej5e��Z<ej5dUe�d?���Z=ej5e�dV���Z>ej5dUe*�dW�ej:��Z?dXZ@dYZAdZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLddZMeeM�e��d�dp���ZNd�dr�ZOd�dt�ZPd�d�dy�ZQd�d{�ZRGd|�d}��ZSGd~�deS��ZTGd��d���ZUGd��d���ZVeVd����WeBeFz����ZXeVd����WeBeFz����ZYeVd����WeBeFzeEz����ZZeVd����WeBeFzeGz����Z[eVd����WeBeFz����Z\eVd����WeBeFz����Z]eVd����WeBeFz����Z^eVd����WeBeFz����Z_eVd����WeBeFzeKz����Z`eVd����WeB����ZaeVd����WeBeFz����ZbeVd����WeBeFz����ZceVd����WeBeIzeFz����ZdeVd����WeBeJzeFz����ZedS)�zCSS selector parser.�)� annotationsN)� lru_cache�)�util)� css_match)� css_types)�SelectorSyntaxError)�Match�Any�Iterator�casti��>�:link�:root�:empty�: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�:visited� :local-link� :focus-within� :user-invalid�:focus-visible�:target-within�:host�:current>�:matches�:is�:has�:not�:where� :contains�:-soup-contains�:-soup-contains-own>� :host-contextr4r5>�: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.SoupSievec��t|��}tj|t|||������|||��S)zCached CSS compile.�r[r])�process_custom�cm� SoupSieve� CSSParser�process_selectors)rWrYr[r]�custom_selectorss �d/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/soupsieve/css_parser.py�_cached_css_compilerj�s[��&�f�-�-�� �<��� �#�� � � � � � � ��� � � � ��Nonec�8�t���dS)zPurge the cache.N)rj� cache_clear�rkri� _purge_cacherp�s���#�#�%�%�%�%�%rk� dict[str, str | ct.SelectorList]c��i}|��|���D]o\}}tj|��}t�|���t d|�d����||vrt d|�d����||t|��<�p|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)r[rh�key�value�names rircrc�s����� �� �,�,�.�.� 9� 9�J�C���:�c�?�?�D����t�$�$�,�)�*f�t�*f�*f�*f�g�g�g��'�'�'��Z�t�Z�Z�Z�[�[�[�38� �\�$�/�/� 0� 0� �rkF�content�string�boolc�R�dd�}|stnt�||��S)zs Unescape CSS value. Strings allow for spanning the value on multiple strings by escaping a new line. �m� Match[str]r_rXc�Z�|�d��rHt|�d��dd�d��}|dkrt}t|��}nM|�d��r|�d��dd�}n|�d��rd}nd}|S) z(Replace with the appropriate substitute.rNrQrrN����)�groupr^�UNICODE_REPLACEMENT_CHAR�chr)r�� codepointrzs ri�replacezcss_unescape.<locals>.replace�s��� �7�7�1�:�:� ��A�G�G�A�J�J�q�r�r�N�B�/�/�I��A�~�~�4� �� �N�N�E�E� �W�W�Q�Z�Z� ��G�G�A�J�J�q�r�r�N�E�E� �W�W�Q�Z�Z� ��E�E��E�� rk)r�r�r_rX)� RE_CSS_ESC�RE_CSS_STR_ESC�sub)r|r}r�s rirxrx�s7������"%� 8�J�J�.� =� =�g�w� O� O�Ork�identc���g}t|��}|dko |ddk}|dkr|r|�d|�����n t|��D�]\}}t|��}|dkr|�d���1d|cxkrdksn|dkr|�d|d�d ����a|dks|r1|dkr+d |cxkrd krnn|�d|d�d �����|d vsC|d ks=d |cxkrd ks0nd |cxkrd ks!nd|cxkrdksnd|cxkrdkrnn|�|����|�d|������d�|��S)zEscape identifier.r�-r�\r����xrM�0�9)�-�_rT�A�Z�a�zr�)�len�append� enumerate�ord�join)r�r}�length� start_dash�index�cr�s ri�escaper� s���F� ��Z�Z�F��!��/��a��C��J� ��{�{�z�{�� � �l�5�l�l�#�#�#�#�!�%�(�(� (� (�H�E�1��A���I��D� � �� � �h�'�'�'�'��)�+�+�+�+�t�+�+�+�+� �T�0A�0A�� � �1�9�1�1�1�1�2�2�2�2��1�*�*��*��� � �$�)�B[�B[�B[�B[�W[�B[�B[�B[�B[�B[�� � �1�9�1�1�1�1�2�2�2�2��\�)�)�Y�$�->�->�4�9�C\�C\�C\�C\�X\�C\�C\�C\�C\���*�*�*�*�d�*�*�*�*�� �0I�0I�0I�0I�T�0I�0I�0I�0I�t�W`�Oh�Oh�Oh�Oh�dh�Oh�Oh�Oh�Oh�Oh�� � �a� � � � �� � �h�1�h�h�'�'�'�'� �7�7�6�?�?�rkc�*�eZdZdZdd�Zdd�Zdd�ZdS)�SelectorPattern�Selector pattern.r{rXrWr_rlc��||_tj|tjtjztjz��|_dS)� Initialize.N)r{�re�compile�I�X�U� re_pattern)�selfr{rWs ri�__init__zSelectorPattern.__init__(s1���� ��*�W�b�d�R�T�k�B�D�.@�A�A����rkc��|jS)� Get name.)r{�r�s ri�get_namezSelectorPattern.get_name.s ���y�rk�selectorr�r^r]�Match[str] | Nonec�8�|j�||��S)�Match the selector.)r�rv)r�r�r�r]s rirvzSelectorPattern.match3s����$�$�X�u�5�5�5rkN)r{rXrWrXr_rl�r_rX�r�rXr�r^r]r^r_r���__name__� __module__� __qualname__�__doc__r�r�rvrorkrir�r�%sZ��������B�B�B�B� ���� 6�6�6�6�6�6rkr�c�*�eZdZdZdd�Zdd�Zdd�ZdS)�SpecialPseudoPatternr��patterns�Ctuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]r_rlc��i|_|D]7}|d}|d||d��}|dD] }||j|<� �8d|_tjttjtjztjz��|_dS)r�rr�rNrN) r�� matched_namer�r��PAT_PSEUDO_CLASS_SPECIALr�r�r��re_pseudo_name)r�r��pr{rW�pseudos rir�zSpecialPseudoPattern.__init__<s����� �� 0� 0�A��Q�4�D��a��d�4��1��&�&�G��A�$� 0� 0��(/�� �f�%�%� 0�!��� �j�)A�2�4�"�$�;�QS�QU�CU�V�V����rkrXc�F�|j�dn|j���S)r�Nr�)r�r�r�s rir�zSpecialPseudoPattern.get_nameIs%���&�.�r�r�D�4E�4N�4N�4P�4P�Prkr�r�r^r]r�c�$�d}|j�||��}|rptjt |�d������}|j�|��}|r |�|||��}|r||_|S)r�Nr{) r�rvrrtrxr�r��getr�)r�r�r�r]r�r�r{rWs rirvzSpecialPseudoPattern.matchNs����� � � %� %�h�� 6� 6�� � 0��:�l�1�7�7�6�?�?�;�;�<�<�D��m�'�'��-�-�G�� 0� ���x���>�>���0�(/�D�%�� rkN)r�r�r_rlr�r�r�rorkrir�r�9s^�������� W� W� W� W�Q�Q�Q�Q� � � � � � rkr�c�6�eZdZdZdd�Zdd �Zdd �Zdd�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 r_rlc ��|�dd��|_|�dg��|_|�dg��|_|�dg��|_|�dg��|_|�dg��|_|�dg��|_|�d d��|_|�d g��|_ |�d g��|_ |�d d ��|_ |�dd��|_ dS)r��tagN�ids�classes� attributes�nth� selectors� relations�rel_type�contains�langr]r�no_matchF) r�r�r�r�r�r�r�r�r�r�r�r]r�)r�r�s rir�z_Selector.__init__gs���:�:�e�T�*�*����:�:�e�R�(�(����z�z�)�R�0�0�� � �*�*�\�2�6�6����:�:�e�R�(�(������K��4�4������K��4�4���� � �:�t�4�4�� �� � �:�r�2�2�� ��J�J�v�r�*�*�� ��Z�Z���+�+�� �� � �:�u�5�5�� � � rkr��list[_Selector]�ct.SelectorListc���|rQ|d}|j�|dd���tj|���g��Stj��S)zFreeze relation.rrN)r��extend�ct� SelectorList�freeze)r�r��sels ri�_freeze_relationsz_Selector._freeze_relationsws[�� � %��A�,�C� �M� � ��1�2�2�� /� /� /��?�C�J�J�L�L�>�2�2� 2��?�$�$� $rk�ct.Selector | ct.SelectorNullc��|jrtj��Stj|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�r]r�s rir�z_Selector.freeze�s��� �=� ��?�$�$� $��;����d�h����d�l�#�#��d�o�&�&��d�h����d�n�%�%��&�&�t�~�6�6�� ��d�m�$�$��d�i� � �� � � � rkrXc���d|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=rE) r�r�r�r�r�r�r�r�r�r�r]r�r�s ri�__str__z_Selector.__str__�s��� +�T�X� +� +�t�x� +� +�T�\� +� +�bf�bq� +� +��8� +� +�+/�>� +� +�IM�� +� +�� � +� +�48�M� +� +�LP�I� +� +�ae�ak� +� +�� � +� +� +� rkN)r�r r_rl)r�r�r_r�)r_r�r�) r�r�r�r�r�r�r�r��__repr__rorkrir�r�^so��������6�6�6�6� %�%�%�%�����( � � � ��H�H�Hrkr�c���eZdZdZede��eddeefddeefdde efd d e efd d e eff��ed e ��ede ��ede��ede��ede��ede��ede��ede��ede��ede��f Z dGdHd!�ZdId(�ZdId)�ZdId*�ZdJd/�ZdKd0�ZdLd3�ZdMd8�ZdNd=�ZdId>�Z dId?�Z!dId@�Z"dIdA�Z# dOdPdC�Z$dQdE�Z%dOdRdF�Z&dS)SrfzParse CSS selectors.� pseudo_close�pseudo_contains)r;r<r=�pseudo_nth_child)rArC�pseudo_nth_type)rBrD� pseudo_lang)r@� pseudo_dir)r?�pseudo_class_custom� pseudo_class�pseudo_element�amp�at_rule�id�classr�� attribute�combineNrr�rXr[�'dict[str, str | ct.SelectorList] | Noner]r^r_rlc��|�dd��|_||_|jtjz|_|�in||_dS)r��r�N)r�rWr]r�DEBUG�debugr[)r�r�r[r]s rir�zCSSParser.__init__�sE�� �'�'���9�9�� ��� ��Z�$�*�,�� �"�N�b�b��� � � rkr�r�r�r�� has_selectorr~c��d}|�d��}|�d��r'tj|�d����nd}|�d��r*t|�d��dd���nd}t|�d����}d} d} d} |r"|d kr tjnd tjz} n@tj|��d krtjtjz} d } n tj} |rv|�d ���d��r,t|�d ��dd�d ��} n"t|�d ����} |sd} �n�|�d��r,t jdt j | ��z| ��} �nb|�d��r,t jdt j | ��z| ��} �n!|�d��r+t jdt j | ��z| ��} n�|�d��rK| rt� | ��rdnt j | ��} t jd| z| ��} n�|�d��r+t jdt j | ��z| ��} nAt jdt j | ��z| ��} |�d��rd }| r| rt j| j ��} tj||| | ��}|rlt��}|j�|��tj|���gd d��}|j�|��n|j�|��d }|S)z8Create attribute selector from the returned regex match.F�cmp�caseN�attr_ns�����r�� attr_name�ir�typeTrz��"�'rrJz^%s.*rKz.*?%s$rIz.*?%s.*�~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rFz ^%s(?:-.*)?$z^%s$�!)r�rrtrxr�r��DOTALL� startswithr�r��RE_WS�searchrWr��SelectorAttributer�r�r�r�r�r�)r�r�r�r�inverse�opr�ns�attr�is_type�pattern2rzr]rW�sel_attr�sub_sel�not_lists ri�parse_attribute_selectorz"CSSParser.parse_attribute_selector�s����� �W�W�U�^�^��./�g�g�f�o�o�G�t�z�!�'�'�&�/�/�*�*�*�4��67�g�g�i�6H�6H� P�\�!�'�'�)�,�,�S�b�S�1� 2� 2� 2�b���A�G�G�K�0�0�1�1�������� � �!�S�[�[�R�T�T�a�2�9�<�E�E� �Z�� � �� '� '��D�2�9�$�E��G�G��I�E� � 7��w�w�w���*�*�:�6�6� 7�$�Q�W�W�W�%5�%5�a��d�%;�T�B�B���$�Q�W�W�W�%5�%5�6�6��� ��G�G� �]�]�3� � � ��j��B�I�e�,<�,<�!<�e�D�D�G�G� �]�]�3� � � ��j��R�Y�u�-=�-=�!=�u�E�E�G�G� �]�]�3� � � ��j��b�i��.>�.>�!>��F�F�G�G� �]�]�3� � � �',�X�u�|�|�E�/B�/B�X�J�J�� �RW�HX�HX�E��j�![�^c�!c�ej�k�k�G�G� �]�]�3� � � ��j��2�9�U�3C�3C�!C�U�K�K�G�G��j��2�9�U�+;�+;�!;�U�C�C�G��}�}�S�!�!� ��� � 3�w� 3��z�'�/�2�2�H��'��b�'�8�D�D�� � ,��k�k�G� � � %� %�h� /� /� /������(8�(8�'9�4��G�G�H� �M� � �� *� *� *� *� �N� !� !�(� +� +� +�� ��rkc��|�d��r*t|�d��dd���nd}t|�d����}tj||��|_d}|S)z#Parse tag pattern from regex match.�tag_nsNr �tag_nameT)r�rxr�� SelectorTagr�)r�r�r�r�prefixr�s ri�parse_tag_patternzCSSParser.parse_tag_patternst��:;����9J�9J�T��a�g�g�h�/�/����4�5�5�5�PT���1�7�7�:�.�.�/�/���.��f�-�-���� ��rkc�$�tjt|�d������}|j�|��}|�Bt d|�d|�d����|j|�d�����t|tj ��sG|j|=t||j|j ����t���}||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 rrb�r]T)rrtrxr�r[r�r �endrW� isinstancer�r�rfr]rg� FLG_PSEUDOr�r�)r�r�r�rr�r�s ri�parse_pseudo_class_customz#CSSParser.parse_pseudo_class_customs����L�������9�9�:�:���;�?�?�6�*�*�� � �%�T�f�T�T�!�%�%�PQ�(�(�T�T�� ����a����� � �(�B�O�4�4� +�� �F�#� ����D�J������j��1�1� �#+�D�K�� � � ���X�&�&�&�� ��rk� iselector� Iterator[tuple[str, Match[str]]]�is_html�tuple[bool, bool]c �� �d}tjt|�d������}|�d��rd}|r7|tvr.|�|||||�d����}�nc|�s�|tv�r�|dkr|xjtj zc_�nm|dkr|xjtj zc_d}�nI|dkr|xjtj zc_�n'|d kr|xjtj zc_�n|d vr!|j�t ���n�|d kr!|j�t"���n�|d kr!|j�t$���n�|d kr!|j�t&���nk|dkr!|j�t(���nD|dkr!|j�t*���n|dkr!|j�t,���n�|dkr!|j�t.���n�|dkr!|j�t0���n�|dkr!|j�t2���n�|dkr!|j�t4���nZ|dkr!|j�t6���n3|dkr!|j�t8���n |dkrD|j�tjdddddtj�������n�|dkrD|j�tjdddddtj�������nx|dkrD|j�tjdddddtj�������n.|dkrC|j�tjdddddtj������n�|dkrm|j� tjdddddtj����tjdddddtj����g��nr|dkrl|j� tjdddddtj����tjdddddtj����g��d}n�|rJ|tBvrA|�"||�d��tFtHz��d|_%d}nx|s|tLvr d|_%d}nc|tNvr-tQd|�d�|j)|�*d�����tQd|�d �|j)|�*d�����||fS)!zParse pseudo class.Fr{�openTrrrrr)rrrrr$rrrrrrrr"r%rrrr#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.)+rrtrxr��PSEUDO_COMPLEX�parse_pseudo_openr*� PSEUDO_SIMPLEr]r��SEL_ROOT� SEL_DEFINED� SEL_SCOPE� SEL_EMPTYr�r��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_SUPPORTEDr rW�start)r�r�r�rr.r0�complex_pseudor�s ri�parse_pseudo_classzCSSParser.parse_pseudo_class9s�������L�������9�9�:�:�� �7�7�6�?�?� "�!�N� �P �f��6�6��1�1�#�v�|�Y�XY�X]�X]�^_�X`�X`�a�a�L�L��N �F�m�$;�$;��� � �� � �R�[�(� � � ��:�%�%�� � �R�^�+� � �����8�#�#�� � �R�\�)� � � ��8�#�#�� � �R�\�)� � � ��1�1�1�� �$�$�X�.�.�.�.��:�%�%�� �$�$�[�1�1�1�1��:�%�%�� �$�$�[�1�1�1�1��+�+�+�� �$�$�%6�7�7�7�7��;�&�&�� �$�$�\�2�2�2�2��:�%�%�� �$�$�[�1�1�1�1��;�&�&�� �$�$�\�2�2�2�2��;�&�&�� �$�$�\�2�2�2�2��<�'�'�� �$�$�]�3�3�3�3��=�(�(�� �$�$�^�4�4�4�4��;�&�&�� �$�$�\�2�2�2�2��?�*�*�� �$�$�%5�6�6�6�6��/�/�/�� �$�$�%:�;�;�;�;��>�)�)�����r�~�a���5�%���IZ�IZ�[�[�\�\�\�\��=�(�(�����r�~�a���5�$���HY�HY�Z�Z�[�[�[�[��+�+�+�����r�~�a���4����HY�HY�Z�Z�[�[�[�[��?�*�*�����r�~�a���4��r��GX�GX�Y�Y�Z�Z�Z�Z��=�(�(�������q�%��E�5�"�/�BS�BS�T�T���q�%��E�4���AR�AR�S�S������ �?�*�*�������q�%��D�%���AR�AR�S�S���q�%��D�$���@Q�@Q�R�R�����  �L�L� � ��*A� A� A� � � ��A�E�E�!�H�H�j�8�6K� L� L� L��C�L��L�L�� �F�.D�$D�$D��C�L��L�L� �'� '� '�%�=�F�=�=�=�� ����� � ��� � &�n�F�n�n�n�� ����� � � �� ��W�$�$rkc ��|���}|�d��rd}nd}tjt |d����|d<tj|�d|z����}|dkrd}d} d } �nT|d krd}d } d } �nFt t tt� |����} | � d ��r| � d ��d krd nd} | � d��} | � d��} | � d��r| dz } n| r| | dd�z } n| | z } | � d��r| � d��d krd nd}| � d��r|| � d��z }nd}t| d��}t|d��} |d}|dkr�|� d��r8|�||�d��t t"z��}nt$}|dkr2|j�t+j|| | dd|����n�|dkr1|j�t+j|| | dd |����n�|dkrC|j�t+j|| | d dt+j������nH|dkrB|j�t+j|| | d d t+j������d }|S)zParse `nth` pseudo.r��_child�_typer{r��evenrNrT�oddr�s1r�r��a�n�1Nr �s2�b�0� �ofrAFrCrBrD)� groupdictr�rrtrxr r rX�RE_NTHrvr��endswithrr^rJr*r,rK�CSS_NTH_OF_S_DEFAULTr�r�r�rHr�)r�r�r�rr.�mdict�postfixr|rVrZ�var� nth_parts�_s1rW�_s2� pseudo_sel�nth_sels ri�parse_pseudo_nthzCSSParser.parse_pseudo_nth�s��� � � � �� �9�9�'� (� (� ��G�G��G�� �<��f� �#>�#>�?�?��f� ��*�U�Y�Y�u�w��7�7�8�8�� �f� � ��B��B��C�C� �� � ��B��B��C�C��U�3�Z����g�)>�)>�?�?�I�"����.�.�W�9�?�?�4�3H�3H�C�3O�3O�#�#�UW�C�����$�$�A��*�*�S�/�/�C��|�|�C� � � ��s� ���� ��q��"��v� ����q���"����.�.�W�9�?�?�4�3H�3H�C�3O�3O�#�#�UW�C����s�#�#� ��y���s�+�+�+������S�"���B��S�"���B��6�]� � �h� � ��w�w�t�}�}� /��.�.�y�!�%�%��(�(�J�QY�DY�Z�Z���/���\�)�)�����r�~�b�#�r�5�%��Q�Q�R�R�R�R��0�0�0�����r�~�b�#�r�5�$��P�P�Q�Q�Q���^�+�+�����r�~�b�#�r�4����HY�HY�Z�Z�[�[�[�[��2�2�2�����r�~�b�#�r�4��r��GX�GX�Y�Y�Z�Z�Z�� ��rkr{r�c���ttz}|dkr |tz}n|dkr |tz}n|dvr |tz}|j�|�|||����d}|S)z"Parse pseudo with opening bracket.r9r8)r:r7T)r,rK�FLG_NOT� FLG_RELATIVE� FLG_FORGIVEr�r�rJ)r�r�r{rr.r�r]s rir5zCSSParser.parse_pseudo_open�s����X�%�� �6�>�>� �W� �E�E� �V�^�^� �\� !�E�E� �&� &� &� �[� �E� � ���T�1�1�)�U�E�J�J�K�K�K�� ��rkr�r�r��tuple[bool, _Selector, str]c���|�d�����}|st}|tkrS||_|dj�|��dtz}|�t����n[|r(||_|dj�|��n,|dd�tkrtd|��|j |���d|z}t��}d}|||fS)�Parse combinator tokens.�relationr rHrNz%The multiple combinators at position F) r��strip� WS_COMBINATOR�COMMA_COMBINATORr�r�r�r�r rW)r�r�r�rr�r�r�� combinators ri�parse_has_combinatorzCSSParser.parse_has_combinator�s���W�W�Z�(�(�.�.�0�0� �� '�&�J� �)� )� )�#�C�L� �b�M� #� *� *�3� /� /� /��]�*�H� � � �Y�[�[� )� )� )� )�� �'�� ��"� �'�.�.�s�3�3�3�3��!�"�"���.�.� *�C�E�C�C��L������Z�'�H��k�k��� ��S�(�*�*rkr�� is_pseudo� is_forgive�tuple[bool, _Selector]c �x�|�d�����} | st} |sW|r | tkrt d| �d|�d�|j|���| tkr!d|_|dd�=|�|��n�| tkrX|js|stj dd��|_|j � |��|�|��|dd�=n;|j � |��| |_ |dd�=|�|��t��}d}||fS) rrrszThe combinator 'z' at position z , must have a selector before itTNrIF)r�rtrurvr rWr�r�r�r�r%r�r�r�r�) r�r�r�rr�r�ryrzr�rws ri�parse_combinatorzCSSParser.parse_combinatorsj���W�W�Z�(�(�.�.�0�0� �� '�&�J�� &�� ��/?�!?�!?�)�h�z�h�h��h�h�h��L������-�-�-�#�� ��a�a�a�L�� � ��%�%�%���-�-�-��w�8�y�8� �n�S�$�7�7�C�G�� �$�$�Y�/�/�/�� � ��%�%�%��a�a�a�L�L�� �$�$�Y�/�/�/�)�� ��a�a�a�L�� � ��%�%�%��k�k��� ��S� � rkc��|�d��}|�d��r0|j�t |dd�����n/|j�t |dd�����d}|S)zParse HTML classes and ids.r�.rNT)r�rr�r�rxr�)r�r�r�rr�s ri�parse_class_idzCSSParser.parse_class_idNs����7�7�1�:�:�� � � �s� #� #� 7� �K� � �|�H�Q�R�R�L�9�9� :� :� :� :� �G�N�N�<����� �5�5� 6� 6� 6�� ��rkc��tjt|�d������}|dkrt jdt ��|dk}t|�d����}g}t�|��D]}|�d��r�|�d��} | � d��rt| d d �d ��} nt| ��} |� | ����|j � tj ||����d }|S) zParse contains.r{r;z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r=�values�splitrz)rrrr T)rrtrxr��warnings�warn� FutureWarning� RE_VALUES�finditerrr�r�r��SelectorContains) r�r�r�rr�� contains_ownr�r��tokenrzs ri�parse_pseudo_containszCSSParser.parse_pseudo_containsYs9����L�������9�9�:�:�� �[� � � �M�n�� � � ��!6�6� ��a�g�g�h�/�/�0�0�����'�'��/�/� #� #�E��{�{�7�#�#� ���K�K��(�(�E���� �+�+� ,�$�U�1�R�4�[�$�7�7���$�U�+�+�� �O�O�E� "� "� "� "� � ���B�/��,�G�G�H�H�H�� ��rkc���|�d��}g}t�|��D]}|�d��r�|�d��}|�d��rt |dd�d��}nt |��}|�|����|j�tj|����d}|S)zParse pseudo language.r�r�rzrrr T) r�r�r�rrxr�r�r�� SelectorLang)r�r�r�rr�r�r�rzs ri�parse_pseudo_langzCSSParser.parse_pseudo_langrs�������"�"�����'�'��/�/� #� #�E��{�{�7�#�#� ���K�K��(�(�E���� �+�+� ,�$�U�1�R�4�[�$�7�7���$�U�+�+�� �O�O�E� "� "� "� "� �������1�1�2�2�2�� ��rkc��tj|�d����dkr tjn tj}|xj|zc_d}|S)zParse pseudo direction.�dir�ltrT)rrtr�r�� SEL_DIR_LTR� SEL_DIR_RTLr])r�r�r�rrzs ri�parse_pseudo_dirzCSSParser.parse_pseudo_dir�sJ��#'�*�Q�W�W�U�^�^�"<�"<��"E�"E����2�>�� � � �U�� � �� ��rkr�c �� �t��}g}d}d}g}dtz} t|tz��} t|tz��} t|t z��} t|t z��} t|tz��}t|tz��}t|tz��}t|tz��}t|tz��}t|tz��}t|tz��}|jr�| rtd��| rtd��| rtd��| rtd��|rtd��|rtd��|rtd ��|rtd ��|rtd ��|rtd ��|rtd ��| r!|�t���� t#|��\}}|dkr%t%d|�d�������|dkr|xjt*jzc_d}�n`|dkr|�|||��}�nA|dkr|�|||||��\}}�n|dkr%t%d|�d�������|dkr|�|||��}�n�|dvr|�||||��}�n�|dkr|�|||��}�n�|dkr|�|||��}d}�nu|dkr�|sH|s?t;d|�d����|j|�d�����d|_| rd}�n6t;d|�d����|j|�d�����|dkrA| r|� ||||| |��\}}} n�|�!|||||| ||��\}}n�|dkr|�"|||��}n{|d krZ|r@t;d!|�d���d"�|j|�d�����|�#|||��}n|d#vr|�$|||��}|�%d��}���n#tL$rYnwxYw| r|st;d$|��|j|���|r�|j's| st+j(d%d&��|_'| r(| |_)|d'j*�|��n^|j*�+|��|d&d&�=|�|��n)|r'|r|s#d|_|d&d&�=|�|��d}|st;d|��|j|���|rt*j,|d'_|rt*j-|d'_|rt*j.|d'_|rt*j/|d'_|rt*j0|d'_t+j1d(�|D��| |��S))zParse selectors.FrHz 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 rINr c�6�g|]}|�����Sro)r�)�.0�ss ri� <listcomp>z-CSSParser.parse_selectors.<locals>.<listcomp>Ds ��>�>�>�q���� � �>�>�>rk)2r�rur~rKr,rnrm�FLG_HTML� FLG_DEFAULT�FLG_INDETERMINATE� FLG_IN_RANGE�FLG_OUT_OF_RANGE�FLG_PLACEHOLDER_SHOWNror�printr��next�NotImplementedErrorrNr]r�r9r-rPr�rkr�r�r rWr�rxr}r!r'r�r*� StopIterationr�r%r�r�r�� SEL_DEFAULT�SEL_INDETERMINATE� SEL_IN_RANGE�SEL_OUT_OF_RANGE�SEL_PLACEHOLDER_SHOWNr�)r�r.r�r]r�r�r�closedr�r��is_openry� is_relative�is_notr0� is_default�is_indeterminate� is_in_range�is_out_of_range�is_placeholder_shownrzryr�s rirJzCSSParser.parse_selectors�s����k�k��� �� ���� ���&���u�x�'�(�(�����+�,�,� ��5�<�/�0�0� ��e�g�o�&�&���u�x�'�(�(���%�+�-�.�.� ���(9� 9�:�:���5�<�/�0�0� ��u�'7�7�8�8��#�E�,A�$A�B�B���%�+�-�.�.� � �:� .�� -��+�,�,�,�� +��)�*�*�*�� /��-�.�.�.�� *��(�)�)�)�� +��)�*�*�*�� .��,�-�-�-�� 4��2�3�3�3�� /��-�.�.�.�� 3��1�2�2�2�#� 8��6�7�7�7�� .��,�-�-�-� � *� � � �Y�[�[� )� )� )�D �A !��i�����Q��)�#�#�-�.X�A�G�G�TU�J�J�.X�.X�Y�Y�Y��E�\�\��I�I���-�I�I�#'�L�L��1�1�1�#'�#A�#A�#�q�,�#W�#W�L�L��N�*�*�,0�,C�,C�C��L�Zc�el�,m�,m�)�L�'�'��,�,�,�-�.^�RS�RY�RY�Z[�R\�R\�.^�.^�_�_�_��-�-�-�#'�#=�#=�c�1�l�#S�#S�L�L��C�C�C�#'�#8�#8��a��y�#Y�#Y�L�L��M�)�)�#'�#9�#9�#�q�,�#O�#O�L�L��L�(�(�#'�#8�#8��a��#N�#N�L�"�G�G��N�*�*�'�,�)��"5� O�1�7�7�1�:�:� O� O� $� � !���� � �#�#�� (,�� ���!%���1�T����PQ� � �T�T� �L��G�G�A�J�J���� �I�%�%�"��6:�6O�6O���L�)�X�u�7�7�3� �c�8�8�-1�,A�,A���L�)�Y� �S]�_d�-�-�)� �c�c��K�'�'�#'�#@�#@��a��#V�#V�L�L��E�\�\�#��1�^�!�'�'�!�*�*�^�^�^� �L��G�G�A�J�J���� $(�#9�#9�#�q�,�#O�#O�L�L��O�+�+�#'�#6�#6�s�A�|�#L�#L�L����a����CA !�H��<� � � � �D� ���� � �6� �%�<�U�<�<�� ���� � � ��7� 4�9� 4��.��d�3�3���� &�'�� ��"� �'�.�.�s�3�3�3�3�� �$�$�Y�/�/�/��a�a�a�L�� � ��%�%�%�%�� �� �)� ��C�L��!�!�!� � � � �S� !� !� !��L�� �&�:�5�:�:�� ���� � � 1�"$�.�I�b�M� � � 7�"$�"6�I�b�M� � � 2�"$�/�I�b�M� � � 6�"$�"5�I�b�M� � � ;�"$�":�I�b�M� ���>�>�I�>�>�>���P�P�Ps�KS� S+�*S+rWc #�fK�t�|��}|r|�d��nd}t�|��}|r|�d��dz nt |��dz }|jrtd|����||kr�d}|jD]�}|� |||j ��}|rv|� ��}|jr>td|�d|� d���d|�d������|�d��}||fV�n��|�V||}|dkrd |��}n,|d krd |��}n |d krd |��}n|dkrd|��}nd|�d|��}t||j|���||k��|jrtd��dSdS)zIterate selector tokens.rrz ## PARSING: NzTOKEN: 'z' --> z at position �[z)Malformed attribute selector at position rz%Malformed class selector at position �#z"Malformed id selector at position rHz,Malformed pseudo-class selector at position zInvalid character z position z## END PARSING)� RE_WS_BEGINrr*� RE_WS_ENDrNr�rr�� css_tokensrvr]r�r�r rW) r�rWr�r�r*�vr{r��msgs ri� selector_iterzCSSParser.selector_iterFs���� � � �w� '� '���$����a����1�� � � �W� %� %��"#�;�q�w�w�q�z�z�A�~�~�#�g�,�,��*:�� �:� .� �,��,�,� -� -� -��s�l�l��A��_� � ���G�G�G�U�D�J�7�7�����:�:�<�<�D��z�^��\��\�\�Q�W�W�Q�Z�Z�\�\�PQ�PW�PW�XY�PZ�PZ�\�\�]�]�]��E�E�!�H�H�E���'�M�M�M��E� ��y��E�N����8�8�M�e�M�M�C�C��#�X�X�I�%�I�I�C�C��#�X�X�F�u�F�F�C�C��#�X�X�P��P�P�C�C�E�q�E�E�e�E�E�C�)�#�t�|�U�C�C�C�5�s�l�l�6 �:� $� �"� #� #� #� #� #� $� $rkc�`�|�|�|j��||��S)zProcess selectors.)rJr�rW)r�r�r]s rirgzCSSParser.process_selectorsos,���#�#�D�$6�$6�t�|�$D�$D�e�U�S�S�Srk)Nr)r�rXr[rr]r^r_rl)r�r�r�r�rr~r_r~) r�r�r�r�rr~r.r/r0r~r_r1) r�r�r�r�rr~r.r/r_r~) r�r�r{rXrr~r.r/r�r^r_r~)r�r�r�r�rr~r�r�r�rXr�r^r_rp)r�r�r�r�rr~r�r�r�r�ryr~rzr~r�r^r_r{)rr)r.r/r�r^r]r^r_r�)rWrXr_r/)r�r^r]r^r_r�)'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�r!r'r-rPrkr5rxr}r�r�r�r�rJr�rgrorkrirfrf�s��������� ���(8�9�9���&�K�'�#� � $�%F�H\�^m�n�"�$I�K^�`o�p�� �O�_�M��y�.�/�J� � � � ��-�/F�G�G����(8�9�9���(�*<�=�=����w�'�'��� �;�/�/����f�%�%�����+�+����w�'�'��� �X�.�.��� �;�/�/�3�J�>;?�� 7� 7� 7� 7� 7�D�D�D�D�L��������8`%�`%�`%�`%�D?�?�?�?�B����.)+�)+�)+�)+�V.!�.!�.!�.!�` � � � �����2����*������ uQ�uQ�uQ�uQ�uQ�n'$�'$�'$�'$�RT�T�T�T�T�T�Trkrfzhtml|*: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] ) ) rWrXrYrZr[r\r]r^r_r`)r_rl)r[r\r_rq)F)r|rXr}r~r_rX)r�rXr_rX)fr�� __future__rr�� functoolsrr�rrrdrr�r r��typingr r r r r�r6rLr4rI�PSEUDO_SPECIALrM�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�r`r�r�rr�r�rurvrur,rmrnr�r�r�rKr�r�r�ro� _MAXCACHErjrprcrxr�r�r�r�rfrgr;r<r=r>r?r@rArBrGrbrDrCrErFrorkri�<module>r�s� ����"�"�"�"�"�"� � � � �������������������������%�%�%�%�%�%�����-�-�-�-�-�-�-�-�-�-�-�-�!����� �8����( � � ����������!�#9�9�N�J�Md�d�gu�u�� '���'����� 0���R���(�����<��<�<�<� �M��M�M�'�M�M�M���8C���8C���� � K�#�J�J��J�J�J��q�G�q�q�G�q�q�ak�q�q�q��b�c�b�b�s�b�b�u�b�b�#�b�b�Z]�b�b�b�� �z� � �� �*� � � � N�J� N� N�j� N� N� N�� \�� \� \�j� \� \�� \� \�VZ� \� \��A��A�A��A�A�A��H��H�H��H�H�H��;�j�;�;�;�� ���<�<�<��,�*�,�,�� �J� � � ��.������"%���2:���=?��AD���IQ���TV��X[����� �-������!����� /�d�d�5�d�d�S�d�d�C�d�d�RW�d�d�\_�d�d�d��-�G�G�s�G�G�G���B�B�R�B�B�C�B�B�B� �2�h�h�u�h�h��h�h�PS�h�h�V[�h�h�`c�h�h�h���R�Z�M��M�M�M�r�t� T� T� ����^�R�^�^�SZ�^�^�^�`b�`d�e�e�� ���f�s�f�f�QT�f�f�f�hj�hl� m� m�� �B�J�J��J�J�3�J�J�#�J�J�J�B�D� Q� Q� ��� �2�����b�j��c����%�%� � �B�J�3�{�{�{� #� #� � �B�J�6�3�6�6�6��� =� =� ���� �� � ��� �� � ���� ��� ������ � � � ��9����������,&�&�&�&� � � � �P�P�P�P�P�6����86�6�6�6�6�6�6�6�("�"�"�"�"�?�"�"�"�JA�A�A�A�A�A�A�A�HP T�P T�P T�P T�P T�P T�P T�P T�n �9�� � ���*�x�/��0�0� ��i������*�x�/��0�0�  � �i�� � ���*�x�/�+�=��>�>� ��I� � � ���*�x�/�2C�C��D�D���y������*�x�/��0�0� ��i������*�x�/��0�0�  � �y�2�����*�x�/��0�0� ��y�8�����*�x�/��0�0� �"� � �����*�x�/�2G�G��H�H��"!�y� �����*��%�%�������.��*�x�/��0�0�/�2� ������*�x�/��0�0� � �y� �����*�|�3�h�>��?�?� �"�9� �����*�'7�7�(�B��C�C���rk
Memory