
    ei]                       d Z ddlmZ ddlZddlZddlmZ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          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"e          Z G d# d$e          ZdS )%z-Validation classes for various types of data.    )annotationsN)ABCabstractmethod)zip_longest)
attrgetter   )types)ValidationError_Tc                  >    e Zd ZdZdZd
dZd
dZedd	            ZdS )	ValidatorzAbstract base class for validators.

    .. note::
        This class does not provide any validation behavior. It is only used to
        add a useful `__repr__` implementation for validators.
    Nreturnstrc                r    |                                  }|r| dnd}d| j        j         d| d| j        dS )N,  <(zerror=z)>)
_repr_args	__class____name__error)selfargss     k/var/www/html/volatility/venv/lib/python3.11/site-packages/ccxt/static_dependencies/marshmallow/validate.py__repr__zValidator.__repr__   sM      "*${{{{I4>*IITIIIIII    c                    dS )zbA string representation of the args passed to this validator. Used by
        `__repr__`.
        r    r   s    r   r   zValidator._repr_args!   s	     rr   value
typing.Anyc                    d S Nr   r   r!   s     r   __call__zValidator.__call__'   s    9<r   r   r   r!   r"   r   r"   )	r   
__module____qualname____doc__r   r   r   r   r&   r   r   r   r   r      se          EJ J J J    <<< ^<<<r   r   c                  4    e Zd ZdZdZdddd	ZddZddZdS )Anda)  Compose multiple validators and combine their error messages.

    Example: ::

        from . import validate, ValidationError


        def is_even(value):
            if value % 2 != 0:
                raise ValidationError("Not an even value.")


        validator = validate.And(validate.Range(min=0), is_even)
        validator(-1)
        # ValidationError: ['Must be greater than or equal to 0.', 'Not an even value.']

    :param validators: Validators to combine.
    :param error: Error message to use when a validator returns ``False``.
    zInvalid value.Nr   
validatorstypes.Validatorr   
str | Nonec               J    t          |          | _        |p| j        | _        d S r$   )tupler/   default_error_messager   )r   r   r/   s      r   __init__zAnd.__init__B   s$    
++8d8


r   r   r   c                    d| j         S )Nzvalidators=)r/   r    s    r   r   zAnd._repr_argsF       0T_000r   r!   r"   c                   g }i }| j         D ]}	  ||          }t          |t                    s|du rt          | j                  <# t          $ r}|                    |j                   t          |j        t                    r|	                    |j                   n2|
                    t          j        t          |j                             Y d }~d }~ww xY w|rt          |fi ||S )NF)r/   
isinstancer   r
   r   updatekwargsmessagesdictappendextendtypingcastlist)r   r!   errorsr;   	validatorrerrs          r   r&   zAnd.__call__I   s    	C 	CI
