+
    i                     T   R t ^ RIt^ RIHtHt ^ RIHt ^ RIHt ^ RI	H
t
 ^ RIHtHt ^ RIHtHt ^ RIHtHtHtHtHtHtHtHtHtHtHtHtHtH t H!t!H"t" ^ R	I#H$t$H%t%H&t&H't' ^ R
I(H)t)H*t*H+t,H-t-H.t.H/t/ ^ RIH0t0H1t1H2t2H3t3 ^ RI4H5t5 . RNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NR8NR9NR:NR;NR<NR=NR>NR?NR@NRANRBNRCNRDNt6]7! 4       t8 ^ REIH9t9H:t: RFt;RH t=RRI lt>RJ t?RRK lt@RRL ltARRM ltB]C3RN ltDRO tE]EtFRP tGRQ tH ^ RRI#HItJ RS tKRRT ltLRU tRRV ltMRW tNRX tORY tPRRZ ltQRR[ ltRRR\ ltSRR] ltTRR^ ltUR_^/R` ltVRRa ltWRb tXRc tYRd tZRe t[Rf t\Rg t]Rh t^Ri t_Rj t`Rk taRl tbRm tcRRn ltdRo teRpRG/Rq ltf]5Rr8  d    ^ RsIHgth RpRG/Rt ltg]fP                   ]gn         M]ftgRu ti]j]k33Rv ltlRw tmRx tnRy toRz tp]q! ]e! ^4      4      trR{ tsR| ttR} tuR~ tvR tw. ROtx]R 4       tyR tz]P                  ! 4       P`                  t|R t}R t~R tR tR tR tRR/R ltR tRR/R ltR tRR/R ltR tRR/R lt]
! RFRFR7       ! R R4      4       tRR/R ltR tR#   ]< d    RGt; ELi ; i  ]< d    ]HtJ ELmi ; i)a  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)bisect_leftinsort)dequesuppress)	dataclass)	lru_cachereduce)heappushheappushpop)
accumulatechaincombinationscompresscountcyclefilterfalsegroupbyislicepairwiseproductrepeatstarmap	takewhileteezip_longest)prodcombisqrtgcd)mulgetitemindexis_
itemgettertruediv)	randrangesamplechoiceshuffle)
hexversionStats	all_equalbatchedbefore_and_afterconsumeconvolve
dotproduct
first_truefactorflattengrouperis_primeiter_except
iter_indexloopsmatmulmultinomialncyclesnthnth_combinationpadnonepad_noner   	partitionpolynomial_evalpolynomial_from_rootspolynomial_derivativepowersetprependquantifyreshape#random_combination_with_replacementrandom_combinationrandom_derangementrandom_permutationrandom_product
repeatfunc
roundrobinrunning_maxrunning_meanrunning_medianrunning_minrunning_statisticssievesliding_window	subslicessum_of_squarestabulatetailtaketotient	transpose
triplewiseuniqueunique_everseenunique_justseen)heappush_maxheappushpop_maxTFc                *    \        \        W4      4      # )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   &&6lib/python3.14/site-packages/more_itertools/recipes.pyr[   r[   q   s     x#$$    c                ,    \        V \        V4      4      # )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   &&rh   rY   rY      s     xu&&ri   c                     \        V4      p\        V\        ^ W ,
          4      R4      #   \         d    \	        \        YR7      4      u # i ; i)zsReturn an iterator over the last *n* items of *iterable*.

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

Nmaxlen)lenr   max	TypeErroriterr   )rf   rg   sizes   && rh   rZ   rZ      sK    88} hAtx 0$77  /E(-../s   *  AAc                X    Vf   \        V ^ R7       R# \        \        WV4      R4       R# )a  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

Nro   )r   nextr   )iteratorrf   s   &&rh   r/   r/      s'    @ 	yhq! 	VH#T*ri   c                .    \        \        WR4      V4      # )zmReturns the nth item or a default value.

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

N)rw   r   )rg   rf   defaults   &&&rh   r=   r=      s     xD)733ri   c                F    \        W4      pV F  pV F  p  R# 	   R# 	  R# )aw  
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   )rg   keyrx   firstseconds   &&   rh   r,   r,      s-    $ x%HF   ri   c                *    \        \        W4      4      # )zWReturn the how many times the predicate is true.

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

)sumrk   )rg   preds   &&rh   rG   rG      s     s4"##ri   c                ,    \        V \        R4      4      # )zReturns 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   rg   s   &rh   r@   r@      s     6$<((ri   c                T    \         P                  ! \        \        V 4      V4      4      # )zjReturns the sequence elements *n* times

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

)r   from_iterabler   tuplerg   rf   s   &&rh   r<   r<     s      veHoq9::ri   c                4    \        \        \        W4      4      # )zReturns the dot product of the two iterables.

>>> dotproduct([10, 15, 12], [0.65, 0.80, 1.25])
33.5
>>> 10 * 0.65 + 15 * 0.80 + 12 * 1.25
33.5

