o
    پi                     @   s  d Z ddgZddlmZmZmZmZ ddlmZ ddl	Z	ddl
mZ ddlm  mZ ddlmZmZ ddlmZmZmZ d	d
lmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZm Z  dvde!pde"pde#fddZ$dwde!ppe"ppe#de%de%fddZ&de%pe"e%df de%pe"e%df fddZ'G dd dej(Z)G dd dej(Z*G d d! d!ej(Z+G d"d# d#ej(Z,G d$d% d%ej(Z-G d&d' d'ej(Z.ee. G d(d) d)ej(Z/G d*d+ d+ej(Z0	,	-dxd.e%d/e%d0e%d1e1d2e2d3e2d4e3d5e2fd6d7Z4G d8d9 d9ej5Z6G d:d; d;ej(Z7G d<d= d=ej(Z8G d>d? d?ej(Z9G d@d dej(Z:G dAd dej(Z;dydCdDZ<e i dEe<dFdGdHe<dFdGdIe<dFdJdKdLdMdNe<dFdOdPdLdMdQe<dFdGdRe<dFdJdKdLdMdSe<dFdOdPdLdMdTe<dFdGdUe<dFdJdKdLdMdVe<dFdOdPdLdMdWe<dFdLdXdYe<dFdLdXdZe<dFdJdKdLdMd[e<dFdOdPdLdMd\e<dFd]d^dLdMd_e<dFdLdXd`e<dFdJdKdLdMe<dFdadbdLdMe<dFd]d^dLdMdcZ=dzdddeZ>dzdfdgZ?edzdhdiZ@edzdjdkZAedzdldmZBedzdndoZCedzdpdqZDedzdrdsZEedzdtduZFdS ){a   EfficientViT (by MIT Song Han's Lab)

Paper: `Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition`
    - https://arxiv.org/abs/2205.14756

Adapted from official impl at https://github.com/mit-han-lab/efficientvit
EfficientVitEfficientVitLarge    )ListOptionalTupleUnion)partialNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dcreate_conv2dGELUTanh   )build_model_with_cfg)feature_take_indices)register_notrace_module)checkpoint_seq)register_modelgenerate_default_cfgsxc                    s,   t  ttfrt S  fddt|D S )Nc                    s   g | ]} qS  r   .0_r   r   P/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/efficientvit_mit.py
<listcomp>   s    zval2list.<locals>.<listcomp>)
isinstancelisttuplerange)r   repeat_timer   r   r   val2list   s   r#   min_len
idx_repeatc                    sD   t tdkr fddt|t D   < tS )Nr   c                    s   g | ]}  qS r   r   r   r&   r   r   r   r   $       zval2tuple.<locals>.<listcomp>)r#   lenr!   r    )r   r%   r&   r   r'   r   	val2tuple    s   (r*   kernel_size.returnc                 C   s8   t | trtdd | D S | d dksJ d| d S )Nc                 S   s   g | ]}t |qS r   )get_same_padding)r   ksr   r   r   r   +   r(   z$get_same_padding.<locals>.<listcomp>   r   z kernel size should be odd number)r   r    )r+   r   r   r   r-   )   s   
r-   c                       sD   e Zd Zddddddejejfdedef fddZd	d
 Z  Z	S )ConvNormAct   r   F        in_channelsout_channelsc              	      st   t t|   tj|dd| _t|||||||d| _|	r"|	|dnt | _	|
d ur3|
dd| _
d S t | _
d S )NFinplace)r+   stridedilationgroupsbias)num_featuresT)superr0   __init__nnDropoutdropoutr   convIdentitynormact)selfr3   r4   r+   r7   r8   r9   r:   r@   
norm_layer	act_layer	__class__r   r   r=   2   s   	&zConvNormAct.__init__c                 C   s,   |  |}| |}| |}| |}|S N)r@   rA   rC   rD   rE   r   r   r   r   forwardM   s
   



zConvNormAct.forward)
__name__
__module____qualname__r>   BatchNorm2dReLUintr=   rL   __classcell__r   r   rH   r   r0   1   s    r0   c                       sH   e Zd Zdddejejfejdffdedef fddZd	d
 Z  Z	S )DSConvr1   r   FNr3   r4   c              
      sx   t t|   t|d}t|d}t|d}t||||||d |d |d d| _t||d|d |d |d d| _d S )Nr/   r   )r9   rF   rG   r:   r   rF   rG   r:   )r<   rT   r=   r*   r0   
