
    h                        d Z ddl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mZmZmZmZmZ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mZ ddl m!Z!m"Z" dd	l#m$Z$ dd
l%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ ddddddZ0ddddddddddddddZ1i d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQZ2i ddRd dSd"dTd$dUd&dVd(dWd@dXdYdZd[d\d]d^d_d`dadbdcdddedWdfdVdgdhdidji dkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddZ3dddddZ4dddZ5dddddddddZ6 G d de          Z7dZ8 G d de)          Z9 G d de9          Z: G d de9          Z; G d de)          Z< G d de<          Z=e<e<e<e<e<e<e=e<e=e=d
Z> G d de)          Z? G d de)          Z@ G d de)          ZA G d deA          ZB G d deA          ZC G d deA          ZD G d d+eA          ZE G dÄ deA          ZF G dń deA          ZG G dǄ deA          ZH G dɄ deA          ZI G d˄ deA          ZJ G d̈́ deA          ZK G dτ deA          ZL G dф deA          ZM G dӄ deA          ZN G dՄ deA          ZO G dׄ deA          ZP G dل de          ZQ G dۄ deA          ZR G d݄ deA          ZS G d߄ deA          ZT G d deA          ZU G d deA          ZV G d deA          ZW G d deA          ZX G d deA          ZY G d deA          ZZ G d deA          Z[ G d deA          Z\ G d deA          Z] G d deA          Z^ G d deA          Z_ G d deA          Z` G d deA          Za G d deA          Zb G d deA          Zc G d d eA          Zd G d de)          Zei d eBd"eCd$eDd*eEd,eFd.eGd0eHd2eId4eJd6eKd8eLd:eMd<eNd>eOd@ePdeRdeSi deTdeUdeWdedd	eXd
eYdeZde[de\de]de^de_de`deadebdecZfd Zg G d de)          Zh G d de)          Zi G d de)          Zj G d de)          Zk G d de)          Zl G d  d!e)          Zm G d" d#e)          Zn G d$ d%e)          Zo G d& d'e)          Zp G d( d)e)          Zq G d* d+e)          Zr e'ee<d,-            e'ee<d,.            e&ee<d,d,/            e&e<e@d d 0            e&e<ehd"d 0            e&e<eid01            e&e<ejd21            e&e<ekd21            e&e<eld41            e&e<end61            e&e<eod31            e&e<epd:1            e&e<eqd4d 0            e&e<e:d5d 6            e&e<e;d]d 6            e'ee=d7-            e'ee=d7.            e&ee=d7d7/            e&e=emd8d 0            e&e=e?dd d8            e(e=ed1            e(e=e!d1            e(e=e$d1           dS (9  za
GPRS Tunneling Protocol (GTP)

Spec: 3GPP TS 29.060 and 3GPP TS 29.274
Some IEs: 3GPP TS 24.008
    N)chborbbytes_encode)conf)warning)BitEnumFieldBitFieldByteEnumField	ByteFieldConditionalFieldFieldLenFieldFieldListField
FlagsFieldIPFieldIntFieldPacketListField
ShortFieldStrFixedLenFieldStrLenFieldX3BytesField	XBitField
XByteField	XIntField)IPUDP)IPv6IP6Field)PPP)bind_layersbind_bottom_upbind_top_downPacketRaw)RandIntRandIPRandNum
RandStringUTRANGETRANWLANGANHSPA)               echo_requestecho_responsecreate_pdp_context_reqcreate_pdp_context_resupdate_pdp_context_requpdate_pdp_context_respdelete_pdp_context_reqdelete_pdp_context_reserror_indicationpdu_notification_req(supported_extension_headers_notification
end_markerg_pdu)r-   r.                                    r-   Causer.   IMSIr/   RAIr0   TLLIr1   P_TMSI   IE_ReorderingRequired   Recovery   SelectionModer?   TEIDIr@   TEICPrB   TeardownIndrC   NSAPIrE   ChargingChrtrF   TraceReference   	TraceType   
ChargingId   EndUserAddressAccessPointNameProtocolConfigurationOptions
GSNAddressMSInternationalNumberQoSCommonFlagsAPNRestrictionRatTypeUserLocationInformation
MSTimeZoneIMEIMSInfoChangeReportingActionBearerControlMode"EvolvedAllocationRetentionPriorityPrivateExtention)                                          rI   zRequest IMSIzRequest IMEIzRequest IMSI and IMEIzNo identity neededz
MS RefuseszMS is not GPRS RespondingzRequest accepted   z&New PDP type due to network preference   z.New PDP type due to single address bearer only   zNon-existent   zInvalid message format   zIMSI not known   zMS is GPRS Detached         zVersion not supported   zNo resources available   zService not supported   zMandatory IE incorrect   zMandatory IE missing   zOptional IE incorrect   zSystem failure   zRoaming restriction   zP-TMSI Signature mismatch   zGPRS connection suspended   zAuthentication failure   zUser authentication failed   zContext not found   z&All dynamic PDP addresses are occupied   zNo memory is available   zReallocation failure   z"Unknown mandatory extension header   z#Semantic error in the TFT operation   z Syntactic error in TFT operationz#Semantic errors in packet filter(s)z$Syntactic errors in packet filter(s)zMissing or unknown APNzUnknown PDP address or PDP typez)PDP context without TFT already activatedz#APN access denied : no subscriptionzGAPN Restriction type incompatibility with currently active PDP Contextsz!MS MBMS Capabilities InsufficientzInvalid Correlation : IDzMBMS Bearer Context SupersededzBearer Control Mode violationz(Collision with network initiated request)                                    	MS or APNMSNET	FutureUse)i i iƊ iǊ FalseTrue)rH   rI   zNo more extension headersReservedzUDP PortzPDU Session ContainerzPDCP PDU Number)r   r-   r.   @   rr   r   r   r   c                        e Zd Zd Zd Zd ZdS )TBCDByteFieldc                     |S N )selfpktvals      U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/gtp.pyi2hzTBCDByteField.i2h   s    
    c                    g }|D ]n}t          |          }|dz	  }|dz  }|dk    r&|                    t          ||dz                       G|t          ||dz            t          ||dz            gz  }od                    |          S )Nr0   rS   r-   r   )r   appendTBCD_TO_ASCIIjoin)r   r   r   retvbyteleftrights           r   m2izTBCDByteField.m2i   s     
	 
	Aq66D19D3JEs{{

=uqy9::::!%	/2!$tax-0  xx}}r   c           
      ~   t          |t                    st          |          }d}t          dt	          |          d          D ]w}|||dz            }t	          |          dk    r*|t          t          |d d d         d                    z  }L|t          t          d|d d         z   d                    z  }x|S )Nr   r   r.   r?      Fr-   )
