
    ^j~b                     F   d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmc mZ d dlmZm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! ddl"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z( ddl)m*Z*m+Z+ de	e,e,f   fdZ-dej\                  de	e,e,f   de	e,e,f   fdZ/de,de,de	e,e,f   de	e,e,e,e,f   fdZ0 G d dejb                        Z2 G d dejb                        Z3 G d dejb                        Z4 G d dejb                        Z5d1dZ6 e* e6d       e6d       e6d       e6d       e6d       e6d       e6dd d!d"#       e6dd d!d"#       e6d$d d%&      d'	      Z7d2d(Z8d3d)e9d*e:de5fd+Z;e+d3d,       Z<e+d3d-       Z=e+d3d.       Z>e+d3d/       Z?e+d3d0       Z@y)4    N)deepcopy)partial)DictListOptionalTupleTypeUnionIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)
PatchEmbedMlpDropPathcalculate_drop_path_ratesClNormMlpClassifierHead
LayerScaleget_norm_layerget_act_layerinit_weight_jaxinit_weight_vit	to_2tupleuse_fused_attn   )build_model_with_cfg)feature_take_indices)named_apply
checkpoint)generate_default_cfgsregister_modelwindow_sizec                     | j                   \  }}}}| j                  |||d   z  |d   ||d   z  |d   |      } | j                  dddddd      j                         j                  d|d   |d   |      }|S )aT  
    Partition into non-overlapping windows with padding if needed.
    Args:
        x (tensor): input tokens with [B, H, W, C].
        window_size (int): window size.
    Returns:
        windows: windows after partition with [B * num_windows, window_size, window_size, C].
        (Hp, Wp): padded height and width before partition
    r   r               shapeviewpermute
contiguous)xr!   BHWCwindowss          d/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/hieradet_sam2.pywindow_partitionr4       s     JAq!Q	q!{1~%{1~qKN7JKXYN\]^Aii1aAq)446;;BAP[\]P^`abGN    r2   hwc                    |\  }}| j                   d   ||z  |d   z  |d   z  z  }| j                  |||d   z  ||d   z  |d   |d   d      }|j                  dddddd      j                         j                  |||d      }|S )aZ  
    Window unpartition into original sequences and removing padding.
    Args:
        x (tensor): input tokens with [B * num_windows, window_size, window_size, C].
        window_size (int): window size.
        hw (Tuple): original height and width (H, W) before padding.
    Returns:
        x: unpartitioned sequences with [B, H, W, C].
    r   r   r'   r#   r$   r%   r&   r(   )r2   r!   r6   r/   r0   r.   r-   s          r3   window_unpartitionr8   0   s     DAqaQUk!n4AFGAQ[^+Q+a.-@+a.R]^_R`bdeA			!Q1a#..055aArBAHr5   r/   r0   returnc                 r    |d   | |d   z  z
  |d   z  }|d   ||d   z  z
  |d   z  }| |z   ||z   }}||||fS )Nr   r    )r/   r0   r!   pad_hpad_wHpWps          r3   	_calc_padr@   A   sb    ^a+a.00KNBE^a+a.00KNBEYE	Br5%r5   c            	            e Zd ZU ej                  j
                  e   ed<   	 	 	 d
dededede	j                  f fdZdej                  dej                  fd	Z xZS )MultiScaleAttention
fused_attndimdim_out	num_headsq_poolc                    ||d}t         	|           || _        || _        || _        ||z  }|dz  | _        t               | _        || _        t        j                  ||dz  fi || _        t        j                  ||fi || _        y )Ndevicedtypeg      r#   )super__init__rD   rE   rF   scaler   rC   rG   nnLinearqkvproj)
selfrD   rE   rF   rG   rJ   rK   ddhead_dim	__class__s
            r3   rM   zMultiScaleAttention.__init__K   s     /"i'%
(*99S'A+44IIgw5"5	r5   r-   r9   c                 b   |j                   \  }}}}| j                  |      j                  |||z  d| j                  d      }t	        j
                  |d      \  }}}	| j                  ||j                  |||d      j                  dddd      }| j                  |      j                  dddd      }|j                   dd \  }}|j                  |||z  | j                  d      }|j                  dd      }|j                  dd      }|	j                  dd      }	| j                  rt        j                  |||	      }n;|| j                  z  }||j                  dd      z  }
