o
    àý°jnµ ã                   @   sø  d dl Z d dlmZ d dlmZmZ d dlmZ i dd“dd“d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$“d%d&“i d'd(“d)d*“d+d,“d-d.“d/d0“d1d2“d3d4“d5d6“d7d8“d9d:“d;d<“d=d>“d?d@“dAdB“dCdD“dEdF“dGdH“¥i dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdV“dWdX“dYdZ“d[d\“d]d^“d_d`“dadb“dcdd“dedf“dgdh“didj“¥dkdldmdndodpdqdrdsdtdudvdwdxdydzœ¥ZG d{d|„ d|ƒZ	G d}d~„ d~ƒZ
G dd€„ d€eƒZG d�d‚„ d‚eƒZG dƒd„„ d„eƒZG d…d†„ d†eƒZG d‡dˆ„ dˆeƒZG d‰dŠ„ dŠeƒZG d‹dŒ„ dŒeƒZG d�dŽ„ dŽeƒZG d�d�„ d�eƒZG d‘d’„ d’eƒZG d“d”„ d”eƒZG d•d–„ d–ƒZG d—d˜„ d˜eƒZG d™dš„ dšeƒZG d›dœ„ dœeƒZG d�dž„ džeƒZG dŸd „ d eƒZG d¡d¢„ d¢eƒZG d£d¤„ d¤eƒZG d¥d¦„ d¦eƒZG d§d¨„ d¨eƒZG d©dª„ dªeƒZ G d«d¬„ d¬ƒZ!G d­d®„ d®eƒZ"G d¯d°„ d°e"ƒZ#G d±d²„ d²e"ƒZ$G d³d´„ d´e#ƒZ%G dµd¶„ d¶ƒZ&G d·d¸„ d¸eƒZ'G d¹dº„ dºƒZ(G d»d¼„ d¼ƒZ)G d½d¾„ d¾e"ƒZ*G d¿dÀ„ dÀe'ƒZ+G dÁdÂ„ dÂe"ƒZ,G dÃdÄ„ dÄe"ƒZ-G dÅdÆ„ dÆe"ƒZ.G dÇdÈ„ dÈe-ƒZ/dS )Éé    N)Úcrc32)ÚProtocolPacketÚarray_tobytes)ÚRC4il	  é   iq	  é   iv	  é   i{	  é   i€	  é   i…	  é   iŠ	  é   i�	  é   i”	  é	   i™	  é
   iž	  é   i£	  é   i¨	  é   i´	  é   i2  é"   i<  é$   iF  é&   iP  é(   iZ  é*   id  é,   in  é.   ix  é0   iŒ  é4   i   é8   i´  é<   iÈ  é@   i|  éd   i†  éf   i�  éh   iš  éj   i¤  él   i®  én   i¸  ép   iÂ  ér   iÌ  ét   iÖ  év   ià  éx   iê  éz   iô  é|   iþ  é~   i  é€   i  é‚   i  é„   i&  é†   i0  éˆ   i:  éŠ   iD  éŒ   iq  é•   i…  é™   i™  é�   i­  é¡   é¥   éª   é¬   é­   é®   é¯   é°   é±   é²   é³   é´   éµ   é¶   é·   é¸   )iÁ  iß  iä  ié  iî  ió  iø  iý  i  i  i  i  i  i  i   c                   @   s¬   e Zd ZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZ	eddƒZ
ed	dƒZed
dƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZdS )ÚDot11ManagementCapabilitiesÚ1000000000000000r   Ú0100000000000000Ú0010000000000000Ú0001000000000000Ú0000100000000000Ú0000010000000000Ú0000001000000000Ú0000000100000000Ú0000000010000000Ú0000000001000000Ú0000000000100000Ú0000000000010000Ú0000000000001000Ú0000000000000100Ú0000000000000010Ú0000000000000001N)Ú__name__Ú
__module__Ú__qualname__ÚintÚCAPABILITY_RESERVED_1ÚCAPABILITY_RESERVED_2ÚCAPABILITY_DSSS_OFDMÚCAPABILITY_RESERVED_3ÚCAPABILITY_RESERVED_4ÚCAPABILITY_SHORT_SLOT_TIMEÚCAPABILITY_RESERVED_5ÚCAPABILITY_RESERVED_6ÚCAPABILITY_CH_AGILITYÚCAPABILITY_PBCCÚCAPABILITY_SHORT_PREAMBLEÚCAPABILITY_PRIVACYÚCAPABILITY_CF_POLL_REQÚCAPABILITY_CF_POLLABLEÚCAPABILITY_IBSSÚCAPABILITY_ESS© rm   rm   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dot11.pyrH   #   s"    
"