isinstancebytesr   rangelenr   int)r   r   r   
ret_stringitmps         r   i2mzTBCDByteField.i2m   s    #u%% 	$s##C
q#c((A&& 	; 	;AaAg,C3xx1}}c#c$$B$i"4"4555

c#dS!Wnb"9"9:::

r   N)__name__
__module____qualname__r   r   r   r   r   r   r   r      sA            
 
 
 
 
r   r   s   0123456789*#abcc                   &    e Zd Zedd            ZdS )GTP_ExtensionHeaderNc                     |t           S | S r   )GTP_UDPPort_ExtensionHeader)cls_pktargskargss       r   dispatch_hookz!GTP_ExtensionHeader.dispatch_hook   s    <..
r   r   )r   r   r   classmethodr   r   r   r   r   r      s2           [  r   r   c                   V    e Zd Z edd           edd           edde          gZdS )r   lengthr-   udp_portNnext_exr   r   r   r   r   r   r
   ExtensionHeadersTypesfields_descr   r   r   r   r      F        9Xt,,:j$// =A/DEEIKKKr   r   c                   V    e Zd Z edd           edd           edde          gZdS )GTP_PDCP_PDU_ExtensionHeaderr   r-   pdcp_pduNr   r   r   r   r   r   r   r      r   r   r   c                      e Zd ZdZ eddd           eddd           eddd           eddd           ed	dd           ed
dd           edde           edd           edd           e	 e
ddd          d            e	 edd          d            e	 edde          d           gZd Zd Zd Zedd            ZdS )	GTPHeaderzGTP-C Headerversionr-   r/   PTreservedr   ESPNgtp_typeNr   teidseqr?   c                 D    | j         dk    p| j        dk    p
| j        dk    S Nr-   r   r   r   r   s    r   <lambda>zGTPHeader.<lambda>   "    #%1*"I
"Icfk r   npduc                 D    | j         dk    p| j        dk    p
| j        dk    S r   r   r   s    r   r   zGTPHeader.<lambda>   r   r   r   c                 D    | j         dk    p| j        dk    p
| j        dk    S r   r   r   s    r   r   zGTPHeader.<lambda>   r   r   c                     ||z  }| j         Z| j        dk    rt          |          dz
  nt          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S )Nr.   r0   rO   !H)r   r   r   structpackr   ppaytmp_lens       r   
post_buildzGTPHeader.post_build  sn    	S; %)LA$5$5c!ffqjj3q66A:G"1"D'222QqrrU:Ar   c                     t          j        d| j                  }| j        r|t          j        d| j                  z  }|| j                                        z   S )NBH)r   r   r   r   payloadhashret)r   hshs     r   r  zGTPHeader.hashret  sP    k#t|,,8 	.6;sDH---CT\))++++r   c                     t          |t                    oF| j        |j        k    o6| j         p| j        |j        k    o| j                            |j                  S r   )r   r   r   r   r  answersr   others     r   r
  zGTPHeader.answers  s[    5),, 4-4X6UY!64 $$U]33	5r   c                     |r?t          |          dk    r,t          |d                   dz	  dz  dk    rddlm} |j        S |rJt          |          dk    r7t          |dd                   }t
                              |t                    S | S )Nr-   r   r1      r.   )gtp_v2rO   )r   r    r  r   GTPforcedTypesget)r   r   r   r   r  	_gtp_types         r   r   zGTPHeader.dispatch_hook  s     	(CIINNDG!S(A--$$$$$$'' 	<CIINND1II!%%i;;;
r   r   )r   r   r   namer	   r
   GTPmessageTyper   r   r   r   r   r   r   r  r  r
  r   r   r   r   r   r   r      s       D8Iq!,,8D!Q''8J1--8CA&&8CA&&8D!Q'' =T>BB:h--8FA&&## y2..IIK K $# y++IIK K $#$}Y3HIIIIK KK(  , , ,5 5 5    [  r   r   c                       e Zd ZdZd ZdS )GTP_U_HeaderzGTP-U Headerc                 <   | j         dk    r-| j        dk    rt          S t                              | |          S | j        dk    r?t          |d                   }|dk    r|dk    rt          S |dz  dk    rt          S t          S t                              | |          S )	Nr-   rr   rI   r   E   N      `   )
r   r   GTPPDUSessionContainerr   guess_payload_classr   r   r   r   r   r   r  	sub_protos      r   r  z GTP_U_Header.guess_payload_class*  s     6Q;;|t##--00w???=CGAJID  Y$%6%6	d"t++
,,T7;;;r   N)r   r   r   r  r  r   r   r   r  r  #  s(        D
< < < < <r   r  )
r?   r@   rA   rB   rC   rD   rE   rF   rH   rI   c                   8   e Zd ZdZdddddZ edd           ed	d
dddd           edd
d           e edd
d          d            e edd
d          d            edd
d           e edd
d          d            e e	dd
d          d            e e	dd
d          d            e edd
d          d            e edd
d          d             ed!d
d"           e e	d#d
d$          d%            e e	d&d
d'          d(            e e	d)d
d*          d+            e e
d,d
          d-            e e	d.d