|
j                  d      }
|
|	z  }|j                  dd      j                  |||d      }| j                  |      }|S )Nr#   r'   r$   r   r   )rD   )r)   rQ   reshaperF   torchunbindrG   r+   	transposerC   Fscaled_dot_product_attentionrN   softmaxrR   )rS   r-   r.   r/   r0   _rQ   qkvattns              r3   forwardzMultiScaleAttention.forwarda   s   WW
1a hhqk!!!QUAt~~rB ,,sA&1a ;;"		!Q2&..q!Q:AA&&q!Q2A771Q<DAq		!QUDNNB7A KK1KK1KK1??..q!Q7ADJJAq{{2r**D<<B<'DqA KK1%%aAr2IIaLr5   )NNN)__name__
__module____qualname__rZ   jitFinalbool__annotations__intrO   ModulerM   Tensorre   __classcell__rV   s   @r3   rB   rB   H   sk    		%% !%66 6 	6
 II6,   %,,  r5   rB   c                        e Zd Z	 	 	 	 	 	 	 	 	 ddededededeeeef      deee	j                     ef   deee	j                     ef   ded	ee   d
ef fdZdej                  dej                  fdZ xZS )MultiScaleBlockrD   rE   rF   	mlp_ratioq_stride
norm_layer	act_layerr!   init_values	drop_pathc                    ||d}t         |           t        |      }t        |      }t	        |      | _        t        | j
                        | _        || _        || _	        || _
        ||k7  rt        j                  ||fi || _        nt        j                         | _        d | _        | j                  rt        j                   ||d      | _         ||fi || _        t%        ||f|t'        | j                        d|| _        |	t+        ||	fi |nt        j                         | _        |
dkD  rt/        |
      nt        j                         | _         ||fi || _        t5        |t7        ||z        fd|i|| _        |	t+        ||	fi |nt        j                         | _        |
dkD  rt/        |
      | _        y t        j                         | _        y )NrI   F)kernel_sizestride	ceil_mode)rF   rG           rw   )rL   rM   r   r   r   r!   anyis_windowedrD   rE   ru   rO   rP   rR   Identitypool	MaxPool2dnorm1rB   r   rd   r   ls1r   
drop_path1norm2r   rm   mlpls2
drop_path2)rS   rD   rE   rF   rt   ru   rv   rw   r!   rx   ry   rJ   rK   rT   rV   s                 r3   rM   zMultiScaleBlock.__init__   s    /#J/
!),	$[1t//0 '>		#w5"5DIDI	==$DI  *r*
'
  DII&	

 
	 >I=T:g{9b9Z\ZeZeZg1:S(9-bkkm.2.
)#$
  
 	
 >I=T:g{9b9Z\ZeZeZg1:S(9-bkkmr5   r-   r9   c           
         |}| j                  |      }| j                  | j                  k7  rT| j                  |      }| j                  7|j                  dddd      }| j	                  |      j                  dddd      }| j                  }|j                  dd \  }}||}}| j                  r:t        |||      \  }}}}	t        j                  |ddd|	d|f      }t        ||      }| j                  |      }| j                  b| j                  d   | j                  d   z  | j                  d   | j                  d   z  f}|j                  dd \  }}t        |||      \  }}}}	| j                  r.t        ||||f      }|d d d |d |d d f   j!                         }|| j#                  | j%                  |            z   }|| j'                  | j)                  | j+                  | j-                  |                        z   }|S )Nr   r#   r   r$   )r   rD   rE   rR   r   r+   r!   r)   r   r@   r]   padr4   rd   ru   r8   r,   r   r   r   r   r   r   )
