§
    2@ÄjŽ†  ã                   ó¢   — d Z ddlZddlmZ  ej        dd¦  «        ZdZdZdZ ej        d	d
¦  «        Z	 ej        dd¦  «        Z
d„ Zd„ Zd„ ZdS )zˆ
Timsort implementation.  Mostly adapted from CPython's listobject.c.

For more information, see listsort.txt in CPython's source tree.
é    N)ÚtypesÚTimsortImplementation)ÚcompileÚ	count_runÚ
binarysortÚgallop_leftÚgallop_rightÚ
merge_initÚmerge_appendÚ	merge_popÚmerge_compute_minrunÚmerge_loÚmerge_hiÚmerge_atÚmerge_force_collapseÚmerge_collapseÚrun_timsortÚrun_timsort_with_valueséU   é   é   Ú
MergeState)Ú
min_gallopÚkeysÚvaluesÚpendingÚnÚMergeRun)ÚstartÚsizec                 óZ  ‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡—  | ‰¦  «        Št           j        Š ‰d¦  «        Š| d„ ¦   «         Š
| ˆˆˆfd„¦   «         Š| ˆˆˆfd„¦   «         Š| d„ ¦   «         Š| d„ ¦   «         Š| ˆ
ˆfd„¦   «         Š| ˆfd„¦   «         Š| d	„ ¦   «         Š| ˆˆ
fd
„¦   «         Š| ˆfd„¦   «         Š| ˆfd„¦   «         Š| ˆfd„¦   «         Š	| d„ ¦   «         Š| ˆ
fd„¦   «         Š| ˆ
fd„¦   «         ŠdŠ| ˆˆˆˆ	ˆ
ˆˆˆfd„¦   «         Š| ˆˆˆˆ	ˆ
ˆˆˆˆf	d„¦   «         Š| ˆˆ	ˆˆˆfd„¦   «         Š| ˆfd„¦   «         Š| ˆfd„¦   «         Š| ˆ
fd„¦   «         Š| ˆˆˆˆˆˆˆˆfd„¦   «         Š| ˆˆfd„¦   «         }| ˆˆfd„¦   «         }t          | ‰‰‰‰	‰‰‰‰‰‰‰‰‰||¦  «        S )Nr   c                 ó
   — || uS ©N© )r   r   s     úCC:\Projects\Historical\venv\Lib\site-packages\numba/misc/timsort.pyÚ
has_valuesz%make_timsort_impl.<locals>.has_values?   s   € à˜TÐ!Ð!ó    c                 óä   •— t          t          | ¦  «        dz  dz   t          ¦  «        } ‰| |¦  «        }|}t          ‰‰¦  «        gt          z  }t           ‰t          ¦  «        |||‰¦  «        S )z?
        Initialize a MergeState for a non-keyed sort.
        é   é   ©ÚminÚlenÚMERGESTATE_TEMP_SIZEr   ÚMAX_MERGE_PENDINGr   Ú
MIN_GALLOP)r   Ú	temp_sizeÚ	temp_keysÚtemp_valuesr   ÚintpÚmake_temp_areaÚzeros        €€€r%   r
   z%make_timsort_impl.<locals>.merge_initC   sr   ø€ õ
 �˜D™	œ	 Q™¨Ñ*Õ,@ÑAÔAˆ	Ø"�N 4¨Ñ3Ô3ˆ	ØˆÝ˜D $Ñ'Ô'Ð(Õ+<Ñ<ˆÝ˜$˜$�zÑ*Ô*¨I°{ÀGÈTÑRÔRÐRr'   c                 óø   •— t          t          | ¦  «        dz  dz   t          ¦  «        } ‰| |¦  «        } ‰||¦  «        }t          ‰‰¦  «        gt          z  }t           ‰t          ¦  «        |||‰¦  «        S )z;
        Initialize a MergeState for a keyed sort.
        r)   r*   r+   )	r   r   r1   r2   r3   r   r4   r5   r6   s	         €€€r%   Úmerge_init_with_valuesz1make_timsort_impl.<locals>.merge_init_with_valuesN   s~   ø€ õ
 �˜D™	œ	 Q™¨Ñ*Õ,@ÑAÔAˆ	Ø"�N 4¨Ñ3Ô3ˆ	Ø$�n V¨YÑ7Ô7ˆÝ˜D $Ñ'Ô'Ð(Õ+<Ñ<ˆÝ˜$˜$�zÑ*Ô*¨I°{ÀGÈTÑRÔRÐRr'   c                 ó’   — | j         }|t          k     sJ ‚|| j        |<   t          | j        | j        | j        | j        |dz   ¦  «        S )z2
        Append a run on the merge stack.
        r*   )r   r/   r   r   r   r   r   )ÚmsÚrunr   s      r%   r   z'make_timsort_impl.<locals>.merge_appendY   sJ   € ð
 ŒDˆØÕ$Ò$Ð$Ð$Ð$ØˆŒ
