o
    ÓgÄVÅ3  ã                   @   sr   d Z dZddlmZ ddlmZ ddlmZ G dd„ deƒZdd	„ Z	d
d„ Z
dd„ Zdd„ Zedkr7eƒ  dS dS )z3.3.0)ÚUSPS_4Stateé    )Úblack)ÚBarcode)ÚasNativec                   @   s  e Zd ZdZdZdZdZdZeddddd�Z	eddd	d	d
�Z
eddddd�ZdUdd„Zdd„ Zdd„ ZeeƒZdd„ Zedd„ eƒZdd„ Zedd„ eƒZdd „ Zed!d„ eƒZd"d#„ Zed$d„ eƒZd%d&„ Zed'd„ eƒZd(d)„ Zed*d„ eƒZd+d,„ ZeeƒZd-d.„ ZeeƒZd/d0„ ZeeƒZd1d2„ ZeeƒZd3d4„ ZeeƒZd5d6„ ZeeƒZd7Zd8Zed9d„ ƒZed:d„ ƒZ ed;d„ ƒZ!ed<d„ ƒZ"ed=d„ ƒZ#ed>d„ ƒZ$ed?d„ ƒZ%d@dA„ Z&ee&ƒZ&dBdC„ Z'ee'ƒZ'dDdE„ Z(dFdG„ Z)dVdHdI„Z*dJdK„ Z+dLdM„ Z,ee,dNd„ ƒZ,dOdP„ Z-dWdRdS„Z.dTS )Xr   zC USPS 4-State OneView (TM) barcode. All info from USPS-B-3200A
    é   é   r   )gôýÔxé&±?gq=
×£p½?)g/Ý$�•?ç{®Gáz¤?)ÚFÚTÚAÚD)gôýÔxé&±¿gq=
×£p½¿)g/Ý$�•¿g{®Gáz¤¿)r	   r   r
   r   )g¸…ëQ¸Ž?gš™™™™™™?)g”ö_˜L¥?gš™™™™™©?)ç      À?r   )r   r   )ÚwidthÚpitchÚhczÚvczÚ01234567094987654321Ú c                 K   sB   |   ¡  t|tƒrt|ƒnt|ƒ}|| _|| _| jdi |¤Ž d S )N© )Ú_initÚ
isinstanceÚintÚstrr   Ú	_trackingÚ_routingÚ_setKeywords)ÚselfÚvalueÚroutingÚkwdr   r   úS/var/www/html/env/lib/python3.10/site-packages/reportlab/graphics/barcode/usps4s.pyÚ__init__$   s
   zUSPS_4State.__init__c                 C   s   d | _ d | _d | _d | _d S ©N)Ú_bvalueÚ
_codewordsÚ_charactersÚ	_barcodes©r   r   r   r    r   +   s   
zUSPS_4State._initc                 C   s(   ||  }d|d d|  ||d    S )NéH   r   r   r   )Úkindr   ÚsÚVr   r   r    Úscale1   s    zUSPS_4State.scalec                 C   ó   |   ¡  || _d S r"   )r   r   )r   Útrackingr   r   r    r.   6   ó   
zUSPS_4State.trackingc                 C   ó   | j S r"   )r   r'   r   r   r    Ú<lambda>9   ó    zUSPS_4State.<lambda>c                 C   r-   r"   )r   r   )r   r   r   r   r    r   ;   r/   zUSPS_4State.routingc                 C   r0   r"   )r   r'   r   r   r    r1   >   r2   c                 C   ó   d | _ || _d S r"   )Ú_sizedÚ
_widthSize©r   r   r   r   r    Ú	widthSize@   ó   
zUSPS_4State.widthSizec                 C   r0   r"   )r5   r'   r   r   r    r1   C   r2   c                 C   r3   r"   )r4   Ú_heightSizer6   r   r   r    Ú
heightSizeE   r8   zUSPS_4State.heightSizec                 C   r0   r"   )r9   r'   r   r   r    r1   H   r2   c                 C   r3   r"   )r4   Ú	_fontSizer6   r   r   r    ÚfontSizeJ   r8   zUSPS_4State.fontSizec                 C   r0   r"   )r;   r'   r   r   r    r1   M   r2   c                 C   r3   r"   )r4   Ú_humanReadabler6   r   r   r    ÚhumanReadableO   r8   zUSPS_4State.humanReadablec                 C   r0   r"   )r=   r'   r   r   r    r1   R   r2   c           
   	   C   sd  | j }|s°| j}t|ƒ}z,|dkrd}n#|dkrt|ƒd }n|dkr*t|ƒd }n|dkr5t|ƒd }nt‚W n	   td| ƒ‚| j}|dd	… }z|d