rH   c                   @   sœ  e Zd ZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZ	eddƒZ
ed	dƒZed
dƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZeed> B Zeed> B Zeed> B Zeed> B Zee	d> B Zee
d> B Zeed> B Zeed> B Zeed> B Zeed> B Zeed> B Zeed> B Z eed> B Z!eed> B Z"eed> B Z#eed> B Z$eddƒZ%eddƒZ&eddƒZ'eddƒZ(eddƒZ)eddƒZ*eddƒZ+ed	dƒZ,ed
dƒZ-eddƒZ.eddƒZ/eddƒZ0eddƒZ1eddƒZ2eddƒZ3eddƒZ4eddƒZ5e%e&d> B Z6e%e'd> B Z7e%e(d> B Z8e%e)d> B Z9e%e*d> B Z:e%e+d> B Z;e%e,d> B Z<e%e.d> B Z=e%e/d> B Z>e%e0d> B Z?e%e1d> B Z@e%e2d> B ZAe%e3d> B ZBe%e4d> B ZCe%e5d> B ZDeddƒZEeddƒZFeddƒZGeddƒZHeddƒZIeddƒZJeddƒZKed	dƒZLed
dƒZMeddƒZNeddƒZOeddƒZPeddƒZQeddƒZReddƒZSeddƒZTeddƒZUeEeFd> B ZVeEeGd> B ZWeEeHd> B ZXeEeId> B ZYeEeJd> B ZZeEeLd> B Z[eEeMd> B Z\eEeNd> B Z]eEeOd> B Z^eEePd> B Z_eEeQd> B Z`eEeRd> B ZaeEeSd> B ZbeEeTd> B ZceEeUd> B ZdeddƒZeeddƒZfeddƒZgeddƒZheddƒZieddƒZjeddƒZked	dƒZled
dƒZmeddƒZneddƒZoeddƒZpeddƒZqeddƒZreddƒZseddƒZteddƒZueeefd> B Zveeegd> B Zweeehd> B Zxeeeid> B Zyeeejd> B Zzeeekd> B Z{eeeld> B Z|eeemd> B Z}eeend> B Z~eeeod> B Zeeepd> B Z€eeeqd> B Z�eeerd> B Z‚eeesd> B Zƒeeetd> B Z„eeeud> B Z…dS )Ú
Dot11TypesÚ00r   Ú0000Ú0001Ú0010Ú0011Ú0100Ú0101Ú0110Ú0111Ú1000Ú1001Ú1010Ú1011Ú1100Ú1101Ú1110Ú1111Ú01Ú10Ú11N)†rY   rZ   r[   r\   ÚDOT11_TYPE_MANAGEMENTÚ,DOT11_SUBTYPE_MANAGEMENT_ASSOCIATION_REQUESTÚ-DOT11_SUBTYPE_MANAGEMENT_ASSOCIATION_RESPONSEÚ.DOT11_SUBTYPE_MANAGEMENT_REASSOCIATION_REQUESTÚ/DOT11_SUBTYPE_MANAGEMENT_REASSOCIATION_RESPONSEÚ&DOT11_SUBTYPE_MANAGEMENT_PROBE_REQUESTÚ'DOT11_SUBTYPE_MANAGEMENT_PROBE_RESPONSEÚ"DOT11_SUBTYPE_MANAGEMENT_RESERVED1Ú"DOT11_SUBTYPE_MANAGEMENT_RESERVED2ÚDOT11_SUBTYPE_MANAGEMENT_BEACONÚDOT11_SUBTYPE_MANAGEMENT_ATIMÚ'DOT11_SUBTYPE_MANAGEMENT_DISASSOCIATIONÚ'DOT11_SUBTYPE_MANAGEMENT_AUTHENTICATIONÚ)DOT11_SUBTYPE_MANAGEMENT_DEAUTHENTICATIONÚDOT11_SUBTYPE_MANAGEMENT_ACTIONÚ"DOT11_SUBTYPE_MANAGEMENT_RESERVED3Ú"DOT11_SUBTYPE_MANAGEMENT_RESERVED4Ú1DOT11_TYPE_MANAGEMENT_SUBTYPE_ASSOCIATION_REQUESTÚ2DOT11_TYPE_MANAGEMENT_SUBTYPE_ASSOCIATION_RESPONSEÚ3DOT11_TYPE_MANAGEMENT_SUBTYPE_REASSOCIATION_REQUESTÚ4DOT11_TYPE_MANAGEMENT_SUBTYPE_REASSOCIATION_RESPONSEÚ+DOT11_TYPE_MANAGEMENT_SUBTYPE_PROBE_REQUESTÚ,DOT11_TYPE_MANAGEMENT_SUBTYPE_PROBE_RESPONSEÚ'DOT11_TYPE_MANAGEMENT_SUBTYPE_RESERVED1Ú'DOT11_TYPE_MANAGEMENT_SUBTYPE_RESERVED2Ú$DOT11_TYPE_MANAGEMENT_SUBTYPE_BEACONÚ"DOT11_TYPE_MANAGEMENT_SUBTYPE_ATIMÚ,DOT11_TYPE_MANAGEMENT_SUBTYPE_DISASSOCIATIONÚ,DOT11_TYPE_MANAGEMENT_SUBTYPE_AUTHENTICATIONÚ.DOT11_TYPE_MANAGEMENT_SUBTYPE_DEAUTHENTICATIONÚ$DOT11_TYPE_MANAGEMENT_SUBTYPE_ACTIONÚ'DOT11_TYPE_MANAGEMENT_SUBTYPE_RESERVED3Ú'DOT11_TYPE_MANAGEMENT_SUBTYPE_RESERVED4ÚDOT11_TYPE_CONTROLÚDOT11_SUBTYPE_CONTROL_RESERVED1ÚDOT11_SUBTYPE_CONTROL_RESERVED2ÚDOT11_SUBTYPE_CONTROL_RESERVED3ÚDOT11_SUBTYPE_CONTROL_RESERVED4ÚDOT11_SUBTYPE_CONTROL_RESERVED5ÚDOT11_SUBTYPE_CONTROL_RESERVED6ÚDOT11_SUBTYPE_CONTROL_RESERVED7ÚDOT11_SUBTYPE_CONTROL_RESERVED8Ú'DOT11_SUBTYPE_CONTROL_BLOCK_ACK_REQUESTÚDOT11_SUBTYPE_CONTROL_BLOCK_ACKÚ$DOT11_SUBTYPE_CONTROL_POWERSAVE_POLLÚ%DOT11_SUBTYPE_CONTROL_REQUEST_TO_SENDÚ#DOT11_SUBTYPE_CONTROL_CLEAR_TO_SENDÚ$DOT11_SUBTYPE_CONTROL_ACKNOWLEDGMENTÚDOT11_SUBTYPE_CONTROL_CF_ENDÚ#DOT11_SUBTYPE_CONTROL_CF_END_CF_ACKÚ$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED1Ú$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED2Ú$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED3Ú$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED4Ú$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED5Ú$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED6Ú$DOT11_TYPE_CONTROL_SUBTYPE_RESERVED7Ú,DOT11_TYPE_CONTROL_SUBTYPE_BLOCK_ACK_REQUESTÚ$DOT11_TYPE_CONTROL_SUBTYPE_BLOCK_ACKÚ)DOT11_TYPE_CONTROL_SUBTYPE_POWERSAVE_POLLÚ*DOT11_TYPE_CONTROL_SUBTYPE_REQUEST_TO_SENDÚ(DOT11_TYPE_CONTROL_SUBTYPE_CLEAR_TO_SENDÚ)DOT11_TYPE_CONTROL_SUBTYPE_ACKNOWLEDGMENTÚ!DOT11_TYPE_CONTROL_SUBTYPE_CF_ENDÚ(DOT11_TYPE_CONTROL_SUBTYPE_CF_END_CF_ACKÚDOT11_TYPE_DATAÚDOT11_SUBTYPE_DATAÚDOT11_SUBTYPE_DATA_CF_ACKÚDOT11_SUBTYPE_DATA_CF_POLLÚ!DOT11_SUBTYPE_DATA_CF_ACK_CF_POLLÚDOT11_SUBTYPE_DATA_NULL_NO_DATAÚ!DOT11_SUBTYPE_DATA_CF_ACK_NO_DATAÚ"DOT11_SUBTYPE_DATA_CF_POLL_NO_DATAÚ)DOT11_SUBTYPE_DATA_CF_ACK_CF_POLL_NO_DATAÚDOT11_SUBTYPE_DATA_QOS_DATAÚ"DOT11_SUBTYPE_DATA_QOS_DATA_CF_ACKÚ#DOT11_SUBTYPE_DATA_QOS_DATA_CF_POLLÚ*DOT11_SUBTYPE_DATA_QOS_DATA_CF_ACK_CF_POLLÚ#DOT11_SUBTYPE_DATA_QOS_NULL_NO_DATAÚDOT11_SUBTYPE_DATA_RESERVED1Ú&DOT11_SUBTYPE_DATA_QOS_CF_POLL_NO_DATAÚ-DOT11_SUBTYPE_DATA_QOS_CF_ACK_CF_POLL_NO_DATAÚDOT11_TYPE_DATA_SUBTYPE_DATAÚDOT11_TYPE_DATA_SUBTYPE_CF_ACKÚDOT11_TYPE_DATA_SUBTYPE_CF_POLLÚ&DOT11_TYPE_DATA_SUBTYPE_CF_ACK_CF_POLLÚ$DOT11_TYPE_DATA_SUBTYPE_NULL_NO_DATAÚ&DOT11_TYPE_DATA_SUBTYPE_CF_ACK_NO_DATAÚ.DOT11_TYPE_DATA_SUBTYPE_CF_ACK_CF_POLL_NO_DATAÚ DOT11_TYPE_DATA_SUBTYPE_QOS_DATAÚ'DOT11_TYPE_DATA_SUBTYPE_QOS_DATA_CF_ACKÚ(DOT11_TYPE_DATA_SUBTYPE_QOS_DATA_CF_POLLÚ/DOT11_TYPE_DATA_SUBTYPE_QOS_DATA_CF_ACK_CF_POLLÚ(DOT11_TYPE_DATA_SUBTYPE_QOS_NULL_NO_DATAÚ!DOT11_TYPE_DATA_SUBTYPE_RESERVED1Ú+DOT11_TYPE_DATA_SUBTYPE_QOS_CF_POLL_NO_DATAÚ2DOT11_TYPE_DATA_SUBTYPE_QOS_CF_ACK_CF_POLL_NO_DATAÚDOT11_TYPE_RESERVEDÚ DOT11_SUBTYPE_RESERVED_RESERVED1Ú DOT11_SUBTYPE_RESERVED_RESERVED2Ú DOT11_SUBTYPE_RESERVED_RESERVED3Ú DOT11_SUBTYPE_RESERVED_RESERVED4Ú DOT11_SUBTYPE_RESERVED_RESERVED5Ú DOT11_SUBTYPE_RESERVED_RESERVED6Ú DOT11_SUBTYPE_RESERVED_RESERVED7Ú DOT11_SUBTYPE_RESERVED_RESERVED8Ú DOT11_SUBTYPE_RESERVED_RESERVED9Ú!DOT11_SUBTYPE_RESERVED_RESERVED10Ú!DOT11_SUBTYPE_RESERVED_RESERVED11Ú!DOT11_SUBTYPE_RESERVED_RESERVED12Ú!DOT11_SUBTYPE_RESERVED_RESERVED13Ú!DOT11_SUBTYPE_RESERVED_RESERVED14Ú!DOT11_SUBTYPE_RESERVED_RESERVED15Ú!DOT11_SUBTYPE_RESERVED_RESERVED16Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED1Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED2Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED3Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED4Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED5Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED6Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED7Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED8Ú%DOT11_TYPE_RESERVED_SUBTYPE_RESERVED9Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED10Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED11Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED12Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED13Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED14Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED15Ú&DOT11_TYPE_RESERVED_SUBTYPE_RESERVED16rm   rm   rm   rn   ro   V   s‚   

















ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ

















ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ

















ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ

















ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿro   c                   @   s  e Zd ZdCdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dDdAdB„Z"dS )EÚDot11NTc                 C   sB   d}|  | _ | j rd}nd}t | ||¡ |r|  |¡ d S d S )Nr   r	   r   )Ú_Dot11__FCS_at_endr   Ú__init__Úload_packet)ÚselfÚaBufferÚ
FCS_at_endÚheader_sizeÚ	tail_sizerm   rm   rn   r  $  s   
ÿzDot11.__init__c                 C   ó   | j  d¡}|d? d@ S )z!Return 802.11 frame 'Order' fieldr   r   ©ÚheaderÚget_byte©r
  Úbrm   rm   rn   Ú	get_order0  ó   zDot11.get_orderc                 C   ó6   d}| j  d¡|@ }||d@ d> B }| j  d|¡ dS )zSet 802.11 frame 'Order' fieldé   r   r   N©r  r  Úset_byte©r
  ÚvalueÚmaskÚmaskedÚnbrm   rm   rn   Ú	set_order5  ó   zDot11.set_orderc                 C   r  )z%Return 802.11 frame 'Protected' fieldr   r   r  r  rm   rm   rn   Úget_protectedFrame>  r  zDot11.get_protectedFramec                 C   r  )z(Set 802.11 frame 'Protected Frame' fieldé¿   r   r   Nr  r  rm   rm   rn   Úset_protectedFrameC  r!  zDot11.set_protectedFramec                 C   r  )z%Return 802.11 frame 'More Data' fieldr   r
   r  r  rm   rm   rn   Úget_moreDataL  r  zDot11.get_moreDatac                 C   r  )z"Set 802.11 frame 'More Data' fieldéß   r   r
   Nr  r  rm   rm   rn   Úset_moreDataQ  r!  zDot11.set_moreDatac                 C   r  )z,Return 802.11 frame 'Power Management' fieldr   r	   r  r  rm   rm   rn   Úget_powerManagementZ  r  zDot11.get_powerManagementc                 C   r  )z)Set 802.11 frame 'Power Management' fieldéï   r   r	   Nr  r  rm   rm   rn   Úset_powerManagement_  r!  zDot11.set_powerManagementc                 C   r  )z!Return 802.11 frame 'Retry' fieldr   r   r  r  rm   rm   rn   Ú	get_retryh  r  zDot11.get_retryc                 C   r  )zSet 802.11 frame 'Retry' fieldé÷   r   r   Nr  r  rm   rm   rn   Ú	set_retrym  r!  zDot11.set_retryc                 C   r  )z*Return 802.11 frame 'More Fragments' fieldr   r   r  r  rm   rm   rn   Úget_moreFragv  r  zDot11.get_moreFragc                 C   r  )z'Set 802.11 frame 'More Fragments' fieldéû   r   r   Nr  r  rm   rm   rn   Úset_moreFrag{  r!  zDot11.set_moreFragc                 C   s   | j  d¡}|d? d@ S )z#Return 802.11 frame 'from DS' fieldr   r  r  rm   rm   rn   Ú
get_fromDS„  r  zDot11.get_fromDSc                 C   s6   d}| j  d¡|@ }||d@ d> B }| j  d|¡ dS )z Set 802.11 frame 'from DS' fieldéý   r   Nr  r  rm   rm   rn   Ú
set_fromDS‰  r!  zDot11.set_fromDSc                 C   s   | j  d¡}|d@ S )z!Return 802.11 frame 'to DS' fieldr   r  r  rm   rm   rn   Úget_toDS’  ó   zDot11.get_toDSc                 C   s2   d}| j  d¡|@ }||d@ B }| j  d|¡ dS )zSet 802.11 frame 'to DS' fieldéþ   r   Nr  r  rm   rm   rn   Úset_toDS—  ó   zDot11.set_toDSc                 C   ó   | j  d¡}|d? d@ S )z#Return 802.11 frame 'subtype' fieldr   r	   é   r  r  rm   rm   rn   Úget_subtype   r  zDot11.get_subtypec                 C   ó6   d}| j  d¡|@ }||d> d@ B }| j  d|¡ dS )z Set 802.11 frame 'subtype' fieldr:  r   r	   éð   Nr  r  rm   rm   rn   Úset_subtype¥  r!  zDot11.set_subtypec                 C   r9  )z Return 802.11 frame 'type' fieldr   r   r   r  r  rm   rm   rn   Úget_type®  r  zDot11.get_typec                 C   r<  )zSet 802.11 frame 'type' fieldéó   r   r   r   Nr  r  rm   rm   rn   Úset_type³  r!  zDot11.set_typec                 C   r9  )z,Return 802.11 frame 'Type and Subtype' fieldr   r   é?   r  r  rm   rm   rn   Úget_type_n_subtype¼  r  zDot11.get_type_n_subtypec                 C   r<  )z)Set 802.11 frame 'Type and Subtype' fieldr   r   r   éü   Nr  r  rm   rm   rn   Úset_type_n_subtypeÁ  r!  zDot11.set_type_n_subtypec                 C   ó   | j  d¡}|d@ S )z4Return 802.11 frame control 'Protocol version' fieldr   r   r  r  rm   rm   rn   Úget_versionÊ  r5  zDot11.get_versionc                 C   s2   d}| j  d¡|@ }||d@ B }| j  d|¡ dS )z5Set the 802.11 frame control 'Protocol version' fieldrD  r   r   Nr  r  rm   rm   rn   Úset_versionÏ  r8  zDot11.set_versionc                 C   s*   t |ƒd@ }t d|¡}t d|¡\}|S ©Nì   ÿÿ ú<Lú!L)r   ÚstructÚpackÚunpack)r
  ÚbytesÚcrcleÚcrcÚcrc_longrm   rm   rn   Úcompute_checksumØ  s   zDot11.compute_checksumc                 C   ó   | j  d¡}|d@ odS )z*Return 'True' if is an QoS data frame typer   r.   Tr  r  rm   rm   rn   Úis_QoS_frameà  ó   zDot11.is_QoS_framec                 C   rU  )z/Return 'True' if it frame contain no Frame Bodyr   r   Tr  r  rm   rm   rn   Úis_no_framebody_frameæ  rW  zDot11.is_no_framebody_framec                 C   rU  )z,Return 'True' if it frame is a CF_POLL framer   é    Tr  r  rm   rm   rn   Úis_cf_poll_frameì  rW  zDot11.is_cf_poll_framec                 C   rU  )z+Return 'True' if it frame is a CF_ACK framer   é   Tr  r  rm   rm   rn   Úis_cf_ack_frameò  rW  zDot11.is_cf_ack_framec                 C   s   | j sdS | j dd¡}|S )zReturn 802.11 'FCS' fieldNéüÿÿÿú>)r  ÚtailÚget_longr  rm   rm   rn   Úget_fcsø  s   zDot11.get_fcsc                 C   sB   | j sdS |du r|  ¡ }|  |¡}|}|d@ }| j d|¡ dS )zPSet the 802.11 CTS control frame 'FCS' field. If value is None, is auto_checksumNrJ  r]  )r  Úget_body_as_stringrT  r_  Úset_long)r
  r  Úpayloadr   r  rm   rm   rn   Úset_fcs  s   
zDot11.set_fcs)NT©N)#rY   rZ   r[   r  r  r   r"  r$  r%  r'  r(  r*  r+  r-  r.  r0  r1  r3  r4  r7  r;  r>  r?  rA  rC  rE  rG  rH  rT  rV  rX  rZ  r\  ra  re  rm   rm   rm   rn   r  #  sB    
													r  c                   @   ó:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚDot11ControlFrameCTSz"802.11 Clear-To-Send Control FrameNc                 C   ó,   d}d}t  | ||¡ |r|  |¡ d S d S ©Nr   r   ©r   r  r	  ©r
  r  r  r  rm   rm   rn   r    ó   ÿzDot11ControlFrameCTS.__init__c                 C   ó   | j  dd¡}|S )z0Return 802.11 CTS control frame 'Duration' fieldr   ú<©r  Úget_wordr  rm   rm   rn   Úget_duration  ó   z!Dot11ControlFrameCTS.get_durationc                 C   ó   |d@ }| j  d|d¡ dS )z1Set the 802.11 CTS control frame 'Duration' fieldéÿÿ  r   ro  N©r  Úset_word©r
  r  r  rm   rm   rn   Úset_duration!  ó   z!Dot11ControlFrameCTS.set_durationc                 C   ó   | j  ¡ dd… S )zRReturn 802.11 CTS control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   ©r  Ú	get_bytes©r
  rm   rm   rn   Úget_ra'  ó   zDot11ControlFrameCTS.get_rac                 C   ó*   t ddƒD ]}| j d| || ¡ qdS )zOSet 802.11 CTS control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r   N©Úranger  r  ©r
  r  Úirm   rm   rn   Úset_ra+  ó   ÿzDot11ControlFrameCTS.set_rarf  ©	rY   rZ   r[   Ú__doc__r  rr  ry  r  r†  rm   rm   rm   rn   rh    ó    
rh  c                   @   rg  )ÚDot11ControlFrameACKz$802.11 Acknowledgement Control FrameNc                 C   ri  rj  rk  rl  rm   rm   rn   r  3  rm  zDot11ControlFrameACK.__init__c                 C   rn  )z0Return 802.11 ACK control frame 'Duration' fieldr   ro  rp  r  rm   rm   rn   rr  ;  rs  z!Dot11ControlFrameACK.get_durationc                 C   rt  )z1Set the 802.11 ACK control frame 'Duration' fieldru  r   ro  Nrv  rx  rm   rm   rn   ry  @  rz  z!Dot11ControlFrameACK.set_durationc                 C   r{  )zRReturn 802.11 ACK control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   r  F  r€  zDot11ControlFrameACK.get_rac                 C   r�  )zOSet 802.11 ACK control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r†  J  r‡  zDot11ControlFrameACK.set_rarf  rˆ  rm   rm   rm   rn   r‹  0  rŠ  r‹  c                   @   óJ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚDot11ControlFrameRTSz$802.11 Request-To-Send Control FrameNc                 C   ri  ©Nr   r   rk  rl  rm   rm   rn   r  R  rm  zDot11ControlFrameRTS.__init__c                 C   rn  )z0Return 802.11 RTS control frame 'Duration' fieldr   ro  rp  r  rm   rm   rn   rr  Z  rs  z!Dot11ControlFrameRTS.get_durationc                 C   rt  )z1Set the 802.11 RTS control frame 'Duration' fieldru  r   ro  Nrv  rx  rm   rm   rn   ry  _  rz  z!Dot11ControlFrameRTS.set_durationc                 C   r{  )zRReturn 802.11 RTS control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   r  e  r€  zDot11ControlFrameRTS.get_rac                 C   r�  )zOSet 802.11 RTS control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r†  i  r‡  zDot11ControlFrameRTS.set_rac                 C   r{  )zUReturn 802.11 RTS control frame 48 bit 'Transmitter Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   Úget_tan  r€  zDot11ControlFrameRTS.get_tac                 C   r�  )zRSet 802.11 RTS control frame 48 bit 'Transmitter Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Úset_tar  r‡  zDot11ControlFrameRTS.set_tarf  )rY   rZ   r[   r‰  r  rr  ry  r  r†  r�  r�  rm   rm   rm   rn   r�  O  ó    
r�  c                   @   rŒ  )ÚDot11ControlFramePSPollz$802.11 Power-Save Poll Control FrameNc                 C   ri  rŽ  rk  rl  rm   rm   rn   r  z  rm  z Dot11ControlFramePSPoll.__init__c                 C   rn  )z.Return 802.11 PSPoll control frame 'AID' fieldr   ro  rp  r  rm   rm   rn   Úget_aid‚  ó   zDot11ControlFramePSPoll.get_aidc                 C   rt  )z/Set the 802.11 PSPoll control frame 'AID' fieldru  r   ro  Nrv  rx  rm   rm   rn   Úset_aid‰  s   zDot11ControlFramePSPoll.set_aidc                 C   r{  )zKReturn 802.11 PSPoll control frame 48 bit 'BSS ID' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   Ú	get_bssid‘  r€  z!Dot11ControlFramePSPoll.get_bssidc                 C   r�  )zHSet 802.11 PSPoll control frame 48 bit 'BSS ID' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Ú	set_bssid•  r‡  z!Dot11ControlFramePSPoll.set_bssidc                 C   r{  )zXReturn 802.11 PSPoll control frame 48 bit 'Transmitter Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   r�  š  r€  zDot11ControlFramePSPoll.get_tac                 C   r�  )zUSet 802.11 PSPoll control frame 48 bit 'Transmitter Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r�  ž  r‡  zDot11ControlFramePSPoll.set_tarf  )rY   rZ   r[   r‰  r  r“  r•  r–  r—  r�  r�  rm   rm   rm   rn   r’  w  s    
r’  c                   @   rŒ  )ÚDot11ControlFrameCFEndz*802.11 'Contention Free End' Control FrameNc                 C   ri  rŽ  rk  rl  rm   rm   rn   r  ¦  rm  zDot11ControlFrameCFEnd.__init__c                 C   rn  )z3Return 802.11 CF-End control frame 'Duration' fieldr   ro  rp  r  rm   rm   rn   rr  ®  rs  z#Dot11ControlFrameCFEnd.get_durationc                 C   rt  )z4Set the 802.11 CF-End control frame 'Duration' fieldru  r   ro  Nrv  rx  rm   rm   rn   ry  ³  rz  z#Dot11ControlFrameCFEnd.set_durationc                 C   r{  )zUReturn 802.11 CF-End control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   r  ¹  r€  zDot11ControlFrameCFEnd.get_rac                 C   r�  )zRSet 802.11 CF-End control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r†  ½  r‡  zDot11ControlFrameCFEnd.set_rac                 C   r{  )zKReturn 802.11 CF-End control frame 48 bit 'BSS ID' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   r–  Â  r€  z Dot11ControlFrameCFEnd.get_bssidc                 C   r�  )zHSet 802.11 CF-End control frame 48 bit 'BSS ID' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r—  Æ  r‡  z Dot11ControlFrameCFEnd.set_bssidrf  ©rY   rZ   r[   r‰  r  rr  ry  r  r†  r–  r—  rm   rm   rm   rn   r˜  £  r‘  r˜  c                   @   rŒ  )ÚDot11ControlFrameCFEndCFACKz&802.11 'CF-End + CF-ACK' Control FrameNc                 C   ri  rŽ  rk  rl  rm   rm   rn   r  Î  rm  z$Dot11ControlFrameCFEndCFACK.__init__c                 C   rn  )z<Return 802.11 'CF-End+CF-ACK' control frame 'Duration' fieldr   ro  rp  r  rm   rm   rn   rr  Ö  rs  z(Dot11ControlFrameCFEndCFACK.get_durationc                 C   rt  )z=Set the 802.11 'CF-End+CF-ACK' control frame 'Duration' fieldru  r   ro  Nrv  rx  rm   rm   rn   ry  Û  rz  z(Dot11ControlFrameCFEndCFACK.set_durationc                 C   r{  )z^Return 802.11 'CF-End+CF-ACK' control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   r  á  r€  z"Dot11ControlFrameCFEndCFACK.get_rac                 C   r�  )z[Set 802.11 'CF-End+CF-ACK' control frame 48 bit 'Receiver Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r†  å  r‡  z"Dot11ControlFrameCFEndCFACK.set_rac                 C   r{  )zTReturn 802.11 'CF-End+CF-ACK' control frame 48 bit 'BSS ID' field as a 6 bytes arrayr   r[  r|  r~  rm   rm   rn   r–  ê  r€  z%Dot11ControlFrameCFEndCFACK.get_bssidc                 C   r�  )zQSet 802.11 'CF-End+CF-ACK' control frame 48 bit 'BSS ID' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r—  î  r‡  z%Dot11ControlFrameCFEndCFACK.set_bssidrf  r™  rm   rm   rm   rn   rš  Ë  r‘  rš  c                   @   óš   e Zd ZdZd%dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdS )&ÚDot11DataFramez802.11 Data FrameNc                 C   ri  ©Né   r   rk  rl  rm   rm   rn   r  ö  rm  zDot11DataFrame.__init__c                 C   rn  )z0Return 802.11 'Data' data frame 'Duration' fieldr   ro  rp  r  rm   rm   rn   rr  þ  rs  zDot11DataFrame.get_durationc                 C   rt  )z1Set the 802.11 'Data' data frame 'Duration' fieldru  r   ro  Nrv  rx  rm   rm   rn   ry    rz  zDot11DataFrame.set_durationc                 C   r{  )zJReturn 802.11 'Data' data frame 48 bit 'Address1' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   Úget_address1	  r€  zDot11DataFrame.get_address1c                 C   r�  )zGSet 802.11 'Data' data frame 48 bit 'Address1' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Úset_address1  r‡  zDot11DataFrame.set_address1c                 C   r{  )zJReturn 802.11 'Data' data frame 48 bit 'Address2' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   Úget_address2  r€  zDot11DataFrame.get_address2c                 C   r�  )zGSet 802.11 'Data' data frame 48 bit 'Address2' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Úset_address2  r‡  zDot11DataFrame.set_address2c                 C   r{  )zJReturn 802.11 'Data' data frame 48 bit 'Address3' field as a 6 bytes arrayr   é   r|  r~  rm   rm   rn   Úget_address3  r€  zDot11DataFrame.get_address3c                 C   r�  )zGSet 802.11 'Data' data frame 48 bit 'Address3' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Úset_address3  r‡  zDot11DataFrame.set_address3c                 C   rn  )z8Return 802.11 'Data' data frame 'Sequence Control' fieldr£  ro  rp  r  rm   rm   rn   Úget_sequence_control$  rs  z#Dot11DataFrame.get_sequence_controlc                 C   rt  )z9Set the 802.11 'Data' data frame 'Sequence Control' fieldru  r£  ro  Nrv  rx  rm   rm   rn   Úset_sequence_control)  rz  z#Dot11DataFrame.set_sequence_controlc                 C   s   | j  dd¡}|d@ S )z:Return 802.11 'Data' data frame 'Fragment Number' subfieldr£  ro  r:  rp  r  rm   rm   rn   Úget_fragment_number/  s   z"Dot11DataFrame.get_fragment_numberc                 C   ó6   d}| j  dd¡|@ }||d@ B }| j  d|d¡ dS )z;Set the 802.11 'Data' data frame 'Fragment Number' subfieldéðÿ  r£  ro  r:  N©r  rq  rw  r  rm   rm   rn   Úset_fragment_number5  ó   z"Dot11DataFrame.set_fragment_numberc                 C   s   | j  dd¡}|d? d@ S )z:Return 802.11 'Data' data frame 'Sequence Number' subfieldr£  ro  r	   éÿ  rp  r  rm   rm   rn   Úget_sequence_number>  s   z"Dot11DataFrame.get_sequence_numberc                 C   ó:   d}| j  dd¡|@ }||d@ d> B }| j  d|d¡ dS )z;Set the 802.11 'Data' data frame 'Sequence Number' subfieldr:  r£  ro  r®  r	   Nr«  r  rm   rm   rn   Úset_sequence_numberD  ó   z"Dot11DataFrame.set_sequence_numberc                 C   ó   |   ¡ S )z2Return 802.11 'Data' data frame 'Frame Body' field©rb  r~  rm   rm   rn   Úget_frame_bodyM  ó   zDot11DataFrame.get_frame_bodyc                 C   ó   |   |¡ dS )z/Set 802.11 'Data' data frame 'Frame Body' fieldN©Ú	load_body©r
  Údatarm   rm   rn   Úset_frame_bodyR  ó   zDot11DataFrame.set_frame_bodyrf  )rY   rZ   r[   r‰  r  rr  ry  rŸ  r   r¡  r¢  r¤  r¥  r¦  r§  r¨  r¬  r¯  r±  rµ  r¼  rm   rm   rm   rn   rœ  ó  ó&    
		rœ  c                   @   ó*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚDot11DataQoSFramez802.11 Data QoS FrameNc                 C   ri  )Né   r   rk  rl  rm   rm   rn   r  Z  rm  zDot11DataQoSFrame.__init__c                 C   rn  )ú+Return 802.11 'Data' data frame 'QoS' fieldrž  ro  rp  r  rm   rm   rn   Úget_QoSb  rs  zDot11DataQoSFrame.get_QoSc                 C   rt  )ú,Set the 802.11 'Data' data frame 'QoS' fieldru  rž  ro  Nrv  rx  rm   rm   rn   Úset_QoSg  rz  zDot11DataQoSFrame.set_QoSrf  ©rY   rZ   r[   r‰  r  rÃ  rÅ  rm   rm   rm   rn   rÀ  W  ó
    
rÀ  c                   @   r¿  )
ÚDot11DataAddr4Framez7802.11 Data With ToDS From DS Flags (With Addr 4) FrameNc                 C   ri  )Né   r   rk  rl  rm   rm   rn   r  p  rm  zDot11DataAddr4Frame.__init__c                 C   r{  )zJReturn 802.11 'Data' data frame 48 bit 'Address4' field as a 6 bytes arrayrž  rÉ  r|  r~  rm   rm   rn   Úget_address4x  r€  z Dot11DataAddr4Frame.get_address4c                 C   r�  )zGSet 802.11 'Data' data frame 48 bit 'Address4' field as a 6 bytes arrayr   r   rž  Nr‚  r„  rm   rm   rn   Úset_address4|  r‡  z Dot11DataAddr4Frame.set_address4rf  )rY   rZ   r[   r‰  r  rÊ  rË  rm   rm   rm   rn   rÈ  m  ó
    
rÈ  c                   @   r¿  )
ÚDot11DataAddr4QoSFramez?802.11 Data With ToDS From DS Flags (With Addr 4) and QoS FrameNc                 C   ri  )Né   r   rk  rl  rm   rm   rn   r  „  rm  zDot11DataAddr4QoSFrame.__init__c                 C   rn  )rÂ  rÉ  ro  rp  r  rm   rm   rn   rÃ  Œ  rs  zDot11DataAddr4QoSFrame.get_QoSc                 C   rt  )rÄ  ru  rÉ  ro  Nrv  rx  rm   rm   rn   rÅ  ‘  rz  zDot11DataAddr4QoSFrame.set_QoSrf  rÆ  rm   rm   rm   rn   rÍ  �  rÇ  rÍ  c                   @   s”   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#S )$ÚSAPTypesr   r   r	   r   r   r   r   r[  r£  rÁ  rY  r   r   éB   éN   éT   r-   r.   r/   r1   éŽ   é˜   r:   rC   éº   é¼   éà   r=  éô   éø   éú   rD  r6  éÿ   N)%rY   rZ   r[   ÚNULLÚ
LLC_SLMGMTÚSNA_PATHCTRLÚIPÚSNA1ÚSNA2ÚPROWAY_NM_INITÚNETWARE1ÚOSINL1ÚTIÚOSINL2ÚOSINL3ÚSNA3ÚBPDUÚRS511ÚOSINL4ÚX25ÚXNSÚBACNETÚNESTARÚPROWAY_ASLMÚARPÚSNAPÚHPJDÚVINES1ÚVINES2ÚNETWARE2ÚNETBIOSÚIBMNMÚHPEXTÚUBÚRPLÚOSINL5ÚGLOBALrm   rm   rm   rn   rÏ  —  sF    rÏ  c                   @   sN   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚLLCz&802.2 Logical Link Control (LLC) Framer   Nc                 C   ri  )Nr   r   rk  rl  rm   rm   rn   r  À  rm  zLLC.__init__c                 C   ó   | j  d¡S )z=Get the Destination Service Access Point (SAP) from LLC framer   r  r~  rm   rm   rn   Úget_DSAPÈ  ó   zLLC.get_DSAPc                 C   ó   | j  d|¡ dS )z;Set the Destination Service Access Point (SAP) of LLC framer   N©r  r  ©r
  r  rm   rm   rn   Úset_DSAPÌ  r€  zLLC.set_DSAPc                 C   rÿ  )z8Get the Source Service Access Point (SAP) from LLC framer   r  r~  rm   rm   rn   Úget_SSAPÐ  r  zLLC.get_SSAPc                 C   r  )z6Set the Source Service Access Point (SAP) of LLC framer   Nr  r  rm   rm   rn   Úset_SSAPÔ  r€  zLLC.set_SSAPc                 C   rÿ  )z$Get the Control field from LLC framer   r  r~  rm   rm   rn   Úget_controlØ  r  zLLC.get_controlc                 C   r  )z"Set the Control field of LLC framer   Nr  r  rm   rm   rn   Úset_controlÜ  r€  zLLC.set_controlrf  )rY   rZ   r[   r‰  ÚDLC_UNNUMBERED_FRAMESr  r   r  r  r  r  r	  rm   rm   rm   rn   rþ  »  s    
rþ  c                   @   rg  )rò  z-802.2 SubNetwork Access Protocol (SNAP) FrameNc                 C   ri  )Nr
   r   rk  rl  rm   rm   rn   r  ã  rm  zSNAP.__init__c                 C   ó,   t | j ¡ dd… ƒ}t dd| ¡\}|S )zGGet the three-octet Organizationally Unique Identifier (OUI) SNAP framer   r   rL  ó    ©r   r  r}  rM  rO  )r
  r  Úouirm   rm   rn   Úget_OUIë  ó   zSNAP.get_OUIc                 C   ó8   d}| j  dd¡|@ }||d@ d> B }| j  d|¡ dS )zGSet the three-octet Organizationally Unique Identifier (OUI) SNAP framerÛ  r   r^  éÿÿÿ r   N©r  r`  rc  r  rm   rm   rn   Úset_OUIò  ó   zSNAP.set_OUIc                 C   ó   | j  dd¡S )z6Get the two-octet Protocol Identifier (PID) SNAP fieldr   r^  rp  r~  rm   rm   rn   Úget_protoIDû  ó   zSNAP.get_protoIDc                 C   ó   | j  d|d¡ dS )z6Set the two-octet Protocol Identifier (PID) SNAP fieldr   r^  Nrv  r  rm   rm   rn   Úset_protoIDÿ  ó   zSNAP.set_protoIDrf  )	rY   rZ   r[   r‰  r  r  r  r  r  rm   rm   rm   rn   rò  à  s    
	rò  c                   @   sZ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚDot11WEPz
802.11 WEPNc                 C   ri  )Nr	   r   rk  rl  rm   rm   rn   r    rm  zDot11WEP.__init__c                 C   s   | j  d¡}|d@  S )zReturn True if it's a WEPr   rY  r  r  rm   rm   rn   Úis_WEP  s   
zDot11WEP.is_WEPc                 C   r  )zReturn the 'WEP IV' fieldr   r   rL  r  r  )r
  r  Úivrm   rm   rn   Úget_iv  r  zDot11WEP.get_ivc                 C   r  )zSet the 'WEP IV' field.rÛ  r   r^  r  r   Nr  r  rm   rm   rn   Úset_iv  r  zDot11WEP.set_ivc                 C   r  )zReturn the 'WEP KEY ID' fieldr   r   r  r  rm   rm   rn   Ú	get_keyid&  r  zDot11WEP.get_keyidc                 C   r  )zSet the 'WEP KEY ID' fieldrB  r   r   Nr  r  rm   rm   rn   Ú	set_keyid+  r!  zDot11WEP.set_keyidc                 C   sL   t | jƒdk r
