§
    ƒØjù% ã                  óò  — U d Z ddlmZ ddlmZ ddlmZ ddlZddlm	Z	m
Z
 ddlZddlZddlZddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ  ej        d¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        ZdZdZdZ dZ!dZ"eee e!e"gZ#dZ$ e%ej&        ¦  «        dgz   Z'd;d„Z(d „ Z)d<d=d%„Z*d<d&„Z+d'„ Z,d>d*„Z-d+„ Z. G d,„ d-¦  «        Z/ G d.„ d/¦  «        Z0 G d0„ d1¦  «        Z1 G d2„ d3¦  «        Z2 G d4„ d5¦  «        Z3 G d6„ d7ej4        ¦  «        Z5g Z6d8e7d9<   e8d:k    rddlZ ej9        e5¦  «         dS dS )?a—  
A comprehensive, object model of the Xenakis Sieve. :class:`music21.sieve.Sieve`
objects can be created from high-level string notations, and used to generate line segments
in various representation. Additional functionality is available through associated objects.

The :class:`music21.sieve.Sieve` class permits generation segments in four formats.

>>> a = sieve.Sieve('3@2|7@1')
>>> a.segment()
[1, 2, 5, 8, 11, 14, 15, 17, 20, 22, 23, 26, 29, 32, 35, 36, 38, 41, 43, 44,
 47, 50, 53, 56, 57, 59, 62, 64, 65, 68, 71, 74, 77, 78, 80, 83, 85, 86, 89, 92, 95, 98, 99]

>>> a.segment(segmentFormat='binary')
[0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1,
 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1,
 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1]

>>> a.segment(segmentFormat='width')
[1, 3, 3, 3, 3, 1, 2, 3, 2, 1, 3, 3, 3, 3, 1, 2, 3, 2, 1, 3, 3, 3, 3, 1, 2, 3, 2,
 1, 3, 3, 3, 3, 1, 2, 3, 2, 1, 3, 3, 3, 3, 1]

>>> len(a.segment(segmentFormat='unit'))
43

A :class:`music21.sieve.CompressionSegment` can be used to derive a Sieve from a
ny sequence of integers.

>>> a = sieve.CompressionSegment([3, 4, 5, 6, 7, 8, 13, 19])
>>> str(a)
'6@1|7@6|8@5|9@4|10@3|11@8'

The :class:`music21.sieve.PitchSieve` class provides a quick generation of
:class:`music21.pitch.Pitch` lists from Sieves.

>>> a = sieve.PitchSieve('13@3|13@6|13@9', 'c1', 'c10', 'f#4')
>>> pitches = a()
>>> ', '.join([str(p) for p in pitches])
'F#1, A1, C2, G2, B-2, C#3, G#3, B3, D4, A4, C5, E-5, B-5, C#6, E6, B6, D7,
 F7, C8, E-8, F#8, C#9, E9, G9'
é    )Úannotations)Úliteral_eval)ÚIterableN)ÚgcdÚlcm)Úcommon)Úenvironment)Úexceptions21)Úinterval)ÚpitchÚsievec                  ó   — e Zd ZdS )ÚUnitExceptionN©Ú__name__Ú
__module__Ú__qualname__© ó    ú‚/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/sieve.pyr   r   I   ó   € € € € € Ø€Dr   r   c                  ó   — e Zd ZdS )ÚResidualExceptionNr   r   r   r   r   r   M   r   r   r   c                  ó   — e Zd ZdS )ÚSieveExceptionNr   r   r   r   r   r   Q   r   r   r   c                  ó   — e Zd ZdS )ÚCompressionSegmentExceptionNr   r   r   r   r   r   U   r   r   r   c                  ó   — e Zd ZdS )ÚPitchSieveExceptionNr   r   r   r   r   r   Y   r   r   r   Ú{Ú}ú&ú|ú^ú-ú@é   c              #  ó¤   K  — i }d}	 |                      |d¦  «        }|�||z   }||v r	||z   }||v °	|||<   n||z  }|||<   || k    r|V — |dz   }ŒJ)aÎ  
    Yields the sequence of prime numbers via the Sieve of Eratosthenes.
    rather than creating a fixed list of a range (z) and crossing out
    multiples of sequential candidates, this algorithm stores primes under
    their next possible candidate, thus allowing the generation of primes
    in sequence without storing a complete range (z).

    Create a dictionary. Each entry in the dictionary is a key:item pair of
    (key) the largest multiple of this prime so far found and (item)
    the prime. The dictionary only has as many entries as found primes.

    If a candidate is not a key in the dictionary, it is not a multiple of
    any already-found prime; it is thus a prime. a new entry is added to the
    dictionary, with the square of the prime as the key. The square of the prime
    is the next possible multiple to be found.

    To use this generator, create an instance and then call the .next() method
    on the instance.

    >>> a = sieve.eratosthenes()
    >>> next(a)
    2
    >>> next(a)
    3

    We can also specify a starting value for the sequence, skipping over
    initial primes smaller than this number:

    >>> a = sieve.eratosthenes(95)
    >>> next(a)
    97
    >>> next(a)
    101
    r'   TNé   )Úpop)ÚfirstCandidateÚDÚqÚpÚnextMults        r   Úeratosthenesr0   p   s›   è è € ðF 	€Aà	€Aðð �EŠE�!�T‰NŒNˆàˆ=ð ˜1‘uˆHØ˜a�-�-Ø# a™<�ð ˜a�-�-ð ˆAˆh‰KˆKð ˜1‘uˆHØˆAˆh‰KØ�NÒ"Ð"Ø���Ø�‰Eˆð)r   c                ó¦  — t          | ¦  «        } | dv rdS | dz  }|dvrdS g d¢}| dk    r| |v rdS dS |D ]}| |z  dk    r dS Œ| d	z
  d	}}|d	z  s|d	z  }|d	z   }|d	z  ¯t          d
¦  «        D ]b}t          t          j        d	| d	z
  ¦  «        || ¦  «        }|d	k    rŒ0t          d	|¦  «        D ]}|| d	z
  k    r nt          |d| ¦  «        }Œ dS ŒcdS )añ  
    Returns True if an integer is likely prime or False if it is likely composite using the
    Rabin Miller primality test.

    See also here: http://www.4dsolutions.net/ocn/numeracy2.html

    >>> sieve.rabinMiller(234)
    False
    >>> sieve.rabinMiller(5)
    True
    >>> sieve.rabinMiller(4)
    False

    >>> sieve.rabinMiller(97 * 2)
    False

    >>> sieve.rabinMiller(6 ** 4 + 1)  # prime
    True

    >>> sieve.rabinMiller(123986234193)  # divisible by 3, runs fast
    False
    )r'   é   Té   )r)   é   F)r4   é   é   é   é   é   é   é   é   é%   é)   é+   é/   é5   é;   é=   éC   éG   éI   éO   éS   éY   éa   éd   r   r)   é
   r'   )ÚabsÚrangeÚpowÚrandomÚrandint)	ÚnÚmÚprimesÚprimeÚsÚrÚiÚyÚjs	            r   ÚrabinMillerr[   ­   sW  € õ. 	ˆA‰Œ€AØˆF€{€{Øˆtà	ˆA‰€AØ�€€Øˆuð;ð ;ð ;€Fð 	ˆC‚x€xØ�ˆ;ˆ;Ø�4Øˆuàð ð ˆØˆu‰9˜Š>ˆ>Ø�5�5ð ð ˆq‰5�!€q€AØ�!‰eð Ø	ˆa‰ˆØ�‰Eˆð �!‰eð õ �2‰YŒYð ð ˆå•”˜q ! a¡%Ñ(Ô(¨!¨QÑ/Ô/ˆØ�Š6ˆ6Øå�q˜!‘”ð 	ð 	ˆAØ�A˜‘EŠzˆzØ�Ý�A�q˜!‘”ˆAˆAà�5�5ð ð
 ˆ4r   ÚseriesúIterable[int]Úreturnú	list[int]c                ó¼  — | D ]%}t          j        |¦  «        st          d¦  «        ‚Œ&g }|�%|                     ¦   «          |d         }|d         }nEt	          t          j        | ¦  «        ¦  «        }|                     ¦   «          |d         }|d         }t          ||dz   ¦  «        D ]1}|| v r|                     d¦  «         Œ|                     d¦  «         Œ2|S )aç  
    Treat a sequence of integers as defining contiguous binary integers,
    where provided values are 1's and excluded values are zero.

    For instance, running [3, 10, 12] through this method gives a 1 for
    the first entry (signifying 3), 0s for the next six entries (signifying
    4-9), a 1 (for 10), a 0 (for 11), and a 1 (for 12).

    >>> sieve.discreteBinaryPad([3, 10, 12])
    [1, 0, 0, 0, 0, 0, 0, 1, 0, 1]

    >>> sieve.discreteBinaryPad([3, 4, 5])
    [1, 1, 1]

    znon-integer value foundNr   éÿÿÿÿr)   )	r   ÚisNumr   ÚsortÚlistÚcopyÚdeepcopyrN   Úappend)r\   ÚfixRangeÚxÚdiscreteÚminValÚmaxValÚ	seriesAlts          r   ÚdiscreteBinaryPadrn   ò   sñ   € ð" ð ;ð ;ˆÝŒ|˜A‰Œð 	;ÝÐ 9Ñ:Ô:Ð:ð	;à€HØÐØ�Š‰ŒˆØ˜!”ˆØ˜"”ˆˆå�œ vÑ.Ô.Ñ/Ô/ˆ	Ø�ŠÑÔÐØ˜1”ˆØ˜2”ˆÝ�6˜6 A™:Ñ&Ô&ð ð ˆØ�ˆ;ˆ;Ø�OŠO˜AÑÔÐÐà�OŠO˜AÑÔÐÐØ€Or   c                ó²  — |�%|                      ¦   «          |d         }|d         }nt          | ¦  «        }t          | ¦  «        }||z
  }g }t          | ¦  «        dk    rb| D ]^}||z
  }t	          j        |¦  «        rt          |¦  «        }|dk    r|                     ||z  ¦  «         ŒI|                     d¦  «         Œ_n|                     d¦  «         |S )a3  
    Given a list of numbers, create a proportional spacing across the unit interval.

    The first entry will always be 0 and the last 1, other entries will be spaced
    according to their distance between these two units.  For instance, for 0, 3, 4
    the middle entry will be 0.75 since 3 is 3/4 of the distance between 0 and 4:

    >>> sieve.unitNormRange([0, 3, 4])
    [0.0, 0.75, 1.0]

    but for [1, 3, 4], it will be 0.666... because 3 is 2/3 of the distance between
    1 and 4

    >>> sieve.unitNormRange([1, 3, 4])
    [0.0, 0.666..., 1.0]

    Nr   ra   r)   )rc   ÚminÚmaxÚlenr   rb   Úfloatrg   )r\   rh   ÚminFoundÚmaxFoundÚspanÚunitÚvalÚdifs           r   ÚunitNormRangerz     sâ   € ð$ ÐØ�Š‰ŒˆØ˜A”;ˆØ˜B”<ˆˆå�v‘;”;ˆÝ�v‘;”;ˆØ�hÑ€DØ€DÝ
ˆ6�{„{�Q‚€Øð 	ð 	ˆCØ˜‘.ˆCÝŒ|˜CÑ Ô ð !Ý˜C‘j”j�Ø�qŠyˆyØ—’˜C $™JÑ'Ô'Ð'Ð'à—’˜A‘”��ð	ð 	�Š�A‰ŒˆØ€Kr   c                óÄ   — | dk    rdgS | dk    rddgS g }d| dz
  z  }t          | dz
  ¦  «        D ]}|                     ||z  ¦  «         Œ|                     d¦  «         |S )a9  
    Given a certain number of parts, return a list unit-interval values
    between 0 and 1, with as many divisions as parts; 0 and 1 are always inclusive.

    >>> sieve.unitNormEqual(3)
    [0.0, 0.5, 1]

    If parts is 0 or 1, then a single entry of [0] is given:

    >>> sieve.unitNormEqual(1)
    [0]
    r)   r   r'   )rN   rg   )Úpartsrw   ÚsteprY   s       r   ÚunitNormEqualr~   A  s€   € ð �‚z€zØˆsˆ
