U
    |e;Z                    @   sX  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlmZmZ d dlmZm Z  d dl!m"Z"m#Z#m$Z$m%Z% d d	l&m'Z' d d
l(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO d dlPmQZQ dZRejSjTZUeejVG dd de
jZWeejVdd eejVdd eejVdd eejVdd eejVdd eejXG dd deZYdd ZZd d! Z[eej\ej]d"d# Z^eej]d$d% Z_eejVd&d' Z`eejVd(d) Zad*d+ Zbed,d- Zced.d/ Zded0d1 Zeed2d3 Zfed>d4d5Zged6d7d8d9 Zhd:d; Zied<d= Zjed>d? Zked@dA Zled6d7dBdC ZmedDdE ZnedFdG ZoedHdI Zped6d7dJdK ZqedLdM ZredNdO ZseetdPdQ ZueejvdRdS ZweejxdTdU ZyeejzdVdW Z{eej|dXdY Z}eej~dZd[ Zeejd\d] Zeejd^d_ Zd`da Zdbdc Zeddde Zedfdg Zedhdi Zedjdk Zdldm ZeeeZeeeZeejVdnd?dodpZeejVdqd@drdsZeejVdtdAdudvZeejVdwdBdxdyZeejVdzd{d| ZeejVd}dCd~dZeejVddd Zedd ZeejVddDddZeejVddEddZeejVddFddZeejVddGddZdd Zeee8Zeee9ZeejVddHddZeejVddIddZdd ZeejVded6 eejVded dd ZeeeAZeee@ZeejVddJddZedd ZeejVddd ZeejVddd Zedd Zedd Zdd Zdd ZeejVddKddZeejVddLddZeejVddMddZedNddZedd ZeddĄ ZeddƄ Zed6d7ddȄ Zeddʄ Zeejdd̄ Zeejeejdd΄ ZeddЄ Zeejdd҄ ZeejddԄ ZeejVdՃdOddׄZddل ZeejVdڃeeMeK edd܄ ZeejVd݃ee2e dd߄ Zedd܄ ZeeeEeFeZeee?e>eDZeejVddd ZeejVddd ZeejVddd ZeejVddd ZeejVddd ZȐdPddZeejVdee8 eejVdeeL eejVdeeN eejVdeeO eejVdee7d6 dd Zedd Zedd Zdd Zeed6ZeedZdd  Zeee/Zeee0ZeejVddd ZeejVddd Zedd Zed	d
 ZeejVddd Zedd Zedd ZeejVddd Zedd Zedd ZeejVddd Zedd Zedd ZeejVd d!d" Zeed#d$ Zed%d& Zd'eR Zed(d) Zeed*d+ ZeejVd,d-d. ZeejVd/d0d1 Zeejd,d2d3 Zeejd/d4d5 Zeejd/eejd,d6d7 Zed8ejVd9d: Zed;ejXeejd<d= ZdS (Q      N)IntTypeConstant)is_nonelike)
modelsregister_modelmake_attribute_wrapperunboxboxNativeValueoverloadoverload_method	intrinsicregister_jitable)lower_constant
lower_castlower_builtiniternext_implimpl_ret_new_refRefType)register_defaultStructModel)typescgutils)PY_UNICODE_1BYTE_KINDPY_UNICODE_2BYTE_KINDPY_UNICODE_4BYTE_KINDPY_UNICODE_WCHAR_KIND)	c_helpers)
_Py_hash_t)memcpy_region)TypingError)!_Py_TOUPPER_Py_TOLOWER_Py_UCS4_Py_ISALNUM_PyUnicode_ToUpperFull_PyUnicode_ToLowerFull_PyUnicode_ToFoldedFull_PyUnicode_ToTitleFull_PyUnicode_IsPrintable_PyUnicode_IsSpace_Py_ISSPACE_PyUnicode_IsXidStart_PyUnicode_IsXidContinue_PyUnicode_IsCased_PyUnicode_IsCaseIgnorable_PyUnicode_IsUppercase_PyUnicode_IsLowercase_PyUnicode_IsLineBreak_Py_ISLINEBREAK_Py_ISLINEFEED_Py_ISCARRIAGERETURN_PyUnicode_IsTitlecase_Py_ISLOWER_Py_ISUPPER_Py_TAB_Py_LINEFEED_Py_CARRIAGE_RETURN	_Py_SPACE_PyUnicode_IsAlpha_PyUnicode_IsNumeric_Py_ISALPHA_PyUnicode_IsDigit_PyUnicode_IsDecimalDigit)slicing c                   @   s   e Zd Zdd ZdS )UnicodeModelc              	   C   sV   dt jfdt jfdt jfdt jfdtfdt t jfdt jfg}tj	
| ||| d S )Ndatalengthkindis_asciihashmeminfoparent)r   voidptrintpint32uint32r   MemInfoPointerpyobjectr   r   __init__selfdmmfe_typemembers rX   R/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/cpython/unicode.pyrR   O   s    
zUnicodeModel.__init__N)__name__
__module____qualname__rR   rX   rX   rX   rY   rD   M   s   rD   rE   _datarF   _lengthrG   _kindrH   	_is_asciirI   _hashc                       s   e Zd Z fddZ  ZS )UnicodeIteratorModelc                    s2   dt t jfd|jfg}tt| ||| d S )NindexrE   )r   EphemeralPointeruintprE   superrb   rR   rS   	__class__rX   rY   rR   f   s    zUnicodeIteratorModel.__init__)rZ   r[   r\   rR   __classcell__rX   rX   rg   rY   rb   d   s   rb   c                 C   s   ddl m}m}m}m}m}m}m}m}m	}	 t
d }
|||||||||||}||
}| }| }| }| }|| |	||	||	||	|}|dkrtd|j}|j}|j}|d t| }|| |}t|||||jfS )ztGet string data from a python string for use at compile-time to embed
    the string data into the LLVM module.
    r   )		CFUNCTYPEc_void_pc_intc_uint	c_ssize_tc_ubyte	py_objectPOINTERbyrefextract_unicodeNz1cannot extract unicode data from the given string   )ctypesrj   rk   rl   rm   rn   ro   rp   rq   rr   r   
ValueErrorvalue_kind_to_byte_widthfrom_addressbytes)objrj   rk   rl   rm   rn   ro   rp   rq   rr   Zextract_unicode_fnprotofnrF   rG   rH   hashvrE   nbytesoutrX   rX   rY   compile_time_get_string_datan   s(    ,  r   c                 C   sz   t |\}}}}}|j}	| |	|}
t|| |}|
|_|j||_|j||_|j	||_	|j
d|_
| S )zf
    Get string data by `compile_time_get_string_data()` and return a
    unicode_type LLVM value
    )r   moduleinsert_const_bytesr   create_struct_proxyrE   rF   typerG   rH   rI   	_getvalue)contextbuildertypZliteral_stringZ	databytesrF   rG   rH   r~   modgvuni_strrX   rX   rY   make_string_from_constant   s    r   c                 C   s   t | |||jS N)r   literal_value)r   r   fromtytotyvalrX   rX   rY   cast_from_literal   s       r   c                 C   s   t | |||S r   )r   )r   r   r   pyvalrX   rX   rY   constant_unicode   s    r   c                 C   s   |j |\}}}}}}t| |j|j}	||	_||	_||	_||	_	||	_