d*          d/            e e	d0d
d*          d1            e e	d2d
d*          d3            e e	d4d
d5          d6            e e	d7d
d5          d8            e e	d9d
d:          d;            e e	d<d
d5          d=            ed>d
e           e ed?d@dA B          dC           gZdD ZdE ZdF ZdS )Gr  zGTP PDU Session Container)QMP2.4.5)r   r#  )RQIr#  )paddingr#  )qmpPRextraPadding	ExtHdrLenNtyper   r0   zDL PDU SESSION INFORMATIONzUL PDU SESSION INFORMATION)r   r-   r"  r-   
dlDelayIndc                     | j         dk    S r   r+  r   s    r   r   zGTPPDUSessionContainer.<lambda>\      A r   
ulDelayIndc                     | j         dk    S r   r.  r   s    r   r   zGTPPDUSessionContainer.<lambda>^  r/  r   SNPN3N9DelayIndc                     | j         dk    S r   r.  r   s    r   r   zGTPPDUSessionContainer.<lambda>c  r/  r   spareUl1c                     | j         dk    S r   r.  r   s    r   r   zGTPPDUSessionContainer.<lambda>e  r/  r   spareDl1r.   c                     | j         dk    S Nr   r.  r   s    r   r   zGTPPDUSessionContainer.<lambda>h  r/  r   r   c                     | j         dk    S r9  r.  r   s    r   r   zGTPPDUSessionContainer.<lambda>j  r/  r   r$  c                     | j         dk    S r9  r.  r   s    r   r   zGTPPDUSessionContainer.<lambda>l  r/  r   QFI   PPIr/   c                 .    | j         dk    o
| j        dk    S Nr   r-   r+  r   r   s    r   r   zGTPPDUSessionContainer.<lambda>q      A 11$'GqL r   spareDl2r1   c                 .    | j         dk    o
| j        dk    S r@  rA  r   s    r   r   zGTPPDUSessionContainer.<lambda>t  rB  r   
dlSendTimer   c                 .    | j         dk    o
| j        dk    S r@  r+  r"  r   s    r   r   zGTPPDUSessionContainer.<lambda>w  rB  r   dlQFISeqNumc                 .    | j         dk    o
| j        dk    S r@  r+  r2  r   s    r   r   zGTPPDUSessionContainer.<lambda>z  rB  r   dlSendTimeRptc                 .    | j         dk    o
| j        dk    S r   rG  r   s    r   r   zGTPPDUSessionContainer.<lambda>~  rB  r   
dlRecvTimec                 .    | j         dk    o
| j        dk    S r   rG  r   s    r   r   zGTPPDUSessionContainer.<lambda>  rB  r   
ulSendTimec                 .    | j         dk    o
| j        dk    S r   rG  r   s    r   r   zGTPPDUSessionContainer.<lambda>  rB  r   dlDelayRslt    c                 .    | j         dk    o
| j        dk    S r   )r+  r,  r   s    r   r   zGTPPDUSessionContainer.<lambda>      A 18$'Na$7 r   ulDelayRsltc                 .    | j         dk    o
| j        dk    S r   )r+  r0  r   s    r   r   zGTPPDUSessionContainer.<lambda>  rT  r   UlQFISeqNum   c                 .    | j         dk    o
| j        dk    S r   rJ  r   s    r   r   zGTPPDUSessionContainer.<lambda>  rB  r   N3N9DelayRsltc                 .    | j         dk    o
| j        dk    S r   )r+  r3  r   s    r   r   zGTPPDUSessionContainer.<lambda>  s    A 1:$'$4$9 r   
NextExtHdrr%  r   c                     dS r9  r   r   s    r   r   zGTPPDUSessionContainer.<lambda>  s     r   length_fromc                     | j         dk    S r9  )r\  r   s    r   r   zGTPPDUSessionContainer.<lambda>  s    3>Q#6 r   c                     | j         dk    r?t          |d                   }|dk    r|dk    rt          S |dz  dk    rt          S t          S t
                              | |          S )Nr   r  r  r  r  )r\  r   r   r   r   r   r  r  s      r   r  z*GTPPDUSessionContainer.guess_payload_class  sh    ?aGAJID  Y$%6%6	d"t++
,,T7;;;r   c                     | j         dk    rCt          | j                  t          |          z
  }| dz  }|d |         | _        ||d          S |S )Nr   r0   )r\  r   originalr%  )r   sr   
pad_lengths       r   post_dissectz#GTPPDUSessionContainer.post_dissect  sV    ?a''#a&&0F"(aJ[j[>DLZ[[>!r   c                     | j         dk    r|dt          |           dz  z  z  }n|dt          ||z              dz  z  z  }| j        0t          j        dt          |          dz            |dd          z   }||z   S )Nr       r0   !Br-   )r\  r   r*  r   r   )r   r   r   s      r   r  z!GTPPDUSessionContainer.post_build  s    ?ac!ffWM**AA7AG}122C>!D#a&&A+..1226A3wr   )r   r   r   r  deprecated_fieldsr   r   r	   r   r   r   r
   r   r   r   r  rg  r  r   r   r   r  r  L  s       &D,	  9[$//<1$@$@!B !BC C 8E1a((##HH\1a$@$@$=$=? ?##HH\1a$@$@$=$=? ? 8E1a((##HH^Q$B$B$=$=? ?##IIj!Q$?$?$=$=? ? $#IIj!Q$?$?$=$=? ?##HHUAq$9$9$=$=? ?##HHUAq$9$9$=$=? ? 8E1a((##IIeQ$:$:%1 %12 2 $#IIj!Q$?$?%1 %12 2 $#IIlAr$B$B%1 %12 2 $#LL$B$B%1 %12 2 $#IIoq"$E$E%1 %12 2 $#IIlAr$B$B%1 %12 2 $#IIlAr$B$B%1 %12 2 $#IImQ$C$C%8 %89 9 $#IImQ$C$C%8 %89 9 $#IImQ$C$C%1 %12 2 $#IIoq"$E$E%: %:; ; !=q2GHH##"{9c{{KKK668 8A9KF	< 	< 	<      r   r  c                       e Zd ZdZdS )GTPEchoRequestzGTP Echo RequestN)r   r   r   r  r   r   r   rm  rm    s        DDDr   rm  c                       e Zd Zd Zd ZdS )IE_Basec                 
    d|fS Nr  r   r   r   s     r   extract_paddingzIE_Base.extract_padding      3wr   c                 6   | j         d         j        dk    r| j        xt          |          }t	          | j        t          j                  r|t          | j        j                  z  }|d d         t          j
        d|dz
            z   |dd          z   }||z   S )Nr-   r   r   r0   r/   )r   r  r   r   r   r  r   padding_layerloadr   r   r   s       r   r  zIE_Base.post_build  s    A#x//{"a&&dlD,>?? 6s4<#4555GbqbEFKgk:::QqrrUB3wr   N)r   r   r   rs  r  r   r   r   ro  ro    s2              r   ro  c                   F    e Zd ZdZ edde           edde          gZdS )IE_CauserJ   ietyper-   