depth_conv
point_conv)rE   r3   r4   r+   r7   use_biasrF   rG   rH   r   r   r=   V   s,   




zDSConv.__init__c                 C      |  |}| |}|S rJ   )rV   rW   rK   r   r   r   rL   x      

zDSConv.forward
rM   rN   rO   r>   rP   ReLU6rR   r=   rL   rS   r   r   rH   r   rT   U   s    
"rT   c                       sL   e Zd Zdddddejejfejdffdedef fddZd	d
 Z  Z	S )	ConvBlockr1   r   NFr3   r4   c
           
   	      s   t t|   t|d}t|d}t|	d}	|pt|| }t|||||d |	d |d d| _t|||d|d |	d |d d| _d S )Nr/   r   rU   r   )r<   r]   r=   r*   roundr0   conv1conv2
rE   r3   r4   r+   r7   mid_channelsexpand_ratiorX   rF   rG   rH   r   r   r=      s.   


	zConvBlock.__init__c                 C   rY   rJ   )r_   r`   rK   r   r   r   rL      rZ   zConvBlock.forwardr[   r   r   rH   r   r]   ~   s    
%r]   c                	       sT   e Zd Zdddddejejejfejejdffdedef fdd	Zd
d Z  Z	S )MBConvr1   r   N   Fr3   r4   c
           
   
      s   t t|   t|d}t|d}t|	d}	|pt|| }t||dd|d |	d |d d| _t||||||d |	d |d d| _t||d|d |	d |d d| _d S )Nr1   r   r   )r7   rF   rG   r:   r7   r9   rF   rG   r:   r/   rU   )	r<   rd   r=   r*   r^   r0   inverted_convrV   rW   ra   rH   r   r   r=      s@   


	
zMBConv.__init__c                 C   s"   |  |}| |}| |}|S rJ   )rg   rV   rW   rK   r   r   r   rL      s   


zMBConv.forwardr[   r   r   rH   r   rd      s    .rd   c                	       sN   e Zd Zddddddejejfejdffdedef fdd	Zd
d Z  Z	S )FusedMBConvr1   r   Nre   Fr3   r4   c              
      s   t t|   t|d}t|	d}	t|
d}
|pt|| }t||||||	d |
d |d d| _t||d|	d |
d |d d| _d S )Nr/   r   rf   r   rU   )r<   rh   r=   r*   r^   r0   spatial_convrW   )rE   r3   r4   r+   r7   rb   rc   r9   rX   rF   rG   rH   r   r   r=      s.   



zFusedMBConv.__init__c                 C   rY   rJ   )ri   rW   rK   r   r   r   rL     rZ   zFusedMBConv.forwardr[   r   r   rH   r   rh      s    
&rh   c                	       sb   e Zd ZdZdddddejfdejddf	d	ed
edepddef fddZ	dd Z
dd Z  ZS )LiteMLAz(Lightweight multi-scale linear attentionN      ?   FNN)   h㈵>r3   r4   headsheads_ratioc                    s   t t|   || _ pt|| |   | tdt|d}t|d}|| _t|d dd |d |d d| _t	
 fdd|
D | _|	dd	| _tdt|
  |dd |d |d d| _d S )
Nr/   r1   r   r   )r:   rF   rG   c                    s^   g | ]+}t t jd  d  |t|d  d dt jd  d  dd   d dqS )r1   r   )paddingr9   r:   r   )r9   r:   )r>   
SequentialConv2dr-   )r   scalerp   	total_dimrX   r   r   r   /  s    "z$LiteMLA.__init__.<locals>.<listcomp>Fr5   )r<   rj   r=   epsrR   r*   dimr0   qkvr>   
ModuleListaggregkernel_funcr)   proj)rE   r3   r4   rp   rq   ry   rX   rF   rG   r}   scalesrx   rH   rv   r   r=     s8   



zLiteMLA.__init__c                 C   sj   |j }| | | }}}|dd| }|| }|dd df |ddd f | j  }||S )Nr$   .)dtypefloat	transposerx   to)rE   qkvr   kvoutr   r   r   _attnH  s   &
zLiteMLA._attnc                 C   s"  |j \}}}}| |}|g}| jD ]	}||| qtj|dd}||dd| j || dd}|j	ddd\}	}
}| 
|	}	| 
|
}
tj|dddd	}tj swtj|jjd
d | |	|
|}W d    n1 sqw   Y  n| |	|
|}|dd|d||}| |}|S )Nr   )ry   r$   r1   r   )r   r   constantrk   )modevalueF)device_typeenabled)shaperz   r|   appendtorchcatreshapery   r   chunkr}   Fpadjitis_scriptingautocastdevicetyper   r~   )rE   r   Br   HWrz   multi_scale_qkvopr   r   r   r   r   r   r   rL   P  s(   

"



zLiteMLA.forward)rM   rN   rO   __doc__r>   rP   rQ   rR   r   r=   r   rL   rS   r   r   rH   r   rj     s,    8rj   c                       s4   e Zd Zdddejejf fdd	Zdd Z  ZS )EfficientVitBlockrk          c              
      s`   t t|   tt||||d |fdt | _tt|||dd d |f||d fdt | _	d S )N)r3   r4   rq   ry   rF   TTF)r3   r4   rc   rX   rF   rG   )