�1‰Ý˜"œ-¨¬°"´)¸R¼ZÈÈQÉÑOÔOÐOr'   c                 ó`   — t          | j        | j        | j        | j        | j        dz
  ¦  «        S )z7
        Pop the top run from the merge stack.
        r*   )r   r   r   r   r   r   )r:   s    r%   r   z$make_timsort_impl.<locals>.merge_popc   s)   € õ
 ˜"œ-¨¬°"´)¸R¼ZÈÌÐPQÉÑRÔRÐRr'   c                 ó  •— t          | j        ¦  «        }||k    r| S ||k     r|dz  }||k     ° ‰| j        |¦  «        } ‰| j        | j        ¦  «        r ‰| j        |¦  «        }n|}t          | j        ||| j        | j        ¦  «        S )zJ
        Ensure enough temp memory for 'need' items is available.
        r*   )r-   r   r   r   r   r   r   )r:   ÚneedÚallocedr2   r3   r&   r5   s        €€r%   Úmerge_getmemz'make_timsort_impl.<locals>.merge_getmemj   s    ø€ õ
 �b”g‘,”,ˆØ�7Š?ˆ?ØˆIà˜ŠnˆnØ ‘lˆGð ˜Šnˆnð #�N 2¤7¨GÑ4Ô4ˆ	Øˆ:�b”g˜rœyÑ)Ô)ð 	$Ø(˜.¨¬°GÑ<Ô<ˆKˆKà#ˆKÝ˜"œ-¨°KÀÄÈRÌTÑRÔRÐRr'   c                 ód   •— t           ‰|¦  «        | j        | j        | j        | j        ¦  «        S )z5
        Modify the MergeState's min_gallop.
        )r   r   r   r   r   )r:   Ú
new_gallopr4   s     €r%   Úmerge_adjust_gallopz.make_timsort_impl.<locals>.merge_adjust_gallop~   s-   ø€ õ
 ˜$˜$˜zÑ*Ô*¨B¬G°R´YÀÄ
ÈBÌDÑQÔQÐQr'   c                 ó   — | |k     S )z‡
        Trivial comparison function between two keys.  This is factored out to
        make it clear where comparisons occur.
        r$   )ÚaÚbs     r%   ÚLTzmake_timsort_impl.<locals>.LT†   s   € ð �1Šuˆr'   c                 ó¢  •— ||k    r||k    sJ ‚ ‰| |¦  «        }||k    r|dz  }||k     r¢| |         }|}|}||k     r+|||z
  dz	  z   }	 ‰|| |	         ¦  «        r|	}n|	dz   }||k     °+t          ||d¦  «        D ]}	| |	dz
           | |	<   Œ|| |<   |r/||         }
t          ||d¦  «        D ]}	||	dz
           ||	<   Œ|
||<   |dz  }||k     ° dS dS )a¦  
        binarysort is the best method for sorting small arrays: it does
        few compares, but can do data movement quadratic in the number of
        elements.
        [lo, hi) is a contiguous slice of a list, and is sorted via
        binary insertion.  This sort is stable.
        On entry, must have lo <= start <= hi, and that [lo, start) is already
        sorted (pass start == lo if you don't know!).
        r*   éÿÿÿÿN©Úrange)r   r   ÚloÚhir   Ú_has_valuesÚpivotÚlÚrÚpÚ	pivot_valrG   r&   s              €€r%   r   z%make_timsort_impl.<locals>.binarysortŽ   sJ  ø€ ð �UŠ{ˆ{˜u¨š{˜{˜{Ð*Ø �j  vÑ.Ô.ˆØ�Š;ˆ;Ø�Q‰JˆEØ�bŠjˆjØ˜”KˆEð ˆAØˆAð
 �a’%�%Ø˜!˜a™% A™Ñ&�Ø�2�e˜T !œWÑ%Ô%ð Ø�A�Aà˜!™�Að �a’%�%õ ˜5 ! RÑ(Ô(ð &ð &�Ø˜q 1™uœ+��Q‘�ØˆD�‰GØð &Ø" 5œM�	Ý˜u a¨Ñ,Ô,ð .ð .�AØ & q¨1¡u¤�F˜1‘I�IØ%��q‘	à�Q‰JˆEðA �bŠjˆjˆjˆjˆjˆjr'   c                 ód  •— ||k     sJ ‚|dz   |k    rdS  ‰| |dz            | |         ¦  «        rAt          |dz   |¦  «        D ]&} ‰| |         | |dz
           ¦  «        s	||z
  dfc S Œ'||z
  dfS t          |dz   |¦  «        D ]&} ‰| |         | |dz
           ¦  «        r	||z
  dfc S Œ'||z
  dfS )aÞ  
        Return the length of the run beginning at lo, in the slice [lo, hi).
        lo < hi is required on entry.  "A run" is the longest ascending sequence, with

            lo[0] <= lo[1] <= lo[2] <= ...

        or the longest descending sequence, with

            lo[0] > lo[1] > lo[2] > ...

        A tuple (length, descending) is returned, where boolean *descending*
        is set to 0 in the former case, or to 1 in the latter.
        For its intended use in a stable mergesort, the strictness of the defn of
        "descending" is needed so that the caller can safely reverse a descending
        sequence without violating stability (strict > ensures there are no equal
        elements to get out of order).
        r*   )r*   Fr)   TFrJ   )r   rL   rM   ÚkrG   s       €r%   r   z$make_timsort_impl.<locals>.count_runÀ   s  ø€ ð& �BŠwˆwˆwˆwØ�‰6�RŠ<ˆ<à�8Øˆ2ˆd�2˜‘6Œl˜D œHÑ%Ô%ð 	"å˜2 ™6 2Ñ&Ô&ð (ð (�Ø�r˜$˜qœ' 4¨¨A©¤;Ñ/Ô/ð (Ø˜r™6 4˜<Ð'Ð'Ð'ð(à˜‘7˜D�=Ð õ ˜2 ™6 2Ñ&Ô&ð )ð )�Ø�2�d˜1”g˜t A¨¡Eœ{Ñ+Ô+ð )Ø˜r™6 5˜=Ð(Ð(Ð(ð)à˜‘7˜E�>Ð!r'   c                 ó:  •— ||k    sJ ‚||k    r||k     sJ ‚||z
  }d}d} ‰
