
    ^jh                    "   d Z ddlmZ ddlmZmZmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddlm3Z3 ddl4m5Z5 erddlm6Z6  G d de      Z7 G d de      Z8d-dZ9d.dZ: G d d      Z;d Z< G d d e3      Z= G d! d"e5      Z> G d# d$e$e)      Z? G d% d&e$e;      Z@ G d' d(e$e;      ZA G d) d*e;e(e+      ZBy,)/a  
Like described in the :mod:`parso.python.tree` module,
there's a need for an ast like module to represent the states of parsed
modules.

But now there are also structures in Python that need a little bit more than
that. An ``Instance`` for example is only a ``Class`` before it is
instantiated. This class represents these cases.

So, why is there also a ``Class`` class here? Well, there are decorators and
they change classes in Python 3.

Representation modules also define "magic methods". Those methods look like
``py__foo__`` and are typically mappable to the Python equivalents ``__call__``
and others. Here's a list:

====================================== ========================================
**Method**                             **Description**
-------------------------------------- ----------------------------------------
py__call__(arguments: Array)           On callable objects, returns types.
py__bool__()                           Returns True/False/None; None means that
                                       there's no certainty.
py__bases__()                          Returns a list of base classes.
py__iter__()                           Returns a generator of a set of types.
py__class__()                          Returns the class of an instance.
py__simple_getitem__(index: int/str)   Returns a a set of types of the index.
                                       Can raise an IndexError/KeyError.
py__getitem__(indexes: ValueSet)       Returns a a set of types of the index.
py__file__()                           Only on modules. Returns None if does
                                       not exist.
py__package__() -> List[str]           Only on modules. For the import system.
py__path__()                           Only on modules. For the import system.
py__get__(call_object)                 Only on instances. Simulates
                                       descriptors.
py__doc__()                            Returns the docstring for a value.
====================================== ========================================

    )annotations)ListOptionalTupleTYPE_CHECKINGAny)debug)get_cached_parent_scopeexpr_is_dottedfunction_is_property)inference_state_method_cacheCachedMetaClass&inference_state_method_generator_cache)compiled)LazyKnownValuesLazyTreeValue)ParserTreeFilter)TreeNameDefinition	ValueName)unpack_arglistValuesArguments)ValueSetiterator_to_value_set	NO_VALUESValueWrapperClassContext)FunctionAndClassBaseFunctionMixin)	Decoratee)LazyGenericManagerTupleGenericManager)plugin_manager)	Parameter)BaseTreeParamName)AbstractSignature)InferenceStatec                  B     e Zd Z fdZed        Ze fd       Z xZS )	ClassNamec                B    t         |   ||       || _        || _        y N)super__init___apply_decorators_class_value)selfclass_value	tree_namename_contextapply_decorators	__class__s        S/opt/ringagent/.cad-venv/lib/python3.12/site-packages/jedi/inference/value/klass.pyr-   zClassName.__init__E   s"    y1!1'    c              #     K   ddl m}  || j                  j                  | j                  | j                        }|D ]8  }| j
                  r&|j                  d | j                        E d {    5| : y 7 w)Nr   )tree_name_to_values)instancer1   )jedi.inference.syntax_treer9   parent_contextinference_stater2   r.   	py__get__r/   )r0   r9   inferredresult_values       r6   inferzClassName.inferJ   sv      	C&//1D1DdnnV % 	#L%%'114TM^M^1___""		#_s   A*A;,A9-A;c                z    t         |   }|dk(  r*| j                  j                         }||S t	        |      ry|S )Nfunctionproperty)r,   api_typer2   get_definitionr   )r0   type_