CIe$$!)Y77 6AJJ)$*555" C C Ccj)))clD11 CMM#,//// MM&+dCL"A"ABBBC  	4!&33F333s   8A
CBCC)r/   r0   r   r1   r'   r(   )r   r)   r*   r+   r4   r5   r   r&   r   r   r   r-   r-   +   so         ( -IM 9 9 9 9 9 91 1 1 1     r   r-   c                  z    e Zd ZdZ G d d          Z e            ZdZh dZdddddd	ddZddZ	ddZ
ddZdS )URLa  Validate a URL.

    :param relative: Whether to allow relative URLs.
    :param absolute: Whether to allow absolute URLs.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}`.
    :param schemes: Valid schemes. By default, ``http``, ``https``,
        ``ftp``, and ``ftps`` are allowed.
    :param require_tld: Whether to reject non-FQDN hostnames.
    c                  $    e Zd Zd ZddZdd	Zd
S )URL.RegexMemoizerc                    i | _         d S r$   )	_memoizedr    s    r   r5   zURL.RegexMemoizer.__init__j   s    DNNNr   relativeboolabsoluterequire_tldr   typing.Patternc                &   g d}|s|                     d           d                    dddd                    |          dd	f          }d
}|r|rd|d|f}n
d|f}nd||f}t          j        d                    |          t          j                  S )N)zM(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)	localhostz"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}z\[[A-F0-9]*:[A-F0-9:]+\]z+(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.?)r   z(?:[a-z0-9\.\-\+]*)://z1(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?z(?:|)z	(?::\d+)?z(?:/?|[/?]\S+)\Zz^(z)?^)r>   joinrecompile
IGNORECASE)r   rM   rO   rP   hostname_variantsabsolute_partrelative_partpartss           r   _regex_generatorz"URL.RegexMemoizer._regex_generatorm   s    ! ! !  Y!(()WXXXGG
 . IHH.//  M  0M = 2%%	.EE "=1EE}m<:bggennbm<<<r   c                v    |||f}|| j         vr|                     |||          | j         |<   | j         |         S r$   )rL   r_   )r   rM   rO   rP   keys        r   r&   zURL.RegexMemoizer.__call__   sO     X{3C$.((&*&;&;h' 's# >#&&r   N)rM   rN   rO   rN   rP   rN   r   rQ   )r   r)   r*   r5   r_   r&   r   r   r   RegexMemoizerrJ   i   sL        	  	  	 4	= 4	= 4	= 4	=l		' 		' 		' 		' 		' 		'r   rb   zNot a valid URL.>   ftpftpshttphttpsFTN)rM   rO   schemesrP   r   rM   rN   rO   rg   types.StrSequenceOrSet | NonerP   r   r1   c                   |s|st          d          || _        || _        |p| j        | _        |p| j        | _        || _        d S )Nz>URL validation cannot set both relative and absolute to False.)
ValueErrorrM   rO   default_messager   default_schemesrg   rP   )r   rM   rO   rg   rP   r   s         r   r5   zURL.__init__   sd      	 	P   ! 2d2
6$"6&r   r   r   c                &    d| j         d| j        S )Nz	relative=z, absolute=)rM   rO   r    s    r   r   zURL._repr_args   s    H4=HHt}HHHr   c                8    | j                             |          S N)inputr   formatr%   s     r   _format_errorzURL._format_error       z  u ---r   r!   c                x   |                      |          }|st          |          d|v rE|                    d          d                                         }|| j        vrt          |          |                     | j        | j        | j                  }|	                    |          st          |          |S )Nz://r   )
rs   r
   splitlowerrg   _regexrM   rO   rP   search)r   r!   messageschemeregexs        r   r&   zURL.__call__   s    $$U++ 	+!'*** E>>[[''*0022FT\))%g...DM4=$:JKK||E"" 	+!'***r   )
rM   rN   rO   rN   rg   rh   rP   rN   r   r1   r'   r!   r   r   r   )r   r)   r*   r+   rb   rx   rk   rl   r5   r   rs   r&   r   r   r   rH   rH   ]   s        	 	C' C' C' C' C' C' C' C'J ]__F(O666O
 15  ' ' ' ' ' '&I I I I. . . .     r   rH   c                      e Zd ZdZ ej        dej        ej        z            Z ej        dej        ej        z            Z	dZ
dZdddd
ZddZddZdS )EmailzValidate an email address.

    :param error: Error message to raise in case of a validation error. Can be
        interpolated with `{input}`.
    z(^[-!#$%&'*+/=?^`{}|~\w]+(\.[-!#$%&'*+/=?^`{}|~\w]+)*\Z|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)z(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,})\Z|^\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]\Z)rS   zNot a valid email address.Nr.   r   r1   c               "    |p| j         | _        d S r$   )rk   r   )r   r   s     r   r5   zEmail.__init__   s    2d2


r   r!   r   r   c                8    | j                             |          S ro   rq   r%   s     r   rs   zEmail._format_error   rt   r   c                   |                      |          }|rd|vrt          |          |                    dd          \  }}| j                            |          st          |          || j        vr| j                            |          se	 |                    d                              d          }| j                            |          r|S n# t          $ r Y nw xY wt          |          |S )N@r   idnaascii)
rs   r
   rsplit
