403Webshell
Server IP : 198.38.94.13  /  Your IP : 216.73.217.33
Web Server : Apache
System : Linux d4744.dxb1.stableserver.net 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64
User : revivere ( 1140)
PHP Version : 8.2.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /opt/saltstack/salt/lib/python3.10/site-packages/more_itertools/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /opt/saltstack/salt/lib/python3.10/site-packages/more_itertools/__pycache__/recipes.cpython-310.pyc
o

;j���@sHdZddlZddlmZmZddlmZddlmZddl	m
Z
ddlmZm
Z
ddlmZmZdd	lmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"dd
l#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*m+Z,m-Z-m.Z.m/Z/ddlm0Z0m1Z1m2Z2m3Z3dd
l4m5Z5gd�Z6e7�Z8z
ddlm9Z9m:Z:Wne;y�dZ<YnwdZ<dd�Z=d�dd�Z>dd�Z?d�dd�Z@d�dd�ZAd�dd�ZBeCfdd�ZDd d!�ZEeEZFd"d#�ZGd$d%�ZHzdd&l#mIZJWne;y�eHZJYnwd'd(�ZKd�d)d*�ZLd+d,�Zd�d.d/�ZMd0d1�ZNd2d3�ZOd4d5�ZPd�d6d7�ZQd�d8d9�ZRd�d:d;�ZSd�d<d=�ZTd�d>d?�ZUd@dA�dBdC�ZVd�dDdE�ZWdFdG�ZXdHdI�ZYdJdK�ZZdLdM�Z[dNdO�Z\dPdQ�Z]dRdS�Z^dTdU�Z_dVdW�Z`dXdY�ZadZd[�Zbd\d]�Zcd�d^d_�Zdd`da�Zeddb�dcdd�Zfe5dek�rddflmgZhddb�dgdh�Zgefjeg_nefZgdidj�Ziejekffdkdl�Zldmdn�Zmdodp�Zndqdr�Zodsdt�Zpeqeedu��Zrdvdw�Zsdxdy�Ztdzd{�Zud|d}�Zvd~d�Zwgd��Zxed�d���Zyd�d��Zze�{�j0Z|d�d��Z}d�d��Z~d�d��Zd�d��Z�d�d��Z�d�d��Z�dd��d�d��Z�d�d��Z�dd��d�d��Z�d�d��Z�dd��d�d��Z�d�d��Z�dd��d�d��Z�e
ddd��Gd�d��d���Z�dd��d�d��Z�d�d��Z�dS)�aImported 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)8�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_maxFTcC�tt||��S)z�Return 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�iterable�rh�J/opt/saltstack/salt/lib/python3.10/site-packages/more_itertools/recipes.pyr[qs
r[cCst|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�startrhrhrirY�srYcCsFzt|�}Wntytt||d��YSwt|td||�d�S)z�Return an iterator over the last *n* items of *iterable*.

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

    ��maxlenrN)�len�	TypeError�iterrr�max)rfrg�sizerhrhrirZ�s�rZcCs.|durt|dd�dStt|||�d�dS)aXAdvance *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

    Nrrm)r�nextr)�iteratorrfrhrhrir/�s r/cCstt||d�|�S)z�Returns the nth item or a default value.

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

    N)rtr)rgrf�defaultrhrhrir=�s
r=cCs,t||�}|D]}|D]}dSdSdS)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)rg�keyru�first�secondrhrhrir,�s
r,cCrd)zcReturn the how many times the predicate is true.

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

    )�sumrj)rg�predrhrhrirG�srGcCst|td��S)aReturns 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�rgrhrhrir@�sr@cCst�tt|�|��S)zvReturns the sequence elements *n* times

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

    )r
�
from_iterabler�tuple�rgrfrhrhrir<
sr<cCsttt||��S)z�Returns 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.
    )rzrjr )Zvec1Zvec2rhrhrir1s
r1)�sumprodcCs
t�|�S)z�Return 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})Z
list_of_listsrhrhrir4+s
	r4cGs&|durt|t|��St|t||��S)aKCall *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]

    N)rr)rk�times�argsrhrhrirN7srNcCst|�S)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|rhrhrirRs	r�fillcCsXt|�g|}|dkrt|d|i�Sdkr t|ddi�Sdkr't|�S	td��)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 `ValueError` will be raised.

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

    r��	fillvalue�strictT�ignorez Expected fill, strict, or ignore)rqr�zip�
