
    Ojl                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlZdZd\  ZZZ eej*                  j-                  dd	            Z ee      j3                         j4                  j4                  d
z  dz  ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ& e'ej*                  j-                  dd            Z( e'ej*                  j-                  dd            Z)d\  Z*Z+dZ,dZ-dZ.dZ/d Z0dZ1d!Z2d"\  Z3Z4Z5Z6Z7Z8d#Z9d$Z:d% Z; G d& d'      Z< G d( d)      Z= G d* d+      Z> G d, d-      Z?d.Z@d/ ZAd3d0ZBd4d1ZCeDd2k(  r ej                   eC              yy)5uT	  Hand-gesture tracker — standalone process, UDP JSON events for the HUD.

Watches the webcam with MediaPipe Hands, tracks BOTH hands independently,
classifies poses (point / pinch / fist / palm), and streams one JSON object
per UDP datagram to 127.0.0.1:47831. Each hand is tagged by the USER's real
hand — "R" or "L" (MediaPipe reports handedness from the mirrored image's
POV, so the user's actual hand is the OPPOSITE; we normalize + debounce it):

  {"t":"hands","armed":true,"hands":[                        ~30Hz stream
     {"hand":"R","x":0.42,"y":0.31,"pose":"point|pinch|mpinch|fist|palm|none"},
     ...0..2 entries, one per hand SEEN this frame... ]}
  {"t":"gesture","name":"ready"}                             once at tracker start
  {"t":"gesture","name":"arm"|"disarm"}
  {"t":"gesture","name":"pinch_start","hand":"R","x":..,"y":..}  STABILIZED coords
  {"t":"gesture","name":"pinch_move|pinch_end","hand":"R","x":..,"y":..}  live coords
  {"t":"gesture","name":"rclick","hand":"R","x":..,"y":..}   thumb+middle, one-shot
  {"t":"gesture","name":"fist_hold","hand":"R","x":..,"y":..}  once per >=0.6s hold

Each hand runs its OWN pinch state machine, its OWN thumb+middle right-click
one-shot, and its OWN fist one-shot, so both hands can gesture at once and
each emits its own stream tagged R/L (the Swift side decides policy: R =
left-click). x/y are screen coords 0..1, origin TOP-LEFT, already mirrored
(webcam is mirrored relative to the user), mapped through a PER-HAND
AUTO-CENTERED window (SPAN_X/SPAN_Y wide, re-centered on the hand when it
appears or when gestures (dis)arm — see _window_lo) and One-Euro smoothed.
The cursor anchor is ALWAYS the index fingertip (even while pinching), so
clicks land exactly where you point. pinch_start/rclick report a STABILIZED
position from ~0.12s before the pinch, so the pinch's fingertip perturbation
doesn't drag the click off-target.

Safety: starts DISARMED. Hold an open palm ~1s to arm; again to disarm
(palm must be dropped between toggles, plus a 1.5s cooldown). While
disarmed nothing is sent except the arm/disarm events. Auto-disarms after
120s without a hand in view.

Standalone by design (stdlib + cv2 + mediapipe + numpy only) so it can run
under .venv-hands if the main venv ever can't hold mediapipe (control.py
prefers that interpreter when present). HANDS_DEBUG=1 shows the annotated
camera feed.
    )annotationsN)deque)Path)z	127.0.0.1i׺  )i  i     	HANDS_CAM0modelszhand_landmarker.taskzshttps://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/latest/hand_landmarker.taskgffffff?g?gffffff?g?g?         ?g      ?g      ^@333333?HANDS_SPAN_Xz0.36HANDS_SPAN_Yz0.32)g{Gz?g\(\?皙?   gQ?gffffff?g{Gz?g?)r            	   r   ))r      )r   
   )      )      r   c                ^    | |dz  z
  }|t         k  rt         }||z   t        kD  r	t        |z
  }|S )zLow edge of the SPAN-wide auto-centered window, SHIFTED (not shrunk) to
    keep the whole window inside [WINDOW_MIN, WINDOW_MAX] of the frame.       @)
WINDOW_MIN
WINDOW_MAX)centerspanlos      9/Users/ahmed/devFolder/Ultron/claude-voice/voice/hands.py
_window_lor#      s9     
$*	B	J	Dy:$I    c                  4    e Zd ZdZddZed        Zd Zd Zy)OneEurou   One-Euro filter (Casiez et al. 2012) — low jitter at rest, low lag
    in motion. min_cutoff/beta per the paper's interactive-cursor tuning.c                Z    |||c| _         | _        | _        d x| _        x| _        | _        y N)