Ø	�!ŠˆØ�1ˆvˆàˆØ�E˜A‘I‰ˆÝ�u˜q‘yÑ!Ô!ð 	"ð 	"ˆAØ�KŠK˜˜D™Ñ!Ô!Ð!Ð!Ø�Š�A‰ŒˆØˆr   r)   Tc                ó¸   — ||k    rg S ||k     r|}|}n|}|}d}g }|}||k    r%|                      |¦  «         || z  }|dz  }||k    °%|rt          |¦  «        S |S )a‘  
    Given a step size and an a/b min/max range, calculate number of parts
    to fill step through inclusive a,b, then return a unit interval list of values
    necessary to cover region.

    Note that returned values are, by default, normalized within the unit interval.

    >>> sieve.unitNormStep(0.5, 0, 1)
    [0.0, 0.5, 1]

    >>> sieve.unitNormStep(0.5, -1, 1)
    [0.0, 0.25, 0.5, 0.75, 1]

    >>> sieve.unitNormStep(0.5, -1, 1, normalized=False)
    [-1, -0.5, 0.0, 0.5, 1.0]

    >>> post = sieve.unitNormStep(0.25, 0, 20)
    >>> len(post)
    81
    >>> post = sieve.unitNormStep(0.25, 0, 20, normalized=False)
    >>> len(post)
    81

    r   r)   )rg   r~   )	r}   ÚaÚbÚ
normalizedrk   rl   ÚcountÚvaluesri   s	            r   ÚunitNormStepr…   [  s—   € ð2 	ˆA‚v€vØˆ	àˆ1‚u€uØˆØˆˆàˆØˆð €EØ€FØ€AØ
ˆvŠ+ˆ+Ø�Š�aÑÔÐØ	ˆT‰	ˆØ�‰
ˆð ˆvŠ+ˆ+ð ð Ý˜UÑ#Ô#Ð#àˆr   c                ón   — d}|dk    rd}n)| |k    rd}n |dk     r|| z  |z  }|dk    rn|dz   }|dk     °|S )Nr   r)   é'  r   )Úc1Úc2Úgrx   s       r   Ú	_meziriacr‹   ‘  sf   € ð 	
€AØ	ˆQ‚w€wØˆˆØ	ˆrŠˆØˆˆà�%ŠiˆiØ�r‘6˜R‘-ˆCØ�aŠxˆxØØ�A‘ˆAð	 �%Šiˆið
 €Hr   c                  ó*   — e Zd Zd„ Zdd„Zd„ Zdd„ZdS )	ÚPrimeSegmentc                óX   — g | _         || _        || _        |                      ¦   «          dS )a  
        A generator of prime number segments, given a start value
        and desired length of primes.

        >>> ps = sieve.PrimeSegment(3, 20)
        >>> ps()
        [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73]
        N)ÚsegÚstartÚlengthÚ
_fillRange)Úselfr�   r‘   s      r   Ú__init__zPrimeSegment.__init__¬  s/   € ð ˆŒØˆŒ
ØˆŒà�ŠÑÔÐÐÐr   NÚupc                ó(  — g }d}|dz  dk    r||k    r|dk    r|dz   }n|dz
  }n|}	 t          |¦  «        r)|                     |¦  «         t          |¦  «        |k    rn1||k    rn*||k    r|dk    r|dz   }n|dz
  }n|dk    r|dz   }n|dz
  }Œi|S )zÔ
        scan all number in range and return a list of primes
        provide a max to force stoppage at  certain point before the
        maximum length
        direction determines which way things go.
        é   r'   r   r•   r)   )r[   rg   rr   )r“   r�   r‘   ÚstopÚ	directionr�   Ú_oddBoundaryrR   s           r   Ú_fillRabinMillerzPrimeSegment._fillRabinMiller»  sä   € ð ˆØˆà�1‰9˜Š>ˆ>˜e lÒ2Ð2Ø˜DÒ Ð Ø˜A‘I��à˜A‘I��àˆAð	Ý˜1‰~Œ~ð Ø—
’
˜1‘”�Ý�s‘8”8˜vÒ%Ð%ØØ�DŠyˆyØØ�<ÒÐØ Ò$Ð$Ø˜A™�A�Aà˜A™�A�Aà Ò$Ð$Ø˜A™�A�Aà˜A™�Að!	ð" ˆ
r   c                ó”  — | j         dk     r•|                      t          | j         ¦  «        | j        dd¦  «        }d„ |D ¦   «         }t	          |¦  «        | j        k     r9|                      d| j        t	          |¦  «        z
  dd¦  «        }||z   | _        dS || _        dS |                      | j         | j        dd¦  «        | _        dS )z2
        fill positive and negative range
        r   Údownc                ó   — g | ]}| ‘ŒS r   r   )Ú.0ri   s     r   ú
<listcomp>z+PrimeSegment._fillRange.<locals>.<listcomp>ç  s   € Ð)Ð)Ð)˜Q�q�bÐ)Ð)Ð)r   Nr•   )r�   r›   rM   r‘   rr   r�   )r“   ÚsegNegÚsegPoss      r   r’   zPrimeSegment._fillRangeà  sÄ   € ð Œ:˜Š>ˆ>à×*Ò*­3¨t¬z©?¬?¸D¼KÈÈFÑSÔSˆFØ)Ð) &Ð)Ñ)Ô)ˆFÝ�6‰{Œ{˜Tœ[Ò(Ð(Ø×.Ò.¨q°$´+ÅÀFÁÄÑ2KØ9=¸tñEô E�à! F™?�”��à!�”��ð ×,Ò,¨T¬Z¸¼ÀdÈDÑQÔQˆDŒHˆHˆHr   c                ól  — | j         d         | j         d         g}|dv rt          | j         |¦  «        S |dk    rt          | j         |¦  «        S |dv r\g }t          t	          | j         ¦  «        dz
  ¦  «        D ]3}|                     | j         |dz            | j         |         z
  ¦  «         Œ4|S | j         S )z†
        assumes that min and max values are derived from found primes
        means that primes will always be at boundaries
        r   ra   ©ÚbinÚbinaryrw   ©ÚwidÚwidthr)   )r�   rn   rz   rN   rr   rg   )r“   ÚsegmentFormatÚzr¨   rX   s        r   Ú__call__zPrimeSegment.__call__ò  sÀ   € ð
 ŒX�aŒ[˜$œ( 2œ,Ð'ˆàÐ-Ð-Ð-Ý$ T¤X¨qÑ1Ô1Ð1Ø˜fÒ$Ð$Ý  ¤¨1Ñ-Ô-Ð-ØÐ.Ð.Ð.ØˆCÝ�3˜tœx™=œ=¨1Ñ,Ñ-Ô-ð <ð <�Ø—
’
˜DœH Q¨¡UœO¨d¬h°q¬kÑ9Ñ;Ô;Ð;Ð;ØˆJà”8ˆOr   )Nr•   ©N)r   r   r   r”   r›   r’   r¬   r   r   r   r�   r�   «  s^   € € € € € ðð ð ð#ð #ð #ð #ðJRð Rð Rð$ð ð ð ð ð r   r�   c                  óˆ   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zdd„Zdd„Z	d„ Z
dd„Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚResiduala   
    object that represents a modulus and a start point
    each object stores a range of integers (self._z) from which sections are drawn
    this range of integers can be changed whenever the section os drawn

    >>> residual = sieve.Residual(3, 2)
    r   Nc                óö   — |€t          t          d¦  «        ¦  «        }|| _        || _        |dvrt	          d¦  «        ‚|| _        | j        dk    r|| _        n|| j        z  | _        g d¢| _        d| _        d S )NrK   )r   r)   z)negative value must be 0, 1, or a Booleanr   ©Úintr¥   rw   r¨   r²   )	rd   rN   Ú_zÚ_mr   Ú_negÚ_shiftÚ_segmentFormatOptionsÚ_segmentFormat)r“   rS   ÚshiftÚnegr«   s        r   r”   zResidual.__init__  sˆ   € ð ˆ9Ý•U˜3‘Z”ZÑ Ô ˆAØˆŒàˆŒØ�fÐÐÝ#Ð$OÑPÔPÐPØˆŒ	ØŒ7�aŠ<ˆ<ØˆDŒKˆKà $¤'™/ˆDŒKØ%BÐ%BÐ%BˆÔ"Ø#ˆÔÐÐr   c                ó   — || _         dS )zJ
        z is the range of integers to use when generating a list
        N©r³   ©r“   r«   s     r   ÚsetZzResidual.setZ%  s   € ð ˆŒˆˆr   c                óP   — t          t          ||dz   ¦  «        ¦  «        | _        dS )zv
        z is the range of integers to use when generating a list
        convenience function that fixes max
        r)   N©rd   rN   r³   ©r“   ÚminIntÚmaxInts      r   Ú	setZRangezResidual.setZRange+  ó%   € õ
 •u˜V V¨a¡ZÑ0Ô0Ñ1Ô1ˆŒˆˆr   c                ó–   — |                      ¦   «                              ¦   «         }|| j        v rt          d|› �¦  «        ‚|| _        d S )Nzformat not in format options: )ÚstripÚlowerr·   r   r¸   ©r“   Úfmts     r   ÚsetSegmentFormatzResidual.setSegmentFormat2  sN   € à�iŠi‰kŒk×ÒÑ!Ô!ˆØ�$Ô,Ð,Ð,Ý#Ð$JÀSÐ$JÐ$JÑKÔKÐKØ!ˆÔÐÐr   c                óò  — |€| j         }|€| j        }g }| j        dk    r|S || j        z   | j        z  }|D ]%}||| j        z  k    r|                     |¦  «         Œ&| j        r1t          j        |¦  «        }|D ]}|                     |¦  «         Œ|}n|}|dv rt          ||¦  «        S |dk    rt          ||¦  «        S |dv r| j        gt          |¦  «        dz
  z  }|S |dv r|S t          |› d�¦  «        ‚)	a¼  
        get a residual subset of this modulus at this n
        within the integer range provided by z
        format can be 'int' or 'bin', for integer or binary

        >>> a = sieve.Residual(3, 2)
        >>> a.segment(3)
        [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59,
         62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98]
        >>> a.segment(3, range(3, 15))
        [5, 8, 11, 14]
        Nr   r¤   rw   r§   r)   )r²   Úintegerz( not a valid sieve segmentFormat string.)r³   r¸   r´   r¶   rg   rµ   re   rf   Úremovern   rz   rr   r   )	r“   rR   r«   rª   ÚsubsetÚvalueÚcompSetr�   r¨   s	            r   ÚsegmentzResidual.segment:  sI  € ð ˆ9Ø”ˆAØÐ Ø Ô/ˆMàˆØŒ7�aŠ<ˆ<ØˆMà�”‰_ ¤Ñ'ˆàð 	%ð 	%ˆEØ�E˜DœG‘OÒ#Ð#Ø—’˜eÑ$Ô$Ð$øØŒ9ð 	Ý”m AÑ&Ô&ˆGØð &ð &�Ø—’˜uÑ%Ô%Ð%Ð%ØˆCˆCàˆCàÐ-Ð-Ð-Ý$ S¨!Ñ,Ô,Ð,Ø˜fÒ$Ð$Ý   aÑ(Ô(Ð(ØÐ.Ð.Ð.Ø”7�)�s 3™xœx¨!™|Ñ,ˆCØˆJØÐ0Ð0Ð0ØˆJå# }Ð$^Ð$^Ð$^Ñ_Ô_Ð_r   r^   r²   c                ó   — | j         S )zˆ
        period is M; obvious, but nice for completeness

        >>> a = sieve.Residual(3, 2)
        >>> a.period()
        3
        )r´   ©r“   s    r   ÚperiodzResidual.periodi  s   € ð Œwˆr   c                óÆ   — t          j         | j        ¦  «        }t          j         | j        ¦  «        }t          j         | j        ¦  «        }t	          |||| j        ¦  «        S r­   )re   r´   r¶   rµ   r¯   r³   )r“   rS   r¹   rº   s       r   re   zResidual.copyt  sK   € åŒI�d”gÑÔˆÝ”	˜$œ+Ñ&Ô&ˆÝŒi˜œ	Ñ"Ô"ˆå˜˜5 # t¤wÑ/Ô/Ð/r   c                ó0   — |                       |||¦  «        S )a  
        calls self.segment(); uses _segmentFormat

        >>> a = sieve.Residual(3, 2)
        >>> a()
        [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47,
         50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98]
        )rÒ   ©r“   rR   r«   rª   s       r   r¬   zResidual.__call__|  s   € ð �|Š|˜A˜q -Ñ0Ô0Ð0r   c                ó¶   — |dk    r5| j         dk    r| j        › d| j         › d�}n