ValueError)rgrfZ
incompleter��	iteratorsrhrhrir5^s

r5cgsD�tt|�}tt|�dd�D]}tt||��}tt|�EdHqdS)aGVisit 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).

    r���N)rjrq�rangerorrrt)�	iterablesr�Z
num_activerhrhrirO�s�
�rOcsB�durt�t|��t��t������fdd�}|��|��fS)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, ' '])

    Nc3s>�	|r|��V|s�D]}�|�r�n��|�ndSq�N)�popleft�append)�queue�value�Zfalse_queuerur{Z
true_queuerhri�gen�s�
��zpartition.<locals>.gen)�boolrqr)r{rgr�rhr�rirA�s
rAcs,t|��t��fdd�tt��d�D��S)a1Yields 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`.
    c3��|]}t�|�VqdSr�)r)�.0�r��srhri�	<genexpr>���zpowerset.<locals>.<genexpr>�)rer
r}r�ror|rhr�rirE�s$rEccsd�t�}|durt|j|�D]
}|�|�|VqdS|D]}||�}||vr/|�|�|VqdS)aYield 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)rgrw�seen�element�krhrhrir`�s�
�
��r`cCs4|dur
ttd�t|��Sttttd�t||���S)z�Yields 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']

    Nrr�)rjr$rrt)rgrwrhrhrira�s	racCst|||d�}t||d�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.
    )rw�reverse)rw)�sortedra)rgrwr�Z	sequencedrhrhrir_	sr_ccs<�t|��|dur|�V	|�Vq1swYdS)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)rk�	exceptionrxrhrhrir7s�
��r7cCstt||�|�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'

    )rt�filter)rgrvr{rhrhrir2:sr2r��rcGs ttt|��|}ttt|��S)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~rjr()rr�ZpoolsrhrhrirMNsrMcCs*t|�}|durt|�n|}tt||��S)abReturn 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)``.

    N)r~ror')rgr��poolrhrhrirLbs
rLcs8t|��t��}ttt|�|��}t�fdd�|D��S)z�Return 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�g|]}�|�qSrhrh�r��i�r�rhri�
<listcomp>��z&random_combination.<locals>.<listcomp>)r~ror�r'r�)rgr�rf�indicesrhr�rirJts
rJcs@t|��t���t�fdd�t|�D��}t�fdd�|D��S)aSReturn 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)``.

    c3s�|]}t��VqdSr�)r&r��rfrhrir��s�z6random_combination_with_replacement.<locals>.<genexpr>cr�rhrhr�r�rhrir��r�z7random_combination_with_replacement.<locals>.<listcomp>)r~ror�r�)rgr�r�rh)rfr�rirI�srIcCs�t|�}t|�}t||�}|dkr||7}d|kr |ks#t�t�g}|r[||||d|d}}}||krP||8}|||||d}}||ks;|�|d|�|s't|�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.
    ``IndexError`` will be raised if the given *index* is invalid.
    rr�r�)r~ror�
IndexErrorr�)rgr�r"r�rf�c�resultrhrhrir>�s&
� ��r>cCst|g|�S)aYield *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�rgrhrhrirF�srFccsb�t|�ddd�}t|�}tdg|d�|}t|td|d��D]
}|�|�t||�Vq!dS)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

    Nr�rrmr�)r~rorr
rr��_sumprod)�signalZkernelrf�window�xrhrhrir0�s�#
�r0cCs(t|�\}}tt||�t|��}||fS)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.
    )rrrr�)�	predicate�itZtruesZafterrhrhrir.�sr.cCs:t|d�\}}}t|d�t|d�t|d�t|||�S)z�Return overlapping triplets from *iterable*.

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

    �N)rrtr�)rg�t1�t2�t3rhrhrir^s
	


r^cCs6t||�}t|�D]
\}}tt|||�d�q	t|�Sr�)r�	enumeratertrr�)rgrfr�r�rurhrhri�_sliding_window_islices
r�ccsB�t|�}tt||d�|d�}|D]}|�|�t|�VqdS)Nr�rm)rqrrr�r~)rgrfrur�r�rhrhri�_sliding_window_deques�
�r�cCsR|dkr	t||�S|dkrt||�S|dkrt|�S|dkr"t|�Std|����)aYReturn 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�zn should be at least one, not )r�r�rr�r�rrhrhrirV%s

rVcCs4t|�}ttttt|�d�d��}ttt|�|�S)z�Return 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�)	rer�slicerr�rorjr!r)rg�seqZslicesrhrhrirW>s	rWcCs(dg}|D]}tt|d|f��}q|S)ukCompute 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.
    r�)rer0)�rootsZpoly�rootrhrhrirCLsrCccs��t|dd�}|dur(t|||�}t||�D]\}}||us"||kr%|VqdS|dur0t|�n|}|d}tt��	|||d|�}Vq<1sKwYdS)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�)�getattrrr�rorr�)rgr�rl�stopZ	seq_indexrur�r�rhrhrir8bs ���
��r8ccs��|dkrdVd}td�|d}t|d|t|�dd�D])}t|d|||�EdHttt|||||���||||||�<||}qt|d|�EdHdS)zeYield the primes less than n.

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

    r�r�)rr�r�)r�N)�	bytearrayr8r�bytesror�)rfrl�data�prhrhrirU�s�
.
rU�r�ccsd�|dkr	td��t|�}tt||��}r0|r"t|�|kr"td��|Vtt||��}sdSdS)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�zn must be at least onezbatched(): incomplete batchN)r�rqr~rro)rgrfr�ruZbatchrhrhri�_batched�s��r�i�
)r-cCst|||d�S)Nr�)�itertools_batched)rgrfr�rhrhrir-�sr-cCst|ddi�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.
    r�T)r�)�matrixrhrhrir]�s	r]cCs,zt|�Wn
tyYdSwt||�S)z.Scalars are bytes, strings, and non-iterables.T)rqrp�
isinstance)r�Z
stringlikerhrhri�
_is_scalar�s�
r�cCsRt|�}	zt|�}Wnty|YSwt|f|�}t|�r#|St�|�}q)z.Depth-first iterator over scalars in a tensor.)rqrt�
StopIterationr
r�r})Ztensorrur�rhrhri�_flatten_tensor�s�
�r�cCsDt|t�r
tt�|�|�S|^}}t|�}ttt|�|�}t||�S)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��shapeZ	first_dimZdimsZ
scalar_streamZreshapedrhrhrirH�s
!
rHcCs&t|d�}tttt|t|���|�S)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.
    r)ror-rr�rr])Zm1Zm2rfrhrhrir:sr:cCs�td|�D]7}d}}d}|dkr4||||}||||}||||}t|||�}|dks||kr<|Sqtd��)Nr�r�zprime or under 5)r�rr�)rf�br��y�drhrhri�_factor_pollards��r���ccs��|dkrdStD]}||s|V||}||rq	g}|dkr$|gng}|D]}|dks2t|�r8|�|�q(t|�}||||f7}q(t|�EdHdS)aYield 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_211r6r�r�r�)rf�primeZprimesZtodoZfactrhrhrir3-s"���r3cCs>t|�}|dkrt|�d�Sttt|�tt|���}t||�S)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.
    r)ro�typerj�powrr�r�r�)�coefficientsr�rf�powersrhrhrirBNs

rBcCstt|��S)z�Return 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�rr|rhrhrirXesrXcCs&t|�}ttd|��}ttt||��S)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.
    r�)ror�r�rerjr )r�rfr�rhrhrirDpsrDcCs"tt|��D]}|||8}q|S)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)rfr�rhrhrir\�sr\))i�)r�)i��)��I)l�tT7)r���=)l�ay)r��
�iS_)l;n>�)r�r��r��)l�p�)r�r�r�r�r�r�)l)r�iEi�$ini��i=�i��k)l�%!H�n
�fW)
r�r�r�r�r�r���r��r��%�)cCsH|d|A��d}||?}d|>||kr|d@r|dks J�||fS)z#Return s, d such that 2**s * d == nr�r)�
bit_length)rfr�r�rhrhri�
_shift_to_odd�s$r�cCs�|dkr|d@rd|kr|ksJ�J�t|d�\}}t|||�}|dks.||dkr0dSt|d�D]}|||}||dkrGdSq6dS)Nr�r�TF)r�r�r�)rf�baser�r�r��_rhrhri�_strong_probable_prime�s,�r�cs��dkr�dvS�d@r �dr �dr �dr �dr �ds"d	StD]
\}}�|kr.nq$�fd
d�td�D�}t�fd
d�|D��S)a�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.
    r�>r�r�r�r�r�r�r�r�r�r�r�r�Fc3s�|]
}td�d�VqdS)r�r�N)�_private_randranger�r�rhrir��s�zis_prime.<locals>.<genexpr>�@c3r�r�)r�)r�r�r�rhrir��r�)�_perfect_testsr��all)rf�limit�basesrhr�rir6�s!0�r6cCs
td|�S)z�Returns 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�r�rhrhrir9�s
r9cGstttt|�|��S)u�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

    )rrjrr)�countsrhrhrir;s*r;ccsv�|j}g}g}tt��%	t|t||���|dVt|t||���|d|ddVq1s4wYdS)z.Non-windowed running_median() for Python 3.14+Trr�N)�__next__rr�rbrr
rc�ru�read�lo�hirhrhri�#_running_median_minheap_and_maxheap5s�

��rccs~�|j}g}g}tt��)	t|t||���|dVt|t||���|d|ddVq1s8wYdS)zDBackport of non-windowed running_median() for Python 3.13 and prior.Trr�N)r�rr�r
rr�rhrhri�_running_median_minheap_onlyEs�
��rccs��t�}g}|D]9}|�|�t||�t|�|kr$t||���}||=t|�}|d}|d@r4||n||d||dVqdS)z+Yield median of values in a sliding window.r�r�N)rr�rrorr�)rurnr�Zorderedr�r�rf�mrhrhri�_running_median_windowedUs�

,�rrmcCsFt|�}|durt|�}|dkrtd��t||�Stst|�St|�S)aDCumulative 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().
    Nr�Window size should be positive)rq�_indexr�r�_max_heap_availablerr�rgrnrurhrhrirRhs
rRccsR�t�}d}|D]}|�|�||7}t|�|kr||��8}|t|�VqdS)Nr)rr�ror�)rurfr�Zrunning_sumr�rhrhri�_windowed_running_mean�s�
�r
cCs>t|�}|durttt|�td��S|dkrtd��t||�S)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`.

    Nr�rr)rqrjr%rrr�r