9 }|t|d ƒ7 }|d9 }|t|d ƒ7 }W n	   td| ƒ‚d	}dD ]9\}}|}	||7 }||	|… }zt|ƒ|krŒt‚t|ƒD ]}	|d
9 }|t||	 ƒ7 }q�W qs   td|||f ƒ‚|| _ |S )aä  convert the 4 state string values to binary
        >>> print hex(USPS_4State('01234567094987654321','').binary)
        0x1122103B5C2004B1L
        >>> print hex(USPS_4State('01234567094987654321','01234').binary)
        0xD138A87BAB5CF3804B1L
        >>> print hex(USPS_4State('01234567094987654321','012345678').binary)
        0x202BDC097711204D21804B1L
        >>> print hex(USPS_4State('01234567094987654321','01234567891').binary)
        0x16907B2A24ABC16A2E5C004B1L
        r   é   r   é	   i¡† r   i¡Pœ;z@Problem converting %s, routing code must be 0, 5, 9 or 11 digitsé   é
   z:Problem converting %s, barcode identifier must be 2 digits))zspecial servicesé   )zcustomer identifieré   )zsequence numberr@   z+Problem converting %s, %s must be %d digits)r#   r   Úlenr   Ú
ValueErrorr.   Úrange)
r   r   r   Únr.   ÚsvalueÚiÚnameÚndÚjr   r   r    ÚbinaryT   sR   €þzUSPS_4State.binaryc                 C   s  | j s€| j}t|dƒ\}}t|dƒ\}}t|dƒ\}}t|dƒ\}}t|dƒ\}}t|dƒ\}}t|dƒ\}}	t|dƒ\}}
t|dƒ\}}d|  krOdks\n J dtt|ƒƒ|f ƒ‚t|ƒ| _| jd@ rj|d7 }|d9 }ttt|||
|	||||||f
ƒƒ| _ | j S )	z¶convert binary value into codewords
        >>> print USPS_4State('01234567094987654321','01234567891').codewords)
        (673, 787, 607, 1022, 861, 19, 816, 1294, 35, 602)
        i|  iU  r   i’  z.improper value %s passed to _2codewords A-->%sé   i“  rA   )	r$   rN   ÚdivmodÚhexr   Ú_crc11Ú_fcsÚtupleÚmap)r   r   r   ÚJÚIÚHÚGr	   ÚEr   ÚCÚBr   r   r    Ú	codewords‹   s"   .
$zUSPS_4State.codewordsc                 C   ó   t ddƒ| j_| jjS )Nr?   é  )Ú_initNof13TableÚ	__class__Útable1r'   r   r   r    rb   ¤   ó   zUSPS_4State.table1c                 C   r^   )NrA   éN   )r`   ra   Útable2r'   r   r   r    re   ©   rc   zUSPS_4State.table2c           
      C   sŠ   | j sB| j}| j}g }|j}| j}| j}tdƒD ]$}|| }|dkr'|| }	n||d  }	||? d@ r8|	 d@ }	||	ƒ qt|ƒ| _ | j S )zÏ convert own codewords to characters
        >>> print ' '.join(hex(c)[2:] for c in USPS_4State('01234567094987654321','01234567891').characters)
        dcb 85c 8e4 b06 6dd 1740 17c6 1200 123f 1b2b
        rB   i  r_   r   iÿ  )r%   r]   rS   Úappendrb   re   rG   rT   )
r   r]   Úfcsr[   ÚaCrb   re   rJ   ÚcwÚcr   r   r    Ú
characters®   s"   



zUSPS_4State.charactersc           	      C   sn   | j s4| j}g }|j}| j}| jD ]\}}}}|||| |? d@ d|| |? d@    ƒ qd |¡| _ | j S )zÖGet 4 state bar codes for current routing and tracking
        >>> print USPS_4State('01234567094987654321','01234567891').barcodes
        AADTFFDFTDADTAADAATFDTDDAAADDTDTTDAFADADDDTFFFDDTTTADFAAADFTDAADA
        r   rA   r   )r&   rk   rf   Ú