| j        › d�}| j        rd|› �}n| j        › d| j         › �}| j        rd|› �}|S )zG
        does not show any logical operator but unary negation
        Úclassicr   z(n+ú)z(n)r%   r&   )r¶   r´   rµ   )r“   ÚstyleÚrepStrs      r   Ú	representzResidual.representˆ  sŒ   € ð �IÒÐØŒ{˜aÒÐØ œGÐ6Ð6¨¬Ð6Ð6Ð6��à œG˜˜˜�ØŒyð &Ø%˜V˜˜�øàœÐ/Ð/ $¤+Ð/Ð/ˆFØŒyð &Ø%˜V˜˜�Øˆr   c                ó*   — |                       ¦   «         S )z�
        str representation using M(n + shift) style notation

        >>> a = sieve.Residual(3, 2)
        >>> str(a)
        '3@2'
        ©rÞ   rÔ   s    r   Ú__str__zResidual.__str__™  s   € ð �~Š~ÑÔÐr   c                ór   — |€dS | j         |j         k    r"| j        |j        k    r| j        |j        k    rdS dS )zF
        ==, compare residual classes in terms of m and shift
        Nr   r)   ©r´   r¶   rµ   ©r“   Úothers     r   Ú__eq__zResidual.__eq__£  sE   € ð ˆ=Ø�1ØŒG�u”xÒÐØ”K 5¤<Ò/Ð/Ø”I ¤Ò+Ð+Ø�1à�1r   c                óø   — | j         |j         k     rdS | j         |j         k    rdS | j         |j         k    rE| j        |j        k     rdS | j        |j        k    rdS | j        |j        k    r| j        dk    rdS dS dS dS )z¢
        allow comparison based on m and shift; if all equal look at neg

        Still being used internally even though __cmp__ is not used in Python 3
        ra   r)   r   Nrã   rä   s     r   Ú__cmp__zResidual.__cmp__°  s”   € ð Œ7�U”XÒÐØ�2ØŒW�u”xÒÐØ�1àŒW˜œÒ Ð ØŒ{˜Uœ\Ò)Ð)Ø�rØ”˜uœ|Ò+Ð+Ø�qà”9 ¤
Ò*Ð*Ø”y A’~�~Ø!˜rà ˜qà˜1ð !Ð r   c                ó<   — |                       |¦  «        dk    rdS dS )Nra   TF©rè   rä   s     r   Ú__lt__zResidual.__lt__Ë  s#   € Ø�<Š<˜ÑÔ "Ò$Ð$Ø�4à�5r   c                ó<   — |                       |¦  «        dk    rdS dS )Nr)   TFrê   rä   s     r   Ú__gt__zResidual.__gt__Ñ  s#   € Ø�<Š<˜ÑÔ !Ò#Ð#Ø�4à�5r   c                ó\   — | j         rd}nd}t          | j        | j        || j        ¦  «        S )z8
        unary neg operators; return neg object
        r   r)   )rµ   r¯   r´   r¶   r³   )r“   rº   s     r   Ú__neg__zResidual.__neg__×  s4   € ð Œ9ð 	ØˆCˆCàˆCÝ˜œ ¤¨c°4´7Ñ;Ô;Ð;r   c                ó.  — |j         s| j         rt          d¦  «        ‚|                      | j        |j        | j        |j        ¦  «        \  }}t          | j        ¦  «        t          |j        ¦  «        z  }t          |¦  «        }t          ||d|¦  «        S )a   
        &, produces an intersection of two Residual classes
        returns a new Residual class
        cannot be done if R under complementation

        >>> a = sieve.Residual(3, 2)
        >>> b = sieve.Residual(5, 1)
        >>> c = a & b
        >>> str(c)
        '15@11'
        z3complemented Residual objects cannot be intersectedr   )	rµ   r   Ú_cmpIntersectionr´   r¶   Úsetr³   rd   r¯   )r“   rå   rS   rR   ÚzSetr«   s         r   Ú__and__zResidual.__and__á  s†   € ð Œ:ð 	[˜œð 	[Ý#Ð$YÑZÔZÐZØ×$Ò$ T¤W¨e¬h¸¼ÀUÄ\ÑRÔR‰ˆˆ1å�4”7‰|Œ|�c %¤(™mœmÑ+ˆÝ�‰JŒJˆå˜˜1˜a Ñ#Ô#Ð#r   c                ó   — dS )zô
        ``|``, not sure if this can be implemented
        i.e., a union of two Residual classes can not be expressed as a single
        Residual, that is intersections can always be reduced, whereas unions
        cannot be reduced.
        Nr   rä   s     r   Ú__or__zResidual.__or__ö  s	   € ð 	ˆr   c                óF  — t          ||¦  «        }||z  }||z  }d}d}	|dk    r|dk    r||z  }||z  }n||	fS |dk    r||z
  |z  dk    r||	fS |dk    r ||z
  |z  dk    r||k    r||k    r|}	|}|	|fS ||z  |z  }	t          ||¦  «        }
||
||z
  z  |z  z   |	z  }|	|fS )z¡
        compression by intersection
        find m,n such that the intersection of two Residuals can
        be reduced to one Residual. Xenakis p 273.
        r   r)   )r   r‹   )r“   Úm1Úm2Ún1Ún2Údrˆ   r‰   Ún3Úm3rŠ   s              r   rñ   zResidual._cmpIntersection  sþ   € õ ��B‰KŒKˆØ�1‰WˆØ�1‰WˆØˆØˆØ�Š7ˆ7�r˜Q’w�wØ�b‘ˆBØ�b‘ˆBˆBà�r�6ˆMØ�Š6ˆ6˜˜R™ 1‘}¨Ò)Ð)Ø�r�6ˆMØ�!ŠVˆV˜"˜r™' Q™¨!Ò+Ð+°"¸²(°(ÀÀrÂÀØˆBØˆBØ�r�6ˆMà�b‘˜1‘ˆBÝ˜"˜bÑ!Ô!ˆAØ˜˜R "™W™¨Ñ*Ñ+¨rÑ1ˆBØ�r�6ˆMr   )r   r   N©r   NN©r^   r²   r­   )r   r   r   Ú__doc__r”   r¾   rÄ   rË   rÒ   rÕ   re   r¬   rÞ   rá   ræ   rè   rë   rí   rï   rô   rö   rñ   r   r   r   r¯   r¯     sJ  € € € € € ðð ð$ð $ð $ð $ð*ð ð ð2ð 2ð 2ð"ð "ð "ð-`ð -`ð -`ð -`ð^ð ð ð ð0ð 0ð 0ð
1ð 
1ð 
1ð 
1ðð ð ð ð" ð  ð  ðð ð ðð ð ð6ð ð ðð ð ð<ð <ð <ð$ð $ð $ð*ð ð ðð ð ð ð r   r¯   c                  ó@   — e Zd ZdZd
d„Zd
d„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dS )ÚCompressionSegmenta  
    Utility to convert from a point sequence to sieve.

    A z range can be supplied to explicitly provide the complete sieve segment,
    both positive and negative values. all values in the z range not in the
    segment are interpreted as negative values. thus, there is an essential
    dependency on the z range and the realized sieve.

    No matter the size of the z range, there is a modulus at which one point
    in the segment can be found. As such, any segment can be reduced to, at a
    minimum, a residual for each point in the segment, each, for the supplied z,
    providing a segment with one point.

    The same segment can then have multiplied logical string representations,
    depending on the provided z.

    >>> a = sieve.CompressionSegment([3, 4, 5, 6, 7, 8, 13, 19])
    >>> str(a)
    '6@1|7@6|8@5|9@4|10@3|11@8'

    >>> b = sieve.CompressionSegment([0, 2, 4, 6, 8])
    >>> str(b)
    '2@0'

    >>> c = sieve.CompressionSegment([0, 2, 4, 5, 7, 9, 11, 12])
    >>> str(c)
    '5@2|5@4|6@5|7@0'
    Nc                óæ  — t          t          j        |¦  «        ¦  «        }|                     ¦   «          g | _        |D ]%}|| j        vr| j                             |¦  «         Œ&t          | j        ¦  «        dk    rt          d¦  «        ‚|                      |¦  «         t          | j	        ¦  «        | _
        	 |                      ¦   «          d S # t          $ r}t          d¦  «        |‚d }~ww xY w)Nr)   z'segment must have more than one elementz*no Residual classes found for this z range)rd   re   rf   rc   Ú_matchrg   rr   r   Ú_zUpdater³   Ú_maxModÚ_processÚAssertionError)r“   Úsrcr«   ÚnumÚassertErrors        r   r”   zCompressionSegment.__init__=  sö   € õ •4”= Ñ%Ô%Ñ&Ô&ˆØ�Š‰
Œ
ˆ
ØˆŒàð 	(ð 	(ˆCØ˜$œ+Ð%Ð%Ø”×"Ò" 3Ñ'Ô'Ð'øÝˆtŒ{ÑÔ˜qÒ Ð Ý-Ð.WÑXÔXÐXØ�Š�aÑÔÐõ ˜4œ7‘|”|ˆŒð	Ø�MŠM‰OŒOˆOˆOˆOøÝð 	ð 	ð 	Ý-Ø<ñô àðøøøøð	øøøs   Â;C Ã
C0ÃC+Ã+C0c                ó"  — |�M|                       | j        |¦  «        st          d¦  «        ‚|| _        | j        d         | j        d         }}d S | j        d         | j        d         }}t	          t          ||dz   ¦  «        ¦  «        | _        d S )Nz-z range must be a superset of desired segmentr   ra   r)   )Ú_subsetr  r   r³   rd   rN   )r“   r«   ÚzMinÚzMaxs       r   r  zCompressionSegment._zUpdateW  s’   € àˆ=Ø—<’< ¤¨QÑ/Ô/ð EÝ1ØCñEô Eð Eð ˆDŒGØœ œ T¤W¨R¤[�$ˆDˆDˆDð œ Qœ¨¬°R¬�$ˆDÝ�5 ¨¨q©Ñ2Ô2Ñ3Ô3ˆDŒGˆGˆGr   c                ó   — | j         S )z

        >>> a = sieve.CompressionSegment([3, 4, 5, 6, 7, 8])
        >>> b = a()
        >>> str(b[0])
        '1@0'
        )Ú
_residualsrÔ   s    r   r¬   zCompressionSegment.__call__f  s   € ð ŒÐr   c                óò   — g }t          | j        ¦  «        dk    rt          | j        d         ¦  «        }nA| j        D ]$}|                     t          |¦  «        ¦  «         Œ%d                     |¦  «        }|S )Nr)   r   r#   )rr   r  Ústrrg   Újoin)r“   ÚresStrÚresObjs      r   rá   zCompressionSegment.__str__p  st   € ØˆÝˆtŒÑÔ 1Ò$Ð$Ý˜œ¨Ô+Ñ,Ô,ˆFˆFàœ/ð +ð +�Ø—’�c &™kœkÑ*Ô*Ð*Ð*Ø—X’X˜fÑ%Ô%ˆFØˆr   c                óP   — d}|D ]}||v r|dz   }Œ|t          |¦  «        k    rdS dS )zM
        True if sub is part of set; assumes no redundancies in each
        r   r)   )rr   )r“   ÚsubÚthisSetÚ	commonNumri   s        r   r  zCompressionSegment._subset{  sF   € ð ˆ	Øð 	*ð 	*ˆAØ�Gˆ|ˆ|Ø%¨™M�	øØ�˜C™œÒ Ð Ø�1à�1r   c                ó  — d}|| j         k     ret          ||d| j        ¦  «        } |¦   «         }|                      ||¦  «        r||fS |                      ||¦  «        r||fS |dz   }|| j         k     °et	          d| j         › �¦  «        ‚)z_
        given a point, and SieveSegment, find a modulus and shift that
        match.
        r)   r   za mod was not found less than )r  r¯   r³   r  r   )r“   rR   ÚpartÚwholerS   Úobjr�   s          r   Ú_findzCompressionSegment._findˆ  s§   € ð
 ˆØ�$”,ÒÐÝ˜1˜a  D¤GÑ,Ô,ˆCØ�#‘%”%ˆCà�|Š|˜C Ñ&Ô&ð  Ø˜C�x�Ø—’˜c 5Ñ)Ô)ð  Ø˜C�x�Ø�A‘ˆAð �$”,ÒÐõ ÐL¸d¼lÐLÐLÑMÔMÐMr   c                ó†  — g | _         t          j        | j        ¦  «        }d}|rƒ|dz  }|d         }|                      ||| j        ¦  «        \  }}|€t	          d¦  «        ‚|| j         vr8| j                              |¦  «         |D ]}||v r|                     |¦  «         Œ|sn|°ƒ| j                              ¦   «          dS )a  
        take a copy of match; move through each value of this list as if it
        were n; for each n test each modulo (from 1 to len(z) + 1) to find a
        residual. when found (one will be found), keep it; remove the found
        segments from the match, and repeat.
        r‡   r)   r   Nz_find() returned a None object)r  re   r  r   r   rg   rÎ   rc   )r“   ÚmatchÚmaxToRunrR   r  r�   ri   s          r   r  zCompressionSegment._process›  sæ   € ð ˆŒÝ”	˜$œ+Ñ&Ô&ˆàˆØð 	Ø˜‰MˆHØ�a”ˆAØ—z’z ! U¨D¬KÑ8Ô8‰HˆC�Øˆ{Ý1Ð2RÑSÔSÐSØ˜$œ/Ð)Ð)Ø”×&Ò& sÑ+Ô+Ð+Øð (ð (�AØ˜E�z�zØŸš Q™œ˜øØð Øð ð 	ð 	Œ×ÒÑÔÐÐÐr   r­   )r   r   r   r  r”   r  r¬   rá   r  r   r  r   r   r   r  r    s”   € € € € € ðð ð:ð ð ð ð44ð 4ð 4ð 4ðð ð ðð ð ðð ð ðNð Nð Nð&ð ð ð ð r   r  c                  ó  — e Zd ZdZd8d9d„Zd„ Zd	„ Zd
„ Zd„ Zd8d„Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd:d„Zd„ Zd„ Zd;d „Zd!„ Zd"„ Zd8d#„Zd$„ Zd8d%„Zd&„ Z d'„ Z!	 	 	 	 d<d=d*„Z"d>d,„Z#d?d-„Z$	 d@dAd5„Z%dBd6„Z&d7„ Z'dS )CÚSievez¸
    Create a sieve segment from a sieve logical string of any complexity.

    >>> a = sieve.Sieve('3@11')
    >>> b = sieve.Sieve('2&4&8|5')
    >>> c = sieve.Sieve('(5|2)&4&8')
    NÚusrStrústr | list[str]r«   úlist[int] | Nonec                ó�  — |€2t          |t          ¦  «        rt          t          d¦  «        ¦  «        }n|€t	          j        |¦  «        r	 || _        d| _        d | _        d| _	        g d¢| _
        d| _        i | _        d| _        d| _        d| _        d| _        d| _        || _        | j        �|                      ¦   «          d S d S )	NrK   Úexpr²   r±   Fr   Ú ra   )Ú
