3
™b`#c  ã               @   sÊ   d dl mZ d dlZddlmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZmZmZmZmZmZ ddlmZm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eƒZdS )é    )Úunicode_literalsNé   )ÚInfoExtractoré   )Úcompat_HTTPErrorÚcompat_parse_qsÚcompat_urllib_parse_unquoteÚcompat_urllib_parse_urlparse)	Údict_getÚExtractorErrorÚfloat_or_noneÚint_or_noneÚtry_getÚstrip_or_noneÚunified_timestampÚupdate_url_queryÚ
xpath_text)ÚPeriscopeBaseIEÚPeriscopeIEc               @   s@   e Zd ZdZdZdZdd„ Zdd„ Zedd	„ ƒZ	i fd
d„Z
dS )ÚTwitterBaseIEzhttps://api.twitter.com/1.1/z0https?://(?:(?:www|m(?:obile)?)\.)?twitter\.com/Nc             C   sv   |j dƒ}|sg S d|kr0| j||ddddd�S tt|dƒd
ƒpBd }|d|rTd| nd |dœ}| j||ƒ |gS d S )NÚurlz.m3u8Úmp4Úm3u8_nativeÚhlsF)Úm3u8_idÚfatalÚbitrateÚbit_rateiè  Úhttpz-%dÚ )r   Ú	format_idÚtbr)r   r   )ÚgetÚ_extract_m3u8_formatsr   r
   Ú_search_dimensions_in_video_url)ÚselfÚvariantÚvideo_idÚvariant_urlr!   Úf© r*   úHC:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\extractor\twitter.pyÚ_extract_variant_formats$   s    

z&TwitterBaseIE._extract_variant_formatsc             C   s�   | j ||ƒ}g }g }xJ|jdƒD ]<}t|jd ƒ|jd< |j|jd ƒ |j| j|j|ƒƒ q W tt|dƒƒ}||krŒ|j| jd|i|ƒƒ |S )Nz:.//{http://twitter.com/schema/videoVMapV2.xsd}videoVariantr   z.//MediaFile)	Ú_download_xmlÚfindallr   ÚattribÚappendÚextendr,   r   r   )r%   Úvmap_urlr'   Z	vmap_dataÚformatsÚurlsZvideo_variantÚ	video_urlr*   r*   r+   Ú_extract_formats_from_vmap_url6   s    z,TwitterBaseIE._extract_formats_from_vmap_urlc             C   s8   t jd|ƒ}|r4| jt|jdƒƒt|jdƒƒdœƒ d S )Nz /(?P<width>\d+)x(?P<height>\d+)/ÚwidthÚheight)r7   r8   )ÚreÚsearchÚupdateÚintÚgroup)Úa_formatr5   Úmr*   r*   r+   r$   E   s
    z-TwitterBaseIE._search_dimensions_in_video_urlc             C   s¼   ddi}| j s.| j| jd |dd|d�d | _ | j |d< y| j| j| |||d	�S  tk
r¶ } zJt|jtƒr¤|jjd
kr¤t| j|jj	ƒ j
ƒ |ƒd d d dd�‚‚ W Y d d }~X nX d S )NÚAuthorizationzyBearer AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbwzguest/activate.jsonzDownloading guest tokenó    )ÚdataÚheadersZguest_tokenzx-guest-token)rC   Úqueryi“  Úerrorsr   ÚmessageT)Úexpected)Ú_GUEST_TOKENÚ_download_jsonÚ	_API_BASEr   Ú
isinstanceÚcauser   ÚcodeÚ_parse_jsonÚreadÚdecode)r%   Úpathr'   rD   rC   Úer*   r*   r+   Ú	_call_apiN   s     

zTwitterBaseIE._call_api)Ú__name__Ú
__module__Ú__qualname__rJ   Ú_BASE_REGEXrH   r,   r6   Ústaticmethodr$   rS   r*   r*   r*   r+   r      s   	r   c               @   sÂ   e Zd ZdZejd Z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 d!œd"gd#œd$d%d&dd'd(d)d*d+d,œd-gd#œd.d/d0dd1d2d3d4d5d6dœd7d8œd9d:d;œgZd<d=„ Zd>S )?ÚTwitterCardIEztwitter:cardz0i/(?:cards/tfw/v1|videos(?:/tweet)?)/(?P<id>\d+)z5https://twitter.com/i/cards/tfw/v1/560070183650213889Z560070183650213889r   zwTwitter - You can now shoot, edit and share video on Twitter. Capture life's most moving moments from your perspective.z$md5:18d3e24bb4f6e5007487dd546e53bd96ÚTwitterzre:^https?://.*\.jpggœÄ °r>@i •ÇTÚ20150127)
ÚidÚextÚtitleÚdescriptionÚuploaderÚuploader_idÚ	thumbnailÚdurationÚ	timestampÚupload_date)r   Ú	info_dictz5https://twitter.com/i/cards/tfw/v1/623160978427936768Z 7137eca597f72b9abbe61e5ae0161399Z623160978427936768zjNASA - Fly over Pluto's icy Norgay Mountains and Sputnik Plain in this @NASANewHorizons #PlutoFlyby video.z{Fly over Pluto's icy Norgay Mountains and Sputnik Plain in this @NASANewHorizons #PlutoFlyby video. https://t.co/BJYgOjSeGAZNASAi�­UZ20150720)r\   r]   r^   r_   r`   ra   rd   re   )r   Úmd5rf   z5https://twitter.com/i/cards/tfw/v1/654001591733886977Z b6d9683dd3f48e340ded81c0e917ad46Zdq4Oj5quskIzUbuntu 11.10 Overviewz$md5:a831e97fa384863d6e26ce48d1c43376Z20111013zOMG! UBUNTU!Z	omgubuntu)r\   r]   r^   r_   re   r`   ra   ÚYoutube)r   rg   rf   Úadd_iez5https://twitter.com/i/cards/tfw/v1/665289828897005568Z 6dabeaca9e68cbb71c99c322a4b42a11ZiBb2x00UVlvÚ20151113Z1189339351084113920ZArsenalTerjezVine by ArsenalTerjei«ZFV)r\   r]   re   ra   r`   r^   rd   ÚVinez5https://twitter.com/i/videos/tweet/705235433198714880Z 884812a2adc8aaf6fe52b15ccbfa3b88Ú705235433198714880zaBrent Yarina - Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight.zjKhalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight. https://t.co/OrxcJ28BnszBrent YarinaÚBTNBrentYarinaiL±×VÚ20160303z$This content is no longer available.)r   rg   rf   Úskipz/https://twitter.com/i/videos/752274308186120192T)r   Úonly_matchingc             C   s    | j |ƒ}| jd| tjƒ |ƒS )Nzhttps://twitter.com/statuses/)Ú	_match_idÚ
url_resultÚ	TwitterIEÚie_key)r%   r   Z	status_idr*   r*   r+   Ú_real_extract´   s    
zTwitterCardIE._real_extractN)	rT   rU   rV   ÚIE_NAMEr   rW   Ú
_VALID_URLÚ_TESTSru   r*   r*   r*   r+   rY   c   sr   



