+
    ljK                     "  a  R& tT0 t R t^ RIt^ RIt^ RIHtHtHt ^ RIt^t	^Rut
t]
]	,          ]]	,          uttR'tR(tR)tR*tR+tR,tR-tR.tR/tR0tR1tR2tR3tR4tR5tR6tR7t]tR8t ]t!^]	,          t"^]	,          t#^A]	,          ^.]	,          ut$t%^#]	,          ^]	,          ut&t'^t(Rt)](]),           t*Rt+R t,]PZ                  P]                  ]PZ                  P_                  ]04      RR4      t1R	R
RRRR/t2/ t3] ^ k R R lt4R t5]5! ^4      t6]5! ^4      t7]5! ^4      t8]5! ^4      t9]9t:],! ^4      t;],! ^4      t<],! ^4      t=],! ^4      t>],! ^4      t?R t@R tAR tBR tCR tDR tER tFR tGR tHR tIR tJR tKR9R ltLR tMR  tNR! tOR" tPR:R# ltQR$ tR]SR%8X  d
   ]R! 4        R# R# );z
Simulate the CodexBar ESP32 display and save a PNG for the README.
Run: python3 simulate_display.py
Out: docs/display_simulation.png
N)Image	ImageDraw	ImageFonti@  i&  h  c                     R FA  p\         P                  P                  V4      '       g   K*   \        P                  ! W4      u # 	  \        P                  ! 4       #   \
         d     Kh  i ; i)#/System/Library/Fonts/Helvetica.ttc)r   '/System/Library/Fonts/HelveticaNeue.ttc4/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttfz//usr/share/fonts/truetype/dejavu/DejaVuSans.ttfz?/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf)ospathexistsr   truetype	Exceptionload_default)sizeps   & simulate_display.pytry_fontr   3   s^     77>>! ))!22 !!##  s   AA,+A,assetsiconsClaudeclaudeCodexopenaiGeminigeminic                0    V ^8  d   QhR\         R\        /# )   name	height_px)strint)formats   "r   __annotate__r#   G   s      C C     c                0   W3pV\         9  d   \        P                  V 4      pV'       d(   \        P                  P                  \        V R24      MRpV'       d   \        P                  P                  V4      '       d   \        P                  ! V4      P                  R4      pVP                  w  rg\        Wa,          V,          4      pVP                  W3\        P                  4      \         V&   \         V,          # R\         V&   \         V,          # )zDReturn an RGBA icon image scaled to height_px, or None if not found.z.pngNRGBA)_icon_cache	_ICON_MAPgetr
   r   join	_ICON_DIRr   r   openconvertr   r!   resizeLANCZOS)	r   r   keyfnamer   imgwhnew_ws	   &&       r   	load_iconr6   G   s    
C
+d#;@Y5'7dBGGNN4((**T"**62C88DA)*E"zz5*<emmLK s  $Ksr$   c                     R FE  w  r\         P                  P                  V4      '       g   K,   \        P                  ! WVR7      u # 	  \        V 4      #   \
         d     Kb  i ; i)r   )index))r      )r   r9   )r	       )z</usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttfr:   )r
   r   r   r   r   r   r   )r   r   idxs   &  r   try_bold_fontr<   W   s]     77>>! ))!== D>  s   AA&%A&c                    We8  d
   VR,          p\        ^\        W4,
          4      4      pW4,           ^,          p	V P                  W,
          W),
          W,           W),           .WVWxR7       R# )z7Draw a donut arc segment CW from a0 to a1 (PIL angles).r   fillwidthN)maxr!   arc)
drawcxcyroria0a1colorr@   mids
   &&&&&&&&  r   	thick_arcrL   s   sV    	w
