U 췀g@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZddlmZddlmZmZmZddlmZddlmZmZmZmZmZzddlmZWne k rdZYnXddl!Z!dd l"m#Z#dd l$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*e*rdd l+m,Z,m-Z-dd l)m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;mm?Z?ddl@mAZAmBZBe8dZCed?Zdd@dAZedBdCZfdDdEZgddFdGZhddHdIZidJdKZjdLdMZkdNdOZlddQdRZmddSdTZndUdVZodWdXZpddYdZZqeresd[ZtetrXd\d]Zund^d]Zudd_d`ZvddadbZwdcddZxdedfZydgdhZzddidjZ{ddkdlZ|dmdnZ}dodpZ~ddqdrZdsdtZdudvZdwdxZdydzZd{d|Zdd}d~ZddZddZddZddZe\ZZdZddZddZedZGdddesZGddde jZddZddZe ddddddgZdddZe ddddgZdddZddZdddZddZddZddZddZddZdddZddZe*re7ddZe7ddZefddZe#r"ddZnddZddZzddlmZddlmZWn&e k rtddZddZYnXddÄZdddńZdS)N) namedtuple)datetimetimezone)Decimal)partial partialmethodwraps)Real)parse_qsunquote urlencodeurlsplit urlunsplit)BaseExceptionGroup)PY37)DEFAULT_ADD_FULL_STACKDEFAULT_MAX_STACK_FRAMESDEFAULT_MAX_VALUE_LENGTH EndpointType) TYPE_CHECKING) FrameType TracebackType)AnyCallablecastContextManagerDictIteratorListNoReturnOptionaloverload ParamSpecSetTupleTypeTypeVarUnion)Hub)EventExcInfoPRizsentry_sdk.errorsz^[a-zA-Z0-9/+=]*$z [Filtered])falsefnnooff0)truetyyeson1F)strictcCs@|dk rt|nd}|tkr$dS|tkr0dS|r8dSt|S)zCasts an ENV variable value to boolean using the constants defined above. In strict mode, it may return None if the value doesn't match any of the predefined values. NFT)strlowerFALSY_ENV_VALUESTRUTHY_ENV_VALUESbool)valuer: normalizedrB>/opt/hc_python/lib/python3.8/site-packages/sentry_sdk/utils.py env_to_boolRs rDcCstj|ddddS)zCSerialize data into a compact JSON representation encoded as UTF-8.F),:) allow_nan separatorsutf-8)jsondumpsencode)datarBrBrC json_dumpsbsrNc Csz|ttjjdd}d}tjdks*tjdkrBt}|jtj O_tj dddg|tj ||d d d }W5QRXWntttfk rYdSX|S) Nzw+win32cygwingitz rev-parseHEAD) startupinfostdoutstderrstdinrrI)openospathdevnullsysplatform subprocessZ STARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWPopenPIPE communicatestripdecodeOSErrorIOErrorFileNotFoundError)nullrSrevisionrBrBrCget_git_revisionhs*  rhcCsHtjd}|r|St}|r"|SdD]}tj|}|r&|Sq&dS)zTry to guess a default release.ZSENTRY_RELEASE)ZHEROKU_SLUG_COMMITZSOURCE_VERSIONZ!CODEBUILD_RESOLVED_SOURCE_VERSIONZ CIRCLE_SHA1ZGAE_DEPLOYMENT_IDN)rXenvirongetrh)releasevarrBrBrCget_default_releases   rmcCsPddddddddd d d d d dddddddg}|D]}||kr0d|Sq0dS)zAReturn the SDK name including the name of the used web framework.djangoZflaskZfastapiZbottleZfalconZquartZsanicZ starletteZlitestarZstarliteZchaliceZ serverlessZpyramidtornadoZaiohttpZ aws_lambdaZgcpZbeamZasgiZwsgizsentry.python.{}z sentry.python)format)Zinstalled_integrationsZframework_integrations integrationrBrBrC get_sdk_names2rrc@s eZdZdZddZddZdS)CaptureInternalExceptionrBcCs|SNrBselfrBrBrC __enter__sz"CaptureInternalException.__enter__cCs"|dk r|dk rt|||fdS)NT)capture_internal_exception)rvtyr@tbrBrBrC__exit__sz!CaptureInternalException.__exit__N)__name__ __module__ __qualname__ __slots__rwr{rBrBrBrCrssrscCstSrt)_CAPTURE_INTERNAL_EXCEPTIONrBrBrBrCcapture_internal_exceptionssrcCstrtjd|ddS)z Capture an exception that is likely caused by a bug in the SDK itself. These exceptions do not end up in Sentry and are just logged instead. zInternal error in sentry_sdkexc_infoN) sentry_sdk get_clientZ is_activeloggererrorrrBrBrCrxs rxcCs |tSrt)epoch total_secondsr@rBrBrC to_timestampsrcCs|tj}|dS)zFormats a timestamp in RFC 3339 format. Any datetime objects with a non-UTC timezone are converted to UTC, so that all timestamps are formatted in UTC. z%Y-%m-%dT%H:%M:%S.%fZ) astimezonerutcstrftime)r@ZutctimerBrBrCformat_timestamps r)+-c Cszt|}Wnttfk rd|kr.dnd}|drL|ddd}|dtkrz|d7}|dd |d d}n|d tkr|d7}t||}YnX|tj S) N.z%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%M:%SZz+0000iz%z) r fromisoformatAttributeError ValueErrorendswithISO_TZ_SEPARATORSstrptimerrr)r@resultZtimestamp_formatrBrBrCdatetime_from_isoformats   rcCs2|dkrt}nt|}|ddkr*d}d|iS)z+Creates a hint with the exc info filled in.Nrr)r[rexc_info_from_errorrrBrBrCevent_hint_with_exc_infos   rc@seZdZdZdS)BadDsnzRaised on invalid DSNs.Nr|r}r~__doc__rBrBrBrCrsrc@s6eZdZdZddZeddZd ddZd d ZdS) DsnzRepresents a DSN.c Cst|trt|j|_dStt|}|jdkr>td|j|j|_|jdkrXtd|j|_ |j dkr|jdkrxdpzd|_ n|j |_ |j std|j |_ |j |_|jdd }ztt||_Wn2ttfk rtd |jpd d dYnXd|d|_dS) N)httphttpszUnsupported scheme %rzMissing hostnamerPzMissing public key/r-zInvalid project in DSN (%r)) isinstancerdict__dict__r r;schemerhostnamehostportusername public_keypassword secret_keyrYrsplitintpop project_idr TypeErrorjoin)rvr@partsrYrBrBrC__init__!s.       z Dsn.__init__cCs(|j}|j|jfdkr$d||jf}|S)zThe netloc part of a DSN.))rr)rrz%s:%s)rrrrvrvrBrBrCnetlocEsz Dsn.netlocNc Cs"t|j|j|j|j|j|j|dS)z*Returns the auth info object for this dsn.)rrrYrrrclient)AuthrrrYrrr)rvrrBrBrCto_authNsz Dsn.to_authcCs.d|j|j|jrd|jpd|j|j|jfS)Nz%s://%s%s@%s%s%s@r)rrrrrYrrurBrBrC__str__[sz Dsn.__str__)N) r|r}r~rrpropertyrrrrBrBrBrCrs $  rc@s0eZdZdZd ddZejfddZd d ZdS) rz,Helper object that represents the auth info.Nrc Cs4||_||_||_||_||_||_||_||_dSrt)rrrYrrrversionr) rvrrrrrrrrYrBrBrCrjs z Auth.__init__cCsd|j|j|j|j|jfS)z'Returns the API url for storing events.z%s://%s%sapi/%s/%s/)rrrYrr@)rvtyperBrBrC get_api_urlszAuth.get_api_urlcCs`d|jfd|jfg}|jdk r.|d|jf|jdk rH|d|jfdddd |DS) z!Returns the auth header a string.Z sentry_keyZsentry_versionNZ sentry_clientZ sentry_secretzSentry z, css|]\}}d||fVqdS)z%s=%sNrB).0keyr@rBrBrC sz!Auth.to_header..)rrrappendrrrrBrBrC to_headers   zAuth.to_header)NrNr) r|r}r~rrrZENVELOPErrrBrBrBrCrgs  rc@sHeZdZdZdZddZddZeddZed d Z ed d Z d S)AnnotatedValuea Meta information for a data field in the event payload. This is to tell Relay that we have tampered with the fields value. See: https://github.com/getsentry/relay/blob/be12cd49a0f06ea932ed9b9f93a655de5d6ad6d1/relay-general/src/types/meta.rs#L407-L423 r@metadatacCs||_||_dSrtr)rvr@rrBrBrCrszAnnotatedValue.__init__cCs&t|tsdS|j|jko$|j|jkSNF)rrr@r)rvotherrBrBrC__eq__s zAnnotatedValue.__eq__cCstddddggidS)zxThe value was removed because it could not be parsed. This is done for request body values that are not json nor a form.rremz!rawxrrclsrBrBrCremoved_because_raw_datasz'AnnotatedValue.removed_because_raw_datacCstddddggidS)zThe actual value was removed because the size of the field exceeded the configured maximum size (specified with the max_request_body_size sdk option)rr!configrrrrrBrBrCremoved_because_over_size_limitsz.AnnotatedValue.removed_because_over_size_limitcCsttdddggidS)zHThe actual value was removed because it contained sensitive information.rrsr)rSENSITIVE_DATA_SUBSTITUTErrBrBrC+substituted_because_contains_sensitive_datasz:AnnotatedValue.substituted_because_contains_sensitive_dataN) r|r}r~rrrr classmethodrrrrBrBrBrCrs  r)r&TcCst|ddpt|ddS)Nr~r|getattrrrBrBrC get_type_namesrcCst|dd}|dkr|SdS)Nr})Nbuiltins __builtins__r)rmodrBrBrCget_type_modules rc Csrz|jd}|drWdSWnttfk r6YnXdD]0}z|j|rTWdSWq<tk rjYq-sz'get_lines_from_file..rrcsg|]}t|ddqSrrrrrBrCr2s)hasattrr ImportErrorrd splitlines linecachegetlinesrcmaxminlenrra IndexError) filenamelinenorloadermoduleZ context_linessourceZ source_str lower_bound upper_bound pre_context context_line post_contextrBrrCget_lines_from_files:      rcCsz |jj}Wntk r$d}YnXz|jd}Wntk rRgdgfYSXz|jd}Wntk rzd}YnX|d}|dk r|rt|||||dSgdgfS)Nr| __loader__r-)r r )f_code co_filenamerrr)r tb_linenomax_value_lengthabs_pathr r r rBrBrCget_source_context<s,    rcCs,z t|WStk r&t|YSXdSrt)r;r safe_reprrrBrBrCsafe_strVs rcCs&z t|WStk r YdSXdS)Nz )reprrrrBrBrCr^s rcCs|r|s |Szz|dr$|dd}|ddd}||krJtj|WStj|j}|s`|WS||tj dddd tj WSt k r|YSXdS)Nz.pycrrr-r) rsplitrXrYbasenamer[modules__file__rseplstripr)r r base_moduleZbase_module_pathrBrBrCfilename_for_modulefs    r'Tc Cst|dd}|sd}d}n|jj}|jj}z|jd} Wntk rPd} YnX|dkr`|j}t| |pld|r|tj |nd|pd| |d} |rt |||\| d<| d<| d<|rdd l m } | t|jd |d | d <| S) Nrr|z )r rfunctionr r rrrr) serializeT)Zis_vars custom_reprvars)rrrco_namerrf_linenor'rXrYabspathrZsentry_sdk.serializerr)rr) rrinclude_local_variablesinclude_source_contextrr*rrr(r rr)rBrBrCserialize_frame~s@     r1cCsNd}g}t}|dk r>t|s6|t||||d|j}q|d|iS)NT)r/r0rframes)r[ _getframerrr1f_backreverse)r/r0rrr2r/rBrBrCcurrent_stacktraces r6cCs t|ddS)Nerrnor) exc_valuerBrBrC get_errnosr9cCsbt|ddpt|ddpt|}t|dd}t|tr^t|dkr^|dddd|D7}|S) Nmessagerdetail __notes__r css|]}t|tr|VqdSrt)rr;)rZnoterBrBrCrs z$get_error_message..)rrrlistrr)r8r:notesrBrBrCget_error_messages   r@c si} |r|nddd| d<|dk r2|| dd<|dk rDt|} nd} | dk rp| ddidid | |dk r|| dd <|d k} | s|dk r|| dd <d | dd<| rd| dkrd| dd<tdk ot|t} | rd| dd<t|| d<t|| d<t|| d<|dkr.ddtdn"|d|d|d| dfddt |D} | r|s~| }n t | ||}d|i| d<| S)z Creates a dict that goes into the events `exception.values` list and is ingestible by Sentry. See the Exception Interface documentation for more details: https://develop.sentry.dev/sdk/event-payloads/exception/ ZgenericT)rZhandled mechanismN exception_idmetar7numberrr parent_idZchainedris_exception_groupr r@r/r0rr*c s$g|]}t|j|jdqS))rr/r0rr*)r1rr)rrzr*r/r0rrBrCr#s z5single_exception_from_error_tuple..r2 stacktrace) copyr9 setdefaultrrrrr@rrjrmerge_stack_frames)exc_typer8rzclient_optionsrArBrEr full_stackZexception_valuer7Zis_root_exceptionrFr2 new_framesrBrGrC!single_exception_from_error_tuplesf                  rP__suppress_context__ccs|\}}}g}t}|dk r|dk rt||kr|||fV|||t||jrb|j}n|j}|dkrrqt|}|}t|dd}qdS)N __traceback__) setidraddrQ __cause__ __context__rr)rrLr8rzZseen_exceptionsZseen_exception_idscauserBrBrCwalk_exception_chain>s(    rYccs |VdSrtrBrrBrBrCrY^sc  CsTt|||||||||d } | g} |}|d7}t|do:|j} | r|oVt|doV|jdk } | r|j} tt| | t| dd|||d|d\}}| |nT|ot|do|jdk }|r|j}tt||t|dd|||d|d\}}| ||ot|d }|rLt |j D]B\}}tt||t|dd||||d ||d \}}| |q|| fS) z Creates the list of exceptions. This can include chained exceptions and exceptions from an ExceptionGroup. See the Exception Interface documentation for more details: https://develop.sentry.dev/sdk/event-payloads/exception/ ) rLr8rzrMrArBrErrNr-rQrVNrR)rLr8rzrMrArBrrNrW exceptionszexceptions[%s]) rPrrQrVexceptions_from_errorrrextendrW enumeraterZ)rLr8rzrMrArBrErrNparentrZZshould_supress_contextZexception_has_causerXZchild_exceptionsZexception_has_contentcontextrFidxerBrBrCr[cs       r[c Cs||\}}}tdk ot|t}|r>t|||||dd|d\}} n2g} t|D]$\}}}| t||||||dqJ| | S)Nr)rLr8rzrMrArBrErN)rLr8rzrMrArN)rrr[rYrrPr5) rrMrArNrLr8rzrF_rZrBrBrCexceptions_from_error_tuples<    rccCs4z t|WStk r.t|ddYSXdS)Nr-r)r;UnicodeDecodeErrorrrrBrBrC to_strings reccszd|kr|dVd|krD|ddp*dD]}d|kr,|dVq,d|krv|ddp\dD]}d|kr^|dVq^dS)NrHthreadsvaluesrB exception)rj)eventthreadrhrBrBrCiter_event_stacktracess  rkccs,t|D]}|dpdD] }|VqqdS)Nr2rB)rkrj)rirHrrBrBrCiter_event_frames s rlcCs(t|D]}t|d|||dq|S)Nr2)in_app_excludein_app_include project_root)rkset_in_app_in_framesrj)rirmrnrorHrBrBrC handle_in_apps rqcCs|sdS|D]}|d}|dk r$q |d}t||rBd|d<q t||rVd|d<q |d}|dkrjq t|r|d|d<q t||r d|d<q q |S)NZin_appr TFr)rj_module_in_list_is_external_source_is_in_project_root)r2rmrnrorZcurrent_in_appr rrBrBrCrps.      rpcCst|tr"t|dkr"|\}}}ndt|trvt|dd}|dk rNt|}|}qt\}}}||k rd}|}t|}ntdt||||f}t rt t |}|S)NrRz,Expected Exception object to report, got %s!) rtupler BaseExceptionrrr[rrrrr*)rrLr8rzrrBrBrCrEs"      rcs^dd|Dfdd|D}|||r:|dtnd}|dk rZ|t||d}|S)zV Add the missing frames from full_stack to frames and return the merged list. cSs(h|] }|d|d|d|dfqSrrr r(rB)rrrBrBrC gs z%merge_stack_frames..cs0g|](}|d|d|d|dfkr|qSrxrB)rZ stackframeZ frame_idsrBrCrqsz&merge_stack_frames..max_stack_framesN)r\rjrr)r2rNrMrOr{rBrzrCrKbs  rKcCsZt|}t|}|r:|dtr:t|d|ddd}nd}ddt||||id|fS) NZadd_full_stackr/r)r/rr2rrg)levelrh)rrrjrr6rc)rrMrAhintrNrBrBrCevent_from_exceptions,r~cCs>|dkr dS|sdS|D] }||ks2||drdSqdS)NFrTr)nameitemsitemrBrBrCrrsrrcCs |dkr dStd|dk }|S)NFz [\\/](?:dist|site)-packages[\\/]research)rZexternal_sourcerBrBrCrss rscCs&|dks|dkrdS||r"dSdS)NFTr)rrorBrBrCrts  rtcCs(|dd|djddd}|dS)zd Truncate a UTF-8-encodable string to the last full codepoint so that it fits in max_bytes. rINruignore)errors...)rLrb)stringZ max_bytes truncatedrBrBrC_truncate_by_bytess rc Cs0zt|dWSttfk r*YdSXdS)NrI)rrLUnicodeEncodeErrorrdrrBrBrC_get_size_in_bytessrcCs|s|S|dkrt}t|}t|}|dk r@||kr@t||}n*|dk rf||krf|d|dd}n|St||pt|dd|d|ggddS)Nrurz!limitr)rrr)rrrrr)r@rZ byte_sizeZ text_sizeZtruncated_valuerBrBrCrs" rc Cstd}td|dtjtjB}z2||d}ttt| ddd}Wnt t t fk rnYdSX|S)z Parses a version string into a tuple of integers. This uses the parsing loging from PEP 440: https://peps.python.org/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions a # noqa: N806 v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                          # pre-release
                [-_\.]?
                (?P(a|b|c|rc|alpha|beta|pre|preview))
                [-_\.]?
                (?P[0-9]+)?
            )?
            (?P                                         # post release
                (?:-(?P[0-9]+))
                |
                (?:
                    [-_\.]?
                    (?Ppost|rev|r)
                    [-_\.]?
                    (?P[0-9]+)?
                )
            )?
            (?P                                          # dev release
                [-_\.]?
                (?Pdev)
                [-_\.]?
                (?P[0-9]+)?
            )?
        )
        (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    z^\s*z\s*$rkrNru)