|j |||	_||	_t|j|j  }
t|	 |
dS )zE
    Convert a unicode str object to a native unicode structure.
    )is_error)pyapistring_as_string_size_and_kindr   r   r   r   rE   rF   rG   rH   rI   nrt_meminfo_new_from_pyobjectrJ   rK   is_not_nullerr_occurredr
   r   )r   r{   cokrE   rF   rG   rH   r~   r   r   rX   rX   rY   unbox_unicode_str   s    
r   c                 C   sR   t | |j|j|d}|j|j|j|j}|j	| |jj
|j| | |S )z@
    Convert a native unicode structure to a unicode string
    rw   )r   r   r   r   r   string_from_kind_and_datarG   rE   rF   object_hashnrtdecref)r   r   r   r   resrX   rX   rY   box_unicode_str   s      r   c                    s    fdd}|S )Nc                    s@   |\}}| |t  }||||g}||tdS N    )bitcastr   
as_pointerloadgepzext)r   r   	signatureargsrE   idxptrchbitsizerX   rY   codegen   s    z#make_deref_codegen.<locals>.codegenrX   r   r   rX   r   rY   make_deref_codegen   s    r   c                 C   s   t t jt j}|tdfS N   r   rO   rL   rM   r   	typingctxrE   offsetsigrX   rX   rY   deref_uint8   s    r   c                 C   s   t t jt j}|tdfS N   r   r   rX   rX   rY   deref_uint16   s    r   c                 C   s   t t jt j}|tdfS r   r   r   rX   rX   rY   deref_uint32   s    r   c                 C   s(   dd }t t jt jt jt j}||fS )zmake empty string with data buffer of size alloc_bytes.

    Must set length and kind values for string after it is returned
    c              	   S   s   |\}}}}t tj}|| |}	||||t|jd}
| j	||
|	_
||	_||	_||	_| td|	_| j||	j
|	_t |	jj|	_|	 S )Nrt   r   )r   r   r   unicode_typemuladdr   r   r   meminfo_allocrJ   rG   rH   rF   get_constantr   rI   meminfo_datarE   get_null_valuerK   r   )r   r   r   r   Zkind_valZchar_bytes_valZ
length_valZis_ascii_valZuni_str_ctorr   Z
nbytes_valrX   rX   rY   details   s     

z_malloc_string.<locals>.details)r   r   rN   rM   rO   )r   rG   Z
char_bytesrF   rH   r   r   rX   rX   rY   _malloc_string   s    r   c                 C   s,   t | }t| |||}t||td |S Nr   )rx   r   _set_code_pointnprO   )rG   rF   rH   
char_widthsrX   rX   rY   _empty_string  s    r   F)_nrtc                 C   sJ   | j tkrt| j|S | j tkr,t| j|S | j tkrBt| j|S dS d S r   )r_   r   r   r]   r   r   r   r   )airX   rX   rY   _get_code_point  s    


r   c                    s    fdd}|S )Nc                    sT   |\}}} dk r"| |t }||t  }|||||g |  S r   )truncr   r   r   storer   get_dummy_value)r   r   r   r   rE   r   r   r   r   rX   rY   r   .  s    
z!make_set_codegen.<locals>.codegenrX   r   rX   r   rY   make_set_codegen-  s    r   c                 C   s    t t jt jt j}|tdfS r   r   voidrL   int64rO   r   r   rE   r   r   r   rX   rX   rY   	set_uint89  s    r   c                 C   s    t t jt jt j}|tdfS r   r   r   rX   rX   rY   
set_uint16?  s    r   c                 C   s    t t jt jt j}|tdfS r   r   r   rX   rX   rY   
set_uint32E  s    r   c                 C   sZ   | j tkrt| j|| n<| j tkr4t| j|| n"| j tkrNt| j|| ntdd S )Nz4Unexpected unicode representation in _set_code_point)	r_   r   r   r]   r   r   r   r   AssertionError)r   r   r   rX   rX   rY   r   K  s    


r   c                 C   sV   | t ks|t krtd| tkr$|S | tkr>|tkr8|S | S n| tkrJ| S tdd S )N!PY_UNICODE_WCHAR_KIND unsupportedz/Unexpected unicode representation in _pick_kind)r   r   r   r   r   )kind1kind2rX   rX   rY   
_pick_kind^  s    r   c                 C   s$   | dkr|dkrt dS t dS Nrt   r   )r   rO   )Z	is_ascii1Z	is_ascii2rX   rX   rY   _pick_asciip  s    
r   c                 C   sB   | t krdS | tkrdS | tkr$dS | tkr6tdntdd S )Nrt         r   z'Unexpected unicode encoding encountered)r   r   r   r   r   )rG   rX   rX   rY   rx   w  s    
rx   c                 C   sz   |dkrdS || | j krdS || |j kr0dS t|D ]<}t| || }t||| }||k rf dS ||kr8 dS q8dS )Nr   r   rt   )r^   ranger   )r   Za_offsetbZb_offsetnr   Za_chrZb_chrrX   rX   rY   _cmp_region  s    r   c                 C   s8   | dk rt S | dk rtS d}| |kr0d}t|tS dS )zK
    Compute the minimum unicode kind needed to hold a given codepoint
       i   rC   z;Invalid codepoint. Found value greater than Unicode maximumN)r   r   rv   r   )cpZMAX_UNICODEmsgrX   rX   rY   _codepoint_to_kind  s    r   c                 C   s   | dk S )z;
    Returns true if a codepoint is in the ASCII range
       rX   )r   rX   rX   rY   _codepoint_is_ascii  s    r   c                 C   s   t | tjrdd }|S d S )Nc                 S   s   | j S r   )r^   r   rX   rX   rY   len_impl  s    zunicode_len.<locals>.len_impl
isinstancer   UnicodeType)r   r   rX   rX   rY   unicode_len  s    r   c                 C   s   | j r|j sd S t| tjr$| j}n| }t|tjr<|j}n|}tjtjtjf}t||}t||}|rx|rxdd }|S ||A rdd }|S d S )Nc                 S   sd   | d k}|d k}|s|r(|r$|r$dS dS t | } t |}t| t|krLdS t| d|dt| dkS )NTFr   )strlenr   )r   r   a_noneb_nonerX   rX   rY   eq_impl  s    zunicode_eq.<locals>.eq_implc                 S   s   dS NFrX   r   r   rX   rX   rY   r     s    )is_internalr   r   Optionalr   r   StringLiteralUnicodeCharSeq)r   r   Zcheck_aZcheck_baccept	a_unicode	b_unicoder   rX   rX   rY   
unicode_eq  s"    