USER_REGEXmatchDOMAIN_WHITELISTDOMAIN_REGEXencodedecodeUnicodeError)r   r!   rz   	user_partdomain_parts        r   r&   zEmail.__call__  s   $$U++ 	+5((!'***!&c1!5!5	;$$Y// 	+!'***d333$**;77 /%"-"4"4V"<"<"C"CG"L"LK (..{;; %$% $   D
 &g...s   (C 
C#"C#r   r1   r}   )r   r)   r*   r+   rX   rY   rZ   UNICODEr   r   r   rk   r5   rs   r&   r   r   r   r   r      s          	1 	
" J 2:	5
 	
" L &2O.2 3 3 3 3 3 3. . . .     r   r   c                  ^    e Zd ZdZdZdZdZdZdZdZ	dZ
	 	 dd
d
d	dddZddZddZddZd	S )Rangea-  Validator which succeeds if the value passed to it is within the specified
    range. If ``min`` is not specified, or is specified as `None`,
    no lower bound exists. If ``max`` is not specified, or is specified as `None`,
    no upper bound exists. The inclusivity of the bounds (if they exist) is configurable.
    If ``min_inclusive`` is not specified, or is specified as `True`, then
    the ``min`` bound is included in the range. If ``max_inclusive`` is not specified,
    or is specified as `True`, then the ``max`` bound is included in the range.

    :param min: The minimum value (lower bound). If not provided, minimum
        value will not be checked.
    :param max: The maximum value (upper bound). If not provided, maximum
        value will not be checked.
    :param min_inclusive: Whether the `min` bound is included in the range.
    :param max_inclusive: Whether the `max` bound is included in the range.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}`, `{min}` and `{max}`.
    zMust be {min_op} {{min}}.zMust be {max_op} {{max}}.z.Must be {min_op} {{min}} and {max_op} {{max}}.zgreater than or equal tozgreater thanzless than or equal toz	less thanNT)min_inclusivemax_inclusiver   r   rN   r   r   r1   c                  || _         || _        || _        || _        || _        | j                            | j        r| j        n| j                  | _        | j	                            | j        r| j
        n| j                  | _	        | j                            | j        r| j        n| j        | j        r| j
        n| j                  | _        d S )N)min_op)max_op)r   r   )minmaxr   r   r   message_minrr   message_gte
message_gtmessage_maxmessage_lte
message_ltmessage_all)r   r   r   r   r   r   s         r   r5   zRange.__init__7  s     
**  +22'+'9N4##t 3 
 
  +22'+'9N4##t 3 
 
  +22'+'9N4##t'+'9N4##t 3 
 
r   r   r   c                F    d| j         d| j        d| j        d| j        S )Nmin=, max=z, min_inclusive=z, max_inclusive=)r   r   r   r   r    s    r   r   zRange._repr_argsR  sQ     Adh  A  A  A  ADDV  A  Ajnj|  A  A  	Ar   r!   r   rz   c                T    | j         p|                    || j        | j                  S )N)rp   r   r   )r   rr   r   r   r   r!   rz   s      r   rs   zRange._format_errorU  s(    
%g--EtxTX-VVVr   c                z   | j         V| j        r|| j         k     rDn|| j         k    r8| j        | j        n| j        }t          |                     ||                    | j        V| j        r|| j        k    rDn|| j        k    r8| j         | j        n| j        }t          |                     ||                    |S r$   )	r   r   r   r   r   r
   rs   r   r   r   s      r   r&   zRange.__call__X  s    8 $ 2  DH8I8I*.(*:d&&@PG!$"4"4UG"D"DEEE8 $ 2  DH8I8I*.(*:d&&@PG!$"4"4UG"D"DEEEr   NN)r   rN   r   rN   r   r1   r'   )r!   r   rz   r   r   r   r!   r   r   r   )r   r)   r*   r+   r   r   r   r   r   r   r   r5   r   rs   r&   r   r   r   r   r     s         $ .K-KBK,KJ)KJ 

 #" 
 
 
 
 
 
6A A A AW W W W     r   r   c                  P    e Zd ZdZdZdZdZdZ	 	 ddddddZddZ	ddZ
ddZdS )Lengthah  Validator which succeeds if the value passed to it has a
    length between a minimum and maximum. Uses len(), so it
    can work for strings, lists, or anything with length.

    :param min: The minimum length. If not provided, minimum length
        will not be checked.
    :param max: The maximum length. If not provided, maximum length
        will not be checked.
    :param equal: The exact length. If provided, maximum and minimum
        length will not be checked.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}`, `{min}` and `{max}`.
    z"Shorter than minimum length {min}.z!Longer than maximum length {max}.z'Length must be between {min} and {max}.zLength must be {equal}.N)equalr   r   
int | Noner   r   r   r1   c                   | t          ||g          rt          d          || _        || _        || _        || _        d S )NzVThe `equal` parameter was provided, maximum or minimum parameter must not be provided.)anyrj   r   r   r   r   )r   r   r   r   r   s        r   r5   zLength.__init__|  sR     c3Z:  
 



