
    Ng~                     X   d Z ddlZddlZddlmZ ddlmZ ddlmZ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mZmZ ddlmZmZmZ ddlmZ g d	Z e       Z	  e d
        e	e d
      Z! e#edd       Z$d Z%dPdZ&d Z'dQdZ(dQdZ)dQdZ*e+fdZ,d Z-e-Z.d Z/d Z0d Z1dQdZ2d Z3	 ddl
m4Z5 d Z4e3j                   e4_          G d de7      Z8d Z9d  Z:dRd!Z;d" Z<d# Z=d$ Z>dQd%Z?dQd&Z@dSd(ZAdQd)ZBdTd*ZCd+d,d-ZDdQd.ZEd/ ZFd0 ZGd1 ZHd2 ZId3 ZJd4 ZKd5 ZLd6 ZMd7 ZNd8 ZOd9 ZPd: ZQdUd;ZRd< ZSd'dd=ZTed>k\  rdd?l
mUZV d'dd@ZUneTZUeTj                   eU_         dA ZWdB ZXdC ZYdD ZZ e[ eSdE            Z\dF Z]dG Z^dH Z_dI Z`dJ Zag dKZbedL        ZcdM ZddN ZedO Zfy# e"$ r e Z!Y 1w xY w# e6$ r e3Z4Y w xY w)Va  Imported from the recipes section of the itertools documentation.

All functions taken from the recipes section of the itertools library docs
[1]_.
Some backward-compatible usability improvements have been made.

.. [1] http://docs.python.org/library/itertools.html#recipes

    N)deque)Sized)	lru_cachepartial)chaincombinationscompresscountcyclegroupbyisliceproductrepeatstarmapteezip_longest)	randrangesamplechoice)
hexversion)0	all_equalbatchedbefore_and_afterconsumeconvolve
dotproduct
first_truefactorflattengrouperis_primeiter_except
iter_indexloopsmatmulncyclesnthnth_combinationpadnonepad_nonepairwise	partitionpolynomial_evalpolynomial_from_rootspolynomial_derivativepowersetprependquantifyreshape#random_combination_with_replacementrandom_combinationrandom_permutationrandom_product
repeatfunc
roundrobinsievesliding_window	subslicessum_of_squarestabulatetailtaketotient	transpose
triplewiseuniqueunique_everseenunique_justseenTstrictsumprodc                     t        | |      S N)r   )xys     Q/var/www/djangounited/venv/lib/python3.12/site-packages/more_itertools/recipes.py<lambda>rO   a   s    Aq1A     c                 ,    t        t        ||             S )zReturn first *n* items of the iterable as a list.

        >>> take(3, range(10))
        [0, 1, 2]

    If there are fewer than *n* items in the iterable, all of them are
    returned.

        >>> take(10, range(3))
        [0, 1, 2]

    )listr   niterables     rN   r@   r@   d   s     x#$$rP   c                 ,    t        | t        |            S )a  Return an iterator over the results of ``func(start)``,
    ``func(start + 1)``, ``func(start + 2)``...

    *func* should be a function that accepts one integer argument.

    If *start* is not specified it defaults to 0. It will be incremented each
    time the iterator is advanced.

        >>> square = lambda x: x ** 2
        >>> iterator = tabulate(square, -3)
        >>> take(4, iterator)
        [9, 4, 1, 0]

    )mapr
   )functionstarts     rN   r>   r>   t   s     xu&&rP   c           	   #      K   t        |t              r,t        |t        dt	        |      | z
        d      E d{    yt        t        ||             E d{    y7 $7 w)zReturn an iterator over the last *n* items of *iterable*.

    >>> t = tail(3, 'ABCDEFG')
    >>> list(t)
    ['E', 'F', 'G']

    r   Nmaxlen)