r	  c                 C   s`   | j r|j sd S tjtjtjf}t| |}t||}|rH|rHdd }|S ||A r\dd }|S d S )Nc                 S   s
   | |k S r   rX   r  rX   rX   rY   ne_impl  s    zunicode_ne.<locals>.ne_implc                 S   s   dS )NTrX   r  rX   rX   rY   r     s    zunicode_ne.<locals>.eq_impl)r  r   r   r  r  r   )r   r   r  r  r  r
  r   rX   rX   rY   
unicode_ne  s    

r  c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   sJ   t t| t|}t| d|d|}|dkr.dS |dkrFt| t|k S dS )Nr   r   TFminr   r   r   r   ZminlenZeqcoderX   rX   rY   lt_impl  s    zunicode_lt.<locals>.lt_implr   r   r   r  )r   r   r  r  r  rX   rX   rY   
unicode_lt  s
    r  c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   sJ   t t| t|}t| d|d|}|dkr.dS |dkrFt| t|kS dS )Nr   rt   TFr  r  rX   rX   rY   gt_impl  s    zunicode_gt.<locals>.gt_implr  )r   r   r  r  r  rX   rX   rY   
unicode_gt  s
    r  c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   s
   | |k S r   rX   r  rX   rX   rY   le_impl  s    zunicode_le.<locals>.le_implr  )r   r   r  r  r  rX   rX   rY   
unicode_le  s
    r  c                 C   s<   t | tjtjf}t |tjtjf}|r8|r8dd }|S d S )Nc                 S   s
   | |k  S r   rX   r  rX   rX   rY   ge_impl&  s    zunicode_ge.<locals>.ge_implr  )r   r   r  r  r  rX   rX   rY   
unicode_ge!  s
    r  c                 C   s(   t | tjr$t |tjr$dd }|S d S )Nc                 S   s   t | |dkS )Nr   )_findr  rX   rX   rY   contains_impl.  s    z'unicode_contains.<locals>.contains_implr   )r   r   r  rX   rX   rY   unicode_contains+  s    r  c                 C   s^   | }t | tjr| j}nt | tjr*| j}tjtjf}|dk	rZt ||sZtd	||| dS )zCheck object belongs to one of specific types
    ty: type
        Type of the object
    name: str
        Name of the object
    N"{}" must be {}, not {})
r   r   Omittedrw   r  r   IntegerNoneTyper    format)tynamethetyacceptedrX   rX   rY   unicode_idx_check_type4  s    r$  c                 C   s(   t | tjs$d|tj| }t|dS )z$Check object belongs to unicode typer  N)r   r   r   r  r    )r   r!  r   rX   rX   rY   unicode_sub_check_typeH  s    r%  c                 C   s   | d|t d @ > O } | S Nrt   _BLOOM_WIDTHmaskr   rX   rX   rY   
_bloom_addQ  s    r+  c                 C   s   | d|t d @ > @ S r&  r'  r)  rX   rX   rY   _bloom_checkW  s    r,  c                 C   sP  t |}|dkr|S |d  }}t||}td}t||}	t|D ],}
t||
}t|	|}	||krF||
 d }qF|}
|
|| krLt| ||
 }||krd}||k rt| |
| }t||}||krq|d7 }q||kr|
S t| ||
 d }t|	|dkr|
|7 }
n|
|7 }
n*t| ||
 d }t|	|dkrB|
|7 }
|
d7 }
qxdS )zLeft finder.r   rt   r   )r   r   r   rM   r+  r   r,  )rE   substrstartendmgapmlastlastzeror*  r   r   jhaystack_ch	needle_chrX   rX   rY   _default_find]  sD    










r8  c                 C   sR  t |}|dkr|S |d  }}t|d}td|}|}	|	dkrnt||	}
t||
}|
|krd|	d }|	d8 }	q8|| }	|	|krNt| |	}
|
|kr|}|dkrt| |	| }t||}||krq|d8 }q|dkr|	S t| |	d }
|	|kr
t||
dkr
|	|8 }	n|	|8 }	n0t| |	d }
|	|krDt||
dkrD|	|8 }	|	d8 }	qvdS )zRight finder.r   rt   r   )r   r   r+  r,  )rE   r-  r.  r/  r0  skipr2  Zmfirstr*  r   r   r5  r6  r7  rX   rX   rY   _default_rfind  sF    












r:  c                    s   d fdd	}|S )z%Generate finder either left or right.Nc                    sV   t | }t |}|d krd}|d kr(|}t|||\}}|| |k rHdS  | |||S )Nr   r   )r   _adjust_indices)rE   r-  r.  r/  rF   
sub_length	find_funcrX   rY   impl  s    zgenerate_finder.<locals>.impl)NNrX   )r>  r?  rX   r=  rY   generate_finder  s    r@  findc                 C   s<   t |tjrddd}|S t|d t|d t|d tS )zImplements str.find()Nc                 S   s   |  t|S r   )rA  r   rE   r-  r.  r/  rX   rX   rY   	find_impl  s    zunicode_find.<locals>.find_implr.  r/  r-  )NN)r   r   r  r$  r%  r  )rE   r-  r.  r/  rC  rX   rX   rY   unicode_find  s    



rD  rfindc                 C   s<   t |tjrddd}|S t|d t|d t|d tS )zImplements str.rfind()Nc                 S   s   |  t|S r   )rE  r   rB  rX   rX   rY   
rfind_impl  s    z!unicode_rfind.<locals>.rfind_implr.  r/  r-  )NN)r   r   r  r$  r%  _rfind)rE   r-  r.  r/  rF  rX   rX   rY   unicode_rfind  s    



rH  rindexc                 C   s,   t |d t |d t|d ddd}|S )zImplements str.rindex()r.  r/  subNc                 S   s"   |  |||}|dk rtd|S Nr   zsubstring not found)rE  rv   r   rJ  r.  r/  resultrX   rX   rY   rindex_impl  s    z#unicode_rindex.<locals>.rindex_impl)NNr$  r%  )r   rJ  r.  r/  rN  rX   rX   rY   unicode_rindex  s
    



rP  rc   c                 C   s,   t |d t |d t|d ddd}|S )zImplements str.index()r.  r/  rJ  Nc                 S   s"   |  |||}|dk rtd|S rK  )rA  rv   rL  rX   rX   rY   
index_impl  s    z!unicode_index.<locals>.index_impl)NNrO  )r   rJ  r.  r/  rQ  rX   rX   rY   unicode_index  s
    



rR  	partitionc                 C   sj   |}t |tjr|j}nt |tjr*|j}tjtjf}|dk	r^t ||s^dd||}t	|dd }|S )zImplements str.partition()Nr  sepc                 S   s   t |}t| jd| j}t|}| j|jk s8t| |k rB| ||fS |dkrRtd| |}|dk rn| ||fS | d| || || t|  fS Nr   empty separator)r   r   r_   r`   r   rv   rA  rE   rT  Z	empty_str
sep_lengthposrX   rX   rY   r?  '  s    


zunicode_partition.<locals>.impl
r   r   r  rw   r  r   r   r  r  r    rE   rT  r"  r#  r   r?  rX   rX   rY   unicode_partition  s    r\  countc                 C   sD   t | t | t|tjr*ddd}|S d}t|t|d S )Nc                 S   s   d}t | }t |}t||d}t|||}|| dk s@||krDdS | || } t | }d| }}|dkrr|d S || |kr| |||  |kr|d7 }||7 }qr|d7 }qr|S Nr   rt   )r   _normalize_slice_idx_count)srcrJ  r.  r/  r]  Zsrc_lenZsub_lenrX   rX   rY   
count_implB  s$    


z!unicode_count.<locals>.count_implz+The substring must be a UnicodeType, not {})NN)_count_args_types_checkr   r   r   r    r  r   )r`  rJ  r.  r/  ra  	error_msgrX   rX   rY   unicode_count;  s    
rd  
rpartitionc                 C   sj   |}t |tjr|j}nt |tjr*|j}tjtjf}|dk	r^t ||s^dd||}t	|dd }|S )zImplements str.rpartition()Nr  rT  c                 S   s   t |}t| jd| j}t|}| j|jk s8t| |k rB||| fS |dkrRtd| |}|dk rn||| fS | d| || || t|  fS rU  )r   r   r_   r`   r   rv   rE  rW  rX   rX   rY   r?  p  s    