min_cutoffbetad_cutofft_prevx_prevdx_prev)selfr)   r*   r+   s       r"   __init__zOneEuro.__init__   s-    4>h1DM3777dkDLr$   c                J    ddt         j                  z  | z  z  }dd||z  z   z  S )Nr   r   )mathpi)cutoffdttaus      r"   _alphazOneEuro._alpha   s,    S477]V+,cC"Hn%%r$   c                   t        |      }| j                  ||dc| _        | _        | _        |S t	        || j                  z
  d      }|| j                  z
  |z  }| j                  | j                  |      }||z  d|z
  | j                  z  z   }| j                  | j                  t        |      z  z   }| j                  ||      }||z  d|z
  | j                  z  z   }	||	|c| _        | _        | _        |	S )N        ư>r   )
floatr,   r-   r.   maxr7   r+   r)   r*   abs)
r/   xtr5   dxa_ddx_hatr4   ax_hats
             r"   __call__zOneEuro.__call__   s    !H;;5632DKdlHT[[$'$++o#kk$--,rS3Y$,,66499s6{#::KK#AqDKK//12E6.T[$,r$   c                .    d x| _         x| _        | _        y r(   )r,   r-   r.   r/   s    r"   resetzOneEuro.reset   s    3777dkDLr$   N)r   gy&1|?r   )	__name__
__module____qualname____doc__r0   staticmethodr7   rE   rH    r$   r"   r&   r&      s+    M8 & &8r$   r&   c                      e Zd Zd Zd Zd Zy)Handc                h   d| _         d| _        d| _        d\  | _        | _        d| _        t        t        t              | _	        t        t        t              | _
        dx| _        | _        d| _        d| _        d\  | _        | _        d | _        d | _        d | _        t)        t*              | _        y )NF)noner   rR         ?TNF)maxlen)seenpinching	mpinchingraw_poseraw_nposer&   CURSOR_MIN_CUTOFFCURSOR_BETAfxfyr>   ypinch_activempinch_armed
fist_since
fist_firedr   raw_tiplast_seen_tr   CURSOR_HISThistrG   s    r"   r0   zHand.__init__   s    	$-!tz	+[9+[9! +6(-	r$   c                    d| _         d| _        d\  | _        | _        | _        | j
                  j                          | j                  j                          d\  | _        | _	        y )NF)rR   r   rR   rT   )
rW   rX   rY   rZ   r[   r^   rH   r_   rc   rd   rG   s    r"   rH   z
Hand.reset   sL    
 /@,tz49+6(r$   c                    | j                   s| j                  | j                  fS |t        z
  t	        | j                   fd      \  }}}||fS )zSmoothed cursor from ~STABILIZE_LAG_S ago (closest buffered sample),
        so a pinch/rclick reports where the hand was AIMING before the pinch
        perturbed the fingertip. Falls back to the live cursor.c                &    t        | d   z
        S Nr   )r=   )stargets    r"   <lambda>z!Hand.stabilized.<locals>.<lambda>   s    #adVm2Dr$   )key)rh   r>   r`   STABILIZE_LAG_Smin)r/   now_tbxbyrn   s        @r"   
stabilizedzHand.stabilized   sH     yy66466>!&(DE
B2vr$   N)rI   rJ   rK   r0   rH   rw   rN   r$   r"   rP   rP      s    ."
7r$   rP   c                  ,    e Zd ZdZd Zed        Zd Zy)LabelStickera  Turn MediaPipe's per-frame handedness into a STABLE user-hand id.

    MediaPipe classifies handedness from the (mirrored) image's POV, so the
    user's real hand is the OPPOSITE of its label ("Left"->user "R"). Raw
    labels flip for a frame or two, which would swap the two reticles'
    identities; we guard against that by tracking each hand by centroid
    position across frames and only committing a new id once a differing
    classification persists STICKY_FRAMES frames. Camera-free / testable.c                    g | _         y r(   )tracksrG   s    r"   r0   zLabelSticker.__init__   s	    r$   c                    | dk(  rdS dS )NLeftRLrN   )mp_labels    r"   _userzLabelSticker._user   s    &(s1c1r$   c                   |D cg c]Y  \  }}| j                  |      t        |d d df   j                               t        |d d df   j                               f|d d[ }}}t               }|D ]t  }d\  }}t	        | j
                        D ]2  \  }	}
