
    .~hl              	          d Z ddlmZmZ ddlZddlZddlZ	 ddlmZ e	Z
 ed      d ed      d ed	      d
 ed      diZ ed      d ed      diZd Zd ZddZddZ	 	 	 	 ddZ	 	 	 	 ddZ ej0                  d      j2                  Z	 	 	 	 	 	 d dZ	 	 	 	 	 	 d dZd Zd Zd!dZd!dZ 	 	 d"dZ!	 	 d"dZ"y# e$ r ddlmZ eZ	eZ
Y w xY w)#a  Additional factory functions for common QR codes.

Aside from  :py:func:`make_epc_qr`, the factory functions return a QR code
with the minimum error correction level "L" (or better).

To create a (Micro) QR code which should use a specific error correction level
or version etc., use the "_data" factory functions which return a string which
can be used as input for :py:func:`segno.make()`.
    )absolute_importunicode_literalsN)quote\z\\;z\;:z\:"z\",z\,c                 >    t        |       j                  t              S z~    Escapes ``\``, ``;``, ``"`` and ``:`` in the provided string.

    :param str s: The string to escape.
    :rtype str
    )str	translate_MECARD_ESCAPEss    V/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/segno/helpers.py_escape_mecardr   -   s     q6N++    c                 >    t        |       j                  t              S r   )r   r   _VCARD_ESCAPEr   s    r   _escape_vcardr   7   s     q6M**r   c                     t         }d}|r)|dj                  |dk7  r|j                         n|      z  }|dj                   ||             z  }||dj                   ||            z  }||rdz  }|S dz  }|S )a      Creates WIFI configuration string.

    :param str ssid: The SSID of the network.
    :param password: The password.
    :type password: str or None
    :param security: Authentication type; the value should be "WEP" or "WPA".
            Set to ``None`` to omit the value.
            "nopass" is equivalent to setting the value to ``None`` but in
            the former case, the value is not omitted.
    :type security: str or None
    :param bool hidden: Indicates if the network is hidden (default: ``False``)
    :rtype: str
    zWIFI:zT:{0};nopasszS:{0};zP:{0};zH:true;r   )r   formatupper)ssidpasswordsecurityhiddenescapedatas         r   make_wifi_datar"   A   s     FDH4H 0hWWHOOF4L))Dx 011I(DK &)(DKr   c                 D    t        j                  t        | |||            S )a(      Creates a WIFI configuration QR code.

    :param str ssid: The SSID of the network.
    :param password: The password.
    :type password: str or None
    :param security: Authentication type; the value should be "WEP" or "WPA".
            Set to ``None`` to omit the value.
            "nopass" is equivalent to setting the value to ``None`` but in
            the former case, the value is not omitted.
    :type security: str or None
    :param bool hidden: Indicates if the network is hidden (default: ``False``)
    :rtype: segno.QRCode
    )segnomake_qrr"   )r   r   r   r   s       r   	make_wifir&   [   s     ==h&IJJr   c                 d   fd}t         dj                   |             g}|r&|j                  dj                   |                   |j                   |d|             |j                   |d|             |j                   |d|             |r&|j                  dj                   |                   |r2	 |j	                  d      }|j                  d	j                  |             |j                   |d
|             |	|
|||||f}t        |      r7|D cg c]  } |xs d       }}|j                   dj                  |        |r&|j                  dj                   |                   |j                  d       dj                  |      S # t
        $ r Y w xY wc c}w )a      Creates a string encoding the contact information as MeCard.

    :param str name: Name. If it contains a comma, the first part
            is treated as lastname and the second part is treated as forename.
    :param reading: Designates a text string to be set as the kana name in the phonebook
    :type reading: str or None
    :param email: E-mail address. Multiple values are allowed.
    :type email: str, iterable of strings, or None
    :param phone: Phone number. Multiple values are allowed.
    :type phone: str, iterable of strings, or None
    :param videophone: Phone number for video calls. Multiple values are allowed.
    :type videophone: str, iterable of strings, or None
    :param memo: A notice for the contact.
    :type memo: str or None
    :param nickname: Nickname.
    :type nickname: str or None
    :param birthday: Birthday. If a string is provided, it should encode the date as YYYYMMDD value.
    :type birthday: str, datetime.date or None
    :param url: Homepage. Multiple values are allowed.
    :type url: str, iterable of strings, or None
    :param pobox: P.O. box (address information).
    :type pobox: str or None
    :param roomno: Room number (address information).
    :type roomno: str or None
    :param houseno: House number (address information).
    :type houseno: str or None
    :param city: City (address information).
    :type city: str or None
    :param prefecture: Prefecture (address information).
    :type prefecture: str or None
    :param zipcode: Zip code (address information).
    :type zipcode: str or None
    :param country: Country (address information).
    :type country: str or None
    :rtype: str
    c           	          |syt        |t              r|f}|D cg c]  }dj                  |  |             c}S c c}w )N z{0}:{1};