| jS t d|  ¡ ¡dd… }|| }t|ƒ}| | j¡}|S )z!Return 'WEP Data' field decryptedr   z>LéýÿÿÿN)ÚlenÚbody_stringrM  rN  r  r   Údecrypt)r
  Ú
key_stringr  ÚkeyÚrc4Údecrypted_datarm   rm   rn   Úget_decrypted_data4  s   zDot11WEP.get_decrypted_datac                 C   s
   |   |¡S rf  )r+  )r
  r'  rm   rm   rn   Úget_encrypted_dataF  s   
zDot11WEP.get_encrypted_datac                 C   s   |   |¡}|  |¡ d S rf  )r,  r¹  )r
  r'  Úencrm   rm   rn   Úencrypt_frameJ  s   
zDot11WEP.encrypt_framerf  )rY   rZ   r[   r‰  r  r  r  r   r!  r"  r+  r,  r.  rm   rm   rm   rn   r    s    
		r  c                   @   ó<   e Zd ZdZddd„Zdd„ Zddd„Zd	d
„ Zdd„ ZdS )ÚDot11WEPDataz802.11 WEP Data PartNc                 C   ri  )Nr   r	   rk  rl  rm   rm   rn   r  Q  rm  zDot11WEPData.__init__c                 C   rn  )zReturn 'WEP ICV' fieldr]  r^  ©r_  r`  r  rm   rm   rn   Úget_icvY  ó   zDot11WEPData.get_icvc                 C   s*   |du r|   ¡ }|d@ }| j d|¡ dS )zSet 'WEP ICV' fieldNrJ  r]  )Úget_computed_icvr_  rc  rx  rm   rm   rn   Úset_icv_  s   zDot11WEPData.set_icvc                 C   s,   t | jƒd@ }t d|¡}t d|¡\}|S rI  )r   r%  rM  rN  rO  )r
  rQ  rR  rS  rm   rm   rn   r4  j  s   zDot11WEPData.get_computed_icvc                 C   s    |   ¡ }|  ¡ }||krdS dS )NTF)r4  r2  )r
  Úcomputed_icvÚcurrent_icvrm   rm   rn   Ú	check_icvr  s
   zDot11WEPData.check_icvrf  )	rY   rZ   r[   r‰  r  r2  r5  r4  r8  rm   rm   rm   rn   r0  N  s    

r0  c                   @   sº   e Zd ZdZd-dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ ZdS ).ÚDot11WPAz
802.11 WPANc                 C   ri  rj  rk  rl  rm   rm   rn   r  }  rm  zDot11WPA.__init__c                 C   s$   |   ¡ |  ¡ dB d@ k}|o|  ¡ S )zReturn True if it's a WPArY  r  )Úget_WEPSeedÚget_TSC1Ú	get_extIVr  rm   rm   rn   Úis_WPA…  s   zDot11WPA.is_WPAc                 C   r  )zReturn the 'WPA KEY ID' fieldr   r   r  r  rm   rm   rn   r!  Œ  r  zDot11WPA.get_keyidc                 C   r  )zSet the 'WPA KEY ID' fieldrB  r   r   Nr  r  rm   rm   rn   r"  ‘  r!  zDot11WPA.set_keyidc                 C   ó   | j S )z!Return 'WPA Data' field decrypted©r%  r~  rm   rm   rn   r+  š  ó   zDot11WPA.get_decrypted_datac                 C   rF  )zReturn the 'WPA TSC1' fieldr   rÛ  r  r  rm   rm   rn   r;  Ÿ  r5  zDot11WPA.get_TSC1c                 C   ó   |d@ }| j  d|¡ dS )zSet the 'WPA TSC1' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_TSC1¤  ó   zDot11WPA.set_TSC1c                 C   rF  )zReturn the 'WPA WEPSeed' fieldr   rÛ  r  r  rm   rm   rn   r:  ª  r5  zDot11WPA.get_WEPSeedc                 C   rA  )zSet the 'WPA WEPSeed' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_WEPSeed¯  rC  zDot11WPA.set_WEPSeedc                 C   rF  )zReturn the 'WPA TSC0' fieldr   rÛ  r  r  rm   rm   rn   Úget_TSC0µ  r5  zDot11WPA.get_TSC0c                 C   rA  )zSet the 'WPA TSC0' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_TSC0º  rC  zDot11WPA.set_TSC0c                 C   r9  )zReturn the 'WPA extID' fieldr   r
   r   r  r  rm   rm   rn   r<  À  r  zDot11WPA.get_extIVc                 C   ó6   d}| j  d¡|@ }||d@ d> B }| j  d|¡ dS )zSet the 'WPA extID' fieldr&  r   r   r
   Nr  r  rm   rm   rn   Ú	set_extIVÅ  r!  zDot11WPA.set_extIVc                 C   rF  )zReturn the 'WPA TSC2' fieldr	   rÛ  r  r  rm   rm   rn   Úget_TSC2Î  r5  zDot11WPA.get_TSC2c                 C   rA  )zSet the 'WPA TSC2' fieldrÛ  r	   Nr  rx  rm   rm   rn   Úset_TSC2Ó  rC  zDot11WPA.set_TSC2c                 C   rF  )zReturn the 'WPA TSC3' fieldr
   rÛ  r  r  rm   rm   rn   Úget_TSC3Ù  r5  zDot11WPA.get_TSC3c                 C   rA  )zSet the 'WPA TSC3' fieldrÛ  r
   Nr  rx  rm   rm   rn   Úset_TSC3Þ  rC  zDot11WPA.set_TSC3c                 C   rF  )zReturn the 'WPA TSC4' fieldr   rÛ  r  r  rm   rm   rn   Úget_TSC4ä  r5  zDot11WPA.get_TSC4c                 C   rA  )zSet the 'WPA TSC4' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_TSC4é  rC  zDot11WPA.set_TSC4c                 C   rF  )zReturn the 'WPA TSC5' fieldr   rÛ  r  r  rm   rm   rn   Úget_TSC5ï  r5  zDot11WPA.get_TSC5c                 C   rA  )zSet the 'WPA TSC5' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_TSC5ô  rC  zDot11WPA.set_TSC5rf  )rY   rZ   r[   r‰  r  r=  r!  r"  r+  r;  rB  r:  rD  rE  rF  r<  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rm   rm   rm   rn   r9  z  s.    
		r9  c                   @   r/  )ÚDot11WPADataz802.11 WPA Data PartNc                 C   ri  )Nr   r   rk  rl  rm   rm   rn   r  ý  rm  zDot11WPAData.__init__c                 C   rn  )zReturn 'WPA ICV' fieldr]  r^  r1  r  rm   rm   rn   r2    r3  zDot11WPAData.get_icvc                 C   s.   |du r
|   | j¡}|d@ }| j d|¡ dS )zSet 'WPA ICV' fieldNrJ  r]  )rT  r%  r_  rc  rx  rm   rm   rn   r5    s   zDot11WPAData.set_icvc                 C   s   |   ¡ dd… S )úReturn the 'WPA2Data MIC' fieldNr   ©Úget_tail_as_stringr~  rm   rm   rn   Úget_MIC  s   zDot11WPAData.get_MICc                 C   s>   |  dd¡ |dd… }| j ¡ dd… }| j || ¡ dS )úSet the 'WPA2Data MIC' fieldr   r  Nr]  )Úljustr_  Úget_buffer_as_stringÚset_bytes_from_string)r
  r  Úicvrm   rm   rn   Úset_MIC  s   zDot11WPAData.set_MICrf  )	rY   rZ   r[   r‰  r  r2  r5  rU  r[  rm   rm   rm   rn   rQ  ú  s    

rQ  c                   @   sª   e Zd ZdZd)dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ ZdS )*Ú	Dot11WPA2z802.11 WPA2Nc                 C   ri  rj  rk  rl  rm   rm   rn   r  &  rm  zDot11WPA2.__init__c                 C   s&   |   ¡ |  ¡ dB d@ k}| o|  ¡ S )zReturn True if it's a WPA2rY  r  )Úget_PN1Úget_PN0r<  r  rm   rm   rn   Úis_WPA2.  s   zDot11WPA2.is_WPA2c                 C   r9  )zReturn the 'WPA2 extID' fieldr   r
   r   r  r  rm   rm   rn   r<  6  r  zDot11WPA2.get_extIVc                 C   rG  )zSet the 'WPA2 extID' fieldr&  r   r   r
   Nr  r  rm   rm   rn   rH  ;  r!  zDot11WPA2.set_extIVc                 C   r  )zReturn the 'WPA2 KEY ID' fieldr   r   r  r  rm   rm   rn   r!  D  r  zDot11WPA2.get_keyidc                 C   r  )zSet the 'WPA2 KEY ID' fieldrB  r   r   Nr  r  rm   rm   rn   r"  I  r!  zDot11WPA2.set_keyidc                 C   r>  )z"Return 'WPA2 Data' field decryptedr?  r~  rm   rm   rn   r+  R  r@  zDot11WPA2.get_decrypted_datac                 C   rF  )zReturn the 'WPA2 PN0' fieldr   rÛ  r  r  rm   rm   rn   r^  W  r5  zDot11WPA2.get_PN0c                 C   rA  )zSet the 'WPA2 PN0' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_PN0\  rC  zDot11WPA2.set_PN0c                 C   rF  )zReturn the 'WPA2 PN1' fieldr   rÛ  r  r  rm   rm   rn   r]  b  r5  zDot11WPA2.get_PN1c                 C   rA  )zSet the 'WPA2 PN1' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_PN1g  rC  zDot11WPA2.set_PN1c                 C   rF  )zReturn the 'WPA2 PN2' fieldr	   rÛ  r  r  rm   rm   rn   Úget_PN2m  r5  zDot11WPA2.get_PN2c                 C   rA  )zSet the 'WPA2 PN2' fieldrÛ  r	   Nr  rx  rm   rm   rn   Úset_PN2r  rC  zDot11WPA2.set_PN2c                 C   rF  )zReturn the 'WPA2 PN3' fieldr
   rÛ  r  r  rm   rm   rn   Úget_PN3x  r5  zDot11WPA2.get_PN3c                 C   rA  )zSet the 'WPA2 PN3' fieldrÛ  r
   Nr  rx  rm   rm   rn   Úset_PN3}  rC  zDot11WPA2.set_PN3c                 C   rF  )zReturn the 'WPA2 PN4' fieldr   rÛ  r  r  rm   rm   rn   Úget_PN4ƒ  r5  zDot11WPA2.get_PN4c                 C   rA  )zSet the 'WPA2 PN4' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_PN4ˆ  rC  zDot11WPA2.set_PN4c                 C   rF  )zReturn the 'WPA2 PN5' fieldr   rÛ  r  r  rm   rm   rn   Úget_PN5Ž  r5  zDot11WPA2.get_PN5c                 C   rA  )zSet the 'WPA2 PN5' fieldrÛ  r   Nr  rx  rm   rm   rn   Úset_PN5“  rC  zDot11WPA2.set_PN5rf  )rY   rZ   r[   r‰  r  r_  r<  rH  r!  r"  r+  r^  r`  r]  ra  rb  rc  rd  re  rf  rg  rh  ri  rm   rm   rm   rn   r\  #  s*    
		r\  c                   @   r¿  )