c	3rw< E7a-CHHbh"(BH5%  .r$   c                "    V R,           R,          # )z9Map handoff clock degrees (0=top, CW) to PIL arc degrees.i  r    )clocks   &r   clock_to_pilrP   }   s    CK3r$   c                 J    \        WW#V\        V4      \        V4      V4       R # N)rL   rP   )rC   rD   rE   rF   rG   startendrJ   s   &&&&&&&&r   thick_clock_arcrU      s    dL$7c9JERr$   c                     \         P                  ! V4      pW\         P                  ! V4      ,          ,           W\         P                  ! V4      ,          ,
          3# rR   )mathradianssincos)rD   rE   rrO   as   &&&& r   point_clockr]      s9    UATXXa[ "488A;"677r$   c                     \        R \        RV 4      4      p V R8:  d$   \        \        \        ,
          V ,          ,           # \        \        \        ,
          V R,
          ,          ,           # )               @      ?)rA   minARC_START_CLOCKREDLINE_CLOCKARC_END_CLOCK)paces   &r   pace_to_anglerg      sI    sCTN#Ds{-/"AT!IIIMM9dSjIIIr$   c                 `   R \         3R\         3R\        3R\        3R\        3R\        3.p\        R \        RV 4      4      p \        WR,          4       FG  w  w  r#w  rEY u;8:  d
   V8:  g   K  M K  \        W5W,
          \        RWB,
          4      ,          4      u # 	  VR,          ^,          # )	r_   g?g?ra   gffffff?r`   :r9   NNgMbP?)	UNDERGOLDONPACEOVER1OVER2rA   rb   zip
lerp_color)rf   stopsx0c0x1c1s   &     r   
heat_colorrv      s    	u	u	t	v	u	uE sCTN#D!%r3(2btyCrw4G&GHH 4 9Q<r$   c           	        \        R\        RV4      4      pVR8  g   V^ 8:  d   R# VR8  d2   V P                  W,
          W#,
          W,           W#,           .VR7       R# W#RRV,          ,
          ,          ,           p\        P                  ! \        RW3,          Wb,
          ^,          ,
          4      4      p\        P
                  ! \        P                  ! Wb,
          V4      4      R,          p\        P
                  ! \        P                  ! Wb,
          V) 4      4      R,          p	W8  d
   V	R,          p	^$p
. p\        V
^,           4       F  p\        P                  ! WV,
          V,          V
,          ,           4      pVP                  W\        P                  ! V4      ,          ,           W#\        P                  ! V4      ,          ,           34       K  	  V P                  WR7       R# )	zHFill a circle of radius r as a liquid-level indicator (0=empty, 1=full).r_   ra   {Gz?NGz?r?   r`   r   )rA   rb   ellipserW   sqrtdegreesatan2rangerX   appendrZ   rY   polygon)rC   rD   rE   r[   	fill_fracrJ   wyhwa_righta_leftnptsir\   s   &&&&&&        r   draw_liquid_fillr      sX   CS),-I416Dbfbfbfbf5EB 
3y()	)B	3sAERWN23	4Bll4::bg34s:Gll4::bgs34s:F#
A
C1q5\LLW$4#9A#==>

BTXXa[("488A;*>?@  	LLL!r$   c                    a aa \        R \        RS4      4      o\        ;QJ d"    . V VV3R l\        ^4       4       F  NK  	  5# ! V VV3R l\        ^4       4       4      # )r_   ra   c              3      <"   T F:  p\        SV,          SSV,          SV,          ,
          ,          ,           4      x  K<  	  R # 5irR   )r!   ).0r   rs   ru   ts   & r   	<genexpr>lerp_color.<locals>.<genexpr>   s3     D8aRUQ"Q%"Q%-00118s   AA)rA   rb   tupler   )rs   ru   r   s   fffr   rp   rp      s?    CS!A5D58D5D5D58DDDr$   c	                4   We8:  d   R# \        ^\        \        We,
          4      4      4      p	We,
          V	,          p
\        V	4       FM  pVR,           V	,          p\	        WW#WEW,          ,           W[^,           V
,          ,           \        WxV4      4       KO  	  R# )uF   Smooth gradient arc — one tiny segment per degree for a clean blend.N      ?)rA   r!   roundr   rL   rp   )rC   rD   rE   rF   rG   rH   rI   rs   ru   r   stepr   r   s   &&&&&&&&&    r   draw_gradient_arcr      sq    	xAs5>"#AGq=D1XWM$BBQXrUdN7JJWY_`Lab r$   c           
     v   \        R\        RV4      4      pW#^^V,          ,
          ,          ,           p\        Wb,
          4      V8  d   R# \        \        P
                  ! \        ^ W3,          Wb,
          ^,          ,
          4      4      4      pV P                  W,
          V3W,           V3.V\        R7       R# )zPDraw a horizontal line across the liquid circle at the expected burn-rate level.r_   ra   Nr>   )rA   rb   absr!   rW   r|   lineS)rC   rD   rE   r[   expected_fracrJ   eyr   s   &&&&&&  r   draw_expected_liner      s    Sm45M	1q=(()	)B
27|a	TYYs1aerw1n456	7BII}rwm,5IBr$   c           
      \   \        R \        RV4      4      pVR8:  g   VR8  d   R# W#^^V,          ,
          ,          ,           p\        Wr,
          4      V8  d   R# \        \        P
                  ! \        ^ W3,          Wr,
          ^,          ,
          4      4      4      p\        ^\        VR,          4      4      p	\        ^\        VR,          4      4      p
W,
          pWV,           8  dA   \        W,           W,           4      pV P                  W3W3.WVR7       WV
,           ,          pKM  R# )r_   ra   rx   ry   NgQ?g
ףp=
?r>   )rA   rb   r   r!   rW   r|   r   )rC   rD   rE   r[   r   rJ   r@   r   r   dashgapxx2s   &&&&&&&      r   draw_expected_dashed_liner      s    Sm45M 5	1q=(()	)B
27|a	TYYs1aerw1n456	7Bq#a$h- D
aQX
C
A
2g+!(#		A7RH%E	?	CZ r$   c                    V P                  RW4R7      pV P                  W^,          V^ ,          ,
          ^,          ,
          W&^,          V^,          ,
          ^,          ,
          3W5VR7       R# )zDraw text centered at (x, y).fontr?   r   Nr:   r:   )textbboxtext)rC   r   yr   r   rJ   bbs   &&&&&& r   tcr      sY    	vt	/BIIqqEBqEMa''ebem-A)ABT  +r$   c           
         \        V) V^,           4       FI  p\        V) V^,           4       F.  p	V^ 8w  g
   V	^ 8w  g   K  \        WV,           W),           W4V4       K0  	  KK  	  \        WW#WE4       R# )z?Draw text centered at (x, y) with a black outline for contrast.N)r   r   )