isinstancestr_typer   namevalir    s      r   make_multifieldz)make_mecard_data.<locals>.make_multifield   s?    c8$&C<?@q
!!$q	2@@@   >zMECARD:N:{0};z
SOUND:{0};TELTELAVEMAILzNICKNAME:{0};z%Y%m%dz	BDAY:{0};URL z ADR:{0},{1},{2},{3},{4},{5},{6};z	MEMO:{0};r   )r   r   appendextendstrftimeAttributeErroranyjoin)r.   readingemailphone
videophonememonicknamebirthdayurlpoboxroomnohousenocity
prefecturezipcodecountryr1   r!   adr_propertiesr0   adr_datar    s                        @r   make_mecard_datarO   m   s   RA F""6$<01DL''w89KKu-.KK45KK/0O**6(+;<=	((2H 	K&&x01KKs+,VWdJQN
>-;<F17O<<=6==xHIK&&vd|45KK774=  		 =s    F !F-	F*)F*c                     t        j                  t        di d| d|d|d|d|d|d|d|d	|d
|	d|
d|d|d|d|d|      S )a      Returns a QR code which encodes a `MeCard <https://en.wikipedia.org/wiki/MeCard>`_

    :param str name: Name. If it contains a comma, the first part
            is treated as lastname and the second part is treated as forename.
    :param reading: Designates a text string to be set as the kana name in the phonebook
    :type reading: str or None
    :param email: E-mail address. Multiple values are allowed.
    :type email: str, iterable of strings, or None
    :param phone: Phone number. Multiple values are allowed.
    :type phone: str, iterable of strings, or None
    :param videophone: Phone number for video calls. Multiple values are allowed.
    :type videophone: str, iterable of strings, or None
    :param memo: A notice for the contact.
    :type memo: str or None
    :param nickname: Nickname.
    :type nickname: str or None
    :param birthday: Birthday. If a string is provided, it should encode the date as YYYYMMDD value.
    :type birthday: str, datetime.date or None
    :param url: Homepage. Multiple values are allowed.
    :type url: str, iterable of strings, or None
    :param pobox: P.O. box (address information).
    :type pobox: str or None
    :param roomno: Room number (address information).
    :type roomno: str or None
    :param houseno: House number (address information).
    :type houseno: str or None
    :param city: City (address information).
    :type city: str or None
    :param prefecture: Prefecture (address information).
    :type prefecture: str or None
    :param zipcode: Zip code (address information).
    :type zipcode: str or None
    :param country: Country (address information).
    :type country: str or None
    :rtype: segno.QRCode
    r.   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r)   )r$   r%   rO   )r.   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   s                   r   make_mecardrQ      s    R ==) ;t ;W ;05;=B;5?;FJ; 4<; GO; /2	; :?	; HN	;
 3:;
 AE; 6@; JQ; 3:; < <r   zB^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:(?:-?\d{2}:\d{2})|Z)?)?$c                    fd}t         dddj                  |       dj                   |            g}|r&|j                  dj                   |                   |j                   |d|             |j                   |d|             |j                   |d	|             |j                   |d