||         | ¦  «        rM||z
  }||k     r/ ‰
|||z            | ¦  «        r|}|dz  dz   }|dk    r|}nn||k     °/||k    r|}||z  }||z  }nN||z
  dz   }||k     r. ‰
|||z
           | ¦  «        rn|}|dz  dz   }|dk    r|}||k     °.||k    r|}||z
  ||z
  }}|dz
  |k    r||k     r||k    sJ ‚|dz  }||k     r+|||z
  dz	  z   }	 ‰
||	         | ¦  «        r|	dz   }n|	}||k     °+|S )aÃ  
        Locate the proper position of key in a sorted vector; if the vector contains
        an element equal to key, return the position immediately to the left of
        the leftmost equal element.  [gallop_right() does the same except returns
        the position to the right of the rightmost equal element (if any).]

        "a" is a sorted vector with stop elements, starting at a[start].
        stop must be > start.

        "hint" is an index at which to begin the search, start <= hint < stop.
        The closer hint is to the final result, the faster this runs.

        The return value is the int k in start..stop such that

            a[k-1] < key <= a[k]

        pretending that a[start-1] is minus infinity and a[stop] is plus infinity.
        IOW, key belongs at index k; or, IOW, the first k elements of a should
        precede key, and the last stop-start-k should follow key.

        See listsort.txt for info on the method.
        r   r*   r$   ©ÚkeyrE   r   ÚstopÚhintr   ÚlastofsÚofsÚmaxofsÚmrG   s             €r%   r   z&make_timsort_impl.<locals>.gallop_leftå   så  ø€ ð0 �eŠ|ˆ|ˆ|ˆ|Ø�uŠ}ˆ} ¨¢  Ð,Ø�5‰Lˆð ˆØˆØˆ2ˆa�Œg�sÑÔð $	6ð ˜D‘[ˆFØ˜’,�,Ø�2�a˜˜s™
”m SÑ)Ô)ð Ø!�GØ !™8 q™.�CØ˜a’x�xà$˜øð ð ˜’,�,ð �VŠ|ˆ|Ø�à�t‰OˆGØ�4‰KˆCˆCð ˜E‘\ AÑ%ˆFØ˜’,�,Ø�2�a˜˜s™
”m SÑ)Ô)ð %Øð "�GØ !™8 q™.�CØ˜a’x�xà$˜ð ˜’,�,ð �VŠ|ˆ|Ø�à #™: t¨g¡~�SˆGà�q‰y˜GÒ#Ð#¨°#ª¨¸#Àº+¸+¸+ÐEð 	�1‰ˆØ˜ŠmˆmØ˜C '™M¨aÑ/Ñ0ˆAØˆr�!�A”$˜‰}Œ}ð à˜a™%��ð �ð ˜Šmˆmð ˆ
r'   c                 ó:  •— ||k    sJ ‚||k    r||k     sJ ‚||z
  }d}d} ‰
| ||         ¦  «        rP||z
  dz   }||k     r/ ‰
| |||z
           ¦  «        r|}|dz  dz   }|dk    r|}nn||k     °/||k    r|}||z
  ||z
  }}nK||z
  }||k     r. ‰
| |||z            ¦  «        rn|}|dz  dz   }|dk    r|}||k     °.||k    r|}||z  }||z  }|dz
  |k    r||k     r||k    sJ ‚|dz  }||k     r+|||z
  dz	  z   }	 ‰