rY   c               @   sÀ  e Zd ZdZejd Z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gddœdddd d!d"d#d$d%d&œdœd'd(dd)d*d+d,d-d.d&œd/d0id1œd2d3dd4d5dd6d7d8d9d:d;œ
dœd<d=d>dd?d@dAdBdCdDœdEgdFœdGdHddIdJdKdLdMdNdOdPœ	dœdQdRddSdTdUdVdWdXœdYgdZœd[d\dd]d^d_d`dadbdcddœ	dœdedfddgddhdidjdkdldmdnœ
d/d0id1œdodpddqddrdsdtdudvdwdnœ
d/d0id1œdxdyddzdd{d|d|d}d~ddnœ
dœd€d�dd‚dƒd„d…œd†gdZœd‡d0dˆœd‡d0dˆœgZd‰dŠ„ Zd‹S )Œrs   Útwitterz/(?:(?:i/web|[^/]+)/status|statuses)/(?P<id>\d+)z;https://twitter.com/freethenipple/status/643211948184596480Z643211948184596480r   z9FREE THE NIPPLE - FTN supporters on Hollywood Blvd today!zre:^https?://.*\.jpgz>FTN supporters on Hollywood Blvd today! http://t.co/c7jHH749xJzFREE THE NIPPLEZfreethenipplegòÒMbØ)@imöUZ20150913é   )r\   r]   r^   rb   r_   r`   ra   rc   rd   re   Ú	age_limit)r   rf   z;https://twitter.com/giphz/status/657991469417025536/photo/1Z f36dcd5fb92bf7057f155e7d927eeb42Z657991469417025536z=Gifs - tu vai cai tu vai cai tu nao eh capaz disso tu vai caizaGifs on Twitter: "tu vai cai tu vai cai tu nao eh capaz disso tu vai cai https://t.co/tM46VHFlO5"zre:^https?://.*\.pngZGifsZgiphz)r\   r]   r^   r_   rb   r`   ra   r8   r7   zAccount suspended)r   rg   rf   Úexpected_warningsro   z6https://twitter.com/starwars/status/665052190608723968Z665052190608723968zyStar Wars - A new beginning is coming December 18. Watch the official 60 second #TV spot for #StarWars: #TheForceAwakens.z…A new beginning is coming December 18. Watch the official 60 second #TV spot for #StarWars: #TheForceAwakens. https://t.co/OkSqT2fjWJZstarwarsz	Star Warsi¼�EVrj   )r\   r]   r^   r_   ra   r`   rd   re   z<https://twitter.com/BTNBrentYarina/status/705235433198714880rl   zaBrent Yarina - Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight.zjKhalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight. https://t.co/OrxcJ28Bnsrm   zBrent YarinaiL±×Vrn   Úskip_downloadT)r   rf   Úparamsz8https://twitter.com/jaydingeer/status/700207533655363584Z700207533655363584z/simon vetugo - BEAT PROD: @suhmeduh #DamndanielzQBEAT PROD: @suhmeduh  https://t.co/HBrQ4AfpvZ #Damndaniel https://t.co/byBooq2ejZzsimon vetugoZsimonvertugog      >@i³fÅVZ20160218)
r\   r]   r^   r_   rb   r`   ra   rc   rd   re   z7https://twitter.com/Filmdrunk/status/713801302971588609Z 89a15ed345d13b86e9a5a5e051fa308aZMIOxnrUteUdu@   Dr.Pepperã�®é£²ã�¿æ–¹ #japanese #ãƒ�ã‚« #ãƒ‰ã‚¯ãƒš #é›»å‹•ã‚¬ãƒ³ZTAKUMAZ1004126642786242560i‚o�SZ20140615)r\   r]   r^   r`   ra   rd   re   rk   )r   rg   rf   ri   z<https://twitter.com/captainamerica/status/719944021058060289Z719944021058060289z[Captain America - @King0fNerd Are you sure you made the right choice? Find out in theaters.za@King0fNerd Are you sure you made the right choice? Find out in theaters. https://t.co/GpgYi9xMJIZCaptainAmericazCaptain Americag\�Âõ(\	@i½3WZ20160412)	r\   r]   r^   r_   ra   r`   rc   rd   re   z5https://twitter.com/OPP_HSD/status/779210622571536384Z1zqKVVlkqLaKBzqSgt Kerry Schmidt - Ontario Provincial Police - Road rage, mischief, assault, rollover and fire in one occurrenceZ20160923Z1PmKqpJdOJQoYz-Sgt Kerry Schmidt - Ontario Provincial PoliceiÞÏäW)r\   r]   r^   re   ra   r`   rd   Ú	Periscope)r   rf   ri   z9https://twitter.com/news_al3alm/status/852138619213144067Z852138619213144067uæ   Ø¹Ø§Ù„Ù… Ø§Ù„Ø£Ø®Ø¨Ø§Ø± - ÙƒÙ„Ù…Ø© ØªØ§Ø±ÙŠØ®ÙŠØ© Ø¨Ø¬Ù„Ø³Ø© Ø§Ù„Ø¬Ù†Ø§Ø³ÙŠ Ø§Ù„ØªØ§Ø±ÙŠØ®ÙŠØ©.. Ø§Ù„Ù†Ø§Ø¦Ø¨ Ø®Ø§Ù„Ø¯ Ù…Ø¤Ù†Ø³ Ø§Ù„Ø¹ØªÙŠØ¨ÙŠ Ù„Ù„Ù…Ø¹Ø§Ø±Ø¶ÙŠÙ† : Ø§ØªÙ‚ÙˆØ§ Ø§Ù„Ù„Ù‡ .. Ø§Ù„Ø¸Ù„Ù… Ø¸Ù„Ù…Ø§Øª ÙŠÙˆÙ… Ø§Ù„Ù‚ÙŠØ§Ù…Ø©uæ   ÙƒÙ„Ù…Ø© ØªØ§Ø±ÙŠØ®ÙŠØ© Ø¨Ø¬Ù„Ø³Ø© Ø§Ù„Ø¬Ù†Ø§Ø³ÙŠ Ø§Ù„ØªØ§Ø±ÙŠØ®ÙŠØ©.. Ø§Ù„Ù†Ø§Ø¦Ø¨ Ø®Ø§Ù„Ø¯ Ù…Ø¤Ù†Ø³ Ø§Ù„Ø¹ØªÙŠØ¨ÙŠ Ù„Ù„Ù…Ø¹Ø§Ø±Ø¶ÙŠÙ† : Ø§ØªÙ‚ÙˆØ§ Ø§Ù„Ù„Ù‡ .. Ø§Ù„Ø¸Ù„Ù… Ø¸Ù„Ù…Ø§Øª ÙŠÙˆÙ… Ø§Ù„Ù‚ÙŠØ§Ù…Ø©   https://t.co/xg6OhpyKfNu   Ø¹Ø§Ù„Ù… Ø§Ù„Ø£Ø®Ø¨Ø§Ø±Znews_al3almgfffffVq@i�îXÚ20170412)	r\   r]   r^   r_   r`   ra   rc   rd   re   z3https://twitter.com/i/web/status/910031516746514432Z910031516746514432u›   PrÃ©fet de Guadeloupe - [Direct] #Maria Le centre se trouve actuellement au sud de Basse-Terre. Restez confinÃ©s. RÃ©fugiez-vous dans la piÃ¨ce la + sÃ»re.u›   [Direct] #Maria Le centre se trouve actuellement au sud de Basse-Terre. Restez confinÃ©s. RÃ©fugiez-vous dans la piÃ¨ce la + sÃ»re. https://t.co/mwx01Rs4lou   PrÃ©fet de GuadeloupeZ	Prefet971g=
×£p½G@iƒ¼ÀYZ20170919)
r\   r]   r^   rb   r_   r`   ra   rc   rd   re   z8https://twitter.com/LisPower1/status/1001551623938805763Z1001551623938805763z re:.*?Shep is on a roll today.*?z$md5:37b9f2ff31720cef23b2bd42ee8a0f09z	Lis PowerZ	LisPower1goƒÀÊÑ[@iA¯[Z20180529z5https://twitter.com/foobar/status/1087791357756956680Z1087791357756956680zÁTwitter - A new is coming.  Some of you got an opt-in to try it now. Check out the emoji button, quick keyboard shortcuts, upgraded trends, advanced search, and more. Let us know your thoughts!z$md5:6dfd341a3310fb97d80d2bf7145df976rZ   gj¼t“ÈN@iDlG\Z20190122z<https://twitter.com/ViviEducation/status/1136534865145286656Z1vOGwqejwoWxBzjVivi - Vivi founder @lior_rauchy announcing our new student feedback tool live at @EduTECH_AU #EduTECH2019ZViviZ1eVjYOLGkGrQL)r\   r]   r^   r`   ra   ZTwitterBroadcastz5https://twitter.com/GunB1g/status/1163218564784017422)r   rp   c                sò  | j |ƒ}| jd| |ddddddœƒ}|d jdd	ƒ }}tjd
d|ƒ}|jdƒpVi }|jdƒ}|rrd||f }|jdƒ}g }	x6t|dd„ tƒp”g D ]}
|
jdƒ}|sªq–|	j|ƒ q–W ||||t	|jdƒƒ||rÚd| nd t
|jdƒƒt
|jdƒƒt
|jdƒƒ|jdƒ�rdnd|	dœ}t|dd„ ƒ}|�r|jdƒdk�r|jdƒ�pLi }g }x(|jdg ƒD ]}|j| j||ƒƒ �q`W | j|ƒ g ‰|jd ƒ�pž|jd!ƒ‰ˆ�rô‡‡fd"d#„}x(|jd$i ƒjƒ D ]\}}|||ƒ �qÆW |d%|jd&ƒ�pði ƒ |j|ˆt|jd'ƒd(ƒd)œƒ �nØ|jd*ƒ}|�rÂ|d+ ‰ ‡ fd,d-„}|d jd.ƒdJ }|dKk�rB|d/k}|�rl|d1ƒn|d2ƒ}|d3|�r‚|nd4 ƒ}| j||�p˜|ƒ}| j|ƒ g ‰xzdLD ]r}|d9| ƒ�pÄi }|jd:ƒ}| �s°d;|k�ræ�q°ˆj|�rü|dd … nd<|t
|jd=ƒƒt
|jd>ƒƒd?œƒ �q°W |j|ˆt
|d@ƒƒd)œƒ n~|d4k�rb|jd:|dAƒdBœƒ n^|dCk�r’|jd:|d:ƒ�p‚|dAƒtjƒ dDœƒ n.|dEk�r¸|jd:|dFƒtjƒ dDœƒ ntdGƒ‚n,t|dHd„ ƒ}|�sÞtdIƒ‚|jd:|dBœƒ |S )MNzstatuses/show/%s.jsonzWeb-12r   r   Úextended)Zcards_platformZinclude_cardsZinclude_reply_countZinclude_user_entitiesZ
tweet_modeZ	full_textÚ
ú z\s+(https?://[^ ]+)r   ÚuserÚnamez%s - %sZscreen_namec             S   s   | d d S )NÚentitiesZhashtagsr*   )Úxr*   r*   r+   Ú<lambda>–  s    z)TwitterIE._real_extract.<locals>.<lambda>ÚtextÚ
created_atzhttps://twitter.com/Zfavorite_countZretweet_countZreply_countZpossibly_sensitiverz   )r\   r^   r_   r`   rd   ra   Úuploader_urlÚ
like_countÚrepost_countÚcomment_countr{   Útagsc             S   s   | d d d S )NZextended_entitiesÚmediar   r*   )r‡   r*   r*   r+   rˆ   «  s    ÚtypeÚphotoÚ
video_infoÚvariantsZmedia_url_httpsÚ	media_urlc                sJ   ˆj | tˆ d| iƒt|jdƒp&|jdƒƒt|jdƒp<|jdƒƒdœƒ d S )Nr…   Úwr7   Úhr8   )r\   r   r7   r8   )r0   r   r   r"   )r…   Úsize)r•   Ú
thumbnailsr*   r+   Úadd_thumbnail·  s
    z.TwitterIE._real_extract.<locals>.add_thumbnailÚsizesÚorigZoriginal_infoZduration_millisiè  )r3   r™   rc   ÚcardÚbinding_valuesc                s   ˆ j | ƒpi }t|dd„ ƒS )Nc             S   s   | | d j ƒ d  S )Nr‘   Ú_value)Úlower)r‡   r*   r*   r+   rˆ   Î  s    zDTwitterIE._real_extract.<locals>.get_binding_value.<locals>.<lambda>)r"   r   )ÚkÚo)rž   r*   r+   Úget_binding_valueÌ  s    z2TwitterIE._real_extract.<locals>.get_binding_valueú:ÚamplifyÚpromo_video_websiteZamplify_url_vmapZplayer_stream_urlz%s_content_idÚplayerÚ_smallÚ_largeÚ_x_largeÚ	_originalZplayer_imager   z/player-placeholderÚmediumr7   r8   )r\   r   r7   r8   Zcontent_duration_secondsÚ