CauseValueN)r   r   r   r  r
   IETypeCauseValuesr   r   r   r   ry  ry    s=        D =1f55 =t[AACKKKr   ry  c            
       l    e Zd ZdZ edde           ed e edd                    d          gZ	dS )	IE_IMSIz$IMSI - Subscriber identity of the MSrz  r.   imsir   l   I5 rO   N)
r   r   r   r  r
   r|  r   strr&   r   r   r   r   r  r    sS        1D =1f55 =WWQ-H-H)I)I1MMOKKKr   r  c                       e Zd ZdZ edde           eddd           eddd           ed	d
           edd
          gZ	d
S )
IE_RoutingzRouting Area Identityrz  r/   MCCr  r.   MNCr-   LACNRAC)
r   r   r   r  r
   r|  r   r   r   r   r   r   r   r  r    sm        "D =1f55 =A.. !=A..:eT**9UD))+KKKr   r  c                   F    e Zd ZdZ edde           edde          gZdS )rP   rR   rz  rO   reordering_requiredrH   Nr   r   r   r  r
   r|  TrueFalse_valuer   r   r   r   rP   rP     s>        D =1f55 =!6_MMOKKKr   c                   D    e Zd ZdZ edde           edd          gZdS )IE_RecoveryrR   rz  rQ   restart_counterrX  N)r   r   r   r  r
   r|  r   r   r   r   r   r  r    s;        D =2v669.335KKKr   r  c                   H    e Zd ZdZ edde           eddde          gZdS )IE_SelectionModezSelection Moderz  rS   rT   r   rO   N)	r   r   r   r  r
   r|  r   Selection_Moder   r   r   r   r  r    sC        D =2v66< !>3 34KKKr   r  c                   T    e Zd ZdZ edde           ed e                      gZdS )IE_TEIDIzTunnel Endpoint Identifier Datarz  r?   rU   N	r   r   r   r  r
   r|  r   r$   r   r   r   r   r  r    s@        ,D =2v669Wggii002KKKr   r  c                   T    e Zd ZdZ edde           ed e                      gZdS )IE_TEICPz(Tunnel Endpoint Identifier Control Planerz  r@   TEICINr  r   r   r   r  r    s@        5D =2v669Wggii002KKKr   r  c                   F    e Zd ZdZ edde           edde          gZdS )IE_TeardownzTeardown Indicatorrz  rB   	indicatorr   Nr  r   r   r   r  r    s=        D =2v66 =foFFHKKKr   r  c            	       r    e Zd ZdZ edde           eddd           ed edd          d          gZdS )	IE_NSAPIrX   rz  rC   	sparebitsr   r0   rS   N)	r   r   r   r  r
   r|  r   r&   r   r   r   r   r  r    sW        D =2v669[&!449Wgganna88:KKKr   r  c                       e Zd ZdZ edde           eddd           eddd           ed	dd           ed
dd           eddd           eddd          gZdS )IE_ChargingCharacteristicszCharging Characteristicsrz  rE   
Ch_ChSpareNr0   normal_chargingr-   prepaid_chargingflat_rate_charginghot_billing_chargingCh_ChReservedr   rO   r   r   r   r  r
   r|  r   r   r   r   r   r  r    s        %D =2v66 9\4339.a889/q99914;;93T1==9_a335KKKr   r  c                   F    e Zd ZdZ edde           eddd          gZdS )IE_TraceReferencezTrace Referencerz  rF   Trace_referenceNr?   r  r   r   r   r  r  "  s=        D =2v669.b99;KKKr   r  c                   F    e Zd ZdZ edde           eddd          gZdS )IE_TraceTypez