isinstancer  rd   rN   r   Ú
isListLiker³   Ú_stateÚ_expTyper¸   r·   Ú_nonCompressibleÚ_resLibÚ_resIdÚ_expTreeÚ
_expPeriodÚ_cmpTreeÚ
_cmpPeriodÚ_usrStrÚ_load)r“   r&  r«   s      r   r”   zSieve.__init__é  sÈ   € àˆ9� F­CÑ0Ô0ˆ9Ý•U˜3‘Z”ZÑ Ô ˆAˆAØˆY�6Ô,¨VÑ4Ô4ˆYØØˆŒà/4ˆŒØˆŒØ#ˆÔØ%BÐ%BÐ%BˆÔ"à %ˆÔà,.ˆŒØˆŒð ˆŒØˆŒØˆŒØˆŒØˆŒØŒ<Ð#Ø�JŠJ‰LŒLˆLˆLˆLð $Ð#r   c                ó8  — t          j        | j        ¦  «        rD|                      ¦   «          |                      | j        ¦  «         |                      ¦   «          d S |                      ¦   «          |                      ¦   «          |                      ¦   «          d S r­   )r   r-  r7  Ú	_resClearÚ_initLoadSegmentÚ_initCompressionÚ
_initParserÔ   s    r   r8  zSieve._load  s�   € ÝÔ˜Tœ\Ñ*Ô*ð 	$Ø�NŠNÑÔÐØ×!Ò! $¤,Ñ/Ô/Ð/Ø×!Ò!Ñ#Ô#Ð#Ð#Ð#ð �NŠNÑÔÐØ�OŠOÑÔÐØ×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c                óà  — d| _         t          | j        v s*t          | j        v st          | j        v st
          | j        v r-	 |                      ¦   «          nq# t          $ r
 d| _        Y n^w xY w	 |  	                    ¦   «          d| _         n=# t          $ r0 	 |                      ¦   «          n# t          $ r
 d| _        Y nw xY wY nw xY wd}| j        rd}n| j         dk    rd}n| j         dk    rd}|S )NÚcomplexr)   Úsimpler+  zno compression possiblerÒ   Úintersection)r/  ÚNEGr3  ÚLGROUPÚRGROUPÚXORÚ_cmpSegmentÚ
IndexErrorr0  rñ   Ú	TypeError)r“   Úmethods     r   r<  zSieve._initCompression  sF  € ð "ˆŒÝ�4”=Ð Ð Ý˜Tœ]Ð*Ð*Ý˜Tœ]Ð*Ð*Ý˜$œ-Ð'Ð'ð*Ø× Ò Ñ"Ô"Ð"Ð"øÝð *ð *ð *Ø()�Ô%Ð%Ð%ð*øøøð.Ø×%Ò%Ñ'Ô'Ð'Ø (�”�øÝð .ð .ð .ð.Ø×$Ò$Ñ&Ô&Ð&Ð&øÝ!ð .ð .ð .Ø,-�DÔ)Ð)Ð)ð.øøøøøð.øøøð ˆØÔ ð 	$Ø.ˆFˆFØŒ]˜iÒ'Ð'ØˆFˆFØŒ]˜hÒ&Ð&Ø#ˆFØˆsH   ÁA ÁA*Á)A*Á.B
 Â

CÂB*Â)CÂ*B>Â;CÂ=B>Â>CÃCc                óÂ   — |                       d¦  «        }|                       d¦  «        }t          |Ž }||k    r|| _        || _        dS || _        t          |Ž | _        dS )zb
        Lazy period initialization, called only when needed from public period() method.
        r*  ÚcmpN)Ú_resPeriodListr   r4  r6  )r“   ÚmListExpÚmListCmpÚlcmExps       r   Ú_initPeriodzSieve._initPeriod/  sf   € ð ×&Ò& uÑ-Ô-ˆØ×&Ò& uÑ-Ô-ˆå�h�ˆØ�xÒÐØ$ˆDŒOØ$ˆDŒOˆOˆOà$ˆDŒOÝ! 8˜nˆDŒOˆOˆOr   c                ó   — d| _         dS )z7
        Set this Sieve to its expanded state.
        r*  N)r.  rÔ   s    r   ÚexpandzSieve.expand?  s   € ð ˆŒˆˆr   c                ó    — |�;|| j         k    r0|| _         |                      d¦  «         |                      ¦   «          | j        rdS d| _        dS )z9
        Set this sieve to its compressed state.
        NrK  )r³   r:  r<  r0  r.  r½   s     r   ÚcompresszSieve.compressE  sY   € ð ˆ=˜Q $¤'š\˜\ØˆDŒGØ�NŠN˜5Ñ!Ô!Ð!Ø×!Ò!Ñ#Ô#Ð#àÔ ð 	 ØˆDàˆDŒKˆKˆKr   c                ó¨   — d|                       d¦  «        i}| j        €)| j        |                      d¦  «                 j        |d<   n
| j        |d<   |S )zH
        Provides a dictionary data representation for exchange
        ÚlogStrr*  Nr   r«   )rÞ   r³   r1  Ú
_resKeyStrr«   )r“   Údatas     r   Ú_getParameterDatazSieve._getParameterDataU  sV   € ð
 �d—n’n UÑ+Ô+ð
ˆð Œ7ˆ?Øœ T§_¢_°QÑ%7Ô%7Ô8Ô:ˆD�‰IˆIàœˆD�‰IØˆr   c                ó   — || _         dS )zu
        Set the z as a list. The z is the range of integers to use when
        generating a sieve segment.
        Nr¼   r½   s     r   r¾   z
Sieve.setZd  s   € ð
 ˆŒˆˆr   c                óP   — t          t          ||dz   ¦  «        ¦  «        | _        dS )z‚
        Set the z as a min and max value. The z is the range of
        integers to use when generating a sieve segment.
        r)   NrÀ   rÁ   s      r   rÄ   zSieve.setZRangek  rÅ   r   c                ó–   — |                      ¦   «                              ¦   «         }|| j        vrt          d|› �¦  «        ‚|| _        d S )Nzcannot set to format: )rÇ   rÈ   r·   r   r¸   rÉ   s     r   rË   zSieve.setSegmentFormatr  sN   € à�iŠi‰kŒk×ÒÑ!Ô!ˆØ�dÔ0Ð0Ð0Ý Ð!?¸#Ð!?Ð!?Ñ@Ô@Ð@Ø!ˆÔÐÐr   c                ó¶   — |                       ¦   «         }d                     t          t          |d         t          g¦  «        }|d         }t          ||¦  «        S )z9
        unary neg operators; return neg object.
        r+  rV  r«   )rY  r  rB  rC  rD  r%  )r“   ÚdataSelfr&  r«   s       r   rï   zSieve.__neg__}  sY   € ð ×)Ò)Ñ+Ô+ˆØ—’ÝÝØ�XÔÝð	
ñ ô ˆð �SŒMˆÝ�V˜QÑÔÐr   c           	     óh  — |                       ¦   «         }|                      ¦   «         }d                     t          |d         t          t          t          |d         t          g¦  «        }t          |d         ¦  «        t          |d         ¦  «        z  }t          |¦  «        }t          ||¦  «        S )zô
        &, produces an intersection of two

        >>> a = sieve.Sieve('3@11')
        >>> b = sieve.Sieve('2&4&8|5')
        >>> c = sieve.Sieve('(5|2)&4&8')
        >>> d = a & b
        >>> str(d)
        '{2@0&4@0&8@0|5@0}&{3@2}'
        r+  rV  r«   )rY  r  rC  rD  ÚANDrò   rd   r%  ©r“   rå   r^  Ú	dataOtherr&  ró   r«   s          r   rô   zSieve.__and__‹  sœ   € ð ×)Ò)Ñ+Ô+ˆØ×+Ò+Ñ-Ô-ˆ	Ø—’ÝØ�hÔÝÝÝØ�XÔÝð
ñ ô ˆõ �8˜C”=Ñ!Ô!¥C¨	°#¬Ñ$7Ô$7Ñ7ˆÝ�‰JŒJˆÝ�V˜QÑÔÐr   c           	     óh  — |                       ¦   «         }|                      ¦   «         }d                     t          |d         t          t          t          |d         t          g¦  «        }t          |d         ¦  «        t          |d         ¦  «        z  }t          |¦  «        }t          ||¦  «        S )zÀ
        ``|``, produces a union

        >>> a = sieve.Sieve('3@11')
        >>> b = sieve.Sieve('2&4&8|5')
        >>> d = a | b
        >>> str(d)
        '{2@0&4@0&8@0|5@0}|{3@2}'
        r+  rV  r«   )rY  r  rC  rD  ÚORrò   rd   r%  ra  s          r   rö   zSieve.__or__¦  sœ   € ð ×)Ò)Ñ+Ô+ˆØ×+Ò+Ñ-Ô-ˆ	à—’ÝØ�hÔÝÝÝØ�XÔÝð
ñ ô ˆõ �8˜C”=Ñ!Ô!¥C¨	°#¬Ñ$7Ô$7Ñ7ˆÝ�‰JŒJˆÝ�V˜QÑÔÐr   c           	     óh  — |                       ¦   «         }|                      ¦   «         }d                     t          |d         t          t          t          |d         t          g¦  «        }t          |d         ¦  «        t          |d         ¦  «        z  }t          |¦  «        }t          ||¦  «        S )z4
        ^, produces exclusive disjunction.
        r+  rV  r«   )rY  r  rC  rD  rE  rò   rd   r%  ra  s          r   Ú__xor__zSieve.__xor__Á  sœ   € ð ×)Ò)Ñ+Ô+ˆØ×+Ò+Ñ-Ô-ˆ	à—’ÝØ�hÔÝÝÝØ�XÔÝð
