o =fr1 @sXddlmZddlZddlZddlZddlmZmZddlm Z dZ dZ e dZ Gd d d eZGd d d eZGd ddeZGdddeZdedefddZdededefddZdedefddZdedefddZdeeefdefddZdeeefd edefd!d"ZdEded$edefd%d&Zdedefd'd(Zdedefd)d*Zdeddfd+d,Z ded-edefd.d/Z!dEded-ed0edefd1d2Z"deeee#fddfd3d4Z$dedefd5d6Z%deeee#fdefd7d8Z&dFd:ed;edZ'dGdeeee#fd?ed@ed;ed Exception when a disallowed or unallocated codepoint is used Nr rrrrrrrc@r)InvalidCodepointContextzE Exception when the codepoint is not valid in the context it is used Nr rrrrrrrcpreturncCs0tt|}|dkrtt|std|S)Nrz Unknown character in unicodedata) unicodedata combiningchrname ValueError)rvrrr_combining_class s rscriptcCstt|tj|S)N)rordrscripts)rrrrr _is_script'sr!scCs |dS)Npunycode)encoder"rrr _punycode* r&cCs d|S)NzU+{:04X})formatr%rrr_unot-r'r)labelcCst|dkrdSdS)N?FTlenr*rrrvalid_label_length1s r/ trailing_dotcCst||rdndkr dSdS)NFTr,)r*r0rrrvalid_string_length7sr3F check_ltrc CsPd}t|dD]\}}t|}|dkrtdt|||dvr$d}q|s+|s+dSt|d}|dvr9d}n|d kr@d}n td t|d}d}t|dD]M\}}t|}|r|d vrhtd ||d vrod}n|dkrud}|dvr|s~|}qR||krtdqR|dvrtd||dvrd}qR|dkrd}qR|stddS)NFrz1Unknown directionality in label {} at position {})RALANTr)r6r7Lz=First codepoint in label {} must be directionality L, R or AL) r6r7r8ENESCSETONBNNSMzGInvalid direction for codepoint at position {} in a right-to-left label)r6r7r:r8r@)r8r:z2Can not mix numeral types in a right-to-left label)r9r:r;r<r=r>r?r@zGInvalid direction for codepoint at position {} in a left-to-right label)r9r:z0Label ends with illegal codepoint directionality) enumerater bidirectionalrr(repr) r*r4 bidi_labelidxr directionrtl valid_ending number_typerrr check_bidi=sV  rJcCs"t|dddkrtddS)NrMz0Label begins with an illegal combining characterT)rcategoryr r.rrrcheck_initial_combinerxsrMcCs<|dddkr td|ddks|ddkrtdd S) Nz--z4Label has disallowed hyphens in 3rd and 4th positionr-z)Label must not start or end with a hyphenT)r r.rrrcheck_hyphen_ok~s rRcCstd||kr tddS)NNFCz%Label must be in Normalization Form C)r normalizer r.rrr check_nfcsrUposcCs0t||}|dkr~|dkrtt||dtkrdSd}t|dddD]!}tjt||}|tdkr9q&|tdtd fvrGd}n|sLdSd}t|dt|D]$}tjt||}|tdkrjqW|td td fvryd}|S|S|S|d kr|dkrtt||dtkrdSdSdS) Ni rrTFrQTr9Dr6i )rr_virama_combining_classranger joining_typesgetr-)r*rVcp_valueoki joining_typerrrvalid_contextjsB   ra exceptioncCst||}|dkr3d|krt|dkr1ndSt||ddkr1t||ddkr1dSdS|dkrP|t|dkrNt|dkrNt||ddSdS|d ksX|d krg|dkret||dd SdS|d kr|D]}|d krtqmt|dst|dst|drdSqmdSd|krdkrnn|D]}dt|krdkrdSqqdSd|krdkrndS|D]}dt|krdkrdSqqdSdS)NrrlTFiuGreekiiHebrewi0u・HiraganaKatakanaHani`iiii)rr-r!)r*rVrbr]rrrrvalid_contextosJ (rjcCs t|ttfr |d}t|dkrtdt|t|t|t |D]Y\}}t |}t |t j dr7q&t |t j drTt||sStdt||dt|q&t |t j drqt||sptd t||dt|q&td t||dt|t|dS) Nzutf-8rz Empty LabelPVALIDCONTEXTJz*Joiner {} not allowed at position {} in {}rCONTEXTO-Codepoint {} not allowed at position {} in {}z-Codepoint {} at position {} of {} not allowed) isinstancebytes bytearraydecoder-r rUrRrMrArrrcodepoint_classesrarr(r)rCrjrrJ)r*rVrr]rrr check_labels.     rtcCs|z|d}t|t|std|WStyYnw|s$tdt|}t|t|}t|}t|s         rstrictuts46c Cst|ttfr |d}|rt|||}d}g}|r |d}nt|}|r,|dgkr0td|ddkr;|d=d}|D]}t|}|rK| |q=td|rV| d d |}t ||sdtd |S) NruF.r5 Empty domainrQT Empty label.zDomain too long) rorprqrrrsplit_unicode_dots_rer r|appendjoinr3) r"rrrrr0resultlabelsr*rrrr$Ts2         r$cCszt|ttfr |d}Wn tytdw|r"t||d}d}g}|s.t|}n|d}|r:|dgkr>td|dsG|d=d}|D]}t |}|rW| |qItd |rb| dd |S) NruzInvalid ASCII in A-labelFrr5rrQTr) rorprqrrUnicodeDecodeErrorr rrrrvrr)r"rrrr0rrr*rrrrrrs6        rr)F)TF)FFFF)FFF)*r5rrrretypingrr intrangesrrYrycompilerrr rrrintrrxboolr!rpr&r)r/r3rJrMrRrUrarjrqrtr|rvrr$rrrrrrs>   ;/*. .