z unicode_rpartition.<locals>.implrZ  r[  rX   rX   rY   unicode_rpartition`  s    rf  c                 C   sL   || kr| }|dk r(|| 7 }|dk r(d}|dk rD|| 7 }|dk rDd}||fS r   rX   )rF   r.  r/  rX   rX   rY   r;    s    r;  
startswithc                 C   s   t |st|tjstdt |s8t|tjs8tdt|tjr`t|jtjr`d
dd}|S t|tjrzddd}|S t|tjrddd}|S td	d S )Nz:When specified, the arg 'start' must be an Integer or Nonez8When specified, the arg 'end' must be an Integer or Nonec                 S   s"   |D ]}|  |||r dS qdS NTF)rg  )r   prefixr.  r/  itemrX   rX   rY   startswith_tuple_impl  s    z1unicode_startswith.<locals>.startswith_tuple_implc                 S   s   |  t|||S r   )rg  r   )r   ri  r.  r/  rX   rX   rY   startswith_char_seq_impl  s    z4unicode_startswith.<locals>.startswith_char_seq_implc                 S   sv   t | t | }}|d krd}|d kr*|}t|||\}}|| |k rJdS |dkrVdS | || }t|d|d|dkS Nr   FTr   r;  r   )r   ri  r.  r/  rF   Zprefix_lengthZs_slicerX   rX   rY   startswith_unicode_impl  s    z3unicode_startswith.<locals>.startswith_unicode_implz9The arg 'prefix' should be a string or a tuple of strings)NN)NN)NN)	r   r   r   r  r    UniTupledtyper   r  )r   ri  r.  r/  rk  rl  ro  rX   rX   rY   unicode_startswith  s,    


rr  endswithc                 C   s   |d ks&t |tjtjtjfs&td|d ksLt |tjtjtjfsLtdt |tjtjfrlddd}|S t |tjrddd}|S t |tj	rddd}|S d S )	Nz!The arg must be a Integer or Nonec                 S   s&   |D ]}|  |||dkr dS qdS rh  )rs  )r   r-  r.  r/  rj  rX   rX   rY   endswith_impl  s    z'unicode_endswith.<locals>.endswith_implc                 S   s   t | }t |}|d krd}|d kr(|}t|||\}}|| |k rHdS |dkrTdS | || } t | | }t| ||d|dkS rm  rn  )r   r-  r.  r/  rF   r<  r   rX   rX   rY   rt    s    c                 S   s   |  t|||S r   )rs  r   )r   r-  r.  r/  rX   rX   rY   rt    s    )NN)NN)NN)
r   r   r  r  r  r    Tuplerp  r   r  )r   r-  r.  r/  rt  rX   rX   rY   unicode_endswith  s&    


rv  
expandtabsr   c                 C   sd   |}t |tjr|j}nt |tjr*|j}tjtf}|dk	rVt ||sVtd	||ddd}|S )zImplements str.expandtabs()Nz"tabsize" must be {}, not {}r   c                 S   sf  t | }d }}d}t|D ]}t| |}|tkrrd}|dkr|||  }|tj| kr`td||7 }||7 }q|tjd krtd|d7 }|d7 }|ttfkrd}q|s| S t	| j
|| j}	d }}t|D ]}t| |}|tkr4|dkr`|||  }||7 }t||| D ]}
t|	|
t q||7 }q|d7 }t|	|| |d7 }|ttfkrd}q|	S )Nr   FTznew string is too longrt   )r   r   r   r9   sysmaxsizeOverflowErrorr:   r;   r   r_   r`   r   r<   )rE   tabsizerF   r5  Zline_posfoundr   
code_pointincrr   r   rX   rX   rY   expandtabs_impl  sL    





z+unicode_expandtabs.<locals>.expandtabs_impl)r   )
r   r   r  rw   r  r   r  intr    r  )rE   r{  r"  r#  r  rX   rX   rY   unicode_expandtabs  s    


.r  splitr   c                 C   s   |dks"t |tjtjtjfs"d S t |tjr<d	dd}|S t |tjrVd
dd}|S |d kszt |tjszt|ddd krddd}|S d S )Nr   c                 S   s   | j t||dS )N)maxsplit)r  r   )r   rT  r  rX   rX   rY   
split_implE  s    z!unicode_split.<locals>.split_implc           
      S   s   t | }t |}|dkr tdg }d}d}|dkr~|dkr~t|d}t|D ],}t| ||krN|| ||  |d }qNnbd}	||k r|dks|	|k rt| ||d|dkr|| ||  ||7 }|}|	d7 }	q|d7 }q||kr|| |d   |S )Nr   rV  rt   r   )r   rv   r   r   appendr   )
r   rT  r  a_lensep_lenpartsr3  r   Zsep_code_pointsplit_countrX   rX   rY   r  J  s4    


rw   Fc                 S   s   t | }g }d}d}d}d}t|D ]b}t| |}	t|	}
|rN|
rDq|}d}q$|
sTq$|| ||  d}|d7 }|dkr$||kr$ qq$||kr|s|| |d   |S )Nr   TFrt   r   )r   r   r   r*   r  )r   rT  r  r  r  r3  r   r  Zin_whitespace_blockr}  is_whitespacerX   rX   rY   split_whitespace_implo  s0    
z,unicode_split.<locals>.split_whitespace_impl)Nr   )Nr   )Nr   )	r   r   r  r  IntegerLiteralr  r   r  getattr)r   rT  r  r  r  rX   rX   rY   unicode_split=  s"    

"
 r  c                    s   d fdd	}|S )z@Generate whitespace rsplit func based on either ascii or unicodeNr   c                    s  |dk rt j}g }t| d }|dkr|dkrLt| |} |sBqL|d8 }q&|dk rVq|}|d8 }|dkrt| |} |r~q|d8 }qb|| |d |d   |d8 }q|dkr|dkrt| |} |sq|d8 }q|dkr|| d|d   |d d d S Nr   rt   r   )rx  ry  r   r   r  )rE   rT  r  rM  r   r}  r5  isspace_funcrX   rY   rsplit_whitespace_impl  s<    






z?generate_rsplit_whitespace_impl.<locals>.rsplit_whitespace_impl)Nr   rX   )r  r  rX   r  rY   generate_rsplit_whitespace_impl  s    &r  rsplitc                 C   sh   dd }||dt jt jt jf ||dt jtf |dksLt|t jt jfrZddd}|S dd	d
}|S )zImplements str.unicode_rsplit()c                 S   sR   | }t | tjr| j}nt | tjr*| j}|dk	rNt ||sNtd||| dS )z.Check object belongs to one of specified typesNr  )r   r   r  rw   r  r   r    r  )r   r!  r#  r"  rX   rX   rY   _unicode_rsplit_check_type  s    z2unicode_rsplit.<locals>._unicode_rsplit_check_typerT  r  Nr   c                 S   s   | j rt| ||S t| ||S r   )r`   ascii_rsplit_whitespace_implunicode_rsplit_whitespace_impl)rE   rT  r  rX   rX   rY   r    s    z.unicode_rsplit.<locals>.rsplit_whitespace_implc                 S   s   t |}| j|jk s$t| t|k r*| gS dd }|dk r@tj}t|}|dkrXtd|dkrl|| ||S g }t| }|dkr| j|d|d}|dk rq|| || |  |}|d8 }qx|| d|  |d d d S )Nc                 S   s   g }t |d}t| d  }}|dkrx|dkrxt | |}||krn|| |d |d   |d  }}|d8 }|d8 }q|dkr|| d|d   |d d d S r  )r   r   r  )rE   r   r  rM  Zch_code_pointr   r5  Zdata_code_pointrX   rX   rY   _rsplit_char  s    


z9unicode_rsplit.<locals>.rsplit_impl.<locals>._rsplit_charr   rV  rt   )r.  r/  r   )r   r_   r   rx  ry  rv   rE  r  )rE   rT  r  r  rX  rM  r5  rY  rX   rX   rY   rsplit_impl  s,    
z#unicode_rsplit.<locals>.rsplit_impl)Nr   )Nr   )r   r   r  r  r  r  r   r  )rE   rT  r  r  r  r  rX   rX   rY   unicode_rsplit  s    