ñ ô ˆõ �8˜C”=Ñ!Ô!¥C¨	°#¬Ñ$7Ô$7Ñ7ˆÝ�‰JŒJˆÝ�V˜QÑÔÐr   c                ó,  — d}t          j        |¦  «        rt          |¦  «        dddœS |                     ¦   «         }|sdS |                     d¦  «        r|                     dd¦  «        }|                     d¦  «        r|                     dd¦  «        }|                     t          d¦  «        }|                     t          d¦  «        }|d         dk    rd	}|d	d…                              ¦   «         }nd}|sdS 	 t          |¦  «        }n# t          t          t          f$ r Y dS w xY wd}t          j        |¦  «        rt          |¦  «        }d}n:t          j        |¦  «        r&|d         }t          |¦  «        d	k    r	|d	         }nd}|||d
œS )ai  
        process an arg string for proper Residual creation
        valid syntax for Mod, shift pairs:
        all valid: MsubN, M@N, M,N, M
        if M is given alone, shift is assumed to be 0
        this method assumes that all brackets have been replaced with parentheses
        returns a dictionary of args suitable for creating a Residual class
        r   )rS   rR   rº   Nr  ú,r&   r+  r%   r)   )rS   r¹   rº   )r   rb   r²   rÇ   ÚfindÚreplacerC  rD  r   Ú	NameErrorÚSyntaxErrorrH  r-  rr   )r“   r&  rS   rº   Úargsr¹   s         r   Ú_parseResidualzSieve._parseResidualØ  sÁ  € ð ˆåŒ<˜ÑÔð 	8Ý˜V™œ¨1°QÐ7Ð7Ð7à—’‘”ˆØð 	Ø�4Ø�;Š;�uÑÔð 	0Ø—^’^ E¨3Ñ/Ô/ˆFØ�;Š;�sÑÔð 	.Ø—^’^ C¨Ñ-Ô-ˆFð —’¥¨Ñ+Ô+ˆØ—’¥¨Ñ+Ô+ˆð �!Œ9˜ÒÐØˆCà˜A˜B˜B”Z×%Ò%Ñ'Ô'ˆFˆFàˆCàð 	Ø�4ð	õ   Ñ'Ô'ˆDˆDøÝ�;­	Ð2ð 	ð 	ð 	Ø�4�4ð	øøøð ˆÝŒ<˜ÑÔð 	Ý�D‘	”	ˆAØˆEˆEÝÔ˜tÑ$Ô$ð 	Ø�Q”ˆAÝ�4‰yŒy˜1Š}ˆ}Ø˜Qœ��à�àØØðð ð 	s   Ä D ÄD+Ä*D+c                ó’  — t          j        |¦  «        rt          |¦  «        }|› d�}|                     d¦  «        dk    r|                     dt
          ¦  «        }|                     d¦  «        dk    r|                     dt
          ¦  «        }|                     d¦  «        dk    r|                     dt          ¦  «        }|                     d¦  «        dk    r|                     dt          ¦  «        }|                     d¦  «        dk    r|                     dt          ¦  «        }|                     d	¦  «        dk    r|                     d	t          ¦  «        }|                     d
¦  «        dk    r|                     d
t          ¦  «        }|                     d¦  «        dk    r|                     dt          ¦  «        }|                     d¦  «        dk    r|                     dt          ¦  «        }|                     d¦  «        dk    r|                     dt          ¦  «        }|                     dd¦  «        }|S )aí  
        provide synonyms for logical symbols::

            intersection == and, &, *
            union        == or, |, +
            not          == not, -

        the native format for str representation uses only ``&``, ``|``, ``-``;
        this method converts all other string representations

        all brackets and braces are replaced with parenthesis
        parentheses are only used for the internal representation
        on string representation, braces are restored
        z@0Úandr   Ú*Úorú+Úxorr$   Únotú[ú]ú(rÛ   ú r+  )
r   rb   r²   ri  rj  r`  rd  rB  rC  rD  )r“   r&  s     r   Ú_parseLogiczSieve._parseLogic  sè  € õ  Œ<˜ÑÔð 	#Ý˜‘[”[ˆFØ�]�]�]ˆFà�;Š;�uÑÔ Ò"Ð"Ø—^’^ E­3Ñ/Ô/ˆFØ�;Š;�sÑÔ˜qÒ Ð Ø—^’^ C­Ñ-Ô-ˆFØ�;Š;�tÑÔ Ò!Ð!Ø—^’^ D­"Ñ-Ô-ˆFØ�;Š;�sÑÔ˜qÒ Ð Ø—^’^ C­Ñ,Ô,ˆFØ�;Š;�uÑÔ Ò"Ð"Ø—^’^ C­Ñ,Ô,ˆFØ�;Š;�uÑÔ Ò"Ð"Ø—^’^ E­3Ñ/Ô/ˆFà�;Š;�sÑÔ˜qÒ Ð Ø—^’^ C­Ñ0Ô0ˆFØ�;Š;�sÑÔ˜qÒ Ð Ø—^’^ C­Ñ0Ô0ˆFØ�;Š;�sÑÔ˜qÒ Ð Ø—^’^ C­Ñ0Ô0ˆFØ�;Š;�sÑÔ˜qÒ Ð Ø—^’^ C­Ñ0Ô0ˆFà—’  RÑ(Ô(ˆØˆr   c                ór   — t          |¦  «        }t          |¦  «                             dd¦  «        }d|› d�S )zF
        return string necessary to instantiate a set object.
        ry  r+  zset(rÛ   )rd   Úreprrj  )r“   ÚvalLists     r   Ú_setInstantiateStrzSieve._setInstantiateStrC  s;   € õ �w‘-”-ˆÝ�w‘-”-×'Ò'¨¨RÑ0Ô0ˆØ �gÐ Ð Ð Ð r   c                ó   — d|› d�S )Nz<Rú>r   )r“   ÚresIds     r   rW  zSieve._resKeyStrK  s   € Ø�Eˆ}ˆ}ˆ}Ðr   c                óô   — |dvrt          d¦  «        ‚|dk    r,g }| j        D ] }|| j        v r|                     |¦  «         Œ!|S |dk    r,g }| j        D ] }|| j        v r|                     |¦  «         Œ!|S dS )z5
        get residual keys based on library.
        )rK  r*  zstate must be 'cmp' or 'exp'rK  r*  N)r   r1  r5  rg   r3  )r“   ÚstateÚlibKeysÚkeys       r   Ú_resKeyszSieve._resKeysN  s­   € ð ˜Ð&Ð&Ý Ð!?Ñ@Ô@Ð@Ø�EŠ>ˆ>ØˆGØ”|ð (ð (�Ø˜$œ-Ð'Ð'Ø—N’N 3Ñ'Ô'Ð'øØˆNØ�eŠ^ˆ^ØˆGØ”|ð (ð (�Ø˜$œ-Ð'Ð'Ø—N’N 3Ñ'Ô'Ð'øØˆNð ˆ^r   r^   r_   c                óÒ   — g }|                       |¦  «        D ]:}| j        |                              ¦   «         }||vr|                     |¦  «         Œ;|                     ¦   «          |S )z˜
        For all residual classes, get the period, or the value of M,
        and return these in a list. Remove any redundant values and sort.
        )r†  r1  rÕ   rg   rc   )r“   rƒ  ÚmListr…  r.   s        r   rL  zSieve._resPeriodLista  sg   € ð
 ˆØ—=’= Ñ'Ô'ð 	 ð 	 ˆCØ”˜SÔ!×(Ò(Ñ*Ô*ˆAØ˜ˆ~ˆ~Ø—’˜Q‘”�øØ�
Š
‰ŒˆØˆr   c                óf  — |                       d                     |¦  «        ¦  «        }|€-d                     |¦  «        }d|› �}t          d|›d�¦  «        ‚t          |d         |d         |d         | j        ¦  «        }|| j        |                      |¦  «        <   |                      |¦  «        S )	zš
        create a residual object, store in expResidualLib
        return a string id representation
        this uses self._z at initialization.
        r+  Nzcannot parse zbad residual class notation: (rÛ   rS   r¹   rº   )rn  r  r   r¯   r³   r1  rW  )r“   r�  r  ÚresDictÚjoinedÚmsgr  s          r   Ú
_resCreatezSieve._resCreaten  s¯   € ð ×%Ò% b§g¢g¨f¡o¤oÑ6Ô6ˆØˆ?Ø—W’W˜V‘_”_ˆFØ* &Ð*Ð*ˆCÝ Ð!JÀ#Ð!JÐ!JÐ!JÑKÔKÐKÝ˜' #œ,¨°Ô(8Ø! %œ.¨$¬'ñ3ô 3ˆð 06ˆŒ�T—_’_ UÑ+Ô+Ñ,Ø�Š˜uÑ%Ô%Ð%r   c                óf   — || j         |                      |¦  «        <   |                      |¦  «        S r­   )r1  rW  )r“   r�  r  s      r   Ú
_resAssignzSieve._resAssign  s,   € Ø/5ˆŒ�T—_’_ UÑ+Ô+Ñ,Ø�Š˜uÑ%Ô%Ð%r   r   c                ó¼   — |€| j         }t          j        |¦  «        s|�t          d|›�¦  «        ‚ | j        |         ||¦  «        }|                      |¦  «        S )z�
        this is where residuals are converted to set evaluating strings
        z should not be stored; should be a temporary value
        Nz"z must be a list of integers, not )r³   r   r-  r   r1  r~  )r“   r�  rR   r«   r}  s        r   Ú_resToSetStrzSieve._resToSetStrƒ  sk   € ð
 ˆ9Ø”ˆAåÔ  Ñ#Ô#ð 	M¨¨Ý Ð!KÀaÐ!KÐ!KÑLÔLÐLØ%�$”,˜uÔ% a¨Ñ+Ô+ˆØ×&Ò& wÑ/Ô/Ð/r   c                ó$   — | j         dz   | _         dS )z'
        increment the _resId.
        r)   N)r2  rÔ   s    r   Ú_resIdIncrementzSieve._resIdIncrement�  s   € ð ”k A‘oˆŒˆˆr   c                ó8  — t          t          | j                             ¦   «         ¦  «        ¦  «        }|D ]8}|                      |¦  «        }|| j        vr|| j        vrt          d¦  «        ‚Œ9t          | j                             ¦   «         ¦  «        | _        dS )zµ
        reset self._resId to the next available number
        may need to re-label some residual classes if gaps develop
        ids should be contiguous integer sequence
        zgap in residual keysN)	rN   rr   r1  ÚkeysrW  r5  r3  r   r2  )r“   ÚiValsrX   ÚtestKeys       r   Ú_resResetIdzSieve._resResetId–  s‘   € õ •c˜$œ,×+Ò+Ñ-Ô-Ñ.Ô.Ñ/Ô/ˆØð 	=ð 	=ˆAØ—o’o aÑ(Ô(ˆGØ˜dœmÐ+Ð+°¸t¼}Ð0LÐ0LÝ$Ð%;Ñ<Ô<Ð<øå˜$œ,×+Ò+Ñ-Ô-Ñ.Ô.ˆŒˆˆr   c                óÐ   — |€i | _         d| _        d S |dk    r8|                      |¦  «        }|D ]
}| j         |= Œ|                      ¦   «          d S |dk    rt	          d¦  «        ‚d S )Nr   rK  r*  z1Expanded residual classes should never be cleared)r1  r2  r†  r˜  r   )r“   rƒ  ÚcmpKeysr…  s       r   r:  zSieve._resClear¤  s†   € Øˆ=ØˆDŒLØˆDŒKˆKˆKØ�eŠ^ˆ^Ø—m’m EÑ*Ô*ˆGØð &ð &�Ø”L Ð%Ð%à×ÒÑÔÐÐÐØ�eŠ^ˆ^Ý Ð!TÑUÔUÐUð ˆ^r   c                óX  — g | _         t          || j        ¦  «        }| j        €|j        | _         |¦   «         }|D ]I}| j                              |                      | j        |¦  «        ¦  «         |                      ¦   «          ŒJt                               | j         ¦  «        | _         dS )z=
        load from a segments
        reload _resId.
        N)	r3  r  r³   rg   r�  r2  r“  rd  r  )r“   ÚusrDataÚsegObjÚunionr  s        r   r;  zSieve._initLoadSegment´  sš   € ð ˆŒå# G¨T¬WÑ5Ô5ˆØŒ7ˆ?Ø”iˆDŒGØ�‘”ˆØð 	#ð 	#ˆFàŒM× Ò  §¢°´¸fÑ!EÔ!EÑFÔFÐFØ× Ò Ñ"Ô"Ð"Ð"ÝŸš ¤Ñ.Ô.ˆŒˆˆr   c                ó¤  — i | _         d| _        g | _        |                      t	          j        | j        ¦  «        ¦  «        }d}	 |t          |¦  «        k    r�nA||         }|dk    rd}n||dz
           }|t          |¦  «        dz
  k    rd}n||dz            }|t          v r!| j         	                    |¦  «         |dz   }�nÕ|t          k    r|€d}t          d|› d�¦  «        ‚|t          k    r |�|t          v rd}t          d|› d�¦  «        ‚|t          k    ra|�_|t          k    rT|�1|t          t          t          t           fvrd	}t          d
|› d�¦  «        ‚| j         	                    |¦  «         |dz  }�n|t"          j        v s|t          k    rþg }t	          j        |¦  «        }	d}
||	|
z            t          k    r| 	                    t          ¦  «         |
dz   }
	 |	|
z   t          |¦  «        k    rn;||	|
z            }|t          v s|t          k    rn| 	                    |¦  «         |
dz   }
ŒR| j         	                    |                      | j        d                     |¦  «        ¦  «        ¦  «         |                      ¦   «          ||
z   }n|dz   }�ŒV| j         st          d¦  «        ‚d                     | j        ¦  «        | _        dS )zV
        process usrStr string into proper argument dictionaries for Residual
        r   r)   Nz(negation cannot be used without operandsz"badly formed logical string (a): (rÛ   z,negation cannot be used as a binary operatorz"badly formed logical string (b): (z6negation must be of a group and isolated by delimitersz"badly formed logical string (c): (r+  zno residual classes defined)r1  r2  r3  rz  re   rf   r7  rr   ÚBOUNDSrg   rB  r   ÚRESIDUALrC  r`  rd  rE  ÚstringÚdigitsr�  r  r“  )r“   r«   rV  rX   ÚcharÚcharPreviousÚcharNextrŒ  r  ÚsubStartÚsubLenÚsubChars               r   r=  zSieve._initParseÆ  s  € ð
 ˆŒØˆŒØˆŒà×!Ò!¥$¤-°´Ñ"=Ô"=Ñ>Ô>ˆØˆðG	Ø•C˜‘K”KÒÐÙØ˜!”9ˆDà�AŠvˆvØ#��à% a¨!¡eœ}�Ø•C˜‘K”K !‘OÒ#Ð#Ø��à! ! a¡%œ=�ð •vˆ~ˆ~Ø”×$Ò$ TÑ*Ô*Ð*Ø˜‘E�‘ð �’� Ð!1Ø@�Ý$Ð%PÈ#Ð%PÐ%PÐ%PÑQÔQÐQà�#’+�+Ø"Ð.Ø"¥hÐ.Ð.ØD�Ý$Ð%PÈ#Ð%PÐ%PÐ%PÑQÔQÐQð �#’+�+ØÐ*Ø¥&Ò(Ð(ð !Ð,Ø(µ½½bÅ#Ð0FÐFÐFØR�CÝ(Ð)TÈcÐ)TÐ)TÐ)TÑUÔUÐUà”×$Ò$ TÑ*Ô*Ð*Ø�Q‘�‘ð
 �œÐ&Ð&¨$µ#ª+¨+Ø�Ýœ9 Q™<œ<�Ø�à˜( VÑ+Ô,µÒ3Ð3Ø—M’M¥#Ñ&Ô&Ð&Ø# a™Z�Fð