r   r   r   c                6    d| j         d| j        d| j        S )Nr   r   z, equal=)r   r   r   r    s    r   r   zLength._repr_args  s&    JdhJJJJDJJJJr   r!   typing.Sizedrz   c                `    | j         p|                    || j        | j        | j                  S )N)rp   r   r   r   )r   rr   r   r   r   r   s      r   rs   zLength._format_error  s5    
%g--TX484: . 
 
 	
r   c                   t          |          }| j        5|| j        k    r(t          |                     || j                            |S | j        C|| j        k     r8| j        | j        n| j        }t          |                     ||                    | j        C|| j        k    r8| j        | j	        n| j        }t          |                     ||                    |S r$   )
lenr   r
   rs   message_equalr   r   r   r   r   )r   r!   lengthrz   s       r   r&   zLength.__call__  s    U:!##%d&8&8@R&S&STTTL8FTX$5$5*.(*:d&&@PG!$"4"4UG"D"DEEE8FTX$5$5*.(*:d&&@PG!$"4"4UG"D"DEEEr   r   )r   r   r   r   r   r   r   r1   r'   )r!   r   rz   r   r   r   )r!   r   r   r   )r   r)   r*   r+   r   r   r   r   r5   r   rs   r&   r   r   r   r   r   h  s          7K5K;K-M 
 !      &K K K K
 
 
 

     r   r   c                  <    e Zd ZdZdZddddZdd
ZddZddZdS )Equala  Validator which succeeds if the ``value`` passed to it is
    equal to ``comparable``.

    :param comparable: The object to compare to.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}` and `{other}`.
    zMust be equal to {other}.Nr.   r   r1   c               0    || _         |p| j        | _        d S r$   )
comparablerk   r   )r   r   r   s      r   r5   zEqual.__init__  s    $2d2