/r  center c                 C   s^   t |tjstdt |tjr.ddd}|S |dksPt |tjtjfsPtdddd}|S )	NThe width must be an Integerr  c                 S   s   |  |t|S r   )r  r   stringwidthfillcharrX   rX   rY   center_impl  s    z#unicode_center.<locals>.center_impl"The fillchar must be a UnicodeTypec           	      S   s   t | }t |}|dkr td||kr,| S || }|d ||@ d@  }|| }|| }||krl||  | S ||  ||  S d S )Nrt   5The fill character must be exactly one character longr   r   rv   )	r  r  r  str_lenfillchar_lenZ	allmarginZlmarginZrmarginZl_stringrX   rX   rY   r  %  s    )r  )r  r   r   r  r    r  r  r   )r  r  r  r  rX   rX   rY   unicode_center  s    

r  c                    s   d fdd	}|S )Nr  c                    st   t |tjstdt |tjr@ r2d
dd}|S ddd}|S |dksbt |tjtjfsbtdd fdd		}|S )Nr  r  c                 S   s   |  |t|S r   )ljustr   r  rX   rX   rY   
ljust_implD  s    z<gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.ljust_implc                 S   s   |  |t|S r   )rjustr   r  rX   rX   rY   
rjust_implH  s    z<gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.rjust_implr  c                    sP   t | }t |}|dkr td||kr,| S |||  } rD| | S ||  S d S )Nrt   r  r  )r  r  r  r  r  newstrSTRING_FIRSTrX   rY   r?  P  s    z6gen_unicode_Xjust.<locals>.unicode_Xjust.<locals>.impl)r  )r  )r  r  )r  r  r  r  r  r?  r  rX   rY   unicode_Xjust>  s    

z(gen_unicode_Xjust.<locals>.unicode_Xjust)r  rX   )r  r  rX   r  rY   gen_unicode_Xjust=  s    %r  r  r  Tc                    s    fdd}|S )zDGenerate splitlines performer based on ascii or unicode line breaks.c           
         s   t | }g }d }}||k r||k rBt| |} |r8qB|d7 }q|}||k r|d |k rt| |}t| |d }	t|rt|	r|d7 }|d7 }|r|}|| ||  |}q|S r^  )r   r   r5   r4   r  )
rE   keependsrF   rM  r   r5  r}  eolZcur_cpZnext_cpis_line_break_funcrX   rY   r?  l  s,    


z&generate_splitlines_func.<locals>.implrX   )r  r?  rX   r  rY   generate_splitlines_funcj  s    r  
splitlinesc                 C   sl   |}t |tjr|j}nt |tjr*|j}tjttjt	f}|dk	r^t ||s^t
dd||ddd}|S )zImplements str.splitlines()Nr  r  Fc                 S   s   | j rt| |S t| |S r   )r`   _ascii_splitlines_unicode_splitlines)rE   r  rX   rX   rY   splitlines_impl  s    
z+unicode_splitlines.<locals>.splitlines_impl)F)r   r   r  rw   r  r   r  r  Booleanboolr    r  )rE   r  r"  r#  r  rX   rX   rY   unicode_splitlines  s    
r  c                 C   s   t |}|dkrdS t | }|d | }| j}| j}|D ](}|t |7 }t||j}t||j}q8t|||}|d }	t|d|	dt |	 t |	}
td|D ]D}t||
| d| |
|7 }
|| }	t||
|	dt |	 |
t |	7 }
q|S )Nr    rt   )r   r_   r`   r   r   r   _strncpyr   )rT  r  Z	parts_lenr  rF   rG   rH   prM  part
dst_offsetr   rX   rX   rY   	join_list  s,    r  joinc                 C   sv   t |tjrBt |jtjr&dd }|S t |jtjrrdd }|S n0t |tjrZdd }|S t |tjrrdd }|S d S )Nc                 S   s
   t | |S r   r  )rT  r  rX   rX   rY   join_list_impl  s    z$unicode_join.<locals>.join_list_implc                 S   s   dd |D }t | |S )Nc                 S   s   g | ]}t |qS rX   r   .0r  rX   rX   rY   
<listcomp>  s     z8unicode_join.<locals>.join_list_impl.<locals>.<listcomp>r  )rT  r  _partsrX   rX   rY   r    s    c                 S   s   dd |D }|  |S )Nc                 S   s   g | ]}|qS rX   rX   r  rX   rX   rY   r    s     z8unicode_join.<locals>.join_iter_impl.<locals>.<listcomp>)r  rT  r  Z
parts_listrX   rX   rY   join_iter_impl  s    z$unicode_join.<locals>.join_iter_implc                    s$    fddt t D }t| |S )Nc                    s   g | ]} | qS rX   rX   )r  r   r  rX   rY   r    s     z7unicode_join.<locals>.join_str_impl.<locals>.<listcomp>)r   r   r  r  rX   r  rY   join_str_impl  s    z#unicode_join.<locals>.join_str_impl)r   r   Listrq  r   r  IterableType)rT  r  r  r  r  rX   rX   rY   unicode_join  s    r  zfillc                 C   s    t |tjstddd }|S )Nz<width> must be an Integerc                 S   sZ   t | }||kr| S |r | d nd}d||  }|dkrN|| | dd   }n||  }|S )Nr   r  0)+-rt   r   )r  r  r  Z
first_charpaddingr  rX   rX   rY   
zfill_impl  s    z!unicode_zfill.<locals>.zfill_impl)r   r   r  r    )r  r  r  rX   rX   rY   unicode_zfill  s    r  c                 C   s^   t | }d}|d k	r8t|D ]}| | |kr|  S qn"t|D ]}t| | s@|  S q@|S r   r   r   r*   r  charsr  r   rX   rX   rY   unicode_strip_left_bound  s    
r  c                 C   sv   t | }d}|d k	rDt|d ddD ]}| | |kr$|d7 } qrq$n.t|d ddD ]}t| | sT|d7 } qrqT|S r  r  r  rX   rX   rY   unicode_strip_right_bound  s    r  c                 C   s<   t | tjr| j} | d ks8t | tjtjtjfs8tdd S )Nz%The arg must be a UnicodeType or None)r   r   r  r   r  r   r  r    )r  rX   rX   rY   unicode_strip_types_check'  s    r  c                 C   s<   t | tjr| j} | d ks8t | tjtjtjfs8tdd S )Nz,The slice indices must be an Integer or None)r   r   r  r   r  r  r  r    )argrX   rX   rY   rb  0  s    rb  lstripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  r  rX   rX   rY   lstrip_impl=  s    z#unicode_lstrip.<locals>.lstrip_implc                 S   s   | t | |d  S r   )r  r  rX   rX   rY   r  C  s    )N)Nr   r   r  r  )r  r  r  rX   rX   rY   unicode_lstrip9  s    

r  rstripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  rX   rX   rY   rstrip_implL  s    z#unicode_rstrip.<locals>.rstrip_implc                 S   s   | d t | | S r   )r  r  rX   rX   rY   r  R  s    )N)Nr  )r  r  r  rX   rX   rY   unicode_rstripH  s    

r  stripc                 C   s0   t |tjrddd}|S t| ddd}|S )Nc                 S   s   |  t|S r   )r  r   r  rX   rX   rY   
strip_impl[  s    z!unicode_strip.<locals>.strip_implc                 S   s    t | |}t| |}| || S r   )r  r  )r  r  lbrbrX   rX   rY   r  a  s    

)N)Nr  )r  r  r  rX   rX   rY   unicode_stripW  s    

