
    \j T                        d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZmZ d dl d d	lmZ d d
lmZ  ed      Z ej2                  d      j5                  d      j7                         Zej;                         ZddddgidZ ed      jA                  d      j7                         Z!dZ"dZ#da$d Z%d Z&dede'fdZ( G d de      Z)d Z*d Z+d Z,d Z-d  Z.d! Z/d" Z0d# Z1d$ Z2d% Z3d& Z4d' Z5d( Z6d) Z7d* Z8d+ Z9d, Z:d- Z;d. Z<d/ Z=d0 Z>d1 Z?d2 Z@d3 ZAd4 ZBd5 ZCd6 ZDd7 ZEd8 ZFd9 ZGd: ZHd; ZId< ZJd= ZKd> ZLd? ZMdId@edAeNe'   fdBZOdId@edAeNe'   fdCZPd@efdDZQdId@edAeNe'   fdEZRd@efdFZSdG ZTdH ZUy)J    N)Thread)Config)Context)create_diagnostic_id_DiagnosticAccumulator)DefaultEventProcessor)
EventInputEventInputCustomEventInputEvaluationEventInputIdentify)*do_proxy_tests)MockHttpfake_sdk_keyuserkeyReduserredactedAttributesname)kindkey_metaflagkey   '  c                      t               ay N)r   	mock_http     R/root/env/lib/python3.12/site-packages/testing/impl/events/test_event_processor.pysetup_functionr#       s	    
Ir!   c                  :    t         t         j                          y y r   )epstopr    r!   r"   teardown_functionr'   $   s    	~
	 r!   contextreturnc                     i }t        | j                        D ]/  }| j                  |      }||j                  ||j                  <   1 |S r   )rangeindividual_context_countget_individual_contextr   r   )r(   retics       r"   make_context_keysr1   (   sN    
C7334  **1-=%%CK  Jr!   c                       e Zd Zd Zy)DefaultTestProcessorc                     d|vrd|d<   d|vrd|d<   t        di |}t        t        |            }t        j                  | |t
        |       y )Ndiagnostic_opt_outTsdk_keySDK_KEY)diagnostic_accumulatorr    )r   r   r   r   __init__r   )selfkwargsconfigr8   s       r"   r9   zDefaultTestProcessor.__init__2   sZ    #v-+/F'(F" )F9!&!!78LV8T!U&&tVYYopr!   N)__name__
__module____qualname__r9   r    r!   r"   r3   r3   1   s    qr!   r3   c                      t               5 } t        t        t              }| j	                  |       t        |       }t        |      dk(  sJ t        |d   |       d d d        y # 1 sw Y   y xY w)N   r   )r3   r   	timestampr(   
send_eventflush_and_get_eventslencheck_identify_eventr%   eoutputs      r"   test_identify_event_is_queuedrJ   ;   sa    		 +2y'2
a%b)6{aVAY*+ + +s   AA$$A-c                      t        d      5 } t        t        t              }| j	                  |       t        |       }t        |      dk(  sJ t        |d   |t               d d d        y # 1 sw Y   y xY w)NTall_attributes_privaterA   r   )	r3   r   rB   r(   rC   rD   rE   rF   filtered_contextrG   s      r"   *test_context_is_filtered_in_identify_eventrO   D   sf    	t	< =y'2
a%b)6{aVAY+;<= = =s   AA++A4c                  N   t               5 } t        t        t        t        j
                  t        ddd dd d
      }| j                  |       t        |       }t        |      dk(  sJ t        |d   |       t        |d   |       t        |d          d d d        y # 1 sw Y   y xY w)NrA   valuedefaultT   r   r   r3   r   rB   r(   flagr   rC   rD   rE   check_index_eventcheck_feature_eventcheck_summary_eventrG   s      r"   8test_individual_feature_event_is_queued_with_index_eventrY   M   s    		 '2 GTXXtQQUW`bfhlm
a%b)6{a&)Q'F1Iq)F1I&' ' 's   BBB$c                  \   t        d      5 } t        t        t        t        j
                  t        ddd dd d
      }| j                  |       t        |       }t        |      dk(  sJ t        |d   |t               t        |d   |       t        |d          d d d        y # 1 sw Y   y xY w)	NTrL   rA   rQ   rR   rS   r   r   )r3   r   rB   r(   rU   r   rC   rD   rE   rV   rN   rW   rX   rG   s      r"   'test_context_is_filtered_in_index_eventr[   X   s    	t	< ' GTXXtQQUW`bfhlm
a%b)6{a&)Q(89F1Iq)F1I&' ' 's   BB""B+c                     t        d      5 } t        t        t        t        j
                  t        ddd dd d
      }t        t        t        t        j
                  t        ddd dd d
      }| j                  |       | j                  |       t        |       }t        |      d	k(  sJ t        |d
   |       t        |d   |       t        |d   |       t        |d          d d d        y # 1 sw Y   y xY w)Ni,  context_keys_flush_intervalrA   value1rR   Tr   value2   r   rS   rT   r%   e0e1rI   s       r"   =test_two_events_for_same_context_only_produce_one_index_eventre   c   s    	C	@ 'B!)WdhhaSWYbdhjno!)WdhhaSWYbdhjno
b
b%b)6{a&)R(F1Ir*F1Ir*F1I&' ' 's   CC++C4c                  6   t        d      5 } t        t        t        t        j
                  t        ddd dd d
      }t        t        t        t        j
                  t        ddd dd d
      }| j                  |       t        j                  d	       | j                  |       t        |       }t        |      d