isinstancer   r   maxleniterr   rS   s     rN   r?   r?      sS      (E"(C3x=1+<$=tDDDhq1222 	E2s!   7A"AA"A A" A"c                 R    |t        | d       yt        t        | ||      d       y)aX  Advance *iterable* by *n* steps. If *n* is ``None``, consume it
    entirely.

    Efficiently exhausts an iterator without returning values. Defaults to
    consuming the whole iterator, but an optional second argument may be
    provided to limit consumption.

        >>> i = (x for x in range(10))
        >>> next(i)
        0
        >>> consume(i, 3)
        >>> next(i)
        4
        >>> consume(i)
        >>> next(i)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        StopIteration

    If the iterator has fewer items remaining than the provided limit, the
    whole iterator will be consumed.

        >>> i = (x for x in range(3))
        >>> consume(i, 5)
        >>> next(i)
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        StopIteration

    Nr   r[   )r   nextr   )iteratorrT   s     rN   r   r      s)    @ 	yhq! 	VHa#T*rP   c                 0    t        t        | |d      |      S )zReturns the nth item or a default value.

    >>> l = range(10)
    >>> nth(l, 3)
    3
    >>> nth(l, 20, "zebra")
    'zebra'

    N)rb   r   )rU   rT   defaults      rN   r'   r'      s     xD)733rP   c                 >    t        | |      }|D ]  }|D ]  }  y  y y)a  
    Returns ``True`` if all the elements are equal to each other.

        >>> all_equal('aaaa')
        True
        >>> all_equal('aaab')
        False

    A function that accepts a single argument and returns a transformed version
    of each input item can be specified with *key*:

        >>> all_equal('AaaA', key=str.casefold)
        True
        >>> all_equal([1, 2, 3], key=lambda x: x < 10)
        True

    FT)r   )rU   keyrc   firstseconds        rN   r   r      s9    $ x%H  	F	 rP   c                 ,    t        t        ||             S )zcReturn the how many times the predicate is true.

    >>> quantify([True, False, True])
    2

    )sumrW   )rU   preds     rN   r2   r2      s     s4"##rP   c                 ,    t        | t        d            S )a   Returns the sequence of elements and then returns ``None`` indefinitely.

        >>> take(5, pad_none(range(3)))
        [0, 1, 2, None, None]

    Useful for emulating the behavior of the built-in :func:`map` function.

    See also :func:`padded`.

    N)r   r   rU   s    rN   r*   r*      s     6$<((rP   c                 R    t        j                  t        t        |       |            S )zvReturns the sequence elements *n* times

    >>> list(ncycles(["a", "b"], 3))
    ['a', 'b', 'a', 'b', 'a', 'b']

    )r   from_iterabler   tuplerU   rT   s     rN   r&   r&     s      veHoq9::rP   c                 J    t        t        t        j                  | |            S )zcReturns the dot product of the two iterables.

    >>> dotproduct([10, 10], [20, 20])
    400

    )rk   rW   operatormul)vec1vec2s     rN   r   r     s     s8<<t,--rP   c                 ,    t        j                  |       S )zReturn an iterator flattening one level of nesting in a list of lists.

        >>> list(flatten([[0, 1], [2, 3]]))
        [0, 1, 2, 3]

    See also :func:`collapse`, which can flatten multiple levels of nesting.

    )r   rp   )listOfListss    rN   r   r     s     {++rP   c                 \    |t        | t        |            S t        | t        ||            S )aG  Call *func* with *args* repeatedly, returning an iterable over the
    results.

    If *times* is specified, the iterable will terminate after that many
    repetitions:

        >>> from operator import add
        >>> times = 4
        >>> args = 3, 5
        >>> list(repeatfunc(add, times, *args))
        [8, 8, 8, 8]

    If *times* is ``None`` the iterable will not terminate:

        >>> from random import randrange
        >>> times = None
        >>> args = 1, 11
        >>> take(6, repeatfunc(randrange, times, *args))  # doctest:+SKIP
        [2, 4, 8, 1, 8, 4]

    )r   r   )functimesargss      rN   r8   r8   "  s.    , }tVD\**4e,--rP   c                 N    t        |       \  }}t        |d       t        ||      S )zReturns an iterator of paired items, overlapping, from the original

    >>> take(4, pairwise(count()))
    [(0, 1), (1, 2), (2, 3), (3, 4)]

    On Python 3.10 and above, this is an alias for :func:`itertools.pairwise`.

    Nr   rb   zip)rU   abs      rN   	_pairwiser   =  s&     x=DAqDMq!9rP   )r+   c                     t        |       S rK   )itertools_pairwisern   s    rN   r+   r+   Q  s    !(++rP   c                         e Zd Zd fd	Z xZS )UnequalIterablesErrorc                 P    d}|| dj                   | z  }t        | 	  |       y )Nz Iterables have different lengthsz/: index 0 has length {}; index {} has length {})formatsuper__init__)selfdetailsmsg	__class__s      rN   r   zUnequalIterablesError.__init__X  s;    0MEMM C 	rP   rK   )__name__