rC   r   r   r   r   rJ   shadowr@   dxdys
   &&&&&&&&  r   tc_outlinedr      s_    UFEAI&	*BQw"'4RV< + ' t%r$   c                 `    \        V 4      V8:  d   V # V R \        ^V^,
          4       R,           # )Nz...)lenrA   )r   	max_charss   &&r   	ellipsizer      s0    t9	)4Tt4Kc!Y]6K/Lu/TTr$   c                     V ^ 8:  d   R# V ^<,          q^<,          q"^,          pV^8  d   V RV^,           R2# V^8  d   V RV^<,           R2# V R2# )r:   nowzd r4   zh mrN   )secr   r4   ds   &   r   fmt_timer      sf    
axr	ABw1GAv2a"fXQ''Av2a"fXQ''S7Nr$   c                 z   \        \        \        V4      4      4      pV^P\        ,          8  pV^d8  d   \        MV'       d   \
        M\        p\        \        ^
\        \        VR4      '       d   VP                  M^R,          4      4      4      pV P                  RWWR7      p	V	^,          V	^ ,          ,
          p
\        WW%V\        \        ^R7       T P                  W^,          ,           ^\        ,          ,           T\        VR4      '       d   VP                  M^^,          ,
          3R\         VR7       R# )	P   r   gp=
ף?r   r   r@   %r   Nr   )r    r!   r   r   	F_PCT_100F_PCT_LGF_PCT_SMr<   rA   hasattrr   r   r   VALUEBGr   	VALUE_DIM)rC   rD   rE   	remainingr   numlarger   pct_fontr   num_ws   &&&&&      r   
draw_valuer     s    
c%	"#
$CBFNE!S(95xhDSSwtV7L7L$))RTX\)\%]^_H	vs	.BqEBqEME"4rCIIrQJQ&74;P;PdiiVX]^-^(^_	  2r$   c                 t   VR ,          pV^,          V^,          ,
          VR,          ,
          p\        W^,          ,           4      p	\        W^,          ,
          4      p
\        W,
          VR,          ,
          4      p\        WW)V
\        \        \        4       V^ 8X  d   ^dM\        ^ \        ^d^dV,
          4      4      pV^ 8  d$   \        R\        RWe,
          V,          4      4      MRpVR,          pV^ 8  d%   VR8  d   \        R\        RWN,          4      4      pMV^ 8  d   RpMRp\        V4      pV\        R,           8  d   \        WW)V