rcompileVERBOSE
IGNORECASEmatch	groupdictrvmaprr rrr)rVERSION_PATTERNpatternrkZ
release_tuplerBrBrC
parse_versions

 rcCsznddl}ddlm}tddtd|jddD}|dd	rltjd
krV|dks`|dd
rfWdSWdSWnt	k
rYnXzPddl
}ddlm}t
|j}|dkrtdWdS|dr|dkrWdSWnt	k
rYnXdS)z
    Returns whether gevent/eventlet have patched the stdlib in a way where thread locals are now more "correct" than contextvars.
    rN)is_object_patchedcSsg|]}t|qSrB)r)rpartrBrBrCr=sz*_is_contextvars_broken..z	a|b|rc|\.r	threadinglocalrur)	contextvars
ContextVarFT)is_monkey_patchedzYInternal error in Sentry SDK: Could not parse Greenlet version from greenlet.__version__.rj)rr)gevent
gevent.monkeyrrvrr __version__r[version_inforgreenletZeventlet.patcherrrrr)rr
version_tuplerrZgreenlet_versionrBrBrC_is_contextvars_broken2s>
	


rcsGfddd}|S)Ncs4eZdZd
fdd	ZdddZddZdd	ZdS)z1_make_threadlocal_contextvars..ContextVarNcs ||_||_|_|_dSrt)_name_default_local_original_local)rvrdefaultrrBrCrksz:_make_threadlocal_contextvars..ContextVar.__init__cSst|jd|p|jS)Nr@)rrr)rvrrBrBrCrjrsz5_make_threadlocal_contextvars..ContextVar.getcSs0ttd}|}t|j||||j_|S)N@)r;randomgetrandbitsrjsetattrrrr@)rvr@tokenoriginal_valuerBrBrCrSvs
z5_make_threadlocal_contextvars..ContextVar.setcSst|j||j_|jj|=dSrt)rrrr@r)rvrrBrBrCreset~sz7_make_threadlocal_contextvars..ContextVar.reset)N)N)r|r}r~rrjrSrrBrrBrCrhs
rrB)rrrBrrC_make_threadlocal_contextvarsfsrcCstsjtjdkr>zddlm}d|fWStk
r:YqjXn,zddlm}d|fWStk
rhYnXddlm}dt	|fS)z
    Figure out the "right" contextvars installation to use. Returns a
    `contextvars.ContextVar`-like class with a limited API.

    See https://docs.sentry.io/platforms/python/contextvars/ for more information.
    rr)rTrF)
rr[rZaiocontextvarsrrrrrr)rrrBrBrC_get_contextvarss


rz

With asyncio/ASGI applications, the Sentry SDK requires a functional
installation of `contextvars` to avoid leaking scope/context data across
requests.

Please refer to https://docs.sentry.io/platforms/python/contextvars/ for more information.
cCsd}zd|jj|jj|jfWStk
r2YnXd\}}t|trbt|jdrbd\}}|j}n0t|ddpxt|dd}t|t	rd\}}|j}t|d	r|j
}nt|dr|j}|dk	rt|d
r|jd|}|||}|S)zbReturn the qualified name of func. Works with regular function, lambda, partial and partialmethod.Nz%s.%s.%s)rrr|)zpartial()_partialmethodZ__partialmethod__)zpartialmethod(Raised when a serverless method is about to reach its timeout.NrrBrBrBrCrsrc@s(eZdZdZddZddZddZdS)	
TimeoutThreadzCreates a Thread which runs (sleeps) for a time duration equal to
    waiting_time and raises a custom ServerlessTimeout exception.
    cCs&tj|||_||_t|_dSrt)rThreadrwaiting_timeconfigured_timeoutr)_stop_event)rvrrrBrBrCrszTimeoutThread.__init__cCs|jdSrt)rrSrurBrBrCstopszTimeoutThread.stopcCsJ|j|j|jrdSt|j}||jkr8|d}td|dS)Nr-zZWARNING : Function is expected to get timed out. Configured timeout duration = {} seconds.)rwaitris_setrrrrp)rvZinteger_configured_timeoutrBrBrCruns


zTimeoutThread.runN)r|r}r~rrrrrBrBrBrCrsrc
Csbd}z"|d}t|}|d}Wn6tk
r\}ztdj|d|W5d}~XYnX|S)zO
    Convert a string to base64, via UTF-8. Returns None on invalid input.
    NUTF-8z"Unable to encode {orig} to base64:)orig)rLbase64	b64encoderbrrwarningrp)original
base64_string
utf8_bytesbase64_byteserrrBrBrC	to_base64s

&rc
Cstd}z4t|}|st|d}t|}|d}Wn6tk
rn}zt	dj
|d|W5d}~XYnX|S)zQ
    Convert a string from base64, via UTF-8. Returns None on invalid input.
    Nrz#Unable to decode {b64} from base64:)Zb64)BASE64_ALPHABETrAssertionErrorrLr	b64decoderbrrrrp)rZutf8_stringZonly_valid_charsrrrrBrBrCfrom_base64*s



r
ComponentsrrrYqueryfragmentc
Cst|}t|jdd}|rN|jd}t|dkrFdtt|df}qT|j}n|j}|rpttdd|D}n|j}t	|j
|||j|jd	}	|r|	St
|	Sd
S)zL
    Removes the authority and query parameter values from a given URL.
    T)keep_blank_valuesrr-z%s:%s@%srcSsi|]
}|tqSrB)r)rrrBrBrC
\sz sanitize_url..rrrrYrN)r
r
rrr rrrrrrrYrr)
urlremove_authorityremove_query_valuesr 
parsed_urlZquery_paramsZnetloc_partsrZquery_string
componentsrBrBrCsanitize_urlCs6r	ParsedUrlrcCs>t|d|dd}tt|j|jd|jdd}t||j|jdS)z
    Splits a URL into a url (including path), query and fragment. If sanitize is True, the query
    parameters will be sanitized to remove sensitive data. The autority (username and password)
    in the URL will always be removed.
    T)rrr rr)rrr)	rrrrrrYrrr)rsanitizerbase_urlrBrBrC	parse_urlrs(
rcCsjt|ttfrt|r6tdj||t|ddSt	|}|dksN|dkrftdj||ddSdS)	z
    Checks the given sample rate to make sure it is valid type and value (a
    boolean or a number between 0 and 1, inclusive).
    z|{source} Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got {rate} of type {type}.)rraterFrr-zW{source} Given sample rate is invalid. Sample rate must be between 0 and 1. Got {rate}.)rrT)
rr	rmathisnanrrrprfloat)rrrBrBrCis_valid_sample_rates&
rcCsH|dkrdS|D]2}|s,|ddkr,|d7}t||}|rdSqdS)NFr$Tr)rZ
regex_listZsubstring_matchingZitem_matcherZmatchedrBrBrCmatch_regex_listsrcCs,|dk	o*|jdk	o*|jjdk	o*|jjj|kS)zB
    Determines whether the given URL matches the Sentry DSN.
    N)	transportZ
parsed_dsnr)rrrBrBrC
is_sentry_urls
rccszfddlm}t}|D]F}|jd}|dk	rt|}|jdk	r||kr||jfV||qWnXtk
rzddl}Wntk
rYYdSX|j	D]}t|j
|jfVqYnXdS)Nr)rName)	importlibrrS
distributions_normalize_module_namerrUr
pkg_resourcesworking_setr)ryieldeddistrnormalized_namerinforBrBrC_generate_installed_moduless"


rcCs|Srt)r<)rrBrBrCrsrcCstdkrttatSrt)_installed_modulesrrrBrBrBrC_get_installed_moduless
rcCs$t}||}|dkrdSt|Srt)rrjr)packageZinstalled_packagesrrBrBrCpackage_versions

rcCs(|dk	st|j|k	r |||dSrt)rrRwith_traceback)tpr@rzrBrBrCreraises

rcOsdS)z.No-op function for ensure_integration_enabled.NrB)Z_aZ_krBrBrC_no_opsrcCsdSrtrBrqoriginal_functionrBrBrCensure_integration_enabledsrcCsdSrtrB)rqrBrBrCrscs(trttttffdd}|S)a
    Ensures a given integration is enabled prior to calling a Sentry-patched function.

    The function takes as its parameters the integration that must be enabled and the original
    function that the SDK is patching. The function returns a function that takes the
    decorated (Sentry-patched) function as its parameter, and returns a function that, when
    called, checks whether the given integration is enabled. If the integration is enabled, the
    function calls the decorated, Sentry-patched function. If the integration is not enabled,
    the original function is called.

    The function also takes care of preserving the original function's signature and docstring.

    Example usage:

    ```python
    @ensure_integration_enabled(MyIntegration, my_function)
    def patch_my_function():
        with sentry_sdk.start_transaction(...):
            return my_function()
    ```
    cs8dddfdd}tkr,t|St|S)NzP.argszP.kwargsargskwargscs&tdkr||S||Srt)rrZget_integrationr)rqrsentry_patched_functionrBrCrunner?s
z;ensure_integration_enabled..patcher..runner)rr)r
rr)r
rCpatcher=sz+ensure_integration_enabled..patcher)rrrr+r,)rqrrrBrrCrscCstSrt)timeperf_counter_nsrBrBrBrCnanosecond_timePsrcCsttdS)NgeA)rr
perf_counterrBrBrBrCrVscCstSrt)r
rrBrBrBrCnow[sr)get_hubis_module_patchedcCsdSrtrBrBrBrBrCget_gevent_hubgsrcCsdSrrB)mod_namerBrBrCrksrcCstdptdS)Nr_threadrrBrBrBrC	is_geventqsrcCs|dk	r@z"|j}|j}|dk	r(||fWSWntk
r>YnXtrvt}|dk	rvz|jdfWStk
rtYnXz*t}|j}|j}|dk	r||fWSWntk
rYnXz*t}|j}|j}|dk	r||fWSWntk
rYnXdS)zK
    Try to get the id of the current thread, with various fall backs.
    N)NN)	identrrrrZthread_identrcurrent_threadmain_thread)rjZ	thread_idZthread_nameZ
gevent_hubrBrBrCget_current_thread_metavs@r)N)NNN)N)NTTNN)TTN)NNNNNN)NNrrNN)NNN)NNN)N)NN)N)TTF)T)NF)N)N)rrJrloggingrrXrrr]r[rr
collectionsrrrdecimalr	functoolsrrrnumbersr	urllib.parser
rrr
rrrrrZsentry_sdk._compatrZsentry_sdk.constsrrrrtypingrtypesrrrrrrrrrrr r!r"r#r$r%r&r'Z
gevent.hubr(Zsentry_sdk._typesr)r*r+r,r	getLoggerrrrrr	frozensetr=r>rDrNrhrmrrrsrrrxrrrrrrrrrrr	Annotatedrrrrrrrrr'r1r6r9r@rPrrZHAS_CHAINED_EXCEPTIONSrYr[rcrerkrlrqrprrKr~rrrsrtrrrrrrrZHAS_REAL_CONTEXTVARSrZCONTEXTVARS_ERROR_MESSAGErrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrBrBrBrCsR
H

$

I0G
1

0

Z

 	
g
,

'*


44!&

,&
,






	
0