JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbro h!P@sdZddlZddlZddlmZdgZedZedZedZ edZ ed Z ed Z ed Z ed Zed ZedZedejZedejZedejZed ZedZGdddejZdS)zA parser for HTML and XHTML.N)unescape HTMLParserz[&<]z &[a-zA-Z#]z%&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]z)&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]z <[a-zA-Z]z z--!?>z-?>z0([a-zA-Z][^\t\n\r\f />]*)(?:[\t\n\r\f ]|/(?!>))*a{ ( (?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name ) ([\t\n\r\f ]*=[\t\n\r\f ]* # value indicator ('[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value ) )? (?:[\t\n\r\f ]|/(?!>))* # possibly followed by a space a [a-zA-Z][^\t\n\r\f />]* # tag name [\t\n\r\f /]* # optional whitespace before attribute name (?:(?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name (?:[\t\n\r\f ]*=[\t\n\r\f ]* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value ) )? [\t\n\r\f /]* # possibly followed by a space )* >? aF <[a-zA-Z][^\t\n\r\f />\x00]* # tag name (?:[\s/]* # optional whitespace before attribute name (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace z#c@seZdZdZdZdZddddZdd Zd d Zd d Z dZ ddZ ddddZ ddZ d>ddZddZddZd>ddZd?d d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zd'.)_HTMLParser__starttag_textrr r r get_starttag_textszHTMLParser.get_starttag_textF escapablecCsZ||_||_|r|jstd|jtjtjB|_dStd|jtjtjB|_dS)Nz&|])z])) lowerrrrrecompile IGNORECASEASCIIr)relemr r r r set_cdata_modes       zHTMLParser.set_cdata_modecCst|_d|_d|_dS)NT)rrrrrr r r clear_cdata_modes zHTMLParser.clear_cdata_modecCs ||_dS)aEnable or disable support of the CDATA sections. If enabled, "<[CDATA[" starts a CDATA section which ends with "]]>". If disabled, "<[CDATA[" starts a bogus comments which ends with ">". This method is not called by default. Its purpose is to be called in custom handle_starttag() and handle_endtag() methods, with value that depends on the adjusted current node. See https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state for details. N)r)rflagr r r _set_support_cdatas zHTMLParser._set_support_cdatac Cs|j}d}t|}||krU|jr;|js;|d|}|dkr:|dt||d}|dkr8td ||s8n|}n|j ||}|rI| }n|jrNn|}||kro|jrf|j rf| t|||n | ||||||}||kr{n|j}|d|rt||r||} n@|d|r||} n5|d|r||} n*|d|r||} n|d |r||} n|d |ks|r| d|d } nn| dkr|sِn|t||rn|d|r|d |kr| dnt||rn|||d dn|d|r0|}d D]} || |d r"|t| 8}nq|||d |nW|d|rF|jrF|||ddnA|||ddkr_|||d dn(|d |rq|||d dn|d|r|||d dnt d|} ||| }n|d|rt!||}|r|"d d} |#| |$} |d| d s| d } ||| }q d||dvr| |||d |||d }nu|d|rQt%||}|r|"d } |&| |$} |d| d s | d } ||| }q t'||}|r;|r:|"||dkr:|$} | |kr2|} |||d }n|d |krP| d|||d }nn||ks|r||kr|jrq|j rq| t|||n | ||||||}||d|_dS)Nr<&"z [\t\n\r\f ;]zrr6r3r5rr/rz reTr)rcheck_for_whole_start_tagr tagfind_tolerantrArQrOr!rattrfind_tolerantrappendstripZgetposcountr8r:r>rIhandle_startendtaghandle_starttagCDATA_CONTENT_ELEMENTSr'RCDATA_CONTENT_ELEMENTS)rrUendposr attrsrArXtagmattrnamerestZ attrvaluerQlinenooffsetr r r rBs\  &(         zHTMLParser.parse_starttagcCs6|j}t||d}|}||ddkrdS|S)Nrrr6)r locatetagendrArQrbr r r rgs z$HTMLParser.check_for_whole_start_tagcCs|j}|d|ddkrdSt||s*||d|ddkr%|dS||St||d}|}||ddkr@dSt||d}|d }| || |S)Nrr/rr6r3r) r r9rGrAr\ryrQrhrOr! handle_endtagr()rrUr rArWrsr r r rCs    zHTMLParser.parse_endtagcCs|||||dSN)rnrzrrsrrr r r rms zHTMLParser.handle_startendtagcCdSr{r r|r r r rnzHTMLParser.handle_starttagcCr}r{r )rrsr r r rzr~zHTMLParser.handle_endtagcCr}r{r rrZr r r rPr~zHTMLParser.handle_charrefcCr}r{r rr r r rSr~zHTMLParser.handle_entityrefcCr}r{r rr r r r>r~zHTMLParser.handle_datacCr}r{r rr r r rHr~zHTMLParser.handle_commentcCr}r{r )rZdeclr r r rK r~zHTMLParser.handle_declcCr}r{r rr r r rL r~zHTMLParser.handle_picCr}r{r rr r r rJr~zHTMLParser.unknown_decl)T)r)!__name__ __module__ __qualname____doc__rorpr rrrrrr'r(r*rrFrDr\rErBrgrCrmrnrzrPrSr>rHrKrLrJr r r r rZs@     "   7  )rr"rZhtmlr__all__r#rrTrRrNr@rGrar]r^rhVERBOSEriryZlocatestarttagend_tolerantZ endendtagZ endtagfindrrr r r r s6