rS   r-   shortcutr!   r/   r0   r>   r?   r<   r=   s
             r3   re   zMultiScaleBlock.forward   s   JJqM 88t||#yy|Hyy$#++Aq!Q799X.66q!QB &&wwq|1AB#,Q;#? BE5a!Q5!U34A K0A IIaL==$++A.$--2BBDDTDTUVDW[_[h[hij[kDklK>>!A&DAq#,Q;#? BE5 "1kB8<A!RaR!Q,**,Attxx{33$**Q-)@ ABBr5   )	g      @N	LayerNormGELUr   Nr~   NN)rf   rg   rh   rm   floatr   r   r
   r	   rO   rn   strrM   rZ   ro   re   rp   rq   s   @r3   rs   rs      s      #266A5; +/"9T9T 9T 	9T
 9T uS#X/9T d299os239T T"))_c129T 9T "%9T 9Tv# #%,, #r5   rs   c                        e Zd ZdZ	 	 	 	 	 	 	 ddeeeeef   f   deeeeef   f   deeeeeef   f   dedef
 fdZde	j                  d	e	j                  fd
Z xZS )HieraPatchEmbedz#
    Image to Patch Embedding.
    r{   r|   paddingin_chans	embed_dimc                 l    t         	|           ||d}t        j                  ||f|||d|| _        y)a,  
        Args:
            kernel_size: kernel size of the projection layer.
            stride: stride of the projection layer.
            padding: padding size of the projection layer.
            in_chans: Number of input image channels.
            embed_dim: Patch embedding dimension.
        rI   )r{   r|   r   N)rL   rM   rO   Conv2drR   )
rS   r{   r|   r   r   r   rJ   rK   rT   rV   s
            r3   rM   zHieraPatchEmbed.__init__   sJ    $ 	/II
 $
 
	r5   r-   r9   c                 P    | j                  |      }|j                  dddd      }|S )Nr   r$   r#   r   )rR   r+   rS   r-   s     r3   re   zHieraPatchEmbed.forward  s(    IIaLIIaAq!r5   )   r   r%   r%   r#   r#   r#   i   NN)rf   rg   rh   __doc__r
   rm   r   r   rM   rZ   ro   re   rp   rq   s   @r3   r   r      s     4:.44:
3c3h/0
 c5c?*+
 sCsCx01	

 
 
: %,, r5   r   c            5       D    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7dedededededeeef   d	eeef   d
eeef   deeeef      dedeeef   deedf   dededeeef   deedf   deedf   dee   dede	dededede
eej                     ef   de
eej                     ef   f2 fdZdej                   dej                   fd Zd! Zej&                  j(                  d"        Zej&                  j(                  d8d#e	defd$       Zej&                  j(                  d9d%e	ddfd&       Zej&                  j(                  d'        Zd:dedee   d(e	fd)Z	 	 	 	 	 	 d;dej                   d*ee
eee   f      d+e	d,e	d-ed.e	d#e	de
eej                      eej                   eej                      f   f   fd/Z	 	 	 	 d<d*e
eee   f   d0e	d1e	d#e	fd2Zdej                   dej                   fd3Zd8d4e	dej                   fd5Zdej                   dej                   fd6Z  xZ!S )=HieraDetz5
    Reference: https://arxiv.org/abs/2306.00989
    Nr   num_classesglobal_poolr   rF   patch_kernelpatch_stridepatch_padding
patch_sizerG   ru   stages.dim_mulhead_mulglobal_pos_sizewindow_specglobal_att_blocksrx   weight_initfix_inithead_init_scale	drop_ratedrop_path_raterv   rw   c                 *	   t         &|           ||d}t        |      }t        |      }t	        |      t	        |      k(  sJ d| _        || _        || _        || _        d| _	        t        |      }|| _        t        dt	        |      dz         D cg c]  }t        |d |       dz
   c}| _        d|
cxk  rt	        | j                  d d       k  sJ  J | j                  d d D cg c]  }|dz   	 c}d |
 | _        |	t        dd |	||ddd|| _        nt#        d|||||d	|| _        || _        || _        t)        j*                  t-        j.                  d|g| j&                  i |      | _        t)        j*                  t-        j.                  d|| j                  d   | j                  d   fi |      | _        t5        ||      } d}!t)        j6                         | _        g | _        t        |      D ]  }|}"| j                  |!   }#| j$                  || j$                  v rdn|#}#|dz
  | j                  v r!t=        ||z        }"t=        ||z        }|!dz  }!t?        d||"|| |   || j                  v r| j                  nd |#|||d
	|}$|"}| j8                  jA                  |$       || j                  v s| xj:                  tC        |"d|!dz   z  d| j                  |!          gz  c_         |x| _"        | _#        tI        ||f|||d|| _%        | j0                  +t(        jL                  jO                  | j0                  d       | j2                  +t(        jL                  jO                  | j2                  d       |dk7  r*|dk(  rtP        ntR        }%tU        |%d      }%tW        |%|        |r| jY                          t[        | jJ                  tH              rt[        | jJ                  j\                  t(        j^                        rs| jJ                  j\                  j`                  jb                  je                  |       | jJ                  j\                  jf                  jb                  je                  |       y y y c c}w c c}w )NrI   FNHWCr   r   r'   T)img_sizer   r   r   