Trace Typerz  r[   
Trace_typeNr?   r  r   r   r   r  r  )  s<        D =2v669\4446KKKr   r  c                   T    e Zd ZdZ edde           ed e                      gZdS )IE_ChargingIdzCharging IDrz  r]   Charging_idNr  r   r   r   r  r  0  s@        D =3779]GGII668KKKr   r  c                       e Zd ZdZ edde           edd           eddd           ed	d
d           edd           e	 e
d e                      d            e	 edd          d           gZdS )IE_EndUserAddresszEnd User Addressrz  r_   r   r.   SPARErS   r0   PDPTypeOrganizationr-   PDPTypeNumberN
PDPAddressc                 .    | j         dk    p
| j         dk    S )Nr=     r   r   s    r   r   zIE_EndUserAddress.<lambda>G  s    
a0S3:QSCS r   IPv6_PDPAddress::1c                 .    | j         dk    p
| j         dk    S )NrA   r  r  r   s    r   r   zIE_EndUserAddress.<lambda>I  s    
b0@0TCJRTDT r   )r   r   r   r  r
   r|  r   r	   r   r   r   r%   r   r   r   r   r   r  r  6  s        D =377 :h**8GR++811a88:ot44##GGL&&(($C$C$S$SU U##HH->$F$F$T$TV VWKKKr   r  c                       e Zd Zd Zd ZdS )APNStrLenFieldc                    d}|}|ryt          |d                   dz   }|t          |          k    r!t          d|t          |          fz             ||d|         z  }||d          }t          |          r|dz  }|y|}|S )Nr   r   r-   zDAPN prematured end of character-string (size=%i, remaining bytes=%i)   .)r   r   r   )r   r   re  ret_stmp_sr  s         r   r   zAPNStrLenField.m2iN  s     	%(mma'GU##^biknotkukuavvwwwU1W9%%E'((OE5zz   	 r   c                     t          |t                    st          |          }d                    d |                    d          D                       }|S )Nr   c              3   T   K   | ]#}t          t          |                    |z   V  $d S r   )r   r   ).0xs     r   	<genexpr>z%APNStrLenField.i2m.<locals>.<genexpr>_  s2      <<SQ[[1_<<<<<<r   r  )r   r   r   r   split)r   r   re  s      r   r   zAPNStrLenField.i2m\  sN    !U## 	 QAHH<<aggdmm<<<<<r   N)r   r   r   r   r   r   r   r   r  r  L  s2              r   r  c                   f    e Zd ZdZ edde           edd           eddd 	          gZd
 Z	dS )IE_AccessPointNamezAccess Point Namerz  rp   r   NAPNnternetc                     | j         S r   r  r  s    r   r   zIE_AccessPointName.<lambda>h  s    !( r   r_  c                     | j         =t          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S Nr/   r.   rj  r   r   r   r   r   s       r   r  zIE_AccessPointName.post_buildj  I    ;!ffqjG"1"D'222QqrrU:Ar   )
r   r   r   r  r
   r|  r   r  r   r  r   r   r   r  r  c  sh        D =377:h--!>%@R@RSSSUK    r   r  c                   `    e Zd ZdZ edde           edd           eddd 	          gZd
S )IE_ProtocolConfigurationOptionszProtocol Configuration Optionsrz  rq   r   r0   Protocol_Configurationr  c                     | j         S r   r  r  s    r   r   z(IE_ProtocolConfigurationOptions.<lambda>v      QX r   r_  N)	r   r   r   r  r
   r|  r   r   r   r   r   r   r  r  q  sZ        +D =377:h**;7+=+=? ? ?@KKKr   r  c            	           e Zd ZdZ edde           edd           e ed e	                      d            e e
dd	          d
           gZd ZdS )IE_GSNAddresszGSN Addressrz  rr   r   Nipv4_addressc                     | j         dk    S Nr0   r  r   s    r   r   zIE_GSNAddress.<lambda>~  s    
a r   ipv6_addressr  c                     | j         dk    S Nr?   r  r   s    r   r   zIE_GSNAddress.<lambda>  s    
b0@ r   c                     | j         =t          |          dz
  }|d d         t          j        d|          z   |dd          z   }|S r  r  r   s       r   r  zIE_GSNAddress.post_build  r  r   )r   r   r   r  r
   r|  r   r   r   r%   r   r   r  r   r   r   r  r  y  s        D =377:h--##GGNFFHH$E$E$?$?A A##HH^U$C$C$@$@B B	CK    r   r  c            	       ~    e Zd ZdZ edde           edd           edddg d	           ed
dd           gZ	dS )IE_MSInternationalNumberzMS International Numberrz  rs   r   Nflags   rO   )	Extensionr  r  zInternational Numberr  r  r  zISDN numberingdigits33607080910c                     | j         dz
  S r   r  r  s    r   r   z!IE_MSInternationalNumber.<lambda>  s    PQPX[\P\ r   r_  )
r   r   r   r  r
   r|  r   r   r   r   r   r   r   r  r    sm        $D =377:h--:gtQ0{0{0{|| ==F\F\]]]_KKKr   r  c                      e Zd ZdZ edd           edd           eddd           eddd	           ed
dd	           eddd           eddd           eddd	           eddd	           eddd           eddd	           eddd           eddd	           edd           edd           edd           eddd           eddd           eddd           eddd	           edd           edd          gZdS )QoS_ProfilezQoS profileqos_eir   r   Nspare1r.   delay_classr/   reliability_classpeak_troughputr0   spare2r-   precedence_classspare3mean_troughputr1   traffic_classdelivery_orderdelivery_of_err_sdumax_sdu_sizemax_bitrate_upmax_bitrate_downredidual_bersdu_err_ratiotransfer_delaytraffic_handling_prioguaranteed_bit_rate_upguaranteed_bit_rate_down)r   r   r   r  r   r   r	   r   r   r   r   r  r    s       D9Xq))9Xt,,9XtQ//9]E15590%;;9-vq998Ha++9/::9Xua009-w::9_eQ779-tQ7792E1==9^T229-t449/669^VQ779_fa889-w::94eQ??95t<<97>>+@KKKr   r  c                      e Zd ZdZg  edde           edd           edd           e e	dd	d
          d            e e	dd	d          d            e e	dd	d          d            e e	dd	d          d            e e
dd	d          d            e e	dd	d          d            e e	dd	d          d            e e	dd	d          d            e e	dd	d          d            e e	dd	d
          d             e e	d!d	d          d"            e ed#d          d$            e ed%d          d&            e ed'd          d(            e e	d)d	d          d*            e e	d+d	d          d,            e e	d-d	d.          d/            e e	d0d	d
          d1            e ed2d          d3            e ed4d          d5            e e	d6d	d          d7            e e
d8d	d          d9            e e	d:d	d          d;            e ed<d          d=            e ed>d          d?            e ed@d          dA            e edBd          dC            e edDd          dE            e edFd          dG            e edHd          dI            e edJd          dK           ZdS )LIE_QoSre   rz  rt   r   Nallocation_retention_prioiryr-   r  r   r.   c                 &    | j         o
| j         dk    S r   r  r^  s    r   r   zIE_QoS.<lambda>      ah.G18a< r   r  r/   c                 &    | j         o
| j         dk    S r   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  r0   c                 &    | j         o
| j         dk    S Nr.   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S Nr/   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  r1   c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S )Nr1   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S )Nr=  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S )Nr  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S NrO   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  r=  c                 &    | j         o
| j         dk    S N	   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   r  c                 &    | j         o
| j         dk    S )N
   r  r^  s    r   r   zIE_QoS.<lambda>      ah.H18b= r   r  c                 &    | j         o
| j         dk    S )N   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   spare4c                 &    | j         o
| j         dk    S N   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   signaling_indicationc                 &    | j         o
| j         dk    S r!  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   source_stats_descc                 &    | j         o
| j         dk    S r!  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   max_bitrate_down_extc                 &    | j         o
| j         dk    S )N   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   guaranteed_bitrate_down_extc                 &    | j         o
| j         dk    S )NrQ   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   max_bitrate_up_extc                 &    | j         o
| j         dk    S )NrS   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   guaranteed_bitrate_up_extc                 &    | j         o
| j         dk    S r  r  r^  s    r   r   zIE_QoS.<lambda>  r  r   max_bitrate_down_ext2c                 &    | j         o
| j         dk    S )Nr@   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   guaranteed_bitrate_down_ext2c                 &    | j         o
| j         dk    S )NrA   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   max_bitrate_up_ext2c                 &    | j         o
| j         dk    S )NrB   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   guaranteed_bitrate_up_ext2c                 &    | j         o
| j         dk    S )NrC   r  r^  s    r   r   zIE_QoS.<lambda>  r  r   )r   r   r   r  r
   r|  r   r   r   r   r	   r   r   r   r   r   r     s       DPK==377 PK:h--PK9;Q??PK $#IIha$@$@$G$GI I	PK $#IImUA$F$F$G$GI IPK $#II.A5!$L$L$G$GI IPK $#II.>$J$J$G$GI IPK $#HHXq!$<$<$G$GI IPK $#II.@%$K$K$G$GI IPK$ $#IIhq$A$A$G$GI I%PK( $#II.>$K$K$G$GI I)PK. $#IIoua$H$H$G$GI I/PK2 $#II.>a$H$H$G$GI I3PK6 $#II.CUA$N$N$G$GI I7PK< $#IInd$C$C$G$GI I=PK@ $#II.>$E$E$G$GI IAPKD $#II.@$$G$G$G$GI IEPKJ $#IInfa$H$H$G$GI IKPKN $#IIovq$I$I$G$GI IOPKR $#II.>$K$K$G$GI ISPKV $#II.E.3./%1 %1 %H$GI IWPK` $#II.F$M$M$H$HJ JaPKd $#II.H.2%4 %4$H$HJ JePKl $#IIhq$A$A$H$HJ JmPKp $#HH-CQ$J$J$H$HJ JqPKt $#II.A61$M$M$H$HJ JuPKz $#II.Dd$K$K$H$HJ J{PK~ $#II.K.2%4 %4$H$HJ JPKD $#II.BD$I$I$H$HJ JEPKH $#II.I.2%4 %4$H$HJ JIPKN $#II.Et$L$L$H$HJ JOPKR $#II.L.2%4 %4$H$HJ JSPKX $#II.CT$J$J$H$HJ JYPK\ $#II.J.2%4 %4$H$HJ J]PKKKKr   r   c                      e Zd ZdZ edde           edd           eddd           ed	dd           ed
dd           eddd           eddd           eddd           eddd           eddd          g
ZdS )IE_CommonFlagszCommon Flagsrz  ru   r   Ndual_addr_bearer_flr   r-   upgrade_qos_supportednrsnno_qos_negombms_cnting_inforan_procedure_readymbms_service_typeprohibit_payload_compression	r   r   r   r  r
   r|  r   r	   r   r   r   r   r9  r9    s        D =377:h--811a8883Q::8FAq))8M1a008.155811a888/A668:AqAA	CKKKr   r9  c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	IE_APNRestrictionzAPN Restrictionrz  rv   r   r-   restriction_type_valuer   N	r   r   r   r  r
   r|  r   r   r   r   r   r   rD  rD    sJ        D =377:h**95q99;KKKr   rD  c                   \    e Zd ZdZ edde           edd           edde          gZdS )