ÚDot11WPA2Dataz802.11 WPA2 Data PartNc                 C   ri  )Nr   r   rk  rl  rm   rm   rn   r  œ  rm  zDot11WPA2Data.__init__c                 C   r³  )rR  rS  r~  rm   rm   rn   rU  ¤  s   zDot11WPA2Data.get_MICc                 C   s(   |  dd¡ |dd… }| j |¡ dS )rV  r   r  N)rW  r_  rY  r  rm   rm   rn   r[  ¨  s   zDot11WPA2Data.set_MICrf  )rY   rZ   r[   r‰  r  rU  r[  rm   rm   rm   rn   rj  ™  rÌ  rj  c                   @   s@  e Zd ZdZdZdZG dd„ deƒZG dd„ deƒZG dd„ deƒZ	G d	d
„ d
eƒZ
G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eƒZG d'd(„ d(eƒZG d)d*„ d*eƒZG d+d,„ d,eƒZe ¡ Zejd-d.„ d/� dŸd1d2„Zd3d4„ Z d5d6„ Z!d7d8„ Z"efd9d:„Z#d;d<„ Z$d d=d>„Z%d?d@„ Z&dAdB„ Z'dCdD„ Z(dEdF„ Z)dGdH„ Z*dIdJ„ Z+dKdL„ Z,dMdN„ Z-dOdP„ Z.dQdR„ Z/dSdT„ Z0dUdV„ Z1dWdX„ Z2dYdZ„ Z3d[d\„ Z4d]d^„ Z5d_d`„ Z6dadb„ Z7dcdd„ Z8dedf„ Z9dgdh„ Z:didj„ Z;dkdl„ Z<dmdn„ Z=dodp„ Z>dqdr„ Z?dsdt„ Z@dudv„ ZAdwdx„ ZBdydz„ ZCd{d|„ ZDd}d~„ ZEdd€„ ZFd�d‚„ ZGdƒd„„ ZHd…d†„ ZId‡dˆ„ ZJd‰dŠ„ ZKd‹dŒ„ ZLd�dŽ„ ZMd�d�„ ZNd‘d’„ ZOd“d”„ ZPd•d–„ ZQd—d˜„ ZRd™dš„ ZSd›dœ„ ZTd�dž„ ZUd0S )¡ÚRadioTapr   r	   c                   @   s   e Zd ZdZdd„ ZdS )zRadioTap.__RadioTapFieldr   c                 C   s   t | jjƒS rf  )ÚstrÚ	__class__rY   r~  rm   rm   rn   Ú__str__¸  ó   z RadioTap.__RadioTapField.__str__N)rY   rZ   r[   Ú	ALIGNMENTrn  rm   rm   rm   rn   Ú__RadioTapFieldµ  s    rq  c                   @   ó   e Zd ZdZdZdZdS )zRadioTap.RTF_TSFTr   z<Qr   N©rY   rZ   r[   Ú
BIT_NUMBERÚ	STRUCTURErp  rm   rm   rm   rn   ÚRTF_TSFT»  ó    rv  c                   @   s4   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd	Zd
S )zRadioTap.RTF_FLAGSr   ú<Br   r	   r   r[  rY  r   r.   N)rY   rZ   r[   rt  ru  ÚPROPERTY_CFPÚPROPERTY_SHORTPREAMBLEÚPROPERTY_WEPÚPROPERTY_FRAGMENTATIONÚPROPERTY_FCS_AT_ENDÚPROPERTY_PAYLOAD_PADDINGÚPROPERTY_BAD_FCSÚPROPERTY_SHORT_GIrm   rm   rm   rn   Ú	RTF_FLAGSÀ  s    r�  c                   @   ó   e Zd ZdZdZdS )zRadioTap.RTF_RATEr   rx  N©rY   rZ   r[   rt  ru  rm   rm   rm   rn   ÚRTF_RATEÎ  ó    r„  c                   @   rr  )zRadioTap.RTF_CHANNELr   z<HHr   Nrs  rm   rm   rm   rn   ÚRTF_CHANNELÒ  rw  r†  c                   @   r‚  )zRadioTap.RTF_FHSSr	   z<BBNrƒ  rm   rm   rm   rn   ÚRTF_FHSS×  r…  r‡  c                   @   r‚  )zRadioTap.RTF_DBM_ANTSIGNALr
   rx  Nrƒ  rm   rm   rm   rn   ÚRTF_DBM_ANTSIGNALÛ  r…  rˆ  c                   @   r‚  )zRadioTap.RTF_DBM_ANTNOISEr   rx  Nrƒ  rm   rm   rm   rn   ÚRTF_DBM_ANTNOISEß  r…  r‰  c                   @   rr  )zRadioTap.RTF_LOCK_QUALITYr   ú<Hr   Nrs  rm   rm   rm   rn   ÚRTF_LOCK_QUALITYã  rw  r‹  c                   @   rr  )zRadioTap.RTF_TX_ATTENUATIONr   rŠ  r   Nrs  rm   rm   rm   rn   ÚRTF_TX_ATTENUATIONè  rw  rŒ  c                   @   rr  )zRadioTap.RTF_DB_TX_ATTENUATIONr   rŠ  r   Nrs  rm   rm   rm   rn   ÚRTF_DB_TX_ATTENUATIONí  rw  r�  c                   @   rr  )zRadioTap.RTF_DBM_TX_POWERr   z<br   Nrs  rm   rm   rm   rn   ÚRTF_DBM_TX_POWERò  rw  rŽ  c                   @   r‚  )zRadioTap.RTF_ANTENNAr   rx  Nrƒ  rm   rm   rm   rn   ÚRTF_ANTENNA÷  r…  r�  c                   @   r‚  )zRadioTap.RTF_DB_ANTSIGNALr   rx  Nrƒ  rm   rm   rm   rn   ÚRTF_DB_ANTSIGNALû  r…  r�  c                   @   r‚  )zRadioTap.RTF_DB_ANTNOISEr   rx  Nrƒ  rm   rm   rm   rn   ÚRTF_DB_ANTNOISEÿ  r…  r‘  c                   @   rr  )zRadioTap.RTF_FCS_IN_HEADERr   rK  r	   Nrs  rm   rm   rm   rn   ÚRTF_FCS_IN_HEADER
  rw  r’  c                   @   rr  )zRadioTap.RTF_TX_FLAGSr:  rŠ  r   Nrs  rm   rm   rm   rn   ÚRTF_TX_FLAGS  rw  r“  c                   @   r‚  )zRadioTap.RTF_RTS_RETRIESr[  rx  Nrƒ  rm   rm   rm   rn   ÚRTF_RTS_RETRIES  r…  r”  c                   @   r‚  )zRadioTap.RTF_DATA_RETRIESé   rx  Nrƒ  rm   rm   rm   rn   ÚRTF_DATA_RETRIES&  r…  r–  c                   @   rr  )zRadioTap.RTF_XCHANNELé   z<LHBBr	   Nrs  rm   rm   rm   rn   ÚRTF_XCHANNEL*  rw  r˜  c                   @   s   e Zd ZdZg ZdS )zRadioTap.RTF_EXTé   Nrƒ  rm   rm   rm   rn   ÚRTF_EXT/  r…  rš  c                 C   r>  rf  )rt  )Úxrm   rm   rn   Ú<lambda>5  s    zRadioTap.<lambda>)r(  Nc                 C   sl   | j }d}|r#t d|dd… ¡d }|}t | ||¡ |  |¡ d S t | ||¡ |  d¡ |  d¡ d S )Nr   rŠ  r   r	   )Ú_RadioTap__HEADER_BASE_SIZErM  rO  r   r  r	  rH  Ú_RadioTap__set_present)r
  r  r  r  Úlengthrm   rm   rn   r  7  s   
zRadioTap.__init__c                 C   s   |   ¡  | j dd¡S )z)Return the RadioTap header 'length' fieldr   ro  )Ú_RadioTap__update_header_lengthr  rq  r~  rm   rm   rn   Úget_header_lengthF  s   zRadioTap.get_header_lengthc                 C   s   | j  d¡}|S )zReturn the 'version' fieldr   r  r  rm   rm   rn   rG  K  s   zRadioTap.get_versionc                 C   s"   |d@ }| j  d|¡ |d@ }dS )zSet the 'version' fieldrÛ  r   Nr  rx  rm   rm   rn   rH  P  s   zRadioTap.set_versionc                 C   s   | j  |d¡}|S )z$Return RadioTap present bitmap fieldro  )r  r`  )r
  ÚoffsetÚpresentrm   rm   rn   Úget_presentW  rs  zRadioTap.get_presentc                 C   r  )zSet RadioTap present field bitr	   N)r  rc  r  rm   rm   rn   Ú__set_present\  r€  zRadioTap.__set_presentc                 C   s   |   |¡}d|j |@   S )zGet a 'present' field bitr   )r¤  rt  )r
  Úfieldr¢  r£  rm   rm   rn   Úget_present_bit`  s   
zRadioTap.get_present_bitc                 C   s&   d|j  |  ¡ B }| j d|d¡ dS )zSet a 'present' field bitr   r	   ro  N©rt  r¤  r  rc  ©r
  r¦  Únpresentrm   rm   rn   Ú__set_present_bite  s   zRadioTap.__set_present_bitc                 C   s(   d|j   |  ¡ @ }| j d|d¡ dS )zUnset a 'present' field bitr   r	   ro  Nr¨  r©  rm   rm   rn   Ú__unset_present_bitj  s   zRadioTap.__unset_present_bitc                 C   s   ||d  |d  @ | S )Nr   rm   )r
  ÚvalÚalignrm   rm   rn   Ú__aligno  s   zRadioTap.__alignc                 C   s˜   t j}d}|  t j|¡r|t j7 }|d7 }|  t j|¡s| jt j|  }| jD ]"}||  ||j¡7 }||kr:|  S |  |¡rIt	 
|j¡}||7 }q'd S )Nr   r   )rk  Ú_BASE_PRESENT_FLAGS_OFFSETr§  rš  Ú_PRESENT_FLAGS_SIZEr�  Úradiotap_fieldsÚ_RadioTap__alignrp  rM  Úcalcsizeru  )r
  r¦  r¢  Úextra_present_flags_countÚfield_positionÚfÚtotal_lengthrm   rm   rn   Ú__get_field_positionr  s    
þ

€zRadioTap.__get_field_positionc                 C   sp   |   |¡}|du rdS |  |¡}|sdS |  |¡ |  ¡ }t |j¡}|d |… ||| d …  }|  |¡ d S ©NF)r§  Ú_RadioTap__get_field_positionÚ_RadioTap__unset_present_bitÚget_header_as_stringrM  r´  ru  Úload_header)r
  r¦  Ú
is_presentÚbyte_posr  r¸  rm   rm   rn   Úunset_field‡  s   


zRadioTap.unset_fieldc                 C   sV   |   |¡}|du rd S |  |¡}|  ¡ }t |j¡}|||| … }t |j|¡}|S rº  )r§  r»  r½  rM  r´  ru  rO  )r
  r¦  r¿  rÀ  r  r¸  ÚvÚfield_valuesrm   rm   rn   Ú__get_field_values˜  s   

zRadioTap.__get_field_valuesc           	      C   sö   t |dƒs	tdƒ‚td dd„ |jD ƒ¡ƒ}t|ƒ|kr*tdt|ƒt |j¡f ƒ‚|  |¡}|du r8|  	|¡ |  
|¡}|  ¡ }t |j¡}tj|jg|¢R Ž }|du rf|d |… | ||| d …  }n|d |… | ||d …  }|  |¡ d S )	NÚ__iter__zarg 'values' is not iterableÚ c                 s   s   � | ]	}|d vr|V  qdS )z=@!<>Nrm   )Ú.0Úcrm   rm   rn   Ú	<genexpr>«  s   € z.RadioTap.__set_field_values.<locals>.<genexpr>zField %s has exactly %d itemsFT)ÚhasattrÚ	Exceptionr$  Újoinru  rl  rM  r´  r§  Ú_RadioTap__set_present_bitr»  r½  rN  r¾  )	r
  r¦  ÚvaluesÚ
num_fieldsr¿  rÀ  r  r¸  Únew_strrm   rm   rn   Ú__set_field_values¦  s    



"zRadioTap.__set_field_valuesc                 C   s   |   tj|g¡ dS )zŽSet the Value in microseconds of the MAC's 64-bit 802.11 Time Synchronization Function timer when the first bit of the MPDU arrived at the MACN)Ú_RadioTap__set_field_valuesrk  rv  ©r
  Únvaluerm   rm   rn   Úset_tsftÁ  ó   zRadioTap.set_tsftc                 C   s   |   tj¡}|s
dS |d S )zŽGet the Value in microseconds of the MAC's 64-bit 802.11 Time Synchronization Function timer when the first bit of the MPDU arrived at the MACNr   )Ú_RadioTap__get_field_valuesrk  rv  ©r
  rÎ  rm   rm   rn   Úget_tsftÇ  ó   zRadioTap.get_tsftc                 C   ó   |   | j|g¡ dS )z6Set the properties of transmitted and received frames.N)rÒ  r�  rÓ  rm   rm   rn   Ú	set_flagsÑ  r  zRadioTap.set_flagsc                 C   ó   |   | j¡}|s
dS |d S )z6Get the properties of transmitted and received frames.Nr   )r×  r�  rØ  rm   rm   rn   Ú	get_flagsÕ  s   zRadioTap.get_flagsc                 C   rÛ  )z)Set the TX/RX data rate in 500 Kbps unitsN)rÒ  r„  rÓ  rm   rm   rn   Úset_rateÜ  ó   zRadioTap.set_ratec                 C   rÝ  )ú)Get the TX/RX data rate in 500 Kbps unitsNr   )r×  r„  rØ  rm   rm   rn   Úget_rateá  ó   zRadioTap.get_ratec                 C   ó   |   | j||g¡ dS )z<Set the channel Tx/Rx frequency in MHz and the channel flagsN)rÒ  r†  )r
  ÚfreqÚflagsrm   rm   rn   Úset_channelé  ó   zRadioTap.set_channelc                 C   ó   |   | j¡}|S )rá  )r×  r†  rØ  rm   rm   rn   Úget_channelî  ó   zRadioTap.get_channelc                 C   rä  )z8Set the hop set and pattern for frequency-hopping radiosN)rÒ  r‡  )r
  Úhop_setÚhop_patternrm   rm   rn   Úset_FHSSõ  rè  zRadioTap.set_FHSSc                 C   ré  )z8Get the hop set and pattern for frequency-hopping radios)r×  r‡  rØ  rm   rm   rn   Úget_FHSSú  rë  zRadioTap.get_FHSSc                 C   rÛ  ©z^Set the RF signal power at the antenna, decibel difference from an arbitrary, fixed reference.N)rÒ  rˆ  ©r
  Úsignalrm   rm   rn   Úset_dBm_ant_signal  rÖ  zRadioTap.set_dBm_ant_signalc                 C   rÝ  ©z^Get the RF signal power at the antenna, decibel difference from an arbitrary, fixed reference.Nr   )r×  rˆ  rØ  rm   rm   rn   Úget_dBm_ant_signal  ó   zRadioTap.get_dBm_ant_signalc                 C   rÛ  ©z]Set the RF noise power at the antenna, decibel difference from an arbitrary, fixed reference.N)rÒ  r‰  rñ  rm   rm   rn   Úset_dBm_ant_noise  rÖ  zRadioTap.set_dBm_ant_noisec                 C   rÝ  ©z]Get the RF noise power at the antenna, decibel difference from an arbitrary, fixed reference.Nr   )r×  r‰  rØ  rm   rm   rn   Úget_dBm_ant_noise  rö  zRadioTap.get_dBm_ant_noisec                 C   rÛ  )zLSet the quality of Barker code lock. Called 'Signal Quality' in datasheets. N)rÒ  r‹  )r
  Úqualityrm   rm   rn   Úset_lock_quality  rÖ  zRadioTap.set_lock_qualityc                 C   rÝ  )zLGet the quality of Barker code lock. Called 'Signal Quality' in datasheets. Nr   )r×  r‹  rØ  rm   rm   rn   Úget_lock_quality%  rö  zRadioTap.get_lock_qualityc                 C   rÛ  )úpSet the transmit power expressed as unitless distance from max power set at factory calibration. 0 is max power.N)rÒ  rŒ  ©r
  Úpowerrm   rm   rn   Úset_tx_attenuation.  rÖ  zRadioTap.set_tx_attenuationc                 C   rÝ  )rþ  Nr   )r×  rŒ  rØ  rm   rm   rn   Úget_tx_attenuation4  rö  zRadioTap.get_tx_attenuationc                 C   rÛ  )úpSet the transmit power expressed as decibel distance from max power set at factory calibration. 0 is max power. N)rÒ  r�  rÿ  rm   rm   rn   Úset_dB_tx_attenuation=  rÖ  zRadioTap.set_dB_tx_attenuationc                 C   rÝ  )r  Nr   )r×  r�  rØ  rm   rm   rn   Úget_dB_tx_attenuationC  rö  zRadioTap.get_dB_tx_attenuationc                 C   rÛ  )z�Set the transmit power expressed as dBm (decibels from a 1 milliwatt reference). This is the absolute power level measured at the antenna port.N)rÒ  rŽ  rÿ  rm   rm   rn   Úset_dBm_tx_powerL  s   zRadioTap.set_dBm_tx_powerc                 C   rÝ  )z�Get the transmit power expressed as dBm (decibels from a 1 milliwatt reference). This is the absolute power level measured at the antenna port.Nr   )r×  rŽ  rØ  rm   rm   rn   Úget_dBm_tx_powerS  rÚ  zRadioTap.get_dBm_tx_powerc                 C   rÛ  )úISet Rx/Tx antenna index for this packet. The first antenna is antenna 0. N)rÒ  r�  )r
  Úantenna_indexrm   rm   rn   Úset_antenna]  rÖ  zRadioTap.set_antennac                 C   rÝ  )r  Nr   )r×  r�  rØ  rm   rm   rn   Úget_antennac  rö  zRadioTap.get_antennac                 C   rÛ  rð  )rÒ  r�  rñ  rm   rm   rn   Úset_dB_ant_signall  rÖ  zRadioTap.set_dB_ant_signalc                 C   rÝ  rô  )r×  r�  rØ  rm   rm   rn   Úget_dB_ant_signalr  rö  zRadioTap.get_dB_ant_signalc                 C   rÛ  r÷  )rÒ  r‘  rñ  rm   rm   rn   Úset_dB_ant_noise{  rÖ  zRadioTap.set_dB_ant_noisec                 C   rÝ  rù  )r×  r‘  rØ  rm   rm   rn   Úget_dB_ant_noise�  rö  zRadioTap.get_dB_ant_noisec                 C   rÛ  )zySet the Field containing the FCS of the frame (instead of it being appended to the frame as it would appear on the air.) N)rÒ  r’  )r
  Úfcsrm   rm   rn   Úset_FCS_in_header—  rÖ  zRadioTap.set_FCS_in_headerc                 C   rÝ  )zyGet the Field containing the FCS of the frame (instead of it being appended to the frame as it would appear on the air.) Nr   )r×  r’  rØ  rm   rm   rn   Úget_FCS_in_header�  rö  zRadioTap.get_FCS_in_headerc                 C   rÛ  )z7Set the number of RTS retries a transmitted frame used.N)rÒ  r”  ©r
  Úretriesrm   rm   rn   Úset_RTS_retries²  rà  zRadioTap.set_RTS_retriesc                 C   rÝ  )z7Get the number of RTS retries a transmitted frame used.Nr   )r×  r”  rØ  rm   rm   rn   Úget_RTS_retries·  rã  zRadioTap.get_RTS_retriesc                 C   rÛ  )z)Set the properties of transmitted frames.N)rÒ  r“  )r
  ræ  rm   rm   rn   Úset_tx_flags¿  rà  zRadioTap.set_tx_flagsc                 C   rÝ  )z)Get the properties of transmitted frames.Nr   )r×  r“  rØ  rm   rm   rn   Úget_tx_flagsÄ  rã  zRadioTap.get_tx_flagsc                 C   s   |   | j||||g¡ dS )zCSet extended channel information: flags, freq, channel and maxpowerN)rÒ  r˜  )r
  ræ  rå  ÚchannelÚmaxpowerrm   rm   rn   Úset_xchannelÌ  s   zRadioTap.set_xchannelc                 C   s   | j | jd�}|S )zCGet extended channel information: flags, freq, channel and maxpower)r¦  )r×  r˜  rØ  rm   rm   rn   Úget_xchannelÑ  s   zRadioTap.get_xchannelc                 C   rÛ  )z8Set the number of data retries a transmitted frame used.N)rÒ  r–  r  rm   rm   rn   Úset_data_retriesØ  rà  zRadioTap.set_data_retriesc                 C   rÝ  )z8Get the number of data retries a transmitted frame used.Nr   )r×  r–  rØ  rm   rm   rn   Úget_data_retriesÝ  rã  zRadioTap.get_data_retriesc                 C   rÛ  )z,Set the hardware queue to send the frame on.N)rÒ  ÚRTF_HARDWARE_QUEUE)r
  Úqueuerm   rm   rn   Úset_hardware_queueå  rà  zRadioTap.set_hardware_queuec                 C   s   | j  d|  ¡ d¡ dS )z:Update the RadioTap header length field with the real sizer   ro  N)r  rw  Úget_header_sizer~  rm   rm   rn   Ú__update_header_lengthò  s   zRadioTap.__update_header_lengthc                 C   s   |   ¡  t | ¡S rf  )r   r   Ú
get_packetr~  rm   rm   rn   r$  ö  s   
zRadioTap.get_packetrf  )r	   )VrY   rZ   r[   r�  r±  r°  ÚobjectÚ_RadioTap__RadioTapFieldrv  r�  r„  r†  r‡  rˆ  r‰  r‹  rŒ  r�  rŽ  r�  r�  r‘  r’  r“  r”  r–  r˜  rš  Ú__subclasses__r²  Úsortr  r¡  rG  rH  r¤  rž  r§  rÍ  r¼  r³  r»  rÁ  r×  rÒ  rÕ  rÙ  rÜ  rÞ  rß  râ  rç  rê  rî  rï  ró  rõ  rø  rú  rü  rý  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r   r$  rm   rm   rm   rn   rk  °  s¤    



					
		rk  c                   @   r›  )&ÚDot11ManagementFramez802.11 Management FrameNc                 C   ri  r�  rk  rl  rm   rm   rn   r  ý  rm  zDot11ManagementFrame.__init__c                 C   rn  )z/Return 802.11 Management frame 'Duration' fieldr   ro  rp  r  rm   rm   rn   rr    rs  z!Dot11ManagementFrame.get_durationc                 C   rt  )z0Set the 802.11 Management frame 'Duration' fieldru  r   ro  Nrv  rx  rm   rm   rn   ry  
  rz  z!Dot11ManagementFrame.set_durationc                 C   r{  )zMReturn 802.11 Management frame 'Destination Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   Úget_destination_address  r€  z,Dot11ManagementFrame.get_destination_addressc                 C   r�  )zJSet 802.11 Management frame 'Destination Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Úset_destination_address  r‡  z,Dot11ManagementFrame.set_destination_addressc                 C   r{  )zHReturn 802.11 Management frame 'Source Address' field as a 6 bytes arrayr   r   r|  r~  rm   rm   rn   Úget_source_address  r€  z'Dot11ManagementFrame.get_source_addressc                 C   r�  )zESet 802.11 Management frame 'Source Address' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   Úset_source_address  r‡  z'Dot11ManagementFrame.set_source_addressc                 C   r{  )z?Return 802.11 Management frame 'BSSID' field as a 6 bytes arrayr   r£  r|  r~  rm   rm   rn   r–  "  r€  zDot11ManagementFrame.get_bssidc                 C   r�  )z<Set 802.11 Management frame 'BSSID' field as a 6 bytes arrayr   r   r   Nr‚  r„  rm   rm   rn   r—  &  r‡  zDot11ManagementFrame.set_bssidc                 C   rn  )z7Return 802.11 Management frame 'Sequence Control' fieldr£  ro  rp  r  rm   rm   rn   r¦  +  rs  z)Dot11ManagementFrame.get_sequence_controlc                 C   rt  )z8Set the 802.11 Management frame 'Sequence Control' fieldru  r£  ro  Nrv  rx  rm   rm   rn   r§  0  rz  z)Dot11ManagementFrame.set_sequence_controlc                 C   s   |   ¡ }|d@ S )z9Return 802.11 Management frame 'Fragment Number' subfieldr:  ©r¦  r  rm   rm   rn   r¨  6  s   z(Dot11ManagementFrame.get_fragment_numberc                 C   r©  )z:Set the 802.11 Management frame 'Fragment Number' subfieldrª  r£  ro  r:  Nr«  r  rm   rm   rn   r¬  <  r­  z(Dot11ManagementFrame.set_fragment_numberc                 C   s   |   ¡ }|d? d@ S )z9Return 802.11 Management frame 'Sequence Number' subfieldr	   r®  r.  r  rm   rm   rn   r¯  E  s   z(Dot11ManagementFrame.get_sequence_numberc                 C   r°  )z:Set the 802.11 Management frame 'Sequence Number' subfieldr:  r£  ro  r®  r	   Nr«  r  rm   rm   rn   r±  K  r²  z(Dot11ManagementFrame.set_sequence_numberc                 C   r³  )z1Return 802.11 Management frame 'Frame Body' fieldr´  r~  rm   rm   rn   rµ  T  r¶  z#Dot11ManagementFrame.get_frame_bodyc                 C   r·  )z.Set 802.11 Management frame 'Frame Body' fieldNr¸  rº  rm   rm   rn   r¼  Y  r½  z#Dot11ManagementFrame.set_frame_bodyrf  )rY   rZ   r[   r‰  r  rr  ry  r*  r+  r,  r-  r–  r—  r¦  r§  r¨  r¬  r¯  r±  rµ  r¼  rm   rm   rm   rn   r)  ú  r¾  r)  c                   @   s˜   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$S )%ÚDOT11_MANAGEMENT_ELEMENTSr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r:  r[  rY  é!   r   é#   r   é%   r   é'   r   é)   r   é+   r   r   r   é2   r  éÝ   N)&rY   rZ   r[   ÚSSIDÚSUPPORTED_RATESÚFH_PARAMETER_SETÚDS_PARAMETER_SETÚCF_PARAMETER_SETÚTIMÚIBSS_PARAMETER_SETÚCOUNTRYÚHOPPING_PARAMETERÚHOPPING_TABLEÚREQUESTÚBSS_LOADÚEDCA_PARAMETER_SETÚTSPECÚTCLASÚSCHEDULEÚCHALLENGE_TEXTÚPOWER_CONSTRAINTÚPOWER_CAPABILITYÚTPC_REQUESTÚ
TPC_REPORTÚSUPPORTED_CHANNELSÚCHANNEL_SWITCH_ANNÚMEASURE_REQÚMEASURE_REPÚQUIETÚIBSS_DFSÚERP_INFOÚTS_DELAYÚTCLAS_PROCESSINGÚQOS_CAPABILITYÚRSNÚEXT_SUPPORTED_RATESÚEXTENDED_CAPABILITIESÚVENDOR_SPECIFICrm   rm   rm   rn   r/  ^  sH    r/  c                   @   sJ   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zddd„Zddd„Z	dS )ÚDot11ManagementHelperNc                 C   sT   || _ |r!|  || j d … ¡}||7 }t | ||¡ |  |¡ d S t | ||¡ d S rf  )Ú(_Dot11ManagementHelper__HEADER_BASE_SIZEÚ1_Dot11ManagementHelper__calculate_elements_lengthr   r  r	  )r
  r  r  r  Úelements_lengthrm   rm   rn   r  Œ  s   zDot11ManagementHelper.__init__c                 c   s�   � t |ƒ}d}|dkr@t d|||d … ¡\}}|d u rn||kr*d||d fV  |d7 }||7 }||kr8|}||8 }|dksd|d fV  d S )Nr   z!BBr   éÿÿÿÿ)r$  rM  rO  )r
  ÚelementsÚ
element_idÚ	remainingr¢  ÚidrŸ  rm   rm   rn   Ú_find_element˜  s    €õz#Dot11ManagementHelper._find_elementc                 C   s2   |   |d ¡}t|ƒ\}}}|dkrtd| ƒ‚|S )Nr_  zInternal Error %s)rd  ÚnextrË  )r
  r`  Úgen_tpÚmatchr¢  rŸ  rm   rm   rn   Ú__calculate_elements_length«  s
   z1Dot11ManagementHelper.__calculate_elements_lengthc           
      c   s`   � |   ¡ | jd … }|  ||¡}	 t|ƒ\}}}|dkrd S |d }|| }|||… }	|	V  q)NTr   r   )r½  r\  rd  re  )
r
  ra  r`  rf  rg  r¢  rŸ  Úvalue_offsetÚ	value_endr  rm   rm   rn   Ú_get_elements_generator³  s   €ùz-Dot11ManagementHelper._get_elements_generatorc                 C   s>   |   |¡}zt|ƒ}|d u rtdƒ‚|W S  ty   Y d S w )Nz1gen_get_element salio con None in _get_element!!!)rk  re  rË  ÚStopIteration)r
  ra  Úgen_get_elementÚsrm   rm   rn   Ú_get_element¿  s   