|	|v rt        j                  |d   |
d         }|||k  s/||	}}4 |U|t        k  s_|j                  |       ||d<   v g }|D ]  }|d   x| j
                  |d      }
|d   |
d   k(  rd	\  |
d
<   |
d<   nF|d   |
d
   k(  r-|
dxx   dz  cc<   |
d   t        k\  r"|d   d dc|
d<   |
d
<   |
d<   n|d   dc|
d
<   |
d<   |d   |
d<   n|d   |d   d dd}
|
d   |d<   |j                  |
        t        |      dk(  rA|d   d   |d   d   k(  r0|d   d   dk(  rdnd}||d   d<   d	\  |d   d
<   |d   d<   ||d   d<   || _        |D cg c]  }|d   |d   f c}S c c}}w c c}w )Nr      )rawcptstrack)NNr   r   r   idrl   candcand_n)r   r   r   r      r~   r   r   )r   r;   meanset	enumerater{   r2   dist
MATCH_DISTaddSTICKY_FRAMESappendlen)r/   r   mpr   detsuseddbestbiitrdk
new_tracksflips                 r"   assignzLabelSticker.assign   s    <?@;>C 

2eC1INN4D.E.3C1INN4D.E.Gd,;> 	 @ uA!HD""4;;/29YYqvr#w/<29!1"D 0 ~$*"4'
  
Az%[[7,U8r$x'/6,BvJ8uXF+xLA%L(|}4=>uXtQ:4"V*bl/0x,BvJ8C&3eH1S641MhAdGb! " z?aJqM$$7:a=;N$N$Q--43#D"&JqM$=D:JqM&!:a=#: DGDM -12T4!E(#T22Q@P 3s   AH0H
N)rI   rJ   rK   rL   r0   rM   r   r   rN   r$   r"   ry   ry      s&    M 2 2*3r$   ry   c                  <    e Zd ZdZd Zd Zd
dZd Zd Zd Z	d Z
y	)Trackeru  Pose classification + gesture state machine, camera-free for tests:
    feed step() a list of (label, pts) with label = the USER's real hand as
    "R"/"L" and pts = (21,2) normalized array; every outgoing packet goes
    through the injected send(dict). Both hands are tracked independently —
    each keeps its own filters, its own pinch state machine, and its own fist
    one-shot, all tagged by "R"/"L" (feed two hands -> two independent streams).
    c                f    || _         i | _        d| _        d | _        d| _        d| _        d | _        y )NFTg    e)sendhandsarmed
palm_sincepalm_rearmedlast_toggle	last_hand)r/   r   s     r"   r0   zTracker.__init__  s5    	

 r$   c                T   | j                   j                         D ]	  }d|_         |D ]  \  }}| j                   j                  |t	                     }|j
                  d n||j
                  z
  }|j                  d u xs |d uxr	 |t        k\  }d|_        ||_        | j                  ||||        |r|| _	        | j                   j                         D ]/  }|j                  r|j                  dk7  s |j                          1 | j                  |       | j                          y )NFTrR   )r   valuesrV   
setdefaultrP   rf   r   REAPPEAR_GAP_S_updater   rY   rH   _events_stream)r/   detectedrs   hlabelr   gapappeareds           r"   stepzTracker.step&  s   ""$AAF %"JE3

%%eTV4A --/$S1==5HCxx4' GCtO -F03~0E AFAMLLCh/ #  DN""$A66ajjF2	 % 	Sr$   c           	        t        t        t        j                  j	                  |t
           |t           z
              d      }|t           }t        D cg c]W  \  }}t        j                  j	                  ||   |z
        t        j                  j	                  ||   |z
        t        z  kD  Y }	}}t        j                  j	                  |t           |t           z
        t        |z  kD  }