player_url)Ú_typer   Zperiscope_broadcast)r®   r   rt   Ú	broadcastÚbroadcast_urlzUnsupported Twitter Card.c             S   s   | d d d d S )Nr†   r4   r   Úexpanded_urlr*   )r‡   r*   r*   r+   rˆ   ÿ  s    zThere's no video in this tweet.éÿÿÿÿ)r¥   r¦   )r¨   r   r©   rª   r«   )rq   rS   Úreplacer9   Úsubr"   r   Úlistr0   r   r   r1   r,   Ú_sort_formatsÚitemsr;   r   Úsplitr6   r   rt   ÚTwitterBroadcastIEr   )r%   r   ZtwidÚstatusr^   r_   r„   r`   ra   r�   ÚhashtagZhashtag_textÚinfor�   r“   r3   r&   rš   r…   r˜   r�   r£   Z	card_nameZ
is_amplifyr2   Ú
content_idÚsuffixÚimageÚ	image_urlr±   r*   )rž   r•   r™   r+   ru   �  sÈ    















zTwitterIE._real_extractN)	rT   rU   rV   rv   r   rW   rw   rx   ru   r*   r*   r*   r+   rs   »   s  










rs   c               @   s2   e Zd ZdZdZddddddd	œd
œZdd„ ZdS )ÚTwitterAmplifyIEztwitter:amplifyz1https?://amp\.twimg\.com/v/(?P<id>[0-9a-f\-]{36})z<https://amp.twimg.com/v/0ba0c3c7-0af3-4c0a-bed5-7efd1ffa2951Z 7df102d0b9fd7066b86f3159f8e81bf6z$0ba0c3c7-0af3-4c0a-bed5-7efd1ffa2951r   zTwitter Videozre:^https?://.*)r\   r]   r^   rb   )r   rg   rf   c                s¤   ˆ j |ƒ}ˆ j||ƒ‰ˆ jdˆdƒ}ˆ j||ƒ}g }ˆ jdˆddd�}‡ ‡fdd„}|rv|d	ƒ\}}	|j|||	d
œƒ |dƒ\}
}|d j|
|dœƒ |d||dœS )Nztwitter:amplify:vmapzvmap urlztwitter:image:srcrb   F)r   c                s8   t ˆ jd|  ˆdd�ƒ}t ˆ jd|  ˆdd�ƒ}||fS )Nztwitter:%s:widthF)r   ztwitter:%s:height)r   Ú_html_search_meta)Útargetr–   r—   )r%   Úwebpager*   r+   Ú_find_dimension$  s
    z7TwitterAmplifyIE._real_extract.<locals>._find_dimensionr¿   )r   r7   r8   r§   r   )r7   r8   zTwitter Video)r\   r^   r3   r™   )rq   Ú_download_webpagerÂ   r6   r0   r;   )r%   r   r'   r2   r3   r™   rb   rÅ   Zthumbnail_wZthumbnail_hZvideo_wZvideo_hr*   )r%   rÄ   r+   ru     s.    