IE_RATTypezRat Typerz  rw   r   r-   RAT_TypeN)	r   r   r   r  r
   r|  r   RATTyper   r   r   r   rH  rH    sK        D =377:h** =T7;;=KKKr   rH  c            
           e Zd ZdZ edde           edd           edd           edd	d
           edd	d           edd           edd          gZ	dS )IE_UserLocationInformationzUser Location Informationrz  rx   r   Nr+  r-   r  r  r.   r  r  SAC)
r   r   r   r  r
   r|  r   r   r   r   r   r   r   rL  rL    s        &D =377:h--9VQ'' =A.. =A..:eT**:eT**,KKKr   rL  c            	           e Zd ZdZ edde           edd           edd           eddd	           e	d
dd          gZ
dS )IE_MSTimeZonezMS Time Zonerz  ry   r   Ntimezoner   sparer=  daylight_saving_timer.   )r   r   r   r  r
   r|  r   r   r	   r   r   r   r   r   rO  rO  *  sl        D =377:h--9Z++8GQ**93T1==	?KKKr   rO  c                   `    e Zd ZdZ edde           edd           eddd           gZdS )	IE_IMEIrk   rz  rz   r   Nr  c                     | j         S r   r  r  s    r   r   zIE_IMEI.<lambda>7  s    18 r   r_  )	r   r   r   r  r
   r|  r   r   r   r   r   r   rT  rT  3  sS        D =377:h-- =9K9KLLLNKKKr   rT  c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	IE_MSInfoChangeReportingActionzMS Info Change Reporting Actionrz  r{   r   r-   Actionr   NrF  r   r   r   rW  rW  :  sI        ,D =377:h**9Xq))+KKKr   rW  c            
           e Zd ZdZ edde           edd           eddd           ed	dd           ed
dd           eddd          gZdS )IE_DirectTunnelFlagszDirect Tunnel Flagsrz     r   r-   rQ  r   r1   EIGCSIDTINrB  r   r   r   rZ  rZ  A  s~         D =377:h**8GQ**8D!Q''8FAq))8E1a((*KKKr   rZ  c                   Z    e Zd ZdZ edde           edd           edd          gZdS )	IE_BearerControlModezBearer Control Moderz  r|   r   r-   bearer_control_moder   NrF  r   r   r   r`  r`  L  sJ         D =377:h**92A668KKKr   r`  c                       e Zd ZdZ edde           edd           eddd           eddd           ed	dd
           eddd           eddd          gZ	dS )%IE_EvolvedAllocationRetentionPriorityz%Evolved Allocation/Retention Priorityrz  r}   r   r-   r  r   PCIPLr0   r  PVIN)