t        |	       xr |
 }t        t        j                  j	                  |t           |t           z
              }|j                  r|t        |z  kD  rd|_        n|s|t         |z  k  rd|_        t        t        j                  j	                  |t           |t"           z
              }|j$                  r|t        |z  kD  r)d|_        n!|s|j                  s|t         |z  k  rd|_        t        j                  j	                  |t           |t&           z
        t(        |z  kD  }|rd}nF|j                  rd}n7|j$                  rd}n(|	d   rt        |	dd        sd	}nt+        |	      r|rd
}nd}||j,                  k(  r|xj.                  dz  c_        n|dc|_        |_        |j.                  t0        k\  r||_        t        |t           d         t        |t           d         f}d|d   z
  }|d   }||f|_        |s|j6                  	||f|_        t9        t        |t;        |j6                  d   t<              z
  t<        z  d      d      }t9        t        |t;        |j6                  d   t>              z
  t>        z  d      d      }|jA                  ||      |jC                  ||      c|_"        |_#        |jH                  jK                  ||jD                  |jF                  f       y c c}}w )Nr:   FTfistpinchmpinchr   r   pointpalmrR   r   r9   )&r<   r;   nplinalgnorm
MIDDLE_MCPWRISTFINGERSEXTEND_MARGIN	THUMB_TIP	INDEX_MCP	THUMB_OUTany	INDEX_TIPrW   
PINCH_EXITPINCH_ENTER
MIDDLE_TIPrX   	PINKY_TIPPALM_SPREADallrY   rZ   DEBOUNCEr[   re   r   rr   r#   SPAN_XSPAN_Yr^   r_   r>   r`   rh   r   )r/   r   r   rs   capture_centersizewr?   pext	thumb_out
fist_shapepdistmdistspreadr[   tipmxmysxsys                        r"   r   zTracker._update=  s<   5J#e*(DEFM JFMOFMda yy~~c!fqj)yy~~c!fqj)M9:FM 	 OYY^^C	NS^$CD 4'(	S\3)m

 biinnS^c)n%DEF::zD(("
d(: :AJ biinnS^c*o%EFG;;zD((#AJJ5;;M3MAKIY ?@D ! DZZD[[DVCABLDX&DD1::GGqLG"&AJ77hAF
 S^A&'s9~a/@)AB3q6\VH	QXX-BxAHb:ahhqk6::fDcJCPb:ahhqk6::fDcJCP44C=!$$r3-QS	sACCo&yOs   AO*c           
        t        d | j                  j                         D              }|sd | _        d| _        n| j                  || _        |rU| j                  rI| j                  =|| j                  z
  t
        k\  r'|| j                  z
  t        k\  r| j                  |       | j                  r3| j                  '|| j                  z
  t        kD  r| j                  |       | j                  s=| j                  j                         D ]  }d|_        d|_        d\  |_        |_        ! y | j                  j!                         D ]  \  }}|j"                  xr |j$                  dk(  }|j                  r|r>| j'                  d|t)        |j*                  d      t)        |j,                  d             n| j'                  d	|t)        |j*                  d      t)        |j,                  d             d|_        nF|rDd|_        |j/                  |      \  }}| j'                  d
|t)        |d      t)        |d             |j"                  xr |j$                  dk(  }|rQ|j                  rEd|_        |j/                  |      \  }	}
| j'                  d|t)        |	d      t)        |
d             n	|sd|_        |j"                  r|j$                  dk(  r|j                  	||_        |j                  r||j                  z
  t0        k\  sd|_        | j'                  d|t)        |j*                  d      t)        |j,                  d             d\  |_        |_        ! y )Nc              3  V   K   | ]!  }|j                   xr |j                  d k(   # yw)r   N)rV   r[   ).0r   s     r"   	<genexpr>z"Tracker._events.<locals>.<genexpr>  s(     L8K1166.aff..8Ks   ')TFrT   r   
pinch_mover   )handr>   r`   	pinch_endpinch_startr   rclickr   	fist_hold)r   r   r   r   r   PALM_HOLD_Sr   TOGGLE_COOLDOWN_S_toggler   r   AUTO_DISARM_Sra   rb   rc   rd   itemsrV   r[   _gestroundr>   r`   rw   FIST_HOLD_S)r/   rs   r   r   r   pinching_nowr   r   
mpinch_nowrxrys              r"   r   zTracker._events  s   L

8I8I8KLL"DO $D__$!DOT&&4??+F$//)[8$***.??LLJJ4>>5$..(=8LLzzZZ&&(!&!%-8*al )  