r<   r   r=   ResidualBlockrj   r>   rB   context_modulerd   local_module)rE   r3   rq   head_dimrc   rF   rG   rH   r   r   r=   q  s,   	

zEfficientVitBlock.__init__c                 C   rY   rJ   )r   r   rK   r   r   r   rL     rZ   zEfficientVitBlock.forward)	rM   rN   rO   r>   rP   	Hardswishr=   rL   rS   r   r   rH   r   r   p  s     r   c                       sJ   e Zd Z		d	deej deej deej f fddZdd Z  ZS )
r   Nmainshortcutpre_normc                    s4   t t|   |d ur|nt | _|| _|| _d S rJ   )r<   r   r=   r>   rB   r   r   r   )rE   r   r   r   rH   r   r   r=     s   
zResidualBlock.__init__c                 C   s,   |  | |}| jd ur|| | }|S rJ   )r   r   r   )rE   r   resr   r   r   rL     s   
zResidualBlock.forwardrm   )	rM   rN   rO   r   r>   Moduler=   rL   rS   r   r   rH   r   r     s    r   Fdefaultr3   r4   r7   rc   rF   rG   
fewer_norm
block_typec           	   
   C   s   |dv sJ |dkr>|dkr&t | |||rdnd|rd |fn||d fd}|S t| |||r.dnd|r5d |fn||d fd}|S |dkr]t| ||||rKdnd|rSd d |fn|||d fd}|S t| ||||rfdnd|rmd |fn||d fd}|S )	N)r   largefusedr   r   )TFF)r3   r4   r7   rX   rF   rG   r   )r3   r4   r7   rc   rX   rF   rG   )rT   r]   rd   rh   )	r3   r4   r7   rc   rF   rG   r   r   blockr   r   r   build_local_block  sT   

&


	r   c                       s   e Zd Zd fdd	Z  ZS )Stemr   c           	         sx   t    d| _| dt||dd||d d}t|D ]}| d| tt||dd|||dt	  |d7 }qd S )	Nr/   in_convr1   )r+   r7   rF   rG   r   r   r   )r3   r4   r7   rc   rF   rG   r   )
r<   r=   r7   
add_moduler0   r!   r   r   r>   rB   )	rE   in_chsout_chsdepthrF   rG   r   
stem_blockr   rH   r   r   r=     s2   
	
zStem.__init__)r   )rM   rN   rO   r=   rS   r   r   rH   r   r     s    r   c                       s(   e Zd Z	d fdd	Zdd Z  ZS )EfficientVitStageFc	                    s   t t|   tt||d||||dd g}	|}|r.t|D ]}
|	t|||||d qntd|D ]}|	tt||d|||dt	  q3tj
|	 | _d S )Nr/   )r3   r4   r7   rc   rF   rG   r   r3   r   rc   rF   rG   r   )r3   r4   r7   rc   rF   rG   )r<   r   r=   r   r   r!   r   r   r>   rB   rs   blocks)rE   r   r   r   rF   rG   rc   r   	vit_stager   r   irH   r   r   r=     sN   	zEfficientVitStage.__init__c                 C   
   |  |S rJ   r   rK   r   r   r   rL   5     