zTwitterAmplifyIE._real_extractN)rT   rU   rV   rv   rw   Ú_TESTru   r*   r*   r*   r+   rÁ   	  s   rÁ   c               @   s"   e Zd ZdZejd Zdd„ ZdS )r¹   ztwitter:broadcastz$i/broadcasts/(?P<id>[0-9a-zA-Z]{13})c             C   s¶   | j |ƒ}| jd|d|iƒd | }| j||ƒ}|d }| jd| |ƒd }|jdƒp\|d }d	|krn| jƒ  tt|ƒjƒjd
d gƒd }| j|ƒ\}	}
}| j	||||	|
|ƒ|d< |S )Nzbroadcasts/show.jsonÚidsÚ
broadcastsÚ	media_keyzlive_video_stream/status/ÚsourceZnoRedirectPlaybackUrlÚlocationz/live_video_stream/geoblocked/r‘   r   r3   )
rq   rS   Ú_parse_broadcast_datar"   Úraise_geo_restrictedr   r	   rD   Ú_extract_common_format_infoÚ_extract_pscp_m3u8_formats)r%   r   Úbroadcast_idr¯   r¼   rÊ   rË   Úm3u8_urlr   Ústater7   r8   r*   r*   r+   ru   E  s"    
z TwitterBroadcastIE._real_extractN)rT   rU   rV   rv   r   rW   rw   ru   r*   r*   r*   r+   r¹   A  s   
r¹   )Ú
__future__r   r9   Úcommonr   Úcompatr   r   r   r	   Úutilsr
   r   r   r   r   r   r   r   r   Ú	periscoper   r   r   rY   rs   rÁ   r¹   r*   r*   r*   r+   Ú<module>   s   ,DX  P8