((*HE1667aff&7L~~JJ|%!&qssA%Q-  A JJ{!&qssA%Q-  A%*AN!%c*B

=u"2q\U2q\  ;
 6AFFh$6Jann!&c*B

8%"2q\U2q\  ;!% vv!&&F*<<'#&AL#*<*K#'ALJJ{!&qssA%Q-  A .9*alI +r$   c                f   | j                    | _         || _        d | _        d| _        | j                  j                         D ]-  }|j                  s|j                  |j                  |_        / | j                  d| j                   rdndd       t        d| j                   rdnd d	
       y )NFgesturearmdisarmr?   namezhands: r   disarmedTflush)r   r   r   r   r   r   rV   re   r   r   print)r/   rs   r   s      r"   r   zTracker._toggle  s    ^
! ""$Avv!))/99 %
 				DJJ5HMN4:::>?tLr$   c                0    | j                  d|d|       y )Nr   r   )r   )r/   r   kws      r"   r   zTracker._gest  s    			46267r$   c           
     2   | j                   sy | j                  j                         D cg c]J  \  }}|j                  r9|t	        |j
                  d      t	        |j                  d      |j                  dL }}}| j                  dd|d       y c c}}w )Nr   )r   r>   r`   r[   r   T)r?   r   r   )	r   r   r   rV   r   r>   r`   r[   r   )r/   r   r   outs       r"   r   zTracker._stream  s    zz  $zz//1=185!QVV E!##qMacc1 1 	 = 			$=>=s   ABN)F)rI   rJ   rK   rL   r0   r   r   r   r   r   r   rN   r$   r"   r   r     s.    .A'J?9BM8?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   )r      )r	  r   )r     )r
  r   )r      )r  r   )r   r
  c                   |j                   d d \  }}|D ]  \  }}|||fz  j                  t              }t        D ]2  \  }	}
| j	                  |t        ||	         t        ||
         dd       4 |D ]   }| j                  |t        |      ddd       "  | j                  |d      }|j                  rdnd}|j                  rdnd	}| j                  ||d
| j                  d|d       d}|j                  j                         D ]e  \  }}|j                  s| j                  || d|j                   d|j                  dd|j                   dd|f| j                  ddd       |dz  }g | j#                  d|       y )Nr   )r         r   r
   )r   r  r   ARMEDr   )r   r   r  )r   r   r   <   z: z  z.2f,r   gffffff?)r   r  r     r   )shapeastypeintCONNSlinetuplecircler   r   putTextFONT_HERSHEY_SIMPLEXr   r   rV   r[   r>   r`   imshow)cv2framer   trackerhgtwid_labelr   pxrC   br   hdrcolrowr   r   s                    r"   _drawr)    sj   {{2AHCS#J&&s+DAqHHUE"Q%L%1,qI AJJueAh;; 	   HHUAE]]'
C +KCKKsHc&>&>S!L
CMM'')qvvEeWBqvvhbS	133s)DIs77mQ	Pr	 * JJwr$   c                 R   t         j                         ryt        dd       	 dd l} t         j                  j                  d       | j                  j                  t        t                y# t        $ r0}t         j                  d       t        d| d       Y d }~yd }~ww xY w)	NTz<hands: downloading hand_landmarker model (~8MB, one time)...r   r   )exist_ok)
missing_oku(   hands: ERROR — model download failed: F)MODELis_filer  urllib.requestparentmkdirrequesturlretrieve	MODEL_URL	Exceptionunlink)urllibes     r"   _ensure_modelr9    s    }}	
HD)""9e4 %8<DIs   AA- -	B&6&B!!B&c                 	   dd l } dd l}ddlm} ddlm} t               syt        j                  j                  d      dk(  }d }t        d      D ]`  }| j                  t              }|j                         r n9|j                          |dk(  rt        dd	
       t!        j"                  d       b ||j                         st        dt         dd	
       y|j%                  | j&                  t(               |j%                  | j*                  t,               |j%                  | j.                  t0               t3        j2                  t2        j4                  t2        j6                        fd}d	gt9        j8                  t8        j:                  fd       t9        j8                  t8        j<                  fd       |j>                  jA                  |jC                  |jE                  tG        tH                    |jJ                  jL                  ddd            }tO        |      }	tQ               }