r  c                 C   sB   | dkr|rdS |S n| dk r&| |7 } | dk s6| |kr>t d| S )a%  
    Parameters
    ----------
    idx : int or None
        the index
    length : int
        the string length
    is_start : bool; optional with defaults to True
        Is it the *start* or the *stop* of the slice?

    Returns
    -------
    norm_idx : int
        normalized index
    Nr   zstring index out of range)
IndexError)r   rF   is_startrX   rX   rY   normalize_str_idxl  s    r  c                 C   s>   | dkr|S | |   kr"|k r.n n| | S | dk r:dS | S )a%  
    Used for unicode_count

    If arg < -slice_len, returns 0 (prevents circle)

    If arg is within slice, e.g -slice_len <= arg < slice_len
    returns its real index via arg % slice_len

    If arg > slice_len, returns arg (in this case count must
    return 0 if it is start index)
    Nr   rX   )r  Z	slice_lendefaultrX   rX   rY   r_    s
    r_  c                 C   s   |||}dd }||fS )zFix slice object.
    c           	      S   sF   |j \}}|\}}| |||}t| ||| t||| | S r   )r   make_helperrB   Zguard_invalid_sliceZ	fix_slicer   )	r   r   r   r   	slicetypeZ
lengthtypesliceobjrF   slicerX   rX   rY   r     s    
z!_normalize_slice.<locals>.codegenrX   )r   r  rF   r   r   rX   rX   rY   _normalize_slice  s    
r  c                 C   s   t |}dd }||fS )z2Compute the span from the given slice object.
    c                 S   s,   |j \}|\}| |||}t||}|S r   )r   r  rB   Zget_slice_length)r   r   r   r   r  r  r  result_sizerX   rX   rY   r     s
    z_slice_span.<locals>.codegen)r   rM   )r   r  r   r   rX   rX   rY   _slice_span  s    
r  c           
      C   st   |j | j krHt|j }|| }|| }|| }t| j||j||dd n(t|D ]}	t| ||	 t|||	  qPd S )Nrt   )align)r_   rx   r   r]   r   r   r   )
dstr  r`  Z
src_offsetr   
byte_widthZsrc_byte_offsetZdst_byte_offsetr   r   rX   rX   rY   r    s    
  
r  c                 C   s2   |t jkstdd }t t jt jt j}||fS )z_Create a slice of a unicode string using a view of its data to avoid
    extra allocation.
    c                 S   s   |\}}}t tj| ||d}t tj| |}|j|_|j|_|j|_||_| t	d|_
| jt}	|	| jtjfi }
| |	|
}|||jf}|||}||j|g|_t |jj|_| jr| j||jd | | S )Nr   r   r   )r   r   r   r   rJ   rG   rH   rF   r   r   rI   typing_contextresolve_value_typerx   get_call_typerN   get_functionr   r   rE   r   rK   r   
enable_nrtr   increfr   r   )r   r   r   r   r`  r.  rF   Zin_strZview_strZbw_typZbw_sigZbw_implr  r   rX   rX   rY   r     sB    
     z$_get_str_slice_view.<locals>.codegen)r   r   r   rM   )r   Zsrc_tZstart_tZlength_tr   r   rX   rX   rY   _get_str_slice_view  s    r  c                 C   s@   t | tjr<t |tjr$dd }|S t |tjr<dd }|S d S )Nc                 S   s^   t |t| }t| |}t|}|| jkr6t| |dS t|}t|d|}t|d| |S d S r   )	r  r   r   r   r_   r  r   r   r   )r   r   r   rG   rH   retrX   rX   rY   getitem_char  s    

z%unicode_getitem.<locals>.getitem_charc                 S   s   t |t| }t|}t| |j}t|}t|}t|j|j |j	|jD ]4}t| |}|t|M }t|}||krJt
||}qJ|jdkr|| jkrt| |j|S t|||}	|j}
t|D ] }t|	|t| |
 |
|j7 }
q|	S d S r&  )r  r   r  r   r.  r   r   r   stepstopr   r_   r  r   r   )r   r   Z	slice_idxspanr   rG   rH   r   new_kindr  currX   rX   rY   getitem_slice  s,     
z&unicode_getitem.<locals>.getitem_slice)r   r   r   r  	SliceType)r   r   r  r  rX   rX   rY   unicode_getitem  s    $r  c                 C   sL   t | tjr$t |tjr$dd }|S t | tjrHt |tjrHdd }|S d S )Nc                 S   s   | j |j  }t| j|j}t| j|j}t|||}tt| D ]}t||t	| | q@tt|D ]}t|t| | t	|| qd|S r   )
r^   r   r_   r   r`   r   r   r   r   r   )r   r   
new_lengthr
  Z	new_asciirM  r   r5  rX   rX   rY   concat_impl7  s    z#unicode_concat.<locals>.concat_implc                 S   s   | t | S r   r  r  rX   rX   rY   r  D  s    )r   r   r   r  )r   r   r  rX   rX   rY   unicode_concat3  s    
r  c                 C   s   | dks|dk rdS |dkr | S | j | }| j}t||| j}t| }t|d| d| |}d| |krt|||d| |d9 }qZd| |ks|| }t||||| | |S d S )Nr  rt   r   r   )r^   r_   r   r`   r   r  )Zstr_argZmult_argr  r
  rM  Zlen_aZ	copy_sizerestrX   rX   rY   _repeat_implI  s"    

r  c                 C   sL   t | tjr$t |tjr$dd }|S t | tjrHt |tjrHdd }|S d S )Nc                 S   s
   t | |S r   r  r  rX   rX   rY   wrapg  s    zunicode_repeat.<locals>.wrapc                 S   s
   t || S r   r  r  rX   rX   rY   r  k  s    )r   r   r   r  )r   r   r  rX   rX   rY   unicode_repeatd  s    r  c                 C   s   t | tjrdd }|S d S )Nc                 S   s   t | dkS r   r  r   rX   rX   rY   r?  s  s    zunicode_not.<locals>.implr   r   r?  rX   rX   rY   unicode_notp  s    r  replacec                 C   s   |}t |tjr|j}nt |tjr*|j}t |ttjfsHtd	|t |tj
tjfshtd	|t |tj
std	|ddd}|S )NzGUnsupported parameters. The parameters must be Integer. Given count: {}z+The object must be a UnicodeType. Given: {}r   c           	      S   s   |dkr| S |dkrt | }|dkr6||| | S |g}tt||}t|D ]F}|||  |d |kr||| qR|d||d d   qR|t|kr|| d|S | ||}||}|S )Nr   r  r   rt   )listr  r  r   r   r  r  )	r   old_strnew_strr]  ZscharsZsplit_result	min_countr   rM  rX   rX   rY   r?    s&    