,à  6Ñ)­c°&©k¬kÒ9Ð9ØØ$ X°Ñ%6Ô7�Gà¥&Ð(Ð(¨GµsªN¨NØàŸš gÑ.Ô.Ð.Ø!'¨!¡˜ð
,ð ”×$Ò$ T§_¢_°T´[À"Ç'Â'È&Á/Ä/Ñ%RÔ%RÑSÔSÐSØ×$Ò$Ñ&Ô&Ð&Ø˜‘J��à˜‘E�ñOG	ðR Œ|ð 	@Ý Ð!>Ñ?Ô?Ð?ØŸš ¤Ñ.Ô.ˆŒˆˆr   c                ó   — g | _         t          j        | j        ¦  «        }|                     t          ¦  «        }d}|D ]ê}|dk    rŒ	|                     t
          ¦  «        }t          |¦  «        dk    r| j        |d                  }nYt          t          |¦  «        dz
  ¦  «        D ]9}|dk    r| j        ||                  }n|}| j        ||dz                     }||z  }Œ:| j          	                    |  
                    | j        |¦  «        ¦  «         |                      ¦   «          Œët                               | j         ¦  «        | _         dS )z9
        an unbound sieve, intersection Residual
        r   r+  r)   N)r5  re   r3  Úsplitrd  r`  rr   r1  rN   rg   r�  r2  r“  r  )	r“   rV  ÚorListrA  ÚorGroupÚandListrX   r€   r�   s	            r   rñ   zSieve._cmpIntersection!  s6  € ð ˆŒÝ”˜4œ=Ñ)Ô)ˆà—’�bÑ!Ô!ˆØˆØð 	#ð 	#ˆGØ˜"Š}ˆ}Øà—m’m¥CÑ(Ô(ˆGå�7‰|Œ|˜qÒ Ð Ø#œ|¨G°A¬JÔ7��å�s 7™|œ|¨aÑ/Ñ0Ô0ð )ð )�AØ˜A’v�và œL¨°¬Ô4˜˜à(˜Øœ W¨Q°©U¤^Ô4�Aà#$ q¡5�L�LàŒM× Ò  §¢°´¸lÑ!KÔ!KÑLÔLÐLØ× Ò Ñ"Ô"Ð"Ð"ÝŸš ¤Ñ.Ô.ˆŒˆˆr   c                óz  — g | _         |                      d¦  «        }|st          d¦  «        ‚t          || j        ¦  «        } |¦   «         D ]I}| j                              |                      | j        |¦  «        ¦  «         |                      ¦   «          ŒJt           
                    | j         ¦  «        | _         dS )z<
        a bound sieve, uss a newly created segment
        r*  z/empty segment; segment compression not possibleN)r5  rÒ   rG  r  r³   rg   r�  r2  r“  rd  r  )r“   r�   r�  r  s       r   rF  zSieve._cmpSegmentA  s®   € ð
 ˆŒà�lŠl˜5Ñ!Ô!ˆØð 	PÝÐNÑOÔOÐOå# C¨¬Ñ1Ô1ˆØ�f‘h”hð 	#ð 	#ˆFØŒM× Ò  §¢°´¸fÑ!EÔ!EÑFÔFÐFØ× Ò Ñ"Ô"Ð"Ð"ÝŸš ¤Ñ.Ô.ˆŒˆˆr   rƒ  ú*t.Literal['cmp'] | t.Literal['exp'] | Nonec           	     ó  — |€| j         }|€| j        }|€| j        }|dk    rt          j        | j        ¦  «        }n"|dk    rt          j        | j        ¦  «        }nd}|                      |¦  «        }t          ddd|¦  «        }|                       |¦   «         ¦  «        }| 	                    d|dz   ¦  «        }|D ]-}	| 	                    |	|  
                    |	||¦  «        ¦  «        }Œ.| 	                    t          d¦  «        }| 	                    t          d	¦  «        }	 t          |d
dt          iii ¦  «        }
n&# t          $ r}t!          d|› d	�¦  «        |‚d}~ww xY wt#          |
¦  «        }
|
                     ¦   «          |dv rt'          |
|¦  «        S |dk    rt)          |
|¦  «        S |dv rMg }t+          t-          |
¦  «        dz
  ¦  «        D ])}|                     |
|dz            |
|         z
  ¦  «         Œ*|S |
S )aš  
        Return a sieve segment in various formats.

        >>> a = sieve.Sieve('3@11')
        >>> a.segment('exp')
        [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47,
         50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98]

        >>> c = sieve.Sieve('(5|2)&4&8')
        >>> c.segment('cmp', segmentFormat='wid')
        [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
        Nr*  rK  r+  r)   r   r%   rx  rÛ   Ú__builtins__rò   zbadly formed logical string (r¤   rw   r§   )r.  r³   r¸   re   r3  r5  r†  r¯   r~  rj  r‘  rC  rD  Úevalrò   rl  r   rd   rc   rn   rz   rN   rr   rg   )r“   rƒ  rR   r«   rª   ÚevalStrr•  r  ÚsetStrr…  r�   Úser¨   rX   s                 r   rÒ   zSieve.segmentT  s7  € ð& ˆ=Ø”KˆEØˆ9Ø”ˆAØÐ Ø Ô/ˆMà�EŠ>ˆ>Ý”i ¤Ñ.Ô.ˆGˆGØ�eŠ^ˆ^Ý”i ¤Ñ.Ô.ˆGˆGàˆGØ�}Š}˜UÑ#Ô#ˆõ ˜!˜Q  1Ñ%Ô%ˆØ×(Ò(¨¨©¬Ñ2Ô2ˆØ—/’/ # v°¡|Ñ4Ô4ˆàð 	Ið 	IˆCØ—o’o c¨4×+<Ò+<¸SÀ!ÀQÑ+GÔ+GÑHÔHˆGˆGð —/’/¥&¨#Ñ.Ô.ˆØ—/’/¥&¨#Ñ.Ô.ˆð		õ �w °%½°Ð >ÀÑCÔCˆCˆCøõ ð 	ð 	ð 	Ý Ø:°Ð:Ð:Ð:ñô àðøøøøð	øøøõ
 �3‰iŒiˆØ�Š‰
Œ
ˆ
ØÐ-Ð-Ð-Ý$ S¨!Ñ,Ô,Ð,Ø˜fÒ$Ð$Ý   aÑ(Ô(Ð(ØÐ.Ð.Ð.ØˆCÝ�3˜s™8œ8 a™<Ñ(Ô(ð 2ð 2�Ø—
’
˜C  A¡œJ¨¨Q¬Ñ/Ñ1Ô1Ð1Ð1ØˆJàˆJs   Ä"D= Ä=
E ÅEÅE r²   c                ó    — | j         }| j        dk    r|                      ¦   «          |dk    r| j        S |dk    r| j        S t	          d¦  «        ‚)aE  
        Return the period of the sieve.

        >>> a = sieve.Sieve('3@11')
        >>> a.period()
        3
        >>> b = sieve.Sieve('2&4&8|5')
        >>> b.period()
        40
        >>> c = sieve.Sieve('(5|2)&4&8')
        >>> c.period()
        40

        * Changed in v9: state is taken from the object.
        ra   r*  rK  zState must be exp or cmp)r.  r4  rP  r6  Ú
ValueError)r“   rƒ  s     r   rÕ   zSieve.period¡  s[   € ð( ”ˆàŒ?˜bÒ Ð Ø×ÒÑÔÐØ�EŠ>ˆ>Ø”?Ð"Ø�eŠ^ˆ^Ø”?Ð"åÐ7Ñ8Ô8Ð8r   c                ó<   — |                       | j        |||¦  «        S r­   )rÒ   r.  rØ   s       r   r¬   zSieve.__call__À  s   € Ø�|Š|˜DœK¨¨A¨}Ñ=Ô=Ð=r   rK   rR   ÚzMinimumr‘   rª   r  ÚzStepc           
     ó˜  — g }|}d}|dk     r­|}	||z   }
|dv r9|                       | j        |t          t          |	|
¦  «        ¦  «        |¦  «        }n8|                       | j        |t          t          |	|
¦  «        ¦  «        d¦  «        }||dd…         z   }||z   }|dz   }t	          |¦  «        |k    rn|dk     °­|d|…         }t	          |¦  «        |k    rt          d¦  «        ‚|dk    r-t          |t          |d         |d	         dz   ¦  «        ¦  «        S |d
v r-t          |t          |d         |d	         dz   ¦  «        ¦  «        S |S )zÜ
        Collect sieve segment points for the provided length and format.

        >>> a = sieve.Sieve('3@11')
        >>> a.collect(10, 100, 10, 'int')
        [102, 105, 108, 111, 114, 117, 120, 123, 126, 129]
        r   r‡   r§   r²   Nr)   z/desired length of sieve segment cannot be foundrw   ra   r¤   )rÒ   r.  rd   rN   rr   r   rz   rn   )r“   rR   rº  r‘   rª   r»  Úfoundr.   ÚzExtendCountr  r  ÚsegmentPartialr�   s                r   ÚcollectzSieve.collectÃ  s„  € ð* ˆØˆØˆØ˜UÒ"Ð"ØˆDØ�u‘9ˆDð Ð 0Ð0Ð0Ø!%§¢¨d¬k¸1Ý.2µ5¸¸tÑ3DÔ3DÑ.EÔ.EÀ}ñ"Vô "V��ð "&§¢¨d¬k¸1Ý.2µ5¸¸tÑ3DÔ3DÑ.EÔ.EÀuñ"Nô "N�ð ˜N¨1¨1¨1Ô-Ñ-ˆEØ�E‘	ˆAØ'¨!Ñ+ˆLå�5‰zŒz˜VÒ#Ð#Øð# ˜UÒ"Ð"ð( �G�V�GŒnˆÝˆs‰8Œ8�vÒÐÝ Ð!RÑSÔSÐSð ˜FÒ"Ð"å  ¥e¨C°¬F°C¸´G¸a±KÑ&@Ô&@ÑAÔAÐAØÐ/Ð/Ð/å$ S­%°°A´¸¸B¼À!¹Ñ*DÔ*DÑEÔEÐEàˆJr   c                ó8  — |€| j         }|dk    rt          j        | j        ¦  «        }n"|dk    rt          j        | j        ¦  «        }nd}|                      |¦  «        }|D ]6}|                     || j        |                              |¦  «        ¦  «        }Œ7|S )z’
        style of None is use for users; adds | to single residuals
        style abs (absolute) does not add | tos single residual class
        Nr*  rK  r+  )r.  re   r3  r5  r†  rj  r1  rÞ   )r“   rƒ  rÜ   rŒ  r•  r…  s         r   rÞ   zSieve.representþ  s    € ð
 ˆ=Ø”KˆEà�EŠ>ˆ>Ý”)˜DœMÑ*Ô*ˆCˆCØ�eŠ^ˆ^Ý”)˜DœMÑ*Ô*ˆCˆCàˆCð �}Š}˜UÑ#Ô#ˆØð 	Gð 	GˆCØ—+’+˜c 4¤<°Ô#4×#>Ò#>¸uÑ#EÔ#EÑFÔFˆCˆCØˆ
r   c                ó*   — |                       ¦   «         S r­   rà   rÔ   s    r   rá   zSieve.__str__  s   € Ø�~Š~ÑÔÐr   r­   )r&  r'  r«   r(  )r^   r_   )r   N)Nr   NN)rƒ  r°  r^   r_   r   rÿ   )rK   )rR   r²   rº  r²   r‘   r²   rª   r  r»  r²   r^   r_   )NN)(r   r   r   r  r”   r8  r<  rP  rR  rT  rY  r¾   rÄ   rË   rï   rô   rö   rf  rn  rz  r~  rW  r†  rL  r�  r�  r‘  r“  r˜  r:  r;  r=  rñ   rF  rÒ   rÕ   r¬   rÀ  rÞ   rá   r   r   r   r%  r%  à  s¦  € € € € € ðð ðð ð ð ð ð8	$ð 	$ð 	$ðð ð ð>-ð -ð -ð ð ð ð ð  ð  ð  ð ð ð ðð ð ð2ð 2ð 2ð"ð "ð "ð ð  ð  ð ð  ð  ð6 ð  ð  ð6 ð  ð  ð.;ð ;ð ;ðz+ð +ð +ð\!ð !ð !ðð ð ðð ð ð&ð ð ð ð&ð &ð &ð"&ð &ð &ð0ð 0ð 0ð 0ð&ð &ð &ð/ð /ð /ðVð Vð Vð Vð /ð /ð /ð$V/ð V/ð V/ð V/ðv/ð /ð /ð@/ð /ð /ð* 9=Ø
Ø
ØðKð Kð Kð Kð KðZ9ð 9ð 9ð 9ð>>ð >ð >ð >ð ð9ð 9ð 9ð 9ð 9ðvð ð ð ð* ð  ð  ð  ð  r   r%  c                  ó2   — e Zd ZdZ	 	 	 	 ddd
„Zd„ Zdd„ZdS )Ú
PitchSieveat  
    Quick utility generator of :class:`music21.pitch.Pitch` lists
    from :class:`music21.sieve.Sieve` objects.

    >>> ps = sieve.PitchSieve('6@0', 'c4', 'c8')
    >>> [str(p) for p in ps()]
    ['C4', 'F#4', 'C5', 'F#5', 'C6', 'F#6', 'C7', 'F#7', 'C8']

    >>> a = sieve.PitchSieve('4@7')
    >>> [str(p) for p in a()]
    ['E-3', 'G3', 'B3', 'E-4', 'G4', 'B4']
    Nr)   Ú
pitchLowerú
str | NoneÚ
pitchUpperÚpitchOriginÚeldúint | floatc                óÌ  — || _         t          | j         ¦  «        | _        |�t          j        |¦  «        | _        nt          j        d¦  «        | _        |�t          j        |¦  «        | _        nt          j        d¦  «        | _        |�t          j        |¦  «        | _        nt          j	        | j        ¦  «        | _        |�t          |¦  «        | _        d S || _        d S )NÚc3Úc5)ÚsieveStringr%  ÚsieveObjectr   ÚPitchrÅ  rÇ  rÈ  re   rf   rs   rÉ  )r“   rÎ  rÅ  rÇ  rÈ  rÉ  s         r   r”   zPitchSieve.__init__(  sÅ   € ð 'ˆÔõ #(¨Ô(8Ñ"9Ô"9ˆÔàÐ!Ý#œk¨*Ñ5Ô5ˆDŒOˆOå#œk¨$Ñ/Ô/ˆDŒOàÐ!Ý#œk¨*Ñ5Ô5ˆDŒOˆOå#œk¨$Ñ/Ô/ˆDŒOàÐ"Ý$œ{¨;Ñ7Ô7ˆDÔÐå#œ}¨T¬_Ñ=Ô=ˆDÔàˆ?Ý˜S‘z”zˆDŒHˆHˆHàˆDŒHˆHˆHr   c           	     óæ  — | j         j        }| j        j        }t          t	          t          |¦  «        t          |dz   ¦  «        ¦  «        ¦  «        }| j        j        }| j        dk    rM|                      ||¦  «        }g }|D ]1}t          j
        ¦   «         }||_        |                     |¦  «         Œ2nºt          | j        ||d¬¦  «        }	t          t	          t          |	¦  «        ¦  «        ¦  «        }|                      ||d¦  «        }
g }t	          t          |
¦  «        ¦  «        D ]C}|
|         dk    r5t          j
        ¦   «         }|	|         |_        |                     |¦  «         ŒD|S )ag  
        Return a sieve segment as a list of :class:`music21.pitch.Pitch` objects,
        mapped to the range between pitchLower and pitchUpper.

        >>> a = sieve.PitchSieve('4@7&5@4')
        >>> a()
        [<music21.pitch.Pitch G4>]

        >>> a = sieve.PitchSieve('13@3|13@6|13@9', 'c1', 'c10')
        >>> ', '.join([str(p) for p in a()])
        'E-1, F#1, A1, E2, G2, B-2, F3, G#3, B3, F#4, A4, C5, G5, B-5, C#6, G#6, B6,
         D7, A7, C8, E-8, B-8, C#9, E9, B9'

        >>> a = sieve.PitchSieve('3@0', 'c4', 'c5', 'c4', 0.5)
        >>> a.eld
        0.5

        The following is a microtonal pitch sieve; presently these are not
        displayed; true values are
        [0, 1.5, 3.0, 4.5, 6.0, 7.5, 9.0, 10.5, 12.0]

        >>> pitches = a()
        >>> ', '.join([str(p) for p in pitches])
        'C4, C#~4, E-4, E~4, F#4, G~4, A4, B`4, C5'

        True values: [0.5, 2.0, 3.5, 5.0, 6.5, 8.0, 9.5, 11.0]

        >>> a = sieve.PitchSieve('3@0', 'c4', 'c5', 'c#4', 0.5)
        >>> pitches = a()
        >>> ', '.join([str(p) for p in pitches])
        'C~4, D4, E`4, F4, F#~4, G#4, A~4, B4'
        r)   F)r‚   r¥   )rÅ  ÚpsrÇ  rd   rN   r²   rÈ  rÉ  rÏ  r   rÐ  rg   r…   rr   )r“   ÚminPSÚmaxPSr«   rR   ÚsieveSegIntegersÚsieveSegÚpsNumr.   r}  ÚbinSegrX   s               r   r¬   zPitchSieve.__call__H  sY  € ðD ”Ô"ˆØ”Ô"ˆÝ••s˜5‘z”z¥3 u¨q¡y¡>¤>Ñ2Ô2Ñ3Ô3ˆØÔÔˆð Œ8�qŠ=ˆ=Ø#×/Ò/°°1Ñ5Ô5ÐØˆHØ)ð #ð #�Ý”K‘M”M�Ø�”Ø—’ Ñ"Ô"Ð"Ð"ð#õ # 4¤8¨U°EÀeÐLÑLÔLˆGõ •U�3˜w™<œ<Ñ(Ô(Ñ)Ô)ˆAà×%Ò% a¨¨EÑ2Ô2ˆFØˆHå�3˜v™;œ;Ñ'Ô'ð 'ð '�Ø˜!”9 ’>�>Ýœ™œ�AØ" 1œ:�A”DØ—O’O AÑ&Ô&Ð&øØˆr   r^   úlist[interval.Interval]c                ój  — | j                              ¦   «         }|dk     r t          t          |dz   ¦  «        ¦  «        }nd}|                       d|d¬¦  «        }g }t	          |¦  «        D ]6\  }}t          j        || j        z  ¦  «        }|                     |¦  «         Œ7|st          d¦  «        ‚|S )ax  
        Return a list of Interval objects that defines the complete structure
        of this :class:`music21.sieve.Sieve`.

        >>> a = sieve.PitchSieve('3@0')
        >>> a.getIntervalSequence()
        [<music21.interval.Interval m3>]

        >>> a = sieve.PitchSieve('3@0|7@0')
        >>> a.sieveObject.segment()
        [0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49,
         51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99]
        >>> a.sieveObject.period()
        21
        >>> a.getIntervalSequence()
        [<music21.interval.Interval m3>, <music21.interval.Interval m3>,
         <music21.interval.Interval m2>, <music21.interval.Interval M2>,
         <music21.interval.Interval m3>, <music21.interval.Interval M2>,
         <music21.interval.Interval m2>, <music21.interval.Interval m3>,
         <music21.interval.Interval m3>]

        This is the PitchSieve for a major scale:

        >>> b = sieve.PitchSieve('(-3@2 & 4) | (-3@1 & 4@1) | (3@2 & 4@2) | (-3 & 4@3)')
        >>> b.getIntervalSequence()
        [<music21.interval.Interval M2>,
         <music21.interval.Interval M2>,
         <music21.interval.Interval m2>,
         <music21.interval.Interval M2>,
         <music21.interval.Interval M2>,
         <music21.interval.Interval M2>,
         <music21.interval.Interval m2>]
        iÿÉš;r)   Nr   r¨   )rª   zinterval segment has no values)