definitionr5   s      r6   rE   zClassName.api_typeW   sD     J668J!#J/ "r7   )	__name__
__module____qualname__r-   r   rA   rD   rE   __classcell__r5   s   @r6   r)   r)   D   s0    (
 
# 
#  r7   r)   c                  @     e Zd Z	 	 d fd	Zd Zd Zd Z fdZ xZS )ClassFilterc                d    t         |   |j                         |||       || _        || _        y )N)until_positionorigin_scope)r,   r-   
as_contextr/   _is_instance)r0   r1   node_contextrQ   rR   is_instancer5   s         r6   r-   zClassFilter.__init__i   s;    ""$l)% 	 	

 ('r7   c           	         |D cg c]0  }t        | j                  || j                  | j                         2 c}S c c}w )N)r1   r2   r3   r4   )r)   r/   _node_contextrT   )r0   namesnames      r6   _convert_nameszClassFilter._convert_namess   sL      
   --!//%)%6%6!6	
 	
 
s   5=c                    | j                   }|8|| j                  k(  s|| j                  k(  ryt        | j                  |      }|8y)NTF)_origin_scope_parser_scoper<   r
   _parso_cache_node)r0   nodes     r6   _equals_origin_scopez ClassFilter._equals_origin_scope}   sP    !!t)))TT5H5H-H*4+A+A4HD  r7   c                    |j                   j                  d       xs- |j                   j                  d      xs | j                         S )N__)value
startswithendswithra   )r0   rZ   s     r6   _access_possiblezClassFilter._access_possible   sC    ::((.. +$**2E2Ed2K +((*	+r7   c                p    t         |   |      }|D cg c]  }| j                  |      s| c}S c c}w r+   )r,   _filterrg   )r0   rY   rZ   r5   s      r6   ri   zClassFilter._filter   s2    &!&F$*?*?*EFFFs   33)NNNF)	rI   rJ   rK   r-   r[   ra   rg   ri   rL   rM   s   @r6   rO   rO   h   s)    FJ05(
+
G Gr7   rO   c                    | D ]k  }|j                   dk(  s|j                  d   j                  dk(  s0|j                  d   j                  dk(  r y|j                  d   j                  dk(  sk y y	)
z
    Returns:

    - ``True`` if ``@dataclass(init=True)``
    - ``False`` if ``@dataclass(init=False)``
    - ``None`` if not specified ``@dataclass()``
    argumentr   init   FalseFTrueTN)typechildrenrd   )	arg_nodesarg_nodes     r6   init_param_valuert      su      MMZ'!!!$**f4  #))W4""1%++v5 r7   c           	     b   g }| j                         j                         }t        |j                         d       D ]  }|j                  j                         }|j                  d   }|j                  dk(  s<|j                  dk(  sL|j                  d   }|j                  dk(  r|j                  d   j                  dk(  rt        |j                        d	k  rd
}n|j                  d   }|j                  t        | j                  |j                  |j                  d   |              |S )a3  
    ``cls`` is a :class:`ClassMixin`. The type is only documented as mypy would
    complain that some fields are missing.

    .. code:: python

        @dataclass
        class A:
            a: int
            b: str = "toto"

    For the previous example, the param names would be ``a`` and ``b``.
    c                    | j                   S r+   )	start_pos)rZ   s    r6   <lambda>z+get_dataclass_param_names.<locals>.<lambda>   s
    $.. r7   )key   	expr_stmt	annassign	atom_exprr   ClassVar   N   )r<   r2   annotation_nodedefault_node)rS   get_global_filtersortedvaluesr2   rF   rq   rp   rd   lenappendDataclassParamNamer<   )clsparam_namesfilter_rZ   dr|   r`   defaults           r6   get_dataclass_param_namesr      s    Knn002Gw~~'-HI NN))+JJqM	66[ Y^^{%B%%a(DyyK'DMM!,<,B,Bj,P9%%&*#,,Q/1"11.. ) 2 21 5$	  & r7   c                     e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   d Zd Zd Zd Zed        Z	d Z
 e       d        Z	 	 ddZd dZd!dZd Zd Zd"dZ ed      d        Zd Zd Zd Zy)#
ClassMixinr   	tree_noder<   r'   r=   py__bases__get_metaclassesget_metaclass_filtersget_metaclass_signatureslist_type_varsc                     yNT r0   s    r6   is_classzClassMixin.is_class       r7   c                     yr   r   r   s    r6   is_class_mixinzClassMixin.is_class_mixin   r   r7   c                    ddl m} ddlm} | j	                         rt         ||       g      S t         || j                  | j                  | |      g      S )Nr   )TreeInstance)	TypedDict)jedi.inference.valuer   jedi.inference.gradual.typingr   is_typeddictr   r=   r<   )r0   	argumentsr   r   s       r6   
py__call__zClassMixin.py__call__   sM    5;Yt_-..d&:&:D<O<OQUW`abccr7   c                B    t        j                  | j                  d      S )Nrp   )r   builtin_from_namer=   r   s    r6   py__class__zClassMixin.py__class__   s    ))$*>*>GGr7   c                B    t        | | j                  j                        S r+   )r   r   rZ   r   s    r6   rZ   zClassMixin.name   s    t~~2233r7   c                .    | j                   j                  S r+   )rZ   string_namer   s    r6   
py__name__zClassMixin.py__name__   s    yy$$$r7   c              #  "  K   | g}|  | j                         D ]J  }|j                         D ]5  }	 |j                  } |       D ]  }||vs|j                  |       |  7 L y # t        $ r 	 t        j                  d| |       Y ^w xY ww)Nz$Super class of %s is not a class: %s)r   rA   	py__mro__r   AttributeErrorr	   warning)r0   mrolazy_clsr   
mro_methodcls_news         r6   r   zClassMixin.py__mro__   s     f
 ((* 	*H  ~~' **!$J $.< *"#-JJw/")M*'*	* & U	 MM"H$PSTUs-   .BA(BB(!B	BBBNFc              #  2  K   |r,| j                         }|r| j                  ||      E d {    | j                         D ]L  }|j                         r|j	                  |      E d {    .t        | |j                         ||       N |s|r}ddlm}  || j                  d      }|| k7  r^t        g       }	|j                  |	      D ]>  }
|
j	                         }t        |d        t        |d        t        |d       }|J | @ y y y y 7 7 w)N)rV   )rU   rR   rV   r   )r   rp   )r   r   r   is_compiledget_filtersrO   rS   jedi.inference.compiledr   r=   r   r   next)r0   rR   rV   include_metaclassesinclude_type_when_classmetaclassesr   r   rG   argsr:   instance_filtersxs                r6   r   zClassMixin.get_filters  s'    ..0K55k;OOO>># 	C ??{?CCC!s~~'7!- + 		 6A%d&:&:FCE} 'r* % 0 0 6 H'/';';'=$)40)40-t4A=(=G   7{ P Ds"   *DD<D)D*B*DDc                    | j                         D ]K  }t        |t              st        |j                  t              s/d|j                  j                         fc S  y)NT)FN)r   
isinstancer    _wrapped_valueDataclassTransformerinit_mode_from_new)r0   metas     r6   $_has_dataclass_transform_metaclassesz/ClassMixin._has_dataclass_transform_metaclasses.  sV    ((* 	FD4+t224HIT00CCEEE	F r7   c                   g }d}d}t        t        | j                                     D ]  }|sQt        |t              r|j
                  rd}|j
                  }n#t        |t              r|j                         \  }}|rV|sYt        |t              sj|j                         s|j                         |s|j                  t        |              |rt        |      gS g S )a)  
        Returns: A non-empty list if the class has dataclass semantics else an
        empty list.

        The dataclass-like semantics will be assumed for any class that directly
        or indirectly derives from the decorated class or uses the decorated
        class as a metaclass.
        FNT)reversedlistr   r   r   init_mode_from_init_subclassr   r   
