Merge pull request #9747 from TRox1972/lynda
[youtube-dl] / youtube_dl / compat.py
1 from __future__ import unicode_literals
2
3 import binascii
4 import collections
5 import email
6 import getpass
7 import io
8 import optparse
9 import os
10 import re
11 import shlex
12 import shutil
13 import socket
14 import struct
15 import subprocess
16 import sys
17 import itertools
18 import xml.etree.ElementTree
19
20
21 try:
22     import urllib.request as compat_urllib_request
23 except ImportError:  # Python 2
24     import urllib2 as compat_urllib_request
25
26 try:
27     import urllib.error as compat_urllib_error
28 except ImportError:  # Python 2
29     import urllib2 as compat_urllib_error
30
31 try:
32     import urllib.parse as compat_urllib_parse
33 except ImportError:  # Python 2
34     import urllib as compat_urllib_parse
35
36 try:
37     from urllib.parse import urlparse as compat_urllib_parse_urlparse
38 except ImportError:  # Python 2
39     from urlparse import urlparse as compat_urllib_parse_urlparse
40
41 try:
42     import urllib.parse as compat_urlparse
43 except ImportError:  # Python 2
44     import urlparse as compat_urlparse
45
46 try:
47     import urllib.response as compat_urllib_response
48 except ImportError:  # Python 2
49     import urllib as compat_urllib_response
50
51 try:
52     import http.cookiejar as compat_cookiejar
53 except ImportError:  # Python 2
54     import cookielib as compat_cookiejar
55
56 try:
57     import http.cookies as compat_cookies
58 except ImportError:  # Python 2
59     import Cookie as compat_cookies
60
61 try:
62     import html.entities as compat_html_entities
63 except ImportError:  # Python 2
64     import htmlentitydefs as compat_html_entities
65
66 try:  # Python >= 3.3
67     compat_html_entities_html5 = compat_html_entities.html5
68 except AttributeError:
69     # Copied from CPython 3.5.1 html/entities.py
70     compat_html_entities_html5 = {
71         'Aacute': '\xc1',
72         'aacute': '\xe1',
73         'Aacute;': '\xc1',
74         'aacute;': '\xe1',
75         'Abreve;': '\u0102',
76         'abreve;': '\u0103',
77         'ac;': '\u223e',
78         'acd;': '\u223f',
79         'acE;': '\u223e\u0333',
80         'Acirc': '\xc2',
81         'acirc': '\xe2',
82         'Acirc;': '\xc2',
83         'acirc;': '\xe2',
84         'acute': '\xb4',
85         'acute;': '\xb4',
86         'Acy;': '\u0410',
87         'acy;': '\u0430',
88         'AElig': '\xc6',
89         'aelig': '\xe6',
90         'AElig;': '\xc6',
91         'aelig;': '\xe6',
92         'af;': '\u2061',
93         'Afr;': '\U0001d504',
94         'afr;': '\U0001d51e',
95         'Agrave': '\xc0',
96         'agrave': '\xe0',
97         'Agrave;': '\xc0',
98         'agrave;': '\xe0',
99         'alefsym;': '\u2135',
100         'aleph;': '\u2135',
101         'Alpha;': '\u0391',
102         'alpha;': '\u03b1',
103         'Amacr;': '\u0100',
104         'amacr;': '\u0101',
105         'amalg;': '\u2a3f',
106         'AMP': '&',
107         'amp': '&',
108         'AMP;': '&',
109         'amp;': '&',
110         'And;': '\u2a53',
111         'and;': '\u2227',
112         'andand;': '\u2a55',
113         'andd;': '\u2a5c',
114         'andslope;': '\u2a58',
115         'andv;': '\u2a5a',
116         'ang;': '\u2220',
117         'ange;': '\u29a4',
118         'angle;': '\u2220',
119         'angmsd;': '\u2221',
120         'angmsdaa;': '\u29a8',
121         'angmsdab;': '\u29a9',
122         'angmsdac;': '\u29aa',
123         'angmsdad;': '\u29ab',
124         'angmsdae;': '\u29ac',
125         'angmsdaf;': '\u29ad',
126         'angmsdag;': '\u29ae',
127         'angmsdah;': '\u29af',
128         'angrt;': '\u221f',
129         'angrtvb;': '\u22be',
130         'angrtvbd;': '\u299d',
131         'angsph;': '\u2222',
132         'angst;': '\xc5',
133         'angzarr;': '\u237c',
134         'Aogon;': '\u0104',
135         'aogon;': '\u0105',
136         'Aopf;': '\U0001d538',
137         'aopf;': '\U0001d552',
138         'ap;': '\u2248',
139         'apacir;': '\u2a6f',
140         'apE;': '\u2a70',
141         'ape;': '\u224a',
142         'apid;': '\u224b',
143         'apos;': "'",
144         'ApplyFunction;': '\u2061',
145         'approx;': '\u2248',
146         'approxeq;': '\u224a',
147         'Aring': '\xc5',
148         'aring': '\xe5',
149         'Aring;': '\xc5',
150         'aring;': '\xe5',
151         'Ascr;': '\U0001d49c',
152         'ascr;': '\U0001d4b6',
153         'Assign;': '\u2254',
154         'ast;': '*',
155         'asymp;': '\u2248',
156         'asympeq;': '\u224d',
157         'Atilde': '\xc3',
158         'atilde': '\xe3',
159         'Atilde;': '\xc3',
160         'atilde;': '\xe3',
161         'Auml': '\xc4',
162         'auml': '\xe4',
163         'Auml;': '\xc4',
164         'auml;': '\xe4',
165         'awconint;': '\u2233',
166         'awint;': '\u2a11',
167         'backcong;': '\u224c',
168         'backepsilon;': '\u03f6',
169         'backprime;': '\u2035',
170         'backsim;': '\u223d',
171         'backsimeq;': '\u22cd',
172         'Backslash;': '\u2216',
173         'Barv;': '\u2ae7',
174         'barvee;': '\u22bd',
175         'Barwed;': '\u2306',
176         'barwed;': '\u2305',
177         'barwedge;': '\u2305',
178         'bbrk;': '\u23b5',
179         'bbrktbrk;': '\u23b6',
180         'bcong;': '\u224c',
181         'Bcy;': '\u0411',
182         'bcy;': '\u0431',
183         'bdquo;': '\u201e',
184         'becaus;': '\u2235',
185         'Because;': '\u2235',
186         'because;': '\u2235',
187         'bemptyv;': '\u29b0',
188         'bepsi;': '\u03f6',
189         'bernou;': '\u212c',
190         'Bernoullis;': '\u212c',
191         'Beta;': '\u0392',
192         'beta;': '\u03b2',
193         'beth;': '\u2136',
194         'between;': '\u226c',
195         'Bfr;': '\U0001d505',
196         'bfr;': '\U0001d51f',
197         'bigcap;': '\u22c2',
198         'bigcirc;': '\u25ef',
199         'bigcup;': '\u22c3',
200         'bigodot;': '\u2a00',
201         'bigoplus;': '\u2a01',
202         'bigotimes;': '\u2a02',
203         'bigsqcup;': '\u2a06',
204         'bigstar;': '\u2605',
205         'bigtriangledown;': '\u25bd',
206         'bigtriangleup;': '\u25b3',
207         'biguplus;': '\u2a04',
208         'bigvee;': '\u22c1',
209         'bigwedge;': '\u22c0',
210         'bkarow;': '\u290d',
211         'blacklozenge;': '\u29eb',
212         'blacksquare;': '\u25aa',
213         'blacktriangle;': '\u25b4',
214         'blacktriangledown;': '\u25be',
215         'blacktriangleleft;': '\u25c2',
216         'blacktriangleright;': '\u25b8',
217         'blank;': '\u2423',
218         'blk12;': '\u2592',
219         'blk14;': '\u2591',
220         'blk34;': '\u2593',
221         'block;': '\u2588',
222         'bne;': '=\u20e5',
223         'bnequiv;': '\u2261\u20e5',
224         'bNot;': '\u2aed',
225         'bnot;': '\u2310',
226         'Bopf;': '\U0001d539',
227         'bopf;': '\U0001d553',
228         'bot;': '\u22a5',
229         'bottom;': '\u22a5',
230         'bowtie;': '\u22c8',
231         'boxbox;': '\u29c9',
232         'boxDL;': '\u2557',
233         'boxDl;': '\u2556',
234         'boxdL;': '\u2555',
235         'boxdl;': '\u2510',
236         'boxDR;': '\u2554',
237         'boxDr;': '\u2553',
238         'boxdR;': '\u2552',
239         'boxdr;': '\u250c',
240         'boxH;': '\u2550',
241         'boxh;': '\u2500',
242         'boxHD;': '\u2566',
243         'boxHd;': '\u2564',
244         'boxhD;': '\u2565',
245         'boxhd;': '\u252c',
246         'boxHU;': '\u2569',
247         'boxHu;': '\u2567',
248         'boxhU;': '\u2568',
249         'boxhu;': '\u2534',
250         'boxminus;': '\u229f',
251         'boxplus;': '\u229e',
252         'boxtimes;': '\u22a0',
253         'boxUL;': '\u255d',
254         'boxUl;': '\u255c',
255         'boxuL;': '\u255b',
256         'boxul;': '\u2518',
257         'boxUR;': '\u255a',
258         'boxUr;': '\u2559',
259         'boxuR;': '\u2558',
260         'boxur;': '\u2514',
261         'boxV;': '\u2551',
262         'boxv;': '\u2502',
263         'boxVH;': '\u256c',
264         'boxVh;': '\u256b',
265         'boxvH;': '\u256a',
266         'boxvh;': '\u253c',
267         'boxVL;': '\u2563',
268         'boxVl;': '\u2562',
269         'boxvL;': '\u2561',
270         'boxvl;': '\u2524',
271         'boxVR;': '\u2560',
272         'boxVr;': '\u255f',
273         'boxvR;': '\u255e',
274         'boxvr;': '\u251c',
275         'bprime;': '\u2035',
276         'Breve;': '\u02d8',
277         'breve;': '\u02d8',
278         'brvbar': '\xa6',
279         'brvbar;': '\xa6',
280         'Bscr;': '\u212c',
281         'bscr;': '\U0001d4b7',
282         'bsemi;': '\u204f',
283         'bsim;': '\u223d',
284         'bsime;': '\u22cd',
285         'bsol;': '\\',
286         'bsolb;': '\u29c5',
287         'bsolhsub;': '\u27c8',
288         'bull;': '\u2022',
289         'bullet;': '\u2022',
290         'bump;': '\u224e',
291         'bumpE;': '\u2aae',
292         'bumpe;': '\u224f',
293         'Bumpeq;': '\u224e',
294         'bumpeq;': '\u224f',
295         'Cacute;': '\u0106',
296         'cacute;': '\u0107',
297         'Cap;': '\u22d2',
298         'cap;': '\u2229',
299         'capand;': '\u2a44',
300         'capbrcup;': '\u2a49',
301         'capcap;': '\u2a4b',
302         'capcup;': '\u2a47',
303         'capdot;': '\u2a40',
304         'CapitalDifferentialD;': '\u2145',
305         'caps;': '\u2229\ufe00',
306         'caret;': '\u2041',
307         'caron;': '\u02c7',
308         'Cayleys;': '\u212d',
309         'ccaps;': '\u2a4d',
310         'Ccaron;': '\u010c',
311         'ccaron;': '\u010d',
312         'Ccedil': '\xc7',
313         'ccedil': '\xe7',
314         'Ccedil;': '\xc7',
315         'ccedil;': '\xe7',
316         'Ccirc;': '\u0108',
317         'ccirc;': '\u0109',
318         'Cconint;': '\u2230',
319         'ccups;': '\u2a4c',
320         'ccupssm;': '\u2a50',
321         'Cdot;': '\u010a',
322         'cdot;': '\u010b',
323         'cedil': '\xb8',
324         'cedil;': '\xb8',
325         'Cedilla;': '\xb8',
326         'cemptyv;': '\u29b2',
327         'cent': '\xa2',
328         'cent;': '\xa2',
329         'CenterDot;': '\xb7',
330         'centerdot;': '\xb7',
331         'Cfr;': '\u212d',
332         'cfr;': '\U0001d520',
333         'CHcy;': '\u0427',
334         'chcy;': '\u0447',
335         'check;': '\u2713',
336         'checkmark;': '\u2713',
337         'Chi;': '\u03a7',
338         'chi;': '\u03c7',
339         'cir;': '\u25cb',
340         'circ;': '\u02c6',
341         'circeq;': '\u2257',
342         'circlearrowleft;': '\u21ba',
343         'circlearrowright;': '\u21bb',
344         'circledast;': '\u229b',
345         'circledcirc;': '\u229a',
346         'circleddash;': '\u229d',
347         'CircleDot;': '\u2299',
348         'circledR;': '\xae',
349         'circledS;': '\u24c8',
350         'CircleMinus;': '\u2296',
351         'CirclePlus;': '\u2295',
352         'CircleTimes;': '\u2297',
353         'cirE;': '\u29c3',
354         'cire;': '\u2257',
355         'cirfnint;': '\u2a10',
356         'cirmid;': '\u2aef',
357         'cirscir;': '\u29c2',
358         'ClockwiseContourIntegral;': '\u2232',
359         'CloseCurlyDoubleQuote;': '\u201d',
360         'CloseCurlyQuote;': '\u2019',
361         'clubs;': '\u2663',
362         'clubsuit;': '\u2663',
363         'Colon;': '\u2237',
364         'colon;': ':',
365         'Colone;': '\u2a74',
366         'colone;': '\u2254',
367         'coloneq;': '\u2254',
368         'comma;': ',',
369         'commat;': '@',
370         'comp;': '\u2201',
371         'compfn;': '\u2218',
372         'complement;': '\u2201',
373         'complexes;': '\u2102',
374         'cong;': '\u2245',
375         'congdot;': '\u2a6d',
376         'Congruent;': '\u2261',
377         'Conint;': '\u222f',
378         'conint;': '\u222e',
379         'ContourIntegral;': '\u222e',
380         'Copf;': '\u2102',
381         'copf;': '\U0001d554',
382         'coprod;': '\u2210',
383         'Coproduct;': '\u2210',
384         'COPY': '\xa9',
385         'copy': '\xa9',
386         'COPY;': '\xa9',
387         'copy;': '\xa9',
388         'copysr;': '\u2117',
389         'CounterClockwiseContourIntegral;': '\u2233',
390         'crarr;': '\u21b5',
391         'Cross;': '\u2a2f',
392         'cross;': '\u2717',
393         'Cscr;': '\U0001d49e',
394         'cscr;': '\U0001d4b8',
395         'csub;': '\u2acf',
396         'csube;': '\u2ad1',
397         'csup;': '\u2ad0',
398         'csupe;': '\u2ad2',
399         'ctdot;': '\u22ef',
400         'cudarrl;': '\u2938',
401         'cudarrr;': '\u2935',
402         'cuepr;': '\u22de',
403         'cuesc;': '\u22df',
404         'cularr;': '\u21b6',
405         'cularrp;': '\u293d',
406         'Cup;': '\u22d3',
407         'cup;': '\u222a',
408         'cupbrcap;': '\u2a48',
409         'CupCap;': '\u224d',
410         'cupcap;': '\u2a46',
411         'cupcup;': '\u2a4a',
412         'cupdot;': '\u228d',
413         'cupor;': '\u2a45',
414         'cups;': '\u222a\ufe00',
415         'curarr;': '\u21b7',
416         'curarrm;': '\u293c',
417         'curlyeqprec;': '\u22de',
418         'curlyeqsucc;': '\u22df',
419         'curlyvee;': '\u22ce',
420         'curlywedge;': '\u22cf',
421         'curren': '\xa4',
422         'curren;': '\xa4',
423         'curvearrowleft;': '\u21b6',
424         'curvearrowright;': '\u21b7',
425         'cuvee;': '\u22ce',
426         'cuwed;': '\u22cf',
427         'cwconint;': '\u2232',
428         'cwint;': '\u2231',
429         'cylcty;': '\u232d',
430         'Dagger;': '\u2021',
431         'dagger;': '\u2020',
432         'daleth;': '\u2138',
433         'Darr;': '\u21a1',
434         'dArr;': '\u21d3',
435         'darr;': '\u2193',
436         'dash;': '\u2010',
437         'Dashv;': '\u2ae4',
438         'dashv;': '\u22a3',
439         'dbkarow;': '\u290f',
440         'dblac;': '\u02dd',
441         'Dcaron;': '\u010e',
442         'dcaron;': '\u010f',
443         'Dcy;': '\u0414',
444         'dcy;': '\u0434',
445         'DD;': '\u2145',
446         'dd;': '\u2146',
447         'ddagger;': '\u2021',
448         'ddarr;': '\u21ca',
449         'DDotrahd;': '\u2911',
450         'ddotseq;': '\u2a77',
451         'deg': '\xb0',
452         'deg;': '\xb0',
453         'Del;': '\u2207',
454         'Delta;': '\u0394',
455         'delta;': '\u03b4',
456         'demptyv;': '\u29b1',
457         'dfisht;': '\u297f',
458         'Dfr;': '\U0001d507',
459         'dfr;': '\U0001d521',
460         'dHar;': '\u2965',
461         'dharl;': '\u21c3',
462         'dharr;': '\u21c2',
463         'DiacriticalAcute;': '\xb4',
464         'DiacriticalDot;': '\u02d9',
465         'DiacriticalDoubleAcute;': '\u02dd',
466         'DiacriticalGrave;': '`',
467         'DiacriticalTilde;': '\u02dc',
468         'diam;': '\u22c4',
469         'Diamond;': '\u22c4',
470         'diamond;': '\u22c4',
471         'diamondsuit;': '\u2666',
472         'diams;': '\u2666',
473         'die;': '\xa8',
474         'DifferentialD;': '\u2146',
475         'digamma;': '\u03dd',
476         'disin;': '\u22f2',
477         'div;': '\xf7',
478         'divide': '\xf7',
479         'divide;': '\xf7',
480         'divideontimes;': '\u22c7',
481         'divonx;': '\u22c7',
482         'DJcy;': '\u0402',
483         'djcy;': '\u0452',
484         'dlcorn;': '\u231e',
485         'dlcrop;': '\u230d',
486         'dollar;': '$',
487         'Dopf;': '\U0001d53b',
488         'dopf;': '\U0001d555',
489         'Dot;': '\xa8',
490         'dot;': '\u02d9',
491         'DotDot;': '\u20dc',
492         'doteq;': '\u2250',
493         'doteqdot;': '\u2251',
494         'DotEqual;': '\u2250',
495         'dotminus;': '\u2238',
496         'dotplus;': '\u2214',
497         'dotsquare;': '\u22a1',
498         'doublebarwedge;': '\u2306',
499         'DoubleContourIntegral;': '\u222f',
500         'DoubleDot;': '\xa8',
501         'DoubleDownArrow;': '\u21d3',
502         'DoubleLeftArrow;': '\u21d0',
503         'DoubleLeftRightArrow;': '\u21d4',
504         'DoubleLeftTee;': '\u2ae4',
505         'DoubleLongLeftArrow;': '\u27f8',
506         'DoubleLongLeftRightArrow;': '\u27fa',
507         'DoubleLongRightArrow;': '\u27f9',
508         'DoubleRightArrow;': '\u21d2',
509         'DoubleRightTee;': '\u22a8',
510         'DoubleUpArrow;': '\u21d1',
511         'DoubleUpDownArrow;': '\u21d5',
512         'DoubleVerticalBar;': '\u2225',
513         'DownArrow;': '\u2193',
514         'Downarrow;': '\u21d3',
515         'downarrow;': '\u2193',
516         'DownArrowBar;': '\u2913',
517         'DownArrowUpArrow;': '\u21f5',
518         'DownBreve;': '\u0311',
519         'downdownarrows;': '\u21ca',
520         'downharpoonleft;': '\u21c3',
521         'downharpoonright;': '\u21c2',
522         'DownLeftRightVector;': '\u2950',
523         'DownLeftTeeVector;': '\u295e',
524         'DownLeftVector;': '\u21bd',
525         'DownLeftVectorBar;': '\u2956',
526         'DownRightTeeVector;': '\u295f',
527         'DownRightVector;': '\u21c1',
528         'DownRightVectorBar;': '\u2957',
529         'DownTee;': '\u22a4',
530         'DownTeeArrow;': '\u21a7',
531         'drbkarow;': '\u2910',
532         'drcorn;': '\u231f',
533         'drcrop;': '\u230c',
534         'Dscr;': '\U0001d49f',
535         'dscr;': '\U0001d4b9',
536         'DScy;': '\u0405',
537         'dscy;': '\u0455',
538         'dsol;': '\u29f6',
539         'Dstrok;': '\u0110',
540         'dstrok;': '\u0111',
541         'dtdot;': '\u22f1',
542         'dtri;': '\u25bf',
543         'dtrif;': '\u25be',
544         'duarr;': '\u21f5',
545         'duhar;': '\u296f',
546         'dwangle;': '\u29a6',
547         'DZcy;': '\u040f',
548         'dzcy;': '\u045f',
549         'dzigrarr;': '\u27ff',
550         'Eacute': '\xc9',
551         'eacute': '\xe9',
552         'Eacute;': '\xc9',
553         'eacute;': '\xe9',
554         'easter;': '\u2a6e',
555         'Ecaron;': '\u011a',
556         'ecaron;': '\u011b',
557         'ecir;': '\u2256',
558         'Ecirc': '\xca',
559         'ecirc': '\xea',
560         'Ecirc;': '\xca',
561         'ecirc;': '\xea',
562         'ecolon;': '\u2255',
563         'Ecy;': '\u042d',
564         'ecy;': '\u044d',
565         'eDDot;': '\u2a77',
566         'Edot;': '\u0116',
567         'eDot;': '\u2251',
568         'edot;': '\u0117',
569         'ee;': '\u2147',
570         'efDot;': '\u2252',
571         'Efr;': '\U0001d508',
572         'efr;': '\U0001d522',
573         'eg;': '\u2a9a',
574         'Egrave': '\xc8',
575         'egrave': '\xe8',
576         'Egrave;': '\xc8',
577         'egrave;': '\xe8',
578         'egs;': '\u2a96',
579         'egsdot;': '\u2a98',
580         'el;': '\u2a99',
581         'Element;': '\u2208',
582         'elinters;': '\u23e7',
583         'ell;': '\u2113',
584         'els;': '\u2a95',
585         'elsdot;': '\u2a97',
586         'Emacr;': '\u0112',
587         'emacr;': '\u0113',
588         'empty;': '\u2205',
589         'emptyset;': '\u2205',
590         'EmptySmallSquare;': '\u25fb',
591         'emptyv;': '\u2205',
592         'EmptyVerySmallSquare;': '\u25ab',
593         'emsp13;': '\u2004',
594         'emsp14;': '\u2005',
595         'emsp;': '\u2003',
596         'ENG;': '\u014a',
597         'eng;': '\u014b',
598         'ensp;': '\u2002',
599         'Eogon;': '\u0118',
600         'eogon;': '\u0119',
601         'Eopf;': '\U0001d53c',
602         'eopf;': '\U0001d556',
603         'epar;': '\u22d5',
604         'eparsl;': '\u29e3',
605         'eplus;': '\u2a71',
606         'epsi;': '\u03b5',
607         'Epsilon;': '\u0395',
608         'epsilon;': '\u03b5',
609         'epsiv;': '\u03f5',
610         'eqcirc;': '\u2256',
611         'eqcolon;': '\u2255',
612         'eqsim;': '\u2242',
613         'eqslantgtr;': '\u2a96',
614         'eqslantless;': '\u2a95',
615         'Equal;': '\u2a75',
616         'equals;': '=',
617         'EqualTilde;': '\u2242',
618         'equest;': '\u225f',
619         'Equilibrium;': '\u21cc',
620         'equiv;': '\u2261',
621         'equivDD;': '\u2a78',
622         'eqvparsl;': '\u29e5',
623         'erarr;': '\u2971',
624         'erDot;': '\u2253',
625         'Escr;': '\u2130',
626         'escr;': '\u212f',
627         'esdot;': '\u2250',
628         'Esim;': '\u2a73',
629         'esim;': '\u2242',
630         'Eta;': '\u0397',
631         'eta;': '\u03b7',
632         'ETH': '\xd0',
633         'eth': '\xf0',
634         'ETH;': '\xd0',
635         'eth;': '\xf0',
636         'Euml': '\xcb',
637         'euml': '\xeb',
638         'Euml;': '\xcb',
639         'euml;': '\xeb',
640         'euro;': '\u20ac',
641         'excl;': '!',
642         'exist;': '\u2203',
643         'Exists;': '\u2203',
644         'expectation;': '\u2130',
645         'ExponentialE;': '\u2147',
646         'exponentiale;': '\u2147',
647         'fallingdotseq;': '\u2252',
648         'Fcy;': '\u0424',
649         'fcy;': '\u0444',
650         'female;': '\u2640',
651         'ffilig;': '\ufb03',
652         'fflig;': '\ufb00',
653         'ffllig;': '\ufb04',
654         'Ffr;': '\U0001d509',
655         'ffr;': '\U0001d523',
656         'filig;': '\ufb01',
657         'FilledSmallSquare;': '\u25fc',
658         'FilledVerySmallSquare;': '\u25aa',
659         'fjlig;': 'fj',
660         'flat;': '\u266d',
661         'fllig;': '\ufb02',
662         'fltns;': '\u25b1',
663         'fnof;': '\u0192',
664         'Fopf;': '\U0001d53d',
665         'fopf;': '\U0001d557',
666         'ForAll;': '\u2200',
667         'forall;': '\u2200',
668         'fork;': '\u22d4',
669         'forkv;': '\u2ad9',
670         'Fouriertrf;': '\u2131',
671         'fpartint;': '\u2a0d',
672         'frac12': '\xbd',
673         'frac12;': '\xbd',
674         'frac13;': '\u2153',
675         'frac14': '\xbc',
676         'frac14;': '\xbc',
677         'frac15;': '\u2155',
678         'frac16;': '\u2159',
679         'frac18;': '\u215b',
680         'frac23;': '\u2154',
681         'frac25;': '\u2156',
682         'frac34': '\xbe',
683         'frac34;': '\xbe',
684         'frac35;': '\u2157',
685         'frac38;': '\u215c',
686         'frac45;': '\u2158',
687         'frac56;': '\u215a',
688         'frac58;': '\u215d',
689         'frac78;': '\u215e',
690         'frasl;': '\u2044',
691         'frown;': '\u2322',
692         'Fscr;': '\u2131',
693         'fscr;': '\U0001d4bb',
694         'gacute;': '\u01f5',
695         'Gamma;': '\u0393',
696         'gamma;': '\u03b3',
697         'Gammad;': '\u03dc',
698         'gammad;': '\u03dd',
699         'gap;': '\u2a86',
700         'Gbreve;': '\u011e',
701         'gbreve;': '\u011f',
702         'Gcedil;': '\u0122',
703         'Gcirc;': '\u011c',
704         'gcirc;': '\u011d',
705         'Gcy;': '\u0413',
706         'gcy;': '\u0433',
707         'Gdot;': '\u0120',
708         'gdot;': '\u0121',
709         'gE;': '\u2267',
710         'ge;': '\u2265',
711         'gEl;': '\u2a8c',
712         'gel;': '\u22db',
713         'geq;': '\u2265',
714         'geqq;': '\u2267',
715         'geqslant;': '\u2a7e',
716         'ges;': '\u2a7e',
717         'gescc;': '\u2aa9',
718         'gesdot;': '\u2a80',
719         'gesdoto;': '\u2a82',
720         'gesdotol;': '\u2a84',
721         'gesl;': '\u22db\ufe00',
722         'gesles;': '\u2a94',
723         'Gfr;': '\U0001d50a',
724         'gfr;': '\U0001d524',
725         'Gg;': '\u22d9',
726         'gg;': '\u226b',
727         'ggg;': '\u22d9',
728         'gimel;': '\u2137',
729         'GJcy;': '\u0403',
730         'gjcy;': '\u0453',
731         'gl;': '\u2277',
732         'gla;': '\u2aa5',
733         'glE;': '\u2a92',
734         'glj;': '\u2aa4',
735         'gnap;': '\u2a8a',
736         'gnapprox;': '\u2a8a',
737         'gnE;': '\u2269',
738         'gne;': '\u2a88',
739         'gneq;': '\u2a88',
740         'gneqq;': '\u2269',
741         'gnsim;': '\u22e7',
742         'Gopf;': '\U0001d53e',
743         'gopf;': '\U0001d558',
744         'grave;': '`',
745         'GreaterEqual;': '\u2265',
746         'GreaterEqualLess;': '\u22db',
747         'GreaterFullEqual;': '\u2267',
748         'GreaterGreater;': '\u2aa2',
749         'GreaterLess;': '\u2277',
750         'GreaterSlantEqual;': '\u2a7e',
751         'GreaterTilde;': '\u2273',
752         'Gscr;': '\U0001d4a2',
753         'gscr;': '\u210a',
754         'gsim;': '\u2273',
755         'gsime;': '\u2a8e',
756         'gsiml;': '\u2a90',
757         'GT': '>',
758         'gt': '>',
759         'GT;': '>',
760         'Gt;': '\u226b',
761         'gt;': '>',
762         'gtcc;': '\u2aa7',
763         'gtcir;': '\u2a7a',
764         'gtdot;': '\u22d7',
765         'gtlPar;': '\u2995',
766         'gtquest;': '\u2a7c',
767         'gtrapprox;': '\u2a86',
768         'gtrarr;': '\u2978',
769         'gtrdot;': '\u22d7',
770         'gtreqless;': '\u22db',
771         'gtreqqless;': '\u2a8c',
772         'gtrless;': '\u2277',
773         'gtrsim;': '\u2273',
774         'gvertneqq;': '\u2269\ufe00',
775         'gvnE;': '\u2269\ufe00',
776         'Hacek;': '\u02c7',
777         'hairsp;': '\u200a',
778         'half;': '\xbd',
779         'hamilt;': '\u210b',
780         'HARDcy;': '\u042a',
781         'hardcy;': '\u044a',
782         'hArr;': '\u21d4',
783         'harr;': '\u2194',
784         'harrcir;': '\u2948',
785         'harrw;': '\u21ad',
786         'Hat;': '^',
787         'hbar;': '\u210f',
788         'Hcirc;': '\u0124',
789         'hcirc;': '\u0125',
790         'hearts;': '\u2665',
791         'heartsuit;': '\u2665',
792         'hellip;': '\u2026',
793         'hercon;': '\u22b9',
794         'Hfr;': '\u210c',
795         'hfr;': '\U0001d525',
796         'HilbertSpace;': '\u210b',
797         'hksearow;': '\u2925',
798         'hkswarow;': '\u2926',
799         'hoarr;': '\u21ff',
800         'homtht;': '\u223b',
801         'hookleftarrow;': '\u21a9',
802         'hookrightarrow;': '\u21aa',
803         'Hopf;': '\u210d',
804         'hopf;': '\U0001d559',
805         'horbar;': '\u2015',
806         'HorizontalLine;': '\u2500',
807         'Hscr;': '\u210b',
808         'hscr;': '\U0001d4bd',
809         'hslash;': '\u210f',
810         'Hstrok;': '\u0126',
811         'hstrok;': '\u0127',
812         'HumpDownHump;': '\u224e',
813         'HumpEqual;': '\u224f',
814         'hybull;': '\u2043',
815         'hyphen;': '\u2010',
816         'Iacute': '\xcd',
817         'iacute': '\xed',
818         'Iacute;': '\xcd',
819         'iacute;': '\xed',
820         'ic;': '\u2063',
821         'Icirc': '\xce',
822         'icirc': '\xee',
823         'Icirc;': '\xce',
824         'icirc;': '\xee',
825         'Icy;': '\u0418',
826         'icy;': '\u0438',
827         'Idot;': '\u0130',
828         'IEcy;': '\u0415',
829         'iecy;': '\u0435',
830         'iexcl': '\xa1',
831         'iexcl;': '\xa1',
832         'iff;': '\u21d4',
833         'Ifr;': '\u2111',
834         'ifr;': '\U0001d526',
835         'Igrave': '\xcc',
836         'igrave': '\xec',
837         'Igrave;': '\xcc',
838         'igrave;': '\xec',
839         'ii;': '\u2148',
840         'iiiint;': '\u2a0c',
841         'iiint;': '\u222d',
842         'iinfin;': '\u29dc',
843         'iiota;': '\u2129',
844         'IJlig;': '\u0132',
845         'ijlig;': '\u0133',
846         'Im;': '\u2111',
847         'Imacr;': '\u012a',
848         'imacr;': '\u012b',
849         'image;': '\u2111',
850         'ImaginaryI;': '\u2148',
851         'imagline;': '\u2110',
852         'imagpart;': '\u2111',
853         'imath;': '\u0131',
854         'imof;': '\u22b7',
855         'imped;': '\u01b5',
856         'Implies;': '\u21d2',
857         'in;': '\u2208',
858         'incare;': '\u2105',
859         'infin;': '\u221e',
860         'infintie;': '\u29dd',
861         'inodot;': '\u0131',
862         'Int;': '\u222c',
863         'int;': '\u222b',
864         'intcal;': '\u22ba',
865         'integers;': '\u2124',
866         'Integral;': '\u222b',
867         'intercal;': '\u22ba',
868         'Intersection;': '\u22c2',
869         'intlarhk;': '\u2a17',
870         'intprod;': '\u2a3c',
871         'InvisibleComma;': '\u2063',
872         'InvisibleTimes;': '\u2062',
873         'IOcy;': '\u0401',
874         'iocy;': '\u0451',
875         'Iogon;': '\u012e',
876         'iogon;': '\u012f',
877         'Iopf;': '\U0001d540',
878         'iopf;': '\U0001d55a',
879         'Iota;': '\u0399',
880         'iota;': '\u03b9',
881         'iprod;': '\u2a3c',
882         'iquest': '\xbf',
883         'iquest;': '\xbf',
884         'Iscr;': '\u2110',
885         'iscr;': '\U0001d4be',
886         'isin;': '\u2208',
887         'isindot;': '\u22f5',
888         'isinE;': '\u22f9',
889         'isins;': '\u22f4',
890         'isinsv;': '\u22f3',
891         'isinv;': '\u2208',
892         'it;': '\u2062',
893         'Itilde;': '\u0128',
894         'itilde;': '\u0129',
895         'Iukcy;': '\u0406',
896         'iukcy;': '\u0456',
897         'Iuml': '\xcf',
898         'iuml': '\xef',
899         'Iuml;': '\xcf',
900         'iuml;': '\xef',
901         'Jcirc;': '\u0134',
902         'jcirc;': '\u0135',
903         'Jcy;': '\u0419',
904         'jcy;': '\u0439',
905         'Jfr;': '\U0001d50d',
906         'jfr;': '\U0001d527',
907         'jmath;': '\u0237',
908         'Jopf;': '\U0001d541',
909         'jopf;': '\U0001d55b',
910         'Jscr;': '\U0001d4a5',
911         'jscr;': '\U0001d4bf',
912         'Jsercy;': '\u0408',
913         'jsercy;': '\u0458',
914         'Jukcy;': '\u0404',
915         'jukcy;': '\u0454',
916         'Kappa;': '\u039a',
917         'kappa;': '\u03ba',
918         'kappav;': '\u03f0',
919         'Kcedil;': '\u0136',
920         'kcedil;': '\u0137',
921         'Kcy;': '\u041a',
922         'kcy;': '\u043a',
923         'Kfr;': '\U0001d50e',
924         'kfr;': '\U0001d528',
925         'kgreen;': '\u0138',
926         'KHcy;': '\u0425',
927         'khcy;': '\u0445',
928         'KJcy;': '\u040c',
929         'kjcy;': '\u045c',
930         'Kopf;': '\U0001d542',
931         'kopf;': '\U0001d55c',
932         'Kscr;': '\U0001d4a6',
933         'kscr;': '\U0001d4c0',
934         'lAarr;': '\u21da',
935         'Lacute;': '\u0139',
936         'lacute;': '\u013a',
937         'laemptyv;': '\u29b4',
938         'lagran;': '\u2112',
939         'Lambda;': '\u039b',
940         'lambda;': '\u03bb',
941         'Lang;': '\u27ea',
942         'lang;': '\u27e8',
943         'langd;': '\u2991',
944         'langle;': '\u27e8',
945         'lap;': '\u2a85',
946         'Laplacetrf;': '\u2112',
947         'laquo': '\xab',
948         'laquo;': '\xab',
949         'Larr;': '\u219e',
950         'lArr;': '\u21d0',
951         'larr;': '\u2190',
952         'larrb;': '\u21e4',
953         'larrbfs;': '\u291f',
954         'larrfs;': '\u291d',
955         'larrhk;': '\u21a9',
956         'larrlp;': '\u21ab',
957         'larrpl;': '\u2939',
958         'larrsim;': '\u2973',
959         'larrtl;': '\u21a2',
960         'lat;': '\u2aab',
961         'lAtail;': '\u291b',
962         'latail;': '\u2919',
963         'late;': '\u2aad',
964         'lates;': '\u2aad\ufe00',
965         'lBarr;': '\u290e',
966         'lbarr;': '\u290c',
967         'lbbrk;': '\u2772',
968         'lbrace;': '{',
969         'lbrack;': '[',
970         'lbrke;': '\u298b',
971         'lbrksld;': '\u298f',
972         'lbrkslu;': '\u298d',
973         'Lcaron;': '\u013d',
974         'lcaron;': '\u013e',
975         'Lcedil;': '\u013b',
976         'lcedil;': '\u013c',
977         'lceil;': '\u2308',
978         'lcub;': '{',
979         'Lcy;': '\u041b',
980         'lcy;': '\u043b',
981         'ldca;': '\u2936',
982         'ldquo;': '\u201c',
983         'ldquor;': '\u201e',
984         'ldrdhar;': '\u2967',
985         'ldrushar;': '\u294b',
986         'ldsh;': '\u21b2',
987         'lE;': '\u2266',
988         'le;': '\u2264',
989         'LeftAngleBracket;': '\u27e8',
990         'LeftArrow;': '\u2190',
991         'Leftarrow;': '\u21d0',
992         'leftarrow;': '\u2190',
993         'LeftArrowBar;': '\u21e4',
994         'LeftArrowRightArrow;': '\u21c6',
995         'leftarrowtail;': '\u21a2',
996         'LeftCeiling;': '\u2308',
997         'LeftDoubleBracket;': '\u27e6',
998         'LeftDownTeeVector;': '\u2961',
999         'LeftDownVector;': '\u21c3',
1000         'LeftDownVectorBar;': '\u2959',
1001         'LeftFloor;': '\u230a',
1002         'leftharpoondown;': '\u21bd',
1003         'leftharpoonup;': '\u21bc',
1004         'leftleftarrows;': '\u21c7',
1005         'LeftRightArrow;': '\u2194',
1006         'Leftrightarrow;': '\u21d4',
1007         'leftrightarrow;': '\u2194',
1008         'leftrightarrows;': '\u21c6',
1009         'leftrightharpoons;': '\u21cb',
1010         'leftrightsquigarrow;': '\u21ad',
1011         'LeftRightVector;': '\u294e',
1012         'LeftTee;': '\u22a3',
1013         'LeftTeeArrow;': '\u21a4',
1014         'LeftTeeVector;': '\u295a',
1015         'leftthreetimes;': '\u22cb',
1016         'LeftTriangle;': '\u22b2',
1017         'LeftTriangleBar;': '\u29cf',
1018         'LeftTriangleEqual;': '\u22b4',
1019         'LeftUpDownVector;': '\u2951',
1020         'LeftUpTeeVector;': '\u2960',
1021         'LeftUpVector;': '\u21bf',
1022         'LeftUpVectorBar;': '\u2958',
1023         'LeftVector;': '\u21bc',
1024         'LeftVectorBar;': '\u2952',
1025         'lEg;': '\u2a8b',
1026         'leg;': '\u22da',
1027         'leq;': '\u2264',
1028         'leqq;': '\u2266',
1029         'leqslant;': '\u2a7d',
1030         'les;': '\u2a7d',
1031         'lescc;': '\u2aa8',
1032         'lesdot;': '\u2a7f',
1033         'lesdoto;': '\u2a81',
1034         'lesdotor;': '\u2a83',
1035         'lesg;': '\u22da\ufe00',
1036         'lesges;': '\u2a93',
1037         'lessapprox;': '\u2a85',
1038         'lessdot;': '\u22d6',
1039         'lesseqgtr;': '\u22da',
1040         'lesseqqgtr;': '\u2a8b',
1041         'LessEqualGreater;': '\u22da',
1042         'LessFullEqual;': '\u2266',
1043         'LessGreater;': '\u2276',
1044         'lessgtr;': '\u2276',
1045         'LessLess;': '\u2aa1',
1046         'lesssim;': '\u2272',
1047         'LessSlantEqual;': '\u2a7d',
1048         'LessTilde;': '\u2272',
1049         'lfisht;': '\u297c',
1050         'lfloor;': '\u230a',
1051         'Lfr;': '\U0001d50f',
1052         'lfr;': '\U0001d529',
1053         'lg;': '\u2276',
1054         'lgE;': '\u2a91',
1055         'lHar;': '\u2962',
1056         'lhard;': '\u21bd',
1057         'lharu;': '\u21bc',
1058         'lharul;': '\u296a',
1059         'lhblk;': '\u2584',
1060         'LJcy;': '\u0409',
1061         'ljcy;': '\u0459',
1062         'Ll;': '\u22d8',
1063         'll;': '\u226a',
1064         'llarr;': '\u21c7',
1065         'llcorner;': '\u231e',
1066         'Lleftarrow;': '\u21da',
1067         'llhard;': '\u296b',
1068         'lltri;': '\u25fa',
1069         'Lmidot;': '\u013f',
1070         'lmidot;': '\u0140',
1071         'lmoust;': '\u23b0',
1072         'lmoustache;': '\u23b0',
1073         'lnap;': '\u2a89',
1074         'lnapprox;': '\u2a89',
1075         'lnE;': '\u2268',
1076         'lne;': '\u2a87',
1077         'lneq;': '\u2a87',
1078         'lneqq;': '\u2268',
1079         'lnsim;': '\u22e6',
1080         'loang;': '\u27ec',
1081         'loarr;': '\u21fd',
1082         'lobrk;': '\u27e6',
1083         'LongLeftArrow;': '\u27f5',
1084         'Longleftarrow;': '\u27f8',
1085         'longleftarrow;': '\u27f5',
1086         'LongLeftRightArrow;': '\u27f7',
1087         'Longleftrightarrow;': '\u27fa',
1088         'longleftrightarrow;': '\u27f7',
1089         'longmapsto;': '\u27fc',
1090         'LongRightArrow;': '\u27f6',
1091         'Longrightarrow;': '\u27f9',
1092         'longrightarrow;': '\u27f6',
1093         'looparrowleft;': '\u21ab',
1094         'looparrowright;': '\u21ac',
1095         'lopar;': '\u2985',
1096         'Lopf;': '\U0001d543',
1097         'lopf;': '\U0001d55d',
1098         'loplus;': '\u2a2d',
1099         'lotimes;': '\u2a34',
1100         'lowast;': '\u2217',
1101         'lowbar;': '_',
1102         'LowerLeftArrow;': '\u2199',
1103         'LowerRightArrow;': '\u2198',
1104         'loz;': '\u25ca',
1105         'lozenge;': '\u25ca',
1106         'lozf;': '\u29eb',
1107         'lpar;': '(',
1108         'lparlt;': '\u2993',
1109         'lrarr;': '\u21c6',
1110         'lrcorner;': '\u231f',
1111         'lrhar;': '\u21cb',
1112         'lrhard;': '\u296d',
1113         'lrm;': '\u200e',
1114         'lrtri;': '\u22bf',
1115         'lsaquo;': '\u2039',
1116         'Lscr;': '\u2112',
1117         'lscr;': '\U0001d4c1',
1118         'Lsh;': '\u21b0',
1119         'lsh;': '\u21b0',
1120         'lsim;': '\u2272',
1121         'lsime;': '\u2a8d',
1122         'lsimg;': '\u2a8f',
1123         'lsqb;': '[',
1124         'lsquo;': '\u2018',
1125         'lsquor;': '\u201a',
1126         'Lstrok;': '\u0141',
1127         'lstrok;': '\u0142',
1128         'LT': '<',
1129         'lt': '<',
1130         'LT;': '<',
1131         'Lt;': '\u226a',
1132         'lt;': '<',
1133         'ltcc;': '\u2aa6',
1134         'ltcir;': '\u2a79',
1135         'ltdot;': '\u22d6',
1136         'lthree;': '\u22cb',
1137         'ltimes;': '\u22c9',
1138         'ltlarr;': '\u2976',
1139         'ltquest;': '\u2a7b',
1140         'ltri;': '\u25c3',
1141         'ltrie;': '\u22b4',
1142         'ltrif;': '\u25c2',
1143         'ltrPar;': '\u2996',
1144         'lurdshar;': '\u294a',
1145         'luruhar;': '\u2966',
1146         'lvertneqq;': '\u2268\ufe00',
1147         'lvnE;': '\u2268\ufe00',
1148         'macr': '\xaf',
1149         'macr;': '\xaf',
1150         'male;': '\u2642',
1151         'malt;': '\u2720',
1152         'maltese;': '\u2720',
1153         'Map;': '\u2905',
1154         'map;': '\u21a6',
1155         'mapsto;': '\u21a6',
1156         'mapstodown;': '\u21a7',
1157         'mapstoleft;': '\u21a4',
1158         'mapstoup;': '\u21a5',
1159         'marker;': '\u25ae',
1160         'mcomma;': '\u2a29',
1161         'Mcy;': '\u041c',
1162         'mcy;': '\u043c',
1163         'mdash;': '\u2014',
1164         'mDDot;': '\u223a',
1165         'measuredangle;': '\u2221',
1166         'MediumSpace;': '\u205f',
1167         'Mellintrf;': '\u2133',
1168         'Mfr;': '\U0001d510',
1169         'mfr;': '\U0001d52a',
1170         'mho;': '\u2127',
1171         'micro': '\xb5',
1172         'micro;': '\xb5',
1173         'mid;': '\u2223',
1174         'midast;': '*',
1175         'midcir;': '\u2af0',
1176         'middot': '\xb7',
1177         'middot;': '\xb7',
1178         'minus;': '\u2212',
1179         'minusb;': '\u229f',
1180         'minusd;': '\u2238',
1181         'minusdu;': '\u2a2a',
1182         'MinusPlus;': '\u2213',
1183         'mlcp;': '\u2adb',
1184         'mldr;': '\u2026',
1185         'mnplus;': '\u2213',
1186         'models;': '\u22a7',
1187         'Mopf;': '\U0001d544',
1188         'mopf;': '\U0001d55e',
1189         'mp;': '\u2213',
1190         'Mscr;': '\u2133',
1191         'mscr;': '\U0001d4c2',
1192         'mstpos;': '\u223e',
1193         'Mu;': '\u039c',
1194         'mu;': '\u03bc',
1195         'multimap;': '\u22b8',
1196         'mumap;': '\u22b8',
1197         'nabla;': '\u2207',
1198         'Nacute;': '\u0143',
1199         'nacute;': '\u0144',
1200         'nang;': '\u2220\u20d2',
1201         'nap;': '\u2249',
1202         'napE;': '\u2a70\u0338',
1203         'napid;': '\u224b\u0338',
1204         'napos;': '\u0149',
1205         'napprox;': '\u2249',
1206         'natur;': '\u266e',
1207         'natural;': '\u266e',
1208         'naturals;': '\u2115',
1209         'nbsp': '\xa0',
1210         'nbsp;': '\xa0',
1211         'nbump;': '\u224e\u0338',
1212         'nbumpe;': '\u224f\u0338',
1213         'ncap;': '\u2a43',
1214         'Ncaron;': '\u0147',
1215         'ncaron;': '\u0148',
1216         'Ncedil;': '\u0145',
1217         'ncedil;': '\u0146',
1218         'ncong;': '\u2247',
1219         'ncongdot;': '\u2a6d\u0338',
1220         'ncup;': '\u2a42',
1221         'Ncy;': '\u041d',
1222         'ncy;': '\u043d',
1223         'ndash;': '\u2013',
1224         'ne;': '\u2260',
1225         'nearhk;': '\u2924',
1226         'neArr;': '\u21d7',
1227         'nearr;': '\u2197',
1228         'nearrow;': '\u2197',
1229         'nedot;': '\u2250\u0338',
1230         'NegativeMediumSpace;': '\u200b',
1231         'NegativeThickSpace;': '\u200b',
1232         'NegativeThinSpace;': '\u200b',
1233         'NegativeVeryThinSpace;': '\u200b',
1234         'nequiv;': '\u2262',
1235         'nesear;': '\u2928',
1236         'nesim;': '\u2242\u0338',
1237         'NestedGreaterGreater;': '\u226b',
1238         'NestedLessLess;': '\u226a',
1239         'NewLine;': '\n',
1240         'nexist;': '\u2204',
1241         'nexists;': '\u2204',
1242         'Nfr;': '\U0001d511',
1243         'nfr;': '\U0001d52b',
1244         'ngE;': '\u2267\u0338',
1245         'nge;': '\u2271',
1246         'ngeq;': '\u2271',
1247         'ngeqq;': '\u2267\u0338',
1248         'ngeqslant;': '\u2a7e\u0338',
1249         'nges;': '\u2a7e\u0338',
1250         'nGg;': '\u22d9\u0338',
1251         'ngsim;': '\u2275',
1252         'nGt;': '\u226b\u20d2',
1253         'ngt;': '\u226f',
1254         'ngtr;': '\u226f',
1255         'nGtv;': '\u226b\u0338',
1256         'nhArr;': '\u21ce',
1257         'nharr;': '\u21ae',
1258         'nhpar;': '\u2af2',
1259         'ni;': '\u220b',
1260         'nis;': '\u22fc',
1261         'nisd;': '\u22fa',
1262         'niv;': '\u220b',
1263         'NJcy;': '\u040a',
1264         'njcy;': '\u045a',
1265         'nlArr;': '\u21cd',
1266         'nlarr;': '\u219a',
1267         'nldr;': '\u2025',
1268         'nlE;': '\u2266\u0338',
1269         'nle;': '\u2270',
1270         'nLeftarrow;': '\u21cd',
1271         'nleftarrow;': '\u219a',
1272         'nLeftrightarrow;': '\u21ce',
1273         'nleftrightarrow;': '\u21ae',
1274         'nleq;': '\u2270',
1275         'nleqq;': '\u2266\u0338',
1276         'nleqslant;': '\u2a7d\u0338',
1277         'nles;': '\u2a7d\u0338',
1278         'nless;': '\u226e',
1279         'nLl;': '\u22d8\u0338',
1280         'nlsim;': '\u2274',
1281         'nLt;': '\u226a\u20d2',
1282         'nlt;': '\u226e',
1283         'nltri;': '\u22ea',
1284         'nltrie;': '\u22ec',
1285         'nLtv;': '\u226a\u0338',
1286         'nmid;': '\u2224',
1287         'NoBreak;': '\u2060',
1288         'NonBreakingSpace;': '\xa0',
1289         'Nopf;': '\u2115',
1290         'nopf;': '\U0001d55f',
1291         'not': '\xac',
1292         'Not;': '\u2aec',
1293         'not;': '\xac',
1294         'NotCongruent;': '\u2262',
1295         'NotCupCap;': '\u226d',
1296         'NotDoubleVerticalBar;': '\u2226',
1297         'NotElement;': '\u2209',
1298         'NotEqual;': '\u2260',
1299         'NotEqualTilde;': '\u2242\u0338',
1300         'NotExists;': '\u2204',
1301         'NotGreater;': '\u226f',
1302         'NotGreaterEqual;': '\u2271',
1303         'NotGreaterFullEqual;': '\u2267\u0338',
1304         'NotGreaterGreater;': '\u226b\u0338',
1305         'NotGreaterLess;': '\u2279',
1306         'NotGreaterSlantEqual;': '\u2a7e\u0338',
1307         'NotGreaterTilde;': '\u2275',
1308         'NotHumpDownHump;': '\u224e\u0338',
1309         'NotHumpEqual;': '\u224f\u0338',
1310         'notin;': '\u2209',
1311         'notindot;': '\u22f5\u0338',
1312         'notinE;': '\u22f9\u0338',
1313         'notinva;': '\u2209',
1314         'notinvb;': '\u22f7',
1315         'notinvc;': '\u22f6',
1316         'NotLeftTriangle;': '\u22ea',
1317         'NotLeftTriangleBar;': '\u29cf\u0338',
1318         'NotLeftTriangleEqual;': '\u22ec',
1319         'NotLess;': '\u226e',
1320         'NotLessEqual;': '\u2270',
1321         'NotLessGreater;': '\u2278',
1322         'NotLessLess;': '\u226a\u0338',
1323         'NotLessSlantEqual;': '\u2a7d\u0338',
1324         'NotLessTilde;': '\u2274',
1325         'NotNestedGreaterGreater;': '\u2aa2\u0338',
1326         'NotNestedLessLess;': '\u2aa1\u0338',
1327         'notni;': '\u220c',
1328         'notniva;': '\u220c',
1329         'notnivb;': '\u22fe',
1330         'notnivc;': '\u22fd',
1331         'NotPrecedes;': '\u2280',
1332         'NotPrecedesEqual;': '\u2aaf\u0338',
1333         'NotPrecedesSlantEqual;': '\u22e0',
1334         'NotReverseElement;': '\u220c',
1335         'NotRightTriangle;': '\u22eb',
1336         'NotRightTriangleBar;': '\u29d0\u0338',
1337         'NotRightTriangleEqual;': '\u22ed',
1338         'NotSquareSubset;': '\u228f\u0338',
1339         'NotSquareSubsetEqual;': '\u22e2',
1340         'NotSquareSuperset;': '\u2290\u0338',
1341         'NotSquareSupersetEqual;': '\u22e3',
1342         'NotSubset;': '\u2282\u20d2',
1343         'NotSubsetEqual;': '\u2288',
1344         'NotSucceeds;': '\u2281',
1345         'NotSucceedsEqual;': '\u2ab0\u0338',
1346         'NotSucceedsSlantEqual;': '\u22e1',
1347         'NotSucceedsTilde;': '\u227f\u0338',
1348         'NotSuperset;': '\u2283\u20d2',
1349         'NotSupersetEqual;': '\u2289',
1350         'NotTilde;': '\u2241',
1351         'NotTildeEqual;': '\u2244',
1352         'NotTildeFullEqual;': '\u2247',
1353         'NotTildeTilde;': '\u2249',
1354         'NotVerticalBar;': '\u2224',
1355         'npar;': '\u2226',
1356         'nparallel;': '\u2226',
1357         'nparsl;': '\u2afd\u20e5',
1358         'npart;': '\u2202\u0338',
1359         'npolint;': '\u2a14',
1360         'npr;': '\u2280',
1361         'nprcue;': '\u22e0',
1362         'npre;': '\u2aaf\u0338',
1363         'nprec;': '\u2280',
1364         'npreceq;': '\u2aaf\u0338',
1365         'nrArr;': '\u21cf',
1366         'nrarr;': '\u219b',
1367         'nrarrc;': '\u2933\u0338',
1368         'nrarrw;': '\u219d\u0338',
1369         'nRightarrow;': '\u21cf',
1370         'nrightarrow;': '\u219b',
1371         'nrtri;': '\u22eb',
1372         'nrtrie;': '\u22ed',
1373         'nsc;': '\u2281',
1374         'nsccue;': '\u22e1',
1375         'nsce;': '\u2ab0\u0338',
1376         'Nscr;': '\U0001d4a9',
1377         'nscr;': '\U0001d4c3',
1378         'nshortmid;': '\u2224',
1379         'nshortparallel;': '\u2226',
1380         'nsim;': '\u2241',
1381         'nsime;': '\u2244',
1382         'nsimeq;': '\u2244',
1383         'nsmid;': '\u2224',
1384         'nspar;': '\u2226',
1385         'nsqsube;': '\u22e2',
1386         'nsqsupe;': '\u22e3',
1387         'nsub;': '\u2284',
1388         'nsubE;': '\u2ac5\u0338',
1389         'nsube;': '\u2288',
1390         'nsubset;': '\u2282\u20d2',
1391         'nsubseteq;': '\u2288',
1392         'nsubseteqq;': '\u2ac5\u0338',
1393         'nsucc;': '\u2281',
1394         'nsucceq;': '\u2ab0\u0338',
1395         'nsup;': '\u2285',
1396         'nsupE;': '\u2ac6\u0338',
1397         'nsupe;': '\u2289',
1398         'nsupset;': '\u2283\u20d2',
1399         'nsupseteq;': '\u2289',
1400         'nsupseteqq;': '\u2ac6\u0338',
1401         'ntgl;': '\u2279',
1402         'Ntilde': '\xd1',
1403         'ntilde': '\xf1',
1404         'Ntilde;': '\xd1',
1405         'ntilde;': '\xf1',
1406         'ntlg;': '\u2278',
1407         'ntriangleleft;': '\u22ea',
1408         'ntrianglelefteq;': '\u22ec',
1409         'ntriangleright;': '\u22eb',
1410         'ntrianglerighteq;': '\u22ed',
1411         'Nu;': '\u039d',
1412         'nu;': '\u03bd',
1413         'num;': '#',
1414         'numero;': '\u2116',
1415         'numsp;': '\u2007',
1416         'nvap;': '\u224d\u20d2',
1417         'nVDash;': '\u22af',
1418         'nVdash;': '\u22ae',
1419         'nvDash;': '\u22ad',
1420         'nvdash;': '\u22ac',
1421         'nvge;': '\u2265\u20d2',
1422         'nvgt;': '>\u20d2',
1423         'nvHarr;': '\u2904',
1424         'nvinfin;': '\u29de',
1425         'nvlArr;': '\u2902',
1426         'nvle;': '\u2264\u20d2',
1427         'nvlt;': '<\u20d2',
1428         'nvltrie;': '\u22b4\u20d2',
1429         'nvrArr;': '\u2903',
1430         'nvrtrie;': '\u22b5\u20d2',
1431         'nvsim;': '\u223c\u20d2',
1432         'nwarhk;': '\u2923',
1433         'nwArr;': '\u21d6',
1434         'nwarr;': '\u2196',
1435         'nwarrow;': '\u2196',
1436         'nwnear;': '\u2927',
1437         'Oacute': '\xd3',
1438         'oacute': '\xf3',
1439         'Oacute;': '\xd3',
1440         'oacute;': '\xf3',
1441         'oast;': '\u229b',
1442         'ocir;': '\u229a',
1443         'Ocirc': '\xd4',
1444         'ocirc': '\xf4',
1445         'Ocirc;': '\xd4',
1446         'ocirc;': '\xf4',
1447         'Ocy;': '\u041e',
1448         'ocy;': '\u043e',
1449         'odash;': '\u229d',
1450         'Odblac;': '\u0150',
1451         'odblac;': '\u0151',
1452         'odiv;': '\u2a38',
1453         'odot;': '\u2299',
1454         'odsold;': '\u29bc',
1455         'OElig;': '\u0152',
1456         'oelig;': '\u0153',
1457         'ofcir;': '\u29bf',
1458         'Ofr;': '\U0001d512',
1459         'ofr;': '\U0001d52c',
1460         'ogon;': '\u02db',
1461         'Ograve': '\xd2',
1462         'ograve': '\xf2',
1463         'Ograve;': '\xd2',
1464         'ograve;': '\xf2',
1465         'ogt;': '\u29c1',
1466         'ohbar;': '\u29b5',
1467         'ohm;': '\u03a9',
1468         'oint;': '\u222e',
1469         'olarr;': '\u21ba',
1470         'olcir;': '\u29be',
1471         'olcross;': '\u29bb',
1472         'oline;': '\u203e',
1473         'olt;': '\u29c0',
1474         'Omacr;': '\u014c',
1475         'omacr;': '\u014d',
1476         'Omega;': '\u03a9',
1477         'omega;': '\u03c9',
1478         'Omicron;': '\u039f',
1479         'omicron;': '\u03bf',
1480         'omid;': '\u29b6',
1481         'ominus;': '\u2296',
1482         'Oopf;': '\U0001d546',
1483         'oopf;': '\U0001d560',
1484         'opar;': '\u29b7',
1485         'OpenCurlyDoubleQuote;': '\u201c',
1486         'OpenCurlyQuote;': '\u2018',
1487         'operp;': '\u29b9',
1488         'oplus;': '\u2295',
1489         'Or;': '\u2a54',
1490         'or;': '\u2228',
1491         'orarr;': '\u21bb',
1492         'ord;': '\u2a5d',
1493         'order;': '\u2134',
1494         'orderof;': '\u2134',
1495         'ordf': '\xaa',
1496         'ordf;': '\xaa',
1497         'ordm': '\xba',
1498         'ordm;': '\xba',
1499         'origof;': '\u22b6',
1500         'oror;': '\u2a56',
1501         'orslope;': '\u2a57',
1502         'orv;': '\u2a5b',
1503         'oS;': '\u24c8',
1504         'Oscr;': '\U0001d4aa',
1505         'oscr;': '\u2134',
1506         'Oslash': '\xd8',
1507         'oslash': '\xf8',
1508         'Oslash;': '\xd8',
1509         'oslash;': '\xf8',
1510         'osol;': '\u2298',
1511         'Otilde': '\xd5',
1512         'otilde': '\xf5',
1513         'Otilde;': '\xd5',
1514         'otilde;': '\xf5',
1515         'Otimes;': '\u2a37',
1516         'otimes;': '\u2297',
1517         'otimesas;': '\u2a36',
1518         'Ouml': '\xd6',
1519         'ouml': '\xf6',
1520         'Ouml;': '\xd6',
1521         'ouml;': '\xf6',
1522         'ovbar;': '\u233d',
1523         'OverBar;': '\u203e',
1524         'OverBrace;': '\u23de',
1525         'OverBracket;': '\u23b4',
1526         'OverParenthesis;': '\u23dc',
1527         'par;': '\u2225',
1528         'para': '\xb6',
1529         'para;': '\xb6',
1530         'parallel;': '\u2225',
1531         'parsim;': '\u2af3',
1532         'parsl;': '\u2afd',
1533         'part;': '\u2202',
1534         'PartialD;': '\u2202',
1535         'Pcy;': '\u041f',
1536         'pcy;': '\u043f',
1537         'percnt;': '%',
1538         'period;': '.',
1539         'permil;': '\u2030',
1540         'perp;': '\u22a5',
1541         'pertenk;': '\u2031',
1542         'Pfr;': '\U0001d513',
1543         'pfr;': '\U0001d52d',
1544         'Phi;': '\u03a6',
1545         'phi;': '\u03c6',
1546         'phiv;': '\u03d5',
1547         'phmmat;': '\u2133',
1548         'phone;': '\u260e',
1549         'Pi;': '\u03a0',
1550         'pi;': '\u03c0',
1551         'pitchfork;': '\u22d4',
1552         'piv;': '\u03d6',
1553         'planck;': '\u210f',
1554         'planckh;': '\u210e',
1555         'plankv;': '\u210f',
1556         'plus;': '+',
1557         'plusacir;': '\u2a23',
1558         'plusb;': '\u229e',
1559         'pluscir;': '\u2a22',
1560         'plusdo;': '\u2214',
1561         'plusdu;': '\u2a25',
1562         'pluse;': '\u2a72',
1563         'PlusMinus;': '\xb1',
1564         'plusmn': '\xb1',
1565         'plusmn;': '\xb1',
1566         'plussim;': '\u2a26',
1567         'plustwo;': '\u2a27',
1568         'pm;': '\xb1',
1569         'Poincareplane;': '\u210c',
1570         'pointint;': '\u2a15',
1571         'Popf;': '\u2119',
1572         'popf;': '\U0001d561',
1573         'pound': '\xa3',
1574         'pound;': '\xa3',
1575         'Pr;': '\u2abb',
1576         'pr;': '\u227a',
1577         'prap;': '\u2ab7',
1578         'prcue;': '\u227c',
1579         'prE;': '\u2ab3',
1580         'pre;': '\u2aaf',
1581         'prec;': '\u227a',
1582         'precapprox;': '\u2ab7',
1583         'preccurlyeq;': '\u227c',
1584         'Precedes;': '\u227a',
1585         'PrecedesEqual;': '\u2aaf',
1586         'PrecedesSlantEqual;': '\u227c',
1587         'PrecedesTilde;': '\u227e',
1588         'preceq;': '\u2aaf',
1589         'precnapprox;': '\u2ab9',
1590         'precneqq;': '\u2ab5',
1591         'precnsim;': '\u22e8',
1592         'precsim;': '\u227e',
1593         'Prime;': '\u2033',
1594         'prime;': '\u2032',
1595         'primes;': '\u2119',
1596         'prnap;': '\u2ab9',
1597         'prnE;': '\u2ab5',
1598         'prnsim;': '\u22e8',
1599         'prod;': '\u220f',
1600         'Product;': '\u220f',
1601         'profalar;': '\u232e',
1602         'profline;': '\u2312',
1603         'profsurf;': '\u2313',
1604         'prop;': '\u221d',
1605         'Proportion;': '\u2237',
1606         'Proportional;': '\u221d',
1607         'propto;': '\u221d',
1608         'prsim;': '\u227e',
1609         'prurel;': '\u22b0',
1610         'Pscr;': '\U0001d4ab',
1611         'pscr;': '\U0001d4c5',
1612         'Psi;': '\u03a8',
1613         'psi;': '\u03c8',
1614         'puncsp;': '\u2008',
1615         'Qfr;': '\U0001d514',
1616         'qfr;': '\U0001d52e',
1617         'qint;': '\u2a0c',
1618         'Qopf;': '\u211a',
1619         'qopf;': '\U0001d562',
1620         'qprime;': '\u2057',
1621         'Qscr;': '\U0001d4ac',
1622         'qscr;': '\U0001d4c6',
1623         'quaternions;': '\u210d',
1624         'quatint;': '\u2a16',
1625         'quest;': '?',
1626         'questeq;': '\u225f',
1627         'QUOT': '"',
1628         'quot': '"',
1629         'QUOT;': '"',
1630         'quot;': '"',
1631         'rAarr;': '\u21db',
1632         'race;': '\u223d\u0331',
1633         'Racute;': '\u0154',
1634         'racute;': '\u0155',
1635         'radic;': '\u221a',
1636         'raemptyv;': '\u29b3',
1637         'Rang;': '\u27eb',
1638         'rang;': '\u27e9',
1639         'rangd;': '\u2992',
1640         'range;': '\u29a5',
1641         'rangle;': '\u27e9',
1642         'raquo': '\xbb',
1643         'raquo;': '\xbb',
1644         'Rarr;': '\u21a0',
1645         'rArr;': '\u21d2',
1646         'rarr;': '\u2192',
1647         'rarrap;': '\u2975',
1648         'rarrb;': '\u21e5',
1649         'rarrbfs;': '\u2920',
1650         'rarrc;': '\u2933',
1651         'rarrfs;': '\u291e',
1652         'rarrhk;': '\u21aa',
1653         'rarrlp;': '\u21ac',
1654         'rarrpl;': '\u2945',
1655         'rarrsim;': '\u2974',
1656         'Rarrtl;': '\u2916',
1657         'rarrtl;': '\u21a3',
1658         'rarrw;': '\u219d',
1659         'rAtail;': '\u291c',
1660         'ratail;': '\u291a',
1661         'ratio;': '\u2236',
1662         'rationals;': '\u211a',
1663         'RBarr;': '\u2910',
1664         'rBarr;': '\u290f',
1665         'rbarr;': '\u290d',
1666         'rbbrk;': '\u2773',
1667         'rbrace;': '}',
1668         'rbrack;': ']',
1669         'rbrke;': '\u298c',
1670         'rbrksld;': '\u298e',
1671         'rbrkslu;': '\u2990',
1672         'Rcaron;': '\u0158',
1673         'rcaron;': '\u0159',
1674         'Rcedil;': '\u0156',
1675         'rcedil;': '\u0157',
1676         'rceil;': '\u2309',
1677         'rcub;': '}',
1678         'Rcy;': '\u0420',
1679         'rcy;': '\u0440',
1680         'rdca;': '\u2937',
1681         'rdldhar;': '\u2969',
1682         'rdquo;': '\u201d',
1683         'rdquor;': '\u201d',
1684         'rdsh;': '\u21b3',
1685         'Re;': '\u211c',
1686         'real;': '\u211c',
1687         'realine;': '\u211b',
1688         'realpart;': '\u211c',
1689         'reals;': '\u211d',
1690         'rect;': '\u25ad',
1691         'REG': '\xae',
1692         'reg': '\xae',
1693         'REG;': '\xae',
1694         'reg;': '\xae',
1695         'ReverseElement;': '\u220b',
1696         'ReverseEquilibrium;': '\u21cb',
1697         'ReverseUpEquilibrium;': '\u296f',
1698         'rfisht;': '\u297d',
1699         'rfloor;': '\u230b',
1700         'Rfr;': '\u211c',
1701         'rfr;': '\U0001d52f',
1702         'rHar;': '\u2964',
1703         'rhard;': '\u21c1',
1704         'rharu;': '\u21c0',
1705         'rharul;': '\u296c',
1706         'Rho;': '\u03a1',
1707         'rho;': '\u03c1',
1708         'rhov;': '\u03f1',
1709         'RightAngleBracket;': '\u27e9',
1710         'RightArrow;': '\u2192',
1711         'Rightarrow;': '\u21d2',
1712         'rightarrow;': '\u2192',
1713         'RightArrowBar;': '\u21e5',
1714         'RightArrowLeftArrow;': '\u21c4',
1715         'rightarrowtail;': '\u21a3',
1716         'RightCeiling;': '\u2309',
1717         'RightDoubleBracket;': '\u27e7',
1718         'RightDownTeeVector;': '\u295d',
1719         'RightDownVector;': '\u21c2',
1720         'RightDownVectorBar;': '\u2955',
1721         'RightFloor;': '\u230b',
1722         'rightharpoondown;': '\u21c1',
1723         'rightharpoonup;': '\u21c0',
1724         'rightleftarrows;': '\u21c4',
1725         'rightleftharpoons;': '\u21cc',
1726         'rightrightarrows;': '\u21c9',
1727         'rightsquigarrow;': '\u219d',
1728         'RightTee;': '\u22a2',
1729         'RightTeeArrow;': '\u21a6',
1730         'RightTeeVector;': '\u295b',
1731         'rightthreetimes;': '\u22cc',
1732         'RightTriangle;': '\u22b3',
1733         'RightTriangleBar;': '\u29d0',
1734         'RightTriangleEqual;': '\u22b5',
1735         'RightUpDownVector;': '\u294f',
1736         'RightUpTeeVector;': '\u295c',
1737         'RightUpVector;': '\u21be',
1738         'RightUpVectorBar;': '\u2954',
1739         'RightVector;': '\u21c0',
1740         'RightVectorBar;': '\u2953',
1741         'ring;': '\u02da',
1742         'risingdotseq;': '\u2253',
1743         'rlarr;': '\u21c4',
1744         'rlhar;': '\u21cc',
1745         'rlm;': '\u200f',
1746         'rmoust;': '\u23b1',
1747         'rmoustache;': '\u23b1',
1748         'rnmid;': '\u2aee',
1749         'roang;': '\u27ed',
1750         'roarr;': '\u21fe',
1751         'robrk;': '\u27e7',
1752         'ropar;': '\u2986',
1753         'Ropf;': '\u211d',
1754         'ropf;': '\U0001d563',
1755         'roplus;': '\u2a2e',
1756         'rotimes;': '\u2a35',
1757         'RoundImplies;': '\u2970',
1758         'rpar;': ')',
1759         'rpargt;': '\u2994',
1760         'rppolint;': '\u2a12',
1761         'rrarr;': '\u21c9',
1762         'Rrightarrow;': '\u21db',
1763         'rsaquo;': '\u203a',
1764         'Rscr;': '\u211b',
1765         'rscr;': '\U0001d4c7',
1766         'Rsh;': '\u21b1',
1767         'rsh;': '\u21b1',
1768         'rsqb;': ']',
1769         'rsquo;': '\u2019',
1770         'rsquor;': '\u2019',
1771         'rthree;': '\u22cc',
1772         'rtimes;': '\u22ca',
1773         'rtri;': '\u25b9',
1774         'rtrie;': '\u22b5',
1775         'rtrif;': '\u25b8',
1776         'rtriltri;': '\u29ce',
1777         'RuleDelayed;': '\u29f4',
1778         'ruluhar;': '\u2968',
1779         'rx;': '\u211e',
1780         'Sacute;': '\u015a',
1781         'sacute;': '\u015b',
1782         'sbquo;': '\u201a',
1783         'Sc;': '\u2abc',
1784         'sc;': '\u227b',
1785         'scap;': '\u2ab8',
1786         'Scaron;': '\u0160',
1787         'scaron;': '\u0161',
1788         'sccue;': '\u227d',
1789         'scE;': '\u2ab4',
1790         'sce;': '\u2ab0',
1791         'Scedil;': '\u015e',
1792         'scedil;': '\u015f',
1793         'Scirc;': '\u015c',
1794         'scirc;': '\u015d',
1795         'scnap;': '\u2aba',
1796         'scnE;': '\u2ab6',
1797         'scnsim;': '\u22e9',
1798         'scpolint;': '\u2a13',
1799         'scsim;': '\u227f',
1800         'Scy;': '\u0421',
1801         'scy;': '\u0441',
1802         'sdot;': '\u22c5',
1803         'sdotb;': '\u22a1',
1804         'sdote;': '\u2a66',
1805         'searhk;': '\u2925',
1806         'seArr;': '\u21d8',
1807         'searr;': '\u2198',
1808         'searrow;': '\u2198',
1809         'sect': '\xa7',
1810         'sect;': '\xa7',
1811         'semi;': ';',
1812         'seswar;': '\u2929',
1813         'setminus;': '\u2216',
1814         'setmn;': '\u2216',
1815         'sext;': '\u2736',
1816         'Sfr;': '\U0001d516',
1817         'sfr;': '\U0001d530',
1818         'sfrown;': '\u2322',
1819         'sharp;': '\u266f',
1820         'SHCHcy;': '\u0429',
1821         'shchcy;': '\u0449',
1822         'SHcy;': '\u0428',
1823         'shcy;': '\u0448',
1824         'ShortDownArrow;': '\u2193',
1825         'ShortLeftArrow;': '\u2190',
1826         'shortmid;': '\u2223',
1827         'shortparallel;': '\u2225',
1828         'ShortRightArrow;': '\u2192',
1829         'ShortUpArrow;': '\u2191',
1830         'shy': '\xad',
1831         'shy;': '\xad',
1832         'Sigma;': '\u03a3',
1833         'sigma;': '\u03c3',
1834         'sigmaf;': '\u03c2',
1835         'sigmav;': '\u03c2',
1836         'sim;': '\u223c',
1837         'simdot;': '\u2a6a',
1838         'sime;': '\u2243',
1839         'simeq;': '\u2243',
1840         'simg;': '\u2a9e',
1841         'simgE;': '\u2aa0',
1842         'siml;': '\u2a9d',
1843         'simlE;': '\u2a9f',
1844         'simne;': '\u2246',
1845         'simplus;': '\u2a24',
1846         'simrarr;': '\u2972',
1847         'slarr;': '\u2190',
1848         'SmallCircle;': '\u2218',
1849         'smallsetminus;': '\u2216',
1850         'smashp;': '\u2a33',
1851         'smeparsl;': '\u29e4',
1852         'smid;': '\u2223',
1853         'smile;': '\u2323',
1854         'smt;': '\u2aaa',
1855         'smte;': '\u2aac',
1856         'smtes;': '\u2aac\ufe00',
1857         'SOFTcy;': '\u042c',
1858         'softcy;': '\u044c',
1859         'sol;': '/',
1860         'solb;': '\u29c4',
1861         'solbar;': '\u233f',
1862         'Sopf;': '\U0001d54a',
1863         'sopf;': '\U0001d564',
1864         'spades;': '\u2660',
1865         'spadesuit;': '\u2660',
1866         'spar;': '\u2225',
1867         'sqcap;': '\u2293',
1868         'sqcaps;': '\u2293\ufe00',
1869         'sqcup;': '\u2294',
1870         'sqcups;': '\u2294\ufe00',
1871         'Sqrt;': '\u221a',
1872         'sqsub;': '\u228f',
1873         'sqsube;': '\u2291',
1874         'sqsubset;': '\u228f',
1875         'sqsubseteq;': '\u2291',
1876         'sqsup;': '\u2290',
1877         'sqsupe;': '\u2292',
1878         'sqsupset;': '\u2290',
1879         'sqsupseteq;': '\u2292',
1880         'squ;': '\u25a1',
1881         'Square;': '\u25a1',
1882         'square;': '\u25a1',
1883         'SquareIntersection;': '\u2293',
1884         'SquareSubset;': '\u228f',
1885         'SquareSubsetEqual;': '\u2291',
1886         'SquareSuperset;': '\u2290',
1887         'SquareSupersetEqual;': '\u2292',
1888         'SquareUnion;': '\u2294',
1889         'squarf;': '\u25aa',
1890         'squf;': '\u25aa',
1891         'srarr;': '\u2192',
1892         'Sscr;': '\U0001d4ae',
1893         'sscr;': '\U0001d4c8',
1894         'ssetmn;': '\u2216',
1895         'ssmile;': '\u2323',
1896         'sstarf;': '\u22c6',
1897         'Star;': '\u22c6',
1898         'star;': '\u2606',
1899         'starf;': '\u2605',
1900         'straightepsilon;': '\u03f5',
1901         'straightphi;': '\u03d5',
1902         'strns;': '\xaf',
1903         'Sub;': '\u22d0',
1904         'sub;': '\u2282',
1905         'subdot;': '\u2abd',
1906         'subE;': '\u2ac5',
1907         'sube;': '\u2286',
1908         'subedot;': '\u2ac3',
1909         'submult;': '\u2ac1',
1910         'subnE;': '\u2acb',
1911         'subne;': '\u228a',
1912         'subplus;': '\u2abf',
1913         'subrarr;': '\u2979',
1914         'Subset;': '\u22d0',
1915         'subset;': '\u2282',
1916         'subseteq;': '\u2286',
1917         'subseteqq;': '\u2ac5',
1918         'SubsetEqual;': '\u2286',
1919         'subsetneq;': '\u228a',
1920         'subsetneqq;': '\u2acb',
1921         'subsim;': '\u2ac7',
1922         'subsub;': '\u2ad5',
1923         'subsup;': '\u2ad3',
1924         'succ;': '\u227b',
1925         'succapprox;': '\u2ab8',
1926         'succcurlyeq;': '\u227d',
1927         'Succeeds;': '\u227b',
1928         'SucceedsEqual;': '\u2ab0',
1929         'SucceedsSlantEqual;': '\u227d',
1930         'SucceedsTilde;': '\u227f',
1931         'succeq;': '\u2ab0',
1932         'succnapprox;': '\u2aba',
1933         'succneqq;': '\u2ab6',
1934         'succnsim;': '\u22e9',
1935         'succsim;': '\u227f',
1936         'SuchThat;': '\u220b',
1937         'Sum;': '\u2211',
1938         'sum;': '\u2211',
1939         'sung;': '\u266a',
1940         'sup1': '\xb9',
1941         'sup1;': '\xb9',
1942         'sup2': '\xb2',
1943         'sup2;': '\xb2',
1944         'sup3': '\xb3',
1945         'sup3;': '\xb3',
1946         'Sup;': '\u22d1',
1947         'sup;': '\u2283',
1948         'supdot;': '\u2abe',
1949         'supdsub;': '\u2ad8',
1950         'supE;': '\u2ac6',
1951         'supe;': '\u2287',
1952         'supedot;': '\u2ac4',
1953         'Superset;': '\u2283',
1954         'SupersetEqual;': '\u2287',
1955         'suphsol;': '\u27c9',
1956         'suphsub;': '\u2ad7',
1957         'suplarr;': '\u297b',
1958         'supmult;': '\u2ac2',
1959         'supnE;': '\u2acc',
1960         'supne;': '\u228b',
1961         'supplus;': '\u2ac0',
1962         'Supset;': '\u22d1',
1963         'supset;': '\u2283',
1964         'supseteq;': '\u2287',
1965         'supseteqq;': '\u2ac6',
1966         'supsetneq;': '\u228b',
1967         'supsetneqq;': '\u2acc',
1968         'supsim;': '\u2ac8',
1969         'supsub;': '\u2ad4',
1970         'supsup;': '\u2ad6',
1971         'swarhk;': '\u2926',
1972         'swArr;': '\u21d9',
1973         'swarr;': '\u2199',
1974         'swarrow;': '\u2199',
1975         'swnwar;': '\u292a',
1976         'szlig': '\xdf',
1977         'szlig;': '\xdf',
1978         'Tab;': '\t',
1979         'target;': '\u2316',
1980         'Tau;': '\u03a4',
1981         'tau;': '\u03c4',
1982         'tbrk;': '\u23b4',
1983         'Tcaron;': '\u0164',
1984         'tcaron;': '\u0165',
1985         'Tcedil;': '\u0162',
1986         'tcedil;': '\u0163',
1987         'Tcy;': '\u0422',
1988         'tcy;': '\u0442',
1989         'tdot;': '\u20db',
1990         'telrec;': '\u2315',
1991         'Tfr;': '\U0001d517',
1992         'tfr;': '\U0001d531',
1993         'there4;': '\u2234',
1994         'Therefore;': '\u2234',
1995         'therefore;': '\u2234',
1996         'Theta;': '\u0398',
1997         'theta;': '\u03b8',
1998         'thetasym;': '\u03d1',
1999         'thetav;': '\u03d1',
2000         'thickapprox;': '\u2248',
2001         'thicksim;': '\u223c',
2002         'ThickSpace;': '\u205f\u200a',
2003         'thinsp;': '\u2009',
2004         'ThinSpace;': '\u2009',
2005         'thkap;': '\u2248',
2006         'thksim;': '\u223c',
2007         'THORN': '\xde',
2008         'thorn': '\xfe',
2009         'THORN;': '\xde',
2010         'thorn;': '\xfe',
2011         'Tilde;': '\u223c',
2012         'tilde;': '\u02dc',
2013         'TildeEqual;': '\u2243',
2014         'TildeFullEqual;': '\u2245',
2015         'TildeTilde;': '\u2248',
2016         'times': '\xd7',
2017         'times;': '\xd7',
2018         'timesb;': '\u22a0',
2019         'timesbar;': '\u2a31',
2020         'timesd;': '\u2a30',
2021         'tint;': '\u222d',
2022         'toea;': '\u2928',
2023         'top;': '\u22a4',
2024         'topbot;': '\u2336',
2025         'topcir;': '\u2af1',
2026         'Topf;': '\U0001d54b',
2027         'topf;': '\U0001d565',
2028         'topfork;': '\u2ada',
2029         'tosa;': '\u2929',
2030         'tprime;': '\u2034',
2031         'TRADE;': '\u2122',
2032         'trade;': '\u2122',
2033         'triangle;': '\u25b5',
2034         'triangledown;': '\u25bf',
2035         'triangleleft;': '\u25c3',
2036         'trianglelefteq;': '\u22b4',
2037         'triangleq;': '\u225c',
2038         'triangleright;': '\u25b9',
2039         'trianglerighteq;': '\u22b5',
2040         'tridot;': '\u25ec',
2041         'trie;': '\u225c',
2042         'triminus;': '\u2a3a',
2043         'TripleDot;': '\u20db',
2044         'triplus;': '\u2a39',
2045         'trisb;': '\u29cd',
2046         'tritime;': '\u2a3b',
2047         'trpezium;': '\u23e2',
2048         'Tscr;': '\U0001d4af',
2049         'tscr;': '\U0001d4c9',
2050         'TScy;': '\u0426',
2051         'tscy;': '\u0446',
2052         'TSHcy;': '\u040b',
2053         'tshcy;': '\u045b',
2054         'Tstrok;': '\u0166',
2055         'tstrok;': '\u0167',
2056         'twixt;': '\u226c',
2057         'twoheadleftarrow;': '\u219e',
2058         'twoheadrightarrow;': '\u21a0',
2059         'Uacute': '\xda',
2060         'uacute': '\xfa',
2061         'Uacute;': '\xda',
2062         'uacute;': '\xfa',
2063         'Uarr;': '\u219f',
2064         'uArr;': '\u21d1',
2065         'uarr;': '\u2191',
2066         'Uarrocir;': '\u2949',
2067         'Ubrcy;': '\u040e',
2068         'ubrcy;': '\u045e',
2069         'Ubreve;': '\u016c',
2070         'ubreve;': '\u016d',
2071         'Ucirc': '\xdb',
2072         'ucirc': '\xfb',
2073         'Ucirc;': '\xdb',
2074         'ucirc;': '\xfb',
2075         'Ucy;': '\u0423',
2076         'ucy;': '\u0443',
2077         'udarr;': '\u21c5',
2078         'Udblac;': '\u0170',
2079         'udblac;': '\u0171',
2080         'udhar;': '\u296e',
2081         'ufisht;': '\u297e',
2082         'Ufr;': '\U0001d518',
2083         'ufr;': '\U0001d532',
2084         'Ugrave': '\xd9',
2085         'ugrave': '\xf9',
2086         'Ugrave;': '\xd9',
2087         'ugrave;': '\xf9',
2088         'uHar;': '\u2963',
2089         'uharl;': '\u21bf',
2090         'uharr;': '\u21be',
2091         'uhblk;': '\u2580',
2092         'ulcorn;': '\u231c',
2093         'ulcorner;': '\u231c',
2094         'ulcrop;': '\u230f',
2095         'ultri;': '\u25f8',
2096         'Umacr;': '\u016a',
2097         'umacr;': '\u016b',
2098         'uml': '\xa8',
2099         'uml;': '\xa8',
2100         'UnderBar;': '_',
2101         'UnderBrace;': '\u23df',
2102         'UnderBracket;': '\u23b5',
2103         'UnderParenthesis;': '\u23dd',
2104         'Union;': '\u22c3',
2105         'UnionPlus;': '\u228e',
2106         'Uogon;': '\u0172',
2107         'uogon;': '\u0173',
2108         'Uopf;': '\U0001d54c',
2109         'uopf;': '\U0001d566',
2110         'UpArrow;': '\u2191',
2111         'Uparrow;': '\u21d1',
2112         'uparrow;': '\u2191',
2113         'UpArrowBar;': '\u2912',
2114         'UpArrowDownArrow;': '\u21c5',
2115         'UpDownArrow;': '\u2195',
2116         'Updownarrow;': '\u21d5',
2117         'updownarrow;': '\u2195',
2118         'UpEquilibrium;': '\u296e',
2119         'upharpoonleft;': '\u21bf',
2120         'upharpoonright;': '\u21be',
2121         'uplus;': '\u228e',
2122         'UpperLeftArrow;': '\u2196',
2123         'UpperRightArrow;': '\u2197',
2124         'Upsi;': '\u03d2',
2125         'upsi;': '\u03c5',
2126         'upsih;': '\u03d2',
2127         'Upsilon;': '\u03a5',
2128         'upsilon;': '\u03c5',
2129         'UpTee;': '\u22a5',
2130         'UpTeeArrow;': '\u21a5',
2131         'upuparrows;': '\u21c8',
2132         'urcorn;': '\u231d',
2133         'urcorner;': '\u231d',
2134         'urcrop;': '\u230e',
2135         'Uring;': '\u016e',
2136         'uring;': '\u016f',
2137         'urtri;': '\u25f9',
2138         'Uscr;': '\U0001d4b0',
2139         'uscr;': '\U0001d4ca',
2140         'utdot;': '\u22f0',
2141         'Utilde;': '\u0168',
2142         'utilde;': '\u0169',
2143         'utri;': '\u25b5',
2144         'utrif;': '\u25b4',
2145         'uuarr;': '\u21c8',
2146         'Uuml': '\xdc',
2147         'uuml': '\xfc',
2148         'Uuml;': '\xdc',
2149         'uuml;': '\xfc',
2150         'uwangle;': '\u29a7',
2151         'vangrt;': '\u299c',
2152         'varepsilon;': '\u03f5',
2153         'varkappa;': '\u03f0',
2154         'varnothing;': '\u2205',
2155         'varphi;': '\u03d5',
2156         'varpi;': '\u03d6',
2157         'varpropto;': '\u221d',
2158         'vArr;': '\u21d5',
2159         'varr;': '\u2195',
2160         'varrho;': '\u03f1',
2161         'varsigma;': '\u03c2',
2162         'varsubsetneq;': '\u228a\ufe00',
2163         'varsubsetneqq;': '\u2acb\ufe00',
2164         'varsupsetneq;': '\u228b\ufe00',
2165         'varsupsetneqq;': '\u2acc\ufe00',
2166         'vartheta;': '\u03d1',
2167         'vartriangleleft;': '\u22b2',
2168         'vartriangleright;': '\u22b3',
2169         'Vbar;': '\u2aeb',
2170         'vBar;': '\u2ae8',
2171         'vBarv;': '\u2ae9',
2172         'Vcy;': '\u0412',
2173         'vcy;': '\u0432',
2174         'VDash;': '\u22ab',
2175         'Vdash;': '\u22a9',
2176         'vDash;': '\u22a8',
2177         'vdash;': '\u22a2',
2178         'Vdashl;': '\u2ae6',
2179         'Vee;': '\u22c1',
2180         'vee;': '\u2228',
2181         'veebar;': '\u22bb',
2182         'veeeq;': '\u225a',
2183         'vellip;': '\u22ee',
2184         'Verbar;': '\u2016',
2185         'verbar;': '|',
2186         'Vert;': '\u2016',
2187         'vert;': '|',
2188         'VerticalBar;': '\u2223',
2189         'VerticalLine;': '|',
2190         'VerticalSeparator;': '\u2758',
2191         'VerticalTilde;': '\u2240',
2192         'VeryThinSpace;': '\u200a',
2193         'Vfr;': '\U0001d519',
2194         'vfr;': '\U0001d533',
2195         'vltri;': '\u22b2',
2196         'vnsub;': '\u2282\u20d2',
2197         'vnsup;': '\u2283\u20d2',
2198         'Vopf;': '\U0001d54d',
2199         'vopf;': '\U0001d567',
2200         'vprop;': '\u221d',
2201         'vrtri;': '\u22b3',
2202         'Vscr;': '\U0001d4b1',
2203         'vscr;': '\U0001d4cb',
2204         'vsubnE;': '\u2acb\ufe00',
2205         'vsubne;': '\u228a\ufe00',
2206         'vsupnE;': '\u2acc\ufe00',
2207         'vsupne;': '\u228b\ufe00',
2208         'Vvdash;': '\u22aa',
2209         'vzigzag;': '\u299a',
2210         'Wcirc;': '\u0174',
2211         'wcirc;': '\u0175',
2212         'wedbar;': '\u2a5f',
2213         'Wedge;': '\u22c0',
2214         'wedge;': '\u2227',
2215         'wedgeq;': '\u2259',
2216         'weierp;': '\u2118',
2217         'Wfr;': '\U0001d51a',
2218         'wfr;': '\U0001d534',
2219         'Wopf;': '\U0001d54e',
2220         'wopf;': '\U0001d568',
2221         'wp;': '\u2118',
2222         'wr;': '\u2240',
2223         'wreath;': '\u2240',
2224         'Wscr;': '\U0001d4b2',
2225         'wscr;': '\U0001d4cc',
2226         'xcap;': '\u22c2',
2227         'xcirc;': '\u25ef',
2228         'xcup;': '\u22c3',
2229         'xdtri;': '\u25bd',
2230         'Xfr;': '\U0001d51b',
2231         'xfr;': '\U0001d535',
2232         'xhArr;': '\u27fa',
2233         'xharr;': '\u27f7',
2234         'Xi;': '\u039e',
2235         'xi;': '\u03be',
2236         'xlArr;': '\u27f8',
2237         'xlarr;': '\u27f5',
2238         'xmap;': '\u27fc',
2239         'xnis;': '\u22fb',
2240         'xodot;': '\u2a00',
2241         'Xopf;': '\U0001d54f',
2242         'xopf;': '\U0001d569',
2243         'xoplus;': '\u2a01',
2244         'xotime;': '\u2a02',
2245         'xrArr;': '\u27f9',
2246         'xrarr;': '\u27f6',
2247         'Xscr;': '\U0001d4b3',
2248         'xscr;': '\U0001d4cd',
2249         'xsqcup;': '\u2a06',
2250         'xuplus;': '\u2a04',
2251         'xutri;': '\u25b3',
2252         'xvee;': '\u22c1',
2253         'xwedge;': '\u22c0',
2254         'Yacute': '\xdd',
2255         'yacute': '\xfd',
2256         'Yacute;': '\xdd',
2257         'yacute;': '\xfd',
2258         'YAcy;': '\u042f',
2259         'yacy;': '\u044f',
2260         'Ycirc;': '\u0176',
2261         'ycirc;': '\u0177',
2262         'Ycy;': '\u042b',
2263         'ycy;': '\u044b',
2264         'yen': '\xa5',
2265         'yen;': '\xa5',
2266         'Yfr;': '\U0001d51c',
2267         'yfr;': '\U0001d536',
2268         'YIcy;': '\u0407',
2269         'yicy;': '\u0457',
2270         'Yopf;': '\U0001d550',
2271         'yopf;': '\U0001d56a',
2272         'Yscr;': '\U0001d4b4',
2273         'yscr;': '\U0001d4ce',
2274         'YUcy;': '\u042e',
2275         'yucy;': '\u044e',
2276         'yuml': '\xff',
2277         'Yuml;': '\u0178',
2278         'yuml;': '\xff',
2279         'Zacute;': '\u0179',
2280         'zacute;': '\u017a',
2281         'Zcaron;': '\u017d',
2282         'zcaron;': '\u017e',
2283         'Zcy;': '\u0417',
2284         'zcy;': '\u0437',
2285         'Zdot;': '\u017b',
2286         'zdot;': '\u017c',
2287         'zeetrf;': '\u2128',
2288         'ZeroWidthSpace;': '\u200b',
2289         'Zeta;': '\u0396',
2290         'zeta;': '\u03b6',
2291         'Zfr;': '\u2128',
2292         'zfr;': '\U0001d537',
2293         'ZHcy;': '\u0416',
2294         'zhcy;': '\u0436',
2295         'zigrarr;': '\u21dd',
2296         'Zopf;': '\u2124',
2297         'zopf;': '\U0001d56b',
2298         'Zscr;': '\U0001d4b5',
2299         'zscr;': '\U0001d4cf',
2300         'zwj;': '\u200d',
2301         'zwnj;': '\u200c',
2302     }
2303
2304 try:
2305     import http.client as compat_http_client
2306 except ImportError:  # Python 2
2307     import httplib as compat_http_client
2308
2309 try:
2310     from urllib.error import HTTPError as compat_HTTPError
2311 except ImportError:  # Python 2
2312     from urllib2 import HTTPError as compat_HTTPError
2313
2314 try:
2315     from urllib.request import urlretrieve as compat_urlretrieve
2316 except ImportError:  # Python 2
2317     from urllib import urlretrieve as compat_urlretrieve
2318
2319 try:
2320     from html.parser import HTMLParser as compat_HTMLParser
2321 except ImportError:  # Python 2
2322     from HTMLParser import HTMLParser as compat_HTMLParser
2323
2324 try:
2325     from subprocess import DEVNULL
2326     compat_subprocess_get_DEVNULL = lambda: DEVNULL
2327 except ImportError:
2328     compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2329
2330 try:
2331     import http.server as compat_http_server
2332 except ImportError:
2333     import BaseHTTPServer as compat_http_server
2334
2335 try:
2336     compat_str = unicode  # Python 2
2337 except NameError:
2338     compat_str = str
2339
2340 try:
2341     from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
2342     from urllib.parse import unquote as compat_urllib_parse_unquote
2343     from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
2344 except ImportError:  # Python 2
2345     _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
2346                 else re.compile('([\x00-\x7f]+)'))
2347
2348     # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
2349     # implementations from cpython 3.4.3's stdlib. Python 2's version
2350     # is apparently broken (see https://github.com/rg3/youtube-dl/pull/6244)
2351
2352     def compat_urllib_parse_unquote_to_bytes(string):
2353         """unquote_to_bytes('abc%20def') -> b'abc def'."""
2354         # Note: strings are encoded as UTF-8. This is only an issue if it contains
2355         # unescaped non-ASCII characters, which URIs should not.
2356         if not string:
2357             # Is it a string-like object?
2358             string.split
2359             return b''
2360         if isinstance(string, compat_str):
2361             string = string.encode('utf-8')
2362         bits = string.split(b'%')
2363         if len(bits) == 1:
2364             return string
2365         res = [bits[0]]
2366         append = res.append
2367         for item in bits[1:]:
2368             try:
2369                 append(compat_urllib_parse._hextochr[item[:2]])
2370                 append(item[2:])
2371             except KeyError:
2372                 append(b'%')
2373                 append(item)
2374         return b''.join(res)
2375
2376     def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
2377         """Replace %xx escapes by their single-character equivalent. The optional
2378         encoding and errors parameters specify how to decode percent-encoded
2379         sequences into Unicode characters, as accepted by the bytes.decode()
2380         method.
2381         By default, percent-encoded sequences are decoded with UTF-8, and invalid
2382         sequences are replaced by a placeholder character.
2383
2384         unquote('abc%20def') -> 'abc def'.
2385         """
2386         if '%' not in string:
2387             string.split
2388             return string
2389         if encoding is None:
2390             encoding = 'utf-8'
2391         if errors is None:
2392             errors = 'replace'
2393         bits = _asciire.split(string)
2394         res = [bits[0]]
2395         append = res.append
2396         for i in range(1, len(bits), 2):
2397             append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2398             append(bits[i + 1])
2399         return ''.join(res)
2400
2401     def compat_urllib_parse_unquote_plus(string, encoding='utf-8', errors='replace'):
2402         """Like unquote(), but also replace plus signs by spaces, as required for
2403         unquoting HTML form values.
2404
2405         unquote_plus('%7e/abc+def') -> '~/abc def'
2406         """
2407         string = string.replace('+', ' ')
2408         return compat_urllib_parse_unquote(string, encoding, errors)
2409
2410 try:
2411     from urllib.parse import urlencode as compat_urllib_parse_urlencode
2412 except ImportError:  # Python 2
2413     # Python 2 will choke in urlencode on mixture of byte and unicode strings.
2414     # Possible solutions are to either port it from python 3 with all
2415     # the friends or manually ensure input query contains only byte strings.
2416     # We will stick with latter thus recursively encoding the whole query.
2417     def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'):
2418         def encode_elem(e):
2419             if isinstance(e, dict):
2420                 e = encode_dict(e)
2421             elif isinstance(e, (list, tuple,)):
2422                 list_e = encode_list(e)
2423                 e = tuple(list_e) if isinstance(e, tuple) else list_e
2424             elif isinstance(e, compat_str):
2425                 e = e.encode(encoding)
2426             return e
2427
2428         def encode_dict(d):
2429             return dict((encode_elem(k), encode_elem(v)) for k, v in d.items())
2430
2431         def encode_list(l):
2432             return [encode_elem(e) for e in l]
2433
2434         return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq)
2435
2436 try:
2437     from urllib.request import DataHandler as compat_urllib_request_DataHandler
2438 except ImportError:  # Python < 3.4
2439     # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
2440     class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
2441         def data_open(self, req):
2442             # data URLs as specified in RFC 2397.
2443             #
2444             # ignores POSTed data
2445             #
2446             # syntax:
2447             # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
2448             # mediatype := [ type "/" subtype ] *( ";" parameter )
2449             # data      := *urlchar
2450             # parameter := attribute "=" value
2451             url = req.get_full_url()
2452
2453             scheme, data = url.split(':', 1)
2454             mediatype, data = data.split(',', 1)
2455
2456             # even base64 encoded data URLs might be quoted so unquote in any case:
2457             data = compat_urllib_parse_unquote_to_bytes(data)
2458             if mediatype.endswith(';base64'):
2459                 data = binascii.a2b_base64(data)
2460                 mediatype = mediatype[:-7]
2461
2462             if not mediatype:
2463                 mediatype = 'text/plain;charset=US-ASCII'
2464
2465             headers = email.message_from_string(
2466                 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
2467
2468             return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2469
2470 try:
2471     compat_basestring = basestring  # Python 2
2472 except NameError:
2473     compat_basestring = str
2474
2475 try:
2476     compat_chr = unichr  # Python 2
2477 except NameError:
2478     compat_chr = chr
2479
2480 try:
2481     from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2482 except ImportError:  # Python 2.6
2483     from xml.parsers.expat import ExpatError as compat_xml_parse_error
2484
2485
2486 etree = xml.etree.ElementTree
2487
2488
2489 class _TreeBuilder(etree.TreeBuilder):
2490     def doctype(self, name, pubid, system):
2491         pass
2492
2493 if sys.version_info[0] >= 3:
2494     def compat_etree_fromstring(text):
2495         return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
2496 else:
2497     # python 2.x tries to encode unicode strings with ascii (see the
2498     # XMLParser._fixtext method)
2499     try:
2500         _etree_iter = etree.Element.iter
2501     except AttributeError:  # Python <=2.6
2502         def _etree_iter(root):
2503             for el in root.findall('*'):
2504                 yield el
2505                 for sub in _etree_iter(el):
2506                     yield sub
2507
2508     # on 2.6 XML doesn't have a parser argument, function copied from CPython
2509     # 2.7 source
2510     def _XML(text, parser=None):
2511         if not parser:
2512             parser = etree.XMLParser(target=_TreeBuilder())
2513         parser.feed(text)
2514         return parser.close()
2515
2516     def _element_factory(*args, **kwargs):
2517         el = etree.Element(*args, **kwargs)
2518         for k, v in el.items():
2519             if isinstance(v, bytes):
2520                 el.set(k, v.decode('utf-8'))
2521         return el
2522
2523     def compat_etree_fromstring(text):
2524         doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
2525         for el in _etree_iter(doc):
2526             if el.text is not None and isinstance(el.text, bytes):
2527                 el.text = el.text.decode('utf-8')
2528         return doc
2529
2530 if sys.version_info < (2, 7):
2531     # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2532     # .//node does not match if a node is a direct child of . !
2533     def compat_xpath(xpath):
2534         if isinstance(xpath, compat_str):
2535             xpath = xpath.encode('ascii')
2536         return xpath
2537 else:
2538     compat_xpath = lambda xpath: xpath
2539
2540 try:
2541     from urllib.parse import parse_qs as compat_parse_qs
2542 except ImportError:  # Python 2
2543     # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2544     # Python 2's version is apparently totally broken
2545
2546     def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
2547                    encoding='utf-8', errors='replace'):
2548         qs, _coerce_result = qs, compat_str
2549         pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2550         r = []
2551         for name_value in pairs:
2552             if not name_value and not strict_parsing:
2553                 continue
2554             nv = name_value.split('=', 1)
2555             if len(nv) != 2:
2556                 if strict_parsing:
2557                     raise ValueError('bad query field: %r' % (name_value,))
2558                 # Handle case of a control-name with no equal sign
2559                 if keep_blank_values:
2560                     nv.append('')
2561                 else:
2562                     continue
2563             if len(nv[1]) or keep_blank_values:
2564                 name = nv[0].replace('+', ' ')
2565                 name = compat_urllib_parse_unquote(
2566                     name, encoding=encoding, errors=errors)
2567                 name = _coerce_result(name)
2568                 value = nv[1].replace('+', ' ')
2569                 value = compat_urllib_parse_unquote(
2570                     value, encoding=encoding, errors=errors)
2571                 value = _coerce_result(value)
2572                 r.append((name, value))
2573         return r
2574
2575     def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
2576                         encoding='utf-8', errors='replace'):
2577         parsed_result = {}
2578         pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
2579                            encoding=encoding, errors=errors)
2580         for name, value in pairs:
2581             if name in parsed_result:
2582                 parsed_result[name].append(value)
2583             else:
2584                 parsed_result[name] = [value]
2585         return parsed_result
2586
2587 try:
2588     from shlex import quote as compat_shlex_quote
2589 except ImportError:  # Python < 3.3
2590     def compat_shlex_quote(s):
2591         if re.match(r'^[-_\w./]+$', s):
2592             return s
2593         else:
2594             return "'" + s.replace("'", "'\"'\"'") + "'"
2595
2596
2597 if sys.version_info >= (2, 7, 3):
2598     compat_shlex_split = shlex.split
2599 else:
2600     # Working around shlex issue with unicode strings on some python 2
2601     # versions (see http://bugs.python.org/issue1548891)
2602     def compat_shlex_split(s, comments=False, posix=True):
2603         if isinstance(s, compat_str):
2604             s = s.encode('utf-8')
2605         return shlex.split(s, comments, posix)
2606
2607
2608 def compat_ord(c):
2609     if type(c) is int:
2610         return c
2611     else:
2612         return ord(c)
2613
2614
2615 compat_os_name = os._name if os.name == 'java' else os.name
2616
2617
2618 if sys.version_info >= (3, 0):
2619     compat_getenv = os.getenv
2620     compat_expanduser = os.path.expanduser
2621
2622     def compat_setenv(key, value, env=os.environ):
2623         env[key] = value
2624 else:
2625     # Environment variables should be decoded with filesystem encoding.
2626     # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2627
2628     def compat_getenv(key, default=None):
2629         from .utils import get_filesystem_encoding
2630         env = os.getenv(key, default)
2631         if env:
2632             env = env.decode(get_filesystem_encoding())
2633         return env
2634
2635     def compat_setenv(key, value, env=os.environ):
2636         def encode(v):
2637             from .utils import get_filesystem_encoding
2638             return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2639         env[encode(key)] = encode(value)
2640
2641     # HACK: The default implementations of os.path.expanduser from cpython do not decode
2642     # environment variables with filesystem encoding. We will work around this by
2643     # providing adjusted implementations.
2644     # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2645     # for different platforms with correct environment variables decoding.
2646
2647     if compat_os_name == 'posix':
2648         def compat_expanduser(path):
2649             """Expand ~ and ~user constructions.  If user or $HOME is unknown,
2650             do nothing."""
2651             if not path.startswith('~'):
2652                 return path
2653             i = path.find('/', 1)
2654             if i < 0:
2655                 i = len(path)
2656             if i == 1:
2657                 if 'HOME' not in os.environ:
2658                     import pwd
2659                     userhome = pwd.getpwuid(os.getuid()).pw_dir
2660                 else:
2661                     userhome = compat_getenv('HOME')
2662             else:
2663                 import pwd
2664                 try:
2665                     pwent = pwd.getpwnam(path[1:i])
2666                 except KeyError:
2667                     return path
2668                 userhome = pwent.pw_dir
2669             userhome = userhome.rstrip('/')
2670             return (userhome + path[i:]) or '/'
2671     elif compat_os_name == 'nt' or compat_os_name == 'ce':
2672         def compat_expanduser(path):
2673             """Expand ~ and ~user constructs.
2674
2675             If user or $HOME is unknown, do nothing."""
2676             if path[:1] != '~':
2677                 return path
2678             i, n = 1, len(path)
2679             while i < n and path[i] not in '/\\':
2680                 i = i + 1
2681
2682             if 'HOME' in os.environ:
2683                 userhome = compat_getenv('HOME')
2684             elif 'USERPROFILE' in os.environ:
2685                 userhome = compat_getenv('USERPROFILE')
2686             elif 'HOMEPATH' not in os.environ:
2687                 return path
2688             else:
2689                 try:
2690                     drive = compat_getenv('HOMEDRIVE')
2691                 except KeyError:
2692                     drive = ''
2693                 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2694
2695             if i != 1:  # ~user
2696                 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2697
2698             return userhome + path[i:]
2699     else:
2700         compat_expanduser = os.path.expanduser
2701
2702
2703 if sys.version_info < (3, 0):
2704     def compat_print(s):
2705         from .utils import preferredencoding
2706         print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2707 else:
2708     def compat_print(s):
2709         assert isinstance(s, compat_str)
2710         print(s)
2711
2712
2713 if sys.version_info < (3, 0) and sys.platform == 'win32':
2714     def compat_getpass(prompt, *args, **kwargs):
2715         if isinstance(prompt, compat_str):
2716             from .utils import preferredencoding
2717             prompt = prompt.encode(preferredencoding())
2718         return getpass.getpass(prompt, *args, **kwargs)
2719 else:
2720     compat_getpass = getpass.getpass
2721
2722 try:
2723     compat_input = raw_input
2724 except NameError:  # Python 3
2725     compat_input = input
2726
2727 # Python < 2.6.5 require kwargs to be bytes
2728 try:
2729     def _testfunc(x):
2730         pass
2731     _testfunc(**{'x': 0})
2732 except TypeError:
2733     def compat_kwargs(kwargs):
2734         return dict((bytes(k), v) for k, v in kwargs.items())
2735 else:
2736     compat_kwargs = lambda kwargs: kwargs
2737
2738
2739 if sys.version_info < (2, 7):
2740     def compat_socket_create_connection(address, timeout, source_address=None):
2741         host, port = address
2742         err = None
2743         for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2744             af, socktype, proto, canonname, sa = res
2745             sock = None
2746             try:
2747                 sock = socket.socket(af, socktype, proto)
2748                 sock.settimeout(timeout)
2749                 if source_address:
2750                     sock.bind(source_address)
2751                 sock.connect(sa)
2752                 return sock
2753             except socket.error as _:
2754                 err = _
2755                 if sock is not None:
2756                     sock.close()
2757         if err is not None:
2758             raise err
2759         else:
2760             raise socket.error('getaddrinfo returns an empty list')
2761 else:
2762     compat_socket_create_connection = socket.create_connection
2763
2764
2765 # Fix https://github.com/rg3/youtube-dl/issues/4223
2766 # See http://bugs.python.org/issue9161 for what is broken
2767 def workaround_optparse_bug9161():
2768     op = optparse.OptionParser()
2769     og = optparse.OptionGroup(op, 'foo')
2770     try:
2771         og.add_option('-t')
2772     except TypeError:
2773         real_add_option = optparse.OptionGroup.add_option
2774
2775         def _compat_add_option(self, *args, **kwargs):
2776             enc = lambda v: (
2777                 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2778                 else v)
2779             bargs = [enc(a) for a in args]
2780             bkwargs = dict(
2781                 (k, enc(v)) for k, v in kwargs.items())
2782             return real_add_option(self, *bargs, **bkwargs)
2783         optparse.OptionGroup.add_option = _compat_add_option
2784
2785 if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3
2786     compat_get_terminal_size = shutil.get_terminal_size
2787 else:
2788     _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2789
2790     def compat_get_terminal_size(fallback=(80, 24)):
2791         columns = compat_getenv('COLUMNS')
2792         if columns:
2793             columns = int(columns)
2794         else:
2795             columns = None
2796         lines = compat_getenv('LINES')
2797         if lines:
2798             lines = int(lines)
2799         else:
2800             lines = None
2801
2802         if columns is None or lines is None or columns <= 0 or lines <= 0:
2803             try:
2804                 sp = subprocess.Popen(
2805                     ['stty', 'size'],
2806                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2807                 out, err = sp.communicate()
2808                 _lines, _columns = map(int, out.split())
2809             except Exception:
2810                 _columns, _lines = _terminal_size(*fallback)
2811
2812             if columns is None or columns <= 0:
2813                 columns = _columns
2814             if lines is None or lines <= 0:
2815                 lines = _lines
2816         return _terminal_size(columns, lines)
2817
2818 try:
2819     itertools.count(start=0, step=1)
2820     compat_itertools_count = itertools.count
2821 except TypeError:  # Python 2.6
2822     def compat_itertools_count(start=0, step=1):
2823         n = start
2824         while True:
2825             yield n
2826             n += step
2827
2828 if sys.version_info >= (3, 0):
2829     from tokenize import tokenize as compat_tokenize_tokenize
2830 else:
2831     from tokenize import generate_tokens as compat_tokenize_tokenize
2832
2833
2834 try:
2835     struct.pack('!I', 0)
2836 except TypeError:
2837     # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2838     # See https://bugs.python.org/issue19099
2839     def compat_struct_pack(spec, *args):
2840         if isinstance(spec, compat_str):
2841             spec = spec.encode('ascii')
2842         return struct.pack(spec, *args)
2843
2844     def compat_struct_unpack(spec, *args):
2845         if isinstance(spec, compat_str):
2846             spec = spec.encode('ascii')
2847         return struct.unpack(spec, *args)
2848 else:
2849     compat_struct_pack = struct.pack
2850     compat_struct_unpack = struct.unpack
2851
2852
2853 __all__ = [
2854     'compat_HTMLParser',
2855     'compat_HTTPError',
2856     'compat_basestring',
2857     'compat_chr',
2858     'compat_cookiejar',
2859     'compat_cookies',
2860     'compat_etree_fromstring',
2861     'compat_expanduser',
2862     'compat_get_terminal_size',
2863     'compat_getenv',
2864     'compat_getpass',
2865     'compat_html_entities',
2866     'compat_html_entities_html5',
2867     'compat_http_client',
2868     'compat_http_server',
2869     'compat_input',
2870     'compat_itertools_count',
2871     'compat_kwargs',
2872     'compat_ord',
2873     'compat_os_name',
2874     'compat_parse_qs',
2875     'compat_print',
2876     'compat_setenv',
2877     'compat_shlex_quote',
2878     'compat_shlex_split',
2879     'compat_socket_create_connection',
2880     'compat_str',
2881     'compat_struct_pack',
2882     'compat_struct_unpack',
2883     'compat_subprocess_get_DEVNULL',
2884     'compat_tokenize_tokenize',
2885     'compat_urllib_error',
2886     'compat_urllib_parse',
2887     'compat_urllib_parse_unquote',
2888     'compat_urllib_parse_unquote_plus',
2889     'compat_urllib_parse_unquote_to_bytes',
2890     'compat_urllib_parse_urlencode',
2891     'compat_urllib_parse_urlparse',
2892     'compat_urllib_request',
2893     'compat_urllib_request_DataHandler',
2894     'compat_urllib_response',
2895     'compat_urlparse',
2896     'compat_urlretrieve',
2897     'compat_xml_parse_error',
2898     'compat_xpath',
2899     'workaround_optparse_bug9161',
2900 ]