ó
øÐLac           @` s¤  d  Z  d d l m Z m Z m Z d d l m Z m Z m Z	 m
 Z d d l m Z m Z m Z d d l Z e j e ƒ Z d d l m Z d d l m Z m Z m Z m Z m Z m Z m Z m Z m  Z  m! Z! m" Z" m# Z# d d l$ m% Z% d	 d
 d d d d d d d d d d d d d d d d d d d g Z& e! d ƒ Z' e! d ƒ Z( e! d  ƒ Z) e! d! ƒ Z* e' e! d" ƒ Z+ e! d# ƒ Z, e! d$ ƒ Z- e! d% ƒ Z. e e d& ƒ ƒ Z/ d' Z0 d( Z1 d" Z2 e3 e e/ ƒ ƒ Z4 e5 d) „ Z6 d* „  Z7 d+ „  Z8 d, Z9 d" Z: d- Z; d. „  Z< d/ „  Z= d0 „  Z
 e6 i d1 d2 6d3 d4 6ƒ Z> e2 d5 Z? d6 „  Z d e@ f d7 „  ƒ  YZA d eA f d8 „  ƒ  YZB eB e) ƒ ZC eB e) d9 eD ƒZE eB e* d9 eD ƒZF d S(:   sC   
passlib.utils.binary - binary data encoding/decoding/manipulation
i    (   t   absolute_importt   divisiont   print_function(   t	   b64encodet	   b64decodet	   b32decodet	   b32encode(   t
   b2a_base64t
   a2b_base64t   ErrorN(   t   exc(   t   PY3t   bascii_to_strt   iranget   imapt   iter_byte_charst   join_byte_valuest   join_byte_elemst
   nextgettert   suppress_causet   ut   unicodet   unicode_or_bytes_types(   t   memoized_propertyt   BASE64_CHARSt   PADDED_BASE64_CHARSt
   AB64_CHARSt   HASH64_CHARSt   BCRYPT_CHARSt	   HEX_CHARSt   LOWER_HEX_CHARSt   UPPER_HEX_CHARSt   ALL_BYTE_VALUESt   compile_byte_translationt   ab64_encodet   ab64_decodet   b64s_encodet   b64s_decodeR   R   t   Base64Enginet   LazyBase64Enginet   h64t   h64bigt   bcrypt64s@   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/s@   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./s@   ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzs@   ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789t   =t   0123456789abcdefABCDEFt   0123456789ABCDEFt   0123456789abcdefi   t    s    c         C` s  | d k r t } n9 t | t ƒ r7 t | ƒ d k s= t ‚ t t | ƒ ƒ } x» |  j ƒ  D]­ \ } } t | t	 ƒ r† t
 | ƒ } n  t | t ƒ r± d | k o¬ d k  n s· t ‚ t | t ƒ rØ | j d ƒ } n  t | t ƒ rù t | ƒ d k sÿ t ‚ | | | <q\ Wt j | ƒ S(   sÖ  
    return a 256-byte string for translating bytes using specified mapping.
    bytes not specified by mapping will be left alone.

    :param mapping:
        dict mapping input byte (str or int) -> output byte (str or int).

    :param source:
        optional existing byte translation string to use as base.
        (must be 255-length byte string).  defaults to identity mapping.

    :returns:
        255-length byte string for passing to bytes().translate.
    iÿ   i    i   t   asciii   N(   t   Nonet   _TRANSLATE_SOURCEt
   isinstancet   bytest   lent   AssertionErrort   listR   t   itemsR   t   ordt   intR   t   encodet   B_EMPTYt   join(   t   mappingt   sourcet   targett   kt   v(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR!   n   s    
'1'c         C` s   t  |  ƒ j t ƒ S(   sr   
    encode using shortened base64 format which omits padding & whitespace.
    uses default ``+/`` altchars.
    (   R   t   rstript   _BASE64_STRIP(   t   data(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR$      s    c         C` sâ   t  |  t ƒ rK y |  j d ƒ }  WqK t k
 rG t t d ƒ ƒ ‚ qK Xn  t |  ƒ d @} | d k rj n> | d k rƒ |  t 7}  n% | d k rœ |  t 7}  n t d ƒ ‚ y t	 |  ƒ SWn% t
 k
 rÝ } t t | ƒ ƒ ‚ n Xd S(   sq   
    decode from shortened base64 format which omits padding & whitespace.
    uses default ``+/`` altchars.
    R0   s4   string argument should contain only ASCII charactersi   i    i   s   invalid base64 inputN(   R3   R   R;   t   UnicodeEncodeErrorR   t
   ValueErrorR5   t   _BASE64_PAD2t   _BASE64_PAD1R   t   _BinAsciiErrort	   TypeError(   RE   t   offt   err(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR%   –   s"    s   =
s   ==c         C` s   t  |  ƒ j d d ƒ S(   s®   
    encode using shortened base64 format which omits padding & whitespace.
    uses custom ``./`` altchars.

    it is primarily used by Passlib's custom pbkdf2 hashes.
    t   +t   .(   R$   t   replace(   RE   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR"   ¹   s    c         C` sa   t  |  t ƒ rK y |  j d ƒ }  WqK t k
 rG t t d ƒ ƒ ‚ qK Xn  t |  j d d ƒ ƒ S(   sã   
    decode from shortened base64 format which omits padding & whitespace.
    uses custom ``./`` altchars, but supports decoding normal ``+/`` altchars as well.

    it is primarily used by Passlib's custom pbkdf2 hashes.
    R0   s4   string argument should contain only ASCII charactersRO   RN   (   R3   R   R;   RF   R   RG   R%   RP   (   RE   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR#   Â   s    c         C` s   t  t |  ƒ j t ƒ ƒ S(   sh   
    wrapper around :func:`base64.b32encode` which strips padding,
    and returns a native string.
    (   R   t
   _b32encodeRC   t   B_EQUAL(   R?   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR   Õ   s    t   Bt   8t   Ot   0i   c         C` se   t  |  t ƒ r! |  j d ƒ }  n  |  j t ƒ }  t |  ƒ d @} | rX |  t |  7}  n  t |  t ƒ S(   s„   
    wrapper around :func:`base64.b32decode`
    which handles common mistyped chars.
    padding optional, ignored if present.
    R0   i   (	   R3   R   R;   t	   translatet   _b32_translateR5   t   _b32_decode_padt
   _b32decodet   True(   R?   t	   remainder(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR   å   s    c           B` s:  e  Z d  Z d Z d Z d Z d Z d Z d Z	 e
 d „ Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z e d
 „  ƒ Z e 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 „  Z$ d „  Z% d „  Z& d „  Z' RS(   sc  Provides routines for encoding/decoding base64 data using
    arbitrary character mappings, selectable endianness, etc.

    :arg charmap:
        A string of 64 unique characters,
        which will be used to encode successive 6-bit chunks of data.
        A character's position within the string should correspond
        to its 6-bit value.

    :param big:
        Whether the encoding should be big-endian (default False).

    .. note::
        This class does not currently handle base64's padding characters
        in any way what so ever.

    Raw Bytes <-> Encoded Bytes
    ===========================
    The following methods convert between raw bytes,
    and strings encoded using the engine's specific base64 variant:

    .. automethod:: encode_bytes
    .. automethod:: decode_bytes
    .. automethod:: encode_transposed_bytes
    .. automethod:: decode_transposed_bytes

    ..
        .. automethod:: check_repair_unused
        .. automethod:: repair_unused

    Integers <-> Encoded Bytes
    ==========================
    The following methods allow encoding and decoding
    unsigned integers to and from the engine's specific base64 variant.
    Endianess is determined by the engine's ``big`` constructor keyword.

    .. automethod:: encode_int6
    .. automethod:: decode_int6

    .. automethod:: encode_int12
    .. automethod:: decode_int12

    .. automethod:: encode_int24
    .. automethod:: decode_int24

    .. automethod:: encode_int64
    .. automethod:: decode_int64

    Informational Attributes
    ========================
    .. attribute:: charmap

        unicode string containing list of characters used in encoding;
        position in string matches 6bit value of character.

    .. attribute:: bytemap

        bytes version of :attr:`charmap`

    .. attribute:: big

        boolean flag indicating this using big-endian encoding.
    c         C` s  t  | t ƒ r! | j d ƒ } n$ t  | t ƒ sE t j | d ƒ ‚ n  t | ƒ d k rf t d ƒ ‚ n  t t | ƒ ƒ d k r t d ƒ ‚ n  | |  _	 | j
 |  _ t d „  t | ƒ Dƒ ƒ } | j
 |  _ | |  _ | rô |  j |  _ |  j |  _ n |  j |  _ |  j |  _ d  S(   Ns   latin-1t   charmapi@   s'   charmap must be 64 characters in lengths-   charmap must not contain duplicate charactersc         s` s!   |  ] \ } } | | f Vq d  S(   N(    (   t   .0t   idxt   value(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pys	   <genexpr>]  s    (   R3   R   R;   R4   R
   t   ExpectedStringErrorR5   RG   t   sett   bytemapt   __getitem__t	   _encode64t   dictt	   enumeratet	   _decode64t   bigt   _encode_bytes_bigt   _encode_bytest   _decode_bytes_bigt   _decode_bytest   _encode_bytes_littlet   _decode_bytes_little(   t   selfR]   Ri   t   lookup(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   __init__Q  s$    		c         C` s   |  j  j d ƒ S(   s   charmap as unicodes   latin-1(   Rc   t   decode(   Rp   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR]   s  s    c         C` s¨   t  | t ƒ s+ t d t | ƒ f ƒ ‚ n  t t | ƒ d ƒ \ } } t ra t t | ƒ ƒ } n t d „  | Dƒ ƒ } |  j	 | | | ƒ } t
 t |  j | ƒ ƒ } | S(   s‹   encode bytes to base64 string.

        :arg source: byte string to encode.
        :returns: byte string containing encoded data.
        s   source must be bytes, not %si   c         s` s   |  ] } t  | ƒ Vq d  S(   N(   R9   (   R^   t   elem(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pys	   <genexpr>‡  s    (   R3   R4   RK   t   typet   divmodR5   R   R   t   iterRk   R   R   Re   (   Rp   R?   t   chunkst   tailt
   next_valuet   gent   out(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_bytes{  s    c         c` só   d } xq | | k  ry | ƒ  } | ƒ  } | ƒ  } | d @V| d @d >| d ?BV| d @d >| d ?BV| d ?V| d 7} q	 W| rï | ƒ  } | d k rª | d @V| d ?Vqï | d k s¼ t  ‚ | ƒ  } | d @V| d @d >| d ?BV| d ?Vn  d	 S(
   s>   helper used by encode_bytes() to handle little-endian encodingi    i?   i   i   i   i   i   i   N(   R6   (   Rp   Rz   Rx   Ry   R_   t   v1t   v2t   v3(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyRn     s(    									c         c` sû   d } xq | | k  ry | ƒ  } | ƒ  } | ƒ  } | d ?V| d @d >| d ?BV| d @d >| d ?BV| d @V| d 7} q	 W| r÷ | ƒ  } | d k r® | d ?V| d @d >Vq÷ | d k sÀ t  ‚ | ƒ  } | d ?V| d @d >| d ?BV| d @d >Vn  d	 S(
   s;   helper used by encode_bytes() to handle big-endian encodingi    i   i   i   i   i   i?   i   N(   R6   (   Rp   Rz   Rx   Ry   R_   R~   R   R€   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyRj   ·  s(    									c         C` sÊ   t  | t ƒ s+ t d t | ƒ f ƒ ‚ n  t t | ƒ d ƒ \ } } | d k ra t d ƒ ‚ n  t t |  j	 | ƒ ƒ } y t
 |  j | | | ƒ ƒ SWn- t k
 rÅ } t d | j d f ƒ ‚ n Xd S(   s   decode bytes from base64 string.

        :arg source: byte string to decode.
        :returns: byte string containing decoded data.
        s   source must be bytes, not %si   i   s(   input string length cannot be == 1 mod 4s   invalid character: %ri    N(   R3   R4   RK   Ru   Rv   R5   RG   R   R   Rh   R   Rm   t   KeyErrort   args(   Rp   R?   Rx   Ry   Rz   RM   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_bytesâ  s    c   	      c` sÛ   d } xu | | k  r} | ƒ  } | ƒ  } | ƒ  } | ƒ  } | | d @d >BV| d ?| d @d >BV| d ?| d >BV| d 7} q	 W| r× | ƒ  } | ƒ  } | | d @d >BV| d k r× | ƒ  } | d ?| d @d >BVq× n  d S(	   s>   helper used by decode_bytes() to handle little-endian encodingi    i   i   i   i   i   i   N(    (	   Rp   Rz   Rx   Ry   R_   R~   R   R€   t   v4(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyRo   ø  s"    							c   	      c` sÛ   d } xu | | k  r} | ƒ  } | ƒ  } | ƒ  } | ƒ  } | d >| d ?BV| d @d >| d ?BV| d @d >| BV| d 7} q	 W| r× | ƒ  } | ƒ  } | d >| d ?BV| d k r× | ƒ  } | d @d >| d ?BVq× n  d S(	   s;   helper used by decode_bytes() to handle big-endian encodingi    i   i   i   i   i   i   N(    (	   Rp   Rz   Rx   Ry   R_   R~   R   R€   R„   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyRl     s"    							c         ` sU   t  ‡  f d †  t |  j ƒ Dƒ ƒ } | j ‡  f d †  t |  j ƒ Dƒ ƒ t | ƒ S(   s2   helper to generate set of valid last chars & bytesc         3` s%   |  ] \ } } | ˆ  @s | Vq d  S(   N(    (   R^   t   it   c(   t   bits(    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pys	   <genexpr>G  s    c         3` s%   |  ] \ } } | ˆ  @s | Vq d  S(   N(    (   R^   R…   R†   (   R‡   (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pys	   <genexpr>H  s    (   Rb   Rg   Rc   t   updateR]   t	   frozenset(   Rp   R‡   t   pset(    (   R‡   sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   __make_padsetE  s    %&c         C` s)   |  j  r d n d } | |  j | ƒ f S(   sD   mask to clear padding bits, and valid last bytes (for strings 2 % 4)i   i   i<   (   Ri   t   _Base64Engine__make_padset(   Rp   R‡   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt	   _padinfo2K  s    c         C` s)   |  j  r d n d } | |  j | ƒ f S(   sD   mask to clear padding bits, and valid last bytes (for strings 3 % 4)i   i   i0   (   Ri   RŒ   (   Rp   R‡   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt	   _padinfo3R  s    c         C` s0  t  | ƒ d @} | d k r. |  j \ } } n: | d k rL |  j \ } } n | s\ t | f St d ƒ ‚ | d } | | k rˆ t | f St | t ƒ rÒ |  j } | | j | ƒ | @} | | k st	 d ƒ ‚ nL |  j
 |  j | ƒ | @ƒ } | | k st	 d ƒ ‚ t rt | g ƒ } n  t | d  | f S(   s  helper to detect & clear invalid unused bits in last character.

        :arg source:
            encoded data (as ascii bytes or unicode).

        :returns:
            `(True, result)` if the string was repaired,
            `(False, source)` if the string was ok as-is.
        i   i   s   source length must != 1 mod 4iÿÿÿÿs%   failed to generate valid padding char(   R5   R   RŽ   t   FalseRG   R3   R   R]   t   indexR6   Re   Rh   R   R4   R[   (   Rp   R?   Ry   t   maskt   padsett   lastt   cm(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   check_repair_unusedY  s(    


	c         C` s   |  j  | ƒ d S(   Ni   (   R•   (   Rp   R?   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   repair_unused‚  s    c         ` sT   t  ˆ  t ƒ s+ t d t ˆ  ƒ f ƒ ‚ n  t ‡  f d †  | Dƒ ƒ } |  j | ƒ S(   s>   encode byte string, first transposing source using offset lists   source must be bytes, not %sc         3` s   |  ] } ˆ  | Vq d  S(   N(    (   R^   RL   (   R?   (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pys	   <genexpr>˜  s    (   R3   R4   RK   Ru   R   R}   (   Rp   R?   t   offsetst   tmp(    (   R?   sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_transposed_bytes”  s    c         C` sV   |  j  | ƒ } d g t | ƒ } x' t | | ƒ D] \ } } | | | <q2 Wt | ƒ S(   sG   decode byte string, then reverse transposition described by offset listN(   Rƒ   R1   R5   t   zipR   (   Rp   R?   R—   R˜   t   bufRL   t   char(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_transposed_bytes›  s
    c   	      C` s  t  | t ƒ s+ t d t | ƒ f ƒ ‚ n  |  j } | d } | | d } t | ƒ | k ru t d | f ƒ ‚ n  |  j } d } y; x4 | r– | n	 t | ƒ D] } | d >| | ƒ } q  WWn$ t	 k
 rå t d | f ƒ ‚ n X| r| rÿ | | L} q| d | >d M} n  | S(   s«  decode base64 string -> integer

        :arg source: base64 string to decode.
        :arg bits: number of bits in resulting integer.

        :raises ValueError:
            * if the string contains invalid base64 characters.
            * if the string is not long enough - it must be at least
              ``int(ceil(bits/6))`` in length.

        :returns:
            a integer in the range ``0 <= n < 2**bits``
        s   source must be bytes, not %si   s   source must be %d charsi    s   invalid character in string: %ri   (
   R3   R4   RK   Ru   Ri   R5   RG   Rh   t   reversedR   (	   Rp   R?   R‡   Ri   t   padt   charsRs   R|   R†   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   _decode_int©  s&    		c         C` s”   t  | t ƒ s+ t d t | ƒ f ƒ ‚ n  t | ƒ d k rL t d ƒ ‚ n  t r_ | d } n  y |  j | ƒ SWn t k
 r t d ƒ ‚ n Xd S(   s(   decode single character -> 6 bit integers   source must be bytes, not %si   s   source must be exactly 1 bytei    s   invalid characterN(	   R3   R4   RK   Ru   R5   RG   R   Rh   R   (   Rp   R?   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_int6Ñ  s    c         C` sÆ   t  | t ƒ s+ t d t | ƒ f ƒ ‚ n  t | ƒ d k rL t d ƒ ‚ n  |  j } yM |  j r | | d ƒ | | d ƒ d >S| | d ƒ | | d ƒ d >SWn t k
 rÁ t d ƒ ‚ n Xd S(	   s'   decodes 2 char string -> 12-bit integers   source must be bytes, not %si   s   source must be exactly 2 bytesi   i    i   s   invalid characterN(	   R3   R4   RK   Ru   R5   RG   Rh   Ri   R   (   Rp   R?   Rs   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_int12ß  s    		 $c         C` s  t  | t ƒ s+ t d t | ƒ f ƒ ‚ n  t | ƒ d k rL t d ƒ ‚ n  |  j } y• |  j r¥ | | d ƒ | | d ƒ d >| | d ƒ d >| | d	 ƒ d
 >S| | d	 ƒ | | d ƒ d >| | d ƒ d >| | d ƒ d
 >SWn t k
 r	t d ƒ ‚ n Xd S(   s'   decodes 4 char string -> 24-bit integers   source must be bytes, not %si   s   source must be exactly 4 bytesi   i   i   i   i   i    i   s   invalid characterN(	   R3   R4   RK   Ru   R5   RG   Rh   Ri   R   (   Rp   R?   Rs   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_int24î  s    		DHc         C` s   |  j  | d ƒ S(   s&   decode 5 char string -> 30 bit integeri   (   R¡   (   Rp   R?   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_int30ÿ  s    c         C` s   |  j  | d ƒ S(   s±   decode 11 char base64 string -> 64-bit integer

        this format is used primarily by des-crypt & variants to encode
        the DES output value used as a checksum.
        i@   (   R¡   (   Rp   R?   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   decode_int64  s    c         ` s‘   ˆ  d k s t  d ƒ ‚ | d } | | 7} |  j rY t | d d d ƒ } ˆ  | K‰  n t d | d ƒ } t t |  j ‡  f d †  | Dƒ ƒ ƒ S(   sÕ   encode integer into base64 format

        :arg value: non-negative integer to encode
        :arg bits: number of bits to encode

        :returns:
            a string of length ``int(ceil(bits/6.0))``.
        i    s   caller did not sanitize inputi   iúÿÿÿc         3` s   |  ] } ˆ  | ?d  @Vq d S(   i?   N(    (   R^   RL   (   R`   (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pys	   <genexpr>"  s    (   R6   Ri   R   R   R   Re   (   Rp   R`   R‡   RŸ   t   itr(    (   R`   sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   _encode_int  s    	
	c         C` sP   | d k  s | d k r' t  d ƒ ‚ n  t r? |  j | | d !S|  j | ƒ Sd S(   s0   encodes 6-bit integer -> single hash64 characteri    i?   s   value out of rangei   N(   RG   R   Rc   Re   (   Rp   R`   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_int6(  s
    c         C` sm   | d k  s | d k r' t  d ƒ ‚ n  | d @| d ?d @g } |  j rW t | ƒ } n  t t |  j | ƒ ƒ S(   s'   encodes 12-bit integer -> 2 char stringi    iÿ  s   value out of rangei?   i   (   RG   Ri   Rž   R   R   Re   (   Rp   R`   t   raw(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_int121  s    	c         C` sƒ   | d k  s | d k r' t  d ƒ ‚ n  | d @| d ?d @| d ?d @| d ?d @g } |  j rm t | ƒ } n  t t |  j | ƒ ƒ S(   s'   encodes 24-bit integer -> 4 char stringi    iÿÿÿ s   value out of rangei?   i   i   i   (   RG   Ri   Rž   R   R   Re   (   Rp   R`   Rª   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_int24:  s    	c         C` s7   | d k  s | d k r' t  d ƒ ‚ n  |  j | d ƒ S(   s&   decode 5 char string -> 30 bit integeri    iÿÿÿ?s   value out of rangei   (   RG   R¨   (   Rp   R`   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_int30D  s    c         C` s7   | d k  s | d k r' t  d ƒ ‚ n  |  j | d ƒ S(   s±   encode 64-bit integer -> 11 char hash64 string

        this format is used primarily by des-crypt & variants to encode
        the DES output value used as a checksum.
        i    l   ÿÿÿÿ s   value out of rangei@   (   RG   R¨   (   Rp   R`   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   encode_int64J  s    N((   t   __name__t
   __module__t   __doc__R1   Rc   Ri   Re   Rh   Rk   Rm   R   Rr   t   propertyR]   R}   Rn   Rj   Rƒ   Ro   Rl   RŒ   R   R   RŽ   R•   R–   R™   R   R¡   R¢   R£   R¤   R¥   R¦   R¨   R©   R«   R¬   R­   R®   (    (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR&   ý   sD   ?"		'	+		#	*		)				(											
	c           B` s/   e  Z d  Z d Z d „  Z d „  Z d „  Z RS(   s<   Base64Engine which delays initialization until it's accessedc         O` s   | | f |  _  d  S(   N(   t
   _lazy_opts(   Rp   R‚   t   kwds(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyRr   \  s    c         C` s;   |  j  \ } } t t |  ƒ j | | Ž  |  `  t |  _ d  S(   N(   R³   t   superR'   Rr   R&   t	   __class__(   Rp   R‚   R´   (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt
   _lazy_init_  s    c         C` s,   | j  d ƒ s |  j ƒ  n  t j |  | ƒ S(   Nt   _(   t
   startswithR·   t   objectt   __getattribute__(   Rp   t   attr(    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR»   e  s    N(   R¯   R°   R±   R1   R³   Rr   R·   R»   (    (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyR'   X  s
   		Ri   (G   R±   t
   __future__R    R   R   t   base64R   R   R   RZ   R   RQ   t   binasciiR   R   R	   RJ   t   loggingt	   getLoggerR¯   t   logt   passlibR
   t   passlib.utils.compatR   R   R   R   R   R   R   R   R   R   R   R   t   passlib.utils.decorR   t   __all__R   R   R   R   R   R   R   R   R    R<   t   B_NULLRR   R7   R2   R1   R!   R$   R%   RD   RI   RH   R"   R#   RX   RY   Rº   R&   R'   R(   R[   R)   R*   (    (    (    sO   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/binary.pyt   <module>   sn   "R		!						
	ÿ ÿ ]