ClassValueinit_param_modeextendr   DataclassSignature)r0   r   is_dataclass_transformdefault_init_moder   s        r6   #_get_dataclass_transform_signaturesz.ClassMixin._get_dataclass_transform_signatures9  s     !&,0D!123 %	C) s$8988-1*(+(H(H% sJ/ @@B >*,= * 'sJ/'')++-5:K ""-c2G%	N "&sK899Ir7   c                *   | j                         }|r| j                  |      }|r|S t        g       }| j                  |      }t	        |      }| j                         }|r|S |j                         D cg c]  }|j                  |        c}S c c}w r+   )r   r   r   r   init_or_new_funcr   get_signaturesbind)r0   r   sigsr   r:   
init_funcsdataclass_sigssigs           r6   r   zClassMixin.get_signaturesq  s     **,00=Dr"??4(%h/
AAC!!.8.G.G.IJsCHHTNJJJs   5Bc                    t        |       S r+   r   r   s    r6   _as_contextzClassMixin._as_context  s    D!!r7   c                L    |rd| j                         z  S | j                         S )NzType[%s])r   )r0   add_class_infos     r6   get_type_hintzClassMixin.get_type_hint  s$     111  r7   r   c                (   ddl m} | j                         D ]h  }t        |t              s y|j
                  }t        |      s y|j                         D ](  }t        ||      r  y	 |j                  } |       s'  y j y# t        $ r Y   yw xY w)Nr   )TypedDictClassFT)
