ó
    EñiI{  ã                   ót  • S SK rS SKJs  Jr  S SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SK	Jr  S SKJrJrJrJrJrJrJrJrJrJrJrJr  S SKJr  SSK J!r!  SSK"J#r#  Sr$\RJ                  " S	\RL                  \RN                  S
9  \\\(\)4   \\(\)\\)\4   4   4   r*\\*   r+ " S S\!5      r,g)é    N)ÚJSONEncoder)ÚAnyÚCallableÚDictÚListÚLiteralÚOptionalÚSequenceÚSetÚTupleÚTypeÚUnionÚoverload)ÚUnsupportedFeatureé   )ÚBaseProvider)Ú	TypesSpecTú	faker-csv)Úquotingc                   óú  • \ rS rSrSGS\S\4S jjrS\\   4S jrSHS\S\	4S jjr
\S\4S j5       r\S	\S
   S\	4S j5       r\S	\S   S\4S j5       rSIS	\S\\	\4   4S jjr\S\4S j5       r\S	\S
   S\	4S j5       r\S	\S   S\4S j5       rSIS	\S\\	\4   4S jjr\S\4S j5       r\S	\S
   S\	4S j5       r\S	\S   S\4S j5       rSIS	\S\\	\4   4S jjr\S\4S j5       r\SSS\R(                  4S j5       r\S\\R(                  /\4   S\4S j5       r\S\\R(                  /\	4   S\	4S j5       r\4S\\\\R(                  /\4   \\R(                  /\	4   4      S\\	\\R(                  4   4S jjr     SJS\S\S\S \S!\S\4S" jjr    SKS#\S$\S%\S&\\   S\	4
S' jjr    SKS#\S$\S%\S&\\   S\	4
S( jjr    SLS)\\\4   S*\S+\\\\\   \4      S,\\   S\	4
S- jjr     SMS.\S/\\\      S0\\\4   S1\S2\S3\S\4S4 jjr    SNS/\\\      S0\\\4   S1\S2\S\4
S5 jjr    SNS/\\\      S0\\\4   S1\S2\S\4
S6 jjr    SNS/\\\      S0\\\4   S1\S2\S\4
S7 jjr     SOS0\\!   S1\S8\\   S9\\"\#      S\	4
S: jjr$    SOS0\\!   S1\S8\\   S9\\"\#      S\4
S; jjr%    SPS<\S=\S>\\&   S?\\&   S\4
S@ jjr'SQS0\\(   S1\SA\S\4SB jjr)SC\SD\S\\\4   4SE jr*SFr+g)RÚProvideré   Úchance_of_getting_trueÚreturnc                 óT   • U R                   R                  R                  SS5      U:*  $ )z¯Generate a random boolean value based on ``chance_of_getting_true``.

:sample: chance_of_getting_true=25
:sample: chance_of_getting_true=50
:sample: chance_of_getting_true=75
é   éd   ©Ú	generatorÚrandomÚrandint)Úselfr   s     ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/faker/providers/misc/__init__.pyÚbooleanÚProvider.boolean   s'   € ð �~‰~×$Ñ$×,Ñ,¨Q°Ó4Ð8NÑNÐNó    c                 ó\   • SSSS.U R                   R                  R                  SS5         $ )zGGenerate ``None``, ``True``, or ``False``, each with equal probability.NTF)r   r   éÿÿÿÿr(   r   r   ©r"   s    r#   Únull_booleanÚProvider.null_boolean'   s8   € ð ØØñ
ð �.‰.×
Ñ
×
'Ñ
'¨¨AÓ
.ñ	0ð 	0r&   Úlengthc                 óþ   • U R                   R                  (       aH  [        U5       Vs/ s H'  o R                   R                  R	                  S5      PM)     nn[        U5      $ [        R                  " U5      $ s  snf )z¶Generate a random binary blob of ``length`` bytes.

If this faker instance has been seeded, performance will be signficiantly reduced, to conform
to the seeding.

:sample: length=64
é   )r   Ú
_is_seededÚranger    Ú	randrangeÚbytesÚosÚurandom)r"   r,   Ú_Úblobs       r#   ÚbinaryÚProvider.binary0   s]   € ð �>‰>×$×$ÜBGÈÄ-ÓPÂ-¸Q—N‘N×)Ñ)×3Ñ3°CÖ8Á-ˆDÐPÜ˜“;Ðô �zŠz˜&Ó!Ð!ùò	 Qs   ©.A:c                 ó   • g ©N© r)   s    r#   Úmd5ÚProvider.md5@   s   € Ør&   Ú
raw_outputTc                 ó   • g r:   r;   ©r"   r>   s     r#   r<   r=   C   ó   € Ø7:r&   Fc                 ó   • g r:   r;   r@   s     r#   r<   r=   F   s   € Ø69r&   c                 óî   • [         R                  " [        U R                  R                  R	                  5       5      R                  5       5      nU(       a  UR                  5       $ UR                  5       $ )a
  Generate a random MD5 hash.

If ``raw_output`` is ``False`` (default), a hexadecimal string representation of the MD5 hash
will be returned. If ``True``, a ``bytes`` object representation will be returned instead.

:sample: raw_output=False
:sample: raw_output=True
)Úhashlibr<   Ústrr   r    ÚencodeÚdigestÚ	hexdigest©r"   r>   Úress      r#   r<   r=   I   sN   € ô %Ÿ[š[¬¨T¯^©^×-BÑ-B×-IÑ-IÓ-KÓ)L×)SÑ)SÓ)UÓVˆÞØ—:‘:“<ÐØ�}‰}‹Ðr&   c                 ó   • g r:   r;   r)   s    r#   Úsha1ÚProvider.sha1W   s   € Ør&   c                 ó   • g r:   r;   r@   s     r#   rL   rM   Z   s   € Ø8;r&   c                 ó   • g r:   r;   r@   s     r#   rL   rM   ]   rA   r&   c                 óî   • [         R                  " [        U R                  R                  R	                  5       5      R                  5       5      nU(       a  UR                  5       $ UR                  5       $ )a  Generate a random SHA-1 hash.

If ``raw_output`` is ``False`` (default), a hexadecimal string representation of the SHA-1 hash
will be returned. If ``True``, a ``bytes`` object representation will be returned instead.

:sample: raw_output=False
:sample: raw_output=True
)rD   rL   rE   r   r    rF   rG   rH   rI   s      r#   rL   rM   `   sN   € ô %Ÿ\š\¬#¨d¯n©n×.CÑ.C×.JÑ.JÓ.LÓ*M×*TÑ*TÓ*VÓWˆÞØ—:‘:“<ÐØ�}‰}‹Ðr&   c                 ó   • g r:   r;   r)   s    r#   Úsha256ÚProvider.sha256n   s   € Ø r&   c                 ó   • g r:   r;   r@   s     r#   rR   rS   q   s   € Ø:=r&   c                 ó   • g r:   r;   r@   s     r#   rR   rS   t   s   € Ø9<r&   c                 óî   • [         R                  " [        U R                  R                  R	                  5       5      R                  5       5      nU(       a  UR                  5       $ UR                  5       $ )a  Generate a random SHA-256 hash.

If ``raw_output`` is ``False`` (default), a hexadecimal string representation of the SHA-256 hash
will be returned. If ``True``, a ``bytes`` object representation will be returned instead.

:sample: raw_output=False
:sample: raw_output=True
)rD   rR   rE   r   r    rF   rG   rH   rI   s      r#   rR   rS   w   sN   € ô %Ÿ^š^¬C°·±×0EÑ0E×0LÑ0LÓ0NÓ,O×,VÑ,VÓ,XÓYˆÞØ—:‘:“<ÐØ�}‰}‹Ðr&   c                 ó   • g r:   r;   r)   s    r#   Úuuid4ÚProvider.uuid4…   s   € Ør&   Úcast_toNc                 ó   • g r:   r;   ©r"   rZ   s     r#   rX   rY   ˆ   s   € Ø14r&   c                 ó   • g r:   r;   r\   s     r#   rX   rY   ‹   s   € ØADr&   c                 ó   • g r:   r;   r\   s     r#   rX   rY   Ž   s   € ØEHr&   c                 óŒ   • [         R                  " U R                  R                  R	                  S5      SS9nUb  U" U5      $ U$ )zúGenerate a random UUID4 object and cast it to another type if specified using a callable ``cast_to``.

By default, ``cast_to`` is set to ``str``.

May be called with ``cast_to=None`` to return a full-fledged ``UUID``.

:sample:
:sample: cast_to=None
é€   é   )ÚintÚversion)ÚuuidÚUUIDr   r    Úgetrandbits)r"   rZ   Úgenerated_uuids      r#   rX   rY   ‘   sB   € ô %)§I¢I°$·.±.×2GÑ2G×2SÑ2SÐTWÓ2XÐbcÑ$dˆØÑÙ˜>Ó*Ð*ØÐr&   Úspecial_charsÚdigitsÚ
upper_caseÚ
lower_casec                 ó  • Sn/ nU(       a9  UR                  U R                  R                  R                  S5      5        US-  nU(       aU  UR                  U R                  R                  R                  [        R
                  5      5        U[        R
                  -  nU(       aU  UR                  U R                  R                  R                  [        R                  5      5        U[        R                  -  nU(       aU  UR                  U R                  R                  R                  [        R                  5      5        U[        R                  -  n[        U5      oˆU:*  o™(       GdZ  [        R                  " SU	4SX�45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n
[        R                  " S	5      S
-   SU
0-  n[!        [        R"                  " U5      5      eS=p‰U R%                  XaS9n['        5       n[        U5      [        U5      :  a[  UR)                  U R                  R                  R+                  S[        U5      S-
  5      5        [        U5      [        U5      :  a  M[  [-        U5       H  u  pïX~   XÏ'   M     SR/                  U5      $ )aI  Generate a random password of the specified ``length``.

The arguments ``special_chars``, ``digits``, ``upper_case``, and ``lower_case`` control
what category of characters will appear in the generated password. If set to ``True``
(default), at least one character from the corresponding category is guaranteed to appear.
Special characters are characters from ``!@#$%^&*()_+``, digits are characters from
``0123456789``, and uppercase and lowercase characters are characters from the ASCII set of
letters.

:sample: length=12
:sample: length=40, special_chars=False, upper_case=False
Ú z!@#$%^&*()_+)ú<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py5)sÚlenÚrequired_tokensr,   )Úpy0Úpy1Úpy3Úpy5z3Required length is shorter than required charactersz
>assert %(py7)sÚpy7N)r,   r   r   )Úappendr   r    ÚchoiceÚstringri   Úascii_uppercaseÚascii_lowercasero   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanationÚrandom_choicesÚsetÚaddr!   Ú	enumerateÚjoin)r"   r,   rh   ri   rj   rk   Úchoicesrp   Ú@py_assert2Ú@py_assert4Ú@py_format6Ú@py_format8ÚcharsÚrandom_indexesÚiÚindexs                   r#   ÚpasswordÚProvider.password¤   s>  € ð( ˆØˆÞØ×"Ñ" 4§>¡>×#8Ñ#8×#?Ñ#?ÀÓ#OÔPØ�~Ñ%ˆGÞØ×"Ñ" 4§>¡>×#8Ñ#8×#?Ñ#?ÄÇÁÓ#NÔOØ”v—}‘}Ñ$ˆGÞØ×"Ñ" 4§>¡>×#8Ñ#8×#?Ñ#?Ä×@VÑ@VÓ#WÔXØ”v×-Ñ-Ñ-ˆGÞØ×"Ñ" 4§>¡>×#8Ñ#8×#?Ñ#?Ä×@VÑ@VÓ#WÔXØ”v×-Ñ-Ñ-ˆGä�?Ó#Ðd vÑ-×d×d×dÓdÐ#×d×d×d×d×dÕdŒs×d×d×dÑdŒs×d×d×d×d×dÖd�?×d×d×dÑd�?×d×dÕdÐ#×d×d×d×d×dÔd v×d×d×dÑd v×d×d×dÒdÐ/d×d×d×d×d×dÖdð ×(Ñ(¨Ð(Ð@ˆô $'£5ˆÜ�.Ó!¤C¨Ó$8Ó8Ø×Ñ˜tŸ~™~×4Ñ4×<Ñ<¸QÄÀEÃ
ÈQÁÓOÔPô �.Ó!¤C¨Ó$8Õ8ô " .Ö1‰HˆAØ*Ñ-ˆE‹Lñ 2ð �w‰w�u‹~Ðr&   Úuncompressed_sizeÚ	num_filesÚmin_file_sizeÚcompressionc                 óÚ  • [        [        U[        5      (       + =(       d    US:*  [        U[        5      (       + =(       d    US:*  [        U[        5      (       + =(       d    US:*  /5      (       a  [        S5      eX2-  U:”  a  [	        S5      eUS;   a  [
        R                  nO>US;   a  [
        R                  nO'US;   a  [
        R                  nO[
        R                  n[        R                  " 5       nUn[
        R                  " USUS9 n[        S	US	-   5       H�  n	U R                  R                  5       [!        U	5      -   n
XrU	-
  U-  -
  nX’:  a*  U R                  R"                  R%                  X;5      nX|-
  nOUnU R                  R'                  U5      nUR)                  X­5        M’     S
S
S
5        UR+                  5       $ ! , (       d  f       UR+                  5       $ = f)aY  Generate a bytes object containing a random valid zip archive file.

The number and sizes of files contained inside the resulting archive can be controlled
using the following arguments:

- ``uncompressed_size`` - the total size of files before compression, 16 KiB by default
- ``num_files`` - the number of files archived in resulting zip file, 1 by default
- ``min_file_size`` - the minimum size of each file before compression, 4 KiB by default

No compression is used by default, but setting ``compression`` to one of the values listed
below will use the corresponding compression type.

- ``'bzip2'`` or ``'bz2'`` for BZIP2
- ``'lzma'`` or ``'xz'`` for LZMA
- ``'deflate'``, ``'gzip'``, or ``'gz'`` for GZIP

:sample: uncompressed_size=256, num_files=4, min_file_size=32
:sample: uncompressed_size=256, num_files=32, min_file_size=4, compression='bz2'
r   úO`num_files`, `min_file_size`, and `uncompressed_size` must be positive integersúH`uncompressed_size` is smaller than the calculated minimum required size©Úbzip2Úbz2©ÚlzmaÚxz)ÚdeflateÚgzipÚgzÚw)Úmoder—   r   N)ÚanyÚ
isinstancerb   Ú
ValueErrorr‚   ÚzipfileÚ	ZIP_BZIP2ÚZIP_LZMAÚZIP_DEFLATEDÚ
ZIP_STOREDÚioÚBytesIOÚZipFiler0   r   ÚpystrrE   r    r!   r7   ÚwritestrÚgetvalue)r"   r”   r•   r–   r—   Úcompression_Ú
zip_bufferÚremaining_sizeÚ
zip_handleÚfile_numberÚfilenameÚmax_allowed_sizeÚ	file_sizeÚdatas                 r#   ÚzipÚProvider.zip×   s½  € ô4 ä˜y¬#Ó.Ô.×@°)¸q±.Ü˜}¬cÓ2Ô2×H°mÀqÑ6HÜÐ0´#Ó6Ô6×PÐ:KÈqÑ:Pð÷
ñ 
ô Øaóð ð Ñ$Ð'8Ó8Ü ØZóð ð Ð*Ó*Ü"×,Ñ,‰LØ˜NÓ*Ü"×+Ñ+‰LØÐ5Ó5Ü"×/Ñ/‰Lä"×-Ñ-ˆLä—Z’Z“\ˆ
Ø*ˆÜ�_Š_˜Z¨c¸|ÒLÐPZÜ$ Q¨	°A©Ö6�ØŸ>™>×/Ñ/Ó1´C¸Ó4DÑD�à#1ÀÑ5LÐP]Ñ4]Ñ#]Ð ØÓ*Ø $§¡× 5Ñ 5× =Ñ =¸mÓ ^�IØ%3Ñ%?‘Nà .�Ià—~‘~×,Ñ,¨YÓ7�Ø×#Ñ# HÖ3ñ  7÷ Mð ×"Ñ"Ó$Ð$÷ MÔLð ×"Ñ"Ó$Ð$ús   ÄB$GÇ
G*c                 óZ  • [        [        U[        5      (       + =(       d    US:*  [        U[        5      (       + =(       d    US:*  [        U[        5      (       + =(       d    US:*  /5      (       a  [        S5      eX2-  U:”  a  [	        S5      eSnUS;   a  SnOUS;   a  SnOUS	;   a  S
n[
        R                  " 5       nUn[        R                  " XVS9 n[        SUS-   5       GH
  n	[
        R                  " 5       n
U R                  R                  5       [        U	5      -   nXrU	-
  U-  -
  nX’:  a*  U R                  R                  R                  X<5      nX}-
  nOUn[        R                  " US9nU R                  R!                  U5      nU
R#                  U5        [%        U
R'                  5       5      Ul        U
R+                  S5        UR-                  Xê5        U
R/                  5         GM     SSS5        UR'                  5       $ ! , (       d  f       UR'                  5       $ = f)aA  Generate a bytes object containing a random valid tar file.

The number and sizes of files contained inside the resulting archive can be controlled
using the following arguments:

- ``uncompressed_size`` - the total size of files before compression, 16 KiB by default
- ``num_files`` - the number of files archived in resulting zip file, 1 by default
- ``min_file_size`` - the minimum size of each file before compression, 4 KiB by default

No compression is used by default, but setting ``compression`` to one of the values listed
below will use the corresponding compression type.

- ``'bzip2'`` or ``'bz2'`` for BZIP2
- ``'lzma'`` or ``'xz'`` for LZMA
- ``'gzip'`` or ``'gz'`` for GZIP

:sample: uncompressed_size=256, num_files=4, min_file_size=32
:sample: uncompressed_size=256, num_files=32, min_file_size=4, compression='bz2'
r   r™   rš   zw|)r¢   r£   zw|gzr›   zw|bz2rž   zw|xz)r¥   Úfileobjr   )ÚnameN)r¦   r§   rb   r¨   r‚   r®   r¯   ÚtarfileÚopenr0   r   r±   rE   r    r!   ÚTarInfor7   Úwritero   r³   ÚsizeÚseekÚaddfileÚclose)r"   r”   r•   r–   r—   r¥   Ú
tar_bufferr¶   Ú
tar_handler¸   Úfile_bufferr¹   rº   r»   Útarinfor¼   s                   r#   ÚtarÚProvider.tar  só  € ô4 ä˜y¬#Ó.Ô.×@°)¸q±.Ü˜}¬cÓ2Ô2×H°mÀqÑ6HÜÐ0´#Ó6Ô6×PÐ:KÈqÑ:Pð÷
ñ 
ô Øaóð ð Ñ$Ð'8Ó8Ü ØZóð ð 8<ˆØ˜.Ó(Ø‰DØÐ,Ó,Ø‰DØ˜NÓ*ØˆDä—Z’Z“\ˆ
Ø*ˆÜ�\Š\˜tÒ8¸JÜ$ Q¨	°A©×6�Ü Ÿjšj›l�ØŸ>™>×/Ñ/Ó1´C¸Ó4DÑD�à#1ÀÑ5LÐP]Ñ4]Ñ#]Ð ØÓ*Ø $§¡× 5Ñ 5× =Ñ =¸mÓ ^�IØ%3Ñ%?‘Nà .�Iä!Ÿ/š/¨xÑ8�Ø—~‘~×,Ñ,¨YÓ7�Ø×!Ñ! $Ô'Ü" ;×#7Ñ#7Ó#9Ó:�”Ø× Ñ  Ô#Ø×"Ñ" 7Ô8Ø×!Ñ!×#ñ#  7÷ 9ð& ×"Ñ"Ó$Ð$÷' 9Ô8ð& ×"Ñ"Ó$Ð$ús   ÃDHÈ
H*rÆ   Úimage_formatÚhueÚ
luminosityc           
      óÊ  •  SSK nSSKnUu  pgUR                  R                  SXR                  R                  X4S95      nUR                  R                  U5      n	U	R                  [        U R                  SS5      5       V
s/ s H&  o R                  SU5      U R                  SU5      4PM(     sn
U R                  R                  X4S9U R                  R                  X4S9S	9  [        R                  " 5        nUR                  X²S
9  UR!                  S5        UR#                  5       sSSS5        $ ! [         a    [        SS5      ef = fs  sn
f ! , (       d  f       g= f)aÛ  Generate an image and draw a random polygon on it using the Python Image Library.
Without it installed, this provider won't be functional. Returns the bytes representing
the image in a given format.

The argument ``size`` must be a 2-tuple containing (width, height) in pixels. Defaults to 256x256.

The argument ``image_format`` can be any valid format to the underlying library like ``'tiff'``,
``'jpeg'``, ``'pdf'`` or ``'png'`` (default). Note that some formats need present system libraries
prior to building the Python Image Library.
Refer to https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html for details.

The arguments ``hue`` and ``luminosity`` are the same as in the color provider and are simply forwarded to
it to generate both the background and the shape colors. Therefore, you can ask for a "dark blue" image, etc.

:sample: size=(2, 2), hue='purple', luminosity='bright', image_format='pdf'
:sample: size=(16, 16), hue=[90,270], image_format='ico'
r   Nz-`image` requires the `Pillow` python library.ÚimageÚRGB)rÑ   rÒ   é   é   )ÚfillÚoutline)Úformat)Ú	PIL.ImageÚPIL.ImageDrawÚImportErrorr   ÚImageÚnewr   ÚcolorÚ	ImageDrawÚDrawÚpolygonr0   Ú
random_intr®   r¯   ÚsaverÇ   Úread)r"   rÆ   rÐ   rÑ   rÒ   ÚPILÚwidthÚheightrÔ   Údrawr5   Úfobjs               r#   rÔ   ÚProvider.image`  s3  € ð0	_ÛÛ ð ‰ˆØ—	‘	—‘˜e T¯>©>×+?Ñ+?ÀCÐ+?Ð+_Ó`ˆØ�}‰}×!Ñ! %Ó(ˆØ�‰ÜNSÐTX×TcÑTcÐdeÐgiÓTjÔNkÓlÒNkÈ�o‰o˜a Ó'¨¯©¸¸FÓ)CÓDÑNkÑlØ—‘×%Ñ%¨#Ð%ÐEØ—N‘N×(Ñ(¨SÐ(ÐHð 	ñ 	
ô
 �ZŠZŒ\˜TØ�J‰J�tˆJÑ1Ø�I‰I�aŒLØ—9‘9“;÷ ‰\øô ó 	_Ü$Ð%TÐV]Ó^Ð^ð	_üò m÷ �\ús   ‚D5 Â-EÃ;0EÄ5EÅ
E"ÚdialectÚheaderÚdata_columnsÚnum_rowsÚinclude_row_idsÚ	fmtparamsc                 ó  • [        U[        5      (       a  US::  a  [        S5      e[        U[        [        45      (       d  [        S5      eUbI  [        U[        [        45      (       d  [        S5      e[        U5      [        U5      :w  a  [        S5      e[        R                  " 5       n[        R                  " U4SU0UD6nU(       a5  U(       a  [        U5      nUR                  SS5        UR                  U5        [        SUS-   5       H`  n	U V
s/ s H  o R                  R                  U
5      PM     nn
U(       a  UR                  S[!        U	5      5        UR                  U5        Mb     UR#                  5       $ s  sn
f )	aú  Generate random delimiter-separated values.

This method's behavior share some similarities with ``csv.writer``. The ``dialect`` and
``**fmtparams`` arguments are the same arguments expected by ``csv.writer`` to control its
behavior, and instead of expecting a file-like object to where output will be written, the
output is controlled by additional keyword arguments and is returned as a string.

The ``dialect`` argument defaults to ``'faker-csv'`` which is the name of a ``csv.excel``
subclass with full quoting enabled.

The ``header`` argument expects a list or a tuple of strings that will serve as the header row
if supplied. The ``data_columns`` argument expects a list or a tuple of string tokens, and these
string tokens will be passed to  :meth:`pystr_format() <faker.providers.python.Provider.pystr_format>`
for data generation. Argument Groups are used to pass arguments to the provider methods.
Both ``header`` and ``data_columns`` must be of the same length.

Example:
    fake.set_arguments('top_half', {'min_value': 50, 'max_value': 100})
    fake.dsv(data_columns=('{{ name }}', '{{ pyint:top_half }}'))

The ``num_rows`` argument controls how many rows of data to generate, and the ``include_row_ids``
argument may be set to ``True`` to include a sequential row ID column.

:sample: dialect='excel', data_columns=('{{name}}', '{{address}}')
:sample: dialect='excel-tab', data_columns=('{{name}}', '{{address}}'), include_row_ids=True
:sample: data_columns=('{{name}}', '{{address}}'), num_rows=5, delimiter='$'
r   z%`num_rows` must be a positive integerz(`data_columns` must be a tuple or a listz"`header` must be a tuple or a listz6`header` and `data_columns` must have matching lengthsrí   ÚIDr   )r§   rb   r¨   ÚlistÚtupleÚ	TypeErrorro   r®   ÚStringIOÚcsvÚwriterÚinsertÚwriterowr0   r   Úpystr_formatrE   r³   )r"   rí   rî   rï   rð   rñ   rò   Ú
dsv_bufferrú   Úrow_numÚcolumnÚrows               r#   ÚdsvÚProvider.dsv‹  s;  € ôJ ˜(¤C×(Ñ(¨H¸«MÜÐDÓEÐEÜ˜,¬¬u¨×6Ñ6ÜÐFÓGÐGØÑÜ˜f¤t¬U m×4Ñ4ÜÐ DÓEÐEÜ�6‹{œc ,Ó/Ó/Ü Ð!YÓZÐZä—[’[“]ˆ
Ü—’˜JÑE°ÐE¸9ÑEˆæÞÜ˜f›�Ø—‘˜a Ô&Ø�O‰O˜FÔ#ä˜Q ¨1¡Ö-ˆGÙEQÓRÂ\¸6—>‘>×.Ñ.¨vÖ6Á\ˆCÐRÞØ—
‘
˜1œc '›lÔ+à�O‰O˜CÖ ñ .ð ×"Ñ"Ó$Ð$ùò Ss   Ä$Fc                 ó(   • U R                  UUUUSS9$ )aÊ  Generate random comma-separated values.

For more information on the different arguments of this method, please refer to
:meth:`dsv() <faker.providers.misc.Provider.dsv>` which is used under the hood.

:sample: data_columns=('{{name}}', '{{address}}'), num_rows=10, include_row_ids=False
:sample: header=('Name', 'Address', 'Favorite Color'),
        data_columns=('{{name}}', '{{address}}', '{{safe_color_name}}'),
        num_rows=10, include_row_ids=True
Ú,©rî   rï   rð   rñ   Ú	delimiter©r  ©r"   rî   rï   rð   rñ   s        r#   rù   ÚProvider.csvÌ  ó)   € ð" �x‰xØØ%ØØ+Øð ð 
ð 	
r&   c                 ó(   • U R                  UUUUSS9$ )aÈ  Generate random tab-separated values.

For more information on the different arguments of this method, please refer to
:meth:`dsv() <faker.providers.misc.Provider.dsv>` which is used under the hood.

:sample: data_columns=('{{name}}', '{{address}}'), num_rows=10, include_row_ids=False
:sample: header=('Name', 'Address', 'Favorite Color'),
        data_columns=('{{name}}', '{{address}}', '{{safe_color_name}}'),
        num_rows=10, include_row_ids=True
Ú	r  r  r	  s        r#   ÚtsvÚProvider.tsvå  s)   € ð" �x‰xØØ%ØØ+Øð ð 
ð 	
r&   c                 ó(   • U R                  UUUUSS9$ )aÉ  Generate random pipe-separated values.

For more information on the different arguments of this method, please refer to
:meth:`dsv() <faker.providers.misc.Provider.dsv>` which is used under the hood.

:sample: data_columns=('{{name}}', '{{address}}'), num_rows=10, include_row_ids=False
:sample: header=('Name', 'Address', 'Favorite Color'),
        data_columns=('{{name}}', '{{address}}', '{{safe_color_name}}'),
        num_rows=10, include_row_ids=True
Ú|r  r  r	  s        r#   ÚpsvÚProvider.psvþ  r  r&   ÚindentÚclsc                 ó>   • U R                  XX4S9R                  5       $ )zÑ
Generate random JSON structure and return as bytes.

For more information on the different arguments of this method, refer to
:meth:`json() <faker.providers.misc.Provider.json>` which is used under the hood.
)rï   rð   r  r  )ÚjsonrF   )r"   rï   rð   r  r  s        r#   Ú
json_bytesÚProvider.json_bytes  s    € ð �y‰y lÈfˆyÐ^×eÑeÓgÐgr&   c                 óÌ  ^ ^	^
• SSS.nU(       a  UOUnS[         [           S[        4U
U 4S jjm
S[        [        [        [
        [        [        [        4   4   S[        4U	U 4S jjm	S[        [        [        4   S[        4U	U
4S	 jjnUS
:X  a  [        R                  " U" U5      X4S9$ [        U5       Vs/ s H
  ov" U5      PM     nn[        R                  " XƒUS9$ s  snf )a›  
Generate random JSON structure values.

Using a dictionary or list of records that is passed as ``data_columns``,
define the structure that is used to build JSON structures.  For complex
data structures it is recommended to use the dictionary format.

Data Column Dictionary format:
    {'key name': 'definition'}

The definition can be 'provider', 'provider:argument_group', tokenized
'string {{ provider:argument_group }}' that is passed to the python
provider method pystr_format() for generation, or a fixed '@word'.
Using Lists, Tuples, and Dicts as a definition for structure.

Example:
    fake.set_arguments('top_half', {'min_value': 50, 'max_value': 100})
    fake.json(data_columns={'Name': 'name', 'Score': 'pyint:top_half'})

Data Column List format:
    [('key name', 'definition', {'arguments'})]

With the list format the definition can be a list of records, to create
a list within the structure data.  For literal entries within the list,
set the 'field_name' to None.

:param data_columns: specification for the data structure
:type data_columns: dict
:param num_rows: number of rows the returned
:type num_rows: int
:param indent: number of spaces to indent the fields
:type indent: int
:param cls: optional json encoder to use for non-standard objects such as datetimes
:type cls: json.JSONEncoder
:return: Serialized JSON data
:rtype: str

:sample: data_columns={'Spec': '@1.0.1', 'ID': 'pyint',
        'Details': {'Name': 'name', 'Address': 'address'}}, num_rows=2
:sample: data_columns={'Candidates': ['name', 'name', 'name']},
        num_rows=1
:sample: data_columns=[('Name', 'name'), ('Points', 'pyint',
        {'min_value': 50, 'max_value': 100})], num_rows=1
ú{{name}}ú{{address}})rÁ   Ú	residencyr¼   r   c                 ó–  >• 0 nU  Hº  tp#nU(       a  US   O0 n[        U[        5      (       d  [        S5      eUc  TR                  " U40 UD6s  $ [        U[        5      (       a  T" U5      X'   Ml  [        U[
        [        45      (       a  U Vs/ s H  nT" U/5      PM     snX'   M¥  TR                  " U40 UD6X'   M¼     U$ s  snf )Nr   ú,Invalid arguments type. Must be a dictionary)r§   Údictr÷   Ú_value_format_selectionrö   rõ   r…   )	r¼   ÚentryrÁ   Ú
definitionÚ	argumentsÚkwargsÚitemÚprocess_list_structurer"   s	          €€r#   r'  Ú-Provider.json.<locals>.process_list_structure_  sÄ   ø€ Ø$&ˆEã04Ð,� 9Þ)2˜ 1š¸�ä! &¬$×/Ñ/Ü#Ð$RÓSÐSà‘<Ø×7Ò7¸
ÑMÀfÑMÒMä˜j¬%×0Ñ0Ù"8¸Ó"D�E“KÜ 
¬T´3¨K×8Ñ8ÙNXÓ"YÊjÀdÑ#9¸4¸&Ö#AÉjÑ"Y�E“Kà"&×">Ò">¸zÑ"TÈVÑ"T�E“Kñ 15ð ˆLùò #Zs   ÂCc                 óÄ  >• 0 n[        U [        5      (       a  TR                  U 5      $ [        U [        5      (       aœ  U R	                  5        H†  u  p#[        U[
        [        [        45      (       a  U Vs/ s H  nT" U5      PM     snX'   MB  [        U[        [        [        [        45      (       a  T" U5      X'   Ms  TR                  U5      X'   Mˆ     U$ U $ s  snf r:   )r§   rE   r!  r   Úitemsrö   rõ   r…   rb   ÚfloatÚbool)r¼   r"  rÁ   r#  r&  Úprocess_dict_structurer"   s        €€r#   r-  Ú-Provider.json.<locals>.process_dict_structures  s¾   ø€ Ø$&ˆEä˜$¤×$Ñ$Ø×3Ñ3°DÓ9Ð9ä˜$¤×%Ñ%Ø(,¯
©
®Ñ$�DÜ! *¬u´d¼CÐ.@×AÑAÙPZÓ&[ÒPZÈÑ'=¸dÖ'CÑPZÑ&[˜›Ü# J´´s¼EÄ4Ð0H×IÑIÙ&<¸ZÓ&H˜›à&*×&BÑ&BÀ:Ó&N˜›ñ )5ð �àˆKùò '\s   Á8Crï   c                 óŽ   >• [        U [        5      (       a  T" U 5      $ [        U [        5      (       a  T" U 5      $ [        S5      e)Nz7Invalid data_columns type. Must be a dictionary or list)r§   r   rõ   r÷   )rï   r-  r'  s    €€r#   Úcreate_json_structureÚ,Provider.json.<locals>.create_json_structure…  s?   ø€ Ü˜,¬×-Ñ-Ù-¨lÓ;Ð;ä˜,¬×-Ñ-Ù-¨lÓ;Ð;äÐUÓVÐVr&   r   )r  r  )r
   r   r   rb   r+  r,  r   rE   r   r   r  Údumpsr0   )r"   rï   rð   r  r  Údefault_data_columnsr0  r5   r¼   r-  r'  s   `        @@r#   r  ÚProvider.json&  sæ   ú€ ðh Ø&ñ 
Ðö ;G©,ÐL`ˆð	¬´#©ð 	¼3÷ 	ð 	ð(	¬¬s´E¼4ÄÄcÌ3ÀhÁÐ/OÑ)Pð 	ÔUX÷ 	ð 	ð$	W´´d¼D°jÑ0Að 	WÄd÷ 	Wð 	Wð �q‹=Ü—:’:Ñ3°LÓAÈ&ÑZÐZä=BÀ8¼_ÓMº_¸Ð% lÖ3¹_ˆÐMÜ�zŠz˜$°3Ñ7Ð7ùò Ns   Â9C!Únb_elementsÚvariable_nb_elementsÚvalue_typesÚallowed_typesc                 óÒ   •  SSK nU R                  R	                  UUUUS9nU R                  R                  5       U0nUR                  U5      $ ! [         a    [        SS5      ef = f)zï
Returns some XML.

:nb_elements: number of elements for dictionary
:variable_nb_elements: is use variable number of elements for dictionary
:value_types: type of dictionary values

Note: this provider required xmltodict library installed
r   Nz.`xml` requires the `xmltodict` Python library.Úxml)r5  r6  r7  r8  )Ú	xmltodictrÝ   r   r   ÚpydictÚwordÚunparse)r"   r5  r6  r7  r8  r;  Ú_dicts          r#   r:  ÚProvider.xml”  s~   € ð 	^Ûð —‘×%Ñ%Ø#Ø!5Ø#Ø'ð	 &ð 
ˆð —‘×$Ñ$Ó&¨Ð.ˆØ× Ñ  Ó'Ð'øô ó 	^Ü$Ð%UÐW\Ó]Ð]ð	^ús   ‚A ÁA&Úalignc           	      ó¢  • SSSSS04/nUc  UnSSS	S
.n/ n[        U5       Hš  n/ nU Ho  tpšnU(       a  US   O0 n[        U[        5      (       d  [        S5      eU R                  " U
40 UD6nUR                  XÕR                  US5       U	 3 SU	 5        Mq     UR                  SR                  U5      5        Mœ     SR                  U5      $ )a,  
Generate random fixed width values.

Using a list of tuple records that is passed as ``data_columns``, that
defines the structure that will be generated. Arguments within the
record are provider specific, and should be a dictionary that will be
passed to the provider method.

Data Column List format
    [('field width', 'definition', {'arguments'})]

The definition can be 'provider', 'provider:argument_group', tokenized
'string {{ provider:argument_group }}' that is passed to the python
provider method pystr_format() for generation, or a fixed '@word'.
Using Lists, Tuples, and Dicts as a definition for structure.

Argument Groups can be used to pass arguments to the provider methods,
but will override the arguments supplied in the tuple record.

Example:
    fake.set_arguments('top_half', {'min_value': 50, 'max_value': 100})
    fake.fixed_width(data_columns=[(20, 'name'), (3, 'pyint:top_half')])

:param data_columns: specification for the data structure
:type data_columns: list
:param num_rows: number of rows the generator will yield
:type num_rows: int
:param align: positioning of the value. (left, middle, right)
:type align: str
:return: Serialized Fixed Width data
:rtype: str

:sample: data_columns=[(20, 'name'), (3, 'pyint', {'min_value': 50,
        'max_value': 100})], align='right', num_rows=2
)é   rÁ   rÖ   ÚpyintÚ	max_valuerC  NÚ<Ú^Ú>)ÚleftÚmiddleÚrightr   r  rm   Ú
)r0   r§   r   r÷   r!  rv   Úgetrˆ   )r"   rï   rð   rA  r3  Ú	align_mapr¼   r5   r  rè   r#  r$  r%  Úresults                 r#   Úfixed_widthÚProvider.fixed_width±  sñ   € ðJ Ø�˜+ rÐ*Ð+ð 
Ðð ÑØ(<ˆLàØØñ
ˆ	ð
 ˆä�x–ˆAØˆCã1=Ð-� IÞ)2˜ 1š¸�ä! &¬$×/Ñ/Ü#Ð$RÓSÐSà×5Ò5°jÑKÀFÑK�Ø—
‘
˜f§m¡m°E¸3Ó&?Ð%@ÀÀÐ$GÐHÈ&È5ÐQÖRñ 2>ð �K‰K˜Ÿ™ ›Ö%ñ !ð �y‰y˜‹Ðr&   r#  r%  c                 ó
  • [         R                  " SU5      (       a  U R                  R                  U5      $ [         R                  " SU5      (       a  UR	                  S5      $ [         R                  " SU5      (       ag  UR                  S5      u  pU R                  R                  UR                  5       5      nU R                  R                  " UR                  5       40 UD6$ U R                  R                  " U40 UD6$ )aa  
Formats the string in different ways depending on its contents.

The return can be the '@word' itself, a '{{ token }}' passed to PyStr,
or a 'provider:argument_group' format field that returns potentially
a non-string type.

This ensures that Numbers, Boolean types that are generated in the
JSON structures in there proper type, and not just strings.
z.*\{\{.*\}\}.*z^@.*Ú@z^[a-zA-Z0-9_-]*:\wÚ:)	ÚreÚmatchr   rý   ÚlstripÚsplitÚget_argumentsÚstriprÚ   )r"   r#  r%  Úargument_groupr$  s        r#   r!  Ú Provider._value_format_selectionñ  sÒ   € ô �8Š8Ð% z×2Ñ2Ø—>‘>×.Ñ.¨zÓ:Ð:ô �8Š8�G˜Z×(Ñ(Ø×$Ñ$ SÓ)Ð)ô �8Š8Ð)¨:×6Ñ6Ø)3×)9Ñ)9¸#Ó)>Ñ&ˆJØŸ™×4Ñ4°^×5IÑ5IÓ5KÓLˆIà—>‘>×(Ò(¨×)9Ñ)9Ó);ÑI¸yÑIÐIð �~‰~×$Ò$ ZÑ:°6Ñ:Ð:r&   r;   )é2   )i   )F)é
   TTTT)i   r   i   N))r.   r.   ÚpngNN)r   N©r  r  r^  F)Nr`  r^  F)Nr^  NN)r^  TNN)Nr^  rI  ),Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rb   r,  r$   r	   r*   r2   r7   r   rE   r<   r   r   rL   rR   rX   rd   re   r   r’   r½   rÎ   r   r
   rÔ   r   r  rù   r  r  r   r   r   r  r  r   r:  ÚDataColumnsrP  r!  Ú__static_attributes__r;   r&   r#   r   r      s`  † ñO¨cð O¸4õ Oð0˜h t™nô 0ñ"˜Sð "¸õ "ð  Ø�SÓó ØàØ:˜g d™mÐ:°Ó:ó Ø:àØ9˜g e™nÐ9°Ó9ó Ø9ñ˜dð ¨u°U¸C°ZÑ/@õ ð Ø�cÓó ØàØ;˜w t™}Ð;°Ó;ó Ø;àØ:˜w u™~Ð:°#Ó:ó Ø:ñ˜tð °°e¸S°jÑ0Aõ ð Ø ˜Ó ó Ø àØ= ¨¡Ð=°5Ó=ó Ø=àØ< ¨¡Ð<°CÓ<ó Ø<ñ ð °%¸¸s¸
Ñ2Cõ ð Ø�sÓó ØàØ4˜TÐ4 d§i¡iÓ4ó Ø4àØD˜X t§y¡y k°3Ð&6Ñ7ÐD¸CÓDó ØDàØH˜X t§y¡y k°5Ð&8Ñ9ÐH¸eÓHó ØHð ^añà˜% ¨$¯)©)¨°cÐ)9Ñ :¸HÀdÇiÁiÀ[ÐRWÐEWÑ<XÐ XÑYÑZðð 
ˆu�c˜4Ÿ9™9Ð$Ñ	%õð* Ø"ØØØñ1àð1ð ð1ð ð	1ð
 ð1ð ð1ð 
õ1ðj "'ØØ!Ø%)ñ@%àð@%ð ð@%ð ð	@%ð
 ˜c‘]ð@%ð 
õ@%ðH "'ØØ!Ø%)ñE%àðE%ð ðE%ð ð	E%ð
 ˜c‘]ðE%ð 
õE%ðR !+Ø!Ø8<Ø$(ñ)à�C˜�H‰oð)ð ð)ð �e˜C ¨#¡°Ð3Ñ4Ñ5ð	)ð
 ˜S‘Mð)ð 
õ)ðZ #Ø*.Ø(CØØ %ñ?%àð?%ð ˜ #™Ñ'ð?%ð ˜C ˜H‘oð	?%ð
 ð?%ð ð?%ð ð?%ð 
õ?%ðF +/Ø(CØØ %ñ
à˜ #™Ñ'ð
ð ˜C ˜H‘oð
ð ð	
ð
 ð
ð 
õ
ð6 +/Ø(CØØ %ñ
à˜ #™Ñ'ð
ð ˜C ˜H‘oð
ð ð	
ð
 ð
ð 
õ
ð6 +/Ø(CØØ %ñ
à˜ #™Ñ'ð
ð ˜C ˜H‘oð
ð ð	
ð
 ð
ð 
õ
ð6 (,ØØ $Ø+/ñhà˜t‘nðhð ðhð ˜‘ð	hð
 �d˜;Ñ'Ñ(ðhð 
õhð" (,ØØ $Ø+/ñl8à˜t‘nðl8ð ðl8ð ˜‘ð	l8ð
 �d˜;Ñ'Ñ(ðl8ð 
õl8ð` Ø%)Ø+/Ø-1ñ(àð(ð #ð(ð ˜iÑ(ð	(ð
   	Ñ*ð(ð 
õ(ñ:>¨°Ñ(=ð >ÐPSð >Ðadð >Ðruõ >ð@;°#ð ;Àð ;ÈÈsÐTWÈxÉ÷ ;r&   r   )-Úbuiltinsr}   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter{   rù   rD   r®   r  r3   rU  rx   rÂ   rd   r©   r   Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   Úfaker.exceptionsr   rm   r   Úpythonr   Ú	localizedÚregister_dialectÚexcelÚ	QUOTE_ALLrb   rE   Ú
ColumnSpecre  r   r;   r&   r#   Ú<module>rs     s£   ðß  „ ƒ
Û Û 	Û Û 	Û 	Û Û Û Û å ß l× l× lÓ lå /å Ý à€	à × Ò �[ #§)¡)°S·]±]Ò Cð �5˜˜c˜‘? E¨#¨s°D¸¸c¸±NÐ*BÑ$CÐCÑD€
Ø�:Ñ€ôp;ˆ|õ p;r&   