\        V\        V4      4       VR,          pV^ 8  d   \        R\        RWV,          4      4      MTpV P                  W,
          W+,
          W,           W+,           .\        R7       VV8  d&   \        WW+V\        4       \        WW+V\        4       M$\        WW+V\        4       \        WW+V\        4       \        WW+V\         \        ^\        VR	,          4      4      4       V P                  W,
          W+,
          W,           W+,           .R\        ^\        VR
,          4      4      R7       W,           ^,          p\#        WVV^,          ,
          VR,          ,
          \$        4      p\#        WVV^,          ,           VR,          ,           \$        4      pV P'                  VV.\         \        ^\        VR	,          4      4      R7       \)        WW,V4       R# )gzG?gQ?g)\(?r_   ra   g      Y@r   r`   rz   gI+?rx   )outliner@   g~jt?r>   N)         )r!   rU   rc   re   TRACKrA   rb   rg   rv   r{   
TANK_EMPTYr   LIQUID_GREENLIQUID_BLUELIQUID_DEFICITr   REDLINEr]   rd   r   r   )rC   rD   rE   r   pctresetsdurawr_arcrF   rG   r_fuelr   elapsed_frac	exp_usagerf   angleactual_fracr   rK   p1p2s   &&&&&&&               r   
draw_gauger     s   	B1HrAvt+E	U!V^	B	U!V^	BdUl*+FDbb/=%PaxSCS3Y,?%@I?BQw3sCclc%9:;CLu$I
Qw9s?3C12	q$E$$""oujQUFVW e#K8;aCSfl34[MLL"+r{BKEJLWm#2{LI2}kJ2}nM2{KHdM7CPQSVW[^cWcSdLefLL"+r{BKEy`cdegjkorvkvgw`xLy 7a-C	RS26\D5L8-	HB	RS26\D5L8-	HBIIr2hWC3te|3D,EIFt-r$   c	                   aa4a5a6 VR 8X  d   \         M\        p	V\        ,          p
V\        ,          pV^x8  pV'       d   RMRpV'       d   RMRp\        W,          W,          4      o4WS4,          ,
          R,          o5WS4,          ,
          R,          o6V4V53R lpVV4V63R lpV43R lpV'       dj   V! ^X4      pV! ^64      pV! ^=4      V! ^C4      ppV! ^~4      V! ^B4      ppV! ^4      V! ^4      ppV! ^z4      V! ^l4      ppV! ^4      V! ^|4      ppV! ^4      pMhV! ^n4      pV! ^H4      pV! ^p4      V! ^L4      ppV! ^4      V! ^94      ppV! R4      V! ^4      ppV! ^4      V! ^e4      ppV! ^4      V! ^z4      ppV! ^"4      pTp\	        VV4      p V '       d   V P
                  M^$p!V '       d   V P                  M^$p"VV"^,          ,
          p#VV!^,          ,
          p$V e   V P                  V V#V$3V R