t        dd	
        |ddd       t!        jR                         }d}	 d   r|jU                         \  }}|st!        j"                  d       1| jW                  || jX                        }t[        t]        t!        jR                         |z
  dz        |dz         }|}|j_                  |ja                  |jb                  jd                  |      |      }g }tg        |jh                        D ]  \  }}d}|tk        |jl                        k  r+|jl                  |   r|jl                  |   d   jn                  }|jq                  |ts        jt                  |D cg c]  }|jv                  |jx                  f c}      f        |
j{                  |      }|	j}                  |t!        jR                                |r&t        | |||	       | j                  d      dz  d k(  rnd   r|j                          |j                          |r| j                          j                          t        d!d	
       yc c}w # |j                          |j                          |r| j                          j                          t        d!d	
       w xY w)"Nr   )python)visionr   HANDS_DEBUG1r   u`   hands: waiting for camera permission (grant Jarvis in System Settings → Privacy → Camera)...Tr   r   u$   hands: ERROR — cannot open camera zE (in use, or no Camera permission; HANDS_CAM=<index> to pick another)c                    	 j                  t        j                  | d      j                         t               y # t
        $ r Y y w xY w)N)r  :)
separators)sendtojsondumpsencodeUDP_ADDROSError)objsocks    r"   r   zmain.<locals>.send.  s?    	KK

3:>EEG " 		s   9= 	A	A	c                 (    j                  dd      S Nr   F__setitem___arunnings    r"   ro   zmain.<locals>.<lambda>6  s    g.A.A!U.Kr$   c                 (    j                  dd      S rK  rL  rN  s    r"   ro   zmain.<locals>.<lambda>7  s    W-@-@E-Jr$   )model_asset_pathr   r   rS   )base_optionsrunning_mode	num_handsmin_hand_detection_confidencemin_tracking_confidencezhands: tracking startedr   readyr   r  g?i  )image_formatdataRightr     zhands: stopped)Cr  	mediapipemediapipe.tasksr;  mediapipe.tasks.pythonr<  r9  osenvirongetrangeVideoCapture	CAM_INDEXisOpenedreleaser  timesleepr   CAP_PROP_FRAME_WIDTHCAM_WCAP_PROP_FRAME_HEIGHTCAM_HCAP_PROP_FPSCAM_FPSsocketAF_INET
SOCK_DGRAMsignalSIGTERMSIGINTHandLandmarkercreate_from_optionsHandLandmarkerOptionsBaseOptionsstrr-  RunningModeVIDEOr   ry   	monotonicreadcvtColorCOLOR_BGR2RGBr<   r  detect_for_videoImageImageFormatSRGBr   hand_landmarksr   
handednesscategory_namer   r   arrayr>   r`   r   r   r)  waitKeyclosedestroyAllWindows)r  r   mp_tasksr<  debugcapattemptr   
landmarkerr   stickert0last_tsokr  rgbtsresr   r   lmsr   r   r   rP  rI  s                           @@r"   mainr    s   2-?JJNN=)S0E C9y)<<>a< ?FJL

3  {#,,.4YK @F F	 GGC$$e,GGC%%u-GGCg&==):):;D fG
MM&.."KL
MM&--!JK &&::$$!--s5z-J++11*-$' 	% 	)*J dmGnG	
#40 	y'	*+		BG,aj
IB

4 ,,uc&7&78CS$..*R/478'A+FBG--bnn&9&9DbJCC#C$6$673"s3>>**s~~a/@"~~a03AAH

HbhhC/HCqacc
C/H&IJK	 8 ~~c*HLL4>>#34c5(G4;;q>D(B.- aj0 	!!#

d+ 0I 	!!#

d+s!   (D7R R >A0R  R AS__main__)returnbool)r  r  )FrL   
__future__r   rC  r2   r`  rs  rp  sysrh  collectionsr   pathlibr   numpyr   rF  rk  rm  ro  r  ra  rb  re  __file__resolver0  r-  r4  r   r   r   r   r   r   r   r   r   r   r;   r   r   r   r   r   rg   rq   r\   r]   r   r   r   r   r   r   r   r   r   r   r#   r&   rP   ry   r   r  r)  r9  r  rI   exitrN   r$   r"   <module>r     s  'R #   	   
    $ ug 

{C01	 	X ''..9<RRC	 
 	  
rzz~~nf5	6	rzz~~nf5	6# 
J  
  
AR >y)Y
J
0	8 8@& &R;3 ;3|H? H?\	D
, \~ zCHHTV r$   