r   r   r   r  r
   r|  r   r	   r   r   r   r   r   rc  rc  S  s        2D =377:h**8Ha++8E1a((9T61--8Ha++8E1a((*KKKr   rc  c            	           e Zd ZdZ edde           edd           e edd          d            e e	d	d
          d           gZ
dS )IE_CharginGatewayAddresszCharging Gateway Addressrz     r   r0   r  	127.0.0.1c                     | j         dk    S r  r  r   s    r   r   z!IE_CharginGatewayAddress.<lambda>d  s    ),q r   r  r  c                     | j         dk    S r  r  r   s    r   r   z!IE_CharginGatewayAddress.<lambda>f  s    ),r)9 r   N)r   r   r   r  r
   r|  r   r   r   r   r   r   r   r   rh  rh  _  s        %D =377:h**##GGNK$H$H%9 %9: : $#HH^U$C$C F: F: ; ;<KKKr   rh  c                   v    e Zd ZdZ edde           edd           edd           edd	d
           gZ	dS )IE_PrivateExtensionzPrivate Extensionrz  rI   r   r-   extension_identifierr   extention_valuer  c                     | j         S r   r  r  s    r   r   zIE_PrivateExtension.<lambda>p  r  r   r_  N)
r   r   r   r  r
   r|  r   r   r   r   r   r   r   rn  rn  j  sj        D =377:h**93Q77;0"+=+=? ? ?@KKKr   rn  c            
       x    e Zd ZdZ edde           eddd           eddd	g ed
d                    gZ	dS )IE_ExtensionHeaderListzExtension Header Listrz     r   Nextension_headers)	length_ofr   r   r  r   )
r   r   r   r  r
   r|  r   r   r   r   r   r   r   rs  rs  s  sd        "D =377 =4;NOOO!>"5Cy))BPQBRBRSSUKKKr   rs  c                   f    e Zd ZdZ edde           edd           eddd 	          gZd
 Z	dS )IE_NotImplementedTLVzIE not implementedrz  r   r   Ndatar  c                     | j         S r   r  r  s    r   r   zIE_NotImplementedTLV.<lambda>~  s     r   r_  c                 
    d|fS rq  r   rr  s     r   rs  z$IE_NotImplementedTLV.extract_padding  rt  r   )
r   r   r   r  r
   r|  r   r   r   rs  r   r   r   rx  rx  z  sh        D =1f55:h--;vr7I7IJJJLK    r   rx  rp   rq   rr   rs   rt   rt  ru   rv   rw   rx   ry   rz   r{   r[  r|   r}   ri  rI   c                     t          |           dk     rt          |           S t          | d                   }t                              |t                    }|t          k    r|dz  dk    rt
          } ||           S )z-Choose the correct Information Element class.r-   r   r_   )r   r#   r   	ietypeclsr  rx  )re  rz  r   s      r   IE_Dispatcherr~    si    
1vvzz1vv1YYF
--
$
$C czzfslc))"3q66Mr   c                   4    e Zd ZdZ edg e          gZd ZdS )GTPEchoResponsezGTP Echo ResponseIE_listc                 ,    t          |t                    S r   )r   rm  r  s     r   r
  zGTPEchoResponse.answers  s    %000r   Nr   r   r   r  r   r~  r   r
  r   r   r   r  r    s>        D"?9b-@@AK1 1 1 1 1r   r  c                       e Zd ZdZ ed e             e             ed e                       ed e                       e	dd e