output_fmtdynamic_img_pad)r{   r|   r   r   r   )	rD   rE   rF   ry   ru   r!   rv   rw   rx   r$   zblocks.)num_chs	reductionmodule)	pool_typer   rv   g{Gz?)stdskipjaxhead.fc)classifier_namer;   )4rL   rM   r   r   lengrad_checkpointingr   r   r   r   sumru   range
stage_endsq_pool_blocksr   patch_embedr   r   r   rO   	ParameterrZ   zeros	pos_embedpos_embed_windowr   
Sequentialblocksfeature_inform   rs   appenddictnum_featureshead_hidden_sizer   headinittrunc_normal_r   r   r   r   fix_init_weight
isinstancefcrP   weightdatamul_bias)'rS   r   r   r   r   rF   r   r   r   r   rG   ru   r   r   r   r   r   r   rx   r   r   r   r   r   rv   rw   rJ   rK   rT   depthir-   dpr	cur_stagerE   r!   blockinit_fnrV   s'                                         r3   rM   zHieraDet.__init__  s   R 	/#J/
!),	6{c+...."'& & F 8=aVq8QR13vbqz?Q.RF7c$//#2"6777777-1__Sb-ABa!eB7FK!)  %!#! $   D  /  (#%!#   D "3  /ekk!Y&\AUAU&\Y[&\] "U[[ItGWGWXYGZ\`\l\lmn\o-vsu-v w'>	mmou  	vAG **95K%%1#$(>(>#>aK1u'i'12	H 45	Q	# #a&*+t/A/A*At'%#' E  IKKu%DOO#!!A	!4DwW[WfWfgpWqVrMst&v v!? 	vD 5>=D1+
 "!
 
	 >>%GG!!$..d!;  ,GG!!$"7"7T!B& )4)=o?GgyAG&  "dii!89jWYW`W`>aIILL$$))/:IILL""''8 ?b9 SBs   R*Rr-   r9   c                 `   |j                   dd \  }}| j                  }t        j                  | j                  ||fd      }|j                   d   |j                   d   z  }|j                   d   |j                   d   z  }||j                  ||f      z   }|j                  dddd      }||z   S )	Nr   r#   bicubic)sizemoderX   r'   r   r$   )r)   r   r]   interpolater   tiler+   )rS   r-   hwwindow_embedr   tile_htile_ws           r3   
_pos_embedzHieraDet._pos_embed  s    wwq|1,,MM$..1vIN	$(:(:2(>>$(:(:2(>> 1 1662B CC	%%aAq1	9}r5   c                    d }t        | j                        D ]m  \  }} ||j                  j                  j                  j
                  |dz           ||j                  j                  j                  j
                  |dz          o y )Nc                 R    | j                  t        j                  d|z               y )N       @)div_mathsqrt)param	_layer_ids     r3   rescalez)HieraDet.fix_init_weight.<locals>.rescale  s    JJtyyy12r5   r   )	enumerater   rd   rR   r   r   r   fc2)rS   r   layer_idlayers       r3   r   zHieraDet.fix_init_weight  si    	3  )5 	=OHeEJJOO**//A>EIIMM((--x!|<	=r5   c                 
    ddgS )Nr   r   r;   rS   s    r3   no_weight_decayzHieraDet.no_weight_decay  s    /00r5   coarsec                     t        ddg      S )Nz'^pos_embed|pos_embed_window|patch_embed)z^blocks\.(\d+)N)stemr   )r   )rS   r   s     r3   group_matcherzHieraDet.group_matcher  s    ;-.
 	