| ||	         ¦  «        r|	}n|	dz   }||k     °+|S )aû  
        Exactly like gallop_left(), except that if key already exists in a[start:stop],
        finds the position immediately to the right of the rightmost equal value.

        The return value is the int k in start..stop such that

            a[k-1] <= key < a[k]

        The code duplication is massive, but this is enough different given that
        we're sticking to "<" comparisons that it's much harder to follow if
        written as one routine with yet another "left or right?" flag.
        r   r*   r$   rW   s             €r%   r	   z'make_timsort_impl.<locals>.gallop_right;  så  ø€ ð �eŠ|ˆ|ˆ|ˆ|Ø�uŠ}ˆ} ¨¢  Ð,Ø�5‰Lˆð ˆØˆØˆ2ˆc�1�T”7ÑÔð $	ð ˜E‘\ AÑ%ˆFØ˜’,�,Ø�2�c˜1˜T C™Zœ=Ñ)Ô)ð Ø!�GØ !™8 q™.�CØ˜a’x�xà$˜øð ð ˜’,�,ð �VŠ|ˆ|Ø�à #™: t¨g¡~�SˆGˆGð ˜D‘[ˆFØ˜’,�,Ø�2�c˜1˜T C™Zœ=Ñ)Ô)ð %Øð "�GØ !™8 q™.�CØ˜a’x�xà$˜ð ˜’,�,ð �VŠ|ˆ|Ø�à�t‰OˆGØ�4‰KˆCà�q‰y˜GÒ#Ð#¨°#ª¨¸#Àº+¸+¸+ÐEð 	�1‰ˆØ˜ŠmˆmØ˜C '™M¨aÑ/Ñ0ˆAØˆr�#�q˜”t‰}Œ}ð  à��ð ˜a™%�ð ˜Šmˆmð ˆ
r'   c                 óR   — d}| dk    sJ ‚| dk    r|| dz  z  }| dz  } | dk    °| |z   S )a½  
        Compute a good value for the minimum run length; natural runs shorter
        than this are boosted artificially via binary insertion.

        If n < 64, return n (it's too small to bother with fancy stuff).
        Else if n is an exact power of 2, return 32.
        Else return an int k, 32 <= k <= 64, such that n/k is close to, but
        strictly less than, an exact power of 2.

        See listsort.txt for more info.
        r   é@   r*   r$   )r   rQ   s     r%   r   z/make_timsort_impl.<locals>.merge_compute_minrun‡  sK   € ð ˆØ�AŠvˆvˆvˆvØ�2ŠgˆgØ��Q‘‰JˆAØ�!‰GˆAð �2Šgˆgð �1‰uˆr'   c                 óÐ   •— |dk    sJ ‚|dk    sJ ‚t          |¦  «        D ]}|||z            | ||z   <   Œ ‰||¦  «        r#t          |¦  «        D ]}|||z            |||z   <   ŒdS dS )z#
        Upwards memcpy().
        r   NrJ   ©	Ú	dest_keysÚdest_valuesÚ
dest_startÚsrc_keysÚ
src_valuesÚ	src_startÚnitemsÚir&   s	           €r%   Úsortslice_copyz)make_timsort_impl.<locals>.sortslice_copyœ  ó®   ø€ ð ˜AŠ~ˆ~ˆ~ˆ~Ø˜QŠˆˆˆÝ�v‘”ð 	@ð 	@ˆAØ(0°¸Q±Ô(?ˆI�j 1‘nÑ%Ð%Øˆ:�h 
Ñ+Ô+ð 	HÝ˜6‘]”]ð Hð H�Ø.8¸ÀQ¹Ô.G�˜J¨™NÑ+Ð+ð	Hð 	HðHð Hr'   c                 óÐ   •— |dk    sJ ‚|dk    sJ ‚t          |¦  «        D ]}|||z
           | ||z
  <   Œ ‰||¦  «        r#t          |¦  «        D ]}|||z
           |||z
  <   ŒdS dS )z%
        Downwards memcpy().
        r   NrJ   rc   s	           €r%   Úsortslice_copy_downz.make_timsort_impl.<locals>.sortslice_copy_down«  rm   r'   r*   c           	      ó<  •— |dk    r|dk    r||k    sJ ‚|||z   k    sJ ‚ ‰| |¦  «        }  ‰| j         | j        d||||¦  «         | j         }| j        }|}	|}
|}d} ‰||¦  «        }| j        }|dk    �rò|dk    �rëd}d}	  ‰|	|         ||         ¦  «        r=|	|         ||<   |r|
|         ||<   |dz  }|dz  }|dz  }|dk    rnL|dz  }d}||k    rn>n<||         ||<   |r||         ||<   |dz  }|dz  }|dz  }|dk    rn|dz  }d}||k    rnŒ’‰�rD|dk    �r=|dk    �r6|dz  }|t          k    s|t          k    �r||dk    z  } ‰|	|         ||||z   |¦  «        }||z  }|}|dk    r' ‰|||||||¦  «         ||z  }||z  }||z  }|dk    rnÀ|	|         ||<   |r|
|         ||<   |dz  }|dz  }|dz  }|dk    rn’ ‰||         |	|||z   |¦  «        }||z  }|}|dk    r' ‰||||	|
||¦  «         ||z  }||z  }||z  }|dk    rnF||         ||<   |r||         ||<   |dz  }|dz  }|dz  }|dk    rn|t          k    �°	|t          k    �°|dz  }|dk    r|dk    �°ë|dk    r ‰|||||||¦  «         n|dk    sJ ‚||k    sJ ‚ ‰| |¦  «        S )a@  
        Merge the na elements starting at ssa with the nb elements starting at
        ssb = ssa + na in a stable way, in-place.  na and nb must be > 0,
        and should have na <= nb. See listsort.txt for more info.

        An updated MergeState is returned (with possibly a different min_gallop
        or larger temp arrays).

        NOTE: compared to CPython's timsort, the requirement that
            "Must also have that keys[ssa + na - 1] belongs at the end of the merge"

        is removed. This makes the code a bit simpler and easier to reason about.
        r   Tr*   ©r   r   r   r0   )r:   r   r   ÚssaÚnaÚssbÚnbÚa_keysÚa_valuesÚb_keysÚb_valuesÚdestrN   r   ÚacountÚbcountrU   Ú	DO_GALLOPrG   r   r	   r&   rC   r@   rl   s                    €€€€€€€€r%   r   z#make_timsort_impl.<locals>.merge_lo¾  sE  ø€ ð �AŠvˆv˜"˜qš&˜& R¨2¢X X XÐ-Ø�c˜B‘hŠˆˆˆàˆ\˜"˜bÑ!Ô!ˆØˆ�r”w ¤	¨1Ø˜V SØñ	ô 	ð 	ð ”ˆØ”9ˆØˆØˆØˆØˆà �j ¨Ñ2Ô2ˆØ”]ˆ