d                    ge          gZdS )	GTPCreatePDPContextRequestzGTP Create PDP Context Requestr  r0   )r   r  rt   rS   )rz  r   ry  N)r   r   r   r  r   r  r  r  r%   rx  r'   r~  r   r   r   r   r  r    s        +D"?9xxzz88::}}\]lrlrltltGuGuGu/<}ATZTZT\T\/]/]/]/C/C3WY`j`jkm`n`n/o/o/o/q $12 2 3KKKr   r  c                   4    e Zd ZdZ edg e          gZd ZdS )GTPCreatePDPContextResponsezGTP Create PDP Context Responser  c                 ,    t          |t                    S r   )r   r  r  s     r   r
  z#GTPCreatePDPContextResponse.answers      %!;<<<r   Nr  r   r   r   r  r    >        ,D"?9b-@@AK= = = = =r   r  c                      e Zd ZdZ ed e             e             e             e             e	             e
             e             e             e             e             e             e             e             e             e             e             e             e             e            ge          gZdS )GTPUpdatePDPContextRequestzGTP Update PDP Context Requestr  N)r   r   r   r  r   ry  r  r  r  r  r  r  r   rh  r9  rD  r`  rW  rc  rn  r~  r   r   r   r   r  r    s        +D"?9





''))  ""  ""&&((--//'/( 	)  KKKr   r  c                   4    e Zd ZdZ edde          gZd ZdS )GTPUpdatePDPContextResponsezGTP Update PDP Context Responser  Nc                 ,    t          |t                    S r   )r   r  r  s     r   r
  z#GTPUpdatePDPContextResponse.answers  r  r   r  r   r   r   r  r    s>        ,D"?9dMBBCK= = = = =r   r  c                   .    e Zd ZdZ edg e          gZdS )GTPErrorIndicationzGTP Error Indicationr  Nr   r   r   r  r   r~  r   r   r   r   r  r    s)        !D"?9b-@@AKKKr   r  c                   .    e Zd ZdZ edg e          gZdS )GTPDeletePDPContextRequestzGTP Delete PDP Context Requestr  Nr  r   r   r   r  r    s)        +D"?9b-@@AKKKr   r  c                   4    e Zd ZdZ edg e          gZd ZdS )GTPDeletePDPContextResponsezGTP Delete PDP Context Responser  c                 ,    t          |t                    S r   )r   r  r  s     r   r
  z#GTPDeletePDPContextResponse.answers  r  r   Nr  r   r   r   r  r    r  r   r  c            
           e Zd ZdZ ed e             e e                       ed           e	             e
d          ge          gZdS )	GTPPDUNotificationRequestzGTP PDU Notification Requestr  )r  !   )r  rj  )r  N)r   r   r   r  r   r  r  r$   r  r  r  r~  r   r   r   r   r  r    s        )D"?9wwyy/7xggii/H/H/H/@/@t/T/T/T/A/A/C/C/<}+/V/V/V	/1
 3@A A BKKKr   r  c                   @    e Zd ZdZ ed e            ge          gZdS )(GTPSupportedExtensionHeadersNotificationz,GTP Supported Extension Headers Notificationr  N)r   r   r   r  r   rs  r~  r   r   r   r   r  r    sB        9D"?9/E/E/G/G /12?A A BKKKr   r  c                   F    e Zd ZdZ edde           eddd          gZdS )GTPmorethan1500zGTP More than 1500ry  rJ   IEr-   i.  N)r   r   r   r  r
   r|  r	   r   r   r   r   r  r    s<        D =Wf==8D!U++/KKKr   r  iK  )dport)sport)r  r  )r   r   )r   rA   rD   rG   r   )r   r   ih  )r   r   r   )s__doc__r   scapy.compatr   r   r   scapy.configr   scapy.errorr   scapy.fieldsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.inetr   r   scapy.layers.inet6r   r   scapy.layers.pppr   scapy.packetr   r    r!   r"   r#   scapy.volatiler$   r%   r&   r'   rJ  r  r|  r}  r  r  r   r   r   r   r   r   r   r  r  r  rm  ro  ry  r  r  rP   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r9  rD  rH  rL  rO  rT  rW  rZ  r`  rc  rh  rn  rs  rx  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s     / / / / / / / / / /                                                   ( & % % % % % % % - - - - - - - -                          ? ? ? ? ? ? ? ? ? ? ? ?   $$.../..(,@#   
#!W 
#
#
# 
# 	
#
 '
# j
# o
# g
# g
# m
# g
# n
# 
# k
# |
#  !
#" !-&(,"3!?
# 
# 
#B-@q. -@.-@)-@ &-@ ,	-@
 --@ &-@ <-@ D-@ N-@ ,-@ $-@ )-@ /-@ L-@ +-@  ,!-@ -@" +#-@$ ,%-@& *'-@( +)-@* $+-@, )--@. //-@0 /1-@2 ,3-@4 05-@6 '7-@8 <9-@: ,;-@< *=-@> 8?-@@ 9A-@B 6C-@ -@D ::,5?9]7.43>[-@ -@ -@^ ( !') )
     
 #	 				 	     $   B #    &   I I I I I"5 I I II I I I I#6 I I I6 6 6 6 6 6 6 6r< < < < <9 < < <8 			 h h h h hV h h hV    V   
    f   C C C C Cw C C CO O O O Og O O O+ + + + + + + +O O O O OG O O O5 5 5 5 5' 5 5 54 4 4 4 4w 4 4 42 2 2 2 2w 2 2 22 2 2 2 2w 2 2 2H H H H H' H H H: : : : :w : : :5 5 5 5 5 5 5 5&; ; ; ; ; ; ; ;6 6 6 6 67 6 6 68 8 8 8 8G 8 8 8W W W W W W W W,    [   .       @ @ @ @ @g @ @ @    G    _ _ _ _ _w _ _ _@ @ @ @ @' @ @ @6RK RK RK RK RKW RK RK RKjC C C C CW C C C; ; ; ; ; ; ; ;= = = = = = = =
, 
, 
, 
, 
, 
, 
, 
,? ? ? ? ?G ? ? ?N N N N Ng N N N+ + + + +W + + +* * * * *7 * * *8 8 8 8 87 8 8 8	* 	* 	* 	* 	*G 	* 	* 	*< < < < <w < < <@ @ @ @ @' @ @ @U U U U UW U U U    6    'Q  ' '
 ' % ' 	 '
 ! '  '  '  '  ' + ' " '  ' - ' # ' $ '  1! '  '" -# '$ *% '& &' '( () '* .+ ', #- '. */ '0 ,1 '2 -3 '4 '5 '6 07 '8 &9 ': &; '< 7= '> *? '@ %A '  '	F  1 1 1 1 1f 1 1 13 3 3 3 3 3 3 3= = = = =& = = =       4= = = = =& = = =B B B B B B B BB B B B B B B B= = = = =& = = =B B B B B B B BB B B B Bv B B B/ / / / /f / / / sIT * * * * sIT * * * * C$d 3 3 3 3 I~Q 7 7 7 7 Ia 8 8 8 8 I1B ? ? ? ? I2R @ @ @ @ I1B ? ? ? ? I2R @ @ @ @ I1B ? ? ? ? I2R @ @ @ @ I02 > > > > I?"PQ R R R R I2B! D D D D I3SA F F F F sL - - - - sL - - - - CT 6 6 6 6 L,rQ ? ? ? ? L0At- - - - lB - - - - lD3 / / / / lC# . . . . . .r   