__module____qualname__r   __classcell__)r   s   @rN   r   r   W  s     rP   r   c              #   n   K   t        | dt        iD ]  }|D ]  }|t        u st                | ! y w)N	fillvalue)r   _markerr   )	iterablescombovals      rN   _zip_equal_generatorr   b  sE     i;7;  	.Cg~+--	. 	s    55c                      	 t        | d         }t        | dd  d      D ]$  \  }}t        |      }||k7  st        |||f       t        |  S # t        $ r t        |       cY S w xY w)Nr      )r   )r_   	enumerater   r   	TypeErrorr   )r   
first_sizeiitsizes        rN   
_zip_equalr   j  s    /1&
y}a0 	KEArr7Dz!+ZD4IJJ	K
 I  /#I../s   3A A A%$A%c                     t        |       g|z  }|dk(  rt        |d|iS |dk(  rt        | S |dk(  rt        | S t	        d      )a  Group elements from *iterable* into fixed-length groups of length *n*.

    >>> list(grouper('ABCDEF', 3))
    [('A', 'B', 'C'), ('D', 'E', 'F')]

    The keyword arguments *incomplete* and *fillvalue* control what happens for
    iterables whose length is not a multiple of *n*.

    When *incomplete* is `'fill'`, the last group will contain instances of
    *fillvalue*.

    >>> list(grouper('ABCDEFG', 3, incomplete='fill', fillvalue='x'))
    [('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')]

    When *incomplete* is `'ignore'`, the last group will not be emitted.

    >>> list(grouper('ABCDEFG', 3, incomplete='ignore', fillvalue='x'))
    [('A', 'B', 'C'), ('D', 'E', 'F')]

    When *incomplete* is `'strict'`, a subclass of `ValueError` will be raised.

    >>> it = grouper('ABCDEFG', 3, incomplete='strict')
    >>> list(it)  # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
    ...
    UnequalIterablesError

    fillr   rH   ignorez Expected fill, strict, or ignore)r`   r   r   r   
ValueError)rU   rT   
incompleter   r}   s        rN   r    r    z  s^    : NaDVD6I66X4  XDz;<<rP   c               '      K   t        t        |       }t        t        |       dd      D ]/  }t	        t        ||            }t        t        |      E d{    1 y7 w)aJ  Yields an item from each iterable, alternating between them.

        >>> list(roundrobin('ABC', 'D', 'EF'))
        ['A', 'D', 'E', 'B', 'F', 'C']

    This function produces the same output as :func:`interleave_longest`, but
    may perform better for some inputs (in particular when the number of
    iterables is small).

    r   N)rW   r`   ranger_   r   r   rb   )r   	iterators