_bits2barsÚtable4Újoin)	r   r[   r\   ÚaBÚ	bits2barsÚdcÚdbÚacÚabr   r   r    ÚbarcodesÇ   s   .zUSPS_4State.barcodes)A)é   rA   é   rC   )r   rB   r   r   )r@   é   rA   é   )r?   r?   rD   r   )ry   r@   rC   r   )r   r   r?   rx   )rA   r?   r   ry   )rw   rw   r@   r   )rD   rC   ry   rB   )rC   r@   rv   rD   )r?   r   r   rw   )ry   r?   rA   rx   )r@   rB   r   rA   )rv   r   rD   rv   )rC   rD   rw   r@   )r   rC   ry   rD   )rD   rw   rA   rv   )r   r   r@   r@   )rv   rB   r?   rA   )rw   r   rC   ry   )rD   rA   r   rw   )ry   r   r   r   )r@   ry   rC   rx   )rA   rD   rv   rv   )r?   r   rw   rB   )r   rx   rD   r@   )rv   rC   ry   r   )r?   ry   r@   rv   )rw   rD   rA   rB   )rC   rw   r   r?   )ry   rw   r?   rv   )rv   r   r   r@   )rD   r   r@   rD   )r   rD   rw   ry   )rA   r   rC   rA   )r?   r@   ry   rx   )rw   r   rD   r   )r@   r?   rv   rw   )rC   rC   r   rA   )r   rv   rA   r   )r   rC   rw   r   )rD   rB   rC   r?   )ry   rv   r@   rw   )rA   r   r?   rD   )r   ry   rv   rx   )rw   rA   ry   r   )r?   rB   rC   r   )r@   rC   r   r@   )rD   r?   rA   rw   )rv   ry   r   rv   )r?   r   rw   r?   )rA   rC   r   rB   )rD   rx   r@   rA   )rC   r   r   rD   )ry   ry   rv   r@   )r?   rw   r   r   )r   r?   rA   rA   )r@   r   rw   rx   )ry   rC   rD   rD   )rv   r   rC   rv   )rw   rv   rv   r?   )r   rx   r   r   )rA   r@   r@   r   )rD   ry   r?   rC   )rC   rB   ry   rA   ©r
   r   r   r	   c                 C   ó   |   d| j| j¡S )Nr   ©r,   Ú
dimensionsÚ
widthScaler'   r   r   r    r1   ê   ó    c                 C   r{   )Nr   )r,   r}   ÚheightScaler'   r   r   r    r1   ë   r   c                 C   r{   )Nr   r|   r'   r   r   r    r1   ì   r   c                 C   r{   )Nr   r|   r'   r   r   r    r1   í   r   c                 C   s$   |   d| j| j¡|   d| j| j¡ S )Nr	   )r,   Útopsr€   Úbottomsr'   r   r   r    r1   î   s   $ c                 C   ó   t dtd| jƒƒS ©Nr   r   )ÚminÚmaxr7   r'   r   r   r    r1   ï   r   c                 C   rƒ   r„   )r…   r†   r:   r'   r   r   r    r1   ð   r   c                 C   ó   |   ¡  | jS r"   )ÚcomputeSizeÚ_widthr'   r   r   r    r   ò   ó   zUSPS_4State.widthc                 C   r‡   r"   )rˆ   Ú_heightr'   r   r   r    Úheight÷   rŠ   zUSPS_4State.heightc                 C   s†   t | dd ƒsA| j}| j}| j}| j}| j}| j}| j}d| | d|  | _d| | | _	| j
r<|  j	| jd | 7  _	d| _d S d S )Nr4   rA   é@   g333333ó?T)Úgetattrr~   r€   Ú	barHeightÚbarWidthr   ÚhorizontalClearZoneÚverticalClearZoner‰   r‹   r>   r<   r4   )r   ÚwsÚhsr�   r�   r   r   r   r   r   r    rˆ   ü   s   
ôzUSPS_4State.computeSizec                 C   s   |   ¡  | j| jfS r"   )rˆ   r   rŒ   )r   ÚaWÚaHr   r   r    Úwrap  s   zUSPS_4State.wrapc                 C   sL   i }| j }dD ]}|  || j|¡| }||  || j|¡| | f||< q|S )Nrz   )r€   r,   r‚   r�   )r   Úy0ÚvInfor”   ÚbÚyr   r   r    Ú_getBarVInfo  s   "zUSPS_4State._getBarVInfoc                 C   sx   |   ¡  | j}| j}| j}|}|| jd  }| j}|  |¡}| jD ]}|| \}	}
|  ||	||
¡ ||7 }q!|  	¡  d S )Ng      à?)
rˆ   r‘   r’   r�   r�   r   rœ   ru   ÚrectÚdrawHumanReadable)r   r   r   ÚbwÚxr˜   Údwr™   rš   ÚybÚhbr   r   r    Údraw  s   