ýz"Dot11ManagementHelper._get_elementFc                 C   sŒ   |   ¡ }|| jd … }|  ||¡}d}	 t|ƒ\}}}	|dkr n| j| }
|d |
… ||
|	 d …  }d}|du r:nq|s?dS |  |¡ dS )NFTr   )r½  r\  rd  re  r¾  )r
  ra  Úmultipler  r`  rf  Úfoundrg  r¢  rŸ  Ústartrm   rm   rn   Údelete_elementÍ  s$   
ø

z$Dot11ManagementHelper.delete_elementTc                 C   sÔ   t  dt|ƒ |t|ƒ|¡}|  ¡ }|| jd … }|  ||¡}d}	 t|ƒ\}	}
}| j|
 }|	dkrG|rG|d |… | ||| d …  }d}n|	dkr\|d |… | ||d …  }d}n	 |sc|| }|  |¡ d S )NzBB%dsFTr   )rM  rN  r$  r½  r\  rd  re  r¾  )r
  ra  r  ÚreplaceÚ	parameterr  r`  rf  rq  rg  r¢  rŸ  rr  rm   rm   rn   Ú_set_elementâ  s(   
 z"Dot11ManagementHelper._set_elementrf  ©F)T)
rY   rZ   r[   r  rd  r]  rk  ro  rs  rv  rm   rm   rm   rn   r[  Š  s    

r[  c                   @   sÀ   e Zd ZdZdZd/dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd0dd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdS )1ÚDot11ManagementBeaconz802.11 Management Beacon Framer   Nc                 C   ó   | j }d}t | |||¡ d S ©Nr   )Ú(_Dot11ManagementBeacon__HEADER_BASE_SIZEr[  r  rl  rm   rm   rn   r  	  ó   zDot11ManagementBeacon.__init__c                 C   rn  )z;Return the 802.11 Management Beacon frame 'Timestamp' fieldr   ro  )r  Úget_long_longr  rm   rm   rn   Úget_timestamp	  rs  z#Dot11ManagementBeacon.get_timestampc                 C   rt  )z8Set the 802.11 Management Beacon frame 'Timestamp' fieldl   ÿÿÿÿ r   ro  N)r  Úset_long_longrx  rm   rm   rn   Úset_timestamp	  rz  z#Dot11ManagementBeacon.set_timestampc                 C   rn  )z�Return the 802.11 Management Beacon frame 'Beacon Interval' fieldTo convert it to seconds =>  secs = Beacon_Interval*1024/1000000r   ro  rp  r  rm   rm   rn   Úget_beacon_interval	  r”  z)Dot11ManagementBeacon.get_beacon_intervalc                 C   rt  )z>Set the 802.11 Management Beacon frame 'Beacon Interval' fieldru  r   ro  Nrv  rx  rm   rm   rn   Úset_beacon_interval	  rz  z)Dot11ManagementBeacon.set_beacon_intervalc                 C   rn  )zJReturn the 802.11 Management Beacon frame 'Capability information' field. r   ro  rp  r  rm   rm   rn   Úget_capabilities	  r3  z&Dot11ManagementBeacon.get_capabilitiesc                 C   rt  )zESet the 802.11 Management Beacon frame 'Capability Information' fieldru  r   ro  Nrv  rx  rm   rm   rn   Úset_capabilities%	  rz  z&Dot11ManagementBeacon.set_capabilitiesc                 C   ó   |   tj¡S ©zbGet the 802.11 Management SSID element. The SSID element indicates the identity of an ESS or IBSS.©ro  r/  r8  r~  rm   rm   rn   Úget_ssid+	  ó   zDot11ManagementBeacon.get_ssidc                 C   ó   |   tj|¡ d S rf  ©rv  r/  r8  ©r
  Ússidrm   rm   rn   Úset_ssid0	  ó   zDot11ManagementBeacon.set_ssidFc                 C   óJ   |   tj¡}|du rdS t dt|ƒ |¡}|s|S tdd„ |D ƒƒ}|S )úñGet the 802.11 Management Supported Rates element. Specifies up to eight rates, then an Extended Supported Rate element shall be generated to specify the remaining supported rates.If human_readable is True, the rates are returned in Mbit/secNú%dBc                 S   ó   g | ]}|d @ d ‘qS ©r  g      à?rm   ©rÇ  r›  rm   rm   rn   Ú