num_actives      rN   r9   r9     sT      D)$IC	NAr2 (
&J78	tY'''('s   AAAAc                     | t         } t        |d      \  }}}t        t        | |            \  }}t        |t        t        j
                  |            t        ||      fS )a  
    Returns a 2-tuple of iterables derived from the input iterable.
    The first yields the items that have ``pred(item) == False``.
    The second yields the items that have ``pred(item) == True``.

        >>> is_odd = lambda x: x % 2 != 0
        >>> iterable = range(10)
        >>> even_items, odd_items = partition(is_odd, iterable)
        >>> list(even_items), list(odd_items)
        ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])

    If *pred* is None, :func:`bool` is used.

        >>> iterable = [0, 1, False, True, '', ' ']
        >>> false_items, true_items = partition(None, iterable)
        >>> list(false_items), list(true_items)
        ([0, False, ''], [1, True, ' '])

       )boolr   rW   r	   rt   not_)rl   rU   t1t2pp1p2s          rN   r,   r,     sX    ( |Ha IBAT1FBRX]]B/0(2r2BCCrP   c                     t        |       t        j                  fdt        t	              dz         D              S )a1  Yields all possible subsets of the iterable.

        >>> list(powerset([1, 2, 3]))
        [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

    :func:`powerset` will operate on iterables that aren't :class:`set`
    instances, so repeated elements in the input will produce repeated elements
    in the output.

        >>> seq = [1, 1, 0]
        >>> list(powerset(seq))
        [(), (1,), (1,), (0,), (1, 1), (1, 0), (1, 0), (1, 1, 0)]

    For a variant that efficiently yields actual :class:`set` instances, see
    :func:`powerset_of_sets`.
    c              3   6   K   | ]  }t        |        y wrK   )r   ).0rss     rN   	<genexpr>zpowerset.<locals>.<genexpr>  s     Ma|Aq1M   r   )rR   r   rp   r   r_   )rU   r   s    @rN   r0   r0     s2    " 	XAM5Q!;LMMMrP   c              #      K   t               }|j                  }g }|j                  }|du}| D ]  }|r ||      n|}	 ||vr ||       | ! y# t        $ r ||vr ||       | Y >w xY ww)a  
    Yield unique elements, preserving order.

        >>> list(unique_everseen('AAAABBBCCDAABBB'))
        ['A', 'B', 'C', 'D']
        >>> list(unique_everseen('ABBCcAD', str.lower))
        ['A', 'B', 'C', 'D']

    Sequences with a mix of hashable and unhashable items can be used.
    The function will be slower (i.e., `O(n^2)`) for unhashable items.

    Remember that ``list`` objects are unhashable - you can use the *key*
    parameter to transform the list to a tuple (which is hashable) to
    avoid a slowdown.

        >>> iterable = ([1, 2], [2, 3], [1, 2])
        >>> list(unique_everseen(iterable))  # Slow
        [[1, 2], [2, 3]]
        >>> list(unique_everseen(iterable, key=tuple))  # Faster
        [[1, 2], [2, 3]]

    Similarly, you may want to convert unhashable ``set`` objects with
    ``key=frozenset``. For ``dict`` objects,
    ``key=lambda x: frozenset(x.items())`` can be used.

    N)setaddappendr   )	rU   rg   seensetseenset_addseenlistseenlist_adduse_keyelementks	            rN   rE   rE     s     6 eG++KH??LoG 	#CL	A	  	 Q	s(   :A/AA/A,)A/+A,,A/c           
          |(t        t        j                  d      t        |             S t        t        t        t        j                  d      t        | |                  S )zYields elements in order, ignoring serial duplicates

    >>> list(unique_justseen('AAAABBBCCDAABBB'))
    ['A', 'B', 'C', 'D', 'A', 'B']
    >>> list(unique_justseen('ABBCcAD', str.lower))
    ['A', 'B', 'C', 'A', 'D']

    r   r   )rW   rt   
itemgetterr   rb   )rU   rg   s     rN   rF   rF     sL     {8&&q)78+<==tS,,Q/31GHIIrP   Fc                 4    t        t        | ||      |      S )a  Yields unique elements in sorted order.

    >>> list(unique([[1, 2], [3, 4], [1, 2]]))
    [[1, 2], [3, 4]]

    *key* and *reverse* are passed to :func:`sorted`.

    >>> list(unique('ABBcCAD', str.casefold))
    ['A', 'B', 'c', 'D']
    >>> list(unique('ABBcCAD', str.casefold, reverse=True))
    ['D', 'c', 'B', 'A']

    The elements in *iterable* need not be hashable, but they must be
    comparable for sorting to work.
    )rg   reverse)rg   )rF   sorted)rU   rg   r   s      rN   rD   rD   !  s      6(WE3OOrP   c              #   N   K   	 |	 |        	  |         
# |$ r Y yw xY ww)a  Yields results from a function repeatedly until an exception is raised.

    Converts a call-until-exception interface to an iterator interface.
    Like ``iter(func, sentinel)``, but uses an exception instead of a sentinel
    to end the loop.

        >>> l = [0, 1, 2]
        >>> list(iter_except(l.pop, IndexError))
        [2, 1, 0]

    Multiple exceptions can be specified as a stopping condition:

        >>> l = [1, 2, 3, '...', 4, 5, 6]
        >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
        [7, 6, 5]
        >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
        [4, 3, 2]
        >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
        []

    N )r{   	exceptionrh   s      rN   r"   r"   4  s8     ,'M&L  s   % "%"%c                 .    t        t        ||       |      S )a  
    Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item for which
    ``pred(item) == True`` .

        >>> first_true(range(10))
        1
        >>> first_true(range(10), pred=lambda x: x > 5)
        6
        >>> first_true(range(10), default='missing', pred=lambda x: x > 9)
        'missing'

    )rb   filter)rU   re   rl   s      rN   r   r   S  s    " tX&00rP   r   r   c                 h    |D cg c]  }t        |       c}| z  }t        d |D              S c c}w )a  Draw an item at random from each of the input iterables.

        >>> random_product('abc', range(4), 'XYZ')  # doctest:+SKIP
        ('c', 3, 'Z')

    If *repeat* is provided as a keyword argument, that many items will be
    drawn from each iterable.

        >>> random_product('abcd', range(4), repeat=2)  # doctest:+SKIP
        ('a', 2, 'd', 3)

    This equivalent to taking a random selection from
    ``itertools.product(*args, **kwarg)``.

    c              3   2   K   | ]  }t        |        y wrK   )r   )r   pools     rN   r   z!random_product.<locals>.<genexpr>x  s     0$0s   )rq   )r   r}   r   poolss       rN   r7   r7   g  s3      &**TU4[*V3E0%000 +s   /c                 `    t        |       }|t        |      n|}t        t        ||            S )ab  Return a random *r* length permutation of the elements in *iterable*.

    If *r* is not specified or is ``None``, then *r* defaults to the length of
    *iterable*.

        >>> random_permutation(range(5))  # doctest:+SKIP
        (3, 4, 0, 1, 2)

    This equivalent to taking a random selection from
    ``itertools.permutations(iterable, r)``.

    )rq   r_   r   )rU   r   r   s      rN   r6   r6   {  s-     ?DYD	AAa!!rP   c                     t        |       t              }t        t        t	        |      |            }t        fd|D              S )zReturn a random *r* length subsequence of the elements in *iterable*.

        >>> random_combination(range(5), 3)  # doctest:+SKIP
        (2, 3, 4)

    This equivalent to taking a random selection from
    ``itertools.combinations(iterable, r)``.

    c              3   (   K   | ]	  }|     y wrK   r   r   r   r   s     rN   r   z%random_combination.<locals>.<genexpr>       *Qa*   )rq   r_   r   r   r   )rU   r   rT   indicesr   s       @rN   r5   r5     s=     ?DD	AVE!Ha()G*'***rP   c                     t        |       t              t        fdt        |      D              }t        fd|D              S )aS  Return a random *r* length subsequence of elements in *iterable*,
    allowing individual elements to be repeated.

        >>> random_combination_with_replacement(range(3), 5) # doctest:+SKIP
        (0, 0, 1, 2, 2)

    This equivalent to taking a random selection from
    ``itertools.combinations_with_replacement(iterable, r)``.

    c              3   4   K   | ]  }t                y wrK   )r   )r   r   rT   s     rN   r   z6random_combination_with_replacement.<locals>.<genexpr>  s     4aYq\4s   c              3   (   K   | ]	  }|     y wrK   r   r   s     rN   r   z6random_combination_with_replacement.<locals>.<genexpr>  r   r   )rq   r_   r   r   )rU   r   r   rT   r   s      @@rN   r4   r4     s<     ?DD	A45844G*'***rP   c                    t        |       }t        |      }|dk  s||kD  rt        d}t        |||z
        }t	        d|dz         D ]  }|||z
  |z   z  |z  } |dk  r||z  }|dk  s||k\  rt
        g }|rL||z  |z  |dz
  |dz
  }}}||k\  r||z  }|||z
  z  |z  |dz
  }}||k\  r|j                  |d|z
            |rLt        |      S )a  Equivalent to ``list(combinations(iterable, r))[index]``.

    The subsequences of *iterable* that are of length *r* can be ordered
    lexicographically. :func:`nth_combination` computes the subsequence at
    sort position *index* directly, without computing the previous
    subsequences.

        >>> nth_combination(range(5), 3, 5)
        (0, 3, 4)

    ``ValueError`` will be raised If *r* is negative or greater than the length
    of *iterable*.
    ``IndexError`` will be raised if the given *index* is invalid.
    r   r   r   )rq   r_   r   minr   
IndexErrorr   )	rU   r   indexr   rT   cr   r   results	            rN   r(   r(     s    ?DD	A	A1q5	AAq1uA1a!e_ !QOq ! qy
	uzF
a%1*a!eQUa1qjQJEA;!#QUqA qj 	d26l#  =rP   c                     t        | g|      S )a  Yield *value*, followed by the elements in *iterator*.

        >>> value = '0'
        >>> iterator = ['1', '2', '3']
        >>> list(prepend(value, iterator))
        ['0', '1', '2', '3']

    To prepend multiple values, see :func:`itertools.chain`
    or :func:`value_chain`.

    )r   )valuerc   s     rN   r1   r1     s     %(##rP   c              #      K   t        |      ddd   }t        |      }t        dg|      |z  }t        | t	        d|dz
              D ]!  }|j                  |       t        ||       # yw)aB  Convolve the iterable *signal* with the iterable *kernel*.

        >>> signal = (1, 2, 3, 4, 5)
        >>> kernel = [3, 2, 1]
        >>> list(convolve(signal, kernel))
        [3, 8, 14, 20, 26, 14, 5]

    Note: the input arguments are not interchangeable, as the *kernel*
    is immediately consumed and stored.

    Nr   r   r[   r   )rq   r_   r   r   r   r   _sumprod)signalkernelrT   windowrL   s        rN   r   r     sp      6]4R4 FFAA3q!A%F66!QU+, 'avv&&'s   A,A.c                 Z     t              g  fd}t              } |       |fS )a  A variant of :func:`takewhile` that allows complete access to the
    remainder of the iterator.

         >>> it = iter('ABCdEfGhI')
         >>> all_upper, remainder = before_and_after(str.isupper, it)
         >>> ''.join(all_upper)
         'ABC'
         >>> ''.join(remainder) # takewhile() would lose the 'd'
         'dEfGhI'

    Note that the first iterator must be fully consumed before the second
    iterator can generate valid results.
    c               3   Z   K   D ]!  }  |       r|  j                  |         y  y wrK   )r   )elemr   	predicate
transitions    rN   true_iteratorz'before_and_after.<locals>.true_iterator  s3      	D
!!$'	s   (+)r`   r   )r   r   r   remainder_iteratorr   s   ``  @rN   r   r     s5     
bBJ z2.?...rP   c                     t        | d      \  }}}t        |d       t        |d       t        |d       t        |||      S )zReturn overlapping triplets from *iterable*.

    >>> list(triplewise('ABCDE'))
    [('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E')]

    r   Nr   )rU   r   r   t3s       rN   rC   rC     s?     Xq!JBBTNTNTNr2r?rP   c                 ~    t        | |      }t        |      D ]  \  }}t        t        |||      d         t	        | S rK   )r   r   rb   r   r   )rU   rT   r   r   rc   s        rN   _sliding_window_islicer   .  sC    Ha I + +8VHa#T*+	?rP   c              #      K   t        |       }t        t        ||dz
        |      }|D ]   }|j                  |       t	        |       " y w)Nr   r[   )r`   r   r   r   rq   )rU   rT   r   r   rL   s        rN   _sliding_window_dequer   6  sK     	hB6"a!e$Q/F aFms   AAc                     |dkD  rt        | |      S |dkD  rt        | |      S |dk(  rt        |       S |dk(  rt        |       S t	        d|       )aY  Return a sliding window of width *n* over *iterable*.

        >>> list(sliding_window(range(6), 4))
        [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5)]

    If *iterable* has fewer than *n* items, then nothing is yielded:

        >>> list(sliding_window(range(3), 4))
        []

    For a variant with more features, see :func:`windowed`.
          r   zn should be at least one, not )r   r   r+   r   r   rr   s     rN   r;   r;   ?  sb     	2v$Xq11	
Q%h22	
a!!	
a8}9!=>>rP   c           
          t        |       }t        t        t        t	        t        |      dz         d            }t        t        j                  t        |      |      S )zReturn all contiguous non-empty subslices of *iterable*.

        >>> list(subslices('ABC'))
        [['A'], ['A', 'B'], ['A', 'B', 'C'], ['B'], ['B', 'C'], ['C']]

    This is similar to :func:`substrings`, but emits items in a different
    order.
    r   r   )
rR   r   slicer   r   r_   rW   rt   getitemr   )rU   seqslicess      rN   r<   r<   X  sF     x.CULs3x!|)<a@AFxf55rP   c                 J    dg}| D ]  }t        t        |d| f            } |S )zCompute a polynomial's coefficients from its roots.

    >>> roots = [5, -4, 3]  # (x - 5) * (x + 4) * (x - 3)
    >>> polynomial_from_roots(roots)  # x^3 - 4 * x^2 - 17 * x + 60
    [1, -4, -17, 60]
    r   )rR   r   )rootspolyroots      rN   r.   r.   f  s6     3D 0HTAu:./0KrP   c              #      K   t        | dd      }|0t        | ||      }t        ||      D ]  \  }}||u s||k(  s|  y|t        |       n|}|dz
  }	 	  |||dz   |      x} # t        $ r Y yw xY ww)a  Yield the index of each place in *iterable* that *value* occurs,
    beginning with index *start* and ending before index *stop*.


    >>> list(iter_index('AABCADEAF', 'A'))
    [0, 1, 4, 7]
    >>> list(iter_index('AABCADEAF', 'A', 1))  # start index is inclusive
    [1, 4, 7]
    >>> list(iter_index('AABCADEAF', 'A', 1, 7))  # stop index is not inclusive
    [1, 4]

    The behavior for non-scalar *values* matches the built-in Python types.

    >>> list(iter_index('ABCDABCD', 'AB'))
    [0, 4]
    >>> list(iter_index([0, 1, 2, 3, 0, 1, 2, 3], [0, 1]))
    []
    >>> list(iter_index([[0, 1], [2, 3], [0, 1], [2, 3]], [0, 1]))
    [0, 2]

    See :func:`locate` for a more general means of finding the indexes
    associated with particular values.

    r   Nr   )getattrr   r   r_   r   )rU   r   rY   stop	seq_indexr   r   r   s           rN   r#   r#   s  s     2 '40IHeT*#B. 	JAw%7e#3	
 !%s8}$AI	%eQUD99q:  		s(   8A9A9A* *	A63A95A66A9c              #   j  K   | dkD  rd d}t        d      | dz  z  }t        j                  |       dz   }t        |d||      D ]Q  }t        |d|||z        E d{    t	        t        t        ||z  | ||z                     |||z  | ||z   <   ||z  }S t        |d|      E d{    y7 R7 w)zdYield the primes less than n.

    >>> list(sieve(30))
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
    r   r   )r   r   r   N)	bytearraymathisqrtr#   bytesr_   r   )rT   rY   datalimitr   s        rN   r:   r:     s      	1uEVQ'DJJqMAEa. dAua!e444"'E!a%AE,B(C"DQUQQA $5))) 	5 *s%   AB3B/AB3)B1*B31B3c             #      K   |dk  rt        d      t        |       }t        t        ||            x}r8|rt	        |      |k7  rt        d      | t        t        ||            x}r7yyw)a  Batch data into tuples of length *n*. If the number of items in
    *iterable* is not divisible by *n*:
    * The last batch will be shorter if *strict* is ``False``.
    * :exc:`ValueError` will be raised if *strict* is ``True``.

    >>> list(batched('ABCDEFG', 3))
    [('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]

    On Python 3.13 and above, this is an alias for :func:`itertools.batched`.
    r   zn must be at least onezbatched(): incomplete batchN)r   r`   rq   r   r_   )rU   rT   rH   r   batchs        rN   _batchedr    sp      	1u122	hBA'
'%
'c%jAo:;; A'
'%
's   A)A.,A.i )r   c                    t        | ||      S )NrG   )itertools_batched)rU   rT   rH   s      rN   r   r     s     1V<<rP   c                     t        |  S )a  Swap the rows and columns of the input matrix.

    >>> list(transpose([(1, 2, 3), (11, 22, 33)]))
    [(1, 11), (2, 22), (3, 33)]

    The caller should ensure that the dimensions of the input are compatible.
    If the input is empty, no output will be produced.
    )_zip_strictr   s    rN   rB   rB     s     rP   c                 @    t        t        j                  |       |      S )zReshape the 2-D input *matrix* to have a column count given by *cols*.

    >>> matrix = [(0, 1), (2, 3), (4, 5)]
    >>> cols = 3
    >>> list(reshape(matrix, cols))
    [(0, 1, 2), (3, 4, 5)]
    )r   r   rp   )matrixcolss     rN   r3   r3     s     5&&v.55rP   c                 x    t        |d         }t        t        t        t	        | t        |                  |      S )zMultiply two matrices.

    >>> list(matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]))
    [(49, 80), (41, 60)]

    The caller should ensure that the dimensions of the input matrices are
    compatible with each other.
    r   )r_   r   r   r   r   rB   )m1m2rT   s      rN   r%   r%     s0     	BqE
A78WR2%?@!DDrP   c                     t         j                  }t        d| dz
        D ]I  }dx}}d}|dk(  r3||z  |z   | z  }||z  |z   | z  }||z  |z   | z  } |||z
  |       }|dk(  r3|| k7  sG|c S  t        d      )Nr   r   zprime or under 5)r  gcdr   r   )rT   r"  r   rL   rM   ds         rN   _factor_pollardr$    s    
((C1a!e_ 		A1fQaAQaAQaAAE1A	 1f
 6H	 '
((rP      c              #     K   | dk  ryt         D ]  }| |z  r	| | |z  } | |z  s g }| dkD  r| gng }|D ]9  } | dk  st        |       r|j                  |        %t        |       }||| |z  fz  }; t	        |      E d{    y7 w)a  Yield the prime factors of n.

    >>> list(factor(360))
    [2, 2, 2, 3, 3, 5]

    Finds small factors with trial division.  Larger factors are
    either verified as prime with ``is_prime`` or split into
    smaller factors with Pollard's rho algorithm.
    r   Nr   i  )_primes_below_211r!   r   r$  r   )rT   primeprimestodofacts        rN   r   r     s      	1u # e)K%KA e) Fa%A3RD &v:!MM!"1%DT19%%D& f~s   B	B	AB	BB	c           	          t        |       }|dk(  r|dz  S t        t        t        |      t	        t        |                  }t        | |      S )zEvaluate a polynomial at a specific value.

    Example: evaluating x^3 - 4 * x^2 - 17 * x + 60 at x = 2.5:

    >>> coefficients = [1, -4, -17, 60]
    >>> x = 2.5
    >>> polynomial_eval(coefficients, x)
    8.125
    r   )r_   rW   powr   reversedr   r   )coefficientsrL   rT   powerss       rN   r-   r-   (  sF     	LAAv1ufQi%(!34FL&))rP   c                 $    t        t        |        S )zfReturn the sum of the squares of the input values.

    >>> sum_of_squares([10, 20, 30])
    1400
    )r   r   r  s    rN   r=   r=   9  s     SWrP   c                     t        |       }t        t        d|            }t        t	        t
        j                  | |            S )a  Compute the first derivative of a polynomial.

    Example: evaluating the derivative of x^3 - 4 * x^2 - 17 * x + 60

    >>> coefficients = [1, -4, -17, 60]
    >>> derivative_coefficients = polynomial_derivative(coefficients)
    >>> derivative_coefficients
    [3, -8, -17]
    r   )r_   r.  r   rR   rW   rt   ru   )r/  rT   r0  s      rN   r/   r/   B  s6     	LAeAqk"FHLL,788rP   c                 H    t        t        |             D ]
  }| | |z  z  }  | S )zReturn the count of natural numbers up to *n* that are coprime with *n*.

    >>> totient(9)
    6
    >>> totient(12)
    4
    )r   r   )rT   r(  s     rN   rA   rA   Q  s-     VAY 	Q%ZHrP   ))i  )r   )i )   I   )l   tT7 )r      =   )l   ay)r         iS_ )l   ;n>)r   r      r6     )l   p)r   r   r:  r6  r;  r8  )l            )r   iE  i$  in  i i= ik)l   %!HnfW )r   r   r:  r6  r;  r8        r9     r4  %   )   c                 t    | dz
  | z  j                         dz
  }| |z	  }d|z  |z  | k(  r
|dz  r|dk\  sJ ||fS )z#Return s, d such that 2**s * d == nr   r   )
bit_length)rT   r   r#  s      rN   _shift_to_oddrC  n  sS     a%1  "Q&A	QAFa<1Q1611a4KrP   c                     | dkD  r| dz  rd|cxk  r| k  sJ  J t        | dz
        \  }}t        |||       }|dk(  s|| dz
  k(  ryt        |dz
        D ]  }||z  | z  }|| dz
  k(  s y y)Nr   r   TF)rC  r-  r   )rT   baser   r#  rL   _s         rN   _strong_probable_primerG  w  s    EAAMM22M22QDAqD!QAAva!e1q5\ EAIA:
 rP   c                       dk  r dv S  dz  r dz  r dz  r dz  r
 dz  r dz  sy	t         D ]  \  }} |k  s n& t        d
      D cg c]  }t        d dz
         }}t         fd|D              S c c}w )a  Return ``True`` if *n* is prime and ``False`` otherwise.

    >>> is_prime(37)
    True
    >>> is_prime(3 * 13)
    False
    >>> is_prime(18_446_744_073_709_551_557)
    True

    This function uses the Miller-Rabin primality test, which can return false
    positives for very large inputs. For values of *n* below 10**24
    there are no false positives. For larger values, there is less than
    a 1 in 2**128 false positive rate. Multiple tests can further reduce the
    chance of a false positive.
    r<  >   r   r   r:  r6  r;  r8  r   r   r:  r6  r;  r8  F@   r   c              3   6   K   | ]  }t        |        y wrK   )rG  )r   rE  rT   s     rN   r   zis_prime.<locals>.<genexpr>  s     A4%a.Ar   )_perfect_testsr   r   all)rT   r  basesr   s   `   rN   r!   r!     s      	2v(((Ea!eA!a%AFq2v& 9uu99 /4Bi81a!e$88A5AAA 9s   A8c                     t        d|       S )zReturns an iterable with *n* elements for efficient looping.
    Like ``range(n)`` but doesn't create integers.

    >>> i = 0
    >>> for _ in loops(5):
    ...     i += 1
    >>> i
    5

    Nr   )rT   s    rN   r$   r$     s     $?rP   )r   rK   )r   N)NF)NN)r   N)g__doc__r  rt   collectionsr   collections.abcr   	functoolsr   r   	itertoolsr   r   r	   r
   r   r   r   r   r   r   r   r   randomr   r   r   sysr   __all__objectr   r   r  r   r	  r   r@   r>   r?   r   r'   r   r   r2   r*   r)   r&   r   r   r8   r   r+   r   ImportErrorr   r   r   r   r    r9   r,   r0   rE   rF   rD   r"   r   r7   r6   r5   r4   r(   r1   r   r   rC   r   r   r;   r<   r.   r#   r:   r  r   r  rB   r3   r%   r$  rq   r'  r   r-   r=   r/   rA   rK  rC  rG  r!   r$   r   rP   rN   <module>rY     sN      ! (    - , 1f (,t #d+K 4$AB% '$3$%+P
44 ! $) ;.	,.6	)8
, !((HJ / %=P($D8N**ZJP&>1( "# 1("$+ +"'T$',/B ?26
(V*$ %* ( 6', = G&&GO	6
E)  %*% B*"9
  "B8S"  Kd  Hs$   	F &F FFF)(F)