zUSPS_4State.drawc                 C   sP   | j }| j}|r|fpd}d |dd… |dd… |dd… |dd … f| ¡S )Nr   ú r   rA   r?   r   )r.   r   rn   )r   r.   r   r   r   r    r   &  s   6zUSPS_4State.valuec                 C   s   | j  d|¡S )Nr.   )Ú__dict__Ú__setitem__r6   r   r   r    r1   +  s    c                 C   sP   | j r&| j}| j}| j}| j}| jd|  d|  }|  ||| j||¡ d S d S )NrA   gš™™™™™É?)r>   r‘   r’   ÚfontNamer<   r�   Úannotater   )r   r   r   r¨   r<   r›   r   r   r    rž   -  s   úzUSPS_4State.drawHumanReadableÚmiddlec              	   C   s   t j| |||||dd� d S )NÚstart)Úanchor)r   r©   )r   r    r›   Útextr¨   r<   r¬   r   r   r    r©   6  s   zUSPS_4State.annotateN)r   r   )r   )rª   )/Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5   r9   r;   r=   Údictr�   r‚   r}   r!   r   r,   Ústaticmethodr.   Úpropertyr   r7   r:   r<   r>   rN   r]   rb   re   rk   ru   rm   rl   r‘   r’   r   r�   r�   r~   r€   r   rŒ   rˆ   r—   rœ   r¤   r   rž   r©   r   r   r   r    r   
   s’    üüü
5
	r   c                 C   sø   t t| ƒƒdd… }ddt|ƒ  | }d}d}t|dd… dƒd	> }tdd
ƒD ]}||A d@ r7|d> |A }n|d> }|dM }|dK }q(tdddƒD ]/}t|||d … dƒd> }td
ƒD ]}||A d@ rl|d> |A }n|d> }|dM }|dK }q]qJ|S )z¡
    >>> print ' '.join(hex(_crc11(USPS_4State('01234567094987654321',x).binary)) for x in ('','01234','012345678','01234567891'))
    0x51 0x65 0x606 0x751
    rA   éÿÿÿÿÚ0é   i5  iÿ  Né   r?   ry   rO   r   rC   )rQ   r   rE   rG   )r   ÚbytesÚgprg   Údatarš   r    r   r   r    rR   9  s*   

úrR   c                 C   s2   d}t dƒD ]}|dK }|| d@ O }| dL } q|S )ztreverse unsigned 13 bit number
    >>> print _ru13(7936), _ru13(31), _ru13(47), _ru13(7808)
    31 7936 7808 47
    r   é   r   )rG   )rJ   Úrr    r   r   r    Ú_ru13V  s   
r¾   c           	      C   sÆ   |dg }d}|d }t dƒD ]@}d}t dƒD ]}||d|> @ dk7 }q|| kr)qt|ƒ}||k r2q||kr?|||< |d8 }q|||< |d7 }|||< |d7 }q||d ksaJ d|d || f ƒ‚|S )a+  create and return table of 13 bit values with N bits on
    >>> T = _initNof13Table(5,1287)
    >>> print ' '.join('T[%d]=%d' % (i, T[i]) for i in (0,1,2,3,4,1271,1272,1284,1285,1286))
    T[0]=31 T[1]=7936 T[2]=47 T[3]=7808 T[4]=55 T[1271]=6275 T[1272]=6211 T[1284]=856 T[1285]=744 T[1286]=496
    Nr   r   i    r¼   z!u+1(%d)!=l(%d) for %d of 13 table)rG   r¾   )	ÚNÚlenTr
   ÚlÚurj   Úbcrš   r½   r   r   r    r`   b  s&   




"r`   c                  C   s   dd l } |  ¡ S )Nr   )ÚdoctestÚtestmod)rÄ   r   r   r    Ú_test}  s   rÆ   Ú__main__N)Ú__version__Ú__all__Úreportlab.lib.colorsr   Ú!reportlab.graphics.barcode.commonr   Úreportlab.lib.utilsr   r   rR   r¾   r`   rÆ   r®   r   r   r   r    Ú<module>   s     1
ÿ