7       MVP                  RV\        R7      p%V%^,          V%^ ,          ,
          V%^,          V%^,          ,
          p'p&VV&^,          ,
          p(V(^\        ,          ,
          p)V$V'^,          ,           p*^\        ,          p+VP                  V)V+,
          V*V+,
          V)V+,           V*V+,           .V	R7       VP                  V(V$3V\        \        R7       T;'       g    / pVP                  RR4      p,V,R 9   Edw   V,R!9   d   \        M\        p-V,R8X  d#   V'       d   ^\        ,          M"^\        ,          MV,R8X  d   ^\        ,          M^ p.V.'       d   VP!                  ^ S^\        ,          ,           V.SV,           ^\        ,          ,
          .V-R7       VP!                  V.S^\        ,          ,           \        VV.^\        ,          ,           4      SV,           ^\        ,          ,
          .R"R7       V,R8X  d%   VP                  R^ 4      ^8  d   VR,           R2p/M^V,R!9   d*   VP                  R4      '       d   VP                  R4      p/M.V,R8X  d   Rp/M$VP                  R4      ;'       g    V,R8X  d   RMRp/T-p0\"        p1VP                  RV/V1R7      p%V! ^
4      p2V! ^4      p3VP%                  V2^\        ,          ,
          V3^\        ,          ,
          V2V%^,          V%^ ,          ,
          ,           ^\        ,          ,           V3V%^,          V%^,          ,
          ,           ^\        ,          ,           .^\        ,          R#V-^\        ,          R7       VP                  V2V33V/V1V0R7       V'       g   R	# \'        VVVVV^ ,          R,          V^ ,          R,          V^ ,          R,          4       \)        VVVV^ ,          R,          \*        \,        \.        ^R7       V^ ,          R,          ^ 8  d0   \1        VVV\3        V^ ,          R,          4      \4        \        4       \7        V4      ^8  d   \'        VVVVV^,          R,          V^,          R,          V^,          R,          4       \)        VVVV^,          R,          \*        \,        \.        ^R7       V^,          R,          ^ 8  d2   \1        VVV\3        V^,          R,          4      \4        \        4       R	# R	# R	# )$r   g     @e@g      t@g     c@r   c                 L   < \        SV S,          ,           \        ,          4      # rR   r!   r   )r   unitx_pads   &r   pxdraw_section.<locals>.pxH  s    c51t8+q011r$   c                 Z   < S\        SV S,          ,           \        ,          4      ,           # rR   r   )r   syr   y_pads   &r   pydraw_section.<locals>.pyI  s     b3D 0A5666r$   c                 >   < \        V S,          \        ,          4      # rR   r   )vr   s   &r   psdraw_section.<locals>.psJ  s    c!d(Q,''r$   i  N)maskr   rz   r   stateidle
needs_userrunningcountz waitingprimary_projectworkingwaitingreview)radiusr?   r   r@   )r   r?   r   r   r   lblr   r   )r   r   done)r   r   )
         )   $       )CLAUDE_CCODEX_Cr   rb   r6   heightr@   paster   F_NAMEr{   r   WHITEr)   	ATTN_TEALGRAY	rectangleF_ATTNrounded_rectangler   r   F_LABELr   r   r   r   F_RESETr   )7r2   rC   r   shswr   wins	attentionpulsebrandsec_dwsec_dhportraitbase_wbase_hr   r   r   big_sizesm_sizecx1cy1cx2cy2icon_cxicon_cylabel1_ylabel2_yreset1_yreset2_y