zEfficientVitStage.forwardFrM   rN   rO   r=   rL   rS   r   r   rH   r   r     s    
7r   c                       s*   e Zd Z		d fdd	Zdd Z  ZS )EfficientVitLargeStageFc	                    s   t t|   tt||d|rdnd|||p||rdnddd g}	|}|r9t|D ]}
|	t||d||d q)nt|D ]}|	tt||d	d
||||rNdnddt	  q=tj
|	 | _d S )Nr/         r   r   )r3   r4   r7   rc   rF   rG   r   r   re   r   r   r   )r<   r   r=   r   r   r!   r   r   r>   rB   rs   r   )rE   r   r   r   rF   rG   r   r   r   r   r   r   rH   r   r   r=   :  sT   




zEfficientVitLargeStage.__init__c                 C   r   rJ   r   rK   r   r   r   rL   t  r   zEfficientVitLargeStage.forward)FFr   r   r   rH   r   r   9  s
    	:r   c                       st   e Zd Zddejejddfdedee deded	e	d
ef fddZ
dded	ee	 fddZddefddZ  ZS )ClassifierHead  r2   avgro   r3   widthsnum_classesr@   	pool_typenorm_epsc	           	         s   t t|   || _|d | _|sJ dt||d d||d| _t|dd| _t	
t	j|d |d dd	t	j|d |d
|d urF|ddnt	 t	j|dd|dkr]t	j|d |dd	nt	 | _d S )Nr$   Cannot disable poolingr   r   )rF   rG   Tr   flattenFr:   rx   r5   )r<   r   r=   r   r;   r0   r   r   global_poolr>   rs   Linear	LayerNormrB   r?   
classifier)	rE   r3   r   r   r@   rF   rG   r   r   rH   r   r   r=   y  s   
"
zClassifierHead.__init__Nc                 C   sX   |d ur|s
J dt |dd| _|dkr#tj| j|dd| jd< d S t | jd< d S )Nr   Tr   r   r   r$   )r   r   r>   r   r;   r   rB   )rE   r   r   r   r   r   reset  s   zClassifierHead.resetF
pre_logitsc                 C   sb   |  |}| |}|r*| jd |}| jd |}| jd |}| jd |}|S | |}|S )Nr   r   r/   r1   )r   r   r   rE   r   r   r   r   r   rL     s   


zClassifierHead.forwardrJ   r   )rM   rN   rO   r>   rP   r   rR   r   r   strr=   r   r   boolrL   rS   r   r   rH   r   r   x  s,    		r   c                       s8  e Zd Zdddddejejddddf fdd		Zejj	d-ddZ
ejj	d.ddZejj	dejfddZd/dedee fddZ		
	
		
d0dejdeeeee f  dededededeeej eejeej f f fdd Z	!	
	d1deeee f d"ed#efd$d%Zd&d' Zd-d(efd)d*Zd+d, Z  ZS )2r   r1   r   r   r   r   r2   r   c                    s  t t|   d| _|| _|| _t||d |d ||| _| jj}g | _	t
 | _|d }tt|dd  |dd  D ].\}\}}| jt||||||||dkd |d9 }|}|  j	t||d| dg7  _	q<|| _t| j|	||
| jd| _| jj| _d S )	NFr   r   r/   )r   rF   rG   rc   r   r   stages.num_chs	reductionmodule)r   r   r@   r   )r<   r   r=   grad_checkpointingr   r   r   stemr7   feature_infor>   rs   stages	enumeratezipr   r   dictr;   r   headhead_hidden_size)rE   in_chansr   depthsr   rc   rF   rG   r   head_widths	drop_rater   r7   r3   r   wdrH   r   r   r=     s@   
*
"zEfficientVit.__init__Fc                 C      t d|rdnddgd}|S Nz^stemz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.\w+\.(\d+)N)r   r   r   rE   coarsematcherr   r   r   group_matcher     zEfficientVit.group_matcherTc                 C   
   || _ d S rJ   r   rE   enabler   r   r   set_grad_checkpointing     
