
    Ij                    @   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZ ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ  ee       jB                  dz  dz  Z"d!dZ#d!d	Z$d"d
Z%d!dZ&ejN                  jQ                  ddedddddfdedddddfdedddddfdedddddfdedddddfdedddddfdedddddfdedddddfdedddddfdedddddfdedddddfg      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#d       Z)d!dZ*d!dZ+d!dZ,d!dZ-d"dZ.d"dZ/d!d Z0y)$u   tests.test_prompt_byte_classifier_2645 — task-2645 regression (회장 verbatim).

회장 verbatim 4 구간 + 4096 absolute + path-only compact mode. wc -c bytes 측정.
    )annotationsN)Path)CHANNEL_ABSOLUTE_OVERFLOWCOKACDIR_CHANNEL_ABSOLUTE_LIMIT
HARD_BLOCKOK_ABOVE_TARGET	OK_TARGETPROMPT_HARD_BLOCK_THRESHOLDPROMPT_OK_ABOVE_TARGET_MAXPROMPT_OK_TARGET_MAXPROMPT_WARNING_MAXWARNING_BUT_ALLOWEDbuild_path_only_compact_promptclassify_byte_countclassify_prompt_bytes
is_allowedmeasure_utf8_bytesrequires_path_only_compactfixturesdispatch_gatec                     d} t         | k(  }|st        j                  d|fdt         | f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d} t        | k(  }|st        j                  d|fdt        | f      d	t        j                         v st        j
                  t              rt        j                  t              nd	t        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d
} t        | k(  }|st        j                  d|fdt        | f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d
} t        | k(  }|st        j                  d|fdt        | f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d} t        | k(  }|st        j                  d|fdt        | f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} y )N  ==z%(py0)s == %(py3)sr   py0py3assert %(py5)spy5  r   <  r   r
      r   )r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   r
   r   @py_assert2@py_assert1@py_format4@py_format6s       W/home/jay/workspace/.worktrees/task-2645-dev2/tests/test_prompt_byte_classifier_2645.py*test_policy_constants_match_chair_verbatimr2   '   s   #''4''''4''''''''''''4''''''')--%----%------%---%----------!%%%%%%%%%%%%%%%%%%%%%%%%%*..&$....&$......&...&...$........22*d2222*d222222*222*222d2222222    c                     d} t         | k(  }|st        j                  d|fdt         | f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d} t        | k(  }|st        j                  d|fdt        | f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d} t        | k(  }|st        j                  d|fdt        | f      dt        j                         v st        j
                  t              rt        j                  t              ndt        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d	} t        | k(  }|st        j                  d|fdt        | f      d	t        j                         v st        j
                  t              rt        j                  t              nd	t        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} d
} t        | k(  }|st        j                  d|fdt        | f      d
t        j                         v st        j
                  t              rt        j                  t              nd
t        j                  |       dz  }dd|iz  }t        t        j                  |            d x}} y )Nr	   r   r   r   r   r    r   r   r   r   )r	   r$   r%   r&   r'   r(   r)   r*   r+   r   r   r   r   r,   s       r1   &test_verdict_labels_are_chair_verbatimr5   /   s   ##9####9######9###9##########//?/////?///////?///?///////////"77"77777"7777777777777"77777777%%:%%%%:%%%%%%:%%%:%%%%%%%%%%(CC$(CCCCC$(CCCCCCC$CCC$CCC(CCCCCCCCr3   c                6   d}t        |      }| dz  }|j                  |j                  d             t        j                  ddd| gddd      }t        |j                  j                               }||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d| d|       dz   d|iz  }t        t        j                   |            d}t#        |      }	||	k7  }|s#t        j                  d|fd||	f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t"              rt        j                  t"              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }
dd|
iz  }t        t        j                   |            dx}}	y)uC   python len(encode) == ``wc -c < file`` (raw UTF-8 bytes 동등성).u6   한글 prompt 측정 — UTF-8 multibyte 검증 / 2645zp.binzutf-8bashz-czwc -c < T)capture_outputtextcheckr   )z%(py0)s == %(py2)spy_byteswc_bytesr   py2zpy=z wc=z
>assert %(py4)spy4N)!=)z0%(py0)s != %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}lensample)r   r>   r   r    assert %(py7)spy7)r   write_bytesencode
subprocessrunintstdoutstripr$   r%   r&   r'   r(   r)   _format_assertmsgr*   r+   rA   )tmp_pathrB   r;   rawprocr<   r.   @py_format3@py_format5@py_assert4r0   @py_format8s               r1   $test_measure_utf8_bytes_matches_wc_crT   8   s   EF!&)H
W
COOFMM'*+>>	#'($dD 4;;$$&'Hx???8x??????8???8??????x???x????3xjXJ!???????6{"8{""""8{""""""8"""8""""""s"""s""""""6"""6"""{"""""""r3   c                 D   d } t        |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}x}}t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)	Nr   r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   )r   r>   r?   rD   assert %(py9)spy9s   bytes-not-str)r   r$   r%   r&   r'   r(   r)   r*   r+   pytestraises	TypeError)r.   @py_assert3@py_assert6@py_assert5rS   @py_format10s         r1   0test_measure_utf8_bytes_handles_none_and_invalidr_   H   s    "(d#(q(#q((((#q((((((((((((d(((#(((q(((((((	y	! -+,- - -s   DDz4n,verdict,allowed,warning,hard_block,channel,compactTFr   i  r!   i  r"   =  i  r#   i  id  c                >   t        |       }|j                  }||k(  }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}}	|j                  }||u }	|	st        j                  d|	fd	||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d
t	        j
                         v st        j                  |      rt        j                  |      nd
dz  }
dd|
iz  }t        t        j                  |            d x}}	|j                  }||u }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}}	|j                  }||u }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}}	|j                  }||u }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}}	|j                  }||u }	|	st        j                  d|	fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}}	|j                  }|| k(  }	|	st        j                  d|	fd|| f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |       rt        j                  |       nddz  }
dd|
iz  }t        t        j                  |            d x}}	y )Nr   )z/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py4)scverdict)r   r>   r?   assert %(py6)spy6is)z/%(py2)s
{%(py2)s = %(py0)s.allowed
} is %(py4)sallowed)z/%(py2)s
{%(py2)s = %(py0)s.warning
} is %(py4)swarning)z2%(py2)s
{%(py2)s = %(py0)s.hard_block
} is %(py4)s
hard_block)z8%(py2)s
{%(py2)s = %(py0)s.channel_overflow
} is %(py4)schannel)z=%(py2)s
{%(py2)s = %(py0)s.requires_compact_mode
} is %(py4)scompact)z2%(py2)s
{%(py2)s = %(py0)s.utf8_bytes
} == %(py4)sn)r   rc   r$   r%   r&   r'   r(   r)   r*   r+   rh   ri   rj   channel_overflowrequires_compact_mode
utf8_bytes)rm   rc   rh   ri   rj   rk   rl   rb   r.   r[   rQ   @py_format7s               r1   #test_classify_byte_count_boundariesrr   O   s|   ( 	AA999911999991199999119<<%<:%%%%<:%%%%%%1%%%1%%%<%%%%%%:%%%:%%%%%%%(((((((((((1(((1(((((((((((((((((((""-"g----"g------1---1---"------g---g-------<<<1<111<11r3   c                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)N)rX   rY   
ValueErrorr    r3   r1   )test_classify_byte_count_rejects_negativerw   m   s+    	z	"  B     s   /8c                    t        j                  t        dz  j                               } | d   d   }d|z  }t	        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t        |      }|j                  }	| d   d   }|	|k(  }
|t        k(  }|
r|st        j                  d|
|fd|	|t        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}	x}
x}}|j                   }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
}|j"                  }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
}|j$                  }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
}t'        |      }d}||u }|st        j                  d|fd||f      d t        j                         v st        j                  t&              rt        j                  t&              nd d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}y )!Nzprompt_3270_allow.jsoninputprompt_byte_lengthx  r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   promptr   py1r   re   assert %(py8)spy8expectedrc   r   r   z/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)sz%(py6)s == %(py7)srb   r   r   r>   re   rD   rV   rW   Trf   z/%(py2)s
{%(py2)s = %(py0)s.allowed
} is %(py5)sr   r>   r    rC   rD   Fz2%(py2)s
{%(py2)s = %(py0)s.hard_block
} is %(py5)sz=%(py2)s
{%(py2)s = %(py0)s.requires_compact_mode
} is %(py5)sz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sr   )jsonloadsFIXTURE_DIR	read_textr   r$   r%   r&   r'   r(   r)   r*   r+   r   rc   r   rh   rj   ro   r   fixrm   r~   r-   r]   rR   rq   @py_format9rb   r.   r[   rS   r^   r0   s                 r1   1test_3270_bytes_prompt_must_be_allowed_regressionr   s   sW   
**k$<<GGI
JCG)*A1WFf%--%----%---------------f---f---%----------f%A99EJ	2E92EE2oEEEEE92oEEEEEE1EEE1EEE9EEE2EEEEEEoEEEoEEEEEEE9999119<< 5 <5    <5      1   1   <   5       ""+e+"e++++"e++++++1+++1+++"+++e+++++++f%%%%%%%%%%%%:%%%:%%%%%%f%%%f%%%%%%%%%%%%%r3   c                    t        j                  t        dz  j                               } | d   d   }d|z  }t	        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t        |      }|j                  }	| d   d   }|	|k(  }
|t        k(  }|
r|st        j                  d|
|fd|	|t        f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}	x}
x}}|j                   }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
}|j"                  }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
}|j$                  }	d}|	|u }
|
st        j                  d|
fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
}t'        |      }d}||u }|st        j                  d|fd||f      d t        j                         v st        j                  t&              rt        j                  t&              nd d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t)        |      }d}||u }|st        j                  d|fd||f      d!t        j                         v st        j                  t(              rt        j                  t(              nd!d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}y )"Nzprompt_3901_block.jsonry   rz   r{   r`   r   r}   r   r~   r   r   r   r   rc   r   r   rb   r   r   rV   rW   Frf   r   r   rC   rD   Tr   r   r   r   r   )r   r   r   r   r   r$   r%   r&   r'   r(   r)   r*   r+   r   rc   r   rh   rj   ro   r   r   r   s                 r1   1test_3901_bytes_prompt_must_be_blocked_regressionr      s   
**k$<<GGI
JCG)*A1WFf%--%----%---------------f---f---%----------f%A99@J	2@92@@2j@@@@@92j@@@@@@1@@@1@@@9@@@2@@@@@@j@@@j@@@@@@@9999119<<4<4<411<4""*d*"d****"d******1***1***"***d*******f&&&&&&&&&&&&:&&&:&&&&&&f&&&f&&&&&&&&&&&&&%f-55-5555-555555%555%555555f555f555-5555555555r3   c                 N	   t        j                  t        dz  j                               } | d   d   }d|z  }t	        |      }|j
                  }| d   d   }||k(  }|t        k(  }|r|st        j                  d||fd||t        f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }	t        t        j                  |	            d x}x}x}}|j                  }d}||u }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}}|j                   }d}||u }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}}| d   d   }t	        d|z        }|j
                  }| d   d   }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            d x}x}}y )Nz!prompt_4096_plus_silent_drop.jsonry   rz   r{   r   rc   r   r   rb   r   r   rV   rW   Trf   )z8%(py2)s
{%(py2)s = %(py0)s.channel_overflow
} is %(py5)sr   rC   rD   r   alternative_byte_lengthyalternative_verdict_for_6500r   )z/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py5)sc2)r   r   r   r   r   rc   r   r$   r%   r&   r'   r(   r)   r*   r+   rn   rj   )r   rm   r~   rb   r.   r]   r[   rR   rS   r^   r0   n2r   s                r1   1test_4096_plus_silent_drop_fixture_chair_overflowr      s   
**k$GGRRT
UCG)*A1WFf%A99OJ	2O92OO26OOOOOO926OOOOOOO1OOO1OOO9OOO2OOOOOO6OOOO6OOOOOOOO%%%%%%%%%%%%1%%%1%%%%%%%%%%%%%<<4<4<411<4	W/	0B	sRx	(B::HZ)GHH:HHHHH:HHHHHHH2HHH2HHH:HHHHHHHHHHH&$&$&&&&$&&&&&&2&&&2&&&&&&$&&&&&&&r3   c                   | dz  }d}|j                  |       t        |d      }t        j                  |      j	                         }t        |      }||v }|s#t        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	d
z  }dd|iz  }t        t        j                  |            d x}}||v }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndd	t        j                         v st        j                  |      rt        j                  |      nd	dz  }
dd|
iz  }t        t        j                  |            d }	d}||v }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	dz  }dd|iz  }t        t        j                  |            d x}}t        |      }|t        k  }|s/t        j                  d|fd|t        f      dt        j                         v st        j                  t              rt        j                  t              ndd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd
z  }dd|iz  }t        t        j                  |            d x}}y )Nztask-2645.mds   # task-2645 verbatim speczdispatch verify)extra_contextin)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py5)sstrmdrl   )r   r   r   r    rC   rD   )z%(py0)s in %(py2)sshar=   zassert %(py4)sr?   z[DISPATCH_PATH_ONLY_COMPACT]z%(py1)s in %(py3)sr   r   r   r    )<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py5)sr   r   )rE   r   hashlibsha256	hexdigestr   r$   r%   r&   r'   r(   r)   r*   r+   r   r   )rM   r   payloadrl   r   r-   rR   r0   rS   r.   rP   rQ   @py_assert0r/   s                 r1   5test_path_only_compact_mode_uses_task_md_path_and_shar      sD   	N	"B*GNN7,R?PQG
..
!
+
+
-Cr77g7g33rr7gg'>3'33'')4)W4444)W444)444444W444W4444444g&<&*<<<<<&*<<<<<<<<<<<<<<<<g<<<g<<<&<<<<<<*<<<<*<<<<<<<<r3   c                n   | dz  }t        |      }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d x}}y )	Nznonexistent.mdMISSINGr   r   rl   r   r   r    )	r   r$   r%   r)   r&   r'   r(   r*   r+   )rM   r   rl   r   r-   r/   r0   s          r1   +test_path_only_compact_handles_missing_filer      sp    	$	$B,R0G999r3   c                    t        d      } | j                         }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d	   }|t        k(  }|st        j                  d|fd
|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr|   schemaz&dispatch.prompt_byte_classification.v1r   )z%(py1)s == %(py4)s)r   r?   rd   re   rc   )z%(py1)s == %(py3)sr   r   r   r    policyok_target_maxr   warning_maxr"   channel_absolute_limitr#   )r   to_jsonr$   r%   r)   r*   r+   r   r&   r'   r(   )	rb   jr   r[   r-   rQ   rq   r/   r0   s	            r1   4test_classification_json_includes_policy_and_verdictr      s   D!A			AX;BBB;BBBBB;BBBB;BBBBBBBBBBBY<*<?****<?***<******?***?*******X;'/4/'4////'4///'///4///////X;}%--%----%---%----------X;/08D80D88880D8880888D8888888r3   )returnNone)rM   r   r   r   )rm   rI   rc   r   rh   boolri   r   rj   r   rk   r   rl   r   r   r   )1__doc__
__future__r   builtinsr&   _pytest.assertion.rewrite	assertionrewriter$   r   r   rG   pathlibr   rX   utils.prompt_byte_classifierr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   __file__parentr   r2   r5   rT   r_   markparametrizerr   rw   r   r   r   r   r   r   rv   r3   r1   <module>r      s   #           ( 8n##j0?B3D# - :	
y4%uM	y4%uM	4%uM	4%uM	"4$uM	"4$uM	z5%tL	z5%tL	z5%tL	(5%tL	(5%tL 
#'26#.2 
!  
&6' 
= 9r3   