r5   enablec                     || _         y N)r   )rS   r  s     r3   set_grad_checkpointingzHieraDet.set_grad_checkpointing  s
    "(r5   c                 .    | j                   j                  S r  )r   r   r   s    r3   get_classifierzHieraDet.get_classifier  s    yy||r5   reset_otherc                 N    || _         | j                  j                  |||       y )N)r   r	  )r   r   reset)rS   r   r   r	  s       r3   reset_classifierzHieraDet.reset_classifier  s     &		{Tr5   indicesnorm
stop_earlyr   intermediates_onlyc                    |rJ d       |dv sJ d       |rNt        t        | j                        |      \  }}	|D 
cg c]  }
| j                  |
    }}
| j                  |	   }	n"t        t        | j                        |      \  }}	| j	                  |      }| j                  |      }g }t        j                  j                         s|s| j                  }n| j                  d|	dz    }t        |      D ]u  \  }
}| j                  r+t        j                  j                         st        ||      }n ||      }|
|v sJ|dk(  r|j                  dddd	      n|}|j                  |       w |r|S ||fS c c}
w )
aE   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to all intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
            coarse: Take coarse features (stage ends) if true, otherwise all block featrures
        Returns:

        z'normalization of features not supported)NCHWr   z(Output format must be one of NCHW, NHWC.Nr   r  r   r#   r$   )r   r   r   r   r   r   rZ   ri   is_scriptingr   r   r   r+   r   )rS   r-   r  r  r  r   r  r   take_indices	max_indexr   intermediatesr   blkx_outs                  r3   forward_intermediateszHieraDet.forward_intermediates  so   . BBBx--Y/YY-&:3t;OQX&Y#L)8DE1DOOA.ELE	2I&:3t{{;KW&U#L)QOOA99!!#:[[F[[)a-0F' 	,FAs&&uyy/E/E/GsA&FL 1;v1E		!Q1-1$$U+	,   -3 Fs   E5
prune_norm
prune_headc                    |r2t        t        | j                        |      \  }}| j                  |   }n"t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  j                  d|       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   )r	  )r   r   r   r   r   r  )rS   r  r  r  r   r  r  s          r3   prune_intermediate_layersz"HieraDet.prune_intermediate_layers  s}     &:3t;OQX&Y#L)	2I&:3t{{;KW&U#L)kk.9q=1IIOOA:O6r5   c                     | j                  |      }| j                  |      }| j                  D ]A  }| j                  r+t        j
                  j                         st        ||      }: ||      }C |S r  )r   r   r   r   rZ   ri   r  r   )rS   r-   r  s      r3   forward_featureszHieraDet.forward_features  sg    QOOA;; 	C&&uyy/E/E/GsA&F		
 r5   
pre_logitsc                 V    |r| j                  ||      }|S | j                  |      }|S )N)r   )r   )rS   r-   r   s      r3   forward_headzHieraDet.forward_head)  s1    3=DIIaJI/ DH99Q<r5   c                 J    | j                  |      }| j                  |      }|S r  )r  r"  r   s     r3   re   zHieraDet.forward-  s'    !!!$a r5   )r#     avg`   r   r   r   r   Nr#   )r$   r$   )r$   r#      r#   r   r   r   )   r%      r   )   r'     N TgMbP?r~   r~   r   r   NNF)T)NF)NFTr  FT)r   FTT)"rf   rg   rh   r   rm   r   r   r   r   rk   r
   r	   rO   rn   rM   rZ   ro   r   r   ri   ignorer   r   r  r  r  r  r   r  r  r  r"  re   rp   rq   s   @r3   r   r     s    #$,2,2-348(.&3 !/5,2
 ,0!!%*"$'6A5;OW9W9 W9 	W9
 W9 W9  S/W9  S/W9 !c?W9 !sCx1W9 W9 CHoW9 #s(OW9 W9 W9  #38_!W9$ sCx%W92  %S#X3W9< "%=W9> ?W9@ AW9B #CW9D EW9F "GW9H d299os23IW9J T"))_c12KW9rELL U\\ = YY1 1 YY