|             |j                   |d|             |j                   |d|             |j                   |d|             |j                   |d|	             |j                   |d|             |j                   |d|             |r&|j                  dj                   |                   |
|||||f}t	        |      r7|D cg c]  } |xs d       }}|j                   dj                  |        |rX	 |j                  d      }t        |t              rt        |      st        d      |j                  dj                  |             |r|r|r|st        d      |r#|r!|j                  dj                  ||             |r&|j                  dj                   |                   |r&|j                  dj                   |                   |rX	 |j                  d      }t        |t              rt        |      st        d      |j                  dj                  |             |j                  d       |j                  d       dj                  |      S c c}w # t        $ r Y lw xY w# t        $ r Y w xY w)a
      Creates a string encoding the contact information as vCard 3.0.

    Only a subset of available `vCard 3.0 properties <https://tools.ietf.org/html/rfc2426>`
    is supported.

    :param str name: The name. If it contains a semicolon, , the first part
            is treated as lastname and the second part is treated as forename.
    :param str displayname: Common name.
    :param email: E-mail address. Multiple values are allowed.
    :type email: str, iterable of strings, or None
    :param phone: Phone number. Multiple values are allowed.
    :type phone: str, iterable of strings, or None
    :param fax: Fax number. Multiple values are allowed.
    :type fax: str, iterable of strings, or None
    :param videophone: Phone number for video calls. Multiple values are allowed.
    :type videophone: str, iterable of strings, or None
    :param memo: A notice for the contact.
    :type memo: str or None
    :param nickname: Nickname.
    :type nickname: str or None
    :param birthday: Birthday. If a string is provided, it should encode the
                     date as ``YYYY-MM-DD`` value.
    :type birthday: str, datetime.date or None
    :param url: Homepage. Multiple values are allowed.
    :type url: str, iterable of strings, or None
    :param pobox: P.O. box (address information).
    :type pobox: str or None
    :param street: Street address.
    :type street: str or None
    :param city: City (address information).
    :type city: str or None
    :param region: Region (address information).
    :type region: str or None
    :param zipcode: Zip code (address information).
    :type zipcode: str or None
    :param country: Country (address information).
    :type country: str or None
    :param org: Company / organization name.
    :type org: str or None
    :param lat: Latitude.
    :type lat: float or None
    :param lng: Longitude.
    :type lng: float or None
    :param source: URL where to obtain the vCard.
    :type source: str or None
    :param rev: Revision of the vCard / last modification date.
    :type rev: str, datetime.date or None
    :param title: Job Title. Multiple values are allowed.
    :type title: str, iterable of strings, or None
    :param photo_uri: Photo URI. Multiple values are allowed.
    :type photo_uri: str, iterable of strings, or None
    :param cellphone: Cell phone number. Multiple values are allowed.
    :type cellphone: str, iterable of strings, or None
    :param homephone: Home phone number. Multiple values are allowed.
    :type homephone: str, iterable of strings, or None
    :param workphone: Work phone number. Multiple values are allowed.
    :type workphone: str, iterable of strings, or None
    :rtype: str
    c           	          |syt        |t              r|f}|D cg c]  }dj                  |  |             c}S c c}w )Nr)   z{0}:{1}r*   r-   s      r   r1   z(make_vcard_data.<locals>.make_multifield/  s?    c8$&C;>?a	  vay1???r2   zBEGIN:VCARDzVERSION:3.0zN:{0}zFN:{0}zORG:{0}r5   r3   zTEL;TYPE=FAXzTEL;TYPE=VIDEOzTEL;TYPE=CELLzTEL;TYPE=HOMEzTEL;TYPE=WORKr6   TITLEzPHOTO;VALUE=urizNICKNAME:{0}r7   zADR:{0};;{1};{2};{3};{4};{5}z%Y-%m-%dzG"birthday" does not seem to be a valid date or date/time representationzBDAY:{0}zBIncomplete geo information, please specify latitude and longitude.zGEO:{0};{1}z
SOURCE:{0}zNOTE:{0}zB"rev" does not seem to be a valid date or date/time representationzREV:{0}z	END:VCARDz
)r   r   r8   r9   r<   r:   r;   r+   r,   _looks_like_datetime
ValueErrorr=   ) r.   displaynamer?   r@   faxrA   rB   rC   rD   rE   rF   streetrI   regionrK   rL   orglatlngsourcerevtitle	photo_uri	cellphone	homephone	workphoner1   r!   rM   r0   rN   r    s                                   @r   make_vcard_datare      s   D@ F=NN4 OOF;/02D I$$VC[12KK/0KKu-.KK45KK 0*=>KK;<KK;<KK;<KKs+,KK/0KK 19=>N))&*:;<VT67GDN
>-;<F17O<<92998DE	((4H (H-5I(5SfggJ%%h/0
3#c]^^
sM((c23L''v78J%%fTl34
	,,z*C #x(0DS0IabbI$$S)*KKKKO;;t9 =
  		   		s*   L0L5 &M 5	MM	MMc                     t        j                  t        | |fi d|d|d|d|d|d|d|d|	d	|
d
|d|d|d|d|d|d|d|d|d|d|d|d|d|d|      S )a
      Creates a QR code which encodes a `vCard <https://en.wikipedia.org/wiki/VCard>`_
    version 3.0.

    Only a subset of available `vCard 3.0 properties <https://tools.ietf.org/html/rfc2426>`
    is supported.

    :param str name: The name. If it contains a semicolon, , the first part
            is treated as lastname and the second part is treated as forename.
    :param str displayname: Common name.
    :param email: E-mail address. Multiple values are allowed.
    :type email: str, iterable of strings, or None
    :param phone: Phone number. Multiple values are allowed.
    :type phone: str, iterable of strings, or None
    :param fax: Fax number. Multiple values are allowed.
    :type fax: str, iterable of strings, or None
    :param videophone: Phone number for video calls. Multiple values are allowed.
    :type videophone: str, iterable of strings, or None
    :param memo: A notice for the contact.
    :type memo: str or None
    :param nickname: Nickname.
    :type nickname: str or None
    :param birthday: Birthday. If a string is provided, it should encode the
                     date as ``YYYY-MM-DD`` value.
    :type birthday: str, datetime.date or None
    :param url: Homepage. Multiple values are allowed.
    :type url: str, iterable of strings, or None
    :param pobox: P.O. box (address information).
    :type pobox: str or None
    :param street: Street address.
    :type street: str or None
    :param city: City (address information).
    :type city: str or None
    :param region: Region (address information).
    :type region: str or None
    :param zipcode: Zip code (address information).
    :type zipcode: str or None
    :param country: Country (address information).
    :type country: str or None
    :param org: Company / organization name.
    :type org: str or None
    :param lat: Latitude.
    :type lat: float or None
    :param lng: Longitude.
    :type lng: float or None
    :param source: URL where to obtain the vCard.
    :type source: str or None
    :param rev: Revision of the vCard / last modification date.
    :type rev: str, datetime.date or None
    :param title: Job Title. Multiple values are allowed.
    :type title: str, iterable of strings, or None
    :param photo_uri: Photo URI. Multiple values are allowed.
    :type photo_uri: str, iterable of strings, or None
    :param cellphone: Cell phone number. Multiple values are allowed.
    :type cellphone: str, iterable of strings, or None
    :param homephone: Home phone number. Multiple values are allowed.
    :type homephone: str, iterable of strings, or None
    :param workphone: Work phone number. Multiple values are allowed.
    :type workphone: str, iterable of strings, or None
    :rtype: segno.QRCode
    r?   r@   rX   rA   rB   rC   rD   rE   rF   rY   rI   rZ   rK   rL   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   )r$   r%   re   )r.   rW   r?   r@   rX   rA   rB   rC   rD   rE   rF   rY   rI   rZ   rK   rL   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   s                             r   
make_vcardrg   i  s   F =={ >% >/4>:=>4>>EI> 3;> FN> .1	> 9>	> GM	>
 /3>
 <B> 29> CJ> .1> 7:> @C> 17> =@> HM> 4=> 4=> 4=> 4=> ? ?r   c                 D    d }dj                   ||        ||            S )zt    Creates a geo location URI.

    :param float lat: Latitude
    :param float lng: Longitude
    :rtype: str
    c                 `    dj                  |       j                  d      j                  d      S )Nz{0:.8f}0.)r   rstrip)fs    r   float_to_strz#make_geo_data.<locals>.float_to_str  s)    "))#.55c::r   zgeo:{0},{1})r   )r\   r]   rn   s      r   make_geo_dataro     s&    ; S 1<3DEEr   c                 @    t        j                  t        | |            S )z    Returns a QR code which encodes geographic location using the ``geo`` URI
    scheme.

    :param float lat: Latitude
    :param float lng: Longitude
    :rtype: segno.QRCode
    )r$   r%   ro   )r\   r]   s     r   make_georq     s     ==sC011r   c                    d }d}dg}| st        d      |j                  dj                   ||                    d|fd|ffD ]C  \  }}	 ||	      }
|
s|j                  dj                  ||dj                  |
                   d	}E d
|fd|ffD ]C  \  }}	|	:|j                  dj                  ||t	        |	j                  d                         d	}E dj                  |      S )a|      Creates either a simple "mailto:" URL or complete e-mail message with
    (blind) carbon copies and a subject and a body.

    :param to: The email address (recipient). Multiple values are allowed.
    :type to: str or iterable of strings
    :param cc: The carbon copy recipient. Multiple values are allowed.
    :type cc: str, iterable of strings, or None
    :param bcc: The blind carbon copy recipient. Multiple values are allowed.
    :type bcc: str, iterable of strings, or None
    :param subject: The subject.
    :type subject: str or None
    :param body: The message body.
    :type body: str or None
    :rtype: str
    c                 D    | syt        | t              r| fS t        |       S )Nr)   )r+   r,   tuple)r/   s    r   multiz#make_make_email_data.<locals>.multi  s#    c8$6MSzr   ?zmailto:z"to" must not be empty or Noner
   ccbccz
{0}{1}={2}&subjectbodyutf-8r7   )rV   r8   r=   r   r   encode)torw   rx   rz   r{   ru   delimr!   keyr/   valss              r   make_make_email_datar     s    " E;D9::KKr#$BZ%. SSzKK++E3GHE	
  )FD>: S?KK++E3cjj>Q8RST 774=r   c           	      H    t        j                  t        | ||||            S )a      Encodes either a simple e-mail address or a complete message with
    (blind) carbon copies and a subject and a body.

    :param to: The email address (recipient). Multiple values are allowed.
    :type to: str or iterable of strings
    :param cc: The carbon copy recipient. Multiple values are allowed.
    :type cc: str, iterable of strings, or None
    :param bcc: The blind carbon copy recipient. Multiple values are allowed.
    :type bcc: str, iterable of strings, or None
    :param subject: The subject.
    :type subject: str or None
    :param body: The message body.
    :type body: str or None
    :rtype: segno.QRCode
    r~   rw   rx   rz   r{   )r$   r%   r   r   s        r   
make_emailr     s+    " ==-6=DJ K Kr   c                 l   d}t        j                  d      }	t        j                  d      }
|r|j                         n|}|r|j                         n|}|r|j                         n|}| r| j                         n| } |tt	        |t
              r$	 |j                  |j                               dz   }n@t	        |t              rd|cxk  rt        |      k  sn t        dj                  |            |s|r|r|rt        d      |r9d	t        |      cxk  rd
k  s%n t        dj                  t        |                  |r9d	t        |      cxk  rdk  s%n t        dj                  t        |                  | d	t        |       cxk  rdk  sn t        dj                  |             |dt        |      cxk  rdk  sn t        dj                  |            |r't        |      dvrt        dj                  |            |r(t        |      dk7  rt        dj                  |            t        j                  |      }|	|cxk  r|
k  sn t        dj                  |	|
            dddd|xs d| |dj                  |      j                  d      j                  d      |xs d|xs dg
}|r|j                  |       dj                  |      }|dn|}|d	k  r-t        |dd d !      D ]  \  }}	 |j                  |       |} n |d	k  rd}t#        |      |d <   dj                  |      j                  ||dz
           }t        |      d"kD  r#t        d#j                  t        |                  |S # t        $ r t        dj                  ||            w xY w# t         $ r Y w xY w)$z    Validates the input and creates the data for an EPC QR Code.

    DOES NOT belong to the public API, kept separate from make_epc_qr to apply
    tests on the raw data.

    See :py:func:`make_epc_qr` for a description of the parameters.
    )r|   z
iso-8859-1z
iso-8859-2z
iso-8859-4z
iso-8859-5z
iso-8859-7ziso-8859-10ziso-8859-15z0.01z999999999.99N   z&Invalid encoding "{0}", use one of {1}z9Invalid encoding number only 1 .. 8 are allowed, got "{}"zBEither a text or a creditor reference (ISO 11649) must be providedr      z7Invalid text, max. 140 characters are allowed, got "{}"#   zPInvalid creditor reference (ISO 11649), max. 35 characters are allowed, got "{}"F   z6Invalid name, max. 70 characters are allowed, got "{}"   "   zAInvalid IBAN, min. 5 and max. 34 characters are allowed, got "{}")      z8Invalid BIC, should be 8 or 11 characters long, got "{}"z3Invalid purpose, 4 characters are allowed, got "{}"zBInvalid amount, must be in bigger or equal {} and less or equal {}BCD002r7   SCTz	EUR{:.2f}rj   rk   
   )startiK  z8Payload is too big: Max. 331 bytes allowed, got {} bytes)decimalDecimalrl   stripr+   r,   indexlowerrV   r   intlenr8   r=   	enumerater}   UnicodeEncodeErrorr   )r.   ibanamounttext	referencebicpurposeencoding	encodings
min_amount
max_amounttmp_datar!   charsetidxencs                   r   _make_epc_qr_datar     s   KI(J0J 4;;=dD&/	  "YI#))+#C4::<TDh)g$??8>>+;<q@ Hc*!x2Q3y>2QX__`hijj	Ti]^^AD	(S(RYYZ]^bZcdee	1s9~33k &Y02 	2|1s4y.B.QXXY]^__|1s4y.B.\ccdhijj
s3xw&SZZ[^_``3w<1$NUUV]^____V$F-:-] &Z8: 	:	r""6*11#6==cB2R
H 99XD$b(G{!)AB-q9 	HCC 		 {g,HQK99X%%i!&<=D
4y3SZZ[^_c[deffKk  g !I!P!PQY[d!effgX & s   "M? ;N'?%N$'	N32N3c                     t        j                  t        | |||||||      dd      }|j                  dkD  r$t	        dj                  |j                              |S )a      Creates and returns an European Payments Council Quick Response Code
    (EPC QR Code) version 002.

    The returned :py:class:`segno.QRCode` uses always the error correction level
    "M" and utilizes max. version 13 to fulfill the constraints of the EPC QR
    Code standard.

    .. note::

        Either the ``text`` or ``reference`` must be provided but not both

    .. note::

        Neither the IBAN, BIC, nor remittance reference number or any other
        information is validated (aside from checks regarding the allowed string
        lengths).

    :param str name: Name of the recipient.
    :param str iban: International Bank Account Number (IBAN)
    :param amount: The amount (in EUR) to transfer.
            The currency is always Euro, no other currencies are supported.
    :type amount: int, float, decimal.Decimal
    :param str text: Remittance Information (unstructured)
    :param str reference: Remittance Information (structured)
    :param str bic: Bank Identifier Code (BIC). Optional, only required
                for non-EEA countries.
    :param str purpose: SEPA purpose code.
    :param encoding: By default, this function tries to find the best,
                minimal encoding. If another encoding should be used, the encoding
                name or the encoding constant (an integer) can be provided:
                ``1``: "UTF-8", ``2``: "ISO 8859-1", ``3``: "ISO 8859-2",
                ``4``: "ISO 8859-4", ``5``: "ISO 8859-5", ``6``: "ISO 8859-7",
                ``7``: "ISO 8859-10", ``8``: "ISO 8859-15"

                The encoding is case-insensitive.
    :type encoding: str or int
    :rtype: segno.QRCode
    mF)errorboost_error   zAInvalid EPC QR Code, max. QR Code version 13 is allowed, got "{}")r$   r%   r   versionrV   r   
designator)	r.   r   r   r   r   r   r   r   qrs	            r   make_epc_qrr   b  sb    V 
(tVT9),gxA e
5B 
zzB\ccdfdqdqrssIr   )NNF)NNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNNN)NNNN)NNNNN)#__doc__
__future__r   r   rer   r$   urllib.parser   r   r,   ImportErrorurllibunicode
basestringordr   r   r   r   r"   r&   rO   rQ   compilematchrU   re   rg   ro   rq   r   r   r   r   r)   r   r   <module>r      sX  	 9 	  "H IvHeHeHe	 HeHe,+4K$ MQBFAE<@GT HLIMAE&*0<f "rzz"ghnn  DHHLIMHLAE>Byx ?CCGDHCG<@9=O?dF	2&RK* JN-1L^ DH'+1S  
CHs   B= =CC