ð �1Šf‰f˜˜aš™ð ˆFØˆFðØ�2�f˜S”k 6¨#¤;Ñ/Ô/ð Ø!'¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wØà˜a‘K�FØ�FØ Ò+Ð+Øð ,ð "(¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wØà˜a‘K�FØ�FØ Ò+Ð+Øð9ðD ñ A ˜R !šV™V¨¨Qª©Ø˜a‘�
à¥
Ò*Ð*¨f½
Ò.BÑ.Bð  *¨q¢.Ñ0�Jð %˜ V¨C¤[°&¸#¸sÀR¹xÈÑMÔM�Aà˜‘H�AØ�FØ˜1’u�uà&˜ t¨V°TØ'-¨x¸Ø'(ñ*ô *ð *ð  ™	˜Ø˜q™˜Ø˜a™˜Ø š7˜7à!à!'¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wàð $˜ F¨3¤K°¸¸cÀB¹hÈÑLÔL�Aà˜‘H�AØ�FØ˜1’u�uð '˜ t¨V°TØ'-¨x¸Ø'(ñ*ô *ð *ð  ™	˜Ø˜q™˜Ø˜a™˜Ø š7˜7à!à!'¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wàðw ¥
Ò*Ñ*¨f½
Ò.BÑ.Bð| ˜a‘�
ðS �1Šfˆf˜˜aš™ðX �Š7ˆ7àˆN˜4 ¨Ø! 8¨SØñô ð ð ð ˜’7�7�7�7Ø˜3’;�;�;�;ð #Ð" 2 zÑ2Ô2Ð2r'   c           	      óš  •	— |dk    r|dk    r||k    sJ ‚|||z   k    sJ ‚ ‰| |¦  «        }  ‰| j         | j        d||||¦  «         |}|}| j         }	| j        }
||z   dz
  }|dz
  }||z   dz
  } ‰|	|
¦  «        }| j        }|dk    �r|dk    �rýd}d}	  ‰|	|         ||         ¦  «        r=||         ||<   |r||         ||<   |dz  }|dz  }|dz  }|dk    rnL|dz  }d}||k    rn>n<|	|         ||<   |r|
|         ||<   |dz  }|dz  }|dz  }|dk    rn|dz  }d}||k    rnŒ’‰�rV|dk    �rO|dk    �rH|dz  }|t          k    s|t          k    �r'||dk    z  } ‰|	|         |||z
  dz   |dz   |¦  «        }|dz   |z
  }|}|dk    r' ‰|||||||¦  «         ||z  }||z  }||z  }|dk    rnÉ|	|         ||<   |r|
|         ||<   |dz  }|dz  }|dz  }|dk    rn› ‰||         |	||z
  dz   |dz   |¦  «        }|dz   |z
  }|}|dk    r' ‰||||	|
||¦  «         ||z  }||z  }||z  }|dk    rnF||         ||<   |r||         ||<   |dz  }|dz  }|dz  }|dk    rn|t          k    �°|t          k    �°'|dz  }|dk    r|dk    �°ý|dk    r ‰||||z
  dz   |	|
||z
  dz   |¦  «         n|dk    sJ ‚||k    sJ ‚ ‰| |¦  «        S )aA  
        Merge the na elements starting at ssa with the nb elements starting at
        ssb = ssa + na in a stable way, in-place.  na and nb must be > 0,
        and should have na >= nb.  See listsort.txt for more info.

        An updated MergeState is returned (with possibly a different min_gallop
        or larger temp arrays).

        NOTE: compared to CPython's timsort, the requirement that
            "Must also have that keys[ssa + na - 1] belongs at the end of the merge"

        is removed. This makes the code a bit simpler and easier to reason about.
        r   r*   rq   )r:   r   r   rr   rs   rt   ru   rv   rw   rx   ry   rz   rN   r   r{   r|   rU   r}   rG   r   r	   r&   rC   r@   rl   ro   s                    €€€€€€€€€r%   r   z#make_timsort_impl.<locals>.merge_hiY  sŠ  ø€ ð �AŠvˆv˜"˜qš&˜& R¨2¢X X XÐ-Ø�c˜B‘hŠˆˆˆàˆ\˜"˜bÑ!Ô!ˆØˆ�r”w ¤	¨1Ø˜V SØñ	ô 	ð 	ð ˆØˆØ”ˆØ”9ˆð �R‰x˜!‰|ˆØ�1‰fˆØ�B‰h˜‰lˆà �j ¨Ñ2Ô2ˆØ”]ˆ