In Python 3.12 and later, use ``math.sumprod()`` instead.
)r   rk   r    )vec1vec2s   &&rh   r1   r1     s     s3#$$ri   )sumprodc                .    \         P                  ! V 4      # )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   r   )list_of_listss   &rh   r4   r4   +  s     }--ri   c                ^    Vf   \        V \        V4      4      # \        V \        W!4      4      # )a  Call *function* 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   )rl   timesargss   &&*rh   rN   rN   7  s,    , }x..8VD011ri   c                    \        V 4      # )z
Wrapper for :func:`itertools.pairwise`.

.. warning::

   This function is deprecated as of version 11.0.0. It will be removed in a future
   major release.
)itertools_pairwiser   s   &rh   r   r   R  s     h''ri   c                    \        V 4      .V,          pT;R8X  d    \        VRV/ # ;R8X  d    \        VRR/ # R8X  d
   \        V!  #  \        R4      h)aj  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 `ValueError` will be raised.

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

fill	fillvaluestrictTignorez Expected fill, strict, or ignore)rt   r   zip
ValueError)rg   rf   
incompleter   	iteratorss   &&&& rh   r5   r5   ^  sZ    : h 1$I
	?Y??	/$//	?"?@@ri   c               '     "   \        \        V 4      p\        \        V 4      ^ R4       F/  p\	        \        W4      4      p\        \        V4       Rj  xL
  K1  	  R#  L
5i)a/  Visit input iterables in a cycle until each is exhausted.

    >>> 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).