rÏ  rÕ   rd   rN   Ú	enumerater   ÚIntervalrÉ  rg   r   )r“   r.   r«   ÚwidthSegmentsÚpostrX   r©   ÚintervalObjs           r   ÚgetIntervalSequencezPitchSieve.getIntervalSequenceˆ  sÇ   € ðP Ô×#Ò#Ñ%Ô%ˆð ˆyŠ=ˆ=Ý•U˜1˜q™5‘\”\Ñ"Ô"ˆAˆAàˆAð ×(Ò(¨¨A¸UÐ(ÑCÔCˆà(*ˆå! -Ñ0Ô0ð 	%ð 	%‰HˆAˆuå"Ô+¨E°D´HÑ,<Ñ=Ô=ˆKØ�KŠK˜Ñ$Ô$Ð$Ð$àð 	HÝ%Ð&FÑGÔGÐGØˆr   )NNNr)   )rÅ  rÆ  rÇ  rÆ  rÈ  rÆ  rÉ  rÊ  )r^   rÙ  )r   r   r   r  r”   r¬   rà  r   r   r   rÄ  rÄ    sj   € € € € € ðð ð )-Ø(,Ø)-Ø"#ðð ð ð ð ð@>ð >ð >ð@=ð =ð =ð =ð =ð =r   rÄ  c                  óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚTestc                ó2   — |                       dd¦  «         d S )NT)ÚassertEqualrÔ   s    r   Ú	testDummyzTest.testDummyÝ  s   € Ø×Ò˜˜tÑ$Ô$Ð$Ð$Ð$r   c                ó|   — d}|D ]}|t          |¦  «        dz   z  }Œ|dt          |¦  «        dz
  …         }|dz  }|S )Nrv  z, r   r'   rw  )r  rr   )r“   ÚlistInÚoutr.   s       r   ÚpitchOutzTest.pitchOutà  sR   € ØˆØð 	!ð 	!ˆAØ•3�q‘6”6˜D‘=Ñ ˆCˆCØ�!•C˜‘H”H˜q‘L�.Ô!ˆØˆs‰
ˆØˆ
r   c                óŠ   — t          d¦  «        }g d¢}|D ],\  }}}}t          ||¦  «        }t          ||¦  «        }||z  }Œ-d S )Nr2   ))r2   r3   r'   r4   )r—   r3   r)   r2   )r4   r—   r2   r'   )r¯   )	r“   r€   ÚtestArgsrø   rù   rú   rû   r�   rX   s	            r   ÚtestIntersectionzTest.testIntersectionè  sb   € Ý�Q‰KŒKˆØ?Ð?Ð?ˆØ&ð 	ð 	‰NˆB��B˜Ý˜˜RÑ Ô ˆAÝ˜˜RÑ Ô ˆAØ�A‘ˆAˆAð	ð 	r   c           	     ó‚   — g d¢}|D ]7}t          |¦  «        } |dt          t          d¦  «        ¦  «        ¦  «        }Œ8d S )N)z-5 | 4 & 4sub3 & 6 | 4 & 4z2 or 4 and 4 & 6 or 4 & 4r2   )r'   r—   r3   é   )r)   r3   r6   é   r8   r   é   )r%  rd   rN   )r“   rë  ÚargÚtestObjÚdummys        r   ÚtestSieveParsezTest.testSieveParseð  sX   € ðð ð ˆð ð 	0ð 	0ˆCå˜C‘j”jˆGØ�G˜A�t¥E¨"¡I¤I™œÑ/Ô/ˆEˆEð	0ð 	0r   c                óv   — t          ddd¦  «        }t          d¦  «        }|j        |j        f} |¦   «         }d S )Nz-5 | 4 & 4sub3 & 6Úb3zf#4)rÄ  rÅ  rÇ  )r“   Úunused_testObjrò  ró  s       r   ÚtestSievePitchzTest.testSievePitchý  sA   € Ý#Ð$8¸$ÀÑFÔFˆÝÐ1Ñ2Ô2ˆØÔ" GÔ$6Ð6ˆØ�‘	”	ˆˆˆr   c                ó‚   — g d¢}|D ]7}t          |¦  «        }t          t          |¦  «        ¦  «        } |¦   «         }Œ8d S )N))r2   r3   é   )	r   r3   rú  é   é   é   rð  é$   é*   )r—   r3   r7   )r'   r2   r—   r4   rî  é	   rL   r6   é   r8   r9   é   r:   rý  é   r;   r<   )r   r'   r—   r4   r5   r   r6   rú  r  rï  r8   r9   é   r:   rý  )
r)   r'   r2   r—   r4   r3   r5   rî  r   rL   )iøÿÿÿiúÿÿÿéüÿÿÿéþÿÿÿr   r'   r)   )r  r%  r  )r“   rm  r
  r  ÚsObjró  s         r   ÚtestTimePointzTest.testTimePoint  sY   € ðð ð ˆð ð 	ð 	ˆCÝ$ SÑ)Ô)ˆCÝ�˜S™œ‘?”?ˆDØ�D‘F”FˆEˆEð	ð 	r   c                óP  — t          t          d¦  «        ¦  «        }d}t          ||¦  «        }|                      t	          |¦  «        d¦  «         d}t          ||¦  «        }|                      t	          |¦  «        d¦  «         d}t          ||¦  «        }|                      t	          |¦  «        d¦  «         d}t          ||¦  «        }|                      t	          |¦  «        d	¦  «         d
}t          ||¦  «        }|                      t	          |¦  «        d¦  «         d S )NrK   z"3@2 & 4@1 | 2@0 & 3@1 | 3@3 | -4@2z3@2&4@1|2@0&3@1|3@0|-4@2z5-(3@2 & -4@1 & -(12@3 | 12@8) | (-2@0 & 3@1 | (3@3)))z)-{3@2&-4@1&-{12@3|12@8}|{-2@0&3@1|{3@0}}}zÏ[(8@0 | 8@1 | 8@7) & (5@1 | 5@3)] |   [(8@0 | 8@1 | 8@2) & 5@0] | [8@3 & (5@0 | 5@1 | 5@2 | 5@3 | 5@4)] | [8@4 & (5@0 | 5@1 | 5@2 | 5@3 | 5@4)] | [(8@5 | 8@6) & (5@2 | 5@3 | 5@4)] | (8@1 & 5@2) | (8@6 & 5@1)z“{{8@0|8@1|8@7}&{5@1|5@3}}|{{8@0|8@1|8@2}&5@0}|{8@3&{5@0|5@1|5@2|5@3|5@4}}|{8@4&{5@0|5@1|5@2|5@3|5@4}}|{{8@5|8@6}&{5@2|5@3|5@4}}|{8@1&5@2}|{8@6&5@1}z4(-3@2 & 4) | (-3@1 & 4@1) | (3@2 & 4@2) | (-3 & 4@3)z*{-3@2&4@0}|{-3@1&4@1}|{3@2&4@2}|{-3@0&4@3}zV(-(13@3 | 13@5 | 13@7 | 13@9) & 11@2) | (-(11@4 | 11@8) & 13@9) | (13@0 | 13@1 | 13@6)zB{-{13@3|13@5|13@7|13@9}&11@2}|{-{11@4|11@8}&13@9}|{13@0|13@1|13@6})rd   rN   r%  rä  r  )r“   r«   r&  r€   s       r   Ú	testSievezTest.testSieve  s5  € Ý•�s‘”ÑÔˆØ5ˆÝ�&˜!ÑÔˆØ×Ò�˜Q™œÐ!;Ñ<Ô<Ð<àHˆÝ�&˜!ÑÔˆØ×Ò�˜Q™œÐ!LÑMÔMÐMðRˆõ �&˜!ÑÔˆØ×Ò�˜Q™œðIñ	Jô 	Jð 	Jð HˆÝ�&˜!ÑÔˆØ×Ò�˜Q™œÐ!MÑNÔNÐNð)ˆå�&˜!ÑÔˆØ×Ò�˜Q™œØ]ñ	_ô 	_ð 	_ð 	_ð 	_r   c                ó6  — ddl m} |                     ddd¦  «        }|                      |                       |¦   «         ¦  «        d¦  «         |                     dddd¬¦  «        }|                      |                       |¦   «         ¦  «        d	¦  «         d S )
Nr   ©r   z3@0|7@0r‰   Úc6z\[C2, E-2, F#2, G2, A2, C3, D3, E-3, F#3, A3, C4, E-4, E4, F#4, A4, B4, C5, E-5, F#5, A5, C6]r'   ©rÉ  z5[C2, D2, F#2, C3, E3, F#3, C4, F#4, C5, F#5, G#5, C6]©Úmusic21r   rÄ  rä  ré  ©r“   r   Ús1s      r   ÚtestPitchSieveAzTest.testPitchSieveA3  s¼   € Ø!Ð!Ð!Ð!Ð!Ð!à×Ò˜i¨¨tÑ4Ô4ˆØ×Ò˜Ÿš r r¡t¤tÑ,Ô,ðBñ	Cô 	Cð 	Cð ×Ò˜i¨¨t¸ÐÑ;Ô;ˆØ×Ò˜Ÿš r r¡t¤tÑ,Ô,ØPñ	Rô 	Rð 	Rð 	Rð 	Rr   c                ó:  — ddl m} |                     dddd¬¦  «        }|                      |                       |¦   «         ¦  «        d¦  «         |                     d	ddd¬¦  «        }|                      |                       |¦   «         ¦  «        d
¦  «         d S )Nr   r  z1@0r‰   r  g      à?r  aÔ  [C2, C~2, C#2, C#~2, D2, D~2, E-2, E`2, E2, E~2, F2, F~2, F#2, F#~2, G2, G~2, G#2, G#~2, A2, A~2, B-2, B`2, B2, B~2, C3, C~3, C#3, C#~3, D3, D~3, E-3, E`3, E3, E~3, F3, F~3, F#3, F#~3, G3, G~3, G#3, G#~3, A3, A~3, B-3, B`3, B3, B~3, C4, C~4, C#4, C#~4, D4, D~4, E-4, E`4, E4, E~4, F4, F~4, F#4, F#~4, G4, G~4, G#4, G#~4, A4, A~4, B-4, B`4, B4, B~4, C5, C~5, C#5, C#~5, D5, D~5, E-5, E`5, E5, E~5, F5, F~5, F#5, F#~5, G5, G~5, G#5, G#~5, A5, A~5, B-5, B`5, B5, B~5, C6]z3@0z [C2, C#~2, E-2, E~2, F#2, G~2, A2, B`2, C3, C#~3, E-3, E~3, F#3, G~3, A3, B`3, C4, C#~4, E-4, E~4, F#4, G~4, A4, B`4, C5, C#~5, E-5, E~5, F#5, G~5, A5, B`5, C6]r  r  s      r   ÚtestPitchSieveBzTest.testPitchSieveB?  sÀ   € Ø!Ð!Ð!Ð!Ð!Ð!ð ×Ò˜e T¨4°SÐÑ9Ô9ˆØ×Ò˜Ÿš r r¡t¤tÑ,Ô,ðZñ	[ô 	[ð 	[ð ×Ò˜e T¨4°SÐÑ9Ô9ˆØ×Ò˜Ÿš r r¡t¤tÑ,Ô,ð-ñ	.ô 	.ð 	.ð 	.ð 	.r   N)r   r   r   rå  ré  rì  rô  rø  r  r
  r  r  r   r   r   râ  râ  Û  s¢   € € € € € ð%ð %ð %ðð ð ðð ð ð0ð 0ð 0ðð ð ðð ð ð_ð _ð _ðB
Rð 
Rð 
Rð.ð .ð .ð .ð .r   râ  z
list[type]Ú
_DOC_ORDERÚ__main__)r'   r­   )r\   r]   r^   r_   )r   r)   T):r  Ú
__future__r   Úastr   Úcollections.abcr   re   Úmathr   r   rP   r¢  ÚtypingÚtÚunittestr  r   r	   r
   r   r   ÚEnvironmentÚenvironLocalÚMusic21Exceptionr   r   r   r   r   rC  rD  r`  rd  rE  r   rB  rd   r£  r¡  r0   r[   rn   rz   r~   r…   r‹   r�   r¯   r  r%  rÄ  ÚTestCaserâ  r  Ú__annotations__r   ÚmainTestr   r   r   ú<module>r%     s$  ðð(ð (ð (ðR #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø €€€Ø Ð Ð Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à&ˆ{Ô& wÑ/Ô/€ð	ð 	ð 	ð 	ð 	�LÔ1ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜Ô5ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�\Ô2ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	 ,Ô"?ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	˜,Ô7ñ 	ô 	ð 	ð 
€Ø	€Ø	€Ø€Ø	€Ø
�&˜#˜r 3Ð	'€Ø	€Øˆ4�”ÑÔ # Ñ&€ð:ð :ð :ð :ðz>ð >ð >ðJ#ð #ð #ð #ð #ðL&ð &ð &ð &ðRð ð ð4.ð .ð .ð .ðlð ð ð4Xð Xð Xð Xð Xñ Xô Xð XðxTð Tð Tð Tð Tñ Tô Tð TðpUð Uð Uð Uð Uñ Uô Uð UðBt ð t ð t ð t ð t ñ t ô t ð t ðtkð kð kð kð kñ kô kð kðBv.ð v.ð v.ð v.ð v.ˆ8Ôñ v.ô v.ð v.ð| €
Ð Ð Ð Ñ àˆzÒÐØ€N€N€NØ€GÔ�TÑÔÐÐÐð Ðr   