r	rhrhrirQ�s
rQccs��t�}t|�D]:\}}|r|dd||kr|��|r4|dd|ks4|��|r4|dd|kr&|�||f�|ddVqdS�Nrr�r��rr�r��popr�)rurnZsisr"r�rhrhri�_windowed_running_min�����rcC�6t|�}|durt|td�S|dkrtd��t||�S)aDSmallest 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.
    N��funcrr)rqr�minr�rr	rhrhrirS��
rSccs��t�}t|�D]:\}}|r|dd||kr|��|r4|dd|ks4|��|r4|dd|kr&|�||f�|ddVqdSrr)rurnZsdsr"r�rhrhri�_windowed_running_max�rrcCr)aCLargest 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.
    Nrrr)rqrrrr�rr	rhrhrirP�rrP)�frozen�slotsc@s6eZdZUeed<eed<eed<eed<eed<dS)r+rsZminimumZmedianZmaximum�meanN)�__name__�
__module__�__qualname__r��__annotations__�floatrhrhrhrir+s
r+c
Csdt|d�\}}}}tt|durtd�n	ttd|�t|��t||d�t||d�t	||d�t
||d��S)aStatistics 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.
    �Nr�rm)rrjr+rr
r�rrSrRrPrQ)rgrn�t0r�r�r�rhrhrirTs"



�rTcCslt|�}t|�dkrt|�dkrdStd��ttt|���}t|�}	t|�ttt||��s5t	|�|�Sq#)z�Return a random derangement of elements in the iterable.

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

    r�rrhzNo derangments to choose from)
r~ror�rer�r)�anyrjr#r$)rgr��permrlrhrhrirK/s�rK)rr�)r�N)NF)NN)rN)��__doc__�random�bisectrr�collectionsr�
contextlibrZdataclassesr�	functoolsrr	�heapqr
r�	itertoolsrr
rrrrrrrrr�rrrrrr�mathrrrr�operatorr r!r"rr#r$r%r&r'r(r)�sysr*�__all__�objectZ_markerrbrc�ImportErrorrr[rYrZr/r=r,r�rGr@r?r<r1r�r�r4rNr5rOrArEr`rar_r7r2rMrLrJrIr>rFr0r.r^r�r�rVrWrCr8rUr�r-r�r]�strr�r�r�rHr:r�r~r�r3rBrXrDr\r�r�r��Randomr�r6r9r;rrrrRr
rQrrSrrPr+rTrKrhrhrhri�<module>s�
H ;�


(



�

)(

$



"+	
)

	)!

0-%!


Youez - 2016 - github.com/yon3zu
LinuXploit