JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr 0i\ddlZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZddlZddlZddlmZmZmZmZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#ddl$m%Z%e%r$dd l$m&Z&dd l$m'Z'dd l$m(Z(dd l$m)Z)dd l$m*Z*ddl+m,Z,ejZdZ.dZ/GddeZ0dZ1ejd d4dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;GddZ<Gdd Z=d!Z>d"Z?dddejfd#ZAd5d$ZBd5d%ZCd&d'd(ZDd)ZEd*ZFd5d+ZGd,ZHd-ZId.ZJd/ZKd0ZLd1ZMdd2lNmOZOmPZPmQZQe%rdd3lNmRZRyy)6N)Mapping) timedelta)Random)quoteunquote)OPSPANDATA SPANSTATUS SPANTEMPLATE) capture_internal_exceptionsfilename_for_moduleDsnloggermatch_regex_listqualname_from_function safe_repr to_string try_convert is_sentry_url_is_external_source_is_in_project_root_module_in_list) TYPE_CHECKING)Any)Dict) Generator)Optional)Union) FrameTypez5^[ ]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ ]*$z(([a-zA-Z0-9+/]{4})*([a-zA-Z0-9+/]{2,3})?c(eZdZ ddZdZdZdZy)EnvironHeadersc ||_||_yN)environprefix)selfr$r%s G/opt/hc_python/lib/python3.12/site-packages/sentry_sdk/tracing_utils.py__init__zEnvironHeaders.__init__As   cv|j|j|jddjzSN-_)r$r%replaceupper)r&keys r' __getitem__zEnvironHeaders.__getitem__Js.||DKK#++c3*?*E*E*GGHHr)c8tdt|DS)Nc3 K|]}dyw)N).0r-s r' z)EnvironHeaders.__len__..Ps)j1js )sumiterr&s r'__len__zEnvironHeaders.__len__Ns)d4j)))r)c#K|jD]i}t|ts|jddj }|j |j sP|t|j dkywr+)r$ isinstancestrr.r/ startswithr%len)r&ks r'__iter__zEnvironHeaders.__iter__RsdAa% #s#))+A<< ,C $&' 'sA:A<N)HTTP_)__name__ __module__ __qualname__r(r1r;rBr5r)r'r!r!@sI* (r)r!c|yt|jdduxr(|jdduxs|jdduS)z} Returns True if either traces_sample_rate or traces_sampler is defined and enable_tracing is set and not false. NFenable_tracingtraces_sample_ratetraces_sampler)boolget)optionss r'has_tracing_enabledrN_sY   $%U2 KK, -T 9 9{{+,D8  r)c#2Ktjjdjddr|r|dgk(rd}|dk(rd}nd}d}t ||}i}|||d<|||d<|rd|d <|r|||d <t 5tj |d | dddtjtj|| 5}|jD]\} } |j| | |dddy#1swYgxYw#1swYyxYww)N _experimentsrecord_sql_paramsFpyformatformatz db.paramsz db.paramstyleTzdb.executemanyz db.cursorquery)messagecategorydata)opnameorigin) sentry_sdk get_clientrMrL _format_sqlr add_breadcrumb start_spanrDBitemsset_data) cursorrT params_list paramstyle executemanyrecord_cursor_repr span_originrWspanrAvs r'record_sql_queriesrkqs*&&~6::;NPUVkdV3K  #!J   &E D'[ *_!% f0"[ $ &!!%'M '    55   JJLDAq MM!Q !    ' &  s6A>DC?.D/D 6 D?DD DDc\|jtjk(r*|j|jdd|j y|jtj k(rd}|jjtj}|r!d|cxkrdkrnnd}nd|cxkrdkrnnd}|r |jd d |j| y|jd d |j y|jd k(r*|jd d |j|jyy)Nredis)rUtyperVrWiiWerroriiwarninghttphttplib)rnrVrWlevel)rnrVrW subprocess)rnrVrUrW) rXrDB_REDISr^ description_tags HTTP_CLIENT_datarLr HTTP_STATUS_CODE)scoperirs status_codes r'"maybe_create_breadcrumbs_from_spanr}s ww"++ $$7W4::   BNN "jjnnX%>%>? k(S( *s*!   idjj !   fytzz R L  !$$   !r)cN |jjS#t$rYywxYwr#)f_code co_filename Exception)frames r'_get_frame_module_abs_pathrs)||''' s  $$ct||}t|xs t||}| xr|xst||xr| Sr#)rrr)is_sentry_sdk_frame namespacein_app_includein_app_excludeabs_path project_rootshould_be_includedshould_be_excludeds r'_should_be_includedrs[)NC,X6/>;# "  T , 7 R@R !!LL00M  $ MM(00%,,2F2F G %=/ I 4 F  I " ! M !sGG> G7G)6G; GG G&%G&) G87G8; H H ctj}|jsy|j |jy|j j dd}|sy|j|jz }|j j dd}|tdz |kD}|syt||j d|j j d |j j d  y) zO Adds OTel compatible source code information to a database query span Nenable_db_query_sourceTdb_query_source_threshold_msrr4 millisecondsrrrrirrr r[r\ is_active timestampstart_timestamprMrLrr)riclientshould_add_query_sourceduration threshold slow_querys r'add_query_sourcer"s  " " $F     ~~!5!5!=$nn001I4P "~~ 4 44H""#A1EII155 AJ  ^^N3~~))*:;~~))*:; r)ctj}|jsy|j |jy|j j dd}|sy|j|jz }|j j dd}|tdz |kD}|syt||j d|j j d |j j d  y) z] Adds OTel compatible source code information to a span for an outgoing HTTP request Nenable_http_request_sourceT http_request_source_threshold_msrr4rrrrrr)rirshould_add_request_sourcerrrs r'add_http_request_sourcerAs  " " $F     ~~!5!5!= & 2 23OQU V $~~ 4 44H""#EqIII155 AJ  ^^N3~~))*:;~~))*:; r)c@|sy|jdr|jdr|dd}tj|}|sy|j \}}}d}|rdj t |d}|rdj t |d}|r|d k7}|||d S) zL Given a `sentry-trace` header string, return a dictionary of data. Nz00-z-00z{:032x}z{:016x}0)trace_idparent_span_idparent_sampled)r?endswithSENTRY_TRACE_REGEXmatchgroupsrSint)headerrrr sampled_strrs r'extract_sentrytrace_datar`s  FOOE$:"  $ $V ,E ,1LLN)HnkN##C"$56"))#nb*AB$+(( r)cd} t|drF|j|}t|tr%|j |j j }|xs t|S#t$rd}YwxYw)Nmogrify) hasattrrr=bytesdecode connectionencodingrr)rcsqlreal_sqls r'r]r]sqH  69 %~~c*H(E*#??6+<+<+E+EF  %y~% sAA%% A32A3ceZdZdZdZ ddZedZedZ e jdZ edZ e jd Z d Z d Z d Zd Zy)PropagationContextzJ The PropagationContext represents the data of a trace in Sentry.  _trace_id_span_idrrdynamic_sampling_contextNcR||_ ||_ ||_ ||_ ||_yr#r)r&rspan_idrrrs r'r(zPropagationContext.__init__sD"/ :, H- Q)A%?r)cXd}t|}|jt}|r2t}tj |j |_|jt}|r*t|}|| t}|j|||j|Sr#) normalize_incoming_datarLBAGGAGE_HEADER_NAMErBaggagefrom_incoming_headerrSENTRY_TRACE_HEADER_NAMErupdate_fill_sample_rand)cls incoming_datapropagation_contextnormalized_databaggage_headersentry_trace_headersentrytrace_datas r'from_incoming_dataz%PropagationContext.from_incoming_datas#1-@(,,-@A "4"6 ;B;W;W<&&( 8.112JK 78KL +&.*<*>'#**+;<  *  1 1 3""r)cx|js#tjj|_|jS)z!The trace id of the Sentry trace.)ruuiduuid4hexr:s r'rzPropagationContext.trace_ids(~~!ZZ\--DN~~r)c||_yr#)rr&values r'rzPropagationContext.trace_ids r)c~|js&tjjdd|_|jS)z+The span id of the currently executed span.rN)rrrrr:s r'rzPropagationContext.span_ids/}} JJL,,RS1DM}}r)c||_yr#)rrs r'rzPropagationContext.span_ids  r)cn|jD]\}} t|||y#t$rY"wxYw)zU Updates the PropagationContext with data from the given dictionary. N)rasetattrAttributeError)r& other_dictr0rs r'rzPropagationContext.updates@ %**,JC c5)-"  s ( 44cdj|j|j|j|j|j S)Nzm)rSrrrrrr:s r'__repr__zPropagationContext.__repr__sD~FF NN MM        ) )   r)c|jytt|jjd}| d|cxkrdkrytt|jjd}t |j |\}} t |j||f}|d |jd<y#t$r)tjd|j d|d YywxYw) aJ Ensure that there is a valid sample_rand value in the dynamic_sampling_context. If there is a valid sample_rand value in the dynamic_sampling_context, we keep it. Otherwise, we generate a sample_rand value according to the following: - If we have a parent_sampled value and a sample_rate in the DSC, we compute a sample_rand value randomly in the range: - [0, sample_rate) if parent_sampled is True, - or, in the range [sample_rate, 1) if parent_sampled is False. - If either parent_sampled or sample_rate is missing, we generate a random value in the range [0, 1). The sample_rand is deterministically generated from the trace_id, if present. This function does nothing if there is no dynamic_sampling_context. N sample_randrr4 sample_rateintervalz5Could not backfill sample_rand, since parent_sampled=z and sample_rate=..6f) rrfloatrL_sample_rand_ranger_generate_sample_randr ValueErrorrdebug)r&rrlowerr/s r'rz$PropagationContext._fill_sample_rands(  ( ( 0 ! 40044]C   "qK';!'; (< " 40044]C *$*=*={K u / PUWK;Fc9J%%m4  LLGH[H[G\]##.-q2   s B44/C&%C&cR|jy|jjdS)zRConvenience method to get the sample_rand value from the dynamic_sampling_context.Nr)rrLr:s r' _sample_randzPropagationContext._sample_rand<s*  ( ( 0,,00??r))NNNNN)rDrErF__doc__ __slots__r( classmethodrpropertyrsetterrrrrrr5r)r'rrsI!% @6##2__ ^^  2Lh@r)rceZdZdZdZdZejdZ ddZ e dddZ e d Z e d Z d Zd Zdd ZedZdZdZy)raF The W3C Baggage header information (see https://www.w3.org/TR/baggage/). Before mutating a `Baggage` object, calling code must check that `mutable` is `True`. Mutating a `Baggage` object that has `mutable` set to `False` is not allowed, but it is the caller's responsibility to enforce this restriction.  sentry_itemsthird_party_itemsmutablezsentry-z^sentry-c.||_||_||_yr#r )r&r rrs r'r(zBaggage.__init__Ss )!2 r)N)rci}d}d}|r|jdD]}d|vrt5|j}|jd\}}tjj |r.t |jdd} t ||| <d}n ||rdnd|zz }ddd|t||d <d}t|||S#1swYxYw) zF freeze if incoming header already has sentry baggage rT,=r,r4FNr)splitr striprSENTRY_PREFIX_REGEXrrr>) rrrr rritemr0val baggage_keys r'rzBaggage.from_incoming_header]s   S)d?02::CC ci}d}d}tj}|jr |j t |S|j }|j}||j |d<|jdr|d|d<|jdr|d|d<|jdrt|dj|d<|jdrt|d|d <t |||S) NrFr environmentreleasedsn public_keyrIr) r[r\r_propagation_contextrrMrrLrrr>)rr{r rrrrMrs r' from_optionszBaggage.from_optionss &&(!U%?%?%G<( (..#88  *':'C'CL $ ;;} %*1-*@L ' ;;y !&-i&8L # ;;u ),WU^)<)G)GL & ;;+ ,*-g6J.K*LL '|%6@@r)ctj}i}|js t|S|jxsi}|j |d<|j d|d<|jdr|d|d<|jdr|d|d<|jdrt|dj|d<|jr!|jtvr|j|d<|jt|j|d <|j|jrd nd |d <|j r;|j j"r%|j%|j j"t|d S)z Populate fresh baggage entry with sentry_items and make it immutable if this is the head SDK which originates traces. rrrrrrr transactionrtruefalsesampledFr)r[r\rrrMrrrLrrrYsourceLOW_QUALITY_TRANSACTION_SOURCESrr>r%_baggager r)rr"rr rMs r'populate_from_transactionz!Baggage.populate_from_transactionsg&&( !<( (..&B#.#7#7 Z )4)A)A#(F ]# ;;} %*1-*@L ' ;;y !&-i&8L # ;;u ),WU^)<)G)GL &   ""*II*5*:*:L '  " " .*-k.E.E*FL '    *0;0C0CfL #   K$8$8$E$E    4 4 A A B|U33r)cd|_y)NFr&r:s r'freezezBaggage.freezes  r)cXi}|jjD] \}}|||< |Sr#)r ra)r&rr0rs r'rz Baggage.dynamic_sampling_contexts4**002ICF3K3 r)cng}|jjD]]\}}t5tjt |zdzt t |z}|j|ddd_|r|j|jdj|S#1swYxYw)Nrr) r rar r SENTRY_PREFIXrr>appendrjoin)r&include_third_partyrar0rrs r' serializezBaggage.serializes))//1HC,.,,uSz9C?%C/Q T"/.2  LL// 0xx/.s AB++B4 cPdjd|jdDS)zRemove Sentry baggage from the given header. Given a Baggage header, return a new Baggage header with all Sentry baggage items removed. rc3zK|]3}tjj|js|5ywr#)rrrr)r6rs r'r7z/Baggage.strip_sentry_baggage..s2 -D2288F-s9;)r1r)rs r'strip_sentry_baggagezBaggage.strip_sentry_baggages+xx "LL-   r)cxtt|jjd}|d|cxkrdkr|Syy)zConvenience method to get the sample_rand value from the sentry_items. We validate the value and parse it as a float before returning it. The value is considered valid if it is a float in the range [0, 1). rN?)rrr rL)r&rs r'rzBaggage._sample_randsD"%):):)>)>})MN  "sk'?C'? (@r)cHd|jdd|jdS)Nz )r3rr:s r'rzBaggage.__repr__ s,DNNtNDE[QUQ]Q]P^^_``r))rT)F)rDrErFrrr/recompilerr(rrr r*r,rr3 staticmethodr6rrr5r)r'rrEsAIM$"**Z0    !A!AFAA@,4,4\      ar)rcV|jd}t||ryt||dS)zy Returns True if url matches trace_propagation_targets configured in the given client. Otherwise, returns False. trace_propagation_targetsFT)substring_matching)rMrr)rurlr@s r'should_propagate_tracerCs1 !'/J KVS! C!:t TTr)ci}|jD]@\}}|jdr|dd}|jddj}|||<B|S)z Normalizes incoming data so the keys are all lowercase with dashes instead of underscores and stripped from known prefixes. rCNr-r,)rar?r.r)rrWr0rs r'rrs` D#))+ U >>' "ab'Ckk#s#))+S , Kr)c.ddlmfd}|S)a Create a span decorator that can wrap both sync and async functions. :param op: The operation type for the span. :type op: str or :py:class:`sentry_sdk.consts.OP` or None :param name: The name of the span. :type name: str or None :param attributes: Additional attributes to set on the span. :type attributes: dict or None :param template: The type of span to create. This determines what kind of span instrumentation and data collection will be applied. Use predefined constants from :py:class:`sentry_sdk.consts.SPANTEMPLATE`. The default is `SPANTEMPLATE.DEFAULT` which is the right choice for most use cases. :type template: :py:class:`sentry_sdk.consts.SPANTEMPLATE` r)should_send_default_piichtjfd} tj|_tjfd} tj|_tj r|S|S#t $rYawxYw#t $rY3wxYw)zD Decorator to create a span for the given function. c Kt}|/tjdt  |i|d{S xs t } xst xsd}t ||} }|j ||5}|j xsit||| || |i|d{}t||||cdddS77#1swYyxYwwNzbCannot create a child span for %s. Please start a Sentry transaction before calling this function.r)rXrY get_current_spanrrr _get_span_op_get_span_name start_child update_data_set_input_attributes_set_output_attributesargskwargs current_spanspan_op function_name span_namesend_piiriresult attributesfrYrXrGtemplates r' async_wrapperzDcreate_span_decorator..span_decorator..async_wrapperGs ,-L# V*1- ////2L2G C$:1$=CM&xGI.0H))*  !1r2%(HmQf !$1&11&tXxH0 2s:7C(CA C(2C:C;C C(CC%!C(c t}|'tjdt  |i|S xs t } xst xsd}t ||} }|j ||5}|j xsit||| || |i|}t||||cdddS#1swYyxYwrJrKrSs r' sync_wrapperzCcreate_span_decorator..span_decorator..sync_wrapperms,-L# V*1- $)&))2L2G C$:1$=CM&xGI.0H))*  !1r2%(HmQfD+F+&tXxHs >>CC) functoolswrapsinspect signature __signature__riscoroutinefunction)r]r_rar\rYrXrGr^s` r'span_decoratorz-create_span_decorator..span_decoratorAs      @ *1*;*;A*>M '      @ )0):):1)=L &  & &q )  Y   L   s#B#B% B"!B"% B10B1)sentry_sdk.scoperG)rXrYr\r^rhrGs```` @r'create_span_decoratorrj+s(9U U n r)cN|xstj}|j}|S)zU Returns the currently active span if there is one running, otherwise `None` )r[get_current_scoperi)r{rVs r'rLrLs&  3Z113E::L r)c|xs t}|V|jtj|j*|jjtjyyy)z Set the status of the current or given span to ERROR. Also sets the status of the transaction (root span) to ERROR. N)rL set_statusr ERRORcontaining_transaction)ris r'set_span_erroredrqsZ  %#%D   (()  & & 2  ' ' 2 2:3C3C D 3r)r8r9rc|\}}||ks tdt|}t|dz}t|dz} |j||}|dz S#t$r |}Y|dz SwxYw)aGenerate a sample_rand value from a trace ID. The generated value will be pseudorandomly chosen from the provided interval. Specifically, given (lower, upper) = interval, the generated value will be in the range [lower, upper). The value has 6-digit precision, so when printing with .6f, the value will never be rounded up. The pseudorandom number generator is seeded with the trace ID. z/Invalid interval: lower must be less than upperi@B)rrr randrange)rrrr/rng lower_scaled upper_scaledsample_rand_scaleds r'rrsLE5 5=JKK  Cuy()Luy()L* ]]<F  )) **  )) *sA A'&A'c$||y|durd|fS|dfS)z Compute the lower (inclusive) and upper (exclusive) bounds of the range of values that a generated sample_rand value must fall into, given the parent_sampled and sample_rate values. rrTr8r9r5)rrs r'rrs0!4 4 KCr)cd}t|tr|j|}|St||r t ||}|S|S#t $rd}Y|SwxYw)z Gets a value from a source object. The source can be a dict or an object. It is checked for dictionary keys and object attributes. N)r=dictrLrgetattrr)r'r0rs r' _get_valuer}sj E&$ 3 L 63  , L5L  L s A AAc|}|tjk(rDd}|r3dD].}|j|st||ts)||}n|rd|}|Sd}|S|tj k(rd|}|S|tj k(rd|}|S)zF Get the name of the span based on the template and the name. N)model model_namezchat chatz invoke_agent z execute_tool )r AI_CHATrLr=r>AI_AGENTAI_TOOL)r^rYrUrYrr0s r'rNrNs I<''' .::c?z&+s'C"3KE/ (-eE7O  39   \** *#D6*  \)) )#D6* r)ctjtjtjtj tj tji}|j|tj}t|S)z> Get the operation of the span based on the template. ) r rr GEN_AI_CHATrGEN_AI_INVOKE_AGENTrGEN_AI_EXECUTE_TOOLrLFUNCTIONr>)r^mappingrXs r'rMrM s[ bnnr55b44G Xr{{ +B r7Nr)c i|tjtjtjfvrtj t ftj t ftjt ftjt ftjtftjtftjtftjtftjtftjtfd fd}t!|j#D]\}}|dk(rCt%|t r3j'tj(gj+d|dN|dk(rCt%|t r3j'tj(gj+d|d||||tjk(r!|rt-||dtj.<tj(vr-t-tj(tj(<S) z; Get input attributes for the given span template. ) rragent agent_name max_tokensfrequency_penaltypresence_penalty temperaturetop_ptop_kcJ|vr|\}}|t||r||<yyyyr#)r=)r0r attribute data_typer\rs r' _set_from_keyz,_get_input_attributes.._set_from_key1s?g~)0&I$E9)E,1Jy)*F$r)promptuser)rolecontent system_promptsystem)rTrU)r rrrr GEN_AI_REQUEST_MODELr>GEN_AI_AGENT_NAMEGEN_AI_REQUEST_MAX_TOKENSr GEN_AI_REQUEST_FREQUENCY_PENALTYrGEN_AI_REQUEST_PRESENCE_PENALTYGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_PGEN_AI_REQUEST_TOP_Klistrar= setdefaultGEN_AI_REQUEST_MESSAGESr0rGEN_AI_TOOL_INPUT) r^rZrTrUrr0rr\rs @@r'_get_input_attributesrs JL))<+?+?AUAUVV33S9#88#>00#6#55s;#==sC"*"K"KU!S!)!I!I5 Q$??G33U;33S9   2v||~.JCh:eS#9%%h&F&FKRR#6o%*UC*@%%h&F&FKRR%%8 #u %/<'''H1:V ,2 8--. '':57@ x77 88 8334 r)cifd}|tjd|tjd|tjdS)z Get usage attributes. c^|D]'}t|}|t|ts#||<)yr#)r}r=r)rkeysr0rr\usages r'_set_from_keysz-_get_usage_attributes.._set_from_keys\s2Cuc*E Zs%;(- 9%r)) prompt_tokens input_tokens)completion_tokens output_tokens) total_tokens)r GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)rrr\s` @r'_get_usage_attributesrUsY J.**)++.** r)ci}|tjtjtjfvrt 5|g}t |d}|j |t |d}t |d}|j ||D]}||jt|!t |d}|#t|tr||tj<t |d}|#t|tr||tj<ddd|tjk(r|rt||tj<|S#1swYr GEN_AI_RESPONSE_MODELrGEN_AI_TOOL_OUTPUT) r^rZr[r\usage_candidatesrmetausage_candidaters r'_get_output_attributesrss/ JL))<+?+?AUAUVV ( * &x vw/E  # #E *fj1DtW-E  # #E *#3".%%&;O&LM$4 $FG4J%*Z*E=G 899:#FL9J%*Z*E=G 899:-+2<'''H2;F2C 8../ 9+ *sAE A>E  Eci}|tjk(r#tjdtj|i}n||tj k(rtjdi}nV|tj k(rCtjdtj|i}|j}|||tj<|jt|||||j|xsiy)a Set span input attributes based on the given span template. :param span: The span to set attributes on. :param template: The template to use to set attributes on the span. :param send_pii: Whether to send PII data. :param f: The wrapped function. :param args: The arguments to the wrapped function. :param kwargs: The keyword arguments to the wrapped function. invoke_agentr execute_toolN) r rr GEN_AI_OPERATION_NAMErrrGEN_AI_TOOL_NAMErGEN_AI_TOOL_DESCRIPTIONrrrP) rir^rZrYr]rTrUr\ docstrings r'rQrQsJ<(((  * *N  & &  \)) )  * *F  \)) )  * *N  % %t II  ;DJx77 8+HhfMNZ%2&r)cD|jt|||xsiy)a% Set span output attributes based on the given span template. :param span: The span to set attributes on. :param template: The template to use to set attributes on the span. :param send_pii: Whether to send PII data. :param result: The result of the wrapped function. N)rPr)rir^rZr[s r'rRrRs! +HhGM2Nr))rr(r)Span)Fmanualr#)S contextlibrbrdrr<rcollections.abcrdatetimerrandomr urllib.parserrrr[sentry_sdk.constsrr r r sentry_sdk.utilsr r rrrrrrrrrrrtypingrrrrrrtypesrr=rbase64_strippedr!rNcontextmanagerrkr}rrrrrrr]rrrCrDEFAULTrjrLrqrrr}rNrMrrrrQrRsentry_sdk.tracingrr(rrr5r)r'rs #' DD !  RZZ(W(>$ ,,^ @(BHJ>>@&(n@n@bFaFaR U " $4,2F2Fm` E *@  $4 6r<$N"'J O 'r)