<listcomp>@	  ó    z=Dot11ManagementBeacon.get_supported_rates.<locals>.<listcomp>©ro  r/  r9  rM  rO  r$  Útuple©r
  Úhuman_readablern  ÚratesÚ	rates_Mbsrm   rm   rn   Úget_supported_rates3	  ó   z)Dot11ManagementBeacon.get_supported_ratesc                 C   ó@   t |ƒ}|dkrtdƒ‚tjd| g|¢R Ž }|  tj|¡ dS ©zÉSet the 802.11 Management Supported Rates element. Specifies a tuple or list with up to eight rates, then an Extended Supported Rate element shall be generated to specify the remaining supported rates.r   zrequires up to eight ratesÚBN©r$  rË  rM  rN  rv  r/  r9  ©r
  rœ  Ú	qty_ratesÚrates_stringrm   rm   rn   Úset_supported_ratesC	  ó
   z)Dot11ManagementBeacon.set_supported_ratesc                 C   ó*   |   tj¡}|du rdS t d|¡\}|S )zŠGet the 802.11 Management DS Parameter set element. Contains information to allow channel number identification for STAs using a DSSS PHY.Nr¢  )ro  r/  r;  rM  rO  )r
  rn  Úchrm   rm   rn   Úget_ds_parameter_setN	  s
   z*Dot11ManagementBeacon.get_ds_parameter_setc                 C   ó   t  d|¡}|  tj|¡ dS )zŠSet the 802.11 Management DS Parameter set element. Contains information to allow channel number identification for STAs using a DSSS PHY.r¢  N)rM  rN  rv  r/  r;  )r
  r  Úchannel_stringrm   rm   rn   Úset_ds_parameter_setZ	  s   z*Dot11ManagementBeacon.set_ds_parameter_setc                 C   ó   |   tj¡}|du rdS |S ©z:Get the 802.11 Management Robust Security Network element.N©ro  r/  rW  ©r
  rn  rm   rm   rn   Úget_rsna	  ó   zDot11ManagementBeacon.get_rsnc                 C   ó   |   tj|¡ dS ©z:Set the 802.11 Management Robust Security Network element.N©rv  r/  rW  rº  rm   rm   rn   Úset_rsnh	  r€  zDot11ManagementBeacon.set_rsnc                 C   r©  )zFGet the 802.11 Management ERP (extended rate PHY) Information element.Nr¢  )ro  r/  rS  rM  rO  )r
  rn  Úerprm   rm   rn   Úget_erpl	  s
   zDot11ManagementBeacon.get_erpc                 C   r¬  )zGSet the 802.11 Management ERP (extended rate PHY) Inforamation element.r¢  N)rM  rN  rv  r/  rS  )r
  r¹  Ú