r   r   r   c                    d| j         S )Nzcomparable=)r   r    s    r   r   zEqual._repr_args  r7   r   r!   r   c                D    | j                             || j                  S )N)rp   other)r   rr   r   r%   s     r   rs   zEqual._format_error  s    z  uDO DDDr   c                `    || j         k    r"t          |                     |                    |S r$   )r   r
   rs   r%   s     r   r&   zEqual.__call__  s0    DO##!$"4"4U";";<<<r   r   r'   )r!   r   r   r   r   	r   r)   r*   r+   rk   r5   r   rs   r&   r   r   r   r   r     s          2O:> 3 3 3 3 3 31 1 1 1E E E E     r   r   c                      e Zd ZdZdZ	 dddddZddZddZej	        dd            Z
ej	        dd            Z
d Z
dS )Regexpa  Validator which succeeds if the ``value`` matches ``regex``.

    .. note::

        Uses `re.match`, which searches for a match at the beginning of a string.

    :param regex: The regular expression string to use. Can also be a compiled
        regular expression pattern.
    :param flags: The regexp flags to use, for example re.IGNORECASE. Ignored
        if ``regex`` is not a string.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}` and `{regex}`.
    z'String does not match expected pattern.r   Nr.   r|   str | bytes | typing.Patternflagsintr   r1   c                   t          |t          t          f          rt          j        ||          n|| _        |p| j        | _        d S r$   )r9   r   bytesrX   rY   r|   rk   r   )r   r|   r   r   s       r   r5   zRegexp.__init__  sG     )353,(G(GRBJue$$$U 	
 2d2


r   r   r   c                    d| j         S )Nzregex=)r|   r    s    r   r   zRegexp._repr_args  s    &
&&&r   r!   str | bytesc                N    | j                             || j        j                  S )N)rp   r|   )r   rr   r|   patternr%   s     r   rs   zRegexp._format_error  s"    z  uDJ4F GGGr   c                    d S r$   r   r%   s     r   r&   zRegexp.__call__  s    +.3r   r   c                    d S r$   r   r%   s     r   r&   zRegexp.__call__  s    /2sr   c                ~    | j                             |          "t          |                     |                    |S r$   )r|   r   r
   rs   r%   s     r   r&   zRegexp.__call__  s9    :E""*!$"4"4U";";<<<r   )r   )r|   r   r   r   r   r1   r'   )r!   r   r   r   r}   )r!   r   r   r   )r   r)   r*   r+   rk   r5   r   rs   r@   overloadr&   r   r   r   r   r     s          @O
 
3
 !