à�1Šf‰f˜˜aš™ð ˆFØˆFðØ�2�f˜S”k 6¨#¤;Ñ/Ô/ð à!'¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wØà˜a‘K�FØ�FØ Ò+Ð+Øð ,ð "(¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wØà˜a‘K�FØ�FØ Ò+Ð+Øð;ðF ñ A ˜R !šV™V¨¨Qª©Ø˜a‘�
à¥
Ò*Ð*¨f½
Ò.BÑ.Bð  *¨q¢.Ñ0�Jð %˜ V¨C¤[°&¸#À¹(ÀQ¹,ÈÈaÉÐQTÑUÔU�Aà˜a™ !™�AØ�FØ˜1’u�uð ,Ð+¨D°&¸$Ø,2°H¸cØ,-ñ/ô /ð /ð  ™	˜Ø˜q™˜Ø˜a™˜Ø š7˜7à!à!'¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wàð $˜ F¨3¤K°¸¸r¹ÀA¹ÀsÈQÁwÐPSÑTÔT�Aà˜a™ !™�AØ�FØ˜1’u�uà+Ð+¨D°&¸$Ø,2°H¸cØ,-ñ/ô /ð /ð  ™	˜Ø˜q™˜Ø˜a™˜Ø š7˜7à!à!'¨¤�D˜‘JØ"ð 5Ø'/°¤}˜˜t™Ø˜A‘I�DØ˜1‘H�CØ˜!‘G�BØ˜Q’w�wàðw ¥
Ò*Ñ*¨f½
Ò.BÑ.Bð| ˜a‘�
ðU �1Šfˆf˜˜aš™ðZ �Š7ˆ7àˆN˜4 ¨°©°Q©Ø! 8¨S°2©X¸©\Øñô ð ð ð ˜’7�7�7�7Ø˜3’;�;�;�;ð #Ð" 2 zÑ2Ô2Ð2r'   c           	      ó\  •— | j         }|dk    sJ ‚|dk    sJ ‚||dz
  k    s||dz
  k    sJ ‚| j        |         \  }}| j        |dz            \  }}|dk    r|dk    sJ ‚||z   |k    sJ ‚t          |||z   ¦  «        | j        |<   ||dz
  k    r| j        |dz            | j        |dz   <    ‰| ¦  «        }  ‰||         ||||z   |¦  «        }	||	|z
  z  }|	}|dk    r| S  ‰
|||z   dz
           ||||z   ||z   dz
  ¦  «        }	|	|z
  }||k    r ‰| ||||||¦  «        S  ‰| ||||||¦  «        S )zl
        Merge the two runs at stack indices i and i+1.

        An updated MergeState is returned.
        r)   r   é   r*   )r   r   r   )r:   r   r   rk   r   rr   rs   rt   ru   rU   r   r	   r   r   r   s             €€€€€r%   r   z#make_timsort_impl.<locals>.merge_at÷  s�  ø€ ð ŒDˆØ�AŠvˆvˆvˆvØ�AŠvˆvˆvˆvØ�A˜‘EŠzˆz˜Q ! a¡%šZ˜Z˜ZÐ'à”*˜Q”-‰ˆˆRØ”*˜Q ™UÔ#‰ˆˆRØ�AŠvˆv˜"˜qš&˜&˜&Ð Ø�R‰x˜3Šˆˆˆõ
 !  b¨2¡gÑ.Ô.ˆŒ
�1‰Ø��A‘Š:ˆ:Ø "¤
¨1¨q©5Ô 1ˆBŒJ�q˜1‘uÑØˆY�r‰]Œ]ˆð ˆL˜˜cœ D¨#¨s°R©x¸Ñ=Ô=ˆà
ˆa�#‰g‰ˆØˆØ�Š7ˆ7ØˆIð ˆK˜˜S 2™X¨™\Ô*¨D°#°s¸R±xÀÀrÁÈAÁÑNÔNˆà�‰Wˆð �Š8ˆ8Ø�8˜B  f¨c°2°s¸BÑ?Ô?Ð?à�8˜B  f¨c°2°s¸BÑ?Ô?Ð?r'   c                 óø  •— | j         dk    rí| j        }| j         dz
  }|dk    r0||dz
           j        ||         j        ||dz            j        z   k    s6|dk    rf||dz
           j        ||dz
           j        ||         j        z   k    r6||dz
           j        ||dz            j        k     r|dz  } ‰| |||¦  «        } n/||         j        ||dz            j        k     r ‰| |||¦  «        } nn| j         dk    °í| S )a(  
        Examine the stack of runs waiting to be merged, merging adjacent runs
        until the stack invariants are re-established:

        1. len[-3] > len[-2] + len[-1]
        2. len[-2] > len[-1]

        An updated MergeState is returned.

        See listsort.txt for more info.
        r*   r)   r   ©r   r   r    ©r:   r   r   r   r   r   s        €r%   r   z)make_timsort_impl.<locals>.merge_collapse'  s  ø€ ð Œd�QŠhˆhØ”jˆGØ”�q‘ˆAØ�Q’�˜7 1 Q¡3œ<Ô,°¸´