z#EfficientVit.set_grad_checkpointingr,   c                 C      | j jd S Nr$   r   r   rE   r   r   r   get_classifier     zEfficientVit.get_classifierNr   r   c                 C      || _ | j|| d S rJ   r   r   r   rE   r   r   r   r   r   reset_classifier     zEfficientVit.reset_classifierNCHWr   indicesrC   
stop_early
output_fmtintermediates_onlyc                 C      |dv sJ dg }t t| j|\}}	| |}tj s |s$| j}
n	| jd|	d  }
t|
D ]\}}| jrCtj sCt	|
|}n||}||v rP|
| q1|rU|S ||fS a   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 compatible 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
        Returns:

        )r  zOutput shape must be NCHW.Nr   r   r)   r   r   r   r   r   r   r   r   r   rE   r   r  rC   r  r  r  intermediatestake_indices	max_indexr   feat_idxstager   r   r   forward_intermediates  "   

z"EfficientVit.forward_intermediatesr   
prune_norm
prune_headc                 C   <   t t| j|\}}| jd|d  | _|r| dd |S z@ Prune layers not required for specified intermediates.
        Nr   r    r   r)   r   r  rE   r  r  r  r  r  r   r   r   prune_intermediate_layers$  
   z&EfficientVit.prune_intermediate_layersc                 C   8   |  |}| jrtj st| j|}|S | |}|S rJ   r   r   r   r   r   r   r   rK   r   r   r   forward_features2     

zEfficientVit.forward_featuresr   c                 C      |r	| j ||dS |  |S N)r   r   r   r   r   r   forward_head:     zEfficientVit.forward_headc                 C   rY   rJ   r)  r.  rK   r   r   r   rL   =  rZ   zEfficientVit.forwardr   TrJ   NFFr  Fr   FT)rM   rN   rO   r>   rP   r   r=   r   r   ignorer   r  r   r  rR   r   r   r  Tensorr   r   r   r   r  r%  r)  r.  rL   rS   r   r   rH   r   r     sj    4
 
0
c                       s6  e Zd Zddddejedddddf fdd		Zejj	d-ddZ
ejj	d.ddZejj	dejfddZd/dedee fddZ		
	
		
d0dejdeeeee f  dededededeeej eejeej f f fdd Z	!	
	d1deeee f d"ed#efd$d%Zd&d' Zd-d(efd)d*Zd+d, Z  ZS )2r   r1   r   r   r   r2   r   gHz>c                    s$  t t|   d| _|| _|
| _|| _t|| jd}t||d |d ||dd| _	| j	j
}g | _t | _|d }tt|dd  |dd  D ]0\}\}}| jt|||||||dk|dkd	 |d9 }|}|  jt||d
| dg7  _qH|| _t| j||
|	| j|| jd| _| jj| _d S )NFr   r   r   )r   r   r1   r/   )r   rF   rG   r   r   r   r   r   )r   r   r@   r   rG   r   )r<   r   r=   r   r   r   r   r   r   r   r7   r   r>   rs   r   r   r   r   r   r   r;   r   r   r   )rE   r   r   r   r   rF   rG   r   r   r   r   r   r7   r3   r   r   r   rH   r   r   r=   D  sH   
*
"	zEfficientVitLarge.__init__Fc                 C   r   r   r   r   r   r   r   r   |  r   zEfficientVitLarge.group_matcherTc                 C   r   rJ   r   r   r   r   r   r    r  z(EfficientVitLarge.set_grad_checkpointingr,   c                 C   r  r  r  r  r   r   r   r    r  z EfficientVitLarge.get_classifierNr   r   c                 C   r	  rJ   r
  r  r   r   r   r    r  z"EfficientVitLarge.reset_classifierr  r   r  rC   r  r  r  c                 C   r  r  r  r  r   r   r   r    r  z'EfficientVitLarge.forward_intermediatesr   r  r  c                 C   r   r!  r#  r$  r   r   r   r%    r&  z+EfficientVitLarge.prune_intermediate_layersc                 C   r'  rJ   r(  rK   r   r   r   r)    r*  z"EfficientVitLarge.forward_featuresr   c                 C   r+  r,  r-  r   r   r   r   r.    r/  zEfficientVitLarge.forward_headc                 C   rY   rJ   r0  rK   r   r   r   rL     rZ   zEfficientVitLarge.forwardr   r1  rJ   r2  r3  )rM   rN   rO   r>   rP   r   r=   r   r   r4  r   r  r   r  rR   r   r   r  r5  r   r   r   r   r  r%  r)  r.  rL   rS   r   r   rH   r   r   C  sj    8
 