glyph_size	icon_sizeiconicon_hicon_wicon_ixicon_iyr   nwnhnxdot_xdot_cyr[   r   accentrail_wlabel	lbl_colorlbl_fontlbl_xlbl_yr   r   r   s7   &&f&&&&&&                                           @@@r   draw_sectionr@  =  s   (HgE!VF!VF}HUEFUEFv0Dtm#s*Etm#s*E16'b6R&b62b6Sc7BrFSc7BrFWbg(Wbg(V
c7R&c7BrFSc7BrFSc7BrFWbg(Wbg(V
IT9%D T[[bF TZZbF!#G!#G 		$'*	6]]64f]5AA11BrQwQU
27"Eeai!UQY
C%P		2w-E	?RIMM'6*E11#'@@d050E5!a%a!eUZ^gUgAPQEmnNNArAEz627QU?C&NQNNFBQJBQ0GbSTWXSXY`lNmL Y]]7A%>%B )*(3E00immDU6V6VMM"34EiEMM"34jje|F[aiE	]]65x]821QU]EAEM5BqEBqEM+BQU+JEUWXYUZ]_`a]bUbLcfgjkfkLklq5a% 	 	
 			5%.%hY	G tS#xaa9JDQRGTYN[c8T!WU^WeBVWXAwu~
4ha): ;WdK
4yA~4c7DGENDGH<MtTUwW\~^D#xa%PRZ[\75>AtS(HT!WX->$?$O  r$   c                  $
   \         P                  ! 4       p V P                  R RRR7       V P                  RRRR7       V P                  RRRR7       V P                  RR	R
7       V P                  4       pRRRRRR^NRRRR/RRR^RRRR/./RRRRRR^ RRRR/RRR^ZRRRR/./.pVP                  '       d   RRR^RR/V^,          R &   \        V4      pV^8X  d#   \        \        ,          \        \        ,          rTM\        \        rT\        P                  ! R!WE3\        4      p\        P                  ! V4      pV^,          V^,          rVP                   '       Ed6   \#        WxV	^$\        ,          ,
          R"\%        ^&4      \&        4       \#        WxV	^\        ,          ,
          R#\(        \*        4       \#        WxV	^\        ,          ,           R$\,        \*        4       \#        WxV	^(\        ,          ,           R%\,        \*        4       \.        P0                  ! \.        P2                  P5                  VP6                  4      ;'       g    R&R'R(7       VP9                  VP6                  4       \;        R)VP6                   R*V R+V R,\         R-2	4       R.# VP<                  '       Ed_   \#        WxV	^$\        ,          ,
          R/\%        ^&4      \&        4       \#        WxV	^\        ,          ,
          R0\(        \*        4       \#        WxV	^\        ,          ,           R1\,        \*        4       \#        WxV	^$\        ,          ,           R2\,        \*        4       \#        WxV	^8\        ,          ,           R3\>        \*        4       \.        P0                  ! \.        P2                  P5                  VP6                  4      ;'       g    R&R'R(7       VP9                  VP6                  4       \;        R)VP6                   R*V R+V R,\         R-2	4       R.# V\@        ,
          \B        ,
          p
W,          pTp\E        V4       FE  w  r\@        W,          ,           p\G        WgWWR,          VR,          VPI                  R 4      R47       KG  	  \K        ^V4       F4  p\@        W,          ,           pVPM                  ^ V3VV3.\N        ^R57       K6  	  \.        P0                  ! R6R'R(7       VP6                  pVP9                  V4       \;        R)V R*V R+V R,\         R-2	4       R.# )7z--attention
store_truez#render sample waiting-project state)actionhelpz	--no-datazrender the no-data statez	--startupzrender the startup grace statez--outzdocs/display_simulation.png)defaultr   r   r  r  5hr   r   i   r   iPF  7di i:	 r   iE  i F r   r   r   r   zCodexBar-ESP32r  RGBzStarting upzWaiting for first datazWiFi and server settlingzChecking for 75s.T)exist_okzSaved z  (   ×zpx, u   × device scale)NzNo datazServer not foundzRun server.pyzRetrying every 30szSee companion README)r  r>   docs)(argparseArgumentParseradd_argument
parse_argsr  r   DHr   DWWHr   newr   r   Drawstartupr   r   r  F_HDRr  F_TIMEr
   makedirsr   dirnameoutsaveprintno_datar  HEADER_HFOOTER_H	enumerater@  r)   r   r   DIV)parserargs	providersr   img_wimg_hr2   rC   ctr_xctr_y	content_hsec_hr  r   r   r   r   r\  s                     r   mainrm    s   $$&F
lAfg
L?YZ
L?_`
)FGD 
6D%XtueDD%XvvF$
 	 
&D%!XuueDD%XvvF#
 		I ~~~\Q/%
	![! 	IAAvAvrAvu!u99UUNB/C>>#DA:uz5|||
4Qx|UK
4A'?M
4Q(BFDQ
4Q(:FDI
BGGOODHH-44tDtxxjE7"UG4s:JKL|||
4Q	8B<G
4A'95$G
4QF
4Q(<fdK
4Q(>N
BGGOODHH-44tDtxxjE7"UG4s:JKL 8+INE	B)$	!S2y!F) uu[1	3 % 1a[	!		Ar7UBK(s!	<  KK&
((CHHSM	F3%s5'E7$qc1A
BCr$   __main__c                @    V ^8  d   Qh/ ^ \         9   d
   \        ;R&   # )r   r'   )__conditional_annotations__dict)r"   s   "r   r#   r#      s       F  T Gr$   )   r  r   )3   ,   #   )T      s   )      A   )      4   )   d   :   )   C   )   )         )      r|  )         )   w   g   )"         )r        )O         )U      r   )R   !      )^   r  r  )         ))r:   r:   r:   r   )NT)Urp  __doc__rM  rW   PILr   r   r   r
   r   rR  rQ  rS  rT  r   r   rj   rk   rl   rm   rn   r   r   r   r  rc  r   r   r   r   r  r	  r
  r  r`  ra  RO_LGRI_LGRO_SMRI_SMrc   ARC_SWEEP_CLOCKre   rd   r   r   r*   r[  __file__r+   r(   r'   r6   r<   r   r   r   r  F_LABEL_OUTERr  rY  r  rX  r  rL   rP   rU   r]   rg   rv   r   rp   r   r   r   r   r   r   r   r   r   r@  rm  __name__r#   )rp  s   @r   <module>r     s$  
   + + 		cB	AvrAv1 	
 	 q5q5AvrAvuAvrAvu !O3$  GGLL2HgF	'8XxH	    b!b!b!	b!B<B<B<B<B<.
S8
J "4E
cC"+&U	2*.ZcPLQDh zF r$   