r   r   r   r   r   datar   rA   r   r   )r0   r   r   r   r   methods         r6   r   zClassMixin.is_typeddict  s     	A((* 	$Hh6 I "),~~' $c>2	$ --F x#$	$.  & ! !	!s   (B	BBc                     ddl m |s!t        j                  d       t	         g      S t	         fd|D              S )Nr   GenericClassz:Class indexes inferred to nothing. Returning class insteadc              3  Z   K   | ]"  } t        j                  |              $ yw))context_of_indexindex_valueN)r!   context).0r   r   contextualized_noder0   s     r6   	<genexpr>z+ClassMixin.py__getitem__.<locals>.<genexpr>  s7      	
  "%8%@%@ +	
s   (+)jedi.inference.gradual.baser   r	   r   r   )r0   index_value_setr   r   s   ` `@r6   py__getitem__zClassMixin.py__getitem__  s?    <MMVWTF## 	
  /	
 	
 		
r7   c                2    ddl m}  || t        |            S )Nr   r   )r   r   r"   )r0   generics_tupler   s      r6   with_genericszClassMixin.with_generics  s    </
 	
r7   c                     ddl m}  fd}r*t         | t        t	         |                         g      S t         h      S )Nr   r   c               3     K   j                         D ](  } j                  | j                         t               * yw)aa  
            The TypeVars in the resulting classes have sometimes different names
            and we need to check for that, e.g. a signature can be:

            def iter(iterable: Iterable[_T]) -> Iterator[_T]: ...

            However, the iterator is defined as Iterator[_T_co], which means it has
            a different type var name.
            N)r   getr   r   )type_varr0   type_var_dicts    r6   remap_type_varsz3ClassMixin.define_generics.<locals>.remap_type_vars  s?      !//1 J#''(;(;(=yIIJs   =A )r   r   r   r"   tuple)r0   r   r   r   s   ``  r6   define_genericszClassMixin.define_generics  sL    <	J \#E/*;$<=    r7   )NFTT)returnzTuple[bool, Optional[bool]])r   zList[DataclassSignature]T)rI   rJ   rK   __annotations__r   r   r   r   rD   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r6   r   r      s    N##!!dH 4 4% ,-* .*@ :?FJB	6pK&"!
 "%0 1:
 
 r7   r   c                N   | j                  d      }t        |      dk(  rut        t        |            }	 |j                  }|j                         j                         r4|j                  j                  j                  dk(  r| j                  d      S |S |S # t        $ r Y |S w xY w)Nr-   rz   object__new__)
py__getattribute__r   r   iterclass_contextget_root_contextis_builtins_modulerZ   r   r   )rd   r   rl   r  s       r6   r   r     s    ))*5J
:!D$%		; ..M --/BBD**//;;xG//	:::  	 	s   B 	B$#B$c                  .     e Zd ZdZ fdZd Zd Z xZS )r   zL
    Represent a field declaration on a class with dataclass semantics.
    c                B    t         |   ||       || _        || _        y r+   )r,   r-   r   r   )r0   r<   r2   r   r   r5   s        r6   r-   zDataclassParamName.__init__  s"    3.(r7   c                "    t         j                  S r+   )r$   POSITIONAL_OR_KEYWORDr   s    r6   get_kindzDataclassParamName.get_kind  s    ...r7   c                p    | j                   t        S | j                  j                  | j                         S r+   )r   r   r<   
