7,jUdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZmZddlmZmZmZmZmZmZddlmZmZdd lmZdd lmZdd l m!Z!m"Z"m#Z#m$Z$dd l%m&Z'dd l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5ddl(m6Z7ddl8m9Z9ddl:m;Z;mZ>ddl?m@Z@erddlAmBZBddlmCZCddlm%ZDddlEmFZFmGZGmHZHdZIdeJd<ejKZLdeJd<dddZMdeJd<edZNed ZOd!PejQd"ed#$d%ZRdeJd&<e jSd'krdd+ZTdd,Z/dd0ZUdd4ZV ddd:ZWdd=ZXdd?ZYejZddBZ[ddFZ\eddHZ]eddKZ]ddNZ]ddPZ^ddRZ_dddTZ`ddWZaddZZbdd\Zcdd_ZdddbZeddhZfeddnZgeddpZgddsZgdduZheidvZjdeJdw<ddyZkddzZldd}ZmddZnddZoddZpejZddZqddZrdddZsddZt dddZudddZvddZwddZxdydZzezdzZ{ezdzZ|ddZ}ddZ~ddZddZddZddZddZdS)z requests.utils ~~~~~~~~~~~~~~ This module provides utility functions that are used within Requests that are also useful for external consumption. ) annotationsN) OrderedDict) GeneratorIterable) TYPE_CHECKINGAnyFinalTypeVarcastoverload) make_headers parse_url)certs __version__)_HEADER_VALIDATORS_BYTE_HEADER_VALIDATORS_STRHEADER_VALIDATORSto_native_string) SupportsItems) Mappingbytes getproxiesgetproxies_environment integer_types is_urllib3_1 proxy_bypassproxy_bypass_environmentquotestrunquoteurlparse urlunparse)parse_http_listcookiejar_from_dict)FileModeWarning InvalidHeader InvalidURLUnrewindableBodyError)CaseInsensitiveDict) CookieJar)BufferedWriter)_types)PreparedRequestRequestResponse)z.netrc_netrcr NETRC_FILESr!DEFAULT_CA_BUNDLE_PATHPi)httphttps DEFAULT_PORTS_KT_VTz, z,\s*T)accept_encodingzaccept-encodingDEFAULT_ACCEPT_ENCODINGwin32hostreturnboolcl ddl}n#t$rYdSwxYw ||jd}t ||dd}||dd}n#t tf$rYdSwxYw|r|sdS|d}td|}|D]t}|dkrd|vrd S| dd }| d d }| d d}tj ||tj rd SudS)NrFz;Software\Microsoft\Windows\CurrentVersion\Internet Settings ProxyEnable ProxyOverride;z.Tz\.*z.*?)winreg ImportErrorOpenKeyHKEY_CURRENT_USERint QueryValueExOSError ValueErrorsplitfilterreplacerematchI)r?rIinternetSettings proxyEnable proxyOverridetests >C:\PYTHON\GemmaClient\venv\Lib\site-packages\requests/utils.pyproxy_bypass_registryr\cs  MMMM   55  %~~(N    f112BMRRSTUVVK"//0@/RRSTUMM$   55  - 5 &++C00 t]33 !  Dy  d??44<<U++D<<U++D<<T**DxdBD)) tt us A A::BBcZtrt|St|S)zReturn True, if the host should be bypassed. Checks proxy settings gathered from the environment, if specified, or the registry. )rrr\)r?s r[rrs. " # # /+D11 1(.. .d6_t.SupportsItems[Any, Any] | Iterable[tuple[Any, Any]]Iterable[tuple[Any, Any]]cXt|tr|S|S)z/Returns an internal sequence dictionary update.) isinstance_SupportsItemsitems)r_s r[dict_to_sequencerfs) !^$$wwyy Hr^orrMcHd}d}ts*t|tr|d}t |drt |}nt |dr|j}n~t |drn |}tj|j }d|j vrtj dtn#tjt f$rYnwxYwt |dr |}t |d rW|U |dd |}||pdn'#t&$rd}YnwxYwn#t&$r||}YnwxYw|d}t)d||z S) Nrutf-8__len__lenfilenoba%Requests has determined the content-length for this request using the binary size of the file: however, the file has been opened in text mode (i.e. without the 'b' flag in the mode). This may lead to an incorrect content-length. In Requests 3.0, support will be removed for files in text mode.tellseek)rrcr!encodehasattrrkrlosfstatst_sizemodewarningswarnr(ioUnsupportedOperationAttributeErrorrnrorOmax)rg total_lengthcurrent_positionrls r[ super_lenrsL Jq#.. HHW  q)1vv E  u H   XXZZF8F++3L!&   2$   '8    D  .q&% % vvxx q&!! %l&: %FF1aLLL#$6688LFF+0q1111%%%#$LLL%% 0 0 0 '#/  0* q,!11 2 22s7?CC)(C)=E9$AE&& E54E59F  F Furl _t.UriType raise_errorstuple[str, str] | Nonect|tr|d}tjd}||f}ndt D} ddlm}m}d}|D]D}tj |}tj |r|}nE|dSt|} | j } | dS ||| } | r/t| r"| drdnd} | | pd| d pdfSdSdS#|t f$r|rYdSwxYw#t"t$f$rYdSwxYw) z;Returns the Requests tuple auth for a given url from netrc.riNETRCNc3 K|] }d|V dS)z~/N).0fs r[ z!get_netrc_auth..s(99888999999r^r)NetrcParseErrornetrcrrp)rcrdecodersenvirongetr4rrpath expanduserexistsr#hostnameauthenticatorsanyrOrJr{) rr netrc_filenetrc_locationsrr netrc_pathrlocrir?r3login_is r[get_netrc_authrs #u"jj!!((J%-99[999# 00000000    A'$$Q''Cw~~c""      F c]]{ < F U:&&55d;;F @#f++ @%ay/!!aw-2vayB?? @ @ @ @ )          (     s8"AD;7D;AD%%D84D;7D88D;;EEobj str | Nonect|dd}|rSt|ttfr9|ddkr/|ddkr%tj|SdSdSdSdS)z0Tries to guess the filename of the given object.nameNr<>)getattrrcr!rrsrbasename)rrs r[guess_filenamers{ 3 % %D & 4#u..&47c>>d2hRUoow%%%&&&&>>oor^rcftj|r|Stj|\}}|r|tj|s]tj|\}}|sn8d||g}|rtj|]t j|s|St j|}||vr|Stj |ddd}tj |\}} tj || |tj|n#tj|wxYw|S)zReplace nonexistent paths that look like they refer to a member of a zip archive with the location of an extracted copy of the target, or else just return the provided path unchanged. /r)suffix)rsrrrQjoinzipfile is_zipfileZipFilenamelistsplitexttempfilemkstempwritereadclose)rarchivememberprefixzip_filerfdextracted_paths r[extract_zipped_pathsr"s  w~~d gmmD))OGV ,"'..11,'--00  66*++ ,"'..11,  g & & w''H X&&(((( W  fll3//3 4 4R 8F!)888B X]]6**+++   s (FF.filename%Generator[BufferedWriter, None, None]c#HKtjtj|\}} tj|d5}|Vdddn #1swxYwYtj||dS#t$rtj|wxYw)z-Write a file to the disk in an atomic fashion)dirwbN) rrrsrdirnamefdopenrS BaseExceptionremove)rtmp_descriptortmp_name tmp_handlers r[ atomic_openrHs (/BGOOH4M4MNNNNH Y~t , ,                     8X&&&&&  ( s/BA BA##B&A#'B B!value4Mapping[Any, Any] | Iterable[tuple[Any, Any]] | Nonedict[Any, Any] | Nonec|dSt|ttttfrt dt |S)aTake an object and test to see if it can be represented as a dictionary. Unless it can not be represented as such, return an OrderedDict, e.g., :: >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') Traceback (most recent call last): ... ValueError: cannot encode objects that are not 2-tuples >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) :rtype: OrderedDict N+cannot encode objects that are not 2-tuples)rcr!rrArMrPrrs r[from_key_val_listrUsG( }t%#udC011HFGGG u  r^NonecdSNrrs r[to_key_val_listrrs*-#r^6_t.SupportsItems[_KT, _VT] | Iterable[tuple[_KT, _VT]]list[tuple[_KT, _VT]]cdSrrrs r[rrts  Cr^=_t.SupportsItems[_KT, _VT] | Iterable[tuple[_KT, _VT]] | Nonelist[tuple[_KT, _VT]] | Nonec|dSt|ttttfrt dt|t r!t|St|S)aTake an object and test to see if it can be represented as a dictionary. If it can be, return a list of tuples, e.g., :: >>> to_key_val_list([('key', 'val')]) [('key', 'val')] >>> to_key_val_list({'key': 'val'}) [('key', 'val')] >>> to_key_val_list('string') Traceback (most recent call last): ... ValueError: cannot encode objects that are not 2-tuples :rtype: list Nr) rcr!rrArMrPrdlistrers r[rrxsm& }t%#udC011HFGGG%((#EKKMM""" ;;r^ list[str]cg}t|D]N}|dd|ddcxkrdkrnnt|dd}||O|S)aParse lists as described by RFC 2068 Section 2. In particular, parse comma-separated lists where the elements of the list may include quoted-strings. A quoted-string could contain a comma. A non-quoted string could have quotes in the middle. Quotes are removed automatically after parsing. It basically works like :func:`parse_set_header` just that items may appear multiple times and case sensitivity is preserved. The return value is a standard :class:`list`: >>> parse_list_header('token, "quoted value"') ['token', 'quoted value'] To create a header from the :class:`list` again, use the :func:`dump_header` function. :param value: a string with a list header. :return: :class:`list` :rtype: list Nrr")_parse_list_headerunquote_header_valueappend)rresultitems r[parse_list_headerrs.F"5)) 8tBCCy ' ' ' 'C ' ' ' ' ''QrT 33D d Mr^dict[str, str | None]ci}t|D]a}d|vrd||< |dd\}}|dd|ddcxkrdkrnnt|dd}|||<b|S)a^Parse lists of key, value pairs as described by RFC 2068 Section 2 and convert them into a python dict: >>> d = parse_dict_header('foo="is a fish", bar="as well"') >>> type(d) is dict True >>> sorted(d.items()) [('bar', 'as well'), ('foo', 'is a fish')] If there is no value for a key it will be `None`: >>> parse_dict_header('key_without_value') {'key_without_value': None} To create a header from the :class:`dict` again, use the :func:`dump_header` function. :param value: a string with a dict header. :return: :class:`dict` :rtype: dict =Nrrr)rrQr)rrrrs r[parse_dict_headerrs,%'F"5)) d??F4L jja(( e !9bcc ) ) ) )c ) ) ) ) )(qt55Et Mr^ is_filenamec|r`|d|dcxkrdkrGnnD|dd}|r|dddkr*|ddd dS|S) zUnquotes a header value. (Reversal of :func:`quote_header_value`). This does not use the real unquoting but what browsers are actually using for quoting. :param value: the header value to unquote. :rtype: str rrrrNrpz\\\z\")rS)rrs r[rrs CqU2Y----#----- ad  CeBQBi611==..66ucBB B Lr^cjr-cd|D}|S)zReturns a key/value dictionary from a CookieJar. :param cj: CookieJar object to extract cookies from. :rtype: dict c(i|]}|j|jSr)rr)rcookies r[ z'dict_from_cookiejar..s>>>6; >>>r^rr cookie_dicts r[dict_from_cookiejarrs?>2>>>K r^rdict[str, str]c"t||S)zReturns a CookieJar from a key/value dictionary. :param cj: CookieJar to insert cookies into. :param cookie_dict: Dict of key/values to insert into CookieJar. :rtype: CookieJar r&rs r[add_dict_to_cookiejarrs {B / //r^contentc`tjdttjdtj}tjdtj}tjd}||||z||zS)zlReturns encodings from given content string. :param content: bytestring to extract encodings from. zIn requests 3.0, get_encodings_from_content will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)z!])flagsz+]z$^<\?xml.*?encoding=["\']*(.+?)["\'>])rwrxDeprecationWarningrTcompilerVfindall)r charset_re pragma_rexml_res r[get_encodings_from_contentr s  M 1  @MMMJ IQSQUVVVI Z? @ @F 7##   G $ $ % .. ! ! "r^headertuple[str, dict[str, Any]]c|d}|d|dd}}i}d}|D]}|}|ro|dx}dkrT|d||}||dzd|} | ||<||fS)zReturns content type and parameters from given header. :param header: string :return: tuple containing content type and dictionary of parameters. rErrNz"' rr)rQstripfindlower) rtokens content_typeparams params_dict strip_charsparamidxkeyrs r[_parse_content_type_headerr#s\\#  F!!9??,,fQRRj&L)+KK--   -UZZ__,c33+##K00C#'))$**;77E',K $  $$r^headersCaseInsensitiveDict[str]c|d}|sdSt|\}}d|vr|ddSd|vrdSd|vrdSdS) z}Returns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. :rtype: str z content-typeNcharsetz'"textz ISO-8859-1zapplication/jsonri)rrr)rrr s r[get_encoding_from_headersr9s;;~..L t5lCCL&Fi &&u--- |\))w*)r^iteratorIterable[bytes]rr2"Generator[str | bytes, None, None]c#K|j |Ed{VdStj|jd}|D]}||}|r|V|dd}|r|VdSdS)zStream decodes an iterator.NrSerrorsr^T)final)encodingcodecsgetincrementaldecoderr)rrdecoderchunkrvs r[stream_decode_response_unicoder$Rs  z6f*1:66iHHHG ^^E " "  HHH 4 ( (B r^stringr slice_length int | NoneGenerator[bytes, None, None]cdSrrr%r&s r[ iter_slicesr+es $'3r^Generator[str, None, None]cdSrrr*s r[r+r+is "%r^ bytes | str"Generator[bytes | str, None, None]c#Kd}||dkrt|}|t|kr)||||zV||z }|t|k'dSdS)z Iterate over slices of a string.rN)rk)r%r&poss r[r+r+ms} C|q006{{ F  S3--.... | F      r^str | bytes | NonecPtjdt|jdSg}t |j}|r; t |j|S#t$r||YnwxYw t |j|pddS#t$r |jcYSwxYw)zReturns the requested content back in unicode. :param r: Response object to get unicode content from. Tried: 1. charset from content-type 2. fall back and replace all unicode characters :rtype: str zIn requests 3.0, get_unicode_from_response will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)NrirSr) rwrxrrrrr! UnicodeErrorr TypeError)rtried_encodingsrs r[get_unicode_from_responser7ys M 1   yt!#O)33H- -qy(++ + - - -  " "8 , , , , , -19h1')DDDD ys#AA43A48BB%$B%zBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~UNRESERVED_SETuric|d}tdt|D]}||dd}t|dkr|ro t t |d}n!#t $rtd|dwxYw|tvr|||ddz||<d||||<d||||<d |S) zUn-escape any percent-escape sequences in a URI that are unreserved characters. This leaves all reserved, illegal and non-ASCII bytes encoded. :rtype: str %rrrpz"Invalid percent-escape sequence: ''Nr) rQrangerkisalnumchrrMrPr*r8r)r9partsihcs r[unquote_unreservedrEs IIcNNE 1c%jj ! ! & & !HQqSM q66Q;;199;;; LAr OO L L L !Ja!J!J!JKKK LN""uQx|+a)uQx>>a%58~~E!HH 775>>s -B  B)cd}d} tt||S#t$rt||cYSwxYw)zRe-quote the given URI. This function passes the given URI through an unquote/quote cycle to ensure that it is fully and consistently quoted. :rtype: str z!#$%&'()*+,/:;=?@[]~z!#$&'()*+,/:;=?@[]~)safe)r rEr*)r9safe_with_percentsafe_without_percents r[ requote_urirJsk/0 5',,3DEEEE 555S3444444 5s$AAipnetc tjdtj|d}|d\}}tjdtjt t |d}tjdtj|d|z}||z||zkS)zThis function allows you to check if an IP belongs to a network subnet Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 :rtype: bool z=Lrr)structunpacksocket inet_atonrQdotted_netmaskrM)rKrLipaddrnetaddrbitsnetmasknetworks r[address_in_networkrXs]4!1"!5!5 6 6q 9FIIcNNMGTmD&"2>#d))3L3L"M"MNNqQGmD&"27";";<I)rP inet_ntoarNpack)rYrUs r[rRrRs8 b4i1, ,D  FKd33 4 44r^ string_ipcT tj|n#t$rYdSwxYwdS)z :rtype: bool FT)rPrQrO)r^s r[is_ipv4_addressr`sB#### uu 4s  %%string_networkcN|ddkr t|dd}n#t$rYdSwxYw|dks|dkrdS t j|ddn#t $rYdSwxYwdSdS)zV Very simple check of the cidr format in no_proxy variable. :rtype: bool rrFr[rT)countrMrQrPrPrQrO)rarYs r[ is_valid_cidrrds C  A%% ~++C00344DD   55  !88tbyy5   ^11#66q9 : : : :   55 u 4s#(A AA$-B B B env_nameGenerator[None, None, None]c#K|du}d}|r.tj|}|tj|< dV|r"|tj|=dS|tj|<dSdS#|r|tj|=n|tj|<wxYw)zSet the environment variable 'env_name' to 'value' Save previous value, yield, and then restore the previous value stored in the environment variable 'env_name'. If 'value' is None, do nothingN)rsrr)rer value_changed old_values r[ set_environrjs%M I%JNN8,, $ 81   1 Jx((('0 8$$$  1 1= 1 Jx(('0 8$0000s A$$#Bno_proxycdd}|}| |d}t|}|j}|dS|rd |d d d D}t |r2|D].}t |rt ||rdS%||krdS/nq|}|jr |d |jz }|D]X} | d} || ks|| krdSd| z} | | s| | rdSYtd|5 t|} n#ttjf$rd} YnwxYwdddn #1swxYwY| rdSdS)zL Returns whether we should bypass proxies or not. :rtype: bool rr!r@rctj|p0tj|Sr)rsrrupper)rs r[ get_proxyz(should_bypass_proxies..get_proxy3s1z~~c""AbjnnSYY[[&A&AAr^NrkTc3K|]}||V dSrr)rr?s r[rz(should_bypass_proxies..Es(XX4SWX$XXXXXXr^ r,:rFF)rr!r@r)r#rrSrQr`rdrXportlstripendswithrjrr5rPgaierror) rrkro no_proxy_argparsedrno_proxy_hostsproxy_iphost_with_portr?bypasss r[should_bypass_proxiesr~*sVBBBB L9Z(( c]]FHt YX8+;+;C+D+D+J+J3+O+OXXX 8 $ $ *   ** )(H==$#tt$)) 44*  &N{ 4"3fk"3"33&  {{3''t##~'='=44Tz$$T** n.E.Ed.K.K 44  Z . . !(++FF6?+   FFF  t 5s6%E!'D76E!7EE!EE!!E%(E%cDt||riStS)zA Return a dict of environment proxies. :rtype: dict rk)r~r)rrks r[get_environ_proxiesris( S8444 ||r^proxiesdict[str, str] | Nonec|pi}t|}|j.||j|dS|jdz|jz|jd|jzdg}d}|D]}||vr ||}n|S)zSelect a proxy for the url, if applicable. :param url: The url being for the request :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs Nallz://zall://)r#rrscheme)rrurlparts proxy_keysproxy proxy_keys r[ select_proxyrus mG}}H {{8?GKK,>,>??? %("338$$ J E   I&E E  Lr^requestRequest | PreparedRequest trust_envc||ni}tt|j}t|j}|d}|}|rct||sRt||}|||d}|r| |||S)aThis method takes proxy information from a request and configuration input to resolve a mapping of target proxies. This will consider settings such as NO_PROXY to strip proxy configurations. :param request: Request or PreparedRequest :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs :param trust_env: Boolean declaring whether to trust environment configs :rtype: dict Nrkrr) r r!rr#rrcopyr~r setdefault) rrrrrrk new_proxiesenviron_proxiesrs r[resolve_proxiesrs!,gg"G sGK C c]] !F{{:&&H,,..K2.sXFFF2-cHEEE##FO,?,?,F,FGG  2  " "65 1 1 1 r^python-requestsrc|dtS)zO Return a string representing the default user agent. :rtype: str rr)rs r[default_user_agentrs  " "[ " ""r^cLtttdddS)z9 :rtype: requests.structures.CaseInsensitiveDict z*/*z keep-alive)z User-AgentzAccept-EncodingAccept Connection)r,rr=rr^r[default_headersrs2 ,..6&     r^list[dict[str, str]]cg}d}||}|s|Stjd|D]} |dd\}}n#t$r|d}}YnwxYwd|di}|dD]X} |d\}}n#t$rYn0wxYw|||||<Y|||S) zReturn a list of parsed link headers proxies. i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" :rtype: list z '"z, * '"r)rrTrQrPr) rlinks replace_charsvalrr linkr rs r[parse_header_linksrsA#%EM KK & &E  x&& "))C++KC " " "rCCC "!&syy':':;\\#&& H HE "[[-- UU    .3[[-G-GD=)) * * T Ls#AA! A!B,, B:9B:asciirpdatac|dd}|tjtjfvrdS|ddtjkrdS|ddtjtjfvrdS|t}|dkrd S|dkr,|dddtkrd S|d ddtkrd S|dkr*|ddtkrd S|d dtkrdSdS)z :rtype: str Nzutf-32rz utf-8-sigrpzutf-16rriz utf-16-berz utf-16-lez utf-32-bez utf-32-le) r BOM_UTF32_LE BOM_UTF32_BEBOM_UTF8 BOM_UTF16_LE BOM_UTF16_BErc_null_null2_null3)rsample nullcounts r[guess_json_utfrs"1"XF &%v':;;;x bqbzV_$${ bqbzf)6+>???x U##IA~~wA~~ ##A#;& ; !$Q$<6 ! !;A~~ "1":  ; !"":  ; 4r^ new_schemect|}|\}}}}}}} |j} | s|| }} |r,tt| } d|| g} ||}|d}t || |d|| fS)zGiven a URL that may or may not have a scheme, prepend the given scheme. Does not replace a present scheme with the one provided as an argument. :rtype: str @Nr)rnetlocr r!rr$) rrryrauth_host_portrqueryfragmentrs r[prepend_scheme_if_neededrs s^^F8>5FD%eX ]F $V *c6""4.)) ~ | vvtRA B BBr^tuple[str, str]ct|} t|jt|jf}n#tt f$rd}YnwxYw|S)z{Given a url with authentication components, extract them into a tuple of username,password. :rtype: (str,str) )rr)r#r"usernamepasswordr{r5)rryrs r[get_auth_from_urlr.sd c]]F(('&/*B*BC I & Ks(:AAtuple[str | bytes, str | bytes]cT|\}}t||dt||ddS)zVerifies that header parts don't contain leading whitespace reserved characters, or return characters. :param header: tuple, in the format (name, value). rrN)_validate_header_part)rrrs r[check_header_validityr?s7 KD%&$***&%+++++r^ header_part str | bytesheader_validator_indexc Dt|trt|}nHt|trt|}n%t d|d|dt |||s|dkrdnd}t d|d|dS) Nz Header part (z) from z# must be of type str or bytes, not rrrzTInvalid leading whitespace, reserved character(s), or return character(s) in header z: )rcr!rrrr)typerU)rrr validator header_kinds r[rrJs +s##  *+AB K ' ' +,BC  EK E E& E E15k1B1B E E   ??; ' ' 6! ; ;ff  E&1 E E5@ E E     r^ct|\}}}}}}|s||}}|ddd}t|||||dfS)zW Given a url remove the fragment and the authentication part. :rtype: str rrrr)r#rsplitr$)rrrrr r _fragments r[ urldefragauthrbsb 6>c]]2FFD&% $V ]]3 " "2 &F vvtVUB? @ @@r^prepared_requestr0ct|jdd}|Jt|jtr0 ||jdS#t $rt dwxYwt d)zfMove file pointer back to its recorded starting position so it can be read again on redirect. roNz;An error occurred when rewinding request body for redirect.z+Unable to rewind request body for redirect.)rbodyrc_body_positionrrOr+)r body_seeks r[ rewind_bodyrss(-vt<rs4#"""""  ######////////10000000$$$$$$ 433333:99999(((((( ,+++++;((((((!!!!!!::::::::::) ))))*ekmm++++!#S11 1111 genn genn"& BHWll48889JKLL"" <7$$$$L / / / /    D3D3D3D3P+01 1 1 1 1 h&&&&####L     : --- -      @@F200002%%%%,2& ''' ' %%% %    &&&&T" M 05555, 5 5 5 555550 1111,<<<<~     :>#####    """"L  g  @CCCC<",,,,    0AAAA"SSSSSSr^