D 
T 
 
 YY)T )T ) ) YY UC Uhsm Uae U 8<#$',4 ||4  eCcN344  	4 
 4  4  !%4  4  
tELL!5tELL7I)I#JJ	K4 p ./$#3S	>*  	
 &%,, 5<< $ 5<<  %,, r5   r   c                 4    | ddddddt         t        ddd	d
|S )Nr   )r#     r0  )   r1  g      ?r   )r#      r2  zpatch_embed.projr   z
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationmin_input_sizemeanr   
first_conv
classifierlicenser   )r3  kwargss     r3   _cfgr>  4  s5    H)}%.B(	  r5   ztimm/)	hf_hub_id)r#      r@  )r#      rA  )    rB  )r?  r8  r4  r5  r$  )r(  r(  )r   r4  r5  )	zsam2_hiera_tiny.fb_r896zsam2_hiera_tiny.fb_r896_2pt1zsam2_hiera_small.fb_r896zsam2_hiera_small.fb_r896_2pt1zsam2_hiera_base_plus.fb_r896z!sam2_hiera_base_plus.fb_r896_2pt1zsam2_hiera_large.fb_r1024zsam2_hiera_large.fb_r1024_2pt1zhieradet_small.untrainedc                     | j                  d|       } i }| j                         D ]S  \  }}|j                  |      r|j                  |d      }n+|j                  dd      }|j                  dd      }|||<   U |S )Nmodelr,  zmlp.layers.0zmlp.fc1zmlp.layers.1zmlp.fc2)getitems
startswithreplace)
state_dictrD  prefixoutputrb   rc   s         r3   checkpoint_filter_fnrL  t  s    4JF  " 1<<		&"%AIIni0IIni0q	 Mr5   variant
pretrainedc                     |j                  dd      }d}t        t        | |ft        t        |      t        |d      d|S )Nout_indicesr%   r,  )rJ  getter)rP  feature_cls)pretrained_filter_fnfeature_cfg)popr   r   r   rL  r   )rM  rN  r=  rP  checkpoint_prefixs        r3   _create_hiera_detrW    sW    **]A.K   %%9BST[hG  r5   c           	      J    t        dd      }t        dd| it        |fi |S )N)r   r$   r   r$   )r&   r   	   r   r   rN  )sam2_hiera_tinyr   rW  rN  r=  
model_argss      r3   r[  r[    s,    \YGJd:djIc\bIcddr5   c           	      J    t        dd      }t        dd| it        |fi |S )Nr   r$      r$   r   
      rZ  rN  )sam2_hiera_smallr\  r]  s      r3   re  re    s,    ]kJJeJe$zJd]cJdeer5   c           	      L    t        ddd      }t        dd| it        |fi |S )Np   r$   )r)  r)  )r   rF   r   rN  )sam2_hiera_base_plusr\  r]  s      r3   rh  rh    s/    q(KJi
idS]NhagNhiir5   c           	      P    t        ddddd      }t        dd| it        |fi |S )	N   r$   )r$      $   r%   )   !   +   r(  r%   r'  r(  )r   rF   r   r   r   rN  )sam2_hiera_larger\  r]  s      r3   rq  rq    s;    &!J eJe$zJd]cJdeer5   c           	      N    t        dddd      }t        dd| it        |fi |S )Nr`  rb  rp  gh㈵>)r   r   r   rx   rN  )hieradet_smallr\  r]  s      r3   rs  rs    s2    ]kWdrvwJc*cZHb[aHbccr5   )r,  )Nr,  r-  )Ar   copyr   	functoolsr   typingr   r   r   r   r	   r
   rZ   torch.nnrO   torch.nn.functional
functionalr]   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r    rm   r4   ro   r8   r@   rn   rB   rs   r   r   r>  default_cfgsrL  r   rk   rW  r[  re  rh  rq  rs  r;   r5   r3   <module>r     sI      ; ;     A    + + 0 <U38_   5c? PUVY[^V^P_ "     5c?  uS#sTWEW?X  9")) 9x_bii _D&bii &Raryy aJ		 %#  
 %) %
 !% !
 &* &
 %) %
 *. *
 "& $"h" '+ $"h' !% F![1& 1hs  8 $ e e
 f f
 j j
 f f d dr5   