infer_noder   s    r6   rA   zDataclassParamName.infer  s1    '&&11$2F2FGGr7   )rI   rJ   rK   __doc__r-   r  rA   rL   rM   s   @r6   r   r     s    )
/Hr7   r   c                  *     e Zd ZdZ fdZddZ xZS )r   zn
    It represents the ``__init__`` signature of a class with dataclass semantics.

    .. code:: python

    c                2    t         |   |       || _        y r+   )r,   r-   _param_names)r0   rd   r   r5   s      r6   r-   zDataclassSignature.__init__  s    'r7   c                    | j                   S r+   )r  )r0   resolve_starss     r6   get_param_namesz"DataclassSignature.get_param_names	  s       r7   )F)rI   rJ   rK   r  r-   r  rL   rM   s   @r6   r   r     s    (!r7   r   c                  .     e Zd ZdZdd fdZddZ xZS )DataclassDecoratora  
    A dataclass(-like) decorator with custom parameters.

    .. code:: python

        @dataclass(init=True) # this
        class A: ...

        @dataclass_transform
        def create_model(*, init=False): pass

        @create_model(init=False) # or this
        class B: ...
    c                h    t         |   |       | j                  |      }||| _        y|| _        y)z
        Args:
            function: Decoratee | function
            arguments: The parameters to the dataclass function decorator
            default_init: Boolean to indicate the default init value
        N)r,   r-   _init_param_valuer   )r0   rC   r   default_initargument_initr5   s        r6   r-   zDataclassDecorator.__init__  s=     	"..y9*6M 	<H 	r7   c                    |j                   sy |j                   j                  dk(  r|j                   j                  n|j                   g}t        |      S )Narglist)argument_noderp   rq   rt   )r0   r   rr   s      r6   r  z$DataclassDecorator._init_param_value*  sS    && &&++y8 ##,,))* 	  	**r7   r   )r  boolr   zOptional[bool])rI   rJ   rK   r  r-   r  rL   rM   s   @r6   r  r    s    

+r7   r  c                  <     e Zd ZdZ fdZddZedd       Z xZS )r   aO  
    A class decorated with the ``dataclass_transform`` decorator. dataclass-like
    semantics will be assumed for any class that directly or indirectly derives
    from the decorated class or uses the decorated class as a metaclass.
    Attributes on the decorated class and its base classes are not considered to
    be fields.
    c                $    t         |   |       y r+   )r,   r-   )r0   wrapped_valuer5   s     r6   r-   zDataclassTransformer.__init__?  s    'r7   c                `   | j                   j                  d      }|syt        |      d   }|j                         D ]o  }|j                  dk(  s|j
                  s |j
                  j                  dk(  s:|j
                  j                  dk(  r y|j
                  j                  dk(  so y y)	z$Default value if missing is ``True``r  Tr   rl   keywordrn   Fro   )r   r  r   r  r   r   rp   rd   )r0   new_methods