0
r"  c              
   K   s   | dt tdddddd	|S )Nr   zstem.in_conv.convzhead.classifier.4gffffff?)r1      r6  )   r7  )	urlr   meanstd
first_convr   crop_pct
input_size	pool_sizer	   )r8  kwargsr   r   r   _cfg  s   
r@  zefficientvit_b0.r224_in1kztimm/)	hf_hub_idzefficientvit_b1.r224_in1kzefficientvit_b1.r256_in1k)r1      rB  )rl   rl   rk   )rA  r=  r>  r<  zefficientvit_b1.r288_in1k)r1      rC  )	   rD  zefficientvit_b2.r224_in1kzefficientvit_b2.r256_in1kzefficientvit_b2.r288_in1kzefficientvit_b3.r224_in1kzefficientvit_b3.r256_in1kzefficientvit_b3.r288_in1kzefficientvit_l1.r224_in1k)rA  r<  zefficientvit_l2.r224_in1kzefficientvit_l2.r256_in1kzefficientvit_l2.r288_in1kzefficientvit_l2.r384_in1k)r1     rE  )   rF  zefficientvit_l3.r224_in1kzefficientvit_l3.r256_in1k)r1   @  rG  )
   rH  )zefficientvit_l3.r320_in1kzefficientvit_l3.r384_in1kc                 K   0   | dd}tt| |fdtd|di|}|S Nout_indices)r   r   r/   r1   feature_cfgT)flatten_sequentialrK  )popr   r   r   variant
pretrainedr?  rK  modelr   r   r   _create_efficientvitJ     
rS  c                 K   rI  rJ  )rN  r   r   r   rO  r   r   r   _create_efficientvit_largeV  rT  rU  c                 K   .   t ddddd}tdd| it |fi |S )	N)rl   r   r   @      )r   r/   r/   r/   r/   r   )   i   r   r   r   r   efficientvit_b0rQ  )r[  r   rS  rQ  r?  
model_argsr   r   r   r[  b     r[  c                 K   rV  )	N)r   r   rW  rX  rB  )r   r/   r1   r1   r   r   )i   i@  rZ  efficientvit_b1rQ  )r`  r\  r]  r   r   r   r`  i  r_  r`  c                 K   rV  )	N)r   0   `      rE  )r   r1   r   r   re   r   i 	  i 
  rZ  efficientvit_b2rQ  )re  r\  r]  r   r   r   re  p  r_  re  c                 K   rV  )	Nr   rW  rX  rB     )r   r   re   re   rD  r   rd  rZ  efficientvit_b3rQ  )rh  r\  r]  r   r   r   rh  w  r_  rh  c                 K   rV  )	Nrf  )r   r   r   re   re   r   i   i  rZ  efficientvit_l1rQ  )rj  r   rU  r]  r   r   r   rj  ~  r_  rj  c                 K   rV  )	Nrf  r   r/   r/   rl   rl   r   ri  rZ  efficientvit_l2rQ  )rm  rk  r]  r   r   r   rm    r_  rm  c                 K   rV  )	N)rW  rX  rB  rg  rY  rl  r   )i   i   rZ  efficientvit_l3rQ  )rn  rk  r]  r   r   r   rn    r_  rn  )r   )r   r$   )Fr   )r"  r   )Gr   __all__typingr   r   r   r   	functoolsr   r   torch.nnr>   torch.nn.functional
functionalr   	timm.datar
   r   timm.layersr   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   	_registryr   r   r   r    anyr#   rR   r*   r-   r   r0   rT   r]   rd   rh   rj   r   r   r   r   r   r   rs   r   r   r   r   r   r   r@  default_cfgsrS  rU  r[  r`  re  rh  rj  rm  rn  r   r   r   r   <module>   sB    *	$),6-`'
6<?2  
!%)-159=A

[
