3
Ôb`ßƒ ã            %   @   s2  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZ
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZ d dl!Z!ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@ dd„ ZAeBejCdƒƒZDd	d
„ ZEeEƒ dddddœZFddiZGeHƒ ZIddddddddddddgZJeJddd d!d"d#d$d%d&d'd(d)gd*œZK�dZLeMeNdPejOdQdRgdSdTgdUdVdWgdXdYgdZd[gd\d]gd^ƒƒƒZP�dZQeReQƒZSeSjTdƒd„d…d†d‡dˆgƒ eReQƒZUeUjTd‰dŠd‹dŒd�gƒ dŽZVd�ZWd�d‘„ ZXd’d“„ ZYejZ�dk�r°�dd–d—„Z[n�dd˜d—„Z[d™dš„ Z\dd›eIfdœd�„Z]dd›eIfdždŸ„Z^dd›eIfd d¡„Z_d¢d£„ Z`d¤d¥„ Za�d	d§d¨„Zbd©dª„ Zc�d
d«d¬„ZdG d­d®„ d®e$ƒZed¯d°„ Zfd±d²„ Zgd³d´„ Zhdµd¶„ Zi�dd·d¸„Zjd¹dº„ Zkd»d¼„ Zld½d¾„ Zmd¿dÀ„ ZndÁdÂ„ ZodÃdÄ„ ZpdÅdÆ„ ZqdÇdÈ„ Zr�ddÉdÊ„Zs�ddËdÌ„ZtdÍdÎ„ ZudÏdÐ„ ZvdÑdÒ„ ZwdÓdÔ„ ZxdÕdÖ„ Zyd×dØ„ ZzG 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ˆdódô„ Z‰dõdö„ ZŠG d÷dø„ døe;j‹ƒZŒdùdú„ Z�G dûdü„ düe;jŽƒZ�G dýdþ„ dþe'j�ƒZ‘G dÿ�d „ �d e;j’ƒZ“G �d�d„ �de;j”ƒZ•�d�d„ Z–�d�d�d„Z—�d�d�d	„Z˜�d�d
�d„Z™�d�d�d„Zš�d�d�d„Z›�d�d�d„Zœ�d�d„ Z��d�d„ ZžG �d�d„ �deHƒZŸ�d�d„ Z �d�d„ Z¡�d�d�d„Z¢�d�d „ Z£�d!�d"„ Z¤ej�d#k�räd dl¥Zd dl¦Z¦G �d$�d%„ �d%ej§ƒZ¨ej©jªZªeªj«Z«ej¬j­ej¬j®ej¬j®ej¬j®ej¬j®ej¯e¨ƒge«_°ej¬j±e«_²eªj³Z³ej¬j­ej¬j®ej¬j®ej¬j®ej¯e¨ƒge³_°ej¬j±e³_²�d&Z´�d'Zµ�d(�d)„ Z¶�d*�d+„ Z·nZy$d dl¸Z¸�d,�d)„ Z¶�d-�d+„ Z·W n4 e¹k
�r<   �d.Zº�d/�d)„ Z¶�d0�d+„ Z·Y nX G �d1�d2„ �d2eHƒZ»�d3�d4„ Z¼�d5�d6„ Z½�d7�d8„ Z¾�d�d9�d:„Z¿�d;�d<„ ZÀ�d=�d>„ ZÁ�d?�d@„ ZÂ�dA�dB„ ZÃ�dC�dD„ ZÄ�dE�dF„ ZÅ�d�dH�dI„ZÆ�dJ�dK„ ZÇ�dL�dM„ ZÈ�dN�dO„ ZÉ�dP�dQ„ ZÊ�dR�dS„ ZË�dT�dU„ ZÌ�dV�dW„ ZÍ�dX�dY„ ZÎ�dZ�d[„ ZÏG �d\�d]„ �d]e;jÐƒZÑG �d^�d_„ �d_e;jÐƒZÒ�d�d`�da„ZÓ�d�db�dc„ZÔ�dd�de„ ZÕ�d�df�dg„ZÖ�d�dh�di„Z×�d�dj�dk„ZØ�dl�dm„ ZÙ�dn�do„ ZÚ�d�dp�dq„ZÛ�d�dr�ds„ZÜg f�dt�du„ZÝ�dvgd�dwf�dx�dy„ZÞ�d�dz�d{„ZßG �d|�d}„ �d}eHƒZàG �d~�d„ �deàƒZáG �d€�d�„ �d�eàƒZâ�d‚�dƒ„ Zã�d„�d…„ Zä�d†�d‡„ Zå�dˆ�d‰„ Zæ�dŠ�d‹„ Zç�dŒ�d�„ Zè�dŽ�d�„ Zéddi i f�d��d‘„Zê�d’�d“„ Zë�d�d”�d•„Zì�d �d–�d—„Zí�d!�d˜�d™„Zî�dš�d›„ ZïeXƒ �dœf�d��dž„Zðd �dŸ�d �d¡�d¢�d£œZñd d•d d �d¤�d¥�d¦œZò�d§�d¨„ Zó�d©�dª„ Zô�d«�d¬„ Zõ�d­�d®„ Zö�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À�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Ü�dÝ„�Z�d$�dÞ�dß„�Zg f�dà�dá„�ZG �dâ�dã„ �dãeHƒ�ZG �dä�då„ �dåeHƒ�ZG �dæ�dç„ �dçeHƒ�ZG �dè�dé„ �dée;�jƒ�Z�d%�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þ�dÿ„ �Z�d �d„ �Z �d�d„ �Z!dS ('  é    )Úunicode_literalsNé   )Úcompat_HTMLParseErrorÚcompat_HTMLParserÚcompat_basestringÚ
compat_chrÚcompat_cookiejarÚcompat_ctypes_WINFUNCTYPEÚcompat_etree_fromstringÚcompat_expanduserÚcompat_html_entitiesÚcompat_html_entities_html5Úcompat_http_clientÚcompat_integer_typesÚcompat_kwargsÚcompat_os_nameÚcompat_parse_qsÚcompat_shlex_quoteÚ
compat_strÚcompat_struct_packÚcompat_struct_unpackÚcompat_urllib_errorÚcompat_urllib_parseÚcompat_urllib_parse_urlencodeÚcompat_urllib_parse_urlparseÚ compat_urllib_parse_unquote_plusÚcompat_urllib_requestÚcompat_urlparseÚcompat_xpath)Ú	ProxyTypeÚsockssocketc              C   s(   x"dD ]} | t jkrt jj| ƒ qW d S )NÚsocksÚsocks4Úsocks4aÚsocks5)r!   r"   r#   r$   )r   Úuses_netlocÚappend)Úscheme© r(   úAC:\Users\Broad\Desktop\BeinConnetFix\binaries\youtube_dl\utils.pyÚregister_socks_protocolsI   s    

r*   Ú c           (  C   s   d} �d*}| t j|ƒ S (+  NzhMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36ú74.0.3729.129ú76.0.3780.3ú76.0.3780.2ú74.0.3729.128ú76.0.3780.1ú76.0.3780.0ú75.0.3770.15ú74.0.3729.127ú74.0.3729.126ú76.0.3779.1ú76.0.3779.0ú75.0.3770.14ú74.0.3729.125ú76.0.3778.1ú76.0.3778.0ú75.0.3770.13ú74.0.3729.124ú74.0.3729.123ú73.0.3683.121ú76.0.3777.1ú76.0.3777.0ú75.0.3770.12ú74.0.3729.122ú76.0.3776.4ú75.0.3770.11ú74.0.3729.121ú76.0.3776.3ú76.0.3776.2ú73.0.3683.120ú74.0.3729.120ú74.0.3729.119ú74.0.3729.118ú76.0.3776.1ú76.0.3776.0ú76.0.3775.5ú75.0.3770.10ú74.0.3729.117ú76.0.3775.4ú76.0.3775.3ú74.0.3729.116ú75.0.3770.9ú76.0.3775.2ú76.0.3775.1ú76.0.3775.0ú75.0.3770.8ú74.0.3729.115ú74.0.3729.114ú76.0.3774.1ú76.0.3774.0ú75.0.3770.7ú74.0.3729.113ú74.0.3729.112ú74.0.3729.111ú76.0.3773.1ú76.0.3773.0ú75.0.3770.6ú74.0.3729.110ú74.0.3729.109ú76.0.3772.1ú76.0.3772.0ú75.0.3770.5ú74.0.3729.108ú74.0.3729.107ú76.0.3771.1ú76.0.3771.0ú75.0.3770.4ú74.0.3729.106ú74.0.3729.105ú75.0.3770.3ú74.0.3729.104ú74.0.3729.103ú74.0.3729.102ú75.0.3770.2ú74.0.3729.101ú75.0.3770.1ú75.0.3770.0ú74.0.3729.100ú75.0.3769.5ú75.0.3769.4ú74.0.3729.99ú75.0.3769.3ú75.0.3769.2ú75.0.3768.6ú74.0.3729.98ú75.0.3769.1ú75.0.3769.0ú74.0.3729.97ú73.0.3683.119ú73.0.3683.118ú74.0.3729.96ú75.0.3768.5ú75.0.3768.4ú75.0.3768.3ú75.0.3768.2ú74.0.3729.95ú74.0.3729.94ú75.0.3768.1ú75.0.3768.0ú74.0.3729.93ú74.0.3729.92ú73.0.3683.117ú74.0.3729.91ú75.0.3766.3ú74.0.3729.90ú75.0.3767.2ú75.0.3767.1ú75.0.3767.0ú74.0.3729.89ú73.0.3683.116ú75.0.3766.2ú74.0.3729.88ú75.0.3766.1ú75.0.3766.0ú74.0.3729.87ú73.0.3683.115ú74.0.3729.86ú75.0.3765.1ú75.0.3765.0ú74.0.3729.85ú73.0.3683.114ú74.0.3729.84ú75.0.3764.1ú75.0.3764.0ú74.0.3729.83ú73.0.3683.113ú75.0.3763.2ú75.0.3761.4ú74.0.3729.82ú75.0.3763.1ú75.0.3763.0ú74.0.3729.81ú73.0.3683.112ú75.0.3762.1ú75.0.3762.0ú74.0.3729.80ú75.0.3761.3ú74.0.3729.79ú73.0.3683.111ú75.0.3761.2ú74.0.3729.78ú74.0.3729.77ú75.0.3761.1ú75.0.3761.0ú73.0.3683.110ú74.0.3729.76ú74.0.3729.75ú75.0.3760.0ú74.0.3729.74ú75.0.3759.8ú75.0.3759.7ú75.0.3759.6ú74.0.3729.73ú75.0.3759.5ú74.0.3729.72ú73.0.3683.109ú75.0.3759.4ú75.0.3759.3ú74.0.3729.71ú75.0.3759.2ú74.0.3729.70ú73.0.3683.108ú74.0.3729.69ú75.0.3759.1ú75.0.3759.0ú74.0.3729.68ú73.0.3683.107ú74.0.3729.67ú75.0.3758.1ú75.0.3758.0ú74.0.3729.66ú73.0.3683.106ú74.0.3729.65ú75.0.3757.1ú75.0.3757.0ú74.0.3729.64ú73.0.3683.105ú74.0.3729.63ú75.0.3756.1ú75.0.3756.0ú74.0.3729.62ú73.0.3683.104ú75.0.3755.3ú75.0.3755.2ú73.0.3683.103ú75.0.3755.1ú75.0.3755.0ú74.0.3729.61ú73.0.3683.102ú74.0.3729.60ú75.0.3754.2ú74.0.3729.59ú75.0.3753.4ú74.0.3729.58ú75.0.3754.1ú75.0.3754.0ú74.0.3729.57ú73.0.3683.101ú75.0.3753.3ú75.0.3752.2ú75.0.3753.2ú74.0.3729.56ú75.0.3753.1ú75.0.3753.0ú74.0.3729.55ú73.0.3683.100ú74.0.3729.54ú75.0.3752.1ú75.0.3752.0ú74.0.3729.53ú73.0.3683.99ú74.0.3729.52ú75.0.3751.1ú75.0.3751.0ú74.0.3729.51ú73.0.3683.98ú74.0.3729.50ú75.0.3750.0ú74.0.3729.49ú74.0.3729.48ú74.0.3729.47ú75.0.3749.3ú74.0.3729.46ú73.0.3683.97ú75.0.3749.2ú74.0.3729.45ú75.0.3749.1ú75.0.3749.0ú74.0.3729.44ú73.0.3683.96ú74.0.3729.43ú74.0.3729.42ú75.0.3748.1ú75.0.3748.0ú74.0.3729.41ú75.0.3747.1ú73.0.3683.95ú75.0.3746.4ú74.0.3729.40ú74.0.3729.39ú75.0.3747.0ú75.0.3746.3ú75.0.3746.2ú74.0.3729.38ú75.0.3746.1ú75.0.3746.0ú74.0.3729.37ú73.0.3683.94ú75.0.3745.5ú75.0.3745.4ú75.0.3745.3ú75.0.3745.2ú74.0.3729.36ú75.0.3745.1ú75.0.3745.0ú75.0.3744.2ú74.0.3729.35ú73.0.3683.93ú74.0.3729.34ú75.0.3744.1ú75.0.3744.0ú74.0.3729.33ú73.0.3683.92ú74.0.3729.32ú74.0.3729.31ú73.0.3683.91ú75.0.3741.2ú75.0.3740.5ú74.0.3729.30ú75.0.3741.1ú75.0.3741.0ú74.0.3729.29ú75.0.3740.4ú73.0.3683.90ú74.0.3729.28ú75.0.3740.3ú73.0.3683.89ú75.0.3740.2ú74.0.3729.27ú75.0.3740.1ú75.0.3740.0ú74.0.3729.26ú73.0.3683.88ú73.0.3683.87ú74.0.3729.25ú75.0.3739.1ú75.0.3739.0ú73.0.3683.86ú74.0.3729.24ú73.0.3683.85ú75.0.3738.4ú75.0.3738.3ú75.0.3738.2ú75.0.3738.1ú75.0.3738.0ú74.0.3729.23ú73.0.3683.84ú74.0.3729.22ú74.0.3729.21ú75.0.3737.1ú75.0.3737.0ú74.0.3729.20ú73.0.3683.83ú74.0.3729.19ú75.0.3736.1ú75.0.3736.0ú74.0.3729.18ú73.0.3683.82ú74.0.3729.17ú75.0.3735.1ú75.0.3735.0ú74.0.3729.16ú73.0.3683.81ú75.0.3734.1ú75.0.3734.0ú74.0.3729.15ú73.0.3683.80ú74.0.3729.14ú75.0.3733.1ú75.0.3733.0ú75.0.3732.1ú74.0.3729.13ú74.0.3729.12ú73.0.3683.79ú74.0.3729.11ú75.0.3732.0ú74.0.3729.10ú73.0.3683.78ú74.0.3729.9ú74.0.3729.8ú74.0.3729.7ú75.0.3731.3ú75.0.3731.2ú75.0.3731.0ú74.0.3729.6ú73.0.3683.77ú73.0.3683.76ú75.0.3730.5ú75.0.3730.4ú73.0.3683.75ú74.0.3729.5ú73.0.3683.74ú75.0.3730.3ú75.0.3730.2ú74.0.3729.4ú73.0.3683.73ú73.0.3683.72ú75.0.3730.1ú75.0.3730.0ú74.0.3729.3ú73.0.3683.71ú74.0.3729.2ú73.0.3683.70ú74.0.3729.1ú74.0.3729.0ú74.0.3726.4ú73.0.3683.69ú74.0.3726.3ú74.0.3728.0ú74.0.3726.2ú73.0.3683.68ú74.0.3726.1ú74.0.3726.0ú74.0.3725.4ú73.0.3683.67ú73.0.3683.66ú74.0.3725.3ú74.0.3725.2ú74.0.3725.1ú74.0.3724.8ú74.0.3725.0ú73.0.3683.65ú74.0.3724.7ú74.0.3724.6ú74.0.3724.5ú74.0.3724.4ú74.0.3724.3ú74.0.3724.2ú74.0.3724.1ú74.0.3724.0ú73.0.3683.64ú74.0.3723.1ú74.0.3723.0ú73.0.3683.63ú74.0.3722.1ú74.0.3722.0ú73.0.3683.62ú74.0.3718.9ú74.0.3702.3ú74.0.3721.3ú74.0.3721.2ú74.0.3721.1ú74.0.3721.0ú74.0.3720.6ú73.0.3683.61ú72.0.3626.122ú73.0.3683.60ú74.0.3720.5ú72.0.3626.121ú74.0.3718.8ú74.0.3720.4ú74.0.3720.3ú74.0.3718.7ú74.0.3720.2ú74.0.3720.1ú74.0.3720.0ú74.0.3718.6ú74.0.3719.5ú73.0.3683.59ú74.0.3718.5ú74.0.3718.4ú74.0.3719.4ú74.0.3719.3ú74.0.3719.2ú74.0.3719.1ú73.0.3683.58ú74.0.3719.0ú73.0.3683.57ú73.0.3683.56ú74.0.3718.3ú73.0.3683.55ú74.0.3718.2ú74.0.3718.1ú74.0.3718.0ú73.0.3683.54ú74.0.3717.2ú73.0.3683.53ú74.0.3717.1ú74.0.3717.0ú73.0.3683.52ú74.0.3716.1ú74.0.3716.0ú73.0.3683.51ú74.0.3715.1ú74.0.3715.0ú73.0.3683.50ú74.0.3711.2ú74.0.3714.2ú74.0.3713.3ú74.0.3714.1ú74.0.3714.0ú73.0.3683.49ú74.0.3713.1ú74.0.3713.0ú72.0.3626.120ú73.0.3683.48ú74.0.3712.2ú74.0.3712.1ú74.0.3712.0ú73.0.3683.47ú72.0.3626.119ú73.0.3683.46ú74.0.3710.2ú72.0.3626.118ú74.0.3711.1ú74.0.3711.0ú73.0.3683.45ú72.0.3626.117ú74.0.3710.1ú74.0.3710.0ú73.0.3683.44ú72.0.3626.116ú74.0.3709.1ú74.0.3709.0ú74.0.3704.9ú73.0.3683.43ú72.0.3626.115ú74.0.3704.8ú74.0.3704.7ú74.0.3708.0ú74.0.3706.7ú74.0.3704.6ú73.0.3683.42ú72.0.3626.114ú74.0.3706.6ú72.0.3626.113ú74.0.3704.5ú74.0.3706.5ú74.0.3706.4ú74.0.3706.3ú74.0.3706.2ú74.0.3706.1ú74.0.3706.0ú73.0.3683.41ú72.0.3626.112ú74.0.3705.1ú74.0.3705.0ú73.0.3683.40ú72.0.3626.111ú73.0.3683.39ú74.0.3704.4ú73.0.3683.38ú74.0.3704.3ú74.0.3704.2ú74.0.3704.1ú74.0.3704.0ú73.0.3683.37ú72.0.3626.110ú72.0.3626.109ú74.0.3703.3ú74.0.3703.2ú73.0.3683.36ú74.0.3703.1ú74.0.3703.0ú73.0.3683.35ú72.0.3626.108ú74.0.3702.2ú74.0.3699.3ú74.0.3702.1ú74.0.3702.0ú73.0.3683.34ú72.0.3626.107ú73.0.3683.33ú74.0.3701.1ú74.0.3701.0ú73.0.3683.32ú73.0.3683.31ú72.0.3626.105ú74.0.3700.1ú74.0.3700.0ú73.0.3683.29ú72.0.3626.103ú74.0.3699.2ú74.0.3699.1ú74.0.3699.0ú73.0.3683.28ú72.0.3626.102ú73.0.3683.27ú73.0.3683.26ú74.0.3698.0ú74.0.3696.2ú72.0.3626.101ú73.0.3683.25ú74.0.3696.1ú74.0.3696.0ú74.0.3694.8ú72.0.3626.100ú74.0.3694.7ú74.0.3694.6ú74.0.3694.5ú74.0.3694.4ú72.0.3626.99ú72.0.3626.98ú74.0.3694.3ú73.0.3683.24ú72.0.3626.97ú72.0.3626.96ú72.0.3626.95ú73.0.3683.23ú72.0.3626.94ú73.0.3683.22ú73.0.3683.21ú72.0.3626.93ú74.0.3694.2ú72.0.3626.92ú74.0.3694.1ú74.0.3694.0ú74.0.3693.6ú73.0.3683.20ú72.0.3626.91ú74.0.3693.5ú74.0.3693.4ú74.0.3693.3ú74.0.3693.2ú73.0.3683.19ú74.0.3693.1ú74.0.3693.0ú73.0.3683.18ú72.0.3626.90ú74.0.3692.1ú74.0.3692.0ú73.0.3683.17ú72.0.3626.89ú74.0.3687.3ú74.0.3691.1ú74.0.3691.0ú73.0.3683.16ú72.0.3626.88ú72.0.3626.87ú73.0.3683.15ú74.0.3690.1ú74.0.3690.0ú73.0.3683.14ú72.0.3626.86ú73.0.3683.13ú73.0.3683.12ú74.0.3689.1ú74.0.3689.0ú73.0.3683.11ú72.0.3626.85ú73.0.3683.10ú72.0.3626.84ú73.0.3683.9ú74.0.3688.1ú74.0.3688.0ú73.0.3683.8ú72.0.3626.83ú74.0.3687.2ú74.0.3687.1ú74.0.3687.0ú73.0.3683.7ú72.0.3626.82ú74.0.3686.4ú72.0.3626.81ú74.0.3686.3ú74.0.3686.2ú74.0.3686.1ú74.0.3686.0ú73.0.3683.6ú72.0.3626.80ú74.0.3685.1ú74.0.3685.0ú73.0.3683.5ú72.0.3626.79ú74.0.3684.1ú74.0.3684.0ú73.0.3683.4ú72.0.3626.78ú72.0.3626.77ú73.0.3683.3ú73.0.3683.2ú72.0.3626.76ú73.0.3683.1ú73.0.3683.0ú72.0.3626.75ú71.0.3578.141ú73.0.3682.1ú73.0.3682.0ú72.0.3626.74ú71.0.3578.140ú73.0.3681.4ú73.0.3681.3ú73.0.3681.2ú73.0.3681.1ú73.0.3681.0ú72.0.3626.73ú71.0.3578.139ú72.0.3626.72ú72.0.3626.71ú73.0.3680.1ú73.0.3680.0ú72.0.3626.70ú71.0.3578.138ú73.0.3678.2ú73.0.3679.1ú73.0.3679.0ú72.0.3626.69ú71.0.3578.137ú73.0.3678.1ú73.0.3678.0ú71.0.3578.136ú73.0.3677.1ú73.0.3677.0ú72.0.3626.68ú72.0.3626.67ú71.0.3578.135ú73.0.3676.1ú73.0.3676.0ú73.0.3674.2ú72.0.3626.66ú71.0.3578.134ú73.0.3674.1ú73.0.3674.0ú72.0.3626.65ú71.0.3578.133ú73.0.3673.2ú73.0.3673.1ú73.0.3673.0ú72.0.3626.64ú71.0.3578.132ú72.0.3626.63ú72.0.3626.62ú72.0.3626.61ú72.0.3626.60ú73.0.3672.1ú73.0.3672.0ú72.0.3626.59ú71.0.3578.131ú73.0.3671.3ú73.0.3671.2ú73.0.3671.1ú73.0.3671.0ú72.0.3626.58ú71.0.3578.130ú73.0.3670.1ú73.0.3670.0ú72.0.3626.57ú71.0.3578.129ú73.0.3669.1ú73.0.3669.0ú72.0.3626.56ú71.0.3578.128ú73.0.3668.2ú73.0.3668.1ú73.0.3668.0ú72.0.3626.55ú71.0.3578.127ú73.0.3667.2ú73.0.3667.1ú73.0.3667.0ú72.0.3626.54ú71.0.3578.126ú73.0.3666.1ú73.0.3666.0ú72.0.3626.53ú71.0.3578.125ú73.0.3665.4ú73.0.3665.3ú72.0.3626.52ú73.0.3665.2ú73.0.3664.4ú73.0.3665.1ú73.0.3665.0ú72.0.3626.51ú71.0.3578.124ú72.0.3626.50ú73.0.3664.3ú73.0.3664.2ú73.0.3664.1ú73.0.3664.0ú73.0.3663.2ú72.0.3626.49ú71.0.3578.123ú73.0.3663.1ú73.0.3663.0ú72.0.3626.48ú71.0.3578.122ú73.0.3662.1ú73.0.3662.0ú72.0.3626.47ú71.0.3578.121ú73.0.3661.1ú72.0.3626.46ú73.0.3661.0ú72.0.3626.45ú71.0.3578.120ú73.0.3660.2ú73.0.3660.1ú73.0.3660.0ú72.0.3626.44ú71.0.3578.119ú73.0.3659.1ú73.0.3659.0ú72.0.3626.43ú71.0.3578.118ú73.0.3658.1ú73.0.3658.0ú72.0.3626.42ú71.0.3578.117ú73.0.3657.1ú73.0.3657.0ú72.0.3626.41ú71.0.3578.116ú73.0.3656.1ú73.0.3656.0ú72.0.3626.40ú71.0.3578.115ú73.0.3655.1ú73.0.3655.0ú72.0.3626.39ú71.0.3578.114ú73.0.3654.1ú73.0.3654.0ú72.0.3626.38ú71.0.3578.113ú73.0.3653.1ú73.0.3653.0ú72.0.3626.37ú71.0.3578.112ú73.0.3652.1ú73.0.3652.0ú72.0.3626.36ú71.0.3578.111ú73.0.3651.1ú73.0.3651.0ú72.0.3626.35ú71.0.3578.110ú73.0.3650.1ú73.0.3650.0ú72.0.3626.34ú71.0.3578.109ú73.0.3649.1ú73.0.3649.0ú72.0.3626.33ú71.0.3578.108ú73.0.3648.2ú73.0.3648.1ú73.0.3648.0ú72.0.3626.32ú71.0.3578.107ú73.0.3647.2ú73.0.3647.1ú73.0.3647.0ú72.0.3626.31ú71.0.3578.106ú73.0.3635.3ú73.0.3646.2ú73.0.3646.1ú73.0.3646.0ú72.0.3626.30ú71.0.3578.105ú72.0.3626.29ú73.0.3645.2ú73.0.3645.1ú73.0.3645.0ú72.0.3626.28ú71.0.3578.104ú72.0.3626.27ú72.0.3626.26ú72.0.3626.25ú72.0.3626.24ú73.0.3644.0ú73.0.3643.2ú72.0.3626.23ú71.0.3578.103ú73.0.3643.1ú73.0.3643.0ú72.0.3626.22ú71.0.3578.102ú73.0.3642.1ú73.0.3642.0ú72.0.3626.21ú71.0.3578.101ú73.0.3641.1ú73.0.3641.0ú72.0.3626.20ú71.0.3578.100ú72.0.3626.19ú73.0.3640.1ú73.0.3640.0ú72.0.3626.18ú73.0.3639.1ú71.0.3578.99ú73.0.3639.0ú72.0.3626.17ú73.0.3638.2ú72.0.3626.16ú73.0.3638.1ú73.0.3638.0ú72.0.3626.15ú71.0.3578.98ú73.0.3635.2ú71.0.3578.97ú73.0.3637.1ú73.0.3637.0ú72.0.3626.14ú71.0.3578.96ú71.0.3578.95ú72.0.3626.13ú71.0.3578.94ú73.0.3636.2ú71.0.3578.93ú73.0.3636.1ú73.0.3636.0ú72.0.3626.12ú71.0.3578.92ú73.0.3635.1ú73.0.3635.0ú72.0.3626.11ú71.0.3578.91ú73.0.3634.2ú73.0.3634.1ú73.0.3634.0ú72.0.3626.10ú71.0.3578.90ú71.0.3578.89ú73.0.3633.2ú73.0.3633.1ú73.0.3633.0ú72.0.3610.4ú72.0.3626.9ú71.0.3578.88ú73.0.3632.5ú73.0.3632.4ú73.0.3632.3ú73.0.3632.2ú73.0.3632.1ú73.0.3632.0ú72.0.3626.8ú71.0.3578.87ú73.0.3631.2ú73.0.3631.1ú73.0.3631.0ú72.0.3626.7ú71.0.3578.86ú72.0.3626.6ú73.0.3630.1ú73.0.3630.0ú72.0.3626.5ú71.0.3578.85ú72.0.3626.4ú73.0.3628.3ú73.0.3628.2ú73.0.3629.1ú73.0.3629.0ú72.0.3626.3ú71.0.3578.84ú73.0.3628.1ú73.0.3628.0ú71.0.3578.83ú73.0.3627.1ú73.0.3627.0ú72.0.3626.2ú71.0.3578.82ú71.0.3578.81ú71.0.3578.80ú72.0.3626.1ú72.0.3626.0ú71.0.3578.79ú70.0.3538.124ú71.0.3578.78ú72.0.3623.4ú72.0.3625.2ú72.0.3625.1ú72.0.3625.0ú71.0.3578.77ú70.0.3538.123ú72.0.3624.4ú72.0.3624.3ú72.0.3624.2ú71.0.3578.76ú72.0.3624.1ú72.0.3624.0ú72.0.3623.3ú71.0.3578.75ú70.0.3538.122ú71.0.3578.74ú72.0.3623.2ú72.0.3610.3ú72.0.3623.1ú72.0.3623.0ú72.0.3622.3ú72.0.3622.2ú71.0.3578.73ú70.0.3538.121ú72.0.3622.1ú72.0.3622.0ú71.0.3578.72ú70.0.3538.120ú72.0.3621.1ú72.0.3621.0ú71.0.3578.71ú70.0.3538.119ú72.0.3620.1ú72.0.3620.0ú71.0.3578.70ú70.0.3538.118ú71.0.3578.69ú72.0.3619.1ú72.0.3619.0ú71.0.3578.68ú70.0.3538.117ú71.0.3578.67ú72.0.3618.1ú72.0.3618.0ú71.0.3578.66ú70.0.3538.116ú72.0.3617.1ú72.0.3617.0ú71.0.3578.65ú70.0.3538.115ú72.0.3602.3ú71.0.3578.64ú72.0.3616.1ú72.0.3616.0ú71.0.3578.63ú70.0.3538.114ú71.0.3578.62ú72.0.3615.1ú72.0.3615.0ú71.0.3578.61ú70.0.3538.113ú72.0.3614.1ú72.0.3614.0ú71.0.3578.60ú70.0.3538.112ú72.0.3613.1ú72.0.3613.0ú71.0.3578.59ú70.0.3538.111ú72.0.3612.2ú72.0.3612.1ú72.0.3612.0ú70.0.3538.110ú71.0.3578.58ú70.0.3538.109ú72.0.3611.2ú72.0.3611.1ú72.0.3611.0ú71.0.3578.57ú70.0.3538.108ú72.0.3610.2ú71.0.3578.56ú71.0.3578.55ú72.0.3610.1ú72.0.3610.0ú71.0.3578.54ú70.0.3538.107ú71.0.3578.53ú72.0.3609.3ú71.0.3578.52ú72.0.3609.2ú71.0.3578.51ú72.0.3608.5ú72.0.3609.1ú72.0.3609.0ú71.0.3578.50ú70.0.3538.106ú72.0.3608.4ú72.0.3608.3ú72.0.3608.2ú71.0.3578.49ú72.0.3608.1ú72.0.3608.0ú70.0.3538.105ú71.0.3578.48ú72.0.3607.1ú72.0.3607.0ú71.0.3578.47ú70.0.3538.104ú72.0.3606.2ú72.0.3606.1ú72.0.3606.0ú71.0.3578.46ú70.0.3538.103ú70.0.3538.102ú72.0.3605.3ú72.0.3605.2ú72.0.3605.1ú72.0.3605.0ú71.0.3578.45ú70.0.3538.101ú71.0.3578.44ú71.0.3578.43ú70.0.3538.100ú70.0.3538.99ú71.0.3578.42ú72.0.3604.1ú72.0.3604.0ú71.0.3578.41ú70.0.3538.98ú71.0.3578.40ú72.0.3603.2ú72.0.3603.1ú72.0.3603.0ú71.0.3578.39ú70.0.3538.97ú72.0.3602.2ú71.0.3578.38ú71.0.3578.37ú72.0.3602.1ú72.0.3602.0ú71.0.3578.36ú70.0.3538.96ú72.0.3601.1ú72.0.3601.0ú71.0.3578.35ú70.0.3538.95ú72.0.3600.1ú72.0.3600.0ú71.0.3578.34ú70.0.3538.94ú72.0.3599.3ú72.0.3599.2ú72.0.3599.1ú72.0.3599.0ú71.0.3578.33ú70.0.3538.93ú72.0.3598.1ú72.0.3598.0ú71.0.3578.32ú70.0.3538.87ú72.0.3597.1ú72.0.3597.0ú72.0.3596.2ú71.0.3578.31ú70.0.3538.86ú71.0.3578.30ú71.0.3578.29ú72.0.3596.1ú72.0.3596.0ú71.0.3578.28ú70.0.3538.85ú72.0.3595.2ú72.0.3591.3ú72.0.3595.1ú72.0.3595.0ú71.0.3578.27ú70.0.3538.84ú72.0.3594.1ú72.0.3594.0ú71.0.3578.26ú70.0.3538.83ú72.0.3593.2ú72.0.3593.1ú72.0.3593.0ú71.0.3578.25ú70.0.3538.82ú72.0.3589.3ú72.0.3592.2ú72.0.3592.1ú72.0.3592.0ú71.0.3578.24ú72.0.3589.2ú70.0.3538.81ú70.0.3538.80ú72.0.3591.2ú72.0.3591.1ú72.0.3591.0ú71.0.3578.23ú70.0.3538.79ú71.0.3578.22ú72.0.3590.1ú72.0.3590.0ú71.0.3578.21ú70.0.3538.78ú70.0.3538.77ú72.0.3589.1ú72.0.3589.0ú71.0.3578.20ú70.0.3538.76ú71.0.3578.19ú70.0.3538.75ú72.0.3588.1ú72.0.3588.0ú71.0.3578.18ú70.0.3538.74ú72.0.3586.2ú72.0.3587.0ú71.0.3578.17ú70.0.3538.73ú72.0.3586.1ú72.0.3586.0ú71.0.3578.16ú70.0.3538.72ú72.0.3585.1ú72.0.3585.0ú71.0.3578.15ú70.0.3538.71ú71.0.3578.14ú72.0.3584.1ú72.0.3584.0ú71.0.3578.13ú70.0.3538.70ú72.0.3583.2ú71.0.3578.12ú72.0.3583.1ú72.0.3583.0ú71.0.3578.11ú70.0.3538.69ú71.0.3578.10ú72.0.3582.0ú72.0.3581.4ú71.0.3578.9ú70.0.3538.67ú72.0.3581.3ú72.0.3581.2ú72.0.3581.1ú72.0.3581.0ú71.0.3578.8ú70.0.3538.66ú72.0.3580.1ú72.0.3580.0ú71.0.3578.7ú70.0.3538.65ú71.0.3578.6ú72.0.3579.1ú72.0.3579.0ú71.0.3578.5ú70.0.3538.64ú71.0.3578.4ú71.0.3578.3ú71.0.3578.2ú71.0.3578.1ú71.0.3578.0ú70.0.3538.63ú69.0.3497.128ú70.0.3538.62ú70.0.3538.61ú70.0.3538.60ú70.0.3538.59ú71.0.3577.1ú71.0.3577.0ú70.0.3538.58ú69.0.3497.127ú71.0.3576.2ú71.0.3576.1ú71.0.3576.0ú70.0.3538.57ú70.0.3538.56ú71.0.3575.2ú70.0.3538.55ú69.0.3497.126ú70.0.3538.54ú71.0.3575.1ú71.0.3575.0ú71.0.3574.1ú71.0.3574.0ú70.0.3538.53ú69.0.3497.125ú70.0.3538.52ú71.0.3573.1ú71.0.3573.0ú70.0.3538.51ú69.0.3497.124ú71.0.3572.1ú71.0.3572.0ú70.0.3538.50ú69.0.3497.123ú71.0.3571.2ú70.0.3538.49ú69.0.3497.122ú71.0.3571.1ú71.0.3571.0ú70.0.3538.48ú69.0.3497.121ú71.0.3570.1ú71.0.3570.0ú70.0.3538.47ú69.0.3497.120ú71.0.3568.2ú71.0.3569.1ú71.0.3569.0ú70.0.3538.46ú69.0.3497.119ú70.0.3538.45ú71.0.3568.1ú71.0.3568.0ú70.0.3538.44ú69.0.3497.118ú70.0.3538.43ú70.0.3538.42ú71.0.3567.1ú71.0.3567.0ú70.0.3538.41ú69.0.3497.117ú71.0.3566.1ú71.0.3566.0ú70.0.3538.40ú69.0.3497.116ú71.0.3565.1ú71.0.3565.0ú70.0.3538.39ú69.0.3497.115ú71.0.3564.1ú71.0.3564.0ú70.0.3538.38ú69.0.3497.114ú71.0.3563.0ú71.0.3562.2ú70.0.3538.37ú69.0.3497.113ú70.0.3538.36ú70.0.3538.35ú71.0.3562.1ú71.0.3562.0ú70.0.3538.34ú69.0.3497.112ú70.0.3538.33ú71.0.3561.1ú71.0.3561.0ú70.0.3538.32ú69.0.3497.111ú71.0.3559.6ú71.0.3560.1ú71.0.3560.0ú71.0.3559.5ú71.0.3559.4ú70.0.3538.31ú69.0.3497.110ú71.0.3559.3ú70.0.3538.30ú69.0.3497.109ú71.0.3559.2ú71.0.3559.1ú71.0.3559.0ú70.0.3538.29ú69.0.3497.108ú71.0.3558.2ú71.0.3558.1ú71.0.3558.0ú70.0.3538.28ú69.0.3497.107ú71.0.3557.2ú71.0.3557.1ú71.0.3557.0ú70.0.3538.27ú69.0.3497.106ú71.0.3554.4ú70.0.3538.26ú71.0.3556.1ú71.0.3556.0ú70.0.3538.25ú71.0.3554.3ú69.0.3497.105ú71.0.3554.2ú70.0.3538.24ú69.0.3497.104ú71.0.3555.2ú70.0.3538.23ú71.0.3555.1ú71.0.3555.0ú70.0.3538.22ú69.0.3497.103ú71.0.3554.1ú71.0.3554.0ú70.0.3538.21ú69.0.3497.102ú71.0.3553.3ú70.0.3538.20ú69.0.3497.101ú71.0.3553.2ú69.0.3497.100ú71.0.3553.1ú71.0.3553.0ú70.0.3538.19ú69.0.3497.99ú69.0.3497.98ú69.0.3497.97ú71.0.3552.6ú71.0.3552.5ú71.0.3552.4ú71.0.3552.3ú71.0.3552.2ú71.0.3552.1ú71.0.3552.0ú70.0.3538.18ú69.0.3497.96ú71.0.3551.3ú71.0.3551.2ú71.0.3551.1ú71.0.3551.0ú70.0.3538.17ú69.0.3497.95ú71.0.3550.3ú71.0.3550.2ú71.0.3550.1ú71.0.3550.0ú70.0.3538.16ú69.0.3497.94ú71.0.3549.1ú71.0.3549.0ú70.0.3538.15ú69.0.3497.93ú69.0.3497.92ú71.0.3548.1ú71.0.3548.0ú70.0.3538.14ú69.0.3497.91ú71.0.3547.1ú71.0.3547.0ú70.0.3538.13ú69.0.3497.90ú71.0.3546.2ú69.0.3497.89ú71.0.3546.1ú71.0.3546.0ú70.0.3538.12ú69.0.3497.88ú71.0.3545.4ú71.0.3545.3ú71.0.3545.2ú71.0.3545.1ú71.0.3545.0ú70.0.3538.11ú69.0.3497.87ú71.0.3544.5ú71.0.3544.4ú71.0.3544.3ú71.0.3544.2ú71.0.3544.1ú71.0.3544.0ú69.0.3497.86ú70.0.3538.10ú69.0.3497.85ú70.0.3538.9ú69.0.3497.84ú71.0.3543.4ú70.0.3538.8ú71.0.3543.3ú71.0.3543.2ú71.0.3543.1ú71.0.3543.0ú70.0.3538.7ú69.0.3497.83ú71.0.3542.2ú71.0.3542.1ú71.0.3542.0ú70.0.3538.6ú69.0.3497.82ú69.0.3497.81ú71.0.3541.1ú71.0.3541.0ú70.0.3538.5ú69.0.3497.80ú71.0.3540.1ú71.0.3540.0ú70.0.3538.4ú69.0.3497.79ú70.0.3538.3ú71.0.3539.1ú71.0.3539.0ú69.0.3497.78ú68.0.3440.134ú69.0.3497.77ú70.0.3538.2ú70.0.3538.1ú70.0.3538.0ú69.0.3497.76ú68.0.3440.133ú69.0.3497.75ú70.0.3537.2ú70.0.3537.1ú70.0.3537.0ú69.0.3497.74ú68.0.3440.132ú70.0.3536.0ú70.0.3535.5ú70.0.3535.4ú70.0.3535.3ú69.0.3497.73ú68.0.3440.131ú70.0.3532.8ú70.0.3532.7ú69.0.3497.72ú69.0.3497.71ú70.0.3535.2ú70.0.3535.1ú70.0.3535.0ú69.0.3497.70ú68.0.3440.130ú69.0.3497.69ú68.0.3440.129ú70.0.3534.4ú70.0.3534.3ú70.0.3534.2ú70.0.3534.1ú70.0.3534.0ú69.0.3497.68ú68.0.3440.128ú70.0.3533.2ú70.0.3533.1ú70.0.3533.0ú69.0.3497.67ú68.0.3440.127ú70.0.3532.6ú70.0.3532.5ú70.0.3532.4ú69.0.3497.66ú68.0.3440.126ú70.0.3532.3ú70.0.3532.2ú70.0.3532.1ú69.0.3497.60ú69.0.3497.65ú69.0.3497.64ú70.0.3532.0ú70.0.3531.0ú70.0.3530.4ú70.0.3530.3ú70.0.3530.2ú69.0.3497.58ú68.0.3440.125ú69.0.3497.57ú69.0.3497.56ú69.0.3497.55ú69.0.3497.54ú70.0.3530.1ú70.0.3530.0ú69.0.3497.53ú68.0.3440.124ú69.0.3497.52ú70.0.3529.3ú70.0.3529.2ú70.0.3529.1ú70.0.3529.0ú69.0.3497.51ú70.0.3528.4ú68.0.3440.123ú70.0.3528.3ú70.0.3528.2ú70.0.3528.1ú70.0.3528.0ú69.0.3497.50ú68.0.3440.122ú70.0.3527.1ú70.0.3527.0ú69.0.3497.49ú68.0.3440.121ú70.0.3526.1ú70.0.3526.0ú68.0.3440.120ú69.0.3497.48ú69.0.3497.47ú68.0.3440.119ú68.0.3440.118ú70.0.3525.5ú70.0.3525.4ú70.0.3525.3ú68.0.3440.117ú69.0.3497.46ú70.0.3525.2ú70.0.3525.1ú70.0.3525.0ú69.0.3497.45ú68.0.3440.116ú70.0.3524.4ú70.0.3524.3ú69.0.3497.44ú70.0.3524.2ú70.0.3524.1ú70.0.3524.0ú70.0.3523.2ú69.0.3497.43ú68.0.3440.115ú70.0.3505.9ú69.0.3497.42ú70.0.3505.8ú70.0.3523.1ú70.0.3523.0ú69.0.3497.41ú68.0.3440.114ú70.0.3505.7ú69.0.3497.40ú70.0.3522.1ú70.0.3522.0ú70.0.3521.2ú69.0.3497.39ú68.0.3440.113ú70.0.3505.6ú70.0.3521.1ú70.0.3521.0ú69.0.3497.38ú68.0.3440.112ú70.0.3520.1ú70.0.3520.0ú69.0.3497.37ú68.0.3440.111ú70.0.3519.3ú70.0.3519.2ú70.0.3519.1ú70.0.3519.0ú69.0.3497.36ú68.0.3440.110ú70.0.3518.1ú70.0.3518.0ú69.0.3497.35ú69.0.3497.34ú68.0.3440.109ú70.0.3517.1ú70.0.3517.0ú69.0.3497.33ú68.0.3440.108ú69.0.3497.32ú70.0.3516.3ú70.0.3516.2ú70.0.3516.1ú70.0.3516.0ú69.0.3497.31ú68.0.3440.107ú70.0.3515.4ú68.0.3440.106ú70.0.3515.3ú70.0.3515.2ú70.0.3515.1ú70.0.3515.0ú69.0.3497.30ú68.0.3440.105ú68.0.3440.104ú70.0.3514.2ú70.0.3514.1ú70.0.3514.0ú69.0.3497.29ú68.0.3440.103ú70.0.3513.1ú70.0.3513.0ú69.0.3497.28((  r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   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’   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Å   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ø   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+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  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’  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Å  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ø  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+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  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’  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Å  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ø  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+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  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’  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Å  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ø  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+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  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’  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Å  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ø  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+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  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’  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Å  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ø  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+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  )ÚrandomÚchoice)Z_USER_AGENT_TPLZ_CHROME_VERSIONSr(   r(   r)   Úrandom_user_agentV   sT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          rV  zISO-8859-1,utf-8;q=0.7,*;q=0.7z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zgzip, deflatezen-us,en;q=0.5)z
User-AgentzAccept-CharsetÚAcceptzAccept-EncodingzAccept-LanguageZSafarizqMozilla/5.0 (X11; Linux x86_64; rv:10.0) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27ÚJanuaryÚFebruaryZMarchZAprilÚMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecemberZjanvieru   fÃ©vrierZmarsZavrilÚmaiZjuinZjuilletu   aoÃ»tZ	septembreZoctobreZnovembreu	   dÃ©cembre)ÚenÚfrÚmp4Úm4aÚm4pÚm4bÚm4rÚm4vÚaacÚflvÚf4vÚf4aÚf4bÚwebmÚoggÚogvÚogaÚogxÚspxÚopusÚmkvÚmkaÚmk3dÚaviÚdivxÚmovÚasfÚwmvÚwmaÚ3gpÚ3g2Úmp3ÚflacÚapeÚwavÚf4fÚf4mÚm3u8Úsmiluˆ   Ã‚ÃƒÃ„Ã€Ã�Ã…Ã†Ã‡ÃˆÃ‰ÃŠÃ‹ÃŒÃ�ÃŽÃ�Ã�Ã‘Ã’Ã“Ã”Ã•Ã–Å�Ã˜Å’Ã™ÃšÃ›ÃœÅ°Ã�ÃžÃŸÃ Ã¡Ã¢Ã£Ã¤Ã¥Ã¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Å‘Ã¸Å“Ã¹ÃºÃ»Ã¼Å±Ã½Ã¾Ã¿ZAAAAAAÚAEZCEEEEIIIIDNOOOOOOOZOEZUUUUUYÚTHÚssZaaaaaaÚaeZceeeeiiiionoooooooZoeZuuuuuyÚthÚyú%d %B %Yú%d %b %Yú%B %d %Yú
%B %dst %Yú
%B %dnd %Yú
%B %drd %Yú
%B %dth %Yú%b %d %Yú
%b %dst %Yú
%b %dnd %Yú
%b %drd %Yú
%b %dth %Yú%b %dst %Y %I:%Mú%b %dnd %Y %I:%Mú%b %drd %Y %I:%Mú%b %dth %Y %I:%Mú%Y %m %dú%Y-%m-%dú%Y/%m/%dú%Y/%m/%d %H:%Mú%Y/%m/%d %H:%M:%Sú%Y-%m-%d %H:%Mú%Y-%m-%d %H:%M:%Sú%Y-%m-%d %H:%M:%S.%fú%d.%m.%Y %H:%Mú%d.%m.%Y %H.%Mú%Y-%m-%dT%H:%M:%SZú%Y-%m-%dT%H:%M:%S.%fZú%Y-%m-%dT%H:%M:%S.%f0Zú%Y-%m-%dT%H:%M:%Sú%Y-%m-%dT%H:%M:%S.%fú%Y-%m-%dT%H:%Mú%b %d %Y at %H:%Mú%b %d %Y at %H:%M:%Sú%B %d %Y at %H:%Mú%B %d %Y at %H:%M:%Sz%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Sz.}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)zS(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>(?P<json_ld>.+?)</script>c              C   s4   yt jƒ } dj| ƒ W n tk
r.   d} Y nX | S )z–Get preferred encoding.

    Returns the best encoding scheme for the system, based on
    locale.getpreferredencoding() and some further tweaks.
    ZTESTzUTF-8)ÚlocaleÚgetpreferredencodingÚencodeÚ	Exception)Zprefr(   r(   r)   Úpreferredencodingò  s    
r±  c                s@  t ˆƒ‰tjdk r@tjdkr@tƒ ‰ ‡ ‡fdd„}‡ ‡fdd„}ntjj}tjj}d|ˆƒd |ˆƒd	d
œ}tjdk r~d|d< n|j	dddœƒ t
jf t|ƒŽ}y\|� tj| |ƒ W dQ R X tjdkrêytjˆƒ W n tk
rè   Y nX tj|jˆƒ W n@ tk
�r:   ytj|jƒ W n tk
�r2   Y nX ‚ Y nX dS )z? Encode obj as JSON and write it to fn, atomically if possible é   r   Úwin32c                s   t jjˆƒjˆ ƒS )N)ÚosÚpathÚbasenameÚdecode)Úf)ÚencodingÚfnr(   r)   Ú<lambda>
  s    z!write_json_file.<locals>.<lambda>c                s   t jjˆƒjˆ ƒS )N)r´  rµ  Údirnamer·  )r¸  )r¹  rº  r(   r)   r»    s    z.tmpÚ.F)ÚsuffixÚprefixÚdirÚdeleteÚwbÚmodeÚwzutf-8)rÃ  r¹  N)r²  r   )r²  r   )ÚencodeFilenameÚsysÚversion_infoÚplatformÚget_filesystem_encodingr´  rµ  r¶  r¼  ÚupdateÚtempfileÚNamedTemporaryFiler   ÚjsonÚdumpÚunlinkÚOSErrorÚrenameÚnamer°  Úremove)Úobjrº  Zpath_basenameZpath_dirnameÚargsZtfr(   )r¹  rº  r)   Úwrite_json_file  s@    




rÖ  é   é   c             C   s:   t jd|ƒst‚||dkr"d| n
d||f  }| j|ƒS )z  Find the xpath xpath[@key=val] z^[a-zA-Z_-]+$Nz[@%s]z
[@%s='%s'])ÚreÚmatchÚAssertionErrorÚfind)ÚnodeÚxpathÚkeyÚvalÚexprr(   r(   r)   Úfind_xpath_attr8  s     râ  c             C   sD   x>| j t|ƒƒD ],}||jkr q|d ks8|jj|ƒ|kr|S qW d S )N)Úfindallr   ÚattribÚget)rÝ  rÞ  rß  rà  r¸  r(   r(   r)   râ  >  s    
c             C   sj   dd„ | j dƒD ƒ}g }xF|D ]>}t|ƒdkr>|j|d ƒ q|\}}|jd|| |f ƒ qW dj|ƒS )Nc             S   s   g | ]}|j d ƒ‘qS )ú:)Úsplit)Ú.0Úcr(   r(   r)   ú
<listcomp>K  s    z!xpath_with_ns.<locals>.<listcomp>ú/r   r   z{%s}%s)rç  Úlenr&   Újoin)rµ  Úns_mapÚ
componentsZreplacedré  ÚnsÚtagr(   r(   r)   Úxpath_with_nsJ  s    
rò  Fc                s‚   ‡ fdd„}t |ttfƒr$||ƒ}n x|D ]}||ƒ}|d k	r*P q*W |d kr~|tk	rX|S |rz|d krh|n|}td| ƒ‚nd S |S )Nc                s   ˆ j t| ƒƒS )N)rÜ  r   )rÞ  )rÝ  r(   r)   Ú_find_xpathW  s    z"xpath_element.<locals>._find_xpathzCould not find XML element %s)Ú
isinstanceÚstrr   Ú
NO_DEFAULTÚExtractorError)rÝ  rÞ  rÒ  ÚfatalÚdefaultró  ÚnZxpr(   )rÝ  r)   Úxpath_elementV  s    

rû  c             C   sh   t | ||||d�}|d ks"||kr&|S |jd krb|tk	r<|S |r^|d krL|n|}td| ƒ‚nd S |jS )N)rø  rù  z$Could not find XML element's text %s)rû  Útextrö  r÷  )rÝ  rÞ  rÒ  rø  rù  rú  r(   r(   r)   Ú
xpath_textm  s    
rý  c             C   sX   t | ||ƒ}|d krN|tk	r |S |rJ|d kr8d||f n|}td| ƒ‚nd S |j| S )Nz%s[@%s]zCould not find XML attribute %s)râ  rö  r÷  rä  )rÝ  rÞ  rß  rÒ  rø  rù  rú  r(   r(   r)   Ú
xpath_attr|  s    rþ  c             C   s   t d| |ƒS )zOReturn the content of the tag with the specified ID in the passed HTML documentÚid)Úget_element_by_attribute)rÿ  Úhtmlr(   r(   r)   Úget_element_by_id‰  s    r  c             C   s   t | |ƒ}|r|d S dS )zXReturn the content of the first tag with the specified class in the passed HTML documentr   N)Úget_elements_by_class)Ú
class_namer  Úretvalr(   r(   r)   Úget_element_by_classŽ  s    
r  Tc             C   s   t | |||ƒ}|r|d S d S )Nr   )Úget_elements_by_attribute)Ú	attributeÚvaluer  Úescape_valuer  r(   r(   r)   r   ”  s    r   c             C   s   t ddtj| ƒ |dd�S )z]Return the content of all tags with the specified class in the passed HTML document as a listÚclassz[^\'"]*\b%s\b[^\'"]*F)r
  )r  rÙ  Úescape)r  r  r(   r(   r)   r  ™  s    r  c             C   sv   |rt j|ƒn|}g }xZt jdt j| ƒ|f |ƒD ]<}|jdƒ}|jdƒsT|jdƒr`|dd… }|jt|ƒƒ q2W |S )zVReturn the content of the tag with the specified attribute in the passed HTML documenta  (?xs)
        <([a-zA-Z0-9:._-]+)
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
         \s+%s=['"]?%s['"]?
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
        \s*>
        (?P<content>.*?)
        </\1>
    Úcontentú"ú'r   éÿÿÿÿ)rÙ  r  ÚfinditerÚgroupÚ
startswithr&   ÚunescapeHTML)r  r	  r  r
  ZretlistÚmÚresr(   r(   r)   r     s    
r  c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚHTMLAttributeParserzATrivial HTML parser to gather the attributes for a single elementc             C   s   i | _ tj| ƒ d S )N)Úattrsr   Ú__init__)Úselfr(   r(   r)   r  »  s    zHTMLAttributeParser.__init__c             C   s   t |ƒ| _d S )N)Údictr  )r  rñ  r  r(   r(   r)   Úhandle_starttag¿  s    z#HTMLAttributeParser.handle_starttagN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r  r  r(   r(   r(   r)   r  ¹  s   r  c             C   s8   t ƒ }y|j| ƒ |jƒ  W n tk
r0   Y nX |jS )aû  Given a string for an HTML element such as
    <el
         a="foo" B="bar" c="&98;az" d=boz
         empty= noval entity="&amp;"
         sq='"' dq="'"
    >
    Decode and return a dictionary of attributes.
    {
        'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
        'empty': '', 'noval': None, 'entity': '&',
        'sq': '"', 'dq': '''
    }.
    NB HTMLParser is stricter in Python 2.6 & 3.2 than in later versions,
    but the cases in the unit test will work for all of 2.6, 2.7, 3.2-3.5.
    )r  ÚfeedÚcloser   r  )Zhtml_elementÚparserr(   r(   r)   Úextract_attributesÃ  s    
r$  c             C   sR   | dkr| S | j ddƒ} tjdd| ƒ} tjdd| ƒ} tjdd| ƒ} t| ƒ} | jƒ S )z,Clean an HTML snippet into a readable stringNÚ
ú z(?u)\s*<\s*br\s*/?\s*>\s*z(?u)<\s*/\s*p\s*>\s*<\s*p[^>]*>z<.*?>r+   )ÚreplacerÙ  Úsubr  Ústrip)r  r(   r(   r)   Ú
clean_htmlÝ  s    r*  c             C   sÈ   yb| dkrNt jdkr0ddl}|jt jjƒ tjƒ tt jdƒrDt jj	nt j| fS t
t| ƒ|ƒ}|| fS  ttfk
rÂ } z@|jtjfkrˆ‚ t| ƒ}|| krœ‚ nt
t|ƒ|ƒ}||fS W Y dd}~X nX dS )ao  Try to open the given filename, and slightly tweak it if this fails.

    Attempts to open the given filename. If this fails, it tries to change
    the filename slightly, step by step, until it's either able to open it
    or it fails and raises a final exception, like the standard open()
    function.

    It returns the tuple (stream, definitive_file_name).
    ú-r³  r   NÚbuffer)rÆ  rÈ  ÚmsvcrtÚsetmodeÚstdoutÚfilenor´  ÚO_BINARYÚhasattrr,  ÚopenrÅ  ÚIOErrorrÐ  ÚerrnoZEACCESÚsanitize_path)ÚfilenameZ	open_moder-  ÚstreamÚerrZalt_filenamer(   r(   r)   Úsanitize_openî  s     

r:  c             C   s(   d}t jj| ƒ}|dk	r$t jj|ƒ}|S )z:Convert RFC 2822 defined time string into system timestampN)ÚemailÚutilsÚparsedate_tzÚ	mktime_tz)ÚtimestrÚ	timestampÚ	timetupler(   r(   r)   Útimeconvert  s
    rB  c                s¤   ‡ fdd„}t jddd„ | ƒ} djt|| ƒƒ}|s xd|krJ|jddƒ}q4W |jdƒ}ˆ rp|jd	ƒrp|d
d… }|jdƒrŽd|tdƒd…  }|jdƒ}|s d}|S )zêSanitizes a string so it could be used as part of a filename.
    If restricted is set, use a stricter subset of allowed characters.
    Set is_id if this is not an arbitrary string, but an ID that should be kept
    if possible.
    c                sœ   ˆ r| t krt |  S | dks4t| ƒdk s4t| ƒdkr8dS | dkrLˆ rHdS dS | dkr`ˆ r\dS d	S | d
krldS ˆ r„| dks€| jƒ r„dS ˆ r˜t| ƒdkr˜dS | S )Nú?é    é   r+   r  r  ræ  z_-z -z\/|*<>Ú_z!&'()[]{}$;`^,#)ÚACCENT_CHARSÚordÚisspace)Úchar)Ú
restrictedr(   r)   Úreplace_insane  s     z)sanitize_filename.<locals>.replace_insanez[0-9]+(?::[0-9]+)+c             S   s   | j dƒjddƒS )Nr   ræ  rF  )r  r'  )r  r(   r(   r)   r»  /  s    z#sanitize_filename.<locals>.<lambda>r+   Ú__rF  z-_r×  Nr+  r½  )	rÙ  r(  rí  Úmapr'  r)  r  rì  Úlstrip)ÚsrK  Zis_idrL  Úresultr(   )rK  r)   Úsanitize_filename  s    



rR  c             C   sš   t jdkr| S tjj| ƒ\}}t jdk r>| r>tjj| ƒ\}}tjjt| |ƒƒj	tjj
ƒ}|rh|jdƒ dd„ |D ƒ}|rŽ|jd|tjj
 ƒ tjj|Ž S )z(Sanitizes and normalizes path on Windowsr³  r×  rØ  r   c             S   s&   g | ]}|dkr|nt jdd|ƒ‘qS )r½  ú..z(?:[/<>:"\|\\?\*]|[\s.]$)ú#)r½  rS  )rÙ  r(  )rè  Z	path_partr(   r(   r)   rê  K  s   z!sanitize_path.<locals>.<listcomp>)r×  rØ  )rÆ  rÈ  r´  rµ  Ú
splitdriverÇ  ÚsplituncÚnormpathÚremove_startrç  ÚsepÚpopÚinsertrí  )rP  Zdrive_or_uncrF  Z	norm_pathZsanitized_pathr(   r(   r)   r6  @  s    

r6  c             C   sF   | j dƒrd|  S d	}x*|D ]"\}}tj|| ƒrtj||| ƒS qW | S )
Nz//zhttp:%sú
^httpss://úhttps://ú^rmtp([es]?)://ú	rtmp\1://©r\  r]  ©r^  r_  )r`  ra  )r  rÙ  rÚ  r(  )ÚurlZCOMMON_TYPOSZmistakeÚfixupr(   r(   r)   Úsanitize_urlR  s    
 rd  c             O   s   t jt| ƒf|ž|ŽS )N)r   ÚRequestrd  )rb  rÕ  Úkwargsr(   r(   r)   Úsanitized_Requestd  s    rg  c             C   s   t jjt| ƒƒS )zExpand shell variables and ~)r´  rµ  Ú
expandvarsr   )rP  r(   r(   r)   Úexpand_pathh  s    ri  c             C   s(   g }x| D ]}||kr
|j |ƒ q
W |S )z/ Remove all duplicates from the input iterable )r&   )Úiterabler  Úelr(   r(   r)   Ú
orderedSetm  s
    
rl  c             C   sš   | dd	… }|t jkr$tt j| ƒS | tkr4t|  S tjd|ƒ}|dk	r’|jdƒ}|jdƒrjd}d| }nd}ytt||ƒƒS  t	k
r�   Y nX d| S )
z)Transforms an HTML entity to a character.Nr   z#(x[0-9a-fA-F]+|[0-9]+)Úxé   z0%sé
   z&%s;r  )
r   Úname2codepointr   r   rÙ  rÚ  r  r  ÚintÚ
ValueError)Zentity_with_semicolonÚentityÚmobjZnumstrÚbaser(   r(   r)   Ú_htmlentity_transformv  s"    



rv  c             C   s.   | d krd S t | ƒtkst‚tjddd„ | ƒS )Nz
&([^&;]+;)c             S   s   t | jdƒƒS )Nr   )rv  r  )r  r(   r(   r)   r»  ›  s    zunescapeHTML.<locals>.<lambda>)Útyper   rÛ  rÙ  r(  )rP  r(   r(   r)   r  •  s
    r  c              C   s:   t jdkr"t jƒ d dkr"tƒ } nt jƒ } | d kr6d} | S )Nr³  r   é   zutf-8)rÆ  rÈ  Úgetwindowsversionr±  Úgetfilesystemencoding)r¹  r(   r(   r)   Úget_subprocess_encodingž  s    r{  c             C   s`   t | ƒtkst‚tjdkr| S | rBtjdkrBtjƒ d dkrB| S tjjdƒrR| S | jt	ƒ dƒS )z'
    @param s The name of the file
    r²  r   r³  rx  ÚjavaÚignore)r²  r   )
rw  r   rÛ  rÆ  rÇ  rÈ  ry  r  r¯  r{  )rP  Úfor_subprocessr(   r(   r)   rÅ  ª  s    
 rÅ  c             C   s*   t jdkr| S t| tƒs| S | jtƒ dƒS )Nr²  r   r}  )r²  r   )rÆ  rÇ  rô  Úbytesr·  r{  )Úbr~  r(   r(   r)   ÚdecodeFilenameÂ  s
    

r�  c             C   s   t | tƒs| jdƒ} t| dƒS )NÚasciiT)rô  r   r·  rÅ  )rP  r(   r(   r)   ÚencodeArgumentÍ  s    

rƒ  c             C   s
   t | dƒS )NT)r�  )r€  r(   r(   r)   ÚdecodeArgumentÖ  s    r„  c             C   s4   | d kr| S t | tƒr"| jtƒ ƒ} t | tƒs0t‚| S )N)rô  r  r·  r±  r   rÛ  )Zoptvalr(   r(   r)   ÚdecodeOptionÚ  s    
r…  c             C   sN   | dkr&d| d | d d | d f S | dkrBd| d | d f S d|  S d S )Ni  z%d:%02d:%02dé<   z%d:%02dz%dr(   )Úsecsr(   r(   r)   ÚformatSecondsä  s
    rˆ  c             K   s´   | j ddƒ}ttdƒr`tjtjjƒ}|r6d|_tj|_yt	| fd|i|—ŽS  t
k
r^   Y nX tjdk rvt	| f|ŽS tjtjƒ}|rŒtjntj|_|jƒ  t	| fd|i|—ŽS d S )NÚnocheckcertificateFÚcreate_default_contextÚcontextr²  r×  )r²  r×  )rå  r2  ÚsslrŠ  ÚPurposeÚSERVER_AUTHÚcheck_hostnameÚ	CERT_NONEÚverify_modeÚYoutubeDLHTTPSHandlerÚ	TypeErrorrÆ  rÇ  Ú
SSLContextÚPROTOCOL_TLSv1ÚCERT_REQUIREDÚset_default_verify_paths)Úparamsrf  Zopts_no_check_certificater‹  r(   r(   r)   Úmake_HTTPS_handlerí  s"    


r™  c              C   s,   t ƒ rd} nd} d}|d|  7 }|d7 }|S )Nztype  youtube-dl -U  to updatez/see  https://yt-dl.org/update  on how to updatez5; please report this issue on https://yt-dl.org/bug .z0 Make sure you are using the latest version; %s.zT Be sure to call youtube-dl with the --verbose flag and include its complete output.)Úytdl_is_updateable)Z
update_cmdÚmsgr(   r(   r)   Úbug_reports_message	  s    rœ  c               @   s   e Zd ZdZdS )ÚYoutubeDLErrorz$Base exception for YoutubeDL errors.N)r  r  r  r   r(   r(   r(   r)   r�  	  s   r�  c                   s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )	r÷  zError during info extraction.NFc                s€   t jƒ d tjtjtfkrd}|dk	r2|d | }|rB|d| 7 }|sP|tƒ 7 }tt	| ƒj
|ƒ || _t jƒ | _|| _|| _dS )z¶ tb, if given, is the original traceback (so that it can be printed out).
        If expected is set, this is a normal error message and most likely not a bug in youtube-dl.
        r   TNz: z (caused by %r))rÆ  Úexc_infor   ÚURLErrorÚsocketÚtimeoutÚUnavailableVideoErrorrœ  Úsuperr÷  r  Ú	tracebackÚcauseÚvideo_id)r  r›  ÚtbÚexpectedr¥  r¦  )Ú	__class__r(   r)   r  	  s    

zExtractorError.__init__c             C   s    | j d krd S djt j| j ƒƒS )Nr+   )r¤  rí  Ú	format_tb)r  r(   r(   r)   Úformat_traceback-	  s    
zExtractorError.format_traceback)NFNN)r  r  r  r   r  r«  Ú__classcell__r(   r(   )r©  r)   r÷  	  s   r÷  c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚUnsupportedErrorc                s"   t t| ƒjd| dd� || _d S )NzUnsupported URL: %sT)r¨  )r£  r­  r  rb  )r  rb  )r©  r(   r)   r  4	  s    
zUnsupportedError.__init__)r  r  r  r  r¬  r(   r(   )r©  r)   r­  3	  s   r­  c               @   s   e Zd ZdZdS )ÚRegexNotFoundErrorzError when a regex didn't matchN)r  r  r  r   r(   r(   r(   r)   r®  :	  s   r®  c                   s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚGeoRestrictedErrorzÃGeographic restriction Error exception.

    This exception may be thrown when a video is not available from your
    geographic location due to geographic restrictions imposed by a website.
    Nc                s$   t t| ƒj|dd� || _|| _d S )NT)r¨  )r£  r¯  r  r›  Ú	countries)r  r›  r°  )r©  r(   r)   r  E	  s    zGeoRestrictedError.__init__)N)r  r  r  r   r  r¬  r(   r(   )r©  r)   r¯  ?	  s   r¯  c                   s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚDownloadErrorzÅDownload Error exception.

    This exception may be thrown by FileDownloader objects if they are not
    configured to continue on errors. They will contain the appropriate
    error message.
    Nc                s   t t| ƒj|ƒ || _dS )zh exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). N)r£  r±  r  rž  )r  r›  rž  )r©  r(   r)   r  S	  s    zDownloadError.__init__)N)r  r  r  r   r  r¬  r(   r(   )r©  r)   r±  K	  s   r±  c               @   s   e Zd ZdZdS )ÚSameFileErrorz®Same File exception.

    This exception will be thrown by FileDownloader objects if they detect
    multiple files would have to be downloaded to the same file on disk.
    N)r  r  r  r   r(   r(   r(   r)   r²  Y	  s   r²  c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚPostProcessingErrorz—Post Processing exception.

    This exception may be raised by PostProcessor's .run() method to
    indicate an error in the postprocessing task.
    c                s   t t| ƒj|ƒ || _d S )N)r£  r³  r  r›  )r  r›  )r©  r(   r)   r  i	  s    zPostProcessingError.__init__)r  r  r  r   r  r¬  r(   r(   )r©  r)   r³  b	  s   r³  c               @   s   e Zd ZdZdS )ÚMaxDownloadsReachedz) --max-downloads limit has been reached. N)r  r  r  r   r(   r(   r(   r)   r´  n	  s   r´  c               @   s   e Zd ZdZdS )r¢  z•Unavailable Format exception.

    This exception will be thrown when a video is requested
    in a format that is not available for that video.
    N)r  r  r  r   r(   r(   r(   r)   r¢  s	  s   r¢  c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚContentTooShortErrorzåContent Too Short exception.

    This exception may be raised by FileDownloader objects when a file they
    download is too small for what the server announced first, indicating
    the connection was probably interrupted.
    c                s(   t t| ƒjdj||ƒƒ || _|| _d S )Nz(Downloaded {0} bytes, expected {1} bytes)r£  rµ  r  ÚformatÚ
downloadedr¨  )r  r·  r¨  )r©  r(   r)   r  „	  s    
zContentTooShortError.__init__)r  r  r  r   r  r¬  r(   r(   )r©  r)   rµ  |	  s   rµ  c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚXAttrMetadataErrorNúUnknown errorc                sr   t t| ƒj|ƒ || _|| _| jtjtjfksBd| jksBd| jkrJd| _n$| jtj	ks`d| jkrhd| _nd| _d S )NzNo space leftzDisk quota exceddedZNO_SPACEzArgument list too longZVALUE_TOO_LONGZNOT_SUPPORTED)
r£  r¸  r  Úcoder›  r5  ZENOSPCZEDQUOTÚreasonZE2BIG)r  rº  r›  )r©  r(   r)   r  Ž	  s    zXAttrMetadataError.__init__)Nr¹  )r  r  r  r  r¬  r(   r(   )r©  r)   r¸  �	  s   r¸  c               @   s   e Zd ZdS )ÚXAttrUnavailableErrorN)r  r  r  r(   r(   r(   r)   r¼  �	  s   r¼  c                s�   t jdk rd|d< ||t|ƒŽ}| jjdƒ}|d k	rŒtjd fdd„‰ t|dƒrTˆ |_|df‰t|dƒrnˆ|_	n‡ ‡‡fd	d
„}t
j||ƒ|_|S )Nr²  r   TÚstrictÚsource_addressc                s4  | \}}d }t j||dt jƒ}d|d kr0t jnt j‰ ‡ fdd„|D ƒ}|rz| rzˆ t jkr`dnd}t jd||d f ƒ‚xš|D ]’}	|	\‰ }
}}}d }y>t j ˆ |
|ƒ}|t jk	rº|j|ƒ |j|ƒ |j	|ƒ d }|S  t jk
�r } z|}|d k	�r |j
ƒ  W Y d d }~X q€X q€W |d k	�r&|‚n
t jdƒ‚d S )	Nr   r½  c                s   g | ]}|d  ˆ kr|‘qS )r   r(   )rè  Úaddr)Úafr(   r)   rê  µ	  s    zG_create_http_connection.<locals>._create_connection.<locals>.<listcomp>Zv4Zv6zPNo remote IP%s addresses available for connect, can't use '%s' as source addressz!getaddrinfo returns an empty list)r   ÚgetaddrinfoÚSOCK_STREAMÚAF_INETÚAF_INET6ÚerrorÚ_GLOBAL_DEFAULT_TIMEOUTÚ
settimeoutÚbindÚconnectr"  )Úaddressr¡  r¾  ÚhostÚportr9  ÚaddrsZip_addrsZ
ip_versionr  ÚsocktypeÚprotoÚ	canonnameÚsaÚsockrF  r(   )rÀ  r)   Ú_create_connection°	  s8    







z3_create_http_connection.<locals>._create_connectionrÓ  c                s@   ˆ | j | jf| jˆƒ}ˆr6tj|| j| jtjd�| _n|| _d S )N)Ússl_version)	rË  rÌ  r¡  rŒ  Úwrap_socketÚkey_fileÚ	cert_filer•  rÒ  )r  rÕ  rf  rÒ  )rÓ  Úis_httpsrÑ  r(   r)   Ú_hc_connectÔ	  s    
z,_create_http_connection.<locals>._hc_connect)r²  r   )rÆ  rÇ  r   Ú_paramsrå  r   rÆ  r2  rÓ  r¾  Ú	functoolsÚpartialrÉ  )Zydl_handlerÚ
http_classrØ  rÕ  rf  Zhcr¾  rÙ  r(   )rÓ  rØ  rÑ  r)   Ú_create_http_connection¡	  s    


	rÞ  c             C   s,   | }d|kr(t dd„ |jƒ D ƒƒ}|d= |S )NzYoutubedl-no-compressionc             s   s&   | ]\}}|j ƒ d kr||fV  qdS )zaccept-encodingN)Úlower)rè  ÚkÚvr(   r(   r)   ú	<genexpr>æ	  s    z+handle_youtubedl_headers.<locals>.<genexpr>)r  Úitems)ÚheadersZfiltered_headersr(   r(   r)   Úhandle_youtubedl_headersâ	  s
    rå  c               @   sD   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd
d„ Z	eZ
e	ZdS )ÚYoutubeDLHandlera‚  Handler for HTTP requests and responses.

    This class, when installed with an OpenerDirector, automatically adds
    the standard headers to every HTTP request and handles gzipped and
    deflated responses from web servers. If compression is to be avoided in
    a particular request, the original request in the program code only has
    to include the HTTP header "Youtubedl-no-compression", which will be
    removed before making the real request.

    Part of this code was copied from:

    http://techknack.net/python-urllib2-handlers/

    Andrew Rowls, the author of that code, agreed to release it to the
    public domain.
    c             O   s   t jj| f|ž|Ž || _d S )N)r   ÚHTTPHandlerr  rÚ  )r  r˜  rÕ  rf  r(   r(   r)   r  þ	  s    zYoutubeDLHandler.__init__c             C   s@   t j}|jjdƒ}|r(t||ƒ}|jd= | jtjt| |dƒ|ƒS )NzYtdl-socks-proxyF)	r   ÚHTTPConnectionrä  rå  Úmake_socks_conn_classÚdo_openrÛ  rÜ  rÞ  )r  ÚreqÚ
conn_classÚsocks_proxyr(   r(   r)   Ú	http_open
  s    

zYoutubeDLHandler.http_openc             C   s2   yt j| t j ƒS  t jk
r,   t j| ƒS X d S )N)ÚzlibÚ
decompressÚ	MAX_WBITSrÅ  )Údatar(   r(   r)   Údeflate
  s    zYoutubeDLHandler.deflatec             C   sž   |j ƒ }t|ƒ}||kr$t||d�}x.tjƒ D ]"\}}|jƒ |jkr.|j||ƒ q.W t|jƒ|_t	j
dk ršd|j ƒ krš|jjdƒd |_|jjdƒd |_|S )N)rb  r×  rØ  rT  r   )r×  rØ  )Úget_full_urlÚ
escape_urlÚupdate_RequestÚstd_headersrã  Ú
capitalizerä  Ú
add_headerrå  rÆ  rÇ  Z_Request__originalÚ	partitionZ_Request__r_type)r  rë  rb  Zurl_escapedÚhrá  r(   r(   r)   Úhttp_request
  s    	zYoutubeDLHandler.http_requestc             C   sÔ  |}|j jddƒdkrð|jƒ }tjtj|ƒdd�}ytj|jƒ ƒ}W n„ tk
rÈ } zhx`tddƒD ]N}y0tjtj|d | … ƒdd�}tj|jƒ ƒ}W n tk
r¬   wbY nX P qbW |‚W Y d d }~X nX t	j
||j |j|jƒ}|j|_|j d= |j jddƒdk�r>tj| j|jƒ ƒƒ}t	j
||j |j|jƒ}|j|_|j d= d	|j  k�oTd
k n  �rÐ|j jdƒ}	|	�rÐtjdk�rŒ|	jdƒjdƒ}	n
|	jdƒ}	t|	ƒ}
|	|
k�rÐ|j d= tjdk �rÆ|
jdƒ}
|
|j d< |S )NzContent-encodingr+   ÚgzipÚrb)ÚfileobjrÃ  r   i   ró  i,  i�  ÚLocationr²  r   z
iso-8859-1zutf-8)r²  r   )r²  r   )rä  rå  Úreadrý  ZGzipFileÚioÚBytesIOr4  Úranger   Ú
addinfourlrb  rº  r›  ró  rÆ  rÇ  r¯  r·  rõ  )r  rë  ÚrespZold_respr  ÚgzZuncompressedZoriginal_ioerrorÚiÚlocationZlocation_escapedr(   r(   r)   Úhttp_response4
  sH    



zYoutubeDLHandler.http_responseN)r  r  r  r   r  rî  Ústaticmethodró  rü  r
  Úhttps_requestÚhttps_responser(   r(   r(   r)   ræ  ì	  s   /ræ  c                s¤   t | tjtjfƒst‚tj|ƒ}|jjƒ dkr6t	j
}n*|jjƒ dkrLt	j}n|jjƒ dkr`t	j}dd„ }||j|jpvdd||jƒ||jƒf‰ G ‡ fd	d
„d
| ƒ}|S )Nr$   r!   r"   r#   c             S   s   | s| S t | ƒS )N)r   )rP  r(   r(   r)   Úunquote_if_non_emptys
  s    z3make_socks_conn_class.<locals>.unquote_if_non_emptyi8  Tc                   s   e Zd Z‡ fdd„ZdS )z.make_socks_conn_class.<locals>.SocksConnectionc                sˆ   t ƒ | _| jjˆ Ž  t| jƒttfkr4| jj| jƒ | jj| j	| j
fƒ t| tjƒr„t| dƒrv| jj| j| j	d�| _ntj| jƒ| _d S )NÚ_context)Úserver_hostname)r    rÒ  Zsetproxyrw  r¡  rq  ÚfloatrÇ  rÉ  rË  rÌ  rô  r   ÚHTTPSConnectionr2  r  rÕ  rŒ  )r  )Ú
proxy_argsr(   r)   rÉ  �
  s    
z6make_socks_conn_class.<locals>.SocksConnection.connectN)r  r  r  rÉ  r(   )r  r(   r)   ÚSocksConnection€
  s   r  )r!   r"   )Ú
issubclassr   rè  r  rÛ  r   Úurlparser'   rß  r   ZSOCKS5ZSOCKS4ZSOCKS4AÚhostnamerÌ  ÚusernameÚpassword)Z
base_classrí  Zurl_componentsZ
socks_typer  r  r(   )r  r)   ré  g
  s"    
ré  c               @   s   e Zd Zddd„Zdd„ ZdS )r’  Nc             O   s*   t jj| f|ž|Ž |ptj| _|| _d S )N)r   ÚHTTPSHandlerr  r   r  Ú_https_conn_classrÚ  )r  r˜  Zhttps_conn_classrÕ  rf  r(   r(   r)   r  “
  s    zYoutubeDLHTTPSHandler.__init__c             C   sp   i }| j }t| dƒr| j|d< t| dƒr2| j|d< |jjdƒ}|rTt||ƒ}|jd= | jtj	t
| |dƒ|f|ŽS )Nr  r‹  Ú_check_hostnamer�  zYtdl-socks-proxyT)r  r2  r  r  rä  rå  ré  rê  rÛ  rÜ  rÞ  )r  rë  rf  rì  rí  r(   r(   r)   Ú
https_open˜
  s    





z YoutubeDLHTTPSHandler.https_open)N)r  r  r  r  r  r(   r(   r(   r)   r’  ’
  s   
r’  c               @   s(   e Zd ZdZdZd	dd„Zd
dd„ZdS )ÚYoutubeDLCookieJarz]
    See [1] for cookie file format.

    1. https://curl.haxx.se/docs/http-cookies.html
    z
#HttpOnly_NFc             C   s4   x| D ]}|j d krd|_ qW tjj| |||ƒ d S )Nr   )Úexpiresr   ÚMozillaCookieJarÚsave)r  r7  Úignore_discardÚignore_expiresÚcookier(   r(   r)   r!  ³
  s    


zYoutubeDLCookieJar.savec             C   s¼   |dkr$| j dk	r| j }n
ttjƒ‚tjƒ }t|ƒ�@}x8|D ]0}|j| jƒr^|t	| jƒd… }|j
t|ƒƒ q<W W dQ R X |jdƒ | j||||ƒ x"| D ]}|jdkršd|_d|_qšW dS )zLoad cookies from a file.Nr   T)r7  rr  r   ÚMISSING_FILENAME_TEXTr  ÚStringIOr3  r  Ú_HTTPONLY_PREFIXrì  Úwriter   ÚseekÚ_really_loadr  Údiscard)r  r7  r"  r#  Zcfr¸  Úliner$  r(   r(   r)   Úload»
  s     







zYoutubeDLCookieJar.load)NFF)NFF)r  r  r  r   r'  r!  r-  r(   r(   r(   r)   r  «
  s   
r  c               @   s*   e Zd Zddd„Zdd„ ZejjZeZ	dS )ÚYoutubeDLCookieProcessorNc             C   s   t jj| |ƒ d S )N)r   ÚHTTPCookieProcessorr  )r  Ú	cookiejarr(   r(   r)   r  Ü
  s    z!YoutubeDLCookieProcessor.__init__c             C   s   t jj| ||ƒS )N)r   r/  r
  )r  ÚrequestÚresponser(   r(   r)   r
  ß
  s    z&YoutubeDLCookieProcessor.http_response)N)
r  r  r  r  r
  r   r/  rü  r  r  r(   r(   r(   r)   r.  Û
  s   
r.  c               @   s"   e Zd Zejd dk rdd„ ZdS )ÚYoutubeDLRedirectHandlerr   r²  c          	   C   s   t jj| |||||t|ƒƒS )N)r   ÚHTTPRedirectHandlerÚredirect_requestr   )r  rë  Úfprº  r›  rä  Únewurlr(   r(   r)   r5  õ
  s    z)YoutubeDLRedirectHandler.redirect_requestN)r  r  r  rÆ  rÇ  r5  r(   r(   r(   r)   r3  ó
  s   r3  c             C   sŽ   t jd| ƒ}|stjƒ }nl| d t|jdƒƒ … } |jdƒsFtjƒ }n@|jdƒdkrXdnd	}tj|t|jdƒƒ |t|jdƒƒ d�}|| fS )
NzM^.{8,}?(?P<tz>Z$| ?(?P<sign>\+|-)(?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})$)ÚtzÚsignú+r   ÚhoursÚminutes)r;  r<  r  )rÙ  ÚsearchÚdatetimeÚ	timedeltarì  r  rq  )Údate_strr  Útimezoner9  r(   r(   r)   Úextract_timezoneü
  s    


rB  ÚTc             C   sr   | dkrdS t jdd| ƒ} |dkr.t| ƒ\}} y*dj|ƒ}tjj| |ƒ| }tj|jƒ ƒS  t	k
rl   Y nX dS )z- Return a UNIX timestamp from the given date Nz\.[0-9]+r+   z%Y-%m-%d{0}%H:%M:%S)
rÙ  r(  rB  r¶  r>  ÚstrptimeÚcalendarÚtimegmrA  rr  )r@  Ú	delimiterrA  Zdate_formatÚdtr(   r(   r)   Úparse_iso8601  s    
rI  c             C   s   | rt S tS )N)ÚDATE_FORMATS_DAY_FIRSTÚDATE_FORMATS_MONTH_FIRST)Ú	day_firstr(   r(   r)   Údate_formats!  s    rM  c             C   sÔ   | dkrdS d}| j ddƒ} tjdd| ƒ} t| ƒ\}} x>t|ƒD ]2}ytjj| |ƒjdƒ}W q@ tk
rp   Y q@X q@W |dkrÀt	j
j| ƒ}|rÀytj|dd… Ž jdƒ}W n tk
r¾   Y nX |dk	rÐt|ƒS dS )z4Return a string with the date in the format YYYYMMDDNú,r&  z(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r+   z%Y%m%dé   )r'  rÙ  r(  rB  rM  r>  rD  Ústrftimerr  r;  r<  r=  r   )r@  rL  Zupload_daterF  Ú
expressionrA  r(   r(   r)   Úunified_strdate%  s(    
rR  c             C   s  | d krd S t jdd| ƒ} t jd| ƒr*dnd}t| ƒ\}} t jdd| ƒ} t jd| ƒ}|rp| d t|jdƒƒ … } t jd	| ƒ}|rŠ|jd
ƒ} xRt|ƒD ]F}y,tjj| |ƒ| tj	|d� }t
j|jƒ ƒS  tk
rØ   Y q”X q”W tjj| ƒ}|�rt
j|ƒ|d  S d S )Nz[,|]r+   z(?i)PMé   r   z(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?z+\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$r8  zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r   )r;  i  )rÙ  r(  r=  rB  rì  r  rM  r>  rD  r?  rE  rF  rA  rr  r;  r<  r=  )r@  rL  Zpm_deltarA  r  rQ  rH  rA  r(   r(   r)   Úunified_timestampA  s*    

rT  Úunknown_videoc             C   s\   | d ksd| kr|S | j dƒd jdƒd }tjd|ƒr<|S |jdƒtkrT|jdƒS |S d S )Nr½  rC  r   r×  z^[A-Za-z0-9]+$rë  )rú  Ú
rpartitionrÙ  rÚ  ÚrstripÚKNOWN_EXTENSIONS)rb  Údefault_extZguessr(   r(   r)   Údetermine_extb  s    
rZ  c             C   s   t | |d | |ƒS )Nr½  )Úreplace_extension)r7  Zsub_langZ
sub_formatÚexpected_real_extr(   r(   r)   Úsubtitles_filenameo  s    r]  c             C   sÎ   t jjƒ }| dkr|S | dkr.|t jdd� S tjd| ƒ}|dk	r¼|jdƒ}t|jd	ƒƒ}|d
krh| }|jdƒ}|dkrˆd}|d9 }n|dkrœd}|d9 }|d7 }t jf ||iŽ}|| S t j j| dƒjƒ S )zw
    Return a datetime object from a string in the format YYYYMMDD or
    (now|today)[+-][0-9](day|week|month|year)(s)?ÚnowÚtodayZ	yesterdayr   )ÚdayszG(now|today)(?P<sign>[+-])(?P<time>\d+)(?P<unit>day|week|month|year)(s)?Nr9  Útimer+  ÚunitÚmonthÚdayé   Úyearim  rP  z%Y%m%d)r^  r_  )	r>  Údater_  r?  rÙ  rÚ  r  rq  rD  )r@  r_  rÚ  r9  ra  rb  Údeltar(   r(   r)   Údate_from_strs  s,    



ri  c             C   s*   t jd| ƒ}|dk	r"dj|jƒ ƒS | S dS )z?
    Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$Nr+  )rÙ  rÚ  rí  Úgroups)r@  rÚ  r(   r(   r)   Úhyphenate_date�  s    rk  c               @   s6   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	d
„ ZdS )Ú	DateRangez,Represents a time interval between two datesNc             C   s`   |dk	rt |ƒ| _ntjjjƒ | _|dk	r6t |ƒ| _ntjjjƒ | _| j| jkr\td|  ƒ‚dS )z<start and end must be strings in the format accepted by dateNz=Date range: "%s" , the start date must be before the end date)ri  Ústartr>  Úminrg  ÚendÚmaxrr  )r  rm  ro  r(   r(   r)   r  �  s    zDateRange.__init__c             C   s
   | ||ƒS )z0Returns a range that only contains the given dayr(   )Úclsrd  r(   r(   r)   rd  ª  s    zDateRange.dayc             C   s0   t |tjƒst|ƒ}| j|  ko*| jkS   S )z!Check if the date is in the range)rô  r>  rg  ri  rm  ro  )r  rg  r(   r(   r)   Ú__contains__¯  s    zDateRange.__contains__c             C   s   d| j jƒ | jjƒ f S )Nz%s - %s)rm  Ú	isoformatro  )r  r(   r(   r)   Ú__str__µ  s    zDateRange.__str__)NN)	r  r  r  r   r  Úclassmethodrd  rr  rt  r(   r(   r(   r)   rl  š  s
   
rl  c              C   s0   t j ƒ } t| tƒr| jtƒ ƒ} t| tƒs,t‚| S )z+ Returns the platform name as a compat_str )rÈ  rô  r  r·  r±  r   rÛ  )r  r(   r(   r)   Úplatform_name¹  s
    
rv  c                sì  ddl ‰ddl‰dddœ}y|jƒ }W n( tk
r:   dS  tjk
rN   dS X ||kr\dS tˆjjˆjj	ƒdˆj
jfƒ}||| ƒ}tˆjjˆjjˆjjˆjj	ˆjˆjj	ƒˆjjƒdˆj
jfƒ}ˆjj	dƒ}tˆjj	ˆjj	ƒd	ˆj
jfƒ‰d
‰ d‰tˆjjˆjjˆjˆjj	ƒƒdˆj
jfƒ‰ˆjj	dƒj‰‡ ‡‡‡‡‡fdd„}||ƒ�rPdS dd„ }	xŽ| �ræt|	| ƒdƒ}
||| |
�r~|
nd
ˆj|ƒdƒ}|dk�r tdƒ‚|
�sÄ|jd
k�s¶t‚| dd… } n|jdk�sÔt‚| |jd… } �qZW dS )zi Returns True if the string was written using special methods,
    False if it has yet to be written out.r   Né   rS  )r   r×  FÚGetStdHandleÚWriteConsoleWÚGetFileTyper×  i €  ÚGetConsoleModer   c                s@   | ˆks| d krdS ˆ| ƒˆ @ ˆ kp>ˆ| ˆj ˆjjƒ ƒƒdkS )NTr   )ÚbyrefÚwintypesÚDWORD)Úhandle)ÚFILE_TYPE_CHARÚFILE_TYPE_REMOTEr{  rz  ÚINVALID_HANDLE_VALUEÚctypesr(   r)   Únot_a_consoleï  s    z,_windows_write_string.<locals>.not_a_consolec             S   s4   yt dd„ t| ƒD ƒƒS  tk
r.   t| ƒS X d S )Nc             s   s"   | ]\}}t |ƒd kr|V  qdS )iÿÿ  N)rH  )rè  r  ré  r(   r(   r)   râ  ú  s    zA_windows_write_string.<locals>.next_nonbmp_pos.<locals>.<genexpr>)ÚnextÚ	enumerateÚStopIterationrì  )rP  r(   r(   r)   Únext_nonbmp_posø  s    z._windows_write_string.<locals>.next_nonbmp_posi   zFailed to write stringTiõÿÿÿiôÿÿÿr  )rƒ  Úctypes.wintypesr0  ÚAttributeErrorr  ÚUnsupportedOperationr	   r}  ÚHANDLEr~  ÚwindllÚkernel32ÚBOOLZLPWSTRÚPOINTERÚLPVOIDr	  rn  r|  rÐ  rÛ  )rP  ÚoutZWIN_OUTPUT_IDSr0  rx  rû  ry  Zwrittenr„  rˆ  ÚcountÚretr(   )r€  r�  r{  rz  r‚  rƒ  r)   Ú_windows_write_stringÃ  sZ    

r•  c             C   sÔ   |d krt j}t| ƒtkst‚t jdkrH|d krHt|dƒrHt| |ƒrHd S dt|ddƒksft j	d dk r„| j
|prtƒ dƒ}|j|ƒ nDt|d	ƒr¾|p¢t|d
d ƒp¢tƒ }| j
|dƒ}|jj|ƒ n
|j| ƒ |jƒ  d S )Nr³  r0  r€  rÃ  r+   r   r²  r}  r,  r¹  )rÆ  Ústderrrw  r   rÛ  rÈ  r2  r•  ÚgetattrrÇ  r¯  r±  r(  r,  Úflush)rP  r’  r¹  ZbytÚencr(   r(   r)   Úwrite_string  s     


rš  c             C   s0   | sg S t | d tƒrt| ƒS dd„ | D ƒS d S )Nr   c             S   s   g | ]}t |ƒ‘qS r(   )rH  )rè  ré  r(   r(   r)   rê  *  s    z$bytes_to_intlist.<locals>.<listcomp>)rô  rq  Úlist)Úbsr(   r(   r)   Úbytes_to_intlist$  s
    r�  c             C   s   | sdS t dt| ƒ f| žŽ S )Nó    z%dB)r   rì  )Úxsr(   r(   r)   Úintlist_to_bytes-  s    r   r³  c               @   sB   e Zd ZdejjfdejjfdejjfdejjfdejjfgZdS )Ú
OVERLAPPEDZInternalZInternalHighÚOffsetÚ
OffsetHighÚhEventN)	r  r  r  rƒ  r}  r‘  r~  rŒ  Ú_fields_r(   r(   r(   r)   r¡  8  s
   



r¡  l   ÿÿ iÿÿÿc             C   sb   t ƒ }d|_d|_d|_tj|ƒ| _tj| j	ƒ ƒ}t
||r>dnddtt| jƒs^tdtjƒ  ƒ‚d S )Nr   r×  zLocking file failed: %r)r¡  r¢  r£  r¤  rƒ  ÚpointerÚ_lock_file_overlapped_pr-  Úget_osfhandler0  Ú
LockFileExÚ	whole_lowÚ
whole_highrÐ  ÚFormatError)r¸  Ú	exclusiveZ
overlappedr  r(   r(   r)   Ú
_lock_fileX  s    r®  c             C   s>   | j s
t‚tj| jƒ ƒ}t|dtt| j ƒs:tdt	j
ƒ  ƒ‚d S )Nr   zUnlocking file failed: %r)r§  rÛ  r-  r¨  r0  ÚUnlockFileExrª  r«  rÐ  rƒ  r¬  )r¸  r  r(   r(   r)   Ú_unlock_filec  s
    
r°  c             C   s   t j| |rt jnt jƒ d S )N)ÚfcntlÚflockZLOCK_EXZLOCK_SH)r¸  r­  r(   r(   r)   r®  o  s    c             C   s   t j| t jƒ d S )N)r±  r²  ZLOCK_UN)r¸  r(   r(   r)   r°  r  s    z.file locking is not supported on this platformc             C   s   t tƒ‚d S )N)r4  ÚUNSUPPORTED_MSG)r¸  r­  r(   r(   r)   r®  w  s    c             C   s   t tƒ‚d S )N)r4  r³  )r¸  r(   r(   r)   r°  z  s    c               @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )Úlocked_fileNc             C   s(   |dkst ‚tj|||d�| _|| _d S )NÚrÚarÄ  )r¹  )rµ  r¶  rÄ  )rÛ  r  r3  r¸  rÃ  )r  r7  rÃ  r¹  r(   r(   r)   r    s    zlocked_file.__init__c             C   s@   | j dk}yt| j|ƒ W n  tk
r:   | jjƒ  ‚ Y nX | S )Nrµ  )rÃ  r®  r¸  r4  r"  )r  r­  r(   r(   r)   Ú	__enter__„  s    

zlocked_file.__enter__c          
   C   s    zt | jƒ W d | jjƒ  X d S )N)r°  r¸  r"  )r  Úetyper	  r¤  r(   r(   r)   Ú__exit__�  s    zlocked_file.__exit__c             C   s
   t | jƒS )N)Úiterr¸  )r  r(   r(   r)   Ú__iter__“  s    zlocked_file.__iter__c             G   s   | j j|Ž S )N)r¸  r(  )r  rÕ  r(   r(   r)   r(  –  s    zlocked_file.writec             G   s   | j j|Ž S )N)r¸  r  )r  rÕ  r(   r(   r)   r  ™  s    zlocked_file.read)N)	r  r  r  r  r·  r¹  r»  r(  r  r(   r(   r(   r)   r´  ~  s   
	r´  c              C   s   t jƒ } | d k	r| S dS )Nzutf-8)rÆ  rz  )r¹  r(   r(   r)   rÉ  �  s    rÉ  c             C   sD   g }t ƒ }x.| D ]&}t|tƒr(|j|ƒ}|jt|ƒƒ qW dj|ƒS )Nr&  )rÉ  rô  r  r·  r&   r   rí  )rÕ  Zquoted_argsr¹  r¶  r(   r(   r)   Úshell_quote¢  s    


r¼  c             C   s6   t | i ƒ\} }|j|ƒ tdtj|ƒiƒ}| d | S )z1 Pass additional data in a URL for internal use. Ú__youtubedl_smugglerT  )Úunsmuggle_urlrÊ  r   rÍ  Údumps)rb  rò  ZidataÚsdatar(   r(   r)   Úsmuggle_url­  s
    
rÁ  c             C   sB   d| kr| |fS | j dƒ\}}}t|ƒd d }tj|ƒ}||fS )Nz#__youtubedl_smugglerT  r½  r   )rV  r   rÍ  Úloads)Zsmug_urlrù  rb  rF  rÀ  Zjsondrò  r(   r(   r)   r¾  ·  s    
r¾  c          	   C   sx   | d krdS t | ƒtkr t| ƒ} | dkr.d}nttj| dƒƒ}ddddd	d
dddg	| }t| ƒtd| ƒ }d||f S )NzN/Ag        r   g      �@ÚBÚKiBÚMiBÚGiBÚTiBÚPiBÚEiBÚZiBÚYiBi   z%.2f%s)rw  rõ  r  rq  ÚmathÚlog)r  Úexponentr¾  Z	convertedr(   r(   r)   Úformat_bytesÀ  s    rÏ  c             C   s\   dj dd„ | D ƒƒ}tjd| |ƒ}|s,d S |jdƒjddƒ}| |jdƒ }tt|ƒ| ƒS )	Nú|c             s   s   | ]}t j|ƒV  qd S )N)rÙ  r  )rè  Úur(   r(   r)   râ  Ï  s    z$lookup_unit_table.<locals>.<genexpr>z/(?P<num>[0-9]+(?:[,.][0-9]*)?)\s*(?P<unit>%s)\bÚnumrN  r½  rb  )rí  rÙ  rÚ  r  r'  rq  r  )Z
unit_tablerP  Zunits_rer  Znum_strZmultr(   r(   r)   Úlookup_unit_tableÎ  s    rÓ  c          <   C   s’   | d krd S 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%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<dœ;}t || ƒS )=Nr   i   iè  r×  r²  é   rx  rO  rØ  é   );rÃ  r€  r  rÄ  ZKBZkBZKbZkbZ	kilobytesZ	kibibytesrÅ  ZMBZmBZMbZmbZ	megabytesZ	mebibytesrÆ  ÚGBZgBZGbZgbZ	gigabytesZ	gibibytesrÇ  ZTBZtBZTbr§  Z	terabytesZ	tebibytesrÈ  ZPBZpBZPbÚpbZ	petabytesZ	pebibytesrÉ  ZEBZeBZEbZebZexabytesZ	exbibytesrÊ  ZZBZzBZZbZzbZ
zettabytesZ	zebibytesrË  ZYBZyBZYbZybZ
yottabytesZ	yobibytesi   i@B i   i@B i@B i@B i   i   @i Êš;i   @i Êš;i Êš;i Êš;i   @l        l    J)£l        l    J)£l    J)£l    J)£l        l           l     �Iú5 l           l     �Iú5 l     �Iú5 l     �Iú5 l           l            l     ÈNÎZol            l     ÈNÎZol     ÈNÎZol     ÈNÎZol            l            l     @=7M.cl            l     @=7M.cl     @=7M.cl     @=7M.cl            l               l      B¶3v^!< l               l      B¶3v^!< l      B¶3v^!< l      B¶3v^!< l               )rÓ  )rP  Ú_UNIT_TABLEr(   r(   r)   Úparse_filesizeÙ  s|    rÙ  c             C   sD   | d krd S | j ƒ } tjd| ƒr(t| ƒS dddddddœ}t|| ƒS )	Nz	^[\d,.]+$iè  r×  )rà  ÚKr  ÚMÚkkZKKi@B i@B i@B i@B )r)  rÙ  rÚ  Ú
str_to_intrÓ  )rP  rØ  r(   r(   r)   Úparse_count   s    rÞ  c             C   s†   | d kri S t jd| ƒ}|r:t|jdƒƒt|jdƒƒdœS t jd| ƒ}|r\dt|jdƒƒiS t jd| ƒ}|r‚dt|jdƒƒd	 iS i S )
Nu$   \b(?P<w>\d+)\s*[xXÃ—]\s*(?P<h>\d+)\brÄ  rû  )ÚwidthÚheightz\b(\d+)[pPiI]\brà  r   z\b([48])[kK]\bi  )rÙ  r=  rq  r  )rP  rt  r(   r(   r)   Úparse_resolution5  s    rá  c             C   s0   t | tƒsd S tjd| ƒ}|r,t|jdƒƒS d S )Nz\b(\d+)\s*kbpsr   )rô  r   rÙ  r=  rq  r  )rP  rt  r(   r(   r)   Úparse_bitrateK  s
    
râ  r\  c             C   s8   t j|t d ƒ}y|j| ƒd S  tk
r2   dS X dS )zE Return the number of a month by (locale-independently) English name r\  r   N)ÚMONTH_NAMESrå  Úindexrr  )rÒ  ÚlangZmonth_namesr(   r(   r)   Úmonth_by_nameS  s
    ræ  c             C   s2   ydd„ t D ƒj| ƒd S  tk
r,   dS X dS )zV Return the number of a month by (locale-independently) English
        abbreviations c             S   s   g | ]}|d d… ‘qS )Nr²  r(   )rè  rP  r(   r(   r)   rê  c  s    z)month_by_abbreviation.<locals>.<listcomp>r   N)ÚENGLISH_MONTH_NAMESrä  rr  )Zabbrevr(   r(   r)   Úmonth_by_abbreviation^  s    rè  c             C   s   t jdd| ƒS )z%Replace all the '&' by '&amp;' in XMLz<&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)z&amp;)rÙ  r(  )Zxml_strr(   r(   r)   Úfix_xml_ampersandsh  s    ré  c             C   s¤   t | tƒst‚tjjdƒrd S ytjjdƒ}W n& t	k
rB   d S  t
k
rT   d S X | jdƒ}tjt|ƒƒ}||_y|jd|dddƒ W n tk
rž   d S X d S )Nr|  z	libc.so.6zutf-8é   r   )rô  r   rÛ  rÆ  rÈ  r  rƒ  ÚcdllÚLoadLibraryrÐ  r“  r¯  Úcreate_string_bufferrì  r	  ZprctlrŠ  )ÚtitleÚlibcZtitle_bytesÚbufr(   r(   r)   Úsetproctitlep  s     
rñ  c             C   s&   | d k	r"| j |ƒr"| t|ƒd … S | S )N)r  rì  )rP  rm  r(   r(   r)   rX  Š  s    rX  c             C   s(   | d k	r$| j |ƒr$| d t|ƒ … S | S )N)Úendswithrì  )rP  ro  r(   r(   r)   Ú
remove_endŽ  s    ró  c             C   sN   | d kst | ƒdk r| S x0dD ](}| d |kr| d |kr| dd… S qW | S )	Nr×  r  r  r   r   )r  r  r  r  )rì  )rP  Úquoter(   r(   r)   Úremove_quotes’  s    
rõ  c             C   s    t j| ƒj}|jdƒjdƒd S )Nrë  r   r  )r   r  rµ  r)  rç  )rb  rµ  r(   r(   r)   Úurl_basename›  s    rö  c             C   s   t jd| ƒjƒ S )Nzhttps?://[^?#&]+/)rÙ  rÚ  r  )rb  r(   r(   r)   Úbase_url   s    r÷  c             C   sx   t |tƒr|jdƒ}t |tƒ s&| r*d S tjd|ƒr:|S t | tƒrN| jdƒ} t | tƒ shtjd| ƒ rld S tj| |ƒS )Nzutf-8z ^(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)rô  r  r·  r   rÙ  rÚ  r   Úurljoin)ru  rµ  r(   r(   r)   rø  ¤  s    




rø  c               @   s   e Zd Zdd„ ZdS )ÚHEADRequestc             C   s   dS )NÚHEADr(   )r  r(   r(   r)   Ú
get_method´  s    zHEADRequest.get_methodN)r  r  r  rû  r(   r(   r(   r)   rù  ³  s   rù  c               @   s   e Zd Zdd„ ZdS )Ú
PUTRequestc             C   s   dS )NÚPUTr(   )r  r(   r(   r)   rû  ¹  s    zPUTRequest.get_methodN)r  r  r  rû  r(   r(   r(   r)   rü  ¸  s   rü  c             C   s^   |r| d k	rt | |d ƒ} | dkr$d } | d kr0|S yt| ƒ| | S  ttfk
rX   |S X d S )Nr+   )r—  rq  rr  r“  )rá  Úscalerù  Zget_attrÚinvscaler(   r(   r)   Úint_or_none½  s    r 	  c             C   s   | d kr|S t | ƒS )N)r   )rá  rù  r(   r(   r)   Ústr_or_noneË  s    r	  c             C   s2   t | tƒr| S t | tƒr.tjdd| ƒ} t| ƒS dS )z' A more relaxed version of int_or_none z[,\.\+]r+   N)rô  r   r   rÙ  r(  r 	  )Zint_strr(   r(   r)   rÝ  Ï  s
    

rÝ  c             C   s:   | d kr|S yt | ƒ| | S  ttfk
r4   |S X d S )N)r  rr  r“  )rá  rþ  rÿ  rù  r(   r(   r)   Úfloat_or_noneØ  s    r	  c             C   s   t | tƒr| S |S )N)rô  Úbool)rá  rù  r(   r(   r)   Úbool_or_noneá  s    r	  c             C   s   t | tƒr| jƒ S |S )N)rô  r   r)  )rá  rù  r(   r(   r)   Ústrip_or_noneå  s    r	  c             C   s2   |  st | tƒ rd S | jƒ } tjd| ƒr.| S d S )Nz^(?:[a-zA-Z][\da-zA-Z.+-]*:)?//)rô  r   r)  rÙ  rÚ  )rb  r(   r(   r)   Úurl_or_noneé  s    r	  c             C   s  t | tƒsd S | jƒ } d gd \}}}}}tjd| ƒ}|rN|jƒ \}}}}}nFtjd| ƒ}|rr|jƒ \}}}}}n"tjd| ƒ}|r�|jƒ \}}nd S d}|r¨|t|ƒ7 }|r¼|t|ƒd 7 }|rÔ|t|ƒd d 7 }|rð|t|ƒd d d 7 }|�r|t|ƒ7 }|S )Nrx  zg(?:(?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?(?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?Z?$a®  (?ix)(?:P?
                (?:
                    [0-9]+\s*y(?:ears?)?\s*
                )?
                (?:
                    [0-9]+\s*m(?:onths?)?\s*
                )?
                (?:
                    [0-9]+\s*w(?:eeks?)?\s*
                )?
                (?:
                    (?P<days>[0-9]+)\s*d(?:ays?)?\s*
                )?
                T)?
                (?:
                    (?P<hours>[0-9]+)\s*h(?:ours?)?\s*
                )?
                (?:
                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?\s*
                )?
                (?:
                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s*
                )?Z?$zW(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$r   r†  é   )rô  r   r)  rÙ  rÚ  rj  r  )rP  r`  r;  Úminsr‡  Úmsr  Zdurationr(   r(   r)   Úparse_durationð  s6    
r
	  c             C   s@   t jj| ƒ\}}| s&|dd … |kr4dj|||ƒS dj| |ƒS )Nr   z
{0}.{1}{2}z{0}.{1})r´  rµ  Úsplitextr¶  )r7  Úextr\  rÒ  Úreal_extr(   r(   r)   Úprepend_extension*  s    $r	  c             C   s6   t jj| ƒ\}}dj| s*|dd … |kr.|n| |ƒS )Nz{0}.{1}r   )r´  rµ  r	  r¶  )r7  r	  r\  rÒ  r	  r(   r(   r)   r[  2  s    r[  c             C   s<   y"t j| g| t jt jd�jƒ  W n tk
r6   dS X | S )z™ Checks if the given binary is installed somewhere in PATH, and returns its name.
    args can be a list of arguments for a short output (like -version) )r/  r–  F)Ú
subprocessÚPopenÚPIPEÚcommunicaterÐ  )ÚexerÕ  r(   r(   r)   Úcheck_executable9  s
    "r	  z	--versionÚpresentc             C   sf   y.t jt| ƒg| t jt jt jd�jƒ \}}W n tk
rB   dS X t|tƒrZ|j	ddƒ}t
|||ƒS )z` Returns the version of the specified executable,
    or False if the executable is not present )Ústdinr/  r–  Fr‚  r}  )r	  r	  rƒ  r	  ÚSTDOUTr	  rÐ  rô  r  r·  Údetect_exe_version)r	  rÕ  Ú
version_reÚunrecognizedr’  rF  r(   r(   r)   Úget_exe_versionC  s    
r	  c             C   s<   t | tƒst‚|d krd}tj|| ƒ}|r4|jdƒS |S d S )Nzversion\s+([-0-9._a-zA-Z]+)r   )rô  r   rÛ  rÙ  r=  r  )Úoutputr	  r	  r  r(   r(   r)   r	  V  s    
r	  c               @   s   e Zd Zdd„ ZdS )Ú	PagedListc             C   s   t | jƒ ƒS )N)rì  Úgetslice)r  r(   r(   r)   Ú__len__b  s    zPagedList.__len__N)r  r  r  r	  r(   r(   r(   r)   r	  a  s   r	  c               @   s    e Zd Zddd„Zd	dd„ZdS )
ÚOnDemandPagedListTc             C   s    || _ || _|| _|ri | _d S )N)Ú	_pagefuncÚ	_pagesizeÚ
_use_cacheÚ_cache)r  ÚpagefuncÚpagesizeZ	use_cacher(   r(   r)   r  h  s
    zOnDemandPagedList.__init__r   Nc       
      C   s(  g }�xt j|| j ƒD �]}|| j }|| j | j }||krBqd }| jrX| jj|ƒ}|d krnt| j|ƒƒ}| jr~|| j|< ||  ko�|k n  r || j nd}|d k	rÖ||  ko¾|kn  rÖ|d | j d nd }	|dksê|	d k	rö|||	… }|j|ƒ t	|ƒ| | jk �rP ||krP qW |S )Nr   r   )
Ú	itertoolsr“  r"	  r#	  r$	  rå  r›  r!	  Úextendrì  )
r  rm  ro  r  ÚpagenumZfirstidZnextfirstidZpage_resultsZstartvZendvr(   r(   r)   r	  o  s2    

"2
zOnDemandPagedList.getslice)T)r   N)r  r  r  r  r	  r(   r(   r(   r)   r 	  g  s   
r 	  c               @   s   e Zd Zdd„ Zddd„ZdS )ÚInAdvancePagedListc             C   s   || _ || _|| _d S )N)r!	  Ú
_pagecountr"	  )r  r%	  Z	pagecountr&	  r(   r(   r)   r  œ  s    zInAdvancePagedList.__init__r   Nc       
      C   sÊ   g }|| j  }|d kr| jn|| j  d }||| j   }|d krDd n|| }xxt||ƒD ]j}t| j|ƒƒ}	|r~|	|d … }	d }|d k	r¸t|	ƒ|k r |t|	ƒ8 }n|	d |… }	|j|	ƒ P |j|	ƒ qXW |S )Nr   )r"	  r+	  r  r›  r!	  rì  r(	  )
r  rm  ro  r  Z
start_pageZend_pageZ
skip_elemsZ	only_morer)	  Zpager(   r(   r)   r	  ¡  s$    

zInAdvancePagedList.getslice)r   N)r  r  r  r  r	  r(   r(   r(   r)   r*	  ›  s   r*	  c                s    t jdƒ‰ tjd‡ fdd„| ƒS )NÚunicode_escapez\\U[0-9a-fA-F]{8}c                s   ˆ | j dƒƒd S )Nr   )r  )r  )r,	  r(   r)   r»  ¼  s    z"uppercase_escape.<locals>.<lambda>)ÚcodecsÚ
getdecoderrÙ  r(  )rP  r(   )r,	  r)   Úuppercase_escape¸  s
    

r/	  c                s    t jdƒ‰ tjd‡ fdd„| ƒS )Nr,	  z\\u[0-9a-fA-F]{4}c                s   ˆ | j dƒƒd S )Nr   )r  )r  )r,	  r(   r)   r»  Ä  s    z"lowercase_escape.<locals>.<lambda>)r-	  r.	  rÙ  r(  )rP  r(   )r,	  r)   Úlowercase_escapeÀ  s
    

r0	  c             C   s*   t jdk rt| tƒr| jdƒ} tj| dƒS )z4Escape non-ASCII characters as suggested by RFC 3986r²  r   zutf-8s   %/;:@&=+$,!~*'()?#[])r²  r   )rÆ  rÇ  rô  r   r¯  r   rô  )rP  r(   r(   r)   Úescape_rfc3986È  s    
r1	  c             C   sF   t | ƒ}|j|jjdƒjdƒt|jƒt|jƒt|jƒt|j	ƒd�j
ƒ S )z#Escape URL as suggested by RFC 3986Úidnar‚  )Únetlocrµ  r˜  ÚqueryÚfragment)r   Ú_replacer3	  r¯  r·  r1	  rµ  r˜  r4	  r5	  Úgeturl)rb  Z
url_parsedr(   r(   r)   rõ  Ï  s    rõ  c             C   s2   dd„ }t j| ƒ�}dd„ t||ƒD ƒS Q R X d S )Nc             S   sN   t | tƒs| jddƒ} d}| j|ƒr4| t|ƒd … } | jƒ } | jdƒrJdS | S )	Nzutf-8r'  u   Ã¯Â»Â¿rT  ú;ú]F)rT  r8	  r9	  )rô  r   r·  r  rì  r)  )rb  ÚBOM_UTF8r(   r(   r)   rc  Ü  s    


zread_batch_urls.<locals>.fixupc             S   s   g | ]}|r|‘qS r(   r(   )rè  rb  r(   r(   r)   rê  è  s    z#read_batch_urls.<locals>.<listcomp>)Ú
contextlibÚclosingrN  )Zbatch_fdrc  Úfdr(   r(   r)   Úread_batch_urlsÛ  s    r>	  c              O   s   t | |ŽjdƒS )Nr‚  )r   r¯  )rÕ  Úkargsr(   r(   r)   Úurlencode_postdataë  s    r@	  c             C   s>   |s| S t j| ƒ}t|jƒ}|j|ƒ t j|jt|dƒd�ƒS )NT)r4	  )r   r  r   r4	  rÊ  Ú
urlunparser6	  r   )rb  r4	  Z
parsed_urlÚqsr(   r(   r)   Úupdate_url_queryï  s    


rC	  c             C   s†   | j jƒ }|j|ƒ |p| j}t|p*| jƒ |ƒ}| jƒ }|dkrFt}	n|dkrTt}	nt	j
}	|	|||| j| jd�}
t| dƒr‚| j|
_|
S )Nrú  rý  )rò  rä  Úorigin_req_hostÚunverifiabler¡  )rä  ÚcopyrÊ  rò  rC	  rô  rû  rù  rü  r   re  rD	  rE	  r2  r¡  )rë  rb  rò  rä  r4	  Zreq_headersZreq_dataZreq_urlZreq_get_methodZreq_typeZnew_reqr(   r(   r)   rö  ù  s     



rö  c             C   s°   d| }d}x„| j ƒ D ]x\}}|d|jdƒ d 7 }t|tƒrH|jdƒ}t|tƒr\|jdƒ}d| d | d }|jdƒ|kr†td	ƒ‚||7 }qW |d|jdƒ d
 7 }||fS )Nz multipart/form-data; boundary=%srž  s   --r‚  s   
zutf-8s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)rã  r¯  rô  r   rr  )rò  ÚboundaryÚcontent_typer’  rà  rá  r  r(   r(   r)   Ú_multipart_encode_impl  s    



rI	  c             C   sf   |dk	}xT|dkr&dt tjddƒƒ }yt| |ƒ\}}P W q
 tk
rX   |rP‚ d}Y q
X q
W ||fS )aR  
    Encode a dict to RFC 7578-compliant form-data

    data:
        A dict where keys and values can be either Unicode or bytes-like
        objects.
    boundary:
        If specified a Unicode object, it's used as the boundary. Otherwise
        a random boundary is generated.

    Reference: https://tools.ietf.org/html/rfc7578
    Nz---------------iÿÿÿl   ÿÿ )rõ  rT  Ú	randrangerI	  rr  )rò  rG	  Zhas_specified_boundaryr’  rH	  r(   r(   r)   Úmultipart_encode#  s    rK	  c             C   sV   t |ttfƒrJx6|D ].}|| ks| | d ks|r<| |  r<q| | S W |S | j||ƒS )N)rô  r›  Útuplerå  )ÚdZkey_or_keysrù  Zskip_false_valuesrß  r(   r(   r)   Údict_getA  s    
"
rN	  c             C   sf   t |ttfƒs|g}xL|D ]D}y|| ƒ}W n ttttfk
rF   Y qX |d ksZt ||ƒr|S qW d S )N)rô  r›  rL	  rŠ  ÚKeyErrorr“  Ú
IndexError)ÚsrcÚgetterZexpected_typerå  rá  r(   r(   r)   Útry_getK  s    
rS	  c              G   sl   i }xb| D ]Z}xT|j ƒ D ]H\}}|d kr*q||ksXt|tƒr|rt|| tƒr||  r|||< qW q
W |S )N)rã  rô  r   )ZdictsZmergedZa_dictrà  rá  r(   r(   r)   Úmerge_dictsX  s    

rT	  r½  c             C   s   t | tƒr| S t| ||ƒS )N)rô  r   )Ústringr¹  Úerrorsr(   r(   r)   Úencode_compat_strf  s    rW	  ro  é   rn  é   )ÚGÚPGzPG-13ÚRÚNCé   é   )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc             C   s¢   t | ƒtkr,d|   kodkn  r(| S d S t| tƒs:d S tjd| ƒ}|rXt|jdƒƒS | tkrht|  S tjddjdd„ t	D ƒƒ | ƒ}|ržt	d	|jd
ƒ  S d S )Nr   é   z^(?P<age>\d{1,2})\+?$Zagez^TV[_-]?(%s)$rÐ  c             s   s   | ]}|d d… V  qdS )r²  Nr(   )rè  rà  r(   r(   r)   râ  ‡  s    z"parse_age_limit.<locals>.<genexpr>zTV-r   )
rw  rq  rô  r   rÙ  rÚ  r  Ú
US_RATINGSrí  ÚTV_PARENTAL_GUIDELINES)rP  r  r(   r(   r)   Úparse_age_limit}  s     
 rc	  c             C   s   t jdd| ƒS )Nz³(?sx)^
            (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*)
            (?:\s*&&\s*(?P=func_name))?
            \s*\(\s*(?P<callback_data>.*)\);?
            \s*?(?://[^\n]*)*$z\g<callback_data>)rÙ  r(  )rº  r(   r(   r)   Ústrip_jsonp�  s    rd	  c                sT   d}dj |d�}dj |d�dfdj |d�dff‰ ‡ fd	d
„}tjdj ||d�|| ƒS )Nz/\*(?:(?!\*/).)*?\*/|//[^\n]*z\s*(?:{comment})?\s*)Úcommentz!(?s)^(0[xX][0-9a-fA-F]+){skip}:?$)Úskiprn  z(?s)^(0+[0-7]+){skip}:?$rÕ  c                s°   | j dƒ}|dkr|S |jdƒs2|jdƒs2|dkr6dS |d dkr\tjddd„ |dd… ƒ}xJˆ D ]B\}}tj||ƒ}|rbt|j dƒ|ƒ}|jdƒrœd| S d| S qbW d| S )Nr   ÚtrueÚfalseÚnullz/*z//rN  r+   r  r  z	(?s)\\.|"c             S   s"   dddddœj | jdƒ| jdƒƒS )Nz\"r  r+   z\u00)r  z\'z\
z\xr   )rå  r  )r  r(   r(   r)   r»  §  s
    z,js_to_json.<locals>.fix_kv.<locals>.<lambda>r   ræ  z"%d":z%dz"%s")rg	  rh	  ri	  )r  r  r  )r  r  rÙ  r(  rÚ  rq  rò  )r  rá  Zregexru  Zimr  )ÚINTEGER_TABLEr(   r)   Úfix_kvŸ  s    
zjs_to_json.<locals>.fix_kva-  (?sx)
        "(?:[^"\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^"\\]*"|
        '(?:[^'\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^'\\]*'|
        {comment}|,(?={skip}[\]}}])|
        (?:(?<![0-9])[eE]|[a-df-zA-DF-Z_])[.a-zA-Z_0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:{skip}:)?|
        [0-9]+(?={skip}:)
        )re	  rf	  )r¶  rÙ  r(  )rº  Z
COMMENT_REZSKIP_RErk	  r(   )rj	  r)   Ú
js_to_json—  s    rl	  c                s   ‡ fdd„}|S )z> Get a numeric quality value out of a list of possible values c                s$   y
ˆ j | ƒS  tk
r   dS X d S )Nr   r  )rä  rr  )Zqid)Úquality_idsr(   r)   ÚqÂ  s    
zqualities.<locals>.qr(   )rm	  rn	  r(   )rm	  r)   Ú	qualitiesÀ  s    ro	  z%(title)s-%(id)s.%(ext)sc             C   s8   | dkrdS d}t | ƒ|kr4| d|t |ƒ … | S | S )z% Add ellipses to overly long strings Nz...)rì  )rP  ÚlengthZELLIPSESr(   r(   r)   Úlimit_lengthÍ  s    rq	  c             C   s   t dd„ tjd| ƒD ƒƒS )Nc             s   s   | ]}t |ƒV  qd S )N)rq  )rè  Úer(   r(   r)   râ  Ø  s    z version_tuple.<locals>.<genexpr>z[-.])rL	  rÙ  rç  )rá  r(   r(   r)   Úversion_tuple×  s    rs	  c             C   s6   | s
| S yt | ƒt |ƒk S  tk
r0   | S X d S )N)rs	  rr  )ÚversionÚlimitZ
assume_newr(   r(   r)   Úis_outdated_versionÛ  s    rv	  c              C   s(   ddl m}  ttƒ jdƒ| ƒp&ttdƒS )z. Returns if youtube-dl can be updated with -U r   )ÚzipimporterÚ
__loader__Úfrozen)Z	zipimportrw	  rô  Úglobalsrå  r2  rÆ  )rw	  r(   r(   r)   rš  ä  s    rš  c             C   s   dj dd„ | D ƒƒS )Nr&  c             s   s   | ]}t |ƒV  qd S )N)r   )rè  r¶  r(   r(   r)   râ  í  s    zargs_to_str.<locals>.<genexpr>)rí  )rÕ  r(   r(   r)   Úargs_to_strë  s    r{	  c             C   s&   t | ƒ}tjd dk r"|jtƒ ƒ}|S )Nr   r²  )rõ  rÆ  rÇ  r·  r±  )r9  Zerr_strr(   r(   r)   Úerror_to_compat_strð  s    r|	  c             C   s~   | d krd S dddœj | ƒ}|d k	r(|S | jdƒ\}}}|jdƒd jƒ jƒ }ddd	d
ddddddddddddddœj ||ƒS )Nr_  r{  )z	audio/mp4z
audio/mpegrë  r8	  r   ry  ÚttÚdfxpÚttmlre  r^  Zsamirw  r�  Zmpdr€  Úismru  Úts)Z3gppzsmptett+xmlzttaf+xmlzttml+xmlzx-flvzx-mp4-fragmentedz	x-ms-samizx-ms-wmvZmpegurlz	x-mpegurlzvnd.apple.mpegurlzdash+xmlzf4m+xmlzhds+xmlzvnd.ms-sstr+xmlZ	quicktimeZmp2t)rå  rV  rç  r)  rß  )Úmtr	  rF  r  r(   r(   r)   Úmimetype2extù  s6    rƒ	  c             C   sÊ   | si S t td tdd„ | jƒ jdƒjdƒƒƒƒ}d%\}}xN|D ]F}|jdƒd }|d&krb|s„|}q>|d'krt|s„|}q>td | tjƒ q>W | r´| r´t|ƒd!kr²|d |d" d#œS n|pºd$|pÀd$d#œS i S )(Nc             S   s   | j ƒ S )N)r)  )rõ  r(   r(   r)   r»  #  s    zparse_codecs.<locals>.<lambda>rN  r½  r   Úavc1Úavc2Úavc3Úavc4Úvp9Úvp8Úhev1Úhev2Úh263Úh264Úmp4vÚhvc1Úav01ÚtheoraÚmp4aro  Úvorbisr{  rd  úac-3úec-3Úeac3ÚdtscÚdtseÚdtshÚdtslzWARNING: Unknown codec %s
r×  r   )ÚvcodecÚacodecÚnone)NN)r„	  r…	  r†	  r‡	  rˆ	  r‰	  rŠ	  r‹	  rŒ	  r�	  rŽ	  r�	  r�	  r‘	  )r’	  ro  r“	  r{  rd  r”	  r•	  r–	  r—	  r˜	  r™	  rš	  )	r›  ÚfilterrN  r)  rç  rš  rÆ  r–  rì  )Z
codecs_strZsplited_codecsr›	  rœ	  Z
full_codecÚcodecr(   r(   r)   Úparse_codecs  s*     
r 	  c             C   sJ   | j j}|dƒ}|r>tjd|ƒ}|r>t|jdƒd d�}|r>|S t|dƒƒS )NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"r7  )rY  zContent-Type)rä  rå  rÙ  rÚ  rZ  r  rƒ	  )Z
url_handleÚ	getheaderZcdr  rr	  r(   r(   r)   Úurlhandle_detect_ext=  s    r¢	  c             C   s   d|t j| ƒjdƒf S )Nzdata:%s;base64,%sr‚  )Úbase64Ú	b64encoder·  )rò  Z	mime_typer(   r(   r)   Úencode_data_uriK  s    r¥	  c             C   s    |dkrdS | dkrdS || k S )z0 Returns True iff the content should be blocked NFr(   )Zcontent_limitÚ	age_limitr(   r(   r)   Úage_restrictedO  s
    r§	  c             C   s\   dddddg}x@|D ],\}}| j |ƒr| t|ƒd… j|dƒ}P qW | jddƒ}tjd|ƒS )zC Detect whether a file contains HTML by examining its first bytes. ó   ï»¿úutf-8ó     þÿú	utf-32-beó   ÿþ  ú	utf-32-leó   ÿþú	utf-16-leó   þÿú	utf-16-beNr'  z^\s*<)r¨	  r©	  )rª	  r«	  )r¬	  r­	  )r®	  r¯	  )r°	  r±	  )r  rì  r·  rÙ  rÚ  )Zfirst_bytesZBOMSZbomr™  rP  r(   r(   r)   Úis_htmlY  s    
r²	  c             C   sr   | j dƒ}|d k	r|S | d }|jdƒr,dS |jdƒr:dS |jdƒrHdS t|ƒ}|dkr\dS |dkrhdS t|ƒjS )NÚprotocolrb  ÚrtmpÚmmsÚrtspr�  r€  )rå  r  rZ  r   r'   )Ú	info_dictr³	  rb  r	  r(   r(   r)   Údetermine_protocolm  s     



r¸	  c                sT   | g| }dd„ t |Ž D ƒ}djdd„ |dd… D ƒƒd ‰ d	j‡ fd
d„|D ƒƒS )z1 Render a list of rows, each as a list of values c             S   s   g | ]}t d d„ |D ƒƒ‘qS )c             s   s   | ]}t t|ƒƒV  qd S )N)rì  r   )rè  rá  r(   r(   r)   râ  †  s    z*render_table.<locals>.<listcomp>.<genexpr>)rp  )rè  Úcolr(   r(   r)   rê  †  s    z render_table.<locals>.<listcomp>r&  c             s   s"   | ]}d t |d ƒ d V  qdS )z%-r   rP  N)r   )rè  Úmlr(   r(   r)   râ  ‡  s    zrender_table.<locals>.<genexpr>Nr   z%sr%  c             3   s   | ]}ˆ t |ƒ V  qd S )N)rL	  )rè  Úrow)Ú
format_strr(   r)   râ  ˆ  s    r  )Úziprí  )Z
header_rowrò  ÚtableZmax_lensr(   )r¼	  r)   Úrender_tableƒ  s    
 r¿	  c       
      C   s  t jt jt jt jt jt jdœ}tjddj	t
tj|jƒ ƒƒ ƒ}|j| ƒ}|�r ||jdƒ }|j|jdƒƒ}|jdƒd k	sª|jdƒd k	sª|d k	o¦|jdƒd k	o¦t|tƒ�r|jdƒdkrÊtd|jdƒ ƒ‚|jdƒpæ|jdƒpæ|jdƒ}|jdƒ}|d k	�r‚|jd| |ƒ}ntyt|jdƒƒ}W n` tk
�r€   t|jdƒƒ}|d k�r\t|jdƒd ƒ}|d k�r|td|jdƒ| f ƒ‚Y nX |d k�r–|jdƒS |||ƒS dd„ dd„ dœ}	tjddj	t
tj|	jƒ ƒƒ ƒ}|j| ƒ}|�r|	|jdƒ }|j|jdƒƒ}||ƒS td|  ƒ‚d S )N)ú<z<=ú>z>=ú=z!=aC  (?x)\s*
        (?P<key>[a-z_]+)
        \s*(?P<op>%s)(?P<none_inclusive>\s*\?)?\s*
        (?:
            (?P<intval>[0-9.]+(?:[kKmMgGtTpPeEzZyY]i?[Bb]?)?)|
            (?P<quote>["\'])(?P<quotedstrval>(?:\\.|(?!(?P=quote)|\\).)+?)(?P=quote)|
            (?P<strval>(?![0-9.])[a-z0-9A-Z]*)
        )
        \s*$
        rÐ  Úoprß  ZquotedstrvalÚstrvalZintvalrÂ	  ú!=z+Operator %s does not support string values!rô  z\%srÃ  z*Invalid integer value %r in filter part %rZnone_inclusivec             S   s   t | tƒr| dkS | d k	S )NT)rô  r	  )rá  r(   r(   r)   r»  Á  s    z_match_one.<locals>.<lambda>c             S   s   t | tƒr| dkS | d kS )NF)rô  r	  )rá  r(   r(   r)   r»  Â  s    )r+   ú!zC(?x)\s*
        (?P<op>%s)\s*(?P<key>[a-z_]+)
        \s*$
        zInvalid filter part %r)rÂ	  rÅ	  )ÚoperatorÚltÚleÚgtÚgeÚeqÚnerÙ  Úcompilerí  rN  r  Úkeysr=  r  rå  rô  r   rr  r'  rq  rÙ  )
Úfilter_partÚdctZCOMPARISON_OPERATORSZoperator_rexr  rÃ	  Zactual_valueZcomparison_valuerô  ZUNARY_OPERATORSr(   r(   r)   Ú
_match_one‹  s\    
	








rÒ	  c                s   t ‡ fdd„| jdƒD ƒƒS )zY Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false c             3   s   | ]}t |ˆ ƒV  qd S )N)rÒ	  )rè  rÐ	  )rÑ	  r(   r)   râ  Õ  s    zmatch_str.<locals>.<genexpr>ú&)Úallrç  )Ú
filter_strrÑ	  r(   )rÑ	  r)   Ú	match_strÑ  s    rÖ	  c                s   ‡ fdd„}|S )Nc                s2   t ˆ | ƒrd S | jd| jddƒƒ}d|ˆ f S d S )Nrî  rÿ  Zvideoz'%s does not pass filter %s, skipping ..)rÖ	  rå  )r·	  Zvideo_title)rÕ	  r(   r)   Ú_match_funcÙ  s    
z&match_filter_func.<locals>._match_funcr(   )rÕ	  r×	  r(   )rÕ	  r)   Úmatch_filter_funcØ  s    rØ	  c             C   st   | sd S t jd| ƒ}|r&t|jdƒƒS t jd| ƒ}|rpdt|jdƒƒ dt|jdƒƒ  t|jdƒjd	d
ƒƒ S d S )Nz"^(?P<time_offset>\d+(?:\.\d+)?)s?$Ztime_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$i  r   r†  r×  r²  ræ  r½  )rÙ  rÚ  r  r  rq  r'  )Z	time_exprrt  r(   r(   r)   Úparse_dfxp_time_exprâ  s    rÙ	  c             C   s(   d| d | d d | d | d d f S )Nz%02d:%02d:%02d,%03di  r†  r   iè  r(   )Úsecondsr(   r(   r)   Úsrt_subtitles_timecodeï  s    rÛ	  c                s~  ddddgfddgff}ddd	d
ddg‰ t jtddddœd�‰i ‰i ‰G ‡ ‡‡‡fdd„dtƒ‰‡fdd„}x*|D ]"\}}x|D ]}| j||ƒ} q€W qrW t| ƒ}g }|jˆdƒƒpº|jdƒ}|sÈtdƒ‚d}	x²xž|jˆdƒƒD ]Œ}
|
jdƒpø|
jˆdƒƒ}|�sqÞ|
jdƒ}|�r2|ˆk�r"d}	qÞˆ| j	ƒ ˆ|< x6ˆ D ].}|
jˆd| ƒƒ}|�r8|ˆj
|i ƒ|< �q8W qÞW |	�rzd}	qÎP qÎW xZd+D ]R}t|ˆd"| ƒd#| gƒ}|d$k�r²�q†ˆj|jdƒƒ}
|
�sÌ�q†ˆj|
ƒ �q†W x–t|tjd%ƒƒD ]‚\}}t|jjd&ƒƒ}t|jjd'ƒƒ}t|jjd(ƒƒ}|d$k�r4�qî|�sL|�sD�qî|| }|jd)|t|ƒt|ƒ||ƒf ƒ �qîW d*j|ƒS ),z
    @param dfxp_data A bytes-like object containing DFXP data
    @returns A unicode object containing converted SRT data
    s   http://www.w3.org/ns/ttmls   http://www.w3.org/2004/11/ttaf1s   http://www.w3.org/2006/04/ttaf1s   http://www.w3.org/2006/10/ttaf1s!   http://www.w3.org/ns/ttml#stylings   http://www.w3.org/ns/ttml#styleÚcolorÚ
fontFamilyÚfontSizeÚ	fontStyleÚ
fontWeightÚtextDecorationz$http://www.w3.org/XML/1998/namespacezhttp://www.w3.org/ns/ttmlz!http://www.w3.org/ns/ttml#styling)Úxmlr	  Ztts)rî  c                   sF   e Zd ZdZg Zg Z‡ ‡‡‡fdd„Z‡fdd„Zdd„ Zdd	„ Z	d
S )z$dfxp2srt.<locals>.TTMLPElementParserr+   c                sö  |ˆdƒdfkr"|  j d7  _ �nÐg }i }|jdƒ}ˆrB|jˆƒ |rX|jˆj|i ƒƒ x*ˆ D ]"}|jˆd| ƒƒ}|r^|||< q^W |�ræd}� xüt|jƒ ƒD ]ì\}	}
| jrÂ| jd j|	ƒ|
krÂqž|	dkrØ|d	|
 7 }qž|	d
krî|d|
 7 }qž|	dk�r|d|
 7 }qž|	dk�r4|
dk�r4|  j d7  _ |jdƒ qž|	dk�rb|
dk�rb|  j d7  _ |jdƒ qž|	dkrž|
dkrž|  j d7  _ |jdƒ qžW |�r´|  j d| d 7  _ |jdƒ i }| j�rÐ|j| jd ƒ |j|ƒ | jj|ƒ | jj|ƒ d S )Nzttml:brÚbrr%  Ústyleztts:r+   r   rÜ	  z color="%s"rÞ	  z
 size="%s"rÝ	  z
 face="%s"rà	  Zboldz<b>r€  rß	  Zitalicz<i>r  rá	  Z	underlinez<u>rÑ  z<fontrÁ	  Úfontr  r  )Ú_outrå  rÊ  Úsortedrã  Ú_applied_stylesr&   Ú_unclosed_elements)r  rñ  rä  Úunclosed_elementsrä	  Zelement_style_idÚpropÚprop_valrå	  rà  rá  Zapplied_style)ÚSUPPORTED_STYLINGÚ_xÚdefault_styleÚstylesr(   r)   rm    sT    





z*dfxp2srt.<locals>.TTMLPElementParser.startc                sV   |ˆ dƒdfkrR| j jƒ }x"t|ƒD ]}|  jd| 7  _q$W |rR| jrR| jjƒ  d S )Nzttml:brrã	  z</%s>)ré	  rZ  Úreversedræ	  rè	  )r  rñ  rê	  Úelement)rî	  r(   r)   ro  G  s    

z(dfxp2srt.<locals>.TTMLPElementParser.endc             S   s   |  j |7  _ d S )N)ræ	  )r  rò  r(   r(   r)   rò  O  s    z)dfxp2srt.<locals>.TTMLPElementParser.datac             S   s
   | j jƒ S )N)ræ	  r)  )r  r(   r(   r)   r"  R  s    z*dfxp2srt.<locals>.TTMLPElementParser.closeN)
r  r  r  ræ	  ré	  rè	  rm  ro  rò  r"  r(   )rí	  rî	  rï	  rð	  r(   r)   ÚTTMLPElementParser  s   -ró	  c                s2   ˆ ƒ }t jjj|d�}|jt jjj| ƒƒ |jƒ S )N)Útarget)râ	  ÚetreeÚElementTreeÚ	XMLParserr!  Útostringr"  )rÝ  rô	  r#  )ró	  r(   r)   Ú
parse_nodeU  s    zdfxp2srt.<locals>.parse_nodez	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFz.//ttml:stylerÿ  zxml:idrä	  Tztts:ÚbodyÚdivz.//ttml:z.//Nr   Úbeginro  Údurz%d
%s --> %s
%s

r+   )rú	  rû	  )rÛ  rÜ  rò  Úobjectr'  r
   rã  rr  rå  rF	  Ú
setdefaultrû  rÊ  r½	  r'	  r“  rÙ	  rä  r&   rÛ	  rí  )Z	dfxp_dataZLEGACY_NAMESPACESrù	  rà  rá  rð  r~	  r’  ZparasÚrepeaträ	  Zstyle_idZparent_style_idrë	  rì	  ÚpZeleÚpararä  Z
begin_timeZend_timerý	  r(   )rí	  ró	  rî	  rï	  rð	  r)   Údfxp2srtó  sŽ    
@






r
  c             C   s*   | j |ƒ}|rt|ƒ}|d k	r&||gS g S )N)rå  r   )r˜  Úcommand_optionÚparamr(   r(   r)   Ú
cli_option—  s    
r
  rg	  rh	  c             C   sN   | j |ƒ}|d krg S t|tƒs$t‚|r>|| |r6|n| gS ||rH|n|gS )N)rå  rô  r	  rÛ  )r˜  r
  r
  Z
true_valueZfalse_valueÚ	separatorr(   r(   r)   Úcli_bool_optionž  s    
r
  c             C   s   | j |ƒ}||kr|gS g S )N)rå  )r˜  r
  r
  Zexpected_valuer(   r(   r)   Úcli_valueless_option¨  s    
r	
  c             C   s(   | j |ƒ}|d kr|S t|tƒs$t‚|S )N)rå  rô  r›  rÛ  )r˜  r
  rù  Zex_argsr(   r(   r)   Úcli_configuration_args­  s
    
r

  c            ¼   @   s   e Z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$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d9d:d;d<d=d>d?d@dAdBdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{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Ÿ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¹œ»Zedºd»„ ƒZed¼d½„ ƒZd¾S )¿ÚISO639UtilsZaarZabkZaveZafrZakaZamhÚargZaraZasmZavaZaymZazeZbakZbelZbulZbihZbisZbamZbenZbodZbreZbosÚcatZcheZchaÚcosZcreZcesZchuZchvZcymZdanZdeurû	  ZdzoZeweZellZengZepoZspaZestZeusZfasZfulZfinZfijZfaoZfraZfryZgleZglaZglgZgrnZgujZglvZhauZhebZhinZhmoZhrvZhatZhunZhyeZherZinaZindZileZiboZiiiZipkZidoZislZitaZikuZjpnZjavZkatZkonZkikZkuaZkazZkalZkhmZkanZkorZkauZkasZkurZkomZcorZkirZlatZltzZlugZlimZlinZlaoZlitZlubZlavZmlgZmahZmriZmkdZmalÚmonÚmarZmsaZmltZmyaZnauZnobZndeZnepZndoZnldZnnoZnorZnblZnavZnyaZociZojiZormZoriZossZpanZpliZpolZpusZporZqueZrohÚrunZronZrusZkinÚsanZsrdZsndZsmeZsagÚsinZslkZslvZsmoZsnaZsomZsqiZsrpZsswZsotÚsunZsweZswaZtamÚtelZtgkZthaZtirZtukZtglZtsnZtonZturZtsoZtatZtwiZtahZuigZukrZurdZuzbZvenZvieZvolZwlnZwolZxhoZyidZyorZzhaZzhoZzul)»ZaaÚabr†  rÀ  ZakÚamZanÚarÚasÚavZayÚazZbaÚbeÚbgZbhZbiZbmZbnZborã	  rœ  ÚcaZceÚchÚcoZcrÚcsZcuZcvÚcyÚdaÚdeZdvZdzÚeerk  r\  ÚeoÚesÚetÚeuÚfaZffÚfiÚfjÚfor]  ZfyÚgaÚgdÚglZgnZguÚgvZhaÚheÚiwÚhiZhoÚhrÚhtÚhuZhyÚhzÚiarÿ  ÚinÚieZigÚiiZikr  ÚisÚitÚiuÚjaZjvÚkaZkgZkiZkjrÜ  ÚklZkmÚknÚkoZkrÚksZkuZkvÚkwÚkyZlaZlbZlgZliZlnÚlorÈ	  ZluÚlvZmgZmhÚmiÚmkrº	  ZmnÚmrr		  r‚	  ZmyZnaÚnbZndrÍ	  ZngÚnlÚnnÚnoÚnrÚnvÚnyÚocZojZomÚorr´  ÚpaÚpiÚplZpsÚptZquZrmZrnÚroÚruÚrwrÑ  ZscÚsdZseZsgÚsiÚskÚslZsmZsnÚsoÚsqÚsrr…  ÚstZsuÚsvÚswÚtaÚteÚtgr‡  ZtiZtkÚtlÚtnZtoÚtrr�	  r}	  ZtwÚtyZugÚukÚurÚuzÚveÚviZvoÚwaZwoÚxhÚyiZjiZyoZzaÚzhÚzuc             C   s   | j j|dd… ƒS )z3Convert language code from ISO 639-1 to ISO 639-2/TNr×  )Ú	_lang_maprå  )rq  rº  r(   r(   r)   Ú
short2longu  s    zISO639Utils.short2longc             C   s(   x"| j jƒ D ]\}}||kr|S qW dS )z3Convert language code from ISO 639-2/T to ISO 639-1N)rx
  rã  )rq  rº  Z
short_nameZ	long_namer(   r(   r)   Ú
long2shortz  s    zISO639Utils.long2shortN)r  r  r  rx
  ru  ry
  rz
  r(   r(   r(   r)   r
  µ  sz  r
  c            ú   @   s  e Z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$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{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Ÿ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Ã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çdèdédêdëdìdídîdïdðdñdòdódôdõdöd÷dødùdúœùZedûdü„ ƒZdýS )þÚISO3166UtilsZAfghanistanu   Ã…land IslandsZAlbaniaZAlgeriazAmerican SamoaZAndorraZAngolaZAnguillaZ
AntarcticazAntigua and BarbudaZ	ArgentinaZArmeniaZArubaZ	AustraliaZAustriaZ
AzerbaijanZBahamasZBahrainZ
BangladeshZBarbadosZBelarusZBelgiumZBelizeZBeninZBermudaZBhutanzBolivia, Plurinational State ofz Bonaire, Sint Eustatius and SabazBosnia and HerzegovinaZBotswanazBouvet IslandZBrazilzBritish Indian Ocean TerritoryzBrunei DarussalamZBulgariazBurkina FasoZBurundiZCambodiaZCameroonZCanadaz
Cape VerdezCayman IslandszCentral African RepublicZChadZChileZChinazChristmas IslandzCocos (Keeling) IslandsZColombiaZComorosZCongoz%Congo, the Democratic Republic of thezCook Islandsz
Costa Ricau   CÃ´te d'IvoireZCroatiaZCubau   CuraÃ§aoZCypruszCzech RepublicZDenmarkZDjiboutiZDominicazDominican RepublicZEcuadorZEgyptzEl SalvadorzEquatorial GuineaZEritreaZEstoniaZEthiopiazFalkland Islands (Malvinas)zFaroe IslandsZFijiZFinlandZFrancezFrench GuianazFrench PolynesiazFrench Southern TerritoriesZGabonZGambiaZGeorgiaZGermanyZGhanaZ	GibraltarZGreeceZ	GreenlandZGrenadaZ
GuadeloupeZGuamZ	GuatemalaZGuernseyZGuineazGuinea-BissauZGuyanaZHaitiz!Heard Island and McDonald IslandszHoly See (Vatican City State)ZHondurasz	Hong KongZHungaryZIcelandZIndiaZ	IndonesiazIran, Islamic Republic ofZIraqZIrelandzIsle of ManZIsraelZItalyZJamaicaZJapanZJerseyZJordanZ
KazakhstanZKenyaZKiribatiz&Korea, Democratic People's Republic ofzKorea, Republic ofZKuwaitZ
Kyrgyzstanz Lao People's Democratic RepublicZLatviaZLebanonZLesothoZLiberiaZLibyaZLiechtensteinZ	LithuaniaZ
LuxembourgZMacaoz*Macedonia, the Former Yugoslav Republic ofZ
MadagascarZMalawiZMalaysiaZMaldivesZMaliZMaltazMarshall IslandsZ
MartiniqueZ
MauritaniaZ	MauritiusZMayotteZMexicozMicronesia, Federated States ofzMoldova, Republic ofZMonacoZMongoliaZ
MontenegroZ
MontserratZMoroccoZ
MozambiqueZMyanmarZNamibiaZNauruZNepalZNetherlandszNew CaledoniazNew ZealandZ	NicaraguaZNigerZNigeriaZNiuezNorfolk IslandzNorthern Mariana IslandsZNorwayZOmanZPakistanZPalauzPalestine, State ofZPanamazPapua New GuineaZParaguayZPeruZPhilippinesZPitcairnZPolandZPortugalzPuerto RicoZQataru   RÃ©unionZRomaniazRussian FederationZRwandau   Saint BarthÃ©lemyz,Saint Helena, Ascension and Tristan da CunhazSaint Kitts and NeviszSaint LuciazSaint Martin (French part)zSaint Pierre and Miquelonz Saint Vincent and the GrenadinesZSamoaz
San MarinozSao Tome and PrincipezSaudi ArabiaZSenegalZSerbiaZ
SeychelleszSierra LeoneZ	SingaporezSint Maarten (Dutch part)ZSlovakiaZSloveniazSolomon IslandsZSomaliazSouth Africaz,South Georgia and the South Sandwich IslandszSouth SudanZSpainz	Sri LankaZSudanZSurinamezSvalbard and Jan MayenZ	SwazilandZSwedenZSwitzerlandzSyrian Arab RepubliczTaiwan, Province of ChinaZ
TajikistanzTanzania, United Republic ofZThailandzTimor-LesteZTogoZTokelauZTongazTrinidad and TobagoZTunisiaZTurkeyZTurkmenistanzTurks and Caicos IslandsZTuvaluZUgandaZUkrainezUnited Arab EmirateszUnited KingdomzUnited Statesz$United States Minor Outlying IslandsZUruguayZ
UzbekistanZVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaZYemenZZambiaZZimbabwe)ùÚAFÚAXÚALÚDZÚASÚADÚAOÚAIÚAQÚAGÚARÚAMÚAWÚAUÚATÚAZÚBSÚBHÚBDÚBBÚBYÚBEÚBZÚBJÚBMÚBTÚBOÚBQÚBAÚBWZBVÚBRÚIOÚBNÚBGÚBFÚBIÚKHÚCMÚCAÚCVÚKYÚCFÚTDÚCLÚCNZCXZCCÚCOÚKMÚCGÚCDÚCKÚCRÚCIÚHRÚCUÚCWÚCYÚCZÚDKÚDJÚDMÚDOÚECÚEGÚSVÚGQÚERÚEEÚETÚFKÚFOÚFJÚFIÚFRÚGFÚPFZTFÚGAÚGMÚGEÚDEÚGHÚGIÚGRÚGLÚGDÚGPÚGUÚGTÚGGÚGNÚGWÚGYÚHTZHMÚVAÚHNÚHKÚHUÚISÚINÚIDÚIRÚIQÚIEÚIMÚILÚITÚJMÚJPÚJEÚJOÚKZÚKEÚKIÚKPÚKRÚKWÚKGÚLAÚLVÚLBÚLSÚLRÚLYÚLIÚLTÚLUÚMOÚMKÚMGÚMWÚMYÚMVÚMLÚMTÚMHÚMQÚMRÚMUÚYTÚMXÚFMÚMDÚMCÚMNÚMEÚMSÚMAÚMZÚMMÚNAÚNRÚNPÚNLr]	  ÚNZÚNIÚNEÚNGÚNUÚNFÚMPÚNOÚOMÚPKÚPWÚPSÚPAr[	  ÚPYÚPEÚPHZPNÚPLÚPTÚPRÚQAÚREÚROÚRUÚRWÚBLZSHÚKNÚLCÚMFÚPMÚVCÚWSÚSMÚSTÚSAÚSNÚRSÚSCÚSLÚSGÚSXÚSKÚSIÚSBÚSOÚZAZGSÚSSÚESÚLKÚSDÚSRZSJÚSZÚSEÚCHÚSYÚTWÚTJÚTZr„  ÚTLÚTGÚTKÚTOÚTTÚTNÚTRÚTMÚTCÚTVÚUGÚUArƒ  rÖ  ÚUSZUMÚUYÚUZÚVUÚVEÚVNÚVGÚVIÚWFZEHÚYEÚZMÚZWc             C   s   | j j|jƒ ƒS )zAConvert an ISO 3166-2 country code to the corresponding full name)Ú_country_maprå  Úupper)rq  rº  r(   r(   r)   Ú
short2full€  s    zISO3166Utils.short2fullN)r  r  r  re  ru  rg  r(   r(   r(   r)   r{
  ‚  sô  r{
  c            ñ   @   sþ  e Z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$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{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Ÿ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Ã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çdèdédêdëdìdídîdïdðdñœðZedòdó„ ƒZdôS )õÚGeoUtilsz46.172.224.0/19z94.200.0.0/13z149.54.0.0/17z209.59.64.0/18z204.14.248.0/21z46.99.0.0/16z46.70.0.0/15z105.168.0.0/13z182.50.184.0/21z23.154.160.0/24z181.0.0.0/12z202.70.112.0/20z77.116.0.0/14z1.128.0.0/11z181.41.0.0/18z185.217.4.0/22z5.197.0.0/16z31.176.128.0/17z65.48.128.0/17z114.130.0.0/16z
57.0.0.0/8z102.178.0.0/15z95.42.0.0/15z37.131.0.0/17z154.117.192.0/18z137.255.0.0/16z185.212.72.0/23z196.12.64.0/18z156.31.0.0/16z161.56.0.0/16z161.0.80.0/20z191.128.0.0/12z24.51.64.0/18z119.2.96.0/19z168.167.0.0/16z178.120.0.0/13z179.42.192.0/18z99.224.0.0/11z41.243.0.0/16z197.242.176.0/21z160.113.0.0/16z85.0.0.0/13z102.136.0.0/14z202.65.32.0/19z152.172.0.0/14z102.244.0.0/14z36.128.0.0/10z181.240.0.0/12z201.192.0.0/12z152.206.0.0/15z165.90.96.0/19z190.88.128.0/17z31.153.0.0/16z88.100.0.0/14z
53.0.0.0/8z197.241.0.0/17z87.48.0.0/12z192.243.48.0/20z152.166.0.0/15z41.96.0.0/12z186.68.0.0/15z90.190.0.0/15z156.160.0.0/11z196.200.96.0/20z88.0.0.0/11z196.188.0.0/14z2.16.0.0/13z91.152.0.0/13z144.120.0.0/16z80.73.208.0/21z119.252.112.0/20z88.85.32.0/19z
90.0.0.0/9z41.158.0.0/15z
25.0.0.0/8z74.122.88.0/21z31.146.0.0/16z161.22.64.0/18z62.68.160.0/19z154.160.0.0/12z95.164.0.0/16z88.83.0.0/19z160.182.0.0/15z197.149.192.0/18z104.250.0.0/19z105.235.224.0/20z94.64.0.0/13z168.234.0.0/16z168.123.0.0/16z197.214.80.0/20z181.41.64.0/18z113.252.0.0/14z181.210.0.0/16z93.136.0.0/13z148.102.128.0/17z84.0.0.0/14z39.192.0.0/10z87.32.0.0/12z79.176.0.0/13z5.62.80.0/20z117.192.0.0/10z203.83.48.0/21z37.236.0.0/14z2.176.0.0/12z82.221.0.0/16z79.0.0.0/10z87.244.64.0/18z72.27.0.0/17z176.29.0.0/16z133.0.0.0/8z105.48.0.0/12z158.181.128.0/17z36.37.128.0/17z103.25.140.0/22z197.255.224.0/20z198.167.192.0/19z175.45.176.0/22z175.192.0.0/10z37.36.0.0/14z64.96.0.0/15z2.72.0.0/13z115.84.64.0/18z178.135.0.0/16z24.92.144.0/20z82.117.0.0/19z112.134.0.0/15z102.183.0.0/16z129.232.0.0/17z78.56.0.0/13z188.42.0.0/16z46.109.0.0/16z41.252.0.0/14z105.128.0.0/11z88.209.64.0/18z37.246.0.0/16z178.175.0.0/17z74.112.232.0/21z154.126.0.0/17z117.103.88.0/21z77.28.0.0/15z154.118.128.0/18z37.111.0.0/17z49.0.128.0/17z60.246.0.0/16z202.88.64.0/20z109.203.224.0/19z41.188.64.0/18z208.90.112.0/22z46.11.0.0/16z105.16.0.0/12z27.114.128.0/18z102.70.0.0/15z187.192.0.0/11z175.136.0.0/13z197.218.0.0/15z41.182.0.0/16z101.101.0.0/18z197.214.0.0/18z203.17.240.0/22z105.112.0.0/12z186.76.0.0/15z145.96.0.0/11z84.208.0.0/13z36.252.0.0/15z203.98.224.0/19z49.156.48.0/22z49.224.0.0/14z5.36.0.0/15z186.72.0.0/15z186.160.0.0/14z123.50.64.0/18z124.240.192.0/19z49.144.0.0/13z39.32.0.0/11z83.0.0.0/11z70.36.0.0/20z66.50.0.0/16z188.161.0.0/16z85.240.0.0/13z202.124.224.0/20z181.120.0.0/14z37.210.0.0/15z102.35.0.0/16z79.112.0.0/13z93.86.0.0/15z5.136.0.0/13z41.186.0.0/16z188.48.0.0/13z202.1.160.0/19z154.192.0.0/11z102.120.0.0/13z78.64.0.0/12z8.128.0.0/10z188.196.0.0/14z78.98.0.0/15z102.143.0.0/17z89.186.32.0/19z41.82.0.0/15z154.115.192.0/18z186.179.128.0/17z105.235.208.0/21z197.159.160.0/19z168.243.0.0/16z190.102.0.0/20z
5.0.0.0/16z41.84.224.0/19z65.255.48.0/20z154.68.128.0/19z196.168.0.0/14z171.96.0.0/13z85.9.128.0/18z27.96.24.0/21z180.189.160.0/20z95.85.96.0/19z197.0.0.0/11z175.176.144.0/21z78.160.0.0/11z186.44.0.0/15z202.2.96.0/19z120.96.0.0/11z156.156.0.0/14z37.52.0.0/14z102.80.0.0/13z	6.0.0.0/8z167.56.0.0/13z84.54.64.0/18z212.77.0.0/19z207.191.240.0/21z186.88.0.0/13z66.81.192.0/20z146.226.0.0/16z14.160.0.0/11z202.80.32.0/20z117.20.32.0/21z202.4.32.0/19z134.35.0.0/16z41.242.116.0/22z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)ðr�
  rƒ  r|
  r…
  rƒ
  r~
  r‡
  r‚
  ZAPr„
  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«
  rH  r¯
  r­
  r§
  r¡
  r¨
  r©
  r®
  r±
  r£
  r²
  r³
  r´
  rÊ
  r¶
  rµ
  r·
  r¸
  r
  r¹
  r¾
  rº
  r½
  rB  r¿
  ZEUrÃ
  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î
  r¤
  ré
  rð
  rò
  r.  rö
  rC  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$  r0  r&  r  r%  r  r!  r'  r(  r)  r7  r*  r+  r5  r>  r8  rD  rG  r:  r=  r<  r9  r3  r6  r?  rE  rA  r4  r»
  r;  rI  rF  rU  r¦
  rN  r„  rK  rO  rM  rT  rR  rP  rS  rQ  rV  rJ  rL  rX  rW  rY  rZ  r[  rØ
  r1  r]  r_  r`  r^  r\  ra  r2  rb  r  r@  rc  rd  c             C   sx   t |ƒdkr&| jj|jƒ ƒ}|s*d S n|}|jdƒ\}}tdtj|ƒƒd }|dt|ƒ? B }t	tj
tdtj||ƒƒƒƒS )Nr×  rë  z!Lr   l   ÿÿ )rì  Ú_country_ip_maprå  rf  rç  r   r   Ú	inet_atonrq  r   Ú	inet_ntoar   rT  Úrandint)rq  Zcode_or_blockÚblockr¿  ZpreflenZaddr_minZaddr_maxr(   r(   r)   Úrandom_ipv4{  s    zGeoUtils.random_ipv4N)r  r  r  ri  ru  rn  r(   r(   r(   r)   rh  †  sâ  rh  c               @   s   e Zd Zddd„Zdd„ ZdS )ÚPerRequestProxyHandlerNc             C   s>   x*dD ]"}t | d| d|| jfdd„ƒ qW tjj| |ƒ d S )NÚhttpÚhttpsz%s_openÚ__noproxy__c             S   s   || ||ƒS )Nr(   )rµ  Úproxyrw  Úmethr(   r(   r)   r»  �  s    z1PerRequestProxyHandler.__init__.<locals>.<lambda>)rp  rq  )ÚsetattrÚ
proxy_openr   ÚProxyHandlerr  )r  Úproxiesrw  r(   r(   r)   r  ‹  s    

zPerRequestProxyHandler.__init__c             C   sb   |j jdƒ}|d k	r |}|j d= |dkr,d S tj|ƒjjƒ dkrP|jd|ƒ d S tjj	| |||ƒS )	NzYtdl-request-proxyrr  r!   r"   r#   r$   zYtdl-socks-proxy)r!   r"   r#   r$   )
rä  rå  r   r  r'   rß  rù  r   rw  rv  )r  rë  rs  rw  Z	req_proxyr(   r(   r)   rv  “  s    z!PerRequestProxyHandler.proxy_open)N)r  r  r  r  rv  r(   r(   r(   r)   ro  Š  s   
ro  c             C   sœ   d}t | ƒ} x&| dkr2td| d@ ƒ| }| d? } qW x*tt|ƒƒD ]}|| dkrBP qBW d}d}||d… }|dkr˜t|ƒ| r˜|t|ƒ|  d | }|S )	a  long_to_bytes(n:long, blocksize:int) : string
    Convert a long integer to a byte string.

    If optional blocksize is given and greater than zero, pad the front of the
    byte string with binary zeros so that the length is a multiple of
    blocksize.
    rž  r   z>Il   ÿÿ rD  ó    Nr   )rq  r   r  rì  )rú  Ú	blocksizerP  r  r(   r(   r)   Úlong_to_bytes§  s    	
r{  c             C   sp   d}t | ƒ}|d r4d|d  }d| |  } || }x6td|dƒD ]&}|d> td| ||d … ƒd  }qBW |S )z‰bytes_to_long(string) : long
    Convert a byte string to a long integer.

    This is (essentially) the inverse of long_to_bytes().
    r   rÔ  ry  rD  z>I)rì  r  r   )rP  Úaccrp	  Úextrar  r(   r(   r)   Úbytes_to_longÅ  s    &r~  c             C   s.   t tj| ddd… ƒdƒ}t|||ƒ}d| S )a0  
    Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/

    Input:
        data: data to encrypt, bytes-like object
        exponent, modulus: parameter e and N of RSA algorithm, both integer
    Output: hex string of encrypted data

    Limitation: supports one block encryption only
    Nr   rn  z%xr  )rq  ÚbinasciiÚhexlifyÚpow)rò  rÎ  ÚmodulusÚpayloadZ	encryptedr(   r(   r)   Úohdave_rsa_encryptÖ  s    r„  c             C   sL   t | ƒ|d krtdƒ‚dd„ t|t | ƒ d ƒD ƒ}ddg| dg |  S )z²
    Padding input data with PKCS#1 scheme

    @param {int[]} data        input data
    @param {int}   length      target length
    @returns {int[]}           padded data
    rw  z&Input data too long for PKCS#1 paddingc             S   s   g | ]}t jd dƒ‘qS )r   éþ   )rT  rl  )rè  rF  r(   r(   r)   rê  ò  s    zpkcs1pad.<locals>.<listcomp>r²  r   r×  )rì  rr  r  )rò  rp	  Zpseudo_randomr(   r(   r)   Úpkcs1padç  s    r†  c             C   sn   d}|s|d |… }|t |ƒkr4td|t |ƒf ƒ‚| dkrD|d S d}x | rh|| |  | }| | } qJW |S )NZ>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase %d exceeds table length %dr   r+   )rì  rr  )rÒ  rú  r¾	  Z
FULL_TABLEr”  r(   r(   r)   Úencode_base_nö  s    r‡  c                s|   t jt| ƒ}|jƒ \}}}}t|ƒ}t|ƒ}|jdƒ}i ‰ x*|rd|d8 }t||ƒ}|| p\|ˆ |< q<W t jd‡ fdd„|ƒS )NrÐ  r   z	\b(\w+)\bc                s   ˆ | j dƒ S )Nr   )r  )rt  )Úsymbol_tabler(   r)   r»    s    z%decode_packed_codes.<locals>.<lambda>)rÙ  r=  ÚPACKED_CODES_RErj  rq  rç  r‡  r(  )rº  rt  Zobfucasted_coderu  r“  ZsymbolsZbase_n_countr(   )rˆ  r)   Údecode_packed_codes  s    

rŠ  c                s0   ˆdkr| S t ˆ ƒ‰dj‡ ‡‡fdd„| D ƒƒS )Nr   r+   c             3   s0   | ](}|ˆ kr$ˆ ˆ j |ƒˆ ˆ  n|V  qd S )N)rä  )rè  ré  )ÚalphabetÚlÚshiftr(   r)   râ    s   zcaesar.<locals>.<genexpr>)rì  rí  )rP  r‹  r�  r(   )r‹  rŒ  r�  r)   Úcaesar  s    rŽ  c             C   s   t | ddƒS )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~é/   )rŽ  )rP  r(   r(   r)   Úrot47#  s    r�  c             C   s@   i }x6t jd| ƒD ]&\}}|jdƒr0|dd… }|||< qW |S )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r  r   r  )rÙ  rã  r  )rä  Úinforß  rà  r(   r(   r)   Úparse_m3u8_attributes'  s    
r’  c             C   s   | dkr| |? S | d |? S )Nr   l        r(   )rà  rú  r(   r(   r)   Úurshift0  s    r“  c                s  | dd … }| d d… dks,|dd… dkr4t dƒ‚dddd	œ‰ ‡ fd
d„}g }xr|rÂ||d d… ƒ}|dd … }|d d… }|dd … }|d |… }||d … }|dd … }|j|||dœƒ qRW |d d }||d d… ƒ}||dd… ƒ}	d}
x$|D ]}|d dkrú|
|d 7 }
qúW |
�s(t dƒ‚ttj|
ƒƒ}|d ‰g ‰‡‡fdd„}�x¨t|	ƒD �]š}|dˆ  }|| }g }ˆj|ƒ �xntˆƒD �]`}|d| |  }|ˆ | }d}d}|dk�rÐ||d ƒ}|dk�ræ||ˆ ƒ}|dk�rþ|| d@ }nè|dk�r|| d@ }nÐ|dk�r6||| d?  d@ }n°|dk�ræ|}|}d}|dk�rp|dk�rp||ˆ d ƒ}|| | }t|| ƒ}t|| ƒ}t|| ƒ}||k�rÂ||k�rÂ|| d@ }n$||k�rÚ|| d@ }n|| d@ }|j|ƒ �q�W �q\W ||	ˆfS )NrÕ  s   ‰PNG

rÔ  s   IHDRzNot a valid PNG file.z>Bz>Hz>I)r   r×  rÔ  c                s   t ˆ t| ƒ | ƒd S )Nr   )r   rì  )rm  )Úint_mapr(   r)   r»  >  s    zdecode_png.<locals>.<lambda>)rw  rp	  rò  r   rò  rž  rw  s   IDATzUnable to read PNG data.r²  c                s   | ˆ }| ˆ }ˆ | | S )Nr(   )Úidxrm  rˆ  )ÚpixelsÚstrider(   r)   Ú
_get_pixelg  s    zdecode_png.<locals>._get_pixelr   r×  éÿ   )r4  r&   Ú	bytearrayrï  rð  r  Úabs)Zpng_dataÚheaderZunpack_integerÚchunksrp	  Z
chunk_typeZ
chunk_dataZihdrrß  rà  ZidatÚchunkZdecompressed_datar˜  rˆ  ZbasePosZfilter_typeZcurrent_rowrm  rÜ	  ZbasexÚleftZupr¶  r€  ré  r
  rV
  r×  Zpcr(   )r”  r–  r—  r)   Ú
decode_png6  sˆ     








r   c             C   s\  y�dd l }t|dƒrDd}t|jƒt|ƒk r<td||jf ƒ‚|j}n|j}y|| ||ƒ W n0 tk
rŠ } zt|j	|j
ƒ‚W Y d d }~X nX W �nÆ tk
�rV   tdk�r0d|ks¸t‚tjj| ƒsÈt‚| d | }y$t|dƒ�}|j|ƒ W d Q R X W n2 tk
�r* } zt|j	|j
ƒ‚W Y d d }~X nX �n"tdd	gƒ}	td
dgƒ}
|	�sT|
�r2|jdƒ}|	�rvd}d|d|g}n|
�rŠd
}d||g}t|dƒgdd„ |D ƒ t| dƒg }ytj|tjtjtjd�}W n2 tk
�rþ } zt|j	|j
ƒ‚W Y d d }~X nX |jƒ \}}|jddƒ}|jdk�rRt|j|ƒ‚n tjjdƒ�rJtdƒ‚ntdƒ‚Y nX d S )Nr   Úsetz0.5.0z�python-pyxattr is detected but is too old. youtube-dl requires %s or above while your version is %s. Falling back to other xattr implementationsÚntræ  rÂ  Zsetfattrz	--versionÚxattrz-hzutf-8z-nz-vz-wTc             S   s   g | ]}t |ƒ‘qS r(   )rƒ  )rè  Úor(   r(   r)   rê  ×  s    zwrite_xattr.<locals>.<listcomp>)r/  r–  r	  r'  ÚlinuxzŸCouldn't find a tool to set the xattrs. Install either the python 'pyxattr' or 'xattr' modules, or the GNU 'attr' package (which contains the 'setfattr' tool).zhCouldn't find a tool to set the xattrs. Install either the python 'xattr' module, or the 'xattr' binary.)r£  r2  rs	  Ú__version__r¼  r¡  ÚsetxattrÚEnvironmentErrorr¸  r5  ÚstrerrorÚImportErrorr   rÛ  r´  rµ  Úexistsr3  r(  r	  r·  rÅ  r	  r	  r	  r	  Ú
returncoderÆ  rÈ  r  )rµ  rß  r	  r£  Zpyxattr_required_versionr§  rr	  Zads_fnr¸  Zuser_has_setfattrZuser_has_xattrÚ
executableÚoptsÚcmdr
  r/  r–  r(   r(   r)   Úwrite_xattrŸ  sb    
&
$

& r°  c             C   s^   t jdddƒ}t jdddƒ}tjd|| jƒ}|t j|ƒ }| t|jƒ|t|jƒ|t|j	ƒiS )Niž  r   iË  rS  é   r   )
r>  rg  rT  rl  r`  r?  rõ  rf  rc  rd  )Z
year_fieldZmonth_fieldZ	day_fieldZ
start_dateZend_dateÚoffsetZrandom_dater(   r(   r)   Úrandom_birthdayó  s    

r³  )%r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  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˜  r™  rš  r›  rœ  r�  rž  rŸ  r   r¡  r¢  r£  r¤  r¥  r¦  r§  r¨  r©  rª  r«  r¬  )r×  rØ  )N)N)T)T)FF)F)F)rC  N)T)T)T)rU  )N)NN)N)r\  )r   NNr   )N)r   r   N)N)N)N)N)Nr	  )N)NT)N)T)rg	  rh	  N)T)r   )N("  Ú
__future__r   r£	  r  rE  r-	  r;	  rƒ  r>  Úemail.utilsr;  Zemail.headerr5  rÛ  rý  r  r'	  rÍ  r­  rÌ  rÇ	  r´  rÈ  rT  rÙ  r   rŒ  r	  rÆ  rË  r¤  Úxml.etree.ElementTreerâ	  rï  Úcompatr   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*   rw  rÎ	  Zcompiled_regex_typerV  r÷  ZUSER_AGENTSrþ	  rö  rç  rã  rX  r  r½	  ÚchainrG  ZDATE_FORMATSr›  rJ  r(	  rK  r‰  Z
JSON_LD_REr±  rÖ  rÇ  râ  rò  rû  rý  rþ  r  r  r   r  r  r  r$  r*  r:  rB  rR  r6  rd  rg  ri  rl  rv  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.  r4  r3  rB  rI  rM  rR  rT  rZ  r]  ri  rk  rl  rv  r•  rš  r�  r   r‰  r-  Ú	Structurer¡  r�  rŽ  r©  r}  rŒ  r~  r�  Úargtypesr�  Úrestyper¯  rª  r«  r®  r°  r±  rª  r³  r´  rÉ  r¼  rÁ  r¾  rÏ  rÓ  rÙ  rÞ  rá  râ  ræ  rè  ré  rñ  rX  ró  rõ  rö  r÷  rø  re  rù  rü  r 	  r	  rÝ  r	  r	  r	  r	  r
	  r	  r[  r	  r	  r	  r	  r 	  r*	  r/	  r0	  r1	  rõ  r>	  r@	  rC	  rö  rI	  rK	  rN	  rS	  rT	  rW	  ra	  rb	  rc	  rd	  rl	  ro	  ÚDEFAULT_OUTTMPLrq	  rs	  rv	  rš  r{	  r|	  rƒ	  r 	  r¢	  r¥	  r§	  r²	  r¸	  r¿	  rÒ	  rÖ	  rØ	  rÙ	  rÛ	  r
  r
  r
  r	
  r

  r
  r{
  rh  rw  ro  r{  r~  r„  r†  r‡  rŠ  rŽ  r�  r’  r“  r   r°  r³  r(   r(   r(   r)   Ú<module>   sº  t
            <                                               6
 	)			
			A
{+0	!

K		

	
	G
			:
4


)

		%
F
 %
 N    		iT