new_methodparams       r6   r   z'DataclassTransformer.init_mode_from_newB  s    ))<<YG+&q)
//1 		 E!!V+&&&&++y8%%++w6 ''--7		  r7   c                     yr   r   r   s    r6   r   z1DataclassTransformer.init_mode_from_init_subclassX  s     r7   )r   r  r   )	rI   rJ   rK   r  r-   r   rD   r   rL   rM   s   @r6   r   r   7  s&    (,  r7   r   c                  .     e Zd ZdZ	 	 d fdZd Z xZS )DataclassWrappera}  
    A class with dataclass semantics from a decorator. The init parameters are
    only from the current class and parent classes decorated where the ``init``
    parameter was ``True``.

    .. code:: python

        @dataclass
        class A: ... # this

        @dataclass_transform
        def create_model(): pass

        @create_model()
        class B: ... # or this
    c                2    t         |   |       || _        y r+   )r,   r-   should_generate_init)r0   r#  r-  r5   s      r6   r-   zDataclassWrapper.__init__q  s     	'$8!r7   c                    g }t        t        | j                                     D ]:  }t        |t              s|j
                  s!|j                  t        |             < t        |      gS r+   )	r   r   r   r   r+  r-  r   r   r   )r0   r   r   s      r6   r   zDataclassWrapper.get_signaturesw  sc    D!123 	CC3 01,,""#<S#AB	C #3455r7   )r-  r  )rI   rJ   rK   r  r-   r   rL   rM   s   @r6   r+  r+  _  s    "93796r7   r+  c                      e Zd ZdZ e       d        Zd Z ed      d        Z ej                         d        Z
 ee      d        Zdd	Z ej                         d
        Zy)r   classc                    g }| j                   j                         }|g S t        |      D ]<  \  }}|r	ddlm}  || j
                  |      D ]  }||vs|j                  |        > |S )Nr   )find_unknown_type_vars)r   get_super_arglistr   !jedi.inference.gradual.annotationr2  r<   r   )r0   foundr  starsr`   r2  r   s          r6   r   zClassValue.list_type_vars  s{    ..224?I)'2 	+KE4P243F3FM +5(LL*+	+ r7   c                    | j                   j                         }|r-ddlm} |j	                  | j
                  | j                  |      S y )Nr   )r   )r   r3  jedi.inferencer   TreeArgumentsr=   r<   )r0   r  r   s      r6   _get_bases_argumentszClassValue._get_bases_arguments  s?    ..2240**4+?+?ATATV]^^r7   r   r   c                @   | j                         }|)|j                         D cg c]
  \  }}|	| }}}|r|S | j                         dk(  r| j                  j	                         rg S t        | j                  j                  j                  d            gS c c}}w )Nr  )	r:  unpackr   r<   r  r   r=   builtins_moduler  )r0   r   ry   rd   lsts        r6   r   zClassValue.py__bases__  s    ((*+/;;=HZS%CK5HCH
??(''::<I  00CCHM
  	 Is
   
BBc                2    t        j                  d|       g S )NzUnprocessed metaclass %s)r	   r   )r0   r   rV   s      r6   r   z ClassValue.get_metaclass_filters  s    0+>	r7   c                   | j                         }|Z|j                         D cg c]  \  }}|dk(  s| }}}t        j                  d |D              }t        d |D              }|r|S | j	                         D ]@  }|j                         D ]+  }|j                         s|j                         }|s'|c c S  B t        S c c}}w )N	metaclassc              3  <   K   | ]  }|j                           y wr+   )rA   )r   
lazy_values     r6   r   z-ClassValue.get_metaclasses.<locals>.<genexpr>  s     ,TJZ-=-=-?,Ts   c              3  B   K   | ]  }|j                         s|  y wr+   )r   )r   ms     r6   r   z-ClassValue.get_metaclasses.<locals>.<genexpr>  s     "JQZZ\1"Js   )	r:  r<  r   	from_setsr   rA   r   r   r   )r0   r   ry   rd   rE  r   	lazy_baser   s           r6   r   zClassValue.get_metaclasses  s    ((*)-M:3#:LMAM",,,TRS,TTK""Jk"JJK""))+ 	&I"* &>>#"224F%	&	&  Ns
   CCc                    | j                         }|y|j                  j                  dk7  ryt        |j                  j                        S )zQ
        It returns ``True`` if ``class X(init=False):`` else ``False``.
        Nr  )r:  r  rp   rt   rq   )r0   bases_argumentss     r6   r   zClassValue.init_param_mode  sK     335"((--:  = = F FGGr7   c                    g S r+   r   )r0   r   s     r6   r   z#ClassValue.get_metaclass_signatures  s    	r7   Nr   )rI   rJ   rK   rE   r   r   r:  r   r#   decorater   r   r   r   r   r   r7   r6   r   r     s    H!# $" ""- . ^  ")4 5"H  ^ r7   r   )rA  Nr   )r   zList[DataclassParamName])Cr  
__future__r   typingr   r   r   r   r   jedir	   jedi.parser_utilsr
   r   r   jedi.inference.cacher   r   r   r8  r   jedi.inference.lazy_valuer   r   jedi.inference.filtersr   jedi.inference.namesr   r   jedi.inference.argumentsr   r   jedi.inference.base_valuer   r   r   r   jedi.inference.contextr   jedi.inference.value.functionr   r   jedi.inference.value.decoratorr    jedi.inference.gradual.genericsr!   r"   jedi.pluginsr#   inspectr$   r%   jedi.inference.signaturer&   r'   r)   rO   rt   r   r   r   r   r   r  r   r+  r   r   r7   r6   <module>r]     s   %L # < <  + + # D 3 > D  / M 4 S '  2 6-!" !H$G" $GN*#LL  L ^"H* H(!* !'+} '+T%< %P 6|Z  6FT1_ Tr7   