3 
3 
3 
3 
3 
3' ' ' 'H H H H _... _._222 _2    r   r   c                  <    e Zd ZdZdZdddd	ZddZddZddZdS )	Predicatea  Call the specified ``method`` of the ``value`` object. The
    validator succeeds if the invoked method returns an object that
    evaluates to True in a Boolean context. Any additional keyword
    argument will be passed to the method.

    :param method: The name of the method to invoke.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}` and `{method}`.
    :param kwargs: Additional keyword arguments to pass to the method.
    Invalid input.Nr.   methodr   r   r1   c               >    || _         |p| j        | _        || _        d S r$   )r   rk   r   r;   )r   r   r   r;   s       r   r5   zPredicate.__init__  s#    2d2
r   r   c                &    d| j         d| j        S )Nzmethod=z	, kwargs=)r   r;   r    s    r   r   zPredicate._repr_args  s    @@@@@@r   r!   r"   c                D    | j                             || j                  S )N)rp   r   )r   rr   r   r%   s     r   rs   zPredicate._format_error  s    z  uT[ AAAr   c                    t          || j                  } |di | j        s"t          |                     |                    |S )Nr   )getattrr   r;   r
   rs   )r   r!   r   s      r   r&   zPredicate.__call__  sN    ,,v$$$$ 	=!$"4"4U";";<<<r   )r   r   r   r1   r'   )r!   r"   r   r   r(   r   r   r   r   r   r     s        	 	 'O;?      
A A A AB B B B     r   r   c                  <    e Zd ZdZdZdddd	ZddZddZddZdS )NoneOfzValidator which fails if ``value`` is a member of ``iterable``.

    :param iterable: A sequence of invalid values.
    :param error: Error message to raise in case of a validation error. Can be
        interpolated using `{input}` and `{values}`.
    r   Nr.   iterabletyping.Iterabler   r1   c                   || _         d                    d | j         D                       | _        |p| j        | _        d S )Nr   c              3  4   K   | ]}t          |          V  d S r$   r   ).0eachs     r   	<genexpr>z"NoneOf.__init__.<locals>.<genexpr>#  s(      $I$I4SYY$I$I$I$I$I$Ir   )r   rW   values_textrk   r   )r   r   r   s      r   r5   zNoneOf.__init__!  sA     99$I$I4=$I$I$III2d2


r   r   r   c                    d| j         S )Nz	iterable=)r   r    s    r   r   zNoneOf._repr_args&  s    ,4=,,,r   c                D    | j                             || j                  S )N)rp   values)r   rr   r   r%   s     r   rs   zNoneOf._format_error)  s     z  uT5E FFFr   r!   r"   c                    	 || j         v r"t          |                     |                    n# t          $ r Y nw xY w|S r$   )r   r
   rs   	TypeErrorr%   s     r   r&   zNoneOf.__call__,  s\    	%%%d&8&8&?&?@@@ & 	 	 	D	 s   +. 
;;)r   r   r   r1   r'   r(   r   r   r   r   r   r     s          'OIM 3 3 3 3 3 3
- - - -G G G G     r   r   c                  L    e Zd ZdZdZ	 dddddZddZddZddZe	fddZ
dS )OneOfaP  Validator which succeeds if ``value`` is a member of ``choices``.

    :param choices: A sequence of valid values.
    :param labels: Optional sequence of labels to pair with the choices.
    :param error: Error message to raise in case of a validation error. Can be
        interpolated with `{input}`, `{choices}` and `{labels}`.
    zMust be one of: {choices}.Nr.   choicesr   labelstyping.Iterable[str] | Noner   r1   c                   || _         d                    d | j         D                       | _        ||ng | _        d                    d | j        D                       | _        |p| j        | _        d S )Nr   c              3  4   K   | ]}t          |          V  d S r$   r   )r   choices     r   r   z!OneOf.__init__.<locals>.<genexpr>I  s(      %M%Mfc&kk%M%M%M%M%M%Mr   c              3  4   K   | ]}t          |          V  d S r$   r   )r   labels     r   r   z!OneOf.__init__.<locals>.<genexpr>K  s(      $I$IESZZ$I$I$I$I$I$Ir   )r   rW   choices_textr   labels_textrk   r   )r   r   r   r   s       r   r5   zOneOf.__init__A  sx      II%M%M%M%M%MMM & 2ff99$I$IT[$I$I$III2d2


r   r   r   c                &    d| j         d| j        S )Nzchoices=z	, labels=)r   r   r    s    r   r   zOneOf._repr_argsN  s    B$,BB4;BBBr   c                P    | j                             || j        | j                  S )N)rp   r   r   )r   rr   r   r   r%   s     r   rs   zOneOf._format_errorQ  s.    z  !24;K ! 
 
 	
r   r!   r"   c                    	 || j         vr"t          |                     |                    n5# t          $ r(}t          |                     |                    |d }~ww xY w|S r$   )r   r
   rs   r   )r   r!   r   s      r   r&   zOneOf.__call__V  s~    	HDL((%d&8&8&?&?@@@ ) 	H 	H 	H!$"4"4U";";<<%G	H s   +. 
A #AA valuegetter/str | typing.Callable[[typing.Any], typing.Any]'typing.Iterable[tuple[typing.Any, str]]c                    t                    rnt                    t          | j        | j        d          }fd|D             S )a  Return a generator over the (value, label) pairs, where value
        is a string associated with each choice. This convenience method
        is useful to populate, for instance, a form select field.

        :param valuegetter: Can be a callable or a string. In the former case, it must
            be a one-argument callable which returns the value of a
            choice. In the latter case, the string specifies the name
            of an attribute of the choice objects. Defaults to `str()`
            or `str()`.
        r   )	fillvaluec              3  8   K   | ]\  }} |          |fV  d S r$   r   )r   r   r   r   s      r   r   z OneOf.options.<locals>.<genexpr>p  s6      HHV$$e,HHHHHHr   )callabler   r   r   r   )r   r   pairss    ` r   optionszOneOf.options_  sU     &.k%:%:Wkk