erp_stringrm   rm   rn   Úset_erpv	  s   zDot11ManagementBeacon.set_erpc                 C   sB   |   tj¡}|du rdS t d|¡\}}}}| d¡}||||fS )zœGet the 802.11 Management Country element.Returns a tuple containing Country code, first channel number, number of channels and maximum transmit power levelNÚ3sBBBú )ro  r/  r?  rM  rO  Ústrip)r
  rn  ÚcodeÚfirstÚnumÚmaxrm   rm   rn   Úget_country|	  s   
z!Dot11ManagementBeacon.get_countryc                 C   sL   t |ƒdkr
tdƒ‚|ddt |ƒ  7 }t d||||¡}|  tj|¡ dS )z*Set the 802.11 Management Country element.r   z'Country code must be up to 3 bytes longr¾  r½  N)r$  rË  rM  rN  rv  r/  r?  )r
  rÀ  Úfirst_channelÚnumber_of_channelsÚ	max_powerÚcountry_stringrm   rm   rn   Úset_countryˆ	  s   
ÿz!Dot11ManagementBeacon.set_countryc                 C   ój   	 g }|   tj¡}z!	 t|ƒ}|du rtdƒ‚|dd… }|dd… }| ||f¡ q ty4   Y |S w ©zGGet the 802.11 Management Vendor Specific elements as a list of tuples.r   Nz!gen_get_element salio con None!!!r   ©rk  r/  rZ  re  rË  Úappendrl  ©r
  Úvsrm  rn  r  r»  rm   rm   rn   Úget_vendor_specific”	  ó    ÷
ýz)Dot11ManagementBeacon.get_vendor_specificc                 C   óN   d}t |ƒ}||krtd| ƒ‚t |ƒdkrtdƒ‚| jtj|| dd� dS ©z²Set the 802.11 Management Vendor Specific element. The Vendor Specific information element is used to carry information not defined in the standard within a single defined formatrD  zdata allow up to %d bytes longr   zoui is three bytes longF)rt  N©r$  rË  rv  r/  rZ  ©r
  r  r»  Úmax_data_lenÚdata_lenrm   rm   rn   Úadd_vendor_specific­	  ó   z)Dot11ManagementBeacon.add_vendor_specificrf  rw  )rY   rZ   r[   r‰  r{  r  r~  r€  r�  r‚  rƒ  r„  rˆ  rŽ  rž  r§  r«  r®  r³  r¸  rº  r¼  rÄ  rÉ  rÐ  rØ  rm   rm   rm   rn   rx  ý  s0    


rx  c                   @   s<   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„Zdd„ ZdS )ÚDot11ManagementProbeRequestz%802.11 Management Probe Request FrameNc                 C   s   d}d}t  | |||¡ d S rz  )r[  r  rl  rm   rm   rn   r  Á	  s   z$Dot11ManagementProbeRequest.__init__c                 C   r…  r†  r‡  r~  rm   rm   rn   rˆ  Æ	  r‰  z$Dot11ManagementProbeRequest.get_ssidc                 C   rŠ  rf  r‹  rŒ  rm   rm   rn   rŽ  Ë	  r�  z$Dot11ManagementProbeRequest.set_ssidFc                 C   r�  )r‘  Nr’  c                 S   r“  r”  rm   r•  rm   rm   rn   r–  Û	  r—  zCDot11ManagementProbeRequest.get_supported_rates.<locals>.<listcomp>r˜  rš  rm   rm   rn   rž  Î	  rŸ  z/Dot11ManagementProbeRequest.get_supported_ratesc                 C   r   r¡  r£  r¤  rm   rm   rn   r§  Þ	  r¨  z/Dot11ManagementProbeRequest.set_supported_ratesrf  rw  )	rY   rZ   r[   r‰  r  rˆ  rŽ  rž  r§  rm   rm   rm   rn   rÚ  ¾	  s    

rÚ  c                   @   ó   e Zd ZdZddd„ZdS )ÚDot11ManagementProbeResponsez&802.11 Management Probe Response FrameNc                 C   ó   t  | |¡ d S rf  )rx  r  ©r
  r  rm   rm   rn   r  ì	  ó   z%Dot11ManagementProbeResponse.__init__rf  ©rY   rZ   r[   r‰  r  rm   rm   rm   rn   rÜ  é	  ó    rÜ  c                   @   sŒ   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!S )"ÚDOT11_REASON_CODESr   r   r   r	   r
   r   r   r   r   r   r   r   r   r:  r[  r•  r—  é   r£  é   rž  é   rÁ  rY  r0  r   r1  r   r2  r   r3  é-   N)#rY   rZ   r[   ÚUNSPECIFIED_REASONÚPREV_AUTH_NO_LONGER_VALIDÚDEAUTH_STA_IS_LEAVINGÚDISASS_DUE_TO_INACTIVITYÚDISASS_AP_UNABLE_HANDLE_ALL_STAÚ"C2_FRAME_FROM_NONAUTHENTICATED_STAÚC3_FRAME_FROM_NONASSOCIATED_STAÚDISSASS_STA_IS_LEAVINGÚSTA_REQ_NOT_AUTH_STAÚ!DISASS_POWER_CAP_IE_UNNACCEPTABLEÚDISASS_SUP_CH_IE_UNNACCEPTABLEÚ