zunicode_replace.<locals>.impl)r   )r   r   r  rw   r  r   r  r  r    r  r   r  )r   r  r  r]  r"  r?  rX   rX   rY   unicode_replacex  s&    
r  c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    s   t | }|dkrdS |dkr<t| d}| jr4 |S |S | jrht|D ]}t| |} |sJ dS qJt|D ]}t| |}|sp dS qpdS )Nr   Frt   T)r   r   r`   r   )rE   rF   r}  r   
ascii_funcunicode_funcrX   rY   r?    s$    


z.gen_isAlX.<locals>.unicode_isAlX.<locals>.implrX   rE   r?  r   rX   rY   unicode_isAlX  s    z gen_isAlX.<locals>.unicode_isAlXrX   )r!  r"  r$  rX   r   rY   	gen_isAlX  s    r%  isalphac                 C   s   t | pt| S r   )r>   r=   xrX   rX   rY   <lambda>  s    r)  isalnumc                    s    fdd}|S )Nc                    sp   t | }|dkrt| dS |dkr*dS d}t|D ]4}t| |} |sT|rZ dS |s6|r6d}q6|S Nrt   r   FTr   r   r   )r   lcasedr   r}  is_loweris_titleis_upperrX   rY   r?    s    
z_is_upper.<locals>.implrX   )r0  r2  r1  r?  rX   r/  rY   	_is_upper  s    r3  c                 C   s   dS r   rX   r'  rX   rX   rY   r)        isupperc                 C   s   dd }|S )z
    Implements .isupper()
    c                 S   s   | j rt| S t| S d S r   )r`   _ascii_is_upper_unicode_is_upperr  rX   rX   rY   r?    s    zunicode_isupper.<locals>.implrX   r  rX   rX   rY   unicode_isupper  s    r8  isasciic                 C   s   dd }|S )z Implements UnicodeType.isascii()c                 S   s   | j S r   )r`   rE   rX   rX   rY   r?    s    zunicode_isascii.<locals>.implrX   r#  rX   rX   rY   unicode_isascii  s    r;  istitlec                 C   s   dd }|S )z
    Implements UnicodeType.istitle()
    The algorithm is an approximate translation from CPython:
    https://github.com/python/cpython/blob/1d4b6ba19466aba0eb91c4ba01ba509acf18c723/Objects/unicodeobject.c#L11829-L11885 # noqa: E501
    c                 S   s   t | }|dkr*t| d}t|p(t|S |dkr6dS d}d}t|D ]R}t| |}t|sdt|rx|rn dS d}d}qFt|r|s dS d}d}qFd}qF|S r+  )r   r   r0   r6   r   r1   )rE   rF   charr.  previous_is_casedr   rX   rX   rY   r?    s,    

zunicode_istitle.<locals>.implrX   r#  rX   rX   rY   unicode_istitle  s    r?  islowerc                 C   s   dd }|S )aP  
    impl is an approximate translation of:
    https://github.com/python/cpython/blob/201c8f79450628241574fba940e08107178dc3a5/Objects/unicodeobject.c#L11900-L11933    # noqa: E501
    mixed with:
    https://github.com/python/cpython/blob/201c8f79450628241574fba940e08107178dc3a5/Objects/bytes_methods.c#L131-L156    # noqa: E501
    c                 S   sp   t | }|dkrtt| dS |dkr*dS d}t|D ]4}t| |}t|sTt|rZ dS |s6t|r6d}q6|S r+  )r   r1   r   r   r0   r6   )rE   rF   r.  r   r   rX   rX   rY   r?  :  s    
zunicode_islower.<locals>.implrX   r#  rX   rX   rY   unicode_islower1  s    	rA  isidentifierc                 C   s   dd }|S )z%Implements UnicodeType.isidentifier()c                 S   s^   t | }|dkrdS t| d}t|s2|dkr2dS td|D ]}t| |}t|s< dS q<dS )Nr   F_   rt   T)r   r   r,   r   r-   )rE   rF   Zfirst_cpr   r}  rX   rX   rY   r?  Q  s    

z"unicode_isidentifier.<locals>.implrX   r#  rX   rX   rY   unicode_isidentifierM  s    rD  c                    s    fdd}|S )Nc                    s    fdd}|S )Nc                    sX   t | }|dkr t| dS r.|dkr.dS t|D ]}t| |} |s6 dS q6dS r+  r,  )rE   rF   r   r}  _PyUnicode_IS_funcempty_is_falserX   rY   r?  g  s    
z*gen_isX.<locals>.unicode_isX.<locals>.implrX   r#  rE  rX   rY   unicode_isXf  s    zgen_isX.<locals>.unicode_isXrX   )rF  rG  rH  rX   rE  rY   gen_isXe  s    rI  isspace	isnumericisdigit	isdecimalisprintablec                    s    fdd}|S )z)Generate common case operation performer.c           	         s   t | }|dkr t| j|| jS | jrBt| j|d} | | |S ttd| | j}dg}| |||}|d }t|}t||t|}t|D ]}t||t	|| q|S )Nr   rt      )
r   r   r_   r`   r   r   r   r   r   r   )	rE   rF   r   tmpmaxcharsZ	newlengthmaxcharZnewkindr   r   rX   rY   r?    s     
zcase_operation.<locals>.implrX   )r!  r"  r?  rX   r   rY   case_operation  s    rS  c                 C   s   d}|d }|dkr2t | |}t|s(q2|d8 }q|dko@t|}|r|d }||k rtt | |}t|sjqt|d7 }qN||kpt| }|rdS dS )zEThis is a translation of the function that handles the capital sigma.r   rt   i  i  )r   r/   r.   )rE   rF   r   r   r5  Zfinal_sigmarX   rX   rY   _handle_capital_sigma  s"    



rT  c                 C   s&   | dkrt ||||d< dS t| |S )z>This is a translation of the function that lowers a character.i  r   rt   )rT  r&   )r}  rE   rF   r   mappedrX   rX   rY   _lower_ucs4  s    rV  c                    s    fdd}|S )Nc           
         s   d}t |D ]t}tjdtd}t| |} r>t|| |||}n
t||}|d | D ]*}	t|d |	|d< t|||	 |d7 }qTq|S Nr   rO  rq  rt   )	r   r   zerosr#   r   rV  r%   maxr   )
rE   rF   r   rQ  kr   rU  r}  n_resr0  lowerrX   rY   _do_upper_or_lower  s    

z7_gen_unicode_upper_or_lower.<locals>._do_upper_or_lowerrX   )r^  r_  rX   r]  rY   _gen_unicode_upper_or_lower  s    r`  c                    s    fdd}|S )Nc                    s0   t t| D ]}t| |}t|| | qd S r   )r   r   r   r   rE   r   r   r}  funcrX   rY   _ascii_upper_or_lower  s    
z8_gen_ascii_upper_or_lower.<locals>._ascii_upper_or_lowerrX   )rc  rd  rX   rb  rY   _gen_ascii_upper_or_lower  s    re  r^  c                 C   s
   t ttS )zImplements .lower())rS  _ascii_lower_unicode_lowerr:  rX   rX   rY   unicode_lower  s    rh  upperc                 C   s
   t ttS )zImplements .upper())rS  _ascii_upper_unicode_upperr:  rX   rX   rY   unicode_upper  s    rl  c                 C   s~   d}t jdtd}t|D ]^}|d t| |}t||}|d | D ].}	|d }
t|
|	|d< t|||	 |d7 }qHq|S rW  )	r   rY  r#   r   fillr   r'   rZ  r   )rE   rF   r   rQ  r[  rU  r   r}  r\  r0  rR  rX   rX   rY   _unicode_casefold 	  s    


rn  c                 C   s0   t t| D ]}t| |}t||t| qd S r   )r   r   r   r   r"   ra  rX   rX   rY   _ascii_casefold	  s    
ro  casefoldc                 C   s
   t ttS )zImplements str.casefold())rS  ro  rn  r:  rX   rX   rY   unicode_casefold	  s    rq  c                 C   s   d}d}t jdtd}t| d}t||}|d | D ]"}	t||	}t|||	 |d7 }q6td|D ]X}
|d t| |
}t	|| ||
|}|d | D ]"}	t||	}t|||	 |d7 }qqd||d< |S rW  )
r   rY  r#   r   r(   rZ  r   r   rm  rV  )rE   rF   r   rQ  r[  rR  rU  r}  r\  r0  r   rX   rX   rY   _unicode_capitalize	  s&    






rr  c                 C   sL   t | d}t|dt| tdt| D ]}t | |}t||t| q(d S r^  )r   r   r!   r   r   r"   )rE   r   r}  r   rX   rX   rY   _ascii_capitalize9	  s
    

rs  
capitalizec                 C   s
   t ttS r   )rS  rs  rr  r:  rX   rX   rY   unicode_capitalizeC	  s    ru  c                 C   s   d}d}t jdtd}t|D ]}|d t| |}|rLt|| |||}	ntt||}	|d|	 D ],}
|\}t||
|d< t	|||
 |d7 }qft
t|}q|S )zCThis is a translation of the function that titles a unicode string.r   FrO  rX  Nrt   )r   emptyr#   r   rm  r   rV  r(   rZ  r   r.   )rE   rF   r   rQ  r[  Zprevious_casedrU  r   r}  r\  r0  rR  rX   rX   rY   _unicode_titleI	  s     


rw  c                 C   sh   d}t t| D ]R}t| |}t|r8|s2t|}d}nt|rR|rLt|}d}nd}t||| qdS )z" Does .title() on an ASCII string FTN)r   r   r   r7   r!   r8   r"   r   )rE   r   r>  r   r}  rX   rX   rY   _ascii_title`	  s    
rx  titlec                 C   s
   t ttS )zImplements str.title())rS  rx  rw  r:  rX   rX   rY   unicode_titlet	  s    rz  c                 C   sN   t t| D ]<}t| |}t|r,t|}nt|r<t|}t||| qd S r   )r   r   r   r8   r"   r7   r!   r   ra  rX   rX   rY   _ascii_swapcase|	  s    