´À'È!ÈAÉ#Ä,ÔBSÑ0SÒSÐSØ�Q’�˜7 1 Q¡3œ<Ô,°¸¸!¹´Ô0AÀGÈAÄJÄOÑ0SÒSÐSØ˜1˜q™5”>Ô&¨°°Q±¬Ô)<Ò<Ð<à˜‘F�AØ�X˜b $¨°Ñ2Ô2��Ø˜”” 7¨1¨q©5¤>Ô#6Ò6Ð6Ø�X˜b $¨°Ñ2Ô2��àð Œd�QŠhˆhð ˆ	r'   c                 óÌ   •— | j         dk    rW| j        }| j         dz
  }|dk    r'||dz
           j        ||dz            j        k     r|dz  } ‰| |||¦  «        } | j         dk    °W| S )z¾
        Regardless of invariants, merge all runs on the stack until only one
        remains.  This is used at the end of the mergesort.

        An updated MergeState is returned.
        r*   r)   r   r‚   rƒ   s        €r%   r   z/make_timsort_impl.<locals>.merge_force_collapseC  s~   ø€ ð Œd�QŠhˆhØ”jˆGØ”�q‘ˆAØ�1ŠuˆuØ˜1˜q™5”>Ô&¨°°Q±¬Ô)<Ò<Ð<à˜‘F�AØ�˜"˜d F¨AÑ.Ô.ˆBð Œd�QŠhˆhð ˆ	r'   c                 óø   •— |}|dz
  }||k     r'| |         | |         c| |<   | |<   |dz  }|dz  }||k     °' ‰| |¦  «        r6|}|dz
  }||k     r+||         ||         c||<   ||<   |dz  }|dz  }||k     °'dS dS dS )z,
        Reverse a slice, in-place.
        r*   Nr$   )r   r   r   rY   rk   Újr&   s         €r%   Úreverse_slicez(make_timsort_impl.<locals>.reverse_sliceV  sÐ   ø€ ð
 ˆØ�1‰HˆØ�!ŠeˆeØ# Aœw¨¨Q¬ÐˆD�‰G�T˜!‘WØ�‰FˆAØ�‰FˆAð �!Šeˆeð ˆ:�d˜FÑ#Ô#ð 	ØˆAØ�q‘ˆAØ�a’%�%Ø'-¨a¤y°&¸´)Ð$��q‘	˜6 !™9Ø�Q‘�Ø�Q‘�ð �a’%�%�%�%ð	ð 	ð �%r'   c                 óè  •— t          |¦  «        }|dk     rdS  ‰|¦  «        }‰}|dk    rŠ ‰
||||z   ¦  «        \  }}|r ‰|||||z   ¦  «         ||k     r't          ||¦  «        } ‰	|||||z   ||z   ¦  «         |} ‰| t          ||¦  «        ¦  «        }  ‰| ||¦  «        } ||z  }||z  }|dk    °Š ‰| ||¦  «        } | j        dk    sJ ‚| j        d         dt          |¦  «        fk    sJ ‚dS )z2
        Run timsort with the mergestate.
        r)   Nr   r*   )r-   r,   r   r   r   )r:   r   r   Ú
nremainingÚminrunrL   r   ÚdescÚforcer   r   r   r   r   r   r‡   r6   s            €€€€€€€€r%   Úrun_timsort_with_mergestatez6make_timsort_impl.<locals>.run_timsort_with_mergestatej  sM  ø€ õ
 ˜‘Y”Yˆ