INVALID_IEÚMIC_FAILUREÚFOUR_WAY_HANDSHAKE_TIMEOUTÚGROUP_KEY_HANDSHAKE_TIMEOUTÚIE_FOUR_WAY_HANDSHAKE_DIFFERENTÚINVALID_GROUP_CIPHERÚINVALID_PAIRWISE_CIPHERÚINVALID_AKMPÚUNSUPPORTED_RSN_IE_VERSIONÚINVALID_RSN_IE_CAPÚX_AUTH_FAILEDÚ%CIPHER_SUITE_REJECTED_SECURITY_POLICYÚDISASS_QOS_RELATED_REASONÚ!DISASS_QOS_UNSUFFICIENT_BANDWIDTHÚ#DISASS_EXCESSIVE_FRAMES_WITHOUT_ACKÚDISASS_STA_TX_OUTSIDE_TXOPSÚREQ_STA_LEAVINGÚREQ_STA_NOT_WANT_MECHANISMÚ#REQ_STA_RECV_FRAMES_WHICH_SETUP_REQÚREQ_STA_DUE_TIMEOUTÚSTA_NOT_SUPPORT_CIPHER_SUITErm   rm   rm   rn   râ  ï	  sB    râ  c                   @   r¿  )
ÚDot11ManagementDeauthenticationz(802.11 Management Deauthentication FrameNc                 C   s:   d}d}|rt  | ||¡ |  |¡ d S t  | ||¡ d S )Nr   r   rk  rl  rm   rm   rn   r  
  s   z(Dot11ManagementDeauthentication.__init__c                 C   r  )zBGet the 802.11 Management Deauthentication or Disassociation Code.r   ro  rp  r~  rm   rm   rn   Úget_reason_code!
  r  z/Dot11ManagementDeauthentication.get_reason_codec                 C   s   | j  d|d¡ d S )Nr   ro  rv  )r
  Úrcrm   rm   rn   Úset_reason_code%
  s   z/Dot11ManagementDeauthentication.set_reason_coderf  )rY   rZ   r[   r‰  r  r  r
  rm   rm   rm   rn   r  
  s
    
	r  c                   @   r‚  )ÚDOT11_AUTH_ALGORITHMSr   r   N)rY   rZ   r[   ÚOPENÚ
SHARED_KEYrm   rm   rm   rn   r  (
  r…  r  c                   @   s¤   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'S )(ÚDOT11_AUTH_STATUS_CODESr   r   r   r   r   r   r   r:  r[  r•  r—  rã  r£  rä  rž  rå  rÁ  é   é   rY  r0  r   r1  r2  r   r3  r   r4  r   r5  r   ræ  r   é/   r   é1   r6  é3   N))rY   rZ   r[   Ú
SUCCESSFULÚUNSPECIFIED_FAILUREÚCAP_REQ_UNSUPPORTEDÚ&REASS_DENIED_CANNOT_CONFIRM_ASS_EXISTSÚ(ASS_DENIED_REASON_OUTSIDE_SCOPE_STANDARDÚSTA_NOT_SUPPORT_AUTH_ALGORITHMÚAUTH_SEQ_OUT_OF_EXPECTEDÚAUTH_REJECTED_CHALLENGE_FAILUREÚAUTH_REJECTED_TIMEOUTÚ$ASS_DENIED_AP_UNABLE_HANDLE_MORE_STAÚ(ASS_DENIED_STA_NOT_SUPPORTING_DATA_RATESÚ,ASS_DENIED_STA_NOT_SUPPORTING_SHORT_PREAMBLEÚ-ASS_DENIED_STA_NOT_SUPPORTING_PBCC_MODULATIONÚ-ASS_DENIED_STA_NOT_SUPPORTING_CHANNEL_AGILITYÚ%ASS_REQUEST_REJECTED_SPACTRUM_MGT_CAPÚ/ASS_REQUEST_REJECTED_POWER_CAP_IE_UNNACCEPTABLEÚ,ASS_REQUEST_REJECTED_SUP_CH_IE_UNNACCEPTABLEÚ-ASS_DENIED_STA_NOT_SUPPORTING_SHORT_SLOT_TIMEÚ'ASS_DENIED_STA_NOT_SUPPORTING_DSSS_OFDMÚUNSPECIFIED_QOSÚ%ASS_DENIED_QOS_UNSUFFICIENT_BANDWIDTHÚASS_DENIED_EXCESSIVE_FRAME_LOSTÚASS_DENIED_STA_NOT_SUPPORT_QOSÚREQ_HAS_BEEN_DECLINEDÚ&REQ_NOT_SUCCESSFUL_PARAM_INVALID_VALUErE  rò  r÷  rø  rù  rú  rû  rý  ÚTS_NOT_CREATEDÚ"DIRECT_LINK_NOT_ALLOWED_BSS_POLICYÚDST_STA_NOT_PRESENT_IN_BSSÚDST_STA_NOT_QOS_STAÚ$ASS_DENIED_LISTEN_INTERVAL_TOO_LARGErm   rm   rm   rn   r  ,
  sN    r  c                   @   sn   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚDot11ManagementAuthenticationz&802.11 Management Authentication Framer   Nc                 C   ry  rz  )Ú0_Dot11ManagementAuthentication__HEADER_BASE_SIZEr[  r  rl  rm   rm   rn   r  ]
  r|  z&Dot11ManagementAuthentication.__init__c                 C   r  )z3Get the 802.11 Management Authentication Algorithm.r   ro  rp  r~  rm   rm   rn   Úget_authentication_algorithmb
  r  z:Dot11ManagementAuthentication.get_authentication_algorithmc                 C   r  )z3Set the 802.11 Management Authentication Algorithm.r   ro  Nrv  )r
  Ú	algorithmrm   rm   rn   Úset_authentication_algorithmf
  r  z:Dot11ManagementAuthentication.set_authentication_algorithmc                 C   r  )z2Get the 802.11 Management Authentication Sequence.r   ro  rp  r~  rm   rm   rn   Úget_authentication_sequencej
  r  z9Dot11ManagementAuthentication.get_authentication_sequencec                 C   r  )z2Set the 802.11 Management Authentication Sequence.r   ro  Nrv  )r
  Úseqrm   rm   rn   Úset_authentication_sequencen
  r  z9Dot11ManagementAuthentication.set_authentication_sequencec                 C   r  )z0Get the 802.11 Management Authentication Status.r	   ro  rp  r~  rm   rm   rn   Úget_authentication_statusr
  r  z7Dot11ManagementAuthentication.get_authentication_statusc                 C   r  )z0Set the 802.11 Management Authentication Status.r	   ro  Nrv  )r
  Ústatusrm   rm   rn   Úset_authentication_statusv
  r  z7Dot11ManagementAuthentication.set_authentication_statusc                 C   r…  rf  )ro  r/  rH  r~  rm   rm   rn   Úget_challenge_textz
  ro  z0Dot11ManagementAuthentication.get_challenge_textc                 C   rŠ  rf  )rv  r/  rH  )r
  Ú	challengerm   rm   rn   Úset_challenge_text}
  r�  z0Dot11ManagementAuthentication.set_challenge_textc                 C   rÊ  rË  rÌ  rÎ  rm   rm   rn   rÐ  €
  rÑ  z1Dot11ManagementAuthentication.get_vendor_specificc                 C   rÒ  rÓ  rÔ  rÕ  rm   rm   rn   rØ  ™
  rÙ  z1Dot11ManagementAuthentication.add_vendor_specificrf  )rY   rZ   r[   r‰  r3  r  r4  r6  r7  r9  r:  r<  r=  r?  rÐ  rØ  rm   rm   rm   rn   r2  X
  s    
r2  c                   @   rÛ  )ÚDot11ManagementDisassociationz&802.11 Management Disassociation FrameNc                 C   rÝ  rf  )r  r  rÞ  rm   rm   rn   r  ­
  rß  z&Dot11ManagementDisassociation.__init__rf  rà  rm   rm   rm   rn   r@  ª
  rá  r@  c                   @   s€   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zd dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!Ú!Dot11ManagementAssociationRequestz+802.11 Management Association Request Framer	   Nc                 C   ry  rz  )Ú4_Dot11ManagementAssociationRequest__HEADER_BASE_SIZEr[  r  rl  rm   rm   rn   r  µ
  r|  z*Dot11ManagementAssociationRequest.__init__c                 C   rn  )zWReturn the 802.11 Management Association Request Frame 'Capability information' field. r   ro  rp  r  rm   rm   rn   rƒ  º
  rs  z2Dot11ManagementAssociationRequest.get_capabilitiesc                 C   rt  )zRSet the 802.11 Management Association Request Frame 'Capability Information' fieldru  r   ro  Nrv  rx  rm   rm   rn   r„  ¿
  rz  z2Dot11ManagementAssociationRequest.set_capabilitiesc                 C   rn  )zPReturn the 802.11 Management Association Request Frame 'Listen Interval' field. r   ro  rp  r  rm   rm   rn   Úget_listen_intervalÅ
  rs  z5Dot11ManagementAssociationRequest.get_listen_intervalc                 C   r  )zKSet the 802.11 Management Association Request Frame 'Listen Interval' fieldr   ro  Nrv  r  rm   rm   rn   Úset_listen_intervalÊ
  r  z5Dot11ManagementAssociationRequest.set_listen_intervalc                 C   r…  r†  r‡  r~  rm   rm   rn   rˆ  Î
  r‰  z*Dot11ManagementAssociationRequest.get_ssidc                 C   rŠ  rf  r‹  rŒ  rm   rm   rn   rŽ  Ó
  r�  z*Dot11ManagementAssociationRequest.set_ssidFc                 C   r�  )r‘  Nr’  c                 S   r“  r”  rm   r•  rm   rm   rn   r–  ã
  r—  zIDot11ManagementAssociationRequest.get_supported_rates.<locals>.<listcomp>r˜  rš  rm   rm   rn   rž  Ö
  rŸ  z5Dot11ManagementAssociationRequest.get_supported_ratesc                 C   r   r¡  r£  r¤  rm   rm   rn   r§  æ
  r¨  z5Dot11ManagementAssociationRequest.set_supported_ratesc                 C   r¯  r°  r±  r²  rm   rm   rn   r³  ñ
  r´  z)Dot11ManagementAssociationRequest.get_rsnc                 C   rµ  r¶  r·  rº  rm   rm   rn   r¸  ø
  r€  z)Dot11ManagementAssociationRequest.set_rsnc                 C   rÊ  rË  rÌ  rÎ  rm   rm   rn   rÐ  ü
  rÑ  z5Dot11ManagementAssociationRequest.get_vendor_specificc                 C   rÒ  rÓ  rÔ  rÕ  rm   rm   rn   rØ    rÙ  z5Dot11ManagementAssociationRequest.add_vendor_specificrf  rw  )rY   rZ   r[   r‰  rB  r  rƒ  r„  rC  rD  rˆ  rŽ  rž  r§  r³  r¸  rÐ  rØ  rm   rm   rm   rn   rA  °
  s     

rA  c                   @   sp   e Zd ZdZdZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Zdd„ Zdd„ ZdS )Ú"Dot11ManagementAssociationResponsez,802.11 Management Association Response Framer   Nc                 C   ry  rz  )Ú5_Dot11ManagementAssociationResponse__HEADER_BASE_SIZEr[  r  rl  rm   rm   rn   r  +  r|  z+Dot11ManagementAssociationResponse.__init__c                 C   rn  )zXReturn the 802.11 Management Association Response Frame 'Capability information' field. r   ro  rp  r  rm   rm   rn   rƒ  0  rs  z3Dot11ManagementAssociationResponse.get_capabilitiesc                 C   rt  )zSSet the 802.11 Management Association Response Frame 'Capability Information' fieldru  r   ro  Nrv  rx  rm   rm   rn   r„  5  rz  z3Dot11ManagementAssociationResponse.set_capabilitiesc                 C   rn  )zMReturn the 802.11 Management Association Response Frame 'Status Code' field. r   ro  rp  r  rm   rm   rn   Úget_status_code;  rs  z2Dot11ManagementAssociationResponse.get_status_codec                 C   r  )zHSet the 802.11 Management Association Response Frame 'Status Code' fieldr   ro  Nrv  r  rm   rm   rn   Úset_status_code@  r  z2Dot11ManagementAssociationResponse.set_status_codec                 C   rn  )zPReturn the 802.11 Management Association Response Frame 'Association Id' field. r	   ro  rp  r  rm   rm   rn   Úget_association_idD  rs  z5Dot11ManagementAssociationResponse.get_association_idc                 C   r  )zKSet the 802.11 Management Association Response Frame 'Association Id' fieldr	   ro  Nrv  r  rm   rm   rn   Úset_association_idI  r  z5Dot11ManagementAssociationResponse.set_association_idFc                 C   r�  )r‘  Nr’  c                 S   r“  r”  rm   r•  rm   rm   rn   r–  Z  r—  zJDot11ManagementAssociationResponse.get_supported_rates.<locals>.<listcomp>r˜  rš  rm   rm   rn   rž  M  rŸ  z6Dot11ManagementAssociationResponse.get_supported_ratesc                 C   r   r¡  r£  r¤  rm   rm   rn   r§  ]  r¨  z6Dot11ManagementAssociationResponse.set_supported_ratesc                 C   rÊ  rË  rÌ  rÎ  rm   rm   rn   rÐ  h  rÑ  z6Dot11ManagementAssociationResponse.get_vendor_specificc                 C   rÒ  rÓ  rÔ  rÕ  rm   rm   rn   rØ  �  s   z6Dot11ManagementAssociationResponse.add_vendor_specificrf  rw  )rY   rZ   r[   r‰  rF  r  rƒ  r„  rG  rH  rI  rJ  rž  r§  rÐ  rØ  rm   rm   rm   rn   rE  &  s    

rE  c                   @   s�   e Zd ZdZdZd#dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd$dd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ ZdS )%Ú#Dot11ManagementReassociationRequestz-802.11 Management Reassociation Request Framer   Nc                 C   ry  rz  )Ú6_Dot11ManagementReassociationRequest__HEADER_BASE_SIZEr[  r  rl  rm   rm   rn   r  –  r|  z,Dot11ManagementReassociationRequest.__init__c                 C   rn  )zYReturn the 802.11 Management Reassociation Request Frame 'Capability information' field. r   ro  rp  r  rm   rm   rn   rƒ  ›  rs  z4Dot11ManagementReassociationRequest.get_capabilitiesc                 C   rt  )zTSet the 802.11 Management Reassociation Request Frame 'Capability Information' fieldru  r   ro  Nrv  rx  rm   rm   rn   r„     rz  z4Dot11ManagementReassociationRequest.set_capabilitiesc                 C   rn  )zRReturn the 802.11 Management Reassociation Request Frame 'Listen Interval' field. r   ro  rp  r  rm   rm   rn   rC  ¦  rs  z7Dot11ManagementReassociationRequest.get_listen_intervalc                 C   r  )zMSet the 802.11 Management Reassociation Request Frame 'Listen Interval' fieldr   ro  Nrv  r  rm   rm   rn   rD  «  r  z7Dot11ManagementReassociationRequest.set_listen_intervalc                 C   r{  )zLReturn the 802.11 Management Reassociation Request Frame 'Current AP' field.r	   r   r|  r~  rm   rm   rn   Úget_current_ap¯  r€  z2Dot11ManagementReassociationRequest.get_current_apc                 C   r�  )zHSet the 802.11 Management Reassociation Request Frame 'Current AP' fieldr   r   r	   Nr‚  r„  rm   rm   rn   Úset_current_ap³  r‡  z2Dot11ManagementReassociationRequest.set_current_apc                 C   r…  r†  r‡  r~  rm   rm   rn   rˆ  ¸  r‰  z,Dot11ManagementReassociationRequest.get_ssidc                 C   rŠ  rf  r‹  rŒ  rm   rm   rn   rŽ  ½  r�  z,Dot11ManagementReassociationRequest.set_ssidFc                 C   r�  )r‘  Nr’  c                 S   r“  r”  rm   r•  rm   rm   rn   r–  Í  r—  zKDot11ManagementReassociationRequest.get_supported_rates.<locals>.<listcomp>r˜  rš  rm   rm   rn   rž  À  rŸ  z7Dot11ManagementReassociationRequest.get_supported_ratesc                 C   r   r¡  r£  r¤  rm   rm   rn   r§  Ð  r¨  z7Dot11ManagementReassociationRequest.set_supported_ratesc                 C   r¯  r°  r±  r²  rm   rm   rn   r³  Û  r´  z+Dot11ManagementReassociationRequest.get_rsnc                 C   rµ  r¶  r·  rº  rm   rm   rn   r¸  â  r€  z+Dot11ManagementReassociationRequest.set_rsnc                 C   rÊ  rË  rÌ  rÎ  rm   rm   rn   rÐ  æ  rÑ  z7Dot11ManagementReassociationRequest.get_vendor_specificc                 C   rÒ  rÓ  rÔ  rÕ  rm   rm   rn   rØ  ÿ  rÙ  z7Dot11ManagementReassociationRequest.add_vendor_specificrf  rw  )rY   rZ   r[   r‰  rL  r  rƒ  r„  rC  rD  rM  rN  rˆ  rŽ  rž  r§  r³  r¸  rÐ  rØ  rm   rm   rm   rn   rK  ‘  s$    

rK  c                   @   rÛ  )Ú$Dot11ManagementReassociationResponsez.802.11 Management Reassociation Response FrameNc                 C   rÝ  rf  )rE  r  rÞ  rm   rm   rn   r    rß  z-Dot11ManagementReassociationResponse.__init__rf  rà  rm   rm   rm   rn   rO    rá  rO  )0rM  Úbinasciir   Úimpacket.ImpactPacketr   r   Úimpacket.Dot11Cryptor   Ú	frequencyrH   ro   r  rh  r‹  r�  r’  r˜  rš  rœ  rÀ  rÈ  rÍ  rÏ  rþ  rò  r  r0  r9  rQ  r\  rj  rk  r)  r/  r[  rx  rÚ  rÜ  râ  r  r  r  r2  r@  rA  rE  rK  rO  rm   rm   rm   rn   Ú<module>   s<  ÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýýýýýýýüüüüüüüüüûûûûûûûûûúúúúúúø3 N o(,((d$%#K, )v    Nd,s B+&,Rvk