r{  c                 C   s   d}d}t jdtd}t|D ]}|d t| |}t|rPt|| |||}	n t|rdt	||}	nd}	||d< |d |	 D ]"}
t
||
}t|||
 |d7 }q|q||d< |S rW  )r   rv  r#   r   rm  r   r0   rV  r1   r%   rZ  r   )rE   rF   r   rQ  r[  rR  rU  r   r}  r\  r0  rX   rX   rY   _unicode_swapcase	  s$    


r|  swapcasec                 C   s
   t ttS r   )rS  r{  r|  r:  rX   rX   rY   unicode_swapcase	  s    r~  c                 C   s   t | tjrdd }|S d S )Nc                 S   s"   t | }|dkrtdt| dS )Nrt   zord() expected a characterr   )r   	TypeErrorr   )r   ZlcrX   rX   rY   r?  	  s    zol_ord.<locals>.implr   )r   r?  rX   rX   rY   ol_ord	  s    r  c                 C   s4   | t kstt| }t|d|tk}t|d|  |S r   )_MAX_UNICODEr   r   r   r   r   )r   rG   r  rX   rX   rY   _unicode_char	  s
    r  zchr() arg not in range(0x%hx)c                 C   s$   | dk s| t krtttt| S r   )r  rv   _out_of_range_msgr  r#   )ordinalrX   rX   rY   _PyUnicode_FromOrdinal	  s    r  c                 C   s   t | tjrdd }|S d S )Nc                 S   s   t | S r   )r  )r   rX   rX   rY   r?  	  s    zol_chr.<locals>.impl)r   r   r  )r   r?  rX   rX   rY   ol_chr	  s    r  __str__c                 C   s   dd S )Nc                 S   s   | S r   rX   r   rX   rX   rY   r)  	  r4  zunicode_str.<locals>.<lambda>rX   r   rX   rX   rY   unicode_str	  s    r  __repr__c                 C   s   dd S )Nc                 S   s   d|  d S )N'rX   r   rX   rX   rY   r)  	  r4  zunicode_repr.<locals>.<lambda>rX   r   rX   rX   rY   unicode_repr	  s    r  c                    s   | d  fdd}|S )N
   c           	         s   d}| dk r|  } d}| dkr"dS |d t tt|  }t}t|}t|||d}|rlt|dtd |d }| dkrt	|  \} }td| }t||| |d8 }qt|S )NFr   Tr  rt   r  )
r  r   floorlog10r   rx   r   r   orddivmod)	r   flagrF   rG   r   r   r   digitr   tenrX   rY   r?  	  s&    
zinteger_str.<locals>.implrX   )r   r?  rX   r  rY   integer_str	  s    r  c                 C   s   dd S )Nc                 S   s   |   S r   )r  r   rX   rX   rY   r)  	  r4  zinteger_repr.<locals>.<lambda>rX   r  rX   rX   rY   integer_repr	  s    r  c                 C   s   dd S )Nc                 S   s   | rdS dS )NTrueFalserX   r   rX   rX   rY   r)  
  r4  zboolean_str.<locals>.<lambda>rX   r  rX   rX   rY   boolean_str
  s    r  getiterc           
      C   sp   |j \}|\}| ||j}| tjd}t||}||_||_	| j
rX| j||| | }	t| ||j|	S r   )r   r  return_typer   r   re   r   alloca_once_valuerc   rE   r  r   r  r   r   )
r   r   r   r   r   rE   iterobjr4  Zindexptrr   rX   rX   rY   getiter_unicode
  s    r  iternextc              	   C   s   |j \}|\}| j}|tj}||tjtjfi }	| 	||	}
|t
}||tjfi }| 	||}| j|||d}|||jf}||j}|d||}|| ||: |
||j|f}|| t||}|||j W 5 Q R X d S )Nr   <)r   r  r  operatorgetitemr   r   r   re   r  r   r  rE   r   rc   icmp_unsigned	set_validif_thenyield_r   increment_indexr   )r   r   r   r   rM  itertyitertyctxfntyZgetitem_siggetitem_implZlen_sigr   r  Zstrlenrc   is_validZgotitemZnindexrX   rX   rY   iternext_unicode%
  s*    


r  )r   )NN)NN)NN)NN)NN)NN)NN)r   )Nr   )Nr   )r  )F)N)N)N)T)r   )T)rx  r  numpyr   llvmlite.irr   r   numba.core.cgutilsr   numba.core.extendingr   r   r   r   r	   r
   r   r   r   r   numba.core.imputilsr   r   r   r   r   r   numba.core.datamodelr   r   
numba.corer   r   numba.core.pythonapir   r   r   r   Znumba._helperlibr   Znumba.cpython.hashingr   Znumba.core.unsafe.bytesr   numba.core.errorsr    Znumba.cpython.unicode_supportr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   numba.cpythonrB   r  rM   bitwidthr(  r   rD   UnicodeIteratorTyperb   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r   r   r   r   r   eqr	  ner  ltr  gtr  ler  ger  containsr  r$  r%  r+  r,  r8  r:  r@  r  rG  rD  rH  rP  rR  r\  rd  rf  r;  rr  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rb  r  r  r  r  r_  r  r  r  r  r  r  r   iaddr  r  r   r  not_r  r  r%  Z_unicode_is_alnumr3  Z_always_falser6  r7  r8  r;  r?  rA  rD  rI  rS  rT  rV  r`  rk  rg  re  rj  rf  rh  rl  rn  ro  rq  rr  rs  ru  rw  rx  rz  r{  r|  r~  r  r  r  r  r  chrr  r  r  r  r  r  r  r  r  NEWr  rX   rX   rX   rY   <module>   s@  0 	






















&



	
	
	


.
0





#
$

$

4
1
@
T,
Q
%)#







		







%
<



1!





%





	

	
	
	