N)rk   rt   rangerq   r   r   rw   )	iterablesr   
num_actives   *  rh   rO   rO     sL      D)$IC	NAr2
&78	tY''' 3's   AA AA c                   a aaa S f   \         o \        V4      o\        4       o\        4       oVVV V3R lpV! S4      V! S4      3# )aw  
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, ' '])

c              3      <"    V '       d   V P                  4       x  K  S F%  pS! V4      '       d   SMSP                  V4        KF  	  R# 5i)TN)popleftappend)queuevaluefalse_queuerx   r   
true_queues   & rh   genpartition.<locals>.gen  sB     mmo%!#E{{CCEJ " s   	AAA)boolrt   r   )r   rg   r   r   rx   r   s   f& @@@rh   rA   rA     sF    ( |H~H'KJ  {S_,,ri   c                   a \        V 4      o\        P                  ! V3R l\        \	        S4      ^,           4       4       4      # )a  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   <   <"   T F  p\        SV4      x  K  	  R # 5iN)r   ).0rss   & rh   	<genexpr>powerset.<locals>.<genexpr>  s     M;La|Aq11;L   )re   r   r   r   rq   )rg   r   s   &@rh   rE   rE     s2    " 	XAM5Q!;LMMMri   c              #     "   \        4       pVf5   \        VP                  V 4       F  pVP                  V4       Vx  K  	  R# V  F(  pV! V4      pWB9  g   K  VP                  V4       Vx  K*  	  R# 5i)a  Yield unique elements, preserving order. Remember all elements ever seen.

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

Raises ``TypeError`` for unhashable items.

Some unhashable objects can be converted to hashable objects
using the *key* parameter:

* For ``list`` objects, try ``key=tuple``.
* For ``set`` objects, try ``key=frozenset``.
* For ``dict`` objects, try ``key=lambda x: frozenset(x.items())``
  or in Python 3.15 and later, set ``key=frozendict``.

Alternatively, consider the ``unique()`` itertool recipe.  It sorts
the data and then uses equality to eliminate duplicates.  Hashability
is not required.

N)setr   __contains__add)rg   r|   seenelementks   &&   rh   r`   r`     sf     . 5D
{"4#4#4h?GHHWM @  GGA}	  s   AA5A5c           
         Vf   \        \        ^ 4      \        V 4      4      # \        \        \        \        ^4      \        W4      4      4      # )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']

)rk   r$   r   rw   )rg   r|   s   &&rh   ra   ra     s<     {:a='("344tSA(>?@@ri   c                4    \        WVR7      p\        W1R7      # )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.
)r|   reverse)r|   )sortedra   )rg   r|   r   	sequenceds   &&& rh   r_   r_   	  s      x':I9..ri   c              #     "   \        V4      ;_uu_ 4        Ve
   V! 4       x   V ! 4       x  K    + '       g   i     R# ; i5i)a  Yields results from a function repeatedly until an exception is raised.

Converts a call-until-exception interface to an iterator interface.
Like ``iter(function, 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)))
    []

Nr   )rl   	exceptionr}   s   &&&rh   r7   r7     s5     , 
)		'M*	 
		s   A0A		Ac                ,    \        \        W 4      V4      # )ad  
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'

)rw   filter)rg   rz   r   s   &&&rh   r2   r2   :  s    " t&00ri   r   c                t    \        \        \         V4      4      V ,          p\        \        \        V4      4      # )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, repeat=repeat)``.

)r   rk   r(   )r   r   poolss   $* rh   rM   rM   N  s,      #eY'(61EVU#$$ri   c                b    \        V 4      pVf   \        V4      MTp\        \        W!4      4      # )aF  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)``.

)r   rq   r'   )rg   r   pools   && rh   rL   rL   b  s+     ?DYD	AA!!ri   c                    \        V 4      p\        V4      p\        \        \	        V4      V4      4      p\        V Uu. uF  qRV,          NK  	  up4      # u upi )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)``.

)r   rq   r   r'   r   )rg   r   r   rf   indicesis   &&    rh   rJ   rJ   t  sL     ?DD	AVE!Ha()G7+7aq''7+,,+s   Ac                   a \        V 4      p\        V4      o\        V3R l\        V4       4       4      p\        V Uu. uF  qBV,          NK  	  up4      # u upi )a;  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   :   <"   T F  p\        S4      x  K  	  R # 5ir   )r&   r   r   rf   s   & rh   r   6random_combination_with_replacement.<locals>.<genexpr>  s     48aYq\\8s   )r   rq   r   r   )rg   r   r   r   r   rf   s   &&   @rh   rI   rI     sL     ?DD	A45844G7+7aq''7+,,+s   Ac                   \        V 4      p\        V4      p\        WA4      pV^ 8  d	   W%,          p^ Tu;8:  d   V8  g    \        h \        h. pV'       dp   WQ,          V,          V^,
          V^,
          rpW%8  d)   W%,          pWTV,
          ,          V,          V^,
          rEK.  VP	                  VRV,
          ,          4       Kw  \        V4      # )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.
``IndexError`` will be raised if the given *index* is invalid.
r   )r   rq   r   
IndexErrorr   )rg   r   r"   r   rf   cresults   &&&    rh   r>   r>     s     ?DD	AQ
Aqy
>> F
%1*a!eQUajJEA;!#QUqd26l#=ri   c                    \        V .V4      # )a  Yield *value*, followed by the elements in *iterable*.

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

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

)r   )r   rg   s   &&rh   rF   rF     s     %(##ri   c              #     "   \        V4      RRR1,          p\        V4      p\        ^ .VR7      V,          p\        V \	        ^ V^,
          4      4       F!  pVP                  V4       \        W4      x  K#  	  R# 5i)u-  Discrete linear convolution of two iterables.
Equivalent to polynomial multiplication.

For example, multiplying ``(x² -x - 20)`` by ``(x - 3)``
gives ``(x³ -4x² -17x + 60)``.

    >>> list(convolve([1, -1, -20], [1, -3]))
    [1, -4, -17, 60]

Examples of popular kinds of kernels:

* The kernel ``[0.25, 0.25, 0.25, 0.25]`` computes a moving average.
  For image data, this blurs the image and reduces noise.
* The kernel ``[1/2, 0, -1/2]`` estimates the first derivative of
  a function evaluated at evenly spaced inputs.
* The kernel ``[1, -2, 1]`` estimates the second derivative of a
  function evaluated at evenly spaced inputs.

Convolutions are mathematically commutative; however, the inputs are
evaluated differently.  The signal is consumed lazily and can be
infinite. The kernel is fully consumed before the calculations begin.

Supports all numeric types: int, float, complex, Decimal, Fraction.

References:

* Article:  https://betterexplained.com/articles/intuitive-convolution/
* Video by 3Blue1Brown:  https://www.youtube.com/watch?v=KuXjwB4LzSA

Nro   r   )r   rq   r   r   r   r   _sumprod)signalkernelrf   windowxs   &&   rh   r0   r0     si     F 6]4R4 FFAA3q!A%F66!QU+,av&& -s   A:A<c                ^    \        V4      w  r#\        \        W4      \        V4      4      pW#3# )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.
)r   r   r   r   )	predicateittruesafters   &&  rh   r.   r.     s,     r7LEYy0#e*=E<ri   c                    \        V ^4      w  rp\        VR4       \        VR4       \        VR4       \        WV4      # )zReturn overlapping triplets from *iterable*.

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

N)r   rw   r   )rg   t1t2t3s   &   rh   r^   r^     s;     Xq!JBBTNTNTNrr?ri   c                 ~    \        W4      p\        V4       F  w  r4\        \        WCV4      R 4       K  	  \	        V!  # r   )r   	enumeraterw   r   r   )rg   rf   r   r   rx   s   &&   rh   _sliding_window_islicer     s8    H I +VH#T* ,	?ri   c              #      "   \        V 4      p\        \        W!^,
          4      VR7      pV F!  pVP                  V4       \	        V4      x  K#  	  R# 5i)   ro   N)rt   r   r   r   r   )rg   rf   rx   r   r   s   &&   rh   _sliding_window_dequer     sC     H~H6(E*15FaFm s   AAc                    V^8  d   \        W4      # V^8  d   \        W4      # V^8X  d   \        V 4      # V^8X  d   \        V 4      # \	        RV 24      h)a=  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`.
zn should be at least one, not )r   r   r   r   r   r   s   &&rh   rV   rV   %  s^     	2v$X11	
Q%h22	
a!!	
a8}9!=>>ri   c           
         \        V 4      p\        \        \        \	        \        V4      ^,           4      ^4      4      p\        \        \        V4      V4      # )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.
)	re   r   slicer   r   rq   rk   r!   r   )rg   seqslicess   &  rh   rW   rW   >  s@     x.CULs3x!|)<a@AFwsV,,ri   c                N    ^.pV  F  p\        \        V^V) 34      4      pK  	  V# )uS  Compute a polynomial's coefficients from its roots.

>>> roots = [5, -4, 3]            # (x - 5) * (x + 4) * (x - 3)
>>> polynomial_from_roots(roots)  # x³ - 4 x² - 17 x + 60
[1, -4, -17, 60]

Note that polynomial coefficients are specified in descending power order.

Supports all numeric types: int, float, complex, Decimal, Fraction.
)re   r0   )rootspolyroots   &  rh   rC   rC   L  s1      3DHTAu:./ Kri   c              #  L  "   \        V RR4      pVf4   \        WV4      p\        WR4       F  w  rgWqJ g	   Wq8X  g   K  Vx  K  	  R# Vf   \        V 4      MTpV^,
          p\	        \
        4      ;_uu_ 4         V! W^,           V4      ;px  K    + '       g   i     R# ; i5i)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"   N)getattrr   r   rq   r   r   )rg   r   rm   stop	seq_indexrx   r   r   s   &&&&    rh   r8   r8   b  s     2 '40I(40#H4JA7#3 5
 !%s8}$AIj!!%eUD99q: "!!s   6B$;B$8BB!		B$c              #    "   V ^8  d   ^x  ^p\        R4      V ^,          ,          p\        V^V\        V 4      ^,           R7       Fd  p\        V^WV,          4       Rj  xL
  \        \	        \        W3,          WV,           4      4      4      W#V,          WV,           1&   W3,          pKf  	  \        V^V4       Rj  xL
  R#  Ld L5i)zYYield the primes less than n.

>>> list(sieve(30))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

)r   N)    r   )	bytearrayr8   r   bytesrq   r   )rf   rm   dataps   &   rh   rU   rU     s      	1uEVQ'DaU1X\:dAu!e444"'E!%E,B(C"DUQQ ; $5))) 	5 *s%   A C"C#AC C	C	Cr   c             #     "   V^8  d   \        R4      h\        V 4      p\        \        W14      4      ;p'       d*   V'       d   \	        V4      V8w  d   \        R4      hVx  KE  R# 5i)ar  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`.
zn must be at least onezbatched(): incomplete batchN)r   rt   r   r   rq   )rg   rf   r   rx   batchs   &&$  rh   _batchedr     s[      	1u122H~H,-
-%
-c%jAo:;; .s   AA'#A'i )r-   c                    \        WVR 7      # ))r   )itertools_batched)rg   rf   r   s   &&$rh   r-   r-     s     V<<ri   c                    \        V RR/ # )zSwap 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.
r   T)r   )matrixs   &rh   r]   r]     s     $t$$ri   c                T     \        V 4       \        Y4      #   \         d     R# i ; i)z.Scalars are bytes, strings, and non-iterables.T)rt   rs   
isinstance)r   
stringlikes   &&rh   
_is_scalarr    s/    U e((  s    ''c                    \        V 4      p  \        V4      p\        T3T4      p\	        T4      '       d   T# \        P
                  ! T4      pKE    \         d    Tu # i ; i)z.Depth-first iterator over scalars in a tensor.)rt   rw   StopIterationr   r  r   )tensorrx   r   s   &  rh   _flatten_tensorr    sb    F|H
	NE %8,eO&&x0  	O	s   A A! A!c                    \        V\        4      '       d!   \        \        P                  ! V 4      V4      # Vvr#\        V 4      p\        \        \        V4      V4      p\        WR4      # )a  Change the shape of a *matrix*.

If *shape* is an integer, the matrix must be two dimensional
and the shape is interpreted as the desired number of columns:

    >>> matrix = [(0, 1), (2, 3), (4, 5)]
    >>> cols = 3
    >>> list(reshape(matrix, cols))
    [(0, 1, 2), (3, 4, 5)]

If *shape* is a tuple (or other iterable), the input matrix can have
any number of dimensions. It will first be flattened and then rebuilt
to the desired shape which can also be multidimensional:

    >>> matrix = [(0, 1), (2, 3), (4, 5)]    # Start with a 3 x 2 matrix

    >>> list(reshape(matrix, (2, 3)))        # Make a 2 x 3 matrix
    [(0, 1, 2), (3, 4, 5)]

    >>> list(reshape(matrix, (6,)))          # Make a vector of length six
    [0, 1, 2, 3, 4, 5]

    >>> list(reshape(matrix, (2, 1, 3, 1)))  # Make 2 x 1 x 3 x 1 tensor
    [(((0,), (1,), (2,)),), (((3,), (4,), (5,)),)]

Each dimension is assumed to be uniform, either all arrays or all scalars.
Flattening stops when the first value in a dimension is a scalar.
Scalars are bytes, strings, and non-iterables.
The reshape iterator stops when the requested shape is complete
or when the input is exhausted, whichever comes first.

)	r  intr-   r   r   r  r	   reversedr   )r  shape	first_dimdimsscalar_streamreshapeds   &&    rh   rH   rH     sY    B %u**62E::I#F+Mgx~}=H(&&ri   c                    \        V^ ,          4      p\        \        \        \	        V \        V4      4      4      V4      # )a  Multiply 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.

Supports all numeric types: int, float, complex, Decimal, Fraction.
)rq   r-   r   r   r   r]   )m1m2rf   s   && rh   r:   r:     s0     	BqE
A78WR2%?@!DDri   c                    \        ^V 4       Fo  p^;r#^pV^8X  dW   W",          V,           V ,          pW3,          V,           V ,          pW3,          V,           V ,          p\        W#,
          V 4      pK]  W@8w  g   Km  Vu # 	  \        R4      h)r   zprime or under 5)r   r   r   )rf   br   yds   &    rh   _factor_pollardr    sy     1a[	1faAaAaAAE1A6H  '
((ri   c              #  V  "   V ^8  d   R# \          F  pW,          '       d   K  Vx  W,          p K  	  . pV ^8  d   V .M. pV FI  p V R8  g   \        V 4      '       d   VP                  V 4       K.  \        V 4      pW4W,          3,          pKK  	  \	        V4       Rj  xL
  R#  L5i)zYield 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.
Ni  )_primes_below_211r6   r   r  r   )rf   primeprimestodofacts   &    rh   r3   r3   -  s      	1u #))KKA # Fa%A3RDv:!MM!"1%D19%%D  f~s   B)A;B) B'!B)c           	         \        V 4      pV^ 8X  d   \        V4      ! ^ 4      # \        \        \	        V4      \        \        V4      4      4      p\        W4      # )a  Evaluate a polynomial at a specific value.

Computes with better numeric stability than Horner's method.

Evaluate ``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

Note that polynomial coefficients are specified in descending power order.

Supports all numeric types: int, float, complex, Decimal, Fraction.
)rq   typerk   powr   r  r   r   )coefficientsr   rf   powerss   &&  rh   rB   rB   N  sI      	LAAvAwqzfQi%(!34FL))ri   c                &    \        \        V 4      !  # )zReturn the sum of the squares of the input values.

>>> sum_of_squares([10, 20, 30])
1400

Supports all numeric types: int, float, complex, Decimal, Fraction.
)r   r   r   s   &rh   rX   rX   e  s     S]##ri   c                t    \        V 4      p\        \        ^V4      4      p\        \	        \
        W4      4      # )u  Compute the first derivative of a polynomial.

Evaluate the derivative of ``x³ - 4 x² - 17 x + 60``:

>>> coefficients = [1, -4, -17, 60]
>>> derivative_coefficients = polynomial_derivative(coefficients)
>>> derivative_coefficients
[3, -8, -17]

Note that polynomial coefficients are specified in descending power order.

Supports all numeric types: int, float, complex, Decimal, Fraction.
)rq   r  r   re   rk   r    )r%  rf   r&  s   &  rh   rD   rD   p  s0     	LAeAqk"FC.//ri   c                Z    \        \        V 4      4       F  pW V,          ,          p K  	  V # )u  Return the count of natural numbers up to *n* that are coprime with *n*.

Euler's totient function φ(n) gives the number of totatives.
Totative are integers k in the range 1 ≤ k ≤ n such that gcd(n, k) = 1.

>>> n = 9
>>> totient(n)
6

>>> totatives = [x for x in range(1, n) if gcd(n, x) == 1]
>>> totatives
[1, 2, 4, 5, 7, 8]
>>> len(totatives)
6

Reference:  https://en.wikipedia.org/wiki/Euler%27s_totient_function

)r   r3   )rf   r  s   & rh   r\   r\     s&    & VAY	%Z  Hri   c                    V ^,
          V ,          P                  4       ^,
          pW,	          p^V,          V,          V 8X  d   V^,          '       d   V^ 8  g   Q hW3# )z#Return s, d such that 2**s * d == n)
bit_length)rf   r   r  s   &  rh   _shift_to_oddr,    sQ     a%1  "Q&A	AFa<1Q16114Kri   c                 6   V ^8  d"   V ^,          '       d   ^Tu;8:  d	   V 8  g   Q h Q h\        V ^,
          4      w  r#\        WV 4      pV^8X  g   W@^,
          8X  d   R# \        V^,
          4       F"  pWD,          V ,          pW@^,
          8X  g   K!   R# 	  R# )   TF)r,  r$  r   )rf   baser   r  r   _s   &&    rh   _strong_probable_primer1    s    EAAMM22M22QDADQAAv!e1q5\EAIA: 
 ri   c                  a  S ^8  d   S R9   # S ^,          '       dL   S ^,          '       d=   S ^,          '       d.   S ^,          '       d   S ^,          '       d   S ^,          '       g   R# \          F  w  rS V8  g   K   M	  V 3R l\        ^@4       4       p\        ;QJ d    V 3R lV 4       F  '       d   K   R# 	  R# ! V 3R lV 4       4      # )am  Return ``True`` if *n* is prime and ``False`` otherwise.

Basic examples:

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

Find the next prime over one billion:

    >>> next(filter(is_prime, count(10**9)))
    1000000007

Generate random primes up to 200 bits and up to 60 decimal digits:

    >>> from random import seed, randrange, getrandbits
    >>> seed(18675309)

    >>> next(filter(is_prime, map(getrandbits, repeat(200))))
    893303929355758292373272075469392561129886005037663238028407

    >>> next(filter(is_prime, map(randrange, repeat(10**60))))
    269638077304026462407872868003560484232362454342414618963649

This function is exact for values of *n* below 10**24.  For larger inputs,
the probabilistic Miller-Rabin primality test has a less than 1 in 2**128
chance of a false positive.
Fc              3   J   <"   T F  p\        ^S^,
          4      x  K  	  R# 5i)r.  N)_private_randranger   s   & rh   r   is_prime.<locals>.<genexpr>  s      Ay!#Aq1u--ys    #c              3   <   <"   T F  p\        SV4      x  K  	  R # 5ir   )r1  )r   r/  rf   s   & rh   r   r5    s     A54%a..5r   T>   r.                 )_perfect_testsr   all)rf   limitbasess   f  rh   r6   r6     s    B 	2v(((EEa!eeA!a%%AFFq2vv&u9 ' BuRyA3A5A33A3A3A5AAAri   c                    \        RV 4      # )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

N)r   )rf   s   &rh   r9   r9     s     $?ri   c                 H    \        \        \        \        V 4      V 4      4      # )ue  Number of distinct arrangements of a multiset.

The expression ``multinomial(3, 4, 2)`` has several equivalent
interpretations:

* In the expansion of ``(a + b + c)⁹``, the coefficient of the
  ``a³b⁴c²`` term is 1260.

* There are 1260 distinct ways to arrange 9 balls consisting of 3 reds, 4
  greens, and 2 blues.

* There are 1260 unique ways to place 9 distinct objects into three bins
  with sizes 3, 4, and 2.

The :func:`multinomial` function computes the length of
:func:`distinct_permutations`.  For example, there are 83,160 distinct
anagrams of the word "abracadabra":

    >>> from more_itertools import distinct_permutations, ilen
    >>> ilen(distinct_permutations('abracadabra'))
    83160

This can be computed directly from the letter counts, 5a 2b 2r 1c 1d:

    >>> from collections import Counter
    >>> list(Counter('abracadabra').values())
    [5, 2, 2, 1, 1]
    >>> multinomial(5, 2, 2, 1, 1)
    83160

A binomial coefficient is a special case of multinomial where there are
only two categories.  For example, the number of ways to arrange 12 balls
with 5 reds and 7 blues is ``multinomial(5, 7)`` or ``math.comb(12, 5)``.

Likewise, factorial is a special case of multinomial where
the multiplicities are all just 1 so that
``multinomial(1, 1, 1, 1, 1, 1, 1) == math.factorial(7)``.

Reference:  https://en.wikipedia.org/wiki/Multinomial_theorem

)r   rk   r   r   )countss   *rh   r;   r;     s    T D*V,f566ri   c           
   #  F  "   V P                   p. p. p\        \        4      ;_uu_ 4         \        V\	        W1! 4       4      4       V^ ,          x  \        V\        W!! 4       4      4       V^ ,          V^ ,          ,           ^,          x  Kb    + '       g   i     R# ; i5i)z.Non-windowed running_median() for Python 3.14+N)__next__r   r	  rb   r   r
   rc   rx   readlohis   &   rh   #_running_median_minheap_and_maxheaprI  5  s{      D	B	B	-	 	 [TV45Q%KRTV45a52a5=A%% 
!	 	 s   (B!A#BB		B!c           
   #  N  "   V P                   p. p. p\        \        4      ;_uu_ 4         \        V\	        W1! 4       4      ) 4       V^ ,          ) x  \        V\	        W!! 4       ) 4      ) 4       V^ ,          V^ ,          ,
          ^,          x  Kf    + '       g   i     R# ; i5i)zDBackport of non-windowed running_median() for Python 3.13 and prior.N)rD  r   r	  r
   r   rE  s   &   rh   _running_median_minheap_onlyrK  E  s      D	B	B	-	 	 R+b$&112a5&LR+b46'223a52a5=A%% 
!	 	 s   (B%A'BB"		B%c              #  f  "   \        4       p. pV  F  pVP                  V4       \        W44       \        V4      V8  d   \	        W2P                  4       4      pW5 \        V4      pV^,          pV^,          '       d	   W7,          M"W7^,
          ,          W7,          ,           ^,          x  K  	  R# 5i)z+Yield median of values in a sliding window.N)r   r   r   rq   r   r   )rx   rp   r   orderedr   r   rf   ms   &&      rh   _running_median_windowedrO  U  s      WFGaww<& G^^%56A
LFEEgjA(Cq'HH s   B/B1rp   c                   \        V 4      pVe)   \        V4      pV^ 8:  d   \        R4      h\        W!4      # \        '       g   \        V4      # \        V4      # )a  Cumulative median of values seen so far or values in a sliding window.

Set *maxlen* to a positive integer to specify the maximum size
of the sliding window.  The default of *None* is equivalent to
an unbounded window.

For example:

    >>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))
    [5.0, 7.0, 5.0, 7.0, 8.0, 8.5]
    >>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0], maxlen=3))
    [5.0, 7.0, 5.0, 9.0, 8.0, 9.0]

Supports numeric types such as int, float, Decimal, and Fraction,
but not complex numbers which are unorderable.

On version Python 3.13 and prior, max-heaps are simulated with
negative values. The negation causes Decimal inputs to apply context
rounding, making the results slightly different than that obtained
by statistics.median().
Window size should be positive)rt   _indexr   rO  _max_heap_availablerK  rI  rg   rp   rx   s   &$ rh   rR   rR   h  sV    . H~HQ;=>>'99+H55.x88ri   c              #      "   \        4       p^ pV  FV  pVP                  V4       W4,          p\        V4      V8  d   W2P                  4       ,          pV\        V4      ,          x  KX  	  R# 5ir   N)r   r   rq   r   )rx   rf   r   running_sumr   s   &&   rh   _windowed_running_meanrX    sX     WFKev;?>>++KCK'' s   A+A-c                   \        V 4      pVf$   \        \        \        V4      \	        ^4      4      # V^ 8:  d   \        R4      h\        W!4      # )a  Cumulative mean of values seen so far or values in a sliding window.

Set *maxlen* to a positive integer to specify the maximum size
of the sliding window.  The default of *None* is equivalent to
an unbounded window.

For example:

    >>> list(running_mean([40, 30, 50, 46, 39, 44]))
    [40.0, 35.0, 40.0, 41.5, 41.0, 41.5]

    >>> list(running_mean([40, 30, 50, 46, 39, 44], maxlen=3))
    [40.0, 35.0, 40.0, 42.0, 45.0, 43.0]

Supports numeric types such as int, float, complex, Decimal, and Fraction.

No extra effort is made to reduce round-off errors for float inputs.
So the results may be slightly different from `statistics.mean`.

rQ  )rt   rk   r%   r   r   r   rX  rT  s   &$ rh   rQ   rQ     sH    , H~H~7Jx0%(;;{9::!(33ri   c              #   V  "   \        4       p\        V 4       F  w  r4V'       d,   V^ ,          ^ ,          W1,
          8X  d   VP                  4        V'       d(   VR,          ^,          V8  g   VP                  4        K/  VP	                  W434       V^ ,          ^,          x  K  	  R# 5ir   Nr   r   r   r   popr   )rx   rp   sisr"   r   s   &&   rh   _windowed_running_minr_    p     
'C!(+3q6!9.KKM#b'!*u,GGI

E>"!fQi ,   AB)AB)c               |    \        V 4      pVf   \        V\        R7      # V^ 8:  d   \        R4      h\	        W!4      # )a  Smallest of values seen so far or values in a sliding window.

Set *maxlen* to a positive integer to specify the maximum size
of the sliding window.  The default of *None* is equivalent to
an unbounded window.

For example:

    >>> list(running_min([4, 3, 7, 0, 8, 1, 6, 2, 9, 5]))
    [4, 3, 3, 0, 0, 0, 0, 0, 0, 0]

    >>> list(running_min([4, 3, 7, 0, 8, 1, 6, 2, 9, 5], maxlen=3))
    [4, 3, 3, 0, 0, 0, 1, 1, 2, 2]

Supports numeric types such as int, float, Decimal, and Fraction,
but not complex numbers which are unorderable.
funcrQ  )rt   r   minr   r_  rT  s   &$ rh   rS   rS     =    & H~H~(--{9:: 22ri   c              #   V  "   \        4       p\        V 4       F  w  r4V'       d,   V^ ,          ^ ,          W1,
          8X  d   VP                  4        V'       d(   VR,          ^,          V8  g   VP                  4        K/  VP	                  W434       V^ ,          ^,          x  K  	  R# 5ir[  r\  )rx   rp   sdsr"   r   s   &&   rh   _windowed_running_maxri    r`  ra  c               |    \        V 4      pVf   \        V\        R7      # V^ 8:  d   \        R4      h\	        W!4      # )a  Largest of values seen so far or values in a sliding window.

Set *maxlen* to a positive integer to specify the maximum size
of the sliding window.  The default of *None* is equivalent to
an unbounded window.

For example:

    >>> list(running_max([4, 3, 7, 0, 8, 1, 6, 2, 9, 5]))
    [4, 4, 7, 7, 8, 8, 8, 8, 9, 9]

    >>> list(running_max([4, 3, 7, 0, 8, 1, 6, 2, 9, 5], maxlen=3))
    [4, 4, 7, 7, 8, 8, 8, 6, 9, 9]

Supports numeric types such as int, float, Decimal, and Fraction,
but not complex numbers which are unorderable.
rc  rQ  )rt   r   rr   r   ri  rT  s   &$ rh   rP   rP     rf  ri   )frozenslotsc                   ,   a  ] tR tRt o V 3R ltRtV tR# )r+   i  c                V   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   # )r.  ru   minimummedianmaximummean)r  float)format__classdict__s   "rh   __annotate__Stats.__annotate__  s?     
I  N  M	 
 N  K ri    N)__name__
__module____qualname____firstlineno____annotate_func____static_attributes____classdictcell__)ru  s   @rh   r+   r+     s      ri   c                   \        V ^4      w  r#rE\        \        Vf   \        ^4      M\	        \        ^V4      \        V4      4      \        W!R7      \        W1R7      \        WAR7      \        WQR7      4      # )a  Statistics for values seen so far or values in a sliding window.

Set *maxlen* to a positive integer to specify the maximum size
of the sliding window.  The default of *None* is equivalent to
an unbounded window.

Yields instances of a ``Stats`` dataclass with fields for the dataset *size*,
*minimum* value, *median* value, *maximum* value, and the arithmetic *mean*.

Supports numeric types such as int, float, Decimal, and Fraction,
but not complex numbers which are unorderable.
ro   )r   rk   r+   r   r   r   r   rS   rR   rP   rQ   )rg   rp   t0r   r   r   s   &$    rh   rT   rT     sc     1%NBBNaeAv.>v(OB&r)B&R' ri   c                :   \        V 4      p\        V4      ^8  d   \        V4      ^ 8X  d   R# \        R4      h\        \	        \        V4      4      4      p\        V4      p \        V4       \        \        \        W24      4      '       d   K-  \        V!  ! V4      # )zReturn a random derangement of elements in the iterable.

Equivalent to but much faster than ``choice(list(derangements(iterable)))``.

zNo derangments to choose fromrx  )
r   rq   r   re   r   r)   anyrk   r#   r$   )rg   r   permrm   s   &   rh   rK   rK   /  s{     /C
3x!|s8q=I899c#h D$KE
3sE())t$S))ri   )r   r   )r   N)NF)NNrV  ))i  )r.  )i )   I   )l   tT7 )r.  r9  =   )l   ay)r.  r;     iS_ )l   ;n>)r.  r7  r8  r9  r:  )l   p)r.  r7  r8  r9  r:  r;  )l            )r.  iE  i$  in  i i= ik)l   %!HnfW )r.  r7  r8  r9  r:  r;        r     r  %   )   )__doc__randombisectr   r   collectionsr   
contextlibr   dataclassesr   	functoolsr   r	   heapqr
   r   	itertoolsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mathr   r   r   r   operatorr    r!   r"   rR  r#   r$   r%   r&   r'   r(   r)   sysr*   __all__object_markerrb   rc   rS  ImportErrorr[   rY   rZ   r/   r=   r,   r   rG   r@   r?   r<   r1   r   r   r4   rN   r5   rO   rA   rE   r`   ra   r_   r7   r2   rM   rL   rJ   rI   r>   rF   r0   r.   r^   r   r   rV   rW   rC   r8   rU   r   r-   r  r]   strr   r  r  rH   r:   r  r   r  r3   rB   rX   rD   r\   r<  r,  r1  Randomr4  r6   r9   r;   rI  rK  rO  rR   rX  rQ   r_  rS   ri  rP   r+   rT   rK   rx  ri   rh   <module>r     s6    &   ! ' '    $ ( ' L L 5 5 999 9 	9
 9 9 9 9 9 9 9 9 9 9 9  !9" #9$ %9& 
'9( )9* +9, -9. /90 192 394 596 798 99: ;9< =9> ?9@ *A9B C9D E9F G9H I9J K9L M9N O9P Q9R S9T U9V W9X Y9Z [9\ ]9^ _9` a9b c9d e9f g9h i9j k9l m9n o9p q9v (3 % '$8 %+P
44 ! $) ;
%(
	.26	(&AR($%-PN*!HA/(:1(%a %("$- -"D$('V& ?2-,&;R**E ( 6=u = &&GOG	% #&u )1&'RE)  %*% B*.$0&2  & ]]_.. -B`*7Z& & I&"9t "9J(4T 4B3D 3<3D 3< $d#  $4 6*I.    x  Hs$   =J
 3J 
	JJ	J'&J'