PageRenderTime 33ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/youtube_dl/utils.py

http://github.com/rg3/youtube-dl
Python | 5700 lines | 5457 code | 161 blank | 82 comment | 178 complexity | be43d37bc2d7d991acf53e7117b49555 MD5 | raw file
Possible License(s): Unlicense

Large files files are truncated, but you can click here to view the full file

  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. from __future__ import unicode_literals
  4. import base64
  5. import binascii
  6. import calendar
  7. import codecs
  8. import collections
  9. import contextlib
  10. import ctypes
  11. import datetime
  12. import email.utils
  13. import email.header
  14. import errno
  15. import functools
  16. import gzip
  17. import io
  18. import itertools
  19. import json
  20. import locale
  21. import math
  22. import operator
  23. import os
  24. import platform
  25. import random
  26. import re
  27. import socket
  28. import ssl
  29. import subprocess
  30. import sys
  31. import tempfile
  32. import time
  33. import traceback
  34. import xml.etree.ElementTree
  35. import zlib
  36. from .compat import (
  37. compat_HTMLParseError,
  38. compat_HTMLParser,
  39. compat_basestring,
  40. compat_chr,
  41. compat_cookiejar,
  42. compat_ctypes_WINFUNCTYPE,
  43. compat_etree_fromstring,
  44. compat_expanduser,
  45. compat_html_entities,
  46. compat_html_entities_html5,
  47. compat_http_client,
  48. compat_integer_types,
  49. compat_kwargs,
  50. compat_os_name,
  51. compat_parse_qs,
  52. compat_shlex_quote,
  53. compat_str,
  54. compat_struct_pack,
  55. compat_struct_unpack,
  56. compat_urllib_error,
  57. compat_urllib_parse,
  58. compat_urllib_parse_urlencode,
  59. compat_urllib_parse_urlparse,
  60. compat_urllib_parse_unquote_plus,
  61. compat_urllib_request,
  62. compat_urlparse,
  63. compat_xpath,
  64. )
  65. from .socks import (
  66. ProxyType,
  67. sockssocket,
  68. )
  69. def register_socks_protocols():
  70. # "Register" SOCKS protocols
  71. # In Python < 2.6.5, urlsplit() suffers from bug https://bugs.python.org/issue7904
  72. # URLs with protocols not in urlparse.uses_netloc are not handled correctly
  73. for scheme in ('socks', 'socks4', 'socks4a', 'socks5'):
  74. if scheme not in compat_urlparse.uses_netloc:
  75. compat_urlparse.uses_netloc.append(scheme)
  76. # This is not clearly defined otherwise
  77. compiled_regex_type = type(re.compile(''))
  78. def random_user_agent():
  79. _USER_AGENT_TPL = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
  80. _CHROME_VERSIONS = (
  81. '74.0.3729.129',
  82. '76.0.3780.3',
  83. '76.0.3780.2',
  84. '74.0.3729.128',
  85. '76.0.3780.1',
  86. '76.0.3780.0',
  87. '75.0.3770.15',
  88. '74.0.3729.127',
  89. '74.0.3729.126',
  90. '76.0.3779.1',
  91. '76.0.3779.0',
  92. '75.0.3770.14',
  93. '74.0.3729.125',
  94. '76.0.3778.1',
  95. '76.0.3778.0',
  96. '75.0.3770.13',
  97. '74.0.3729.124',
  98. '74.0.3729.123',
  99. '73.0.3683.121',
  100. '76.0.3777.1',
  101. '76.0.3777.0',
  102. '75.0.3770.12',
  103. '74.0.3729.122',
  104. '76.0.3776.4',
  105. '75.0.3770.11',
  106. '74.0.3729.121',
  107. '76.0.3776.3',
  108. '76.0.3776.2',
  109. '73.0.3683.120',
  110. '74.0.3729.120',
  111. '74.0.3729.119',
  112. '74.0.3729.118',
  113. '76.0.3776.1',
  114. '76.0.3776.0',
  115. '76.0.3775.5',
  116. '75.0.3770.10',
  117. '74.0.3729.117',
  118. '76.0.3775.4',
  119. '76.0.3775.3',
  120. '74.0.3729.116',
  121. '75.0.3770.9',
  122. '76.0.3775.2',
  123. '76.0.3775.1',
  124. '76.0.3775.0',
  125. '75.0.3770.8',
  126. '74.0.3729.115',
  127. '74.0.3729.114',
  128. '76.0.3774.1',
  129. '76.0.3774.0',
  130. '75.0.3770.7',
  131. '74.0.3729.113',
  132. '74.0.3729.112',
  133. '74.0.3729.111',
  134. '76.0.3773.1',
  135. '76.0.3773.0',
  136. '75.0.3770.6',
  137. '74.0.3729.110',
  138. '74.0.3729.109',
  139. '76.0.3772.1',
  140. '76.0.3772.0',
  141. '75.0.3770.5',
  142. '74.0.3729.108',
  143. '74.0.3729.107',
  144. '76.0.3771.1',
  145. '76.0.3771.0',
  146. '75.0.3770.4',
  147. '74.0.3729.106',
  148. '74.0.3729.105',
  149. '75.0.3770.3',
  150. '74.0.3729.104',
  151. '74.0.3729.103',
  152. '74.0.3729.102',
  153. '75.0.3770.2',
  154. '74.0.3729.101',
  155. '75.0.3770.1',
  156. '75.0.3770.0',
  157. '74.0.3729.100',
  158. '75.0.3769.5',
  159. '75.0.3769.4',
  160. '74.0.3729.99',
  161. '75.0.3769.3',
  162. '75.0.3769.2',
  163. '75.0.3768.6',
  164. '74.0.3729.98',
  165. '75.0.3769.1',
  166. '75.0.3769.0',
  167. '74.0.3729.97',
  168. '73.0.3683.119',
  169. '73.0.3683.118',
  170. '74.0.3729.96',
  171. '75.0.3768.5',
  172. '75.0.3768.4',
  173. '75.0.3768.3',
  174. '75.0.3768.2',
  175. '74.0.3729.95',
  176. '74.0.3729.94',
  177. '75.0.3768.1',
  178. '75.0.3768.0',
  179. '74.0.3729.93',
  180. '74.0.3729.92',
  181. '73.0.3683.117',
  182. '74.0.3729.91',
  183. '75.0.3766.3',
  184. '74.0.3729.90',
  185. '75.0.3767.2',
  186. '75.0.3767.1',
  187. '75.0.3767.0',
  188. '74.0.3729.89',
  189. '73.0.3683.116',
  190. '75.0.3766.2',
  191. '74.0.3729.88',
  192. '75.0.3766.1',
  193. '75.0.3766.0',
  194. '74.0.3729.87',
  195. '73.0.3683.115',
  196. '74.0.3729.86',
  197. '75.0.3765.1',
  198. '75.0.3765.0',
  199. '74.0.3729.85',
  200. '73.0.3683.114',
  201. '74.0.3729.84',
  202. '75.0.3764.1',
  203. '75.0.3764.0',
  204. '74.0.3729.83',
  205. '73.0.3683.113',
  206. '75.0.3763.2',
  207. '75.0.3761.4',
  208. '74.0.3729.82',
  209. '75.0.3763.1',
  210. '75.0.3763.0',
  211. '74.0.3729.81',
  212. '73.0.3683.112',
  213. '75.0.3762.1',
  214. '75.0.3762.0',
  215. '74.0.3729.80',
  216. '75.0.3761.3',
  217. '74.0.3729.79',
  218. '73.0.3683.111',
  219. '75.0.3761.2',
  220. '74.0.3729.78',
  221. '74.0.3729.77',
  222. '75.0.3761.1',
  223. '75.0.3761.0',
  224. '73.0.3683.110',
  225. '74.0.3729.76',
  226. '74.0.3729.75',
  227. '75.0.3760.0',
  228. '74.0.3729.74',
  229. '75.0.3759.8',
  230. '75.0.3759.7',
  231. '75.0.3759.6',
  232. '74.0.3729.73',
  233. '75.0.3759.5',
  234. '74.0.3729.72',
  235. '73.0.3683.109',
  236. '75.0.3759.4',
  237. '75.0.3759.3',
  238. '74.0.3729.71',
  239. '75.0.3759.2',
  240. '74.0.3729.70',
  241. '73.0.3683.108',
  242. '74.0.3729.69',
  243. '75.0.3759.1',
  244. '75.0.3759.0',
  245. '74.0.3729.68',
  246. '73.0.3683.107',
  247. '74.0.3729.67',
  248. '75.0.3758.1',
  249. '75.0.3758.0',
  250. '74.0.3729.66',
  251. '73.0.3683.106',
  252. '74.0.3729.65',
  253. '75.0.3757.1',
  254. '75.0.3757.0',
  255. '74.0.3729.64',
  256. '73.0.3683.105',
  257. '74.0.3729.63',
  258. '75.0.3756.1',
  259. '75.0.3756.0',
  260. '74.0.3729.62',
  261. '73.0.3683.104',
  262. '75.0.3755.3',
  263. '75.0.3755.2',
  264. '73.0.3683.103',
  265. '75.0.3755.1',
  266. '75.0.3755.0',
  267. '74.0.3729.61',
  268. '73.0.3683.102',
  269. '74.0.3729.60',
  270. '75.0.3754.2',
  271. '74.0.3729.59',
  272. '75.0.3753.4',
  273. '74.0.3729.58',
  274. '75.0.3754.1',
  275. '75.0.3754.0',
  276. '74.0.3729.57',
  277. '73.0.3683.101',
  278. '75.0.3753.3',
  279. '75.0.3752.2',
  280. '75.0.3753.2',
  281. '74.0.3729.56',
  282. '75.0.3753.1',
  283. '75.0.3753.0',
  284. '74.0.3729.55',
  285. '73.0.3683.100',
  286. '74.0.3729.54',
  287. '75.0.3752.1',
  288. '75.0.3752.0',
  289. '74.0.3729.53',
  290. '73.0.3683.99',
  291. '74.0.3729.52',
  292. '75.0.3751.1',
  293. '75.0.3751.0',
  294. '74.0.3729.51',
  295. '73.0.3683.98',
  296. '74.0.3729.50',
  297. '75.0.3750.0',
  298. '74.0.3729.49',
  299. '74.0.3729.48',
  300. '74.0.3729.47',
  301. '75.0.3749.3',
  302. '74.0.3729.46',
  303. '73.0.3683.97',
  304. '75.0.3749.2',
  305. '74.0.3729.45',
  306. '75.0.3749.1',
  307. '75.0.3749.0',
  308. '74.0.3729.44',
  309. '73.0.3683.96',
  310. '74.0.3729.43',
  311. '74.0.3729.42',
  312. '75.0.3748.1',
  313. '75.0.3748.0',
  314. '74.0.3729.41',
  315. '75.0.3747.1',
  316. '73.0.3683.95',
  317. '75.0.3746.4',
  318. '74.0.3729.40',
  319. '74.0.3729.39',
  320. '75.0.3747.0',
  321. '75.0.3746.3',
  322. '75.0.3746.2',
  323. '74.0.3729.38',
  324. '75.0.3746.1',
  325. '75.0.3746.0',
  326. '74.0.3729.37',
  327. '73.0.3683.94',
  328. '75.0.3745.5',
  329. '75.0.3745.4',
  330. '75.0.3745.3',
  331. '75.0.3745.2',
  332. '74.0.3729.36',
  333. '75.0.3745.1',
  334. '75.0.3745.0',
  335. '75.0.3744.2',
  336. '74.0.3729.35',
  337. '73.0.3683.93',
  338. '74.0.3729.34',
  339. '75.0.3744.1',
  340. '75.0.3744.0',
  341. '74.0.3729.33',
  342. '73.0.3683.92',
  343. '74.0.3729.32',
  344. '74.0.3729.31',
  345. '73.0.3683.91',
  346. '75.0.3741.2',
  347. '75.0.3740.5',
  348. '74.0.3729.30',
  349. '75.0.3741.1',
  350. '75.0.3741.0',
  351. '74.0.3729.29',
  352. '75.0.3740.4',
  353. '73.0.3683.90',
  354. '74.0.3729.28',
  355. '75.0.3740.3',
  356. '73.0.3683.89',
  357. '75.0.3740.2',
  358. '74.0.3729.27',
  359. '75.0.3740.1',
  360. '75.0.3740.0',
  361. '74.0.3729.26',
  362. '73.0.3683.88',
  363. '73.0.3683.87',
  364. '74.0.3729.25',
  365. '75.0.3739.1',
  366. '75.0.3739.0',
  367. '73.0.3683.86',
  368. '74.0.3729.24',
  369. '73.0.3683.85',
  370. '75.0.3738.4',
  371. '75.0.3738.3',
  372. '75.0.3738.2',
  373. '75.0.3738.1',
  374. '75.0.3738.0',
  375. '74.0.3729.23',
  376. '73.0.3683.84',
  377. '74.0.3729.22',
  378. '74.0.3729.21',
  379. '75.0.3737.1',
  380. '75.0.3737.0',
  381. '74.0.3729.20',
  382. '73.0.3683.83',
  383. '74.0.3729.19',
  384. '75.0.3736.1',
  385. '75.0.3736.0',
  386. '74.0.3729.18',
  387. '73.0.3683.82',
  388. '74.0.3729.17',
  389. '75.0.3735.1',
  390. '75.0.3735.0',
  391. '74.0.3729.16',
  392. '73.0.3683.81',
  393. '75.0.3734.1',
  394. '75.0.3734.0',
  395. '74.0.3729.15',
  396. '73.0.3683.80',
  397. '74.0.3729.14',
  398. '75.0.3733.1',
  399. '75.0.3733.0',
  400. '75.0.3732.1',
  401. '74.0.3729.13',
  402. '74.0.3729.12',
  403. '73.0.3683.79',
  404. '74.0.3729.11',
  405. '75.0.3732.0',
  406. '74.0.3729.10',
  407. '73.0.3683.78',
  408. '74.0.3729.9',
  409. '74.0.3729.8',
  410. '74.0.3729.7',
  411. '75.0.3731.3',
  412. '75.0.3731.2',
  413. '75.0.3731.0',
  414. '74.0.3729.6',
  415. '73.0.3683.77',
  416. '73.0.3683.76',
  417. '75.0.3730.5',
  418. '75.0.3730.4',
  419. '73.0.3683.75',
  420. '74.0.3729.5',
  421. '73.0.3683.74',
  422. '75.0.3730.3',
  423. '75.0.3730.2',
  424. '74.0.3729.4',
  425. '73.0.3683.73',
  426. '73.0.3683.72',
  427. '75.0.3730.1',
  428. '75.0.3730.0',
  429. '74.0.3729.3',
  430. '73.0.3683.71',
  431. '74.0.3729.2',
  432. '73.0.3683.70',
  433. '74.0.3729.1',
  434. '74.0.3729.0',
  435. '74.0.3726.4',
  436. '73.0.3683.69',
  437. '74.0.3726.3',
  438. '74.0.3728.0',
  439. '74.0.3726.2',
  440. '73.0.3683.68',
  441. '74.0.3726.1',
  442. '74.0.3726.0',
  443. '74.0.3725.4',
  444. '73.0.3683.67',
  445. '73.0.3683.66',
  446. '74.0.3725.3',
  447. '74.0.3725.2',
  448. '74.0.3725.1',
  449. '74.0.3724.8',
  450. '74.0.3725.0',
  451. '73.0.3683.65',
  452. '74.0.3724.7',
  453. '74.0.3724.6',
  454. '74.0.3724.5',
  455. '74.0.3724.4',
  456. '74.0.3724.3',
  457. '74.0.3724.2',
  458. '74.0.3724.1',
  459. '74.0.3724.0',
  460. '73.0.3683.64',
  461. '74.0.3723.1',
  462. '74.0.3723.0',
  463. '73.0.3683.63',
  464. '74.0.3722.1',
  465. '74.0.3722.0',
  466. '73.0.3683.62',
  467. '74.0.3718.9',
  468. '74.0.3702.3',
  469. '74.0.3721.3',
  470. '74.0.3721.2',
  471. '74.0.3721.1',
  472. '74.0.3721.0',
  473. '74.0.3720.6',
  474. '73.0.3683.61',
  475. '72.0.3626.122',
  476. '73.0.3683.60',
  477. '74.0.3720.5',
  478. '72.0.3626.121',
  479. '74.0.3718.8',
  480. '74.0.3720.4',
  481. '74.0.3720.3',
  482. '74.0.3718.7',
  483. '74.0.3720.2',
  484. '74.0.3720.1',
  485. '74.0.3720.0',
  486. '74.0.3718.6',
  487. '74.0.3719.5',
  488. '73.0.3683.59',
  489. '74.0.3718.5',
  490. '74.0.3718.4',
  491. '74.0.3719.4',
  492. '74.0.3719.3',
  493. '74.0.3719.2',
  494. '74.0.3719.1',
  495. '73.0.3683.58',
  496. '74.0.3719.0',
  497. '73.0.3683.57',
  498. '73.0.3683.56',
  499. '74.0.3718.3',
  500. '73.0.3683.55',
  501. '74.0.3718.2',
  502. '74.0.3718.1',
  503. '74.0.3718.0',
  504. '73.0.3683.54',
  505. '74.0.3717.2',
  506. '73.0.3683.53',
  507. '74.0.3717.1',
  508. '74.0.3717.0',
  509. '73.0.3683.52',
  510. '74.0.3716.1',
  511. '74.0.3716.0',
  512. '73.0.3683.51',
  513. '74.0.3715.1',
  514. '74.0.3715.0',
  515. '73.0.3683.50',
  516. '74.0.3711.2',
  517. '74.0.3714.2',
  518. '74.0.3713.3',
  519. '74.0.3714.1',
  520. '74.0.3714.0',
  521. '73.0.3683.49',
  522. '74.0.3713.1',
  523. '74.0.3713.0',
  524. '72.0.3626.120',
  525. '73.0.3683.48',
  526. '74.0.3712.2',
  527. '74.0.3712.1',
  528. '74.0.3712.0',
  529. '73.0.3683.47',
  530. '72.0.3626.119',
  531. '73.0.3683.46',
  532. '74.0.3710.2',
  533. '72.0.3626.118',
  534. '74.0.3711.1',
  535. '74.0.3711.0',
  536. '73.0.3683.45',
  537. '72.0.3626.117',
  538. '74.0.3710.1',
  539. '74.0.3710.0',
  540. '73.0.3683.44',
  541. '72.0.3626.116',
  542. '74.0.3709.1',
  543. '74.0.3709.0',
  544. '74.0.3704.9',
  545. '73.0.3683.43',
  546. '72.0.3626.115',
  547. '74.0.3704.8',
  548. '74.0.3704.7',
  549. '74.0.3708.0',
  550. '74.0.3706.7',
  551. '74.0.3704.6',
  552. '73.0.3683.42',
  553. '72.0.3626.114',
  554. '74.0.3706.6',
  555. '72.0.3626.113',
  556. '74.0.3704.5',
  557. '74.0.3706.5',
  558. '74.0.3706.4',
  559. '74.0.3706.3',
  560. '74.0.3706.2',
  561. '74.0.3706.1',
  562. '74.0.3706.0',
  563. '73.0.3683.41',
  564. '72.0.3626.112',
  565. '74.0.3705.1',
  566. '74.0.3705.0',
  567. '73.0.3683.40',
  568. '72.0.3626.111',
  569. '73.0.3683.39',
  570. '74.0.3704.4',
  571. '73.0.3683.38',
  572. '74.0.3704.3',
  573. '74.0.3704.2',
  574. '74.0.3704.1',
  575. '74.0.3704.0',
  576. '73.0.3683.37',
  577. '72.0.3626.110',
  578. '72.0.3626.109',
  579. '74.0.3703.3',
  580. '74.0.3703.2',
  581. '73.0.3683.36',
  582. '74.0.3703.1',
  583. '74.0.3703.0',
  584. '73.0.3683.35',
  585. '72.0.3626.108',
  586. '74.0.3702.2',
  587. '74.0.3699.3',
  588. '74.0.3702.1',
  589. '74.0.3702.0',
  590. '73.0.3683.34',
  591. '72.0.3626.107',
  592. '73.0.3683.33',
  593. '74.0.3701.1',
  594. '74.0.3701.0',
  595. '73.0.3683.32',
  596. '73.0.3683.31',
  597. '72.0.3626.105',
  598. '74.0.3700.1',
  599. '74.0.3700.0',
  600. '73.0.3683.29',
  601. '72.0.3626.103',
  602. '74.0.3699.2',
  603. '74.0.3699.1',
  604. '74.0.3699.0',
  605. '73.0.3683.28',
  606. '72.0.3626.102',
  607. '73.0.3683.27',
  608. '73.0.3683.26',
  609. '74.0.3698.0',
  610. '74.0.3696.2',
  611. '72.0.3626.101',
  612. '73.0.3683.25',
  613. '74.0.3696.1',
  614. '74.0.3696.0',
  615. '74.0.3694.8',
  616. '72.0.3626.100',
  617. '74.0.3694.7',
  618. '74.0.3694.6',
  619. '74.0.3694.5',
  620. '74.0.3694.4',
  621. '72.0.3626.99',
  622. '72.0.3626.98',
  623. '74.0.3694.3',
  624. '73.0.3683.24',
  625. '72.0.3626.97',
  626. '72.0.3626.96',
  627. '72.0.3626.95',
  628. '73.0.3683.23',
  629. '72.0.3626.94',
  630. '73.0.3683.22',
  631. '73.0.3683.21',
  632. '72.0.3626.93',
  633. '74.0.3694.2',
  634. '72.0.3626.92',
  635. '74.0.3694.1',
  636. '74.0.3694.0',
  637. '74.0.3693.6',
  638. '73.0.3683.20',
  639. '72.0.3626.91',
  640. '74.0.3693.5',
  641. '74.0.3693.4',
  642. '74.0.3693.3',
  643. '74.0.3693.2',
  644. '73.0.3683.19',
  645. '74.0.3693.1',
  646. '74.0.3693.0',
  647. '73.0.3683.18',
  648. '72.0.3626.90',
  649. '74.0.3692.1',
  650. '74.0.3692.0',
  651. '73.0.3683.17',
  652. '72.0.3626.89',
  653. '74.0.3687.3',
  654. '74.0.3691.1',
  655. '74.0.3691.0',
  656. '73.0.3683.16',
  657. '72.0.3626.88',
  658. '72.0.3626.87',
  659. '73.0.3683.15',
  660. '74.0.3690.1',
  661. '74.0.3690.0',
  662. '73.0.3683.14',
  663. '72.0.3626.86',
  664. '73.0.3683.13',
  665. '73.0.3683.12',
  666. '74.0.3689.1',
  667. '74.0.3689.0',
  668. '73.0.3683.11',
  669. '72.0.3626.85',
  670. '73.0.3683.10',
  671. '72.0.3626.84',
  672. '73.0.3683.9',
  673. '74.0.3688.1',
  674. '74.0.3688.0',
  675. '73.0.3683.8',
  676. '72.0.3626.83',
  677. '74.0.3687.2',
  678. '74.0.3687.1',
  679. '74.0.3687.0',
  680. '73.0.3683.7',
  681. '72.0.3626.82',
  682. '74.0.3686.4',
  683. '72.0.3626.81',
  684. '74.0.3686.3',
  685. '74.0.3686.2',
  686. '74.0.3686.1',
  687. '74.0.3686.0',
  688. '73.0.3683.6',
  689. '72.0.3626.80',
  690. '74.0.3685.1',
  691. '74.0.3685.0',
  692. '73.0.3683.5',
  693. '72.0.3626.79',
  694. '74.0.3684.1',
  695. '74.0.3684.0',
  696. '73.0.3683.4',
  697. '72.0.3626.78',
  698. '72.0.3626.77',
  699. '73.0.3683.3',
  700. '73.0.3683.2',
  701. '72.0.3626.76',
  702. '73.0.3683.1',
  703. '73.0.3683.0',
  704. '72.0.3626.75',
  705. '71.0.3578.141',
  706. '73.0.3682.1',
  707. '73.0.3682.0',
  708. '72.0.3626.74',
  709. '71.0.3578.140',
  710. '73.0.3681.4',
  711. '73.0.3681.3',
  712. '73.0.3681.2',
  713. '73.0.3681.1',
  714. '73.0.3681.0',
  715. '72.0.3626.73',
  716. '71.0.3578.139',
  717. '72.0.3626.72',
  718. '72.0.3626.71',
  719. '73.0.3680.1',
  720. '73.0.3680.0',
  721. '72.0.3626.70',
  722. '71.0.3578.138',
  723. '73.0.3678.2',
  724. '73.0.3679.1',
  725. '73.0.3679.0',
  726. '72.0.3626.69',
  727. '71.0.3578.137',
  728. '73.0.3678.1',
  729. '73.0.3678.0',
  730. '71.0.3578.136',
  731. '73.0.3677.1',
  732. '73.0.3677.0',
  733. '72.0.3626.68',
  734. '72.0.3626.67',
  735. '71.0.3578.135',
  736. '73.0.3676.1',
  737. '73.0.3676.0',
  738. '73.0.3674.2',
  739. '72.0.3626.66',
  740. '71.0.3578.134',
  741. '73.0.3674.1',
  742. '73.0.3674.0',
  743. '72.0.3626.65',
  744. '71.0.3578.133',
  745. '73.0.3673.2',
  746. '73.0.3673.1',
  747. '73.0.3673.0',
  748. '72.0.3626.64',
  749. '71.0.3578.132',
  750. '72.0.3626.63',
  751. '72.0.3626.62',
  752. '72.0.3626.61',
  753. '72.0.3626.60',
  754. '73.0.3672.1',
  755. '73.0.3672.0',
  756. '72.0.3626.59',
  757. '71.0.3578.131',
  758. '73.0.3671.3',
  759. '73.0.3671.2',
  760. '73.0.3671.1',
  761. '73.0.3671.0',
  762. '72.0.3626.58',
  763. '71.0.3578.130',
  764. '73.0.3670.1',
  765. '73.0.3670.0',
  766. '72.0.3626.57',
  767. '71.0.3578.129',
  768. '73.0.3669.1',
  769. '73.0.3669.0',
  770. '72.0.3626.56',
  771. '71.0.3578.128',
  772. '73.0.3668.2',
  773. '73.0.3668.1',
  774. '73.0.3668.0',
  775. '72.0.3626.55',
  776. '71.0.3578.127',
  777. '73.0.3667.2',
  778. '73.0.3667.1',
  779. '73.0.3667.0',
  780. '72.0.3626.54',
  781. '71.0.3578.126',
  782. '73.0.3666.1',
  783. '73.0.3666.0',
  784. '72.0.3626.53',
  785. '71.0.3578.125',
  786. '73.0.3665.4',
  787. '73.0.3665.3',
  788. '72.0.3626.52',
  789. '73.0.3665.2',
  790. '73.0.3664.4',
  791. '73.0.3665.1',
  792. '73.0.3665.0',
  793. '72.0.3626.51',
  794. '71.0.3578.124',
  795. '72.0.3626.50',
  796. '73.0.3664.3',
  797. '73.0.3664.2',
  798. '73.0.3664.1',
  799. '73.0.3664.0',
  800. '73.0.3663.2',
  801. '72.0.3626.49',
  802. '71.0.3578.123',
  803. '73.0.3663.1',
  804. '73.0.3663.0',
  805. '72.0.3626.48',
  806. '71.0.3578.122',
  807. '73.0.3662.1',
  808. '73.0.3662.0',
  809. '72.0.3626.47',
  810. '71.0.3578.121',
  811. '73.0.3661.1',
  812. '72.0.3626.46',
  813. '73.0.3661.0',
  814. '72.0.3626.45',
  815. '71.0.3578.120',
  816. '73.0.3660.2',
  817. '73.0.3660.1',
  818. '73.0.3660.0',
  819. '72.0.3626.44',
  820. '71.0.3578.119',
  821. '73.0.3659.1',
  822. '73.0.3659.0',
  823. '72.0.3626.43',
  824. '71.0.3578.118',
  825. '73.0.3658.1',
  826. '73.0.3658.0',
  827. '72.0.3626.42',
  828. '71.0.3578.117',
  829. '73.0.3657.1',
  830. '73.0.3657.0',
  831. '72.0.3626.41',
  832. '71.0.3578.116',
  833. '73.0.3656.1',
  834. '73.0.3656.0',
  835. '72.0.3626.40',
  836. '71.0.3578.115',
  837. '73.0.3655.1',
  838. '73.0.3655.0',
  839. '72.0.3626.39',
  840. '71.0.3578.114',
  841. '73.0.3654.1',
  842. '73.0.3654.0',
  843. '72.0.3626.38',
  844. '71.0.3578.113',
  845. '73.0.3653.1',
  846. '73.0.3653.0',
  847. '72.0.3626.37',
  848. '71.0.3578.112',
  849. '73.0.3652.1',
  850. '73.0.3652.0',
  851. '72.0.3626.36',
  852. '71.0.3578.111',
  853. '73.0.3651.1',
  854. '73.0.3651.0',
  855. '72.0.3626.35',
  856. '71.0.3578.110',
  857. '73.0.3650.1',
  858. '73.0.3650.0',
  859. '72.0.3626.34',
  860. '71.0.3578.109',
  861. '73.0.3649.1',
  862. '73.0.3649.0',
  863. '72.0.3626.33',
  864. '71.0.3578.108',
  865. '73.0.3648.2',
  866. '73.0.3648.1',
  867. '73.0.3648.0',
  868. '72.0.3626.32',
  869. '71.0.3578.107',
  870. '73.0.3647.2',
  871. '73.0.3647.1',
  872. '73.0.3647.0',
  873. '72.0.3626.31',
  874. '71.0.3578.106',
  875. '73.0.3635.3',
  876. '73.0.3646.2',
  877. '73.0.3646.1',
  878. '73.0.3646.0',
  879. '72.0.3626.30',
  880. '71.0.3578.105',
  881. '72.0.3626.29',
  882. '73.0.3645.2',
  883. '73.0.3645.1',
  884. '73.0.3645.0',
  885. '72.0.3626.28',
  886. '71.0.3578.104',
  887. '72.0.3626.27',
  888. '72.0.3626.26',
  889. '72.0.3626.25',
  890. '72.0.3626.24',
  891. '73.0.3644.0',
  892. '73.0.3643.2',
  893. '72.0.3626.23',
  894. '71.0.3578.103',
  895. '73.0.3643.1',
  896. '73.0.3643.0',
  897. '72.0.3626.22',
  898. '71.0.3578.102',
  899. '73.0.3642.1',
  900. '73.0.3642.0',
  901. '72.0.3626.21',
  902. '71.0.3578.101',
  903. '73.0.3641.1',
  904. '73.0.3641.0',
  905. '72.0.3626.20',
  906. '71.0.3578.100',
  907. '72.0.3626.19',
  908. '73.0.3640.1',
  909. '73.0.3640.0',
  910. '72.0.3626.18',
  911. '73.0.3639.1',
  912. '71.0.3578.99',
  913. '73.0.3639.0',
  914. '72.0.3626.17',
  915. '73.0.3638.2',
  916. '72.0.3626.16',
  917. '73.0.3638.1',
  918. '73.0.3638.0',
  919. '72.0.3626.15',
  920. '71.0.3578.98',
  921. '73.0.3635.2',
  922. '71.0.3578.97',
  923. '73.0.3637.1',
  924. '73.0.3637.0',
  925. '72.0.3626.14',
  926. '71.0.3578.96',
  927. '71.0.3578.95',
  928. '72.0.3626.13',
  929. '71.0.3578.94',
  930. '73.0.3636.2',
  931. '71.0.3578.93',
  932. '73.0.3636.1',
  933. '73.0.3636.0',
  934. '72.0.3626.12',
  935. '71.0.3578.92',
  936. '73.0.3635.1',
  937. '73.0.3635.0',
  938. '72.0.3626.11',
  939. '71.0.3578.91',
  940. '73.0.3634.2',
  941. '73.0.3634.1',
  942. '73.0.3634.0',
  943. '72.0.3626.10',
  944. '71.0.3578.90',
  945. '71.0.3578.89',
  946. '73.0.3633.2',
  947. '73.0.3633.1',
  948. '73.0.3633.0',
  949. '72.0.3610.4',
  950. '72.0.3626.9',
  951. '71.0.3578.88',
  952. '73.0.3632.5',
  953. '73.0.3632.4',
  954. '73.0.3632.3',
  955. '73.0.3632.2',
  956. '73.0.3632.1',
  957. '73.0.3632.0',
  958. '72.0.3626.8',
  959. '71.0.3578.87',
  960. '73.0.3631.2',
  961. '73.0.3631.1',
  962. '73.0.3631.0',
  963. '72.0.3626.7',
  964. '71.0.3578.86',
  965. '72.0.3626.6',
  966. '73.0.3630.1',
  967. '73.0.3630.0',
  968. '72.0.3626.5',
  969. '71.0.3578.85',
  970. '72.0.3626.4',
  971. '73.0.3628.3',
  972. '73.0.3628.2',
  973. '73.0.3629.1',
  974. '73.0.3629.0',
  975. '72.0.3626.3',
  976. '71.0.3578.84',
  977. '73.0.3628.1',
  978. '73.0.3628.0',
  979. '71.0.3578.83',
  980. '73.0.3627.1',
  981. '73.0.3627.0',
  982. '72.0.3626.2',
  983. '71.0.3578.82',
  984. '71.0.3578.81',
  985. '71.0.3578.80',
  986. '72.0.3626.1',
  987. '72.0.3626.0',
  988. '71.0.3578.79',
  989. '70.0.3538.124',
  990. '71.0.3578.78',
  991. '72.0.3623.4',
  992. '72.0.3625.2',
  993. '72.0.3625.1',
  994. '72.0.3625.0',
  995. '71.0.3578.77',
  996. '70.0.3538.123',
  997. '72.0.3624.4',
  998. '72.0.3624.3',
  999. '72.0.3624.2',
  1000. '71.0.3578.76',
  1001. '72.0.3624.1',
  1002. '72.0.3624.0',
  1003. '72.0.3623.3',
  1004. '71.0.3578.75',
  1005. '70.0.3538.122',
  1006. '71.0.3578.74',
  1007. '72.0.3623.2',
  1008. '72.0.3610.3',
  1009. '72.0.3623.1',
  1010. '72.0.3623.0',
  1011. '72.0.3622.3',
  1012. '72.0.3622.2',
  1013. '71.0.3578.73',
  1014. '70.0.3538.121',
  1015. '72.0.3622.1',
  1016. '72.0.3622.0',
  1017. '71.0.3578.72',
  1018. '70.0.3538.120',
  1019. '72.0.3621.1',
  1020. '72.0.3621.0',
  1021. '71.0.3578.71',
  1022. '70.0.3538.119',
  1023. '72.0.3620.1',
  1024. '72.0.3620.0',
  1025. '71.0.3578.70',
  1026. '70.0.3538.118',
  1027. '71.0.3578.69',
  1028. '72.0.3619.1',
  1029. '72.0.3619.0',
  1030. '71.0.3578.68',
  1031. '70.0.3538.117',
  1032. '71.0.3578.67',
  1033. '72.0.3618.1',
  1034. '72.0.3618.0',
  1035. '71.0.3578.66',
  1036. '70.0.3538.116',
  1037. '72.0.3617.1',
  1038. '72.0.3617.0',
  1039. '71.0.3578.65',
  1040. '70.0.3538.115',
  1041. '72.0.3602.3',
  1042. '71.0.3578.64',
  1043. '72.0.3616.1',
  1044. '72.0.3616.0',
  1045. '71.0.3578.63',
  1046. '70.0.3538.114',
  1047. '71.0.3578.62',
  1048. '72.0.3615.1',
  1049. '72.0.3615.0',
  1050. '71.0.3578.61',
  1051. '70.0.3538.113',
  1052. '72.0.3614.1',
  1053. '72.0.3614.0',
  1054. '71.0.3578.60',
  1055. '70.0.3538.112',
  1056. '72.0.3613.1',
  1057. '72.0.3613.0',
  1058. '71.0.3578.59',
  1059. '70.0.3538.111',
  1060. '72.0.3612.2',
  1061. '72.0.3612.1',
  1062. '72.0.3612.0',
  1063. '70.0.3538.110',
  1064. '71.0.3578.58',
  1065. '70.0.3538.109',
  1066. '72.0.3611.2',
  1067. '72.0.3611.1',
  1068. '72.0.3611.0',
  1069. '71.0.3578.57',
  1070. '70.0.3538.108',
  1071. '72.0.3610.2',
  1072. '71.0.3578.56',
  1073. '71.0.3578.55',
  1074. '72.0.3610.1',
  1075. '72.0.3610.0',
  1076. '71.0.3578.54',
  1077. '70.0.3538.107',
  1078. '71.0.3578.53',
  1079. '72.0.3609.3',
  1080. '71.0.3578.52',
  1081. '72.0.3609.2',
  1082. '71.0.3578.51',
  1083. '72.0.3608.5',
  1084. '72.0.3609.1',
  1085. '72.0.3609.0',
  1086. '71.0.3578.50',
  1087. '70.0.3538.106',
  1088. '72.0.3608.4',
  1089. '72.0.3608.3',
  1090. '72.0.3608.2',
  1091. '71.0.3578.49',
  1092. '72.0.3608.1',
  1093. '72.0.3608.0',
  1094. '70.0.3538.105',
  1095. '71.0.3578.48',
  1096. '72.0.3607.1',
  1097. '72.0.3607.0',
  1098. '71.0.3578.47',
  1099. '70.0.3538.104',
  1100. '72.0.3606.2',
  1101. '72.0.3606.1',
  1102. '72.0.3606.0',
  1103. '71.0.3578.46',
  1104. '70.0.3538.103',
  1105. '70.0.3538.102',
  1106. '72.0.3605.3',
  1107. '72.0.3605.2',
  1108. '72.0.3605.1',
  1109. '72.0.3605.0',
  1110. '71.0.3578.45',
  1111. '70.0.3538.101',
  1112. '71.0.3578.44',
  1113. '71.0.3578.43',
  1114. '70.0.3538.100',
  1115. '70.0.3538.99',
  1116. '71.0.3578.42',
  1117. '72.0.3604.1',
  1118. '72.0.3604.0',
  1119. '71.0.3578.41',
  1120. '70.0.3538.98',
  1121. '71.0.3578.40',
  1122. '72.0.3603.2',
  1123. '72.0.3603.1',
  1124. '72.0.3603.0',
  1125. '71.0.3578.39',
  1126. '70.0.3538.97',
  1127. '72.0.3602.2',
  1128. '71.0.3578.38',
  1129. '71.0.3578.37',
  1130. '72.0.3602.1',
  1131. '72.0.3602.0',
  1132. '71.0.3578.36',
  1133. '70.0.3538.96',
  1134. '72.0.3601.1',
  1135. '72.0.3601.0',
  1136. '71.0.3578.35',
  1137. '70.0.3538.95',
  1138. '72.0.3600.1',
  1139. '72.0.3600.0',
  1140. '71.0.3578.34',
  1141. '70.0.3538.94',
  1142. '72.0.3599.3',
  1143. '72.0.3599.2',
  1144. '72.0.3599.1',
  1145. '72.0.3599.0',
  1146. '71.0.3578.33',
  1147. '70.0.3538.93',
  1148. '72.0.3598.1',
  1149. '72.0.3598.0',
  1150. '71.0.3578.32',
  1151. '70.0.3538.87',
  1152. '72.0.3597.1',
  1153. '72.0.3597.0',
  1154. '72.0.3596.2',
  1155. '71.0.3578.31',
  1156. '70.0.3538.86',
  1157. '71.0.3578.30',
  1158. '71.0.3578.29',
  1159. '72.0.3596.1',
  1160. '72.0.3596.0',
  1161. '71.0.3578.28',
  1162. '70.0.3538.85',
  1163. '72.0.3595.2',
  1164. '72.0.3591.3',
  1165. '72.0.3595.1',
  1166. '72.0.3595.0',
  1167. '71.0.3578.27',
  1168. '70.0.3538.84',
  1169. '72.0.3594.1',
  1170. '72.0.3594.0',
  1171. '71.0.3578.26',
  1172. '70.0.3538.83',
  1173. '72.0.3593.2',
  1174. '72.0.3593.1',
  1175. '72.0.3593.0',
  1176. '71.0.3578.25',
  1177. '70.0.3538.82',
  1178. '72.0.3589.3',
  1179. '72.0.3592.2',
  1180. '72.0.3592.1',
  1181. '72.0.3592.0',
  1182. '71.0.3578.24',
  1183. '72.0.3589.2',
  1184. '70.0.3538.81',
  1185. '70.0.3538.80',
  1186. '72.0.3591.2',
  1187. '72.0.3591.1',
  1188. '72.0.3591.0',
  1189. '71.0.3578.23',
  1190. '70.0.3538.79',
  1191. '71.0.3578.22',
  1192. '72.0.3590.1',
  1193. '72.0.3590.0',
  1194. '71.0.3578.21',
  1195. '70.0.3538.78',
  1196. '70.0.3538.77',
  1197. '72.0.3589.1',
  1198. '72.0.3589.0',
  1199. '71.0.3578.20',
  1200. '70.0.3538.76',
  1201. '71.0.3578.19',
  1202. '70.0.3538.75',
  1203. '72.0.3588.1',
  1204. '72.0.3588.0',
  1205. '71.0.3578.18',
  1206. '70.0.3538.74',
  1207. '72.0.3586.2',
  1208. '72.0.3587.0',
  1209. '71.0.3578.17',
  1210. '70.0.3538.73',
  1211. '72.0.3586.1',
  1212. '72.0.3586.0',
  1213. '71.0.3578.16',
  1214. '70.0.3538.72',
  1215. '72.0.3585.1',
  1216. '72.0.3585.0',
  1217. '71.0.3578.15',
  1218. '70.0.3538.71',
  1219. '71.0.3578.14',
  1220. '72.0.3584.1',
  1221. '72.0.3584.0',
  1222. '71.0.3578.13',
  1223. '70.0.3538.70',
  1224. '72.0.3583.2',
  1225. '71.0.3578.12',
  1226. '72.0.3583.1',
  1227. '72.0.3583.0',
  1228. '71.0.3578.11',
  1229. '70.0.3538.69',
  1230. '71.0.3578.10',
  1231. '72.0.3582.0',
  1232. '72.0.3581.4',
  1233. '71.0.3578.9',
  1234. '70.0.3538.67',
  1235. '72.0.3581.3',
  1236. '72.0.3581.2',
  1237. '72.0.3581.1',
  1238. '72.0.3581.0',
  1239. '71.0.3578.8',
  1240. '70.0.3538.66',
  1241. '72.0.3580.1',
  1242. '72.0.3580.0',
  1243. '71.0.3578.7',
  1244. '70.0.3538.65',
  1245. '71.0.3578.6',
  1246. '72.0.3579.1',
  1247. '72.0.3579.0',
  1248. '71.0.3578.5',
  1249. '70.0.3538.64',
  1250. '71.0.3578.4',
  1251. '71.0.3578.3',
  1252. '71.0.3578.2',
  1253. '71.0.3578.1',
  1254. '71.0.3578.0',
  1255. '70.0.3538.63',
  1256. '69.0.3497.128',
  1257. '70.0.3538.62',
  1258. '70.0.3538.61',
  1259. '70.0.3538.60',
  1260. '70.0.3538.59',
  1261. '71.0.3577.1',
  1262. '71.0.3577.0',
  1263. '70.0.3538.58',
  1264. '69.0.3497.127',
  1265. '71.0.3576.2',
  1266. '71.0.3576.1',
  1267. '71.0.3576.0',
  1268. '70.0.3538.57',
  1269. '70.0.3538.56',
  1270. '71.0.3575.2',
  1271. '70.0.3538.55',
  1272. '69.0.3497.126',
  1273. '70.0.3538.54',
  1274. '71.0.3575.1',
  1275. '71.0.3575.0',
  1276. '71.0.3574.1',
  1277. '71.0.3574.0',
  1278. '70.0.3538.53',
  1279. '69.0.3497.125',
  1280. '70.0.3538.52',
  1281. '71.0.3573.1',
  1282. '71.0.3573.0',
  1283. '70.0.3538.51',
  1284. '69.0.3497.124',
  1285. '71.0.3572.1',
  1286. '71.0.3572.0',
  1287. '70.0.3538.50',
  1288. '69.0.3497.123',
  1289. '71.0.3571.2',
  1290. '70.0.3538.49',
  1291. '69.0.3497.122',
  1292. '71.0.3571.1',
  1293. '71.0.3571.0',
  1294. '70.0.3538.48',
  1295. '69.0.3497.121',
  1296. '71.0.3570.1',
  1297. '71.0.3570.0',
  1298. '70.0.3538.47',
  1299. '69.0.3497.120',
  1300. '71.0.3568.2',
  1301. '71.0.3569.1',
  1302. '71.0.3569.0',
  1303. '70.0.3538.46',
  1304. '69.0.3497.119',
  1305. '70.0.3538.45',
  1306. '71.0.3568.1',
  1307. '71.0.3568.0',
  1308. '70.0.3538.44',
  1309. '69.0.3497.118',
  1310. '70.0.3538.43',
  1311. '70.0.3538.42',
  1312. '71.0.3567.1',
  1313. '71.0.3567.0',
  1314. '70.0.3538.41',
  1315. '69.0.3497.117',
  1316. '71.0.3566.1',
  1317. '71.0.3566.0',
  1318. '70.0.3538.40',
  1319. '69.0.3497.116',
  1320. '71.0.3565.1',
  1321. '71.0.3565.0',
  1322. '70.0.3538.39',
  1323. '69.0.3497.115',
  1324. '71.0.3564.1',
  1325. '71.0.3564.0',
  1326. '70.0.3538.38',
  1327. '69.0.3497.114',
  1328. '71.0.3563.0',
  1329. '71.0.3562.2',
  1330. '70.0.3538.37',
  1331. '69.0.3497.113',
  1332. '70.0.3538.36',
  1333. '70.0.3538.35',
  1334. '71.0.3562.1',
  1335. '71.0.3562.0',
  1336. '70.0.3538.34',
  1337. '69.0.3497.112',
  1338. '70.0.3538.33',
  1339. '71.0.3561.1',
  1340. '71.0.3561.0',
  1341. '70.0.3538.32',
  1342. '69.0.3497.111',
  1343. '71.0.3559.6',
  1344. '71.0.3560.1',
  1345. '71.0.3560.0',
  1346. '71.0.3559.5',
  1347. '71.0.3559.4',
  1348. '70.0.3538.31',
  1349. '69.0.3497.110',
  1350. '71.0.3559.3',
  1351. '70.0.3538.30',
  1352. '69.0.3497.109',
  1353. '71.0.3559.2',
  1354. '71.0.3559.1',
  1355. '71.0.3559.0',
  1356. '70.0.3538.29',
  1357. '69.0.3497.108',
  1358. '71.0.3558.2',
  1359. '71.0.3558.1',
  1360. '71.0.3558.0',
  1361. '70.0.3538.28',
  1362. '69.0.3497.107',
  1363. '71.0.3557.2',
  1364. '71.0.3557.1',
  1365. '71.0.3557.0',
  1366. '70.0.3538.27',
  1367. '69.0.3497.106',
  1368. '71.0.3554.4',
  1369. '70.0.3538.26',
  1370. '71.0.3556.1',
  1371. '71.0.3556.0',
  1372. '70.0.3538.25',
  1373. '71.0.3554.3',
  1374. '69.0.3497.105',
  1375. '71.0.3554.2',
  1376. '70.0.3538.24',
  1377. '69.0.3497.104',
  1378. '71.0.3555.2',
  1379. '70.0.3538.23',
  1380. '71.0.3555.1',
  1381. '71.0.3555.0',
  1382. '70.0.3538.22',
  1383. '69.0.3497.103',
  1384. '71.0.3554.1',
  1385. '71.0.3554.0',
  1386. '70.0.3538.21',
  1387. '69.0.3497.102',
  1388. '71.0.3553.3',
  1389. '70.0.3538.20',
  1390. '69.0.3497.101',
  1391. '71.0.3553.2',
  1392. '69.0.3497.100',
  1393. '71.0.3553.1',
  1394. '71.0.3553.0',
  1395. '70.0.3538.19',
  1396. '69.0.3497.99',
  1397. '69.0.3497.98',
  1398. '69.0.3497.97',
  1399. '71.0.3552.6',
  1400. '71.0.3552.5',
  1401. '71.0.3552.4',
  1402. '71.0.3552.3',
  1403. '71.0.3552.2',
  1404. '71.0.3552.1',
  1405. '71.0.3552.0',
  1406. '70.0.3538.18',
  1407. '69.0.3497.96',
  1408. '71.0.3551.3',
  1409. '71.0.3551.2',
  1410. '71.0.3551.1',
  1411. '71.0.3551.0',
  1412. '70.0.3538.17',
  1413. '69.0.3497.95',
  1414. '71.0.3550.3',
  1415. '71.0.3550.2',
  1416. '71.0.3550.1',
  1417. '71.0.3550.0',
  1418. '70.0.3538.16',
  1419. '69.0.3497.94',
  1420. '71.0.3549.1',
  1421. '71.0.3549.0',
  1422. '70.0.3538.15',
  1423. '69.0.3497.93',
  1424. '69.0.3497.92',
  1425. '71.0.3548.1',
  1426. '71.0.3548.0',
  1427. '70.0.3538.14',
  1428. '69.0.3497.91',
  1429. '71.0.3547.1',
  1430. '71.0.3547.0',
  1431. '70.0.3538.13',
  1432. '69.0.3497.90',
  1433. '71.0.3546.2',
  1434. '69.0.3497.89',
  1435. '71.0.3546.1',
  1436. '71.0.3546.0',
  1437. '70.0.3538.12',
  1438. '69.0.3497.88',
  1439. '71.0.3545.4',
  1440. '71.0.3545.3',
  1441. '71.0.3545.2',
  1442. '71.0.3545.1',
  1443. '71.0.3545.0',
  1444. '70.0.3538.11',
  1445. '69.0.3497.87',
  1446. '71.0.3544.5',
  1447. '71.0.3544.4',
  1448. '71.0.3544.3',
  1449. '71.0.3544.2',
  1450. '71.0.3544.1',
  1451. '71.0.3544.0',
  1452. '69.0.3497.86',
  1453. '70.0.3538.10',
  1454. '69.0.3497.85',
  1455. '70.0.3538.9',
  1456. '69.0.3497.84',
  1457. '71.0.3543.4',
  1458. '70.0.3538.8',
  1459. '71.0.3543.3',
  1460. '71.0.3543.2',
  1461. '71.0.3543.1',
  1462. '71.0.3543.0',
  1463. '70.0.3538.7',
  1464. '69.0.3497.83',
  1465. '71.0.3542.2',
  1466. '71.0.3542.1',
  1467. '71.0.3542.0',
  1468. '70.0.3538.6',
  1469. '69.0.3497.82',
  1470. '69.0.3497.81',
  1471. '71.0.3541.1',
  1472. '71.0.3541.0',
  1473. '70.0.3538.5',
  1474. '69.0.3497.80',
  1475. '71.0.3540.1',
  1476. '71.0.3540.0',
  1477. '70.0.3538.4',
  1478. '69.0.3497.79',
  1479. '70.0.3538.3',
  1480. '71.0.3539.1',
  1481. '71.0.3539.0',
  1482. '69.0.3497.78',
  1483. '68.0.3440.134',
  1484. '69.0.3497.77',
  1485. '70.0.3538.2',
  1486. '70.0.3538.1',
  1487. '70.0.3538.0',
  1488. '69.0.3497.76',
  1489. '68.0.3440.133',
  1490. '69.0.3497.75',
  1491. '70.0.3537.2',
  1492. '70.0.3537.1',
  1493. '70.0.3537.0',
  1494. '69.0.3497.74',
  1495. '68.0.3440.132',
  1496. '70.0.3536.0',
  1497. '70.0.3535.5',
  1498. '70.0.3535.4',
  1499. '70.0.3535.3',
  1500. '69.0.3497.73',
  1501. '68.0.3440.131',
  1502. '70.0.3532.8',
  1503. '70.0.3532.7',
  1504. '69.0.3497.72',
  1505. '69.0.3497.71',
  1506. '70.0.3535.2',
  1507. '70.0.3535.1',
  1508. '70.0.3535.0',
  1509. '69.0.3497.70',
  1510. '68.0.3440.130',
  1511. '69.0.3497.69',
  1512. '68.0.3440.129',
  1513. '70.0.3534.4',
  1514. '70.0.3534.3',
  1515. '70.0.3534.2',
  1516. '70.0.3534.1',
  1517. '70.0.3534.0',
  1518. '69.0.3497.68',
  1519. '68.0.3440.128',
  1520. '70.0.3533.2',
  1521. '70.0.3533.1',
  1522. '70.0.3533.0',
  1523. '69.0.3497.67',
  1524. '68.0.3440.127',
  1525. '70.0.3532.6',
  1526. '70.0.3532.5',
  1527. '70.0.3532.4',
  1528. '69.0.3497.66',
  1529. '68.0.3440.126',
  1530. '70.0.3532.3',
  1531. '70.0.3532.2',
  1532. '70.0.3532.1',
  1533. '69.0.3497.60',
  1534. '69.0.3497.65',
  1535. '69.0.3497.64',
  1536. '70.0.3532.0',
  1537. '70.0.3531.0',
  1538. '70.0.3530.4',
  1539. '70.0.3530.3',
  1540. '70.0.3530.2',
  1541. '69.0.3497.58',
  1542. '68.0.3440.125',
  1543. '69.0.3497.57',
  1544. '69.0.3497.56',
  1545. '69.0.3497.55',
  1546. '69.0.3497.54',
  1547. '70.0.3530.1',
  1548. '70.0.3530.0',
  1549. '69.0.3497.53',
  1550. '68.0.3440.124',
  1551. '69.0.3497.52',
  1552. '70.0.3529.3',
  1553. '70.0.3529.2',
  1554. '70.0.3529.1',
  1555. '70.0.3529.0',
  1556. '69.0.3497.51',
  1557. '70.0.3528.4',
  1558. '68.0.3440.123',
  1559. '70.0.3528.3',
  1560. '70.0.3528.2',
  1561. '70.0.3528.1',
  1562. '70.0.3528.0',
  1563. '69.0.3497.50',
  1564. '68.0.3440.122',
  1565. '70.0.3527.1',
  1566. '70.0.3527.0',
  1567. '69.0.3497.49',
  1568. '68.0.3440.121',
  1569. '70.0.3526.1',
  1570. '70.0.3526.0',
  1571. '68.0.3440.120',
  1572. '69.0.3497.48',
  1573. '69.0.3497.47',
  1574. '68.0.3440.119',
  1575. '68.0.3440.118',
  1576. '70.0.3525.5',
  1577. '70.0.3525.4',
  1578. '70.0.3525.3',
  1579. '68.0.3440.117',
  1580. '69.0.3497.46',
  1581. '70.0.3525.2',
  1582. '70.0.3525.1',
  1583. '70.0.3525.0',
  1584. '69.0.3497.45',
  1585. '68.0.3440.116',
  1586. '70.0.3524.4',
  1587. '70.0.3524.3',
  1588. '69.0.3497.44',
  1589. '70.0.3524.2',
  1590. '70.0.3524.1',
  1591. '70.0.3524.0',
  1592. '70.0.3523.2',
  1593. '69.0.3497.43',
  1594. '68.0.3440.115',
  1595. '70.0.3505.9',
  1596. '69.0.3497.42',
  1597. '70.0.3505.8',
  1598. '70.0.3523.1',
  1599. '70.0.3523.0',
  1600. '69.0.3497.41',
  1601. '68.0.3440.114',
  1602. '70.0.3505.7',
  1603. '69.0.3497.40',
  1604. '70.0.3522.1',
  1605. '70.0.3522.0',
  1606. '70.0.3521.2',
  1607. '69.0.3497.39',
  1608. '68.0.3440.113',
  1609. '70.0.3505.6',
  1610. '70.0.3521.1',
  1611. '70.0.3521.0',
  1612. '69.0.3497.38',
  1613. '68.0.3440.112',
  1614. '70.0.3520.1',
  1615. '70.0.3520.0',
  1616. '69.0.3497.37',
  1617. '68.0.3440.111',
  1618. '70.0.3519.3',
  1619. '70.0.3519.2',
  1620. '70.0.3519.1',
  1621. '70.0.3519.0',
  1622. '69.0.3497.36',
  1623. '68.0.3440.110',
  1624. '70.0.3518.1',
  1625. '70.0.3518.0',
  1626. '69.0.3497.35',
  1627. '69.0.3497.34',
  1628. '68.0.3440.109',
  1629. '70.0.3517.1',
  1630. '70.0.3517.0',
  1631. '69.0.3497.33',
  1632. '68.0.3440.108',
  1633. '69.0.3497.32',
  1634. '70.0.3516.3',
  1635. '70.0.3516.2',
  1636. '70.0.3516.1',
  1637. '70.0.3516.0',
  1638. '69.0.3497.31',
  1639. '68.0.3440.107',
  1640. '70.0.3515.4',
  1641. '68.0.3440.106',
  1642. '70.0.3515.3',
  1643. '70.0.3515.2',
  1644. '70.0.3515.1',
  1645. '70.0.3515.0',
  1646. '69.0.3497.30',
  1647. '68.0.3440.105',
  1648. '68.0.3440.104',
  1649. '70.0.3514.2',
  1650. '70.0.3514.1',
  1651. '70.0.3514.0',
  1652. '69.0.3497.29',
  1653. '68.0.3440.103',
  1654. '70.0.3513.1',
  1655. '70.0.3513.0',
  1656. '69.0.3497.28',
  1657. )
  1658. return _USER_AGENT_TPL % random.choice(_CHROME_VERSIONS)
  1659. std_headers = {
  1660. 'User-Agent': random_user_agent(),
  1661. 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
  1662. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  1663. 'Accept-Encoding': 'gzip, deflate',
  1664. 'Accept-Language': 'en-us,en;q=0.5',
  1665. }
  1666. USER_AGENTS = {
  1667. 'Safari': 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27',
  1668. }
  1669. NO_DEFAULT = object()
  1670. ENGLISH_MONTH_NAMES = [
  1671. 'January', 'February', 'March', 'April', 'May', 'June',
  1672. 'July', 'August', 'September', 'October', 'November', 'December']
  1673. MONTH_NAMES = {
  1674. 'en': ENGLISH_MONTH_NAMES,
  1675. 'fr': [
  1676. 'janvier', 'février', 'mars', 'avril', 'mai', 'juin',
  1677. 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
  1678. }
  1679. KNOWN_EXTENSIONS = (
  1680. 'mp4', 'm4a', 'm4p', 'm4b', 'm4r', 'm4v', 'aac',
  1681. 'flv', 'f4v', 'f4a', 'f4b',
  1682. 'webm', 'ogg', 'ogv', 'oga', 'ogx', 'spx', 'opus',
  1683. 'mkv', 'mka', 'mk3d',
  1684. 'avi', 'divx',
  1685. 'mov',
  1686. 'asf', 'wmv', 'wma',
  1687. '3gp', '3g2',
  1688. 'mp3',
  1689. 'flac',
  1690. 'ape',
  1691. 'wav',
  1692. 'f4f', 'f4m', 'm3u8', 'smil')
  1693. # needed for sanitizing filenames in restricted mode
  1694. ACCENT_CHARS = dict(zip('ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿ',
  1695. itertools.chain('AAAAAA', ['AE'], 'CEEEEIIIIDNOOOOOOO', ['OE'], 'UUUUUY', ['TH', 'ss'],
  1696. 'aaaaaa', ['ae'], 'ceeeeiiiionooooooo', ['oe'], 'uuuuuy', ['th'], 'y')))
  1697. DATE_FORMATS = (
  1698. '%d %B %Y',
  1699. '%d %b %Y',
  1700. '%B %d %Y',
  1701. '%B %dst %Y',
  1702. '%B %dnd %Y',
  1703. '%B %drd %Y',
  1704. '%B %dth %Y',
  1705. '%b %d %Y',
  1706. '%b %dst %Y',
  1707. '%b %dnd %Y',
  1708. '%b %drd %Y',
  1709. '%b %dth %Y',
  1710. '%b %dst %Y %I:%M',
  1711. '%b %dnd %Y %I:%M',
  1712. '%b %drd %Y %I:%M',
  1713. '%b %dth %Y %I:%M',
  1714. '%Y %m %d',
  1715. '%Y-%m-%d',
  1716. '%Y/%m/%d',
  1717. '%Y/%m/%d %H:%M',
  1718. '%Y/%m/%d %H:%M:%S',
  1719. '%Y-%m-%d %H:%M',
  1720. '%Y-%m-%d %H:%M:%S',
  1721. '%Y-%m-%d %H:%M:%S.%f',
  1722. '%d.%m.%Y %H:%M',
  1723. '%d.%m.%Y %H.%M',
  1724. '%Y-%m-%dT%H:%M:%SZ',
  1725. '%Y-%m-%dT%H:%M:%S.%fZ',
  1726. '%Y-%m-%dT%H:%M:%S.%f0Z',
  1727. '%Y-%m-%dT%H:%M:%S',
  1728. '%Y-%m-%dT%H:%M:%S.%f',
  1729. '%Y-%m-%dT%H:%M',
  1730. '%b %d %Y at %H:%M',
  1731. '%b %d %Y at %H:%M:%S',
  1732. '%B %d %Y at %H:%M',
  1733. '%B %d %Y at %H:%M:%S',
  1734. )
  1735. DATE_FORMATS_DAY_FIRST = list(DATE_FORMATS)
  1736. DATE_FORMATS_DAY_FIRST.extend([
  1737. '%d-%m-%Y',
  1738. '%d.%m.%Y',
  1739. '%d.%m.%y',
  1740. '%d/%m/%Y',
  1741. '%d/%m/%y',
  1742. '%d/%m/%Y %H:%M:%S',
  1743. ])
  1744. DATE_FORMATS_MONTH_FIRST = list(DATE_FORMATS)
  1745. DATE_FORMATS_MONTH_FIRST.extend([
  1746. '%m-%d-%Y',
  1747. '%m.%d.%Y',
  1748. '%m/%d/%Y',
  1749. '%m/%d/%y',
  1750. '%m/%d/%Y %H:%M:%S',
  1751. ])
  1752. PACKED_CODES_RE = r"}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)"
  1753. JSON_LD_RE = r'(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>(?P<json_ld>.+?)</script>'
  1754. def preferredencoding():
  1755. """Get preferred encoding.
  1756. Returns the best encoding scheme for the system, based on
  1757. locale.getpreferredencoding() and some further tweaks.
  1758. """
  1759. try:
  1760. pref = locale.getpreferredencoding()
  1761. 'TEST'.encode(pref)
  1762. except Exception:
  1763. pref = 'UTF-8'
  1764. return pref
  1765. def write_json_file(obj, fn):
  1766. """ Encode obj as JSON and write it to fn, atomically if possible """
  1767. fn = encodeFilename(fn)
  1768. if sys.version_info < (3, 0) and sys.platform != 'win32':
  1769. encoding = get_filesystem_encoding()
  1770. # os.path.basename returns a bytes object, but NamedTemporaryFile
  1771. # will fail if the filename contains non ascii characters unless we
  1772. # use a unicode object
  1773. path_basename = lambda f: os.path.basename(fn).decode(encoding)
  1774. # the same for os.path.dirname
  1775. path_dirname = lambda f: os.path.dirname(fn).decode(encoding)
  1776. else:
  1777. path_basename = os.path.basename
  1778. path_dirname = os.path.dirname
  1779. args = {
  1780. 'suffix': '.tmp',
  1781. 'prefix': path_basename(fn) + '.',
  1782. 'dir': path_dirname(fn),
  1783. 'delete': False,
  1784. }
  1785. # In Python 2.x, json.dump expects a bytestream.
  1786. # In Python 3.x, it writes to a character stream
  1787. if sys.version_info < (3, 0):
  1788. args['mode'] = 'wb'
  1789. else:
  1790. args.update({
  1791. 'mode': 'w',
  1792. 'encoding': 'utf-8',
  1793. })
  1794. tf = tempfile.NamedTemporaryFile(**compat_kwargs(args))
  1795. try:
  1796. with tf:
  1797. json.dump(obj, tf)
  1798. if sys.platform == 'win32':
  1799. # Need to remove existing file on Windows, else os.rename raises
  1800. # WindowsError or FileExistsError.
  1801. try:
  1802. os.unlink(fn)
  1803. except OSError:
  1804. pass
  1805. os.rename(tf.name, fn)
  1806. except Exception:
  1807. try:
  1808. os.remove(tf.name)
  1809. except OSError:
  1810. pass
  1811. raise
  1812. if sys.version_info >= (2, 7):
  1813. def find_xpath_attr(node, xpath, key, val=None):
  1814. """ Find the xpath xpath[@key=val] """
  1815. assert re.match(r'^[a-zA-Z_-]+$', key)
  1816. expr = xpath + ('[@%s]' % key if val is None else "[@%s='%s']" % (key, val))
  1817. return node.find(expr)
  1818. else:
  1819. def find_xpath_attr(node, xpath, key, val=None):
  1820. for f in node.findall(compat_xpath(xpath)):
  1821. if key not in f.attrib:
  1822. continue
  1823. if val is None or f.attrib.get(key) == val:
  1824. return f
  1825. return None
  1826. # On python2.6 the xml.etree.ElementTree.Element methods don't support
  1827. # the namespace parameter
  1828. def xpath_with_ns(path, ns_map):
  1829. components = [c.split(':') for c in path.split('/')]
  1830. replaced = []
  1831. for c in components:
  1832. if len(c) == 1:
  1833. replaced.append(c[0])
  1834. else:
  1835. ns, tag = c
  1836. replaced.append('{%s}%s' % (ns_map[ns], tag))
  1837. return '/'.join(replaced)
  1838. def xpath_element(node, xpath, name=None, fatal=False, default=NO_DEFAULT):
  1839. def _find_xpath(xpath):
  1840. return node.find(compat_xpath(xpath))
  1841. if isinstance(xpath, (str, compat_str)):
  1842. n = _find_xpath(xpath)
  1843. else:
  1844. for xp in xpath:
  1845. n = _find_xpath(xp)
  1846. if n is not None:
  1847. break
  1848. if n is None:
  1849. if default is not NO_DEFAULT:
  1850. return default
  1851. elif fatal:
  1852. name = xpath if name is None else name
  1853. raise ExtractorError('Could not find XML element %s' % name)
  1854. else:
  1855. return None
  1856. return n
  1857. def xpath_text(node, xpath, name=None, fatal=False, default=NO_DEFAULT):
  1858. n = xpath_element(node, xpath, name, fatal=fatal, default=default)
  1859. if n is None or n == default:
  1860. return n
  1861. if n.text is None:
  1862. if default is not NO_DEFAULT:
  1863. return default
  1864. elif fatal:
  1865. name = xpath if name is None else name
  1866. raise ExtractorError('Could not find XML element\'s text %s' % name)
  1867. else:
  1868. return None
  1869. return n.text
  1870. def xpath_attr(node, xpath, key, name=None, fatal=False, default=NO_DEFAULT):
  1871. n = find_xpath_attr(node, xpath, key)
  1872. if n is None:
  1873. if default is not NO_DEFAULT:
  1874. return default
  1875. elif fatal:
  1876. name = '%s[@%s]' % (xpath, key) if name is None else name
  1877. raise ExtractorError('Could not find XML attribute %s' % name)
  1878. else:
  1879. return None
  1880. return n.attrib[key]
  1881. def get_element_by_id(id, html):
  1882. """Return the content of the tag with the specified ID in the passed HTML document"""
  1883. return get_element_by_attribute('id', id, html)
  1884. def get_element_by_class(class_name, html):
  1885. """Return the content of the first tag with the specified class in the passed HTML document"""
  1886. retval = get_elements_by_class(class_name, html)
  1887. return retval[0] if retval else None
  1888. def get_element_by_attribute(attribute, value, html, escape_value=True):
  1889. retval = get_elements_by_attribute(attribute, value, html, escape_value)
  1890. return retval[0] if retval else None
  1891. def get_elements_by_class(class_name, html):
  1892. """Return the content of all tags with the specified class in the passed HTML document as a list"""
  1893. return get_elements_by_attribute(
  1894. 'class', r'[^\'"]*\b%s\b[^\'"]*' % re.escape(class_name),
  1895. html, escape_value=False)
  1896. def get_elements_by_attribute(attribute, value, html, escape_value=True):
  1897. """Return the content of the tag with the specified attribute in the passed HTML document"""
  1898. value = re.escape(value) if escape_value else value
  1899. retlist = []
  1900. for m in re.finditer(r'''(?xs)
  1901. <([a-zA-Z0-9:._-]+)
  1902. (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
  1903. \s+%s=['"]?%s['"]?
  1904. (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
  1905. \s*>
  1906. (?P<content>.*?)
  1907. </\1>
  1908. ''' % (re.escape(attribute), value), html):
  1909. res = m.group('content')
  1910. if res.startswith('"') or res.startswith("'"):
  1911. res = res[1:-1]
  1912. retlist.append(unescapeHTML(res))
  1913. return retlist
  1914. class HTMLAttributeParser(compat_HTMLParser):
  1915. """Trivial HTML parser to gather the attributes for a single element"""
  1916. def __init__(self):
  1917. self.attrs = {}
  1918. compat_HTMLParser.__init__(self)
  1919. def handle_starttag(self, tag, attrs):
  1920. self.attrs = dict(attrs)
  1921. def extract_attributes(html_element):
  1922. """Given a string for an HTML element such as
  1923. <el
  1924. a="foo" B="bar" c="&98;az" d=boz
  1925. empty= noval entity="&amp;"
  1926. sq='"' dq="'"
  1927. >
  1928. Decode and return a dictionary of attributes.
  1929. {
  1930. 'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
  1931. 'empty': '', 'noval': None, 'entity': '&',
  1932. 'sq': '"', 'dq': '\''
  1933. }.
  1934. NB HTMLParser is stricter in Python 2.6 & 3.2 than in later versions,
  1935. but the cases in the unit test will work for all of 2.6, 2.7, 3.2-3.5.
  1936. """
  1937. parser = HTMLAttributeParser()
  1938. try:
  1939. parser.feed(html_element)
  1940. parser.close()
  1941. # Older Python may throw HTMLParseError in case of malformed HTML
  1942. except compat_HTMLParseError:
  1943. pass
  1944. return parser.attrs
  1945. def clean_html(html):
  1946. """Clean an HTML snippet into a readable string"""
  1947. if html is None: # Convenience for sanitizing descriptions etc.
  1948. return html
  1949. # Newline vs <br />
  1950. html = html.replace('\n', ' ')
  1951. html = re.sub(r'(?u)\s*<\s*br\s*/?\s*>\s*', '\n', html)
  1952. html = re.sub(r'(?u)<\s*/\s*p\s*>\s*<\s*p[^>]*>', '\n', html)
  1953. # Strip html tags
  1954. html = re.sub('<.*?>', '', html)
  1955. # Replace html entities
  1956. html = unescapeHTML(html)
  1957. return html.strip()
  1958. def sanitize_open(filename, open_mode):
  1959. """Try to open the given filename, and slightly t…

Large files files are truncated, but you can click here to view the full file