Ø˜Š>ˆ>ØˆFð &Ð% jÑ1Ô1ˆàˆØ˜1ŠnˆnØ�i  b¨"¨z©/Ñ:Ô:‰GˆAˆtØð 8à�˜d F¨B°°Q±Ñ7Ô7Ð7à�6ŠzˆzÝ˜F JÑ/Ô/�Ø�
˜4 ¨¨R°%©Z¸¸a¹Ñ@Ô@Ð@Ø�à�˜b¥(¨2¨q¡/¤/Ñ2Ô2ˆBØ�  D¨&Ñ1Ô1ˆBà�!‰GˆBØ˜!‰OˆJð ˜1Šnˆnð$ "Ð! " d¨FÑ3Ô3ˆØŒt�qŠyˆyˆyˆyØŒz˜!Œ} ¥C¨¡I¤I Ò.Ð.Ð.Ð.Ð.Ð.r'   c                 ó8   •— | } ‰ ‰| ¦  «        | |¦  «         dS )z2
        Run timsort over the given keys.
        Nr$   )r   r   r
   r�   s     €€r%   r   z&make_timsort_impl.<locals>.run_timsort�  s/   ø€ ð
 ˆØ#Ð# J J¨tÑ$4Ô$4°d¸FÑCÔCÐCÐCÐCr'   c                 ó6   •—  ‰ ‰| |¦  «        | |¦  «         dS )z=
        Run timsort over the given keys and values.
        Nr$   )r   r   r8   r�   s     €€r%   r   z2make_timsort_impl.<locals>.run_timsort_with_values˜  s9   ø€ ð
 	$Ð#Ð$:Ð$:¸4ÀÑ$HÔ$HØ$(¨&ñ	2ô 	2ð 	2ð 	2ð 	2r'   )r   r4   r   )Úwrapr5   r   r   r}   rG   r   r   r   r	   r&   r4   rC   r   r   r   r   r   r@   r   r
   r8   r   r   r‡   r�   rl   ro   r6   s    `  @@@@@@@@@@@@@@@@@@@@@@@@@r%   Úmake_timsort_implr‘   9   sÐ  øøøøøøøøøøøøøøøøøøøøøøøøøø€ à�T˜.Ñ)Ô)€NÝŒ:€DØˆ4�‰7Œ7€Dà	ð"ð "ñ 
„Tð"ð 
ðSð Sð Sð Sð Sð Sñ 
„TðSð 
ðSð Sð Sð Sð Sð Sñ 
„TðSð 
ðPð Pñ 
„TðPð 
ðSð Sñ 
„TðSð 
ðSð Sð Sð Sð Sñ 
„TðSð& 
ðRð Rð Rð Rñ 
„TðRð 
ðð ñ 
„Tðð 
ð.ð .ð .ð .ð .ñ 
„Tð.ðb 
ð!"ð !"ð !"ð !"ñ 
„Tð!"ðH 
ðRð Rð Rð Rñ 
„TðRðj 
ðHð Hð Hð Hñ 
„TðHðV 
ðð ñ 
„Tðð( 
ðHð Hð Hð Hñ 
„TðHð 
ðHð Hð Hð Hñ 
„TðHð  €Ià	ðW3ð W3ð W3ð W3ð W3ð W3ð W3ð W3ð W3ð W3ð W3ñ 
„TðW3ðt 
ðZ3ð Z3ð Z3ð Z3ð Z3ð Z3ð Z3ð Z3ð Z3ð Z3ð Z3ð Z3ñ 
„TðZ3ðz 
ð,@ð ,@ð ,@ð ,@ð ,@ð ,@ð ,@ð ,@ñ 
„Tð,@ð^ 
ðð ð ð ñ 
„Tðð6 
ðð ð ð ñ 
„Tðð$ 
ðð ð ð ñ 
„Tðð& 
ð!/ð !/ð !/ð !/ð !/ð !/ð !/ð !/ð !/ð !/ð !/ñ 
„Tð!/ðH 
ðDð Dð Dð Dð Dñ 
„TðDð 
ð2ð 2ð 2ð 2ð 2ñ 
„Tð2õ !ØØ�:˜{¨LØ�L )Ø˜h¨°(Ø˜nØÐ,ñ.ô .ð .r'   c                  ó   — t          d„ g| ¢R Ž S )Nc                 ó   — | S r#   r$   )Úfs    r%   ú<lambda>z!make_py_timsort.<locals>.<lambda>ª  s   € ¨€ r'   )r‘   )Úargss    r%   Úmake_py_timsortr—   ©  s   € Ý˜k˜kÐ2¨TÐ2Ð2Ð2Ð2r'   c                  ó0   ‡— ddl mŠ t          ˆfd„g| ¢R Ž S )Nr   )Újitc                 ó.   •—   ‰d¬¦  «        | ¦  «        S )NT)Únopythonr$   )r”   r™   s    €r%   r•   z"make_jit_timsort.<locals>.<lambda>®  s   ø€ Ð(:¨¨°TÐ(:Ñ(:Ô(:¸1Ñ(=Ô(=€ r'   )Únumbar™   r‘   )r–   r™   s    @r%   Úmake_jit_timsortr�   ¬  s@   ø€ ØÐÐÐÐÐÝÐ=Ð=Ð=Ð=ð %Ø#ð%ð %ð %ð %r'   )Ú__doc__ÚcollectionsÚ
numba.corer   Ú
namedtupler   r/   r0   r.   r   r   r‘   r—   r�   r$   r'   r%   ú<module>r¢      sÕ   ððð ð Ð Ð Ð à Ð Ð Ð Ð Ð ð /˜Ô.Øð	ñô Ð ð* Ð ð €
ð Ð ð $ˆ[Ô#ØÐBñDô D€
ð "ˆ;Ô! *Ð.?Ñ@Ô@€ðm.ð m.ð m.ð`3ð 3ð 3ð%ð %ð %ð %ð %r'   