k(  sJ t        |d   |       t        |d   |       t        |d   |       t        |d   |       t        |d          d d d        y # 1 sw Y   y xY w)Ng?r]   rA   r_   rR   Tr   r`   g?   r   rS   ra   )r3   r   rB   r(   rU   r   rC   timesleeprD   rE   rV   rW   rX   rb   s       r"   ?test_new_index_event_is_added_if_context_cache_has_been_clearedrj   q   s    	C	@ 'B!)WdhhaSWYbdhjno!)WdhhaSWYbdhjno
b

3
b%b)6{a&)R(F1Ir*&)R(F1Ir*F1I&' ' 's   C9DDc                     t               5 } t               dz   }t        t        j                        j                  t        j
                        j                  |      j                         }t        t        t        |j                  |ddd dd d
      }| j                  |       t        |       }t        |      dk(  sJ t        |d   |       t        |d   |       t!        |d          d d d        y # 1 sw Y   y xY w)	N順 rA   rQ   rR   FrS   r   r   )r3   nowFlagBuilderrU   r   versiondebug_events_until_datebuildr   rB   r(   rC   rD   rE   rV   check_debug_eventrX   r%   future_timedebugged_flagrH   rI   s        r"   =test_event_kind_is_debug_if_flag_is_temporarily_in_debug_moderv      s    		 
'2efn#DHH-55dllC[[\ghnnp G]5F5FWXZacgirtxz  A
a%b)6{a&)Q'&)Q'F1I&
' 
' 
's   CC33C<c                     t               5 } t               dz   }t        t        j                        j                  t        j
                        j                  |      j                         }t        t        t        |j                  |ddd dd d
      }| j                  |       t        |       }t        |      dk(  sJ t        |d   |       t        |d   |       t!        |d   |       t#        |d	          d d d        y # 1 sw Y   y xY w)
Nrl   rA   rQ   rR   Tra   r   r   rS   )r3   rm   rn   rU   r   ro   rp   rq   r   rB   r(   rC   rD   rE   rV   rW   rr   rX   rs   s        r"   +test_event_can_be_both_tracked_and_debuggedrx      s    		 '2efn#DHH-55dllC[[\ghnnp G]5F5FWXZacgirtxz~
a%b)6{a&)Q'F1Iq)&)Q'F1I&' ' 's   C.DDc                     t               5 } t               dz   }t        j                  |       | j	                  t        t        t        j                  d                   t        |        |dz   }t        t        j                        j                  t        j                        j                  |      j                         }t!        t        t"        |j                  |ddd dd d
      }| j	                  |       t        |       }t%        |      dk(  sJ t'        |d	   |       t)        |d   |       t+        |d
          d d d        y # 1 sw Y   y xY w)N  	otherUserr   rA   rQ   rR   FrS   r   r   )r3   rm   r   set_server_timerC   r   rB   r   createrD   rn   rU   r   ro   rp   rq   r   r(   rE   rV   rr   rX   r%   server_timedebug_untilru   rH   rI   s         r"   ^test_debug_mode_does_not_expire_if_both_client_time_and_server_time_are_before_expiration_timer      s   		 '2edl 	!!+.
(GNN;4OPQR  "E)#DHH-55dllC[[\ghnnp G]5F5FWXZacgirtxz  A
a &b)6{a&)Q'&)Q'F1I&+' ' 's   D6E

Ec                     t               5 } t               dz
  }t        j                  |       | j	                  t        t        t        j                  d                   t        |        |dz   }t        t        j                        j                  t        j                        j                  |      j                         }t!        t        t"        |j                  |ddd dd d
      }| j	                  |       t        |       }t%        |      dk(  sJ t'        |d	   |       t)        |d          d d d        y # 1 sw Y   y xY w
Ni N  r{   rz   rA   rQ   rR   Fr   r   r3   rm   r   r|   rC   r   rB   r   r}   rD   rn   rU   r   ro   rp   rq   r   r(   rE   rV   rX   r~   s         r"   Utest_debug_mode_expires_based_on_client_time_if_client_time_is_later_than_server_timer         		 '2eem 	!!+.
(GNN;4OPQR  "D(#DHH-55dllC[[\ghnnp G]5F5FWXZacgirtxz  A
a &b)6{a&)Q'F1I&)' ' '   D'D;;Ec                     t               5 } t               dz   }t        j                  |       | j	                  t        t        t        j                  d                   t        |        |dz
  }t        t        j                        j                  t        j                        j                  |      j                         }t!        t        t"        |j                  |ddd dd d
      }| j	                  |       t        |       }t%        |      dk(  sJ t'        |d	   |       t)        |d          d d d        y # 1 sw Y   y xY wr   r   r~   s         r"   Utest_debug_mode_expires_based_on_server_time_if_server_time_is_later_than_client_timer      r   r   c                     t               5 } t        d      j                  d      j                         }t        d      j                  d      j                         }d\  }}t	        |t
        |j                  |ddd dd d	
      }t	        |t
        |j                  |d