;@W@WDL$+DDDHHHH%HHHHr   r$   )r   r   r   r   r   r1   r'   r(   )r   r   r   r   )r   r)   r*   r+   rk   r5   r   rs   r&   r   r   r   r   r   r   r   6  s          3O
 /33
 !3 3 3 3 3 3C C C C
 
 
 

    HKI I I I I I Ir   r   c                  0     e Zd ZdZdZd	 fdZd
dZ xZS )ContainsOnlyaG  Validator which succeeds if ``value`` is a sequence and each element
    in the sequence is also in the sequence passed as ``choices``. Empty input
    is considered valid.

    :param iterable choices: Same as :class:`OneOf`.
    :param iterable labels: Same as :class:`OneOf`.
    :param str error: Same as :class:`OneOf`.

    .. versionchanged:: 3.0.0b2
        Duplicate values are considered valid.
    .. versionchanged:: 3.0.0b2
        Empty input is considered valid. Use `validate.Length(min=1) <marshmallow.validate.Length>`
        to validate against empty inputs.
    z:One or more of the choices you made was not in: {choices}.r   r   c                    d                     d |D                       }t                                          |          S )Nr   c              3  4   K   | ]}t          |          V  d S r$   r   r   vals     r   r   z-ContainsOnly._format_error.<locals>.<genexpr>  (      99Cs3xx999999r   rW   superrs   r   r!   
value_textr   s      r   rs   zContainsOnly._format_error  ;    YY99599999
ww$$Z000r   r!   typing.Sequence[_T]c                f    |D ]-}|| j         vr"t          |                     |                    .|S r$   )r   r
   rs   r   r!   r  s      r   r&   zContainsOnly.__call__  sF     	A 	AC$,&&%d&8&8&?&?@@@ 'r   r'   r!   r  r   r  r   r)   r*   r+   rk   rs   r&   __classcell__r   s   @r   r  r  s  sc          SO1 1 1 1 1 1       r   r  c                  0     e Zd ZdZdZd	 fdZd
dZ xZS )ContainsNoneOfa6  Validator which fails if ``value`` is a sequence and any element
    in the sequence is a member of the sequence passed as ``iterable``. Empty input
    is considered valid.

    :param iterable iterable: Same as :class:`NoneOf`.
    :param str error: Same as :class:`NoneOf`.

    .. versionadded:: 3.6.0
    z5One or more of the choices you made was in: {values}.r   r   c                    d                     d |D                       }t                                          |          S )Nr   c              3  4   K   | ]}t          |          V  d S r$   r   r  s     r   r   z/ContainsNoneOf._format_error.<locals>.<genexpr>  r  r   r  r	  s      r   rs   zContainsNoneOf._format_error  r  r   r!   r  c                f    |D ]-}|| j         v r"t          |                     |                    .|S r$   )r   r
   rs   r  s      r   r&   zContainsNoneOf.__call__  sF     	A 	ACdm##%d&8&8&?&?@@@ $r   r'   r  r  r  s   @r   r  r    sc          NO1 1 1 1 1 1       r   r  )r+   
__future__r   rX   r@   abcr   r   	itertoolsr   operatorr   r   r	   
exceptionsr
   TypeVarr   r   r-   rH   r   r   r   r   r   r   r   r   r  r  r   r   r   <module>r     s   3 3 " " " " " " 				  # # # # # # # # ! ! ! ! ! !             ' ' ' ' ' 'V^D= = = = = = = =4/ / / / /) / / /d    )   D9 9 9 9 9I 9 9 9xJ J J J JI J J JZ? ? ? ? ?Y ? ? ?D    I   6- - - - -Y - - -`    	   D    Y   >:I :I :I :I :II :I :I :Iz    5   <    V     r   