dd dd d	
      }| j                  |       | j                  |       t        |       }t        |      d
k(  sJ t        |d   |       |d   }|d   dk(  sJ |d   |k(  sJ |d   |k(  sJ |d   dgddddddgddgddd
dddgddk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nflagkey1   flagkey2   )iG i! rA   r_   default1Fr   r`   default2r   r   summary	startDateendDatefeaturesr   )ro   	variationrQ   count)contextKindsrR   counters)r   r   )r3   rn   ro   rq   r   r(   r   rC   rD   rE   rV   )	r%   flag1flag2earlier_time
later_timerd   e2rI   ses	            r"   %test_nontracked_events_are_summarizedr      s   		 
2J'//399;J'//399;#3 j!*guyy%HVZ\fhlnst!,E1hX\^hjnpuv
b
b%b)6{a&)R(AY&zY&&&+,...)}
****~!'%+-A[\^` "(%+-A[\^`"
 
 	
 
!
 
 
s   D,EE
c                     t               5 } t        t        t        dddid      }| j	                  |       t        |       }t        |      dk(  sJ t        |d   |       t        |d   |       d d d        y # 1 sw Y   y xY w)Neventkeythingzstuff g      ?r   r   rA   )	r3   r
   rB   r(   rC   rD   rE   rV   check_custom_eventrG   s      r"   %test_custom_event_is_queued_with_userr      s{    		 )2Yw=QSVW
a%b)6{a&)Q'6!9a() ) )s   A$A88Bc                      t               5 } | j                          | j                          t        j                  J 	 d d d        y # 1 sw Y   y xY wr   )r3   flush_wait_until_inactiver   request_datar%   s    r"   +test_nothing_is_sent_if_there_are_no_eventsr   
  sF    		 .2


!%%---. . .s   3AAc                     t        d      5 } | j                  t        t        t                     | j                          | j                          t        j                  j                  d      dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr7   r6   Authorization
r3   rC   r   rB   r(   r   r   r   request_headersgetr   s    r"   test_sdk_key_is_sentr     sm    			2 Kb
(G<=


!((,,_=JJJK K K   A(A??Bc                     t               5 } | j                  t        t        t                     | j                          | j                          t        j                  j                  d      J 	 d d d        y # 1 sw Y   y xY w)NX-LaunchDarkly-Wrapperr   r   s    r"   )test_wrapper_header_not_sent_when_not_setr     sj    		 O2
(G<=


!((,,-EFNNNO O Os   A%A::Bc                     t        dd      5 } | j                  t        t        t                     | j                          | j                          t        j                  j                  d      dk(  sJ 	 d d d        y # 1 sw Y   y xY w)NFlaskz0.0.1)wrapper_namewrapper_versionr   zFlask/0.0.1r   r   s    r"   !test_wrapper_header_sent_when_setr      sq    	W	P XTV
(G<=


!((,,-EF-WWWX X Xs   A(B  B	c                     t        d      5 } | j                  t        t        t                     | j                          | j                          t        j                  j                  d      dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   )r   r   r   r   s    r"   (test_wrapper_header_sent_without_versionr   (  sn    	W	5 R
(G<=


!((,,-EF'QQQR R Rr   c                     t               5 } | j                  t        t        t                     | j                          | j                          t        j                  j                  d      dk(  sJ 	 d d d        y # 1 sw Y   y xY w)NX-LaunchDarkly-Event-Schema4r   r   s    r"   #test_event_schema_set_on_event_sendr   0  sl    		 S2
(G<=


!((,,-JKsRRRS S Ss   A(A==Bc                      t        dd      5 } | j                          t        j                  j	                  d      dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr7   F)r6   r5   r   r3   r   r   r   r   r   s    r"   *test_sdk_key_is_sent_on_diagnostic_requestr   8  sS    		e	L KPR
!((,,_=JJJK K Ks   5AAc                      t        d      5 } | j                          t        j                  j	                  d      J 	 d d d        y # 1 sw Y   y xY w)NFr5   r   r   r   s    r"   ,test_event_schema_not_set_on_diagnostic_sendr   =  sO    		7 T2
!((,,-JKSSST T Ts   2A		Ac                      t        d      5 } t        |       }t        |      dk(  sJ |d   dk(  sJ 	 d d d        y # 1 sw Y   y xY w)NFr      r   zdiagnostic-init)r3   rD   rE   )r%   	diag_inits     r"   test_init_diagnostic_event_sentr   B  sQ    		7 62(,	9~""" $5555	6 6 6s	   &=Ac                  L   t        d      5 } t        |        | j                  t        t        t
                     t        |        | j                          t        |       }t        |      dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   d	k(  sJ 	 d d d        y # 1 sw Y   y xY w)
NFr      r   
diagnosticeventsInLastBatchrA   deduplicatedUsersr   )r3   rD   rC   r   rB   r(   _send_diagnosticrE   )r%   
diag_events     r"   1test_periodic_diagnostic_includes_events_in_batchr   I  s    		7 42R 
(G<=R 
)"-
:!###&!\111-.!333-.!3334 4 4s   BBB#c                     t        d      5 } t        |        t        t        t        dd d       }t        t        t        dd d       }| j                  |       | j                  |       t        |        | j                          t        |       }t        |      dk(  sJ |d   dk(  sJ |d   d	k(  sJ |d
   dk(  sJ 	 d d d        y # 1 sw Y   y xY w)NFr   event1event2r   r   r   r   rS   r   rA   )r3   rD   r
   rB   r(   rC   r   rE   )r%   rc   rd   r   s       r"   4test_periodic_diagnostic_includes_deduplicated_usersr   X  s    		7 42R i(D$Gi(D$G
b
bR 
)"-
:!###&!\111-.!333-.!3334 4 4s   B0CCc                      t        d       y )Ni  verify_unrecoverable_http_errorr    r!   r"   .test_no_more_payloads_are_sent_after_401_errorr   j  
    #C(r!   c                      t        d       y )Ni  r   r    r!   r"   .test_no_more_payloads_are_sent_after_403_errorr   m  r   r!   c                      t        d       y )Ni  verify_recoverable_http_errorr    r!   r"   $test_will_still_send_after_408_errorr   p  
    !#&r!   c                      t        d       y )Ni  r   r    r!   r"   $test_will_still_send_after_429_errorr   s  r   r!   c                      t        d       y )Ni  r   r    r!   r"   $test_will_still_send_after_500_errorr   v  r   r!   c                    	
 t        dd      } d g	d 	fd}fd

fd}t        | t        |      5 }	d   t        t        t
        d      }t        t        t
        d	      }|j                  |       |j                  |       j                  d
      }j                         } |        |j                  |k(  sJ |sJ 	 d d d        y # 1 sw Y   y xY w)Nr   rA   )events_max_pendingc                     | d<   y )Nr   r    )inboxr<   httpdiagep_inbox_holders       r"   dispatcher_factoryz=test_does_not_block_on_full_inbox.<locals>.dispatcher_factory~  s    "r!   c                      	 j                  d      } | j                  dk(  r| j                  j                          y =)NTblockr&   )r   typeparamset)messageep_inboxs    r"   event_consumerz9test_does_not_block_on_full_inbox.<locals>.event_consumer  s:    lll.G||v%!!#	 r!   c                  :    t               j                          y )N)target)r   start)r   s   r"   start_consuming_eventszAtest_does_not_block_on_full_inbox.<locals>.start_consuming_events  s    n%++-r!   r   r   r   Fr   )
r   r   r   r
   rB   r(   rC   r   emptyr   )r<   r   r   r%   r   r   message1had_no_morer   r   r   s           @@@r"   !test_does_not_block_on_full_inboxr   y  s    Nq9FhOH. 
vy2D	E 
"1%!)Wh?!)Wh?
f
f<<e<,nn& ~~'''{
 
 
s   BCCc                 $    d }t        |d|        y )Nc                     t        |      5 }|j                  t        t        t                     |j                          |j                          d d d        y # 1 sw Y   y xY wr   )r   rC   r   rB   r(   r   r   )serverr<   securer%   s       r"   _event_processor_proxy_testz4test_http_proxy.<locals>._event_processor_proxy_test  sJ    "6* 	&bMM,Y@AHHJ##%	& 	& 	&s   AAA"POSTr   )monkeypatchr  s     r"   test_http_proxyr    s    &
 .Dr!   c                    t        d      5 }t        j                  |        |j                  t	        t
        t                     |j                          |j                          t        j                          |j                  t	        t
        t                     |j                          |j                          t        j                  J 	 d d d        y # 1 sw Y   y xY wNr7   r   r3   r   set_response_statusrC   r   rB   r(   r   r   resetr   statusr%   s     r"   r   r     s    			2 
.b%%f-
(G<=


!
(G<=


!%%---
. 
. 
.   CCC"c                    t        d      5 }t        j                  |        |j                  t	        t
        t                     |j                          |j                          t        j                          |j                  t	        t
        t                     |j                          |j                          t        j                  J 	 d d d        y # 1 sw Y   y xY wr	  r
  r  s     r"   r   r     s    			2 
2b%%f-
(G<=


!
(G<=


!%%111
2 
2 
2r  c                  X   t        t        d      t              5 } | j                  t	        t
        t                     | j                          | j                          t        j                  j                  d      }|J t        j                  |       d d d        y # 1 sw Y   y xY w)Nr7   r   X-LaunchDarkly-Payload-ID)r   r   r   rC   r   rB   r(   r   r   r   r   uuidUUID)r%   	headerVals     r"   test_event_payload_id_is_sentr    s    	v	:I	F "
(G<=


!--112MN	$$$		)  s   A<B  B)c                     t        t        d      t              5 } | j                  t	        t
        t                     | j                          | j                          | j                  t	        t
        t                     | j                          | j                          t        j                  d   d   j                  d      }t        j                  d   d   j                  d      }||k7  sJ 	 d d d        y # 1 sw Y   y xY w)Nr7   r   r   r  rA   )r   r   r   rC   r   rB   r(   r   r   recorded_requestsr   )r%   firstPayloadIdsecondPayloadIds      r"   .test_event_payload_id_changes_between_requestsr    s    	v	:I	F 1"
(G<=


!
(G<=


!"44Q7:>>?Z[#55a8;??@[\0001 1 1s   CC==Dc                     | j                          | j                          t        j                  t	        d      t        j                  t        j                        S )Nz3Expected to get an HTTP request but did not get one)r   r   r   r   AssertionErrorjsonloadsr   s    r"   rD   rD     sD    HHJ%RSSzz)0011r!   sourcecontext_jsonc                     | d   dk(  sJ | d   |j                   k(  sJ | d   ||j                  j                         n|k(  sJ y )Nr   identifycreationDater(   rB   r(   to_dictdatar   r!  s      r"   rF   rF     sT    <:%%%6#3#3333	?<;Ov~~557Uabbbr!   c                     | d   dk(  sJ | d   |j                   k(  sJ | d   ||j                  j                         n|k(  sJ y )Nr   indexr$  r(   r%  r'  s      r"   rV   rV     sT    <7"""6#3#3333	?<;Ov~~557Uabbbr!   c                 L   | d   dk(  sJ | d   |j                   k(  sJ | d   |j                  k(  sJ |j                  | j                  d      d k(  sJ |j                  j                  sJ | j                  d      |j
                  k(  sJ | j                  d      |j                  k(  sJ | j                  d      |j                  k(  sJ | d	   t        |j                        k(  sJ |j                  | j                  d
      d k(  sJ |j                  j                  sJ y y )Nr   featurer$  r   ro   r   rQ   rR   contextKeys	prereq_of)rB   r   rU   r   ro   r   rQ   default_valuer1   r(   r.  r(  r   s     r"   rW   rW     s#   <9$$$6#3#3333;&**$$$*0++*=488I$&VV6;;CVCVVV88K F$4$444488G,,,88I&"6"6666"3FNN"CCCC,2,<,<,D488K D(^^&JZJZJ^J^^^J^(r!   c                 ^   | d   dk(  sJ | d   |j                   k(  sJ | d   |j                  k(  sJ |j                  | j                  d      d k(  sJ |j                  j                  sJ | j                  d      |j
                  k(  sJ | j                  d      |j                  k(  sJ | j                  d      |j                  k(  sJ | d	   ||j                  j                         n|k(  sJ |j                  | j                  d
      d k(  sJ |j                  j                  sJ y y )Nr   debugr$  r   ro   r   rQ   rR   r(   r.  )rB   r   rU   r   ro   r   rQ   r/  r(   r&  r.  r'  s      r"   rr   rr     s-   <7"""6#3#3333;&**$$$*0++*=488I$&VV6;;CVCVVV88K F$4$444488G,,,88I&"6"6666	?<;Ov~~557Uabbb,2,<,<,D488K D(^^&JZJZJ^J^^^J^(r!   c                 
   | d   dk(  sJ | d   |j                   k(  sJ | d   |j                  k(  sJ | d   |j                  k(  sJ | d   t        |j                        k(  sJ | j                  d      |j                  k(  sJ y )Nr   customr$  r   r(  r-  metricValue)rB   r   r(  r1   r(   r   metric_valuer0  s     r"   r   r     s    <8###6#3#3333;&**$$$<6;;&&&"3FNN"CCCC88M"f&9&9999r!   c                     | d   dk(  sJ y )Nr   r   r    )r(  s    r"   rX   rX     s    <9$$$r!   c                  B    t        t        j                         dz        S )Nrz   )intrh   r    r!   r"   rm   rm     s    tyy{T!""r!   r   )Vr  	threadingr   rh   r  ldclient.configr   ldclient.contextr    ldclient.impl.events.diagnosticsr   r   $ldclient.impl.events.event_processorr   ldclient.impl.events.typesr	   r
   r   r   testing.builderstesting.proxy_test_utilr   testing.stub_utilr   default_configbuilderr   rq   r(   r&  rN   rn   ro   rU   rB   r%   r   r#   r'   dictr1   r3   rJ   rO   rY   r[   re   rj   rv   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  rD   OptionalrF   rV   rW   rr   r   rX   rm   r    r!   r"   <module>rG     s       " $ Y F m m  2 & '
'//)
$
)
)%
0
6
6
8??$ "VH- 
 9%%a(..0			w 4 q0 q+=	'	''' '''0'.'.
<).KOXRSK
T
644$))''':E.2	12cz c$ c
cJ chtn c
	_&: 	